OTRSAppointmentCalendar
5.0.12
OTRS AG
https://otrs.com/
GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
- Unit tests stabilization.
- Updated framework files to OTRS 5.0.34.
- Updated copyright.
- Updated minimum framework version to 5.0.33.
- Tidied.
- Updated minimum framework version to 5.0.31.
- Setting AppointmentCalendar::CalendarLimitOverview not working correctly (bug#14054).
- Selenium stabilization FF Marionette - AgentAppointmentNotification.t.
- Selenium stabilization FF Marionette - AgentAppointmentCreate.t.
- Selenium stabilization FF Marionette - AgentAppointmentCalendarOverview.t.
- Selenium stabilization FF Marionette - AgentAppointmentCalendarManage.t.
- Selenium stabilization FF Marionette - AdminAppointmentNotificationEvent.t.
- Updated license information.
Fixed: Notification looses text for 'Additional recipient email addresses' when sizelimit 200 characters is exceeded (bug#13936).
Fixed: Use of marking strings as translatable.
Fixed: Wrong UserID argument in AdminAppointmentNotificationEvent (bug#13820).
Fixed: Missleading label that customer can be recipient of notifications as group recipient (bug#13794).
Fixed: Wrong Sysconfig descriptions for public interface (bug#13739).
Fixed: Deletion of tickets not possible if automatically created appointments exist for it (bug#13642).
Fixed: Selenium unit test.
Fixed and stabilized selenium tests.
Fixed: Translation is not applied in AgentAppointmentList (bug#13059).
Fixed: Error in calendar if UserLogin contain Unicode character (bug#12493).
Fixed: restore default settings button missing when view changed in ResourceOverview.
Fixed: iCal copied URL from OTRS Calendar does not update in iCloud (bug#12667).
Fixed: Assigned appointments notification is not translated (bug#12945).
Fixed: OTRSAppointmentCalendar Module sends an update notification when an event is deleted (bug#12958).
Fixed: Useless "Description" widget in sidebar (bug#12943).
Fixed: OTRS notification option for OTRS Business Solution™ Feature are shown in the free (bug#13035).
Fixed: Repeating appointments not linked to origin ticket (bug#12592).
Fixes and improvements for unit tests / selenium tests.
Translated location hover title.
Improved link object module for calendar appointments.
Updated package description.
Updated translations.
Build for OTRSAppointmentCalendar 5 patch level 2.
Build for OTRSAppointmentCalendar 5.
The Appointment Calendar package.
Das Terminkalender-Paket.
A naptár csomag.
Модул за календаре и термине.
Modul za kalendare i termine.
5.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OTRS package OTRSAppointmentCalendar.<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
Minimum framework version for this package is <strong><u>5.0.14</u></strong>. Please make sure you have updated the framework before installing this package!<br/>
<br/>
<br/>
<strong>REQUIRED PERL MODULES</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>Willkommen</strong>
<br/>
<br/>
Sie sind dabei das OTRS Paket OTRSAppointmentCalendar zu installieren.<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
Die minimale OTRS Frameworkversion für dieses Paket ist <strong><u>5.0.14</u></strong>. Bitte stellen Sie sicher, dass Sie das Framework vor der Installation dieses Pakets aktualisiert haben!<br/>
<br/>
<br/>
<strong>BENÖTIGTEN PERLMODULE</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ÜDVÖZÖLJÜK</strong>
<br/>
<br/>
Ön az OTRSAppointmentCalendar OTRS csomag telepítésére készül.<br/>
<br/>
<br/>
<strong>FIGYELEM</strong>
<br/>
<br/>
A legkisebb keretrendszer-verzió ehhez a csomaghoz az <strong><u>5.0.14</u></strong>. Győződjön meg arról, hogy frissítette-e a keretrendszert ezen csomag telepítése előtt!<br/>
<br/>
<br/>
<strong>SZÜKSÉGES PERL MODUL</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ДОБРОДОШЛИ</strong>
<br/>
<br/>
Ово је инсталација OTRS пакета OTRSAppointmentCalendar.<br/>
<br/>
<br/>
<strong>УПОЗОРЕЊЕ</strong>
<br/>
<br/>
Најмања подржана верзија система за овај пакет је <strong><u>5.0.14</u></strong>. Проверите да ли сте освежили ваш систем пре инсталације пакета!<br/>
<br/>
<br/>
<strong>ОБАВЕЗНИ ПЕРЛ МОДУЛИ</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>DOBRODOŠLI</strong>
<br/>
<br/>
Ovo je instalacija OTRS paketa OTRSAppointmentCalendar.<br/>
<br/>
<br/>
<strong>UPOZORENJE</strong>
<br/>
<br/>
Najmanja podržana verzija sistema za ovaj paket je <strong><u>5.0.14</u></strong>. Proverite da li ste osvežili vaš sistem pre instalacije paketa!<br/>
<br/>
<br/>
<strong>OBAVEZNI PERL MODULI</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from this table will be irrevocably lost.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ACHTUNG</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Si usted desinstala este paquete, todas las tablas de la base de datos creadas durante la instalación serán borradas.
¡Todos los datos de esas tablas serán irrevocablemente perdidos!.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>FIGYELEM</strong>
<br/>
<br/>
Ha eltávolítja ezt a csomagot, akkor a telepítés során létrehozott összes adatbázistábla törlésre kerül.
Az ezekben a táblákban lévő összes adat visszavonhatatlanul el fog veszni!
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>УПОЗОРЕЊЕ</strong>
<br/>
<br/>
Уколико деинсталирате овај пакет, све табеле у бази података које су креиране приликом инсталације ће бити обрисане.
Сви подаци из ових табела биће неповратно изгубљени.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>UPOZORENJE</strong>
<br/>
<br/>
Ukoliko deinstalerate ovaj paket, sve tabele u bazi podataka koje su kreirane prilikom instalacije će biti obrisane.
Svi podaci iz ovih tabela biće nepovratno izgubljeni.
<br/>
<br/>
((enjoy))<br/>
<br/>
DateTime
DateTime::TimeZone
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeInstall();
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeUpgrade();
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeUninstall();
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeReinstall();
2019-02-26 02:39:37
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkNvbmZpZyI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUHVibGljQ2FsZW5kYXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIHB1YmxpYyBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QdWJsaWMgY2FsZW5kYXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPlB1YmxpYyBDYWxlbmRhcjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT48L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPk92ZXJ2aWV3PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNhbGVuZGFyPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPkNhbGVuZGFyPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPk1lbnU8L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjc1PC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPkNhbGVuZGFyIE92ZXJ2aWV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NjAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoik8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+UmVzb3VyY2UgT3ZlcnZpZXc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPmNsYXNzPSJPVFJTQnVzaW5lc3NSZXF1aXJlZCI8L0xpbmtPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NzAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgbmV3IGFwcG9pbnRtZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5OZXcgQXBwb2ludG1lbnQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O1N1YmFjdGlvbj1BcHBvaW50bWVudENyZWF0ZTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+ODAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8Q1NTPnRoaXJkcGFydHkvZnVsbGNhbGVuZGFyLTMuMC4xL2Z1bGxjYWxlbmRhci5taW4uY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPENTUz50aGlyZHBhcnR5L2Z1bGxjYWxlbmRhci1zY2hlZHVsZXItMS40LjAvc2NoZWR1bGVyLm1pbi5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8Q1NTPkNvcmUuQXBwb2ludG1lbnRDYWxlbmRhci5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L21vbWVudGpzLTIuMTMuMC9tb21lbnQubWluLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvZnVsbGNhbGVuZGFyLTMuMC4xL2Z1bGxjYWxlbmRhci5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9mdWxsY2FsZW5kYXItc2NoZWR1bGVyLTEuNC4wL3NjaGVkdWxlci5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvY2xpcGJvYXJkLmpzLTEuNS4xMi9jbGlwYm9hcmQubWluLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXBwb2ludG1lbnRFZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5FZGl0IGFwcG9pbnRtZW50PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudExpc3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgbGlzdC48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgbGlzdDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT48L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXBwb2ludG1lbnRQbHVnaW5TZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+UGx1Z2luIHNlYXJjaDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT48L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2UgQ2FsZW5kYXJzPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNhbGVuZGFyPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+TWFuYWdlIENhbGVuZGFyczwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz45MDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxDU1M+Q29yZS5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZS5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8Q1NTPnRoaXJkcGFydHkvc3BlY3RydW0tMS44LjAvc3BlY3RydW0uY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9jbGlwYm9hcmQuanMtMS41LjEyL2NsaXBib2FyZC5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9zcGVjdHJ1bS0xLjguMC9zcGVjdHJ1bS5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXBwb2ludG1lbnRJbXBvcnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkltcG9ydCBBcHBvaW50bWVudHM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q2FsZW5kYXI8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6Q2FsZW5kYXJMaW1pdE92ZXJ2aWV3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IlxkKyI+MTA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpDYWxlbmRhckNvbG9ycyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDAwMDAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzFFMUUxRTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMzQTNBM0E8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNTQ1NDUzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzZFNkU2RTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4Nzg2ODc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODg4Nzg3PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0EwOUZBMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNCOEI4Qjg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRDBEMEQwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0U4RThFODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRkZGRkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODkxMTAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Izg5NDgwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4ODg1MDE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNDU4NDAxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAyODQwMTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMTg0NDg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDA4Njg4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAwNEE4ODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMDE4ODg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNDkxQTg4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Izg5MUU4ODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4OTE2NDg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkYyMTAxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGODgwMjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRkZBMDM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODNGOTAyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzA1RjgwMjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwM0Y5ODc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDBGREZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAwOENGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMDJFRkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODkzMUZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGMzlGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRjI5ODc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkY3MjZFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGQ0U2RTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRkZCNkQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jQ0VGQTZFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzY4Rjk2RTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM2OEZERkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNjhGQkQwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzZBQ0ZGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM2RTc2RkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRDI3OEZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGN0FGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRjdGRDM8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6UGx1Z2luIyMjMDEwMC1UaWNrZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6UGx1Z2luPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW46OlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVSTCI+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0lczwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzEyMDAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPkFwcG9pbnRtZW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPk5vcm1hbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZTo6U2V0dGluZ3NWaXNpYmlsaXR5IyMjQXBwb2ludG1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lIEFjdGlvbnMgd2hlcmUgYSBzZXR0aW5ncyBidXR0b24gaXMgYXZhaWxhYmxlIGluIHRoZSBsaW5rZWQgb2JqZWN0cyB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBBY3Rpb25zIG11c3QgaGF2ZSByZWdpc3RlcmVkIHRoZSBmb2xsb3dpbmcgSlMgYW5kIENTUyBmaWxlczogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+QWdlbnRUaWNrZXRab29tPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZSMjI0FwcG9pbnRtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudC5wbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdENvbHVtbnMiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhbGVuZGFyTmFtZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+MjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdGFydFRpbWUiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW5kVGltZSI+MjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMb2NhdGlvbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RpZmljYXRpb25UaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYWxlbmRhck5hbWUiPjEwMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+MTEwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlN0YXJ0VGltZSI+MTIwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVuZFRpbWUiPjEzMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMb2NhdGlvbiI+MTQwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGlmaWNhdGlvblRpbWUiPjE1MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VkIj4xNjA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlZCI+MTcwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OkltcG9ydDo6UmVjdXJyaW5nTW9udGhzTGltaXQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+T1RSUyBkb2Vzbid0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXGQrIj4xMjA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFR5cGUjIyMwMTAwLUZpcnN0UmVzcG9uc2VUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RXNjYWxhdGlvblRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+Rmlyc3RSZXNwb25zZVRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+Rmlyc3QgcmVzcG9uc2UgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPlRpY2tldFNMQVVwZGF0ZXxUaWNrZXRRdWV1ZVVwZGF0ZXxUaWNrZXRTdGF0ZVVwZGF0ZXxUaWNrZXRDcmVhdGV8QXJ0aWNsZUNyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFyayI+RTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZSMjIzAyMDAtVXBkYXRlVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkVzY2FsYXRpb25UaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPlVwZGF0ZVRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+VXBkYXRlIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRTTEFVcGRhdGV8VGlja2V0UXVldWVVcGRhdGV8VGlja2V0U3RhdGVVcGRhdGV8VGlja2V0Q3JlYXRlfEFydGljbGVDcmVhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcmsiPkU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFR5cGUjIyMwMzAwLVNvbHV0aW9uVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkVzY2FsYXRpb25UaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPlNvbHV0aW9uVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5Tb2x1dGlvbiB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+VGlja2V0U0xBVXBkYXRlfFRpY2tldFF1ZXVlVXBkYXRlfFRpY2tldFN0YXRlVXBkYXRlfFRpY2tldENyZWF0ZXxBcnRpY2xlQ3JlYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXJrIj5FPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRUeXBlIyMjMDQwMC1QZW5kaW5nVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OlBlbmRpbmdUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPlBlbmRpbmdUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlBlbmRpbmcgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPlRpY2tldFBlbmRpbmdUaW1lVXBkYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXJrIj5QPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRUeXBlIyMjMDUwMC1EeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkR5bmFtaWNGaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij5EeW5hbWljRmllbGRfJXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pY0ZpZWxkXyVzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+VGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlXy4qPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXJrIj5EPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5UaXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZXMiIFRyYW5zbGF0YWJsZT0iMSI+VHlwZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU3RhdGVzIiBUcmFuc2xhdGFibGU9IjEiPlN0YXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdGF0ZVR5cGUiIFRyYW5zbGF0YWJsZT0iMSI+U3RhdGUgdHlwZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdGllcyIgVHJhbnNsYXRhYmxlPSIxIj5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZXMiIFRyYW5zbGF0YWJsZT0iMSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU0xBcyIgVHJhbnNsYXRhYmxlPSIxIj5TTEE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxvY2tzIiBUcmFuc2xhdGFibGU9IjEiPkxvY2sgc3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik93bmVySURzIiBUcmFuc2xhdGFibGU9IjEiPk93bmVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXNwb25zaWJsZUlEcyIgVHJhbnNsYXRhYmxlPSIxIj5SZXNwb25zaWJsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tZXJJRCIgVHJhbnNsYXRhYmxlPSIxIj5DdXN0b21lcklEPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21lclVzZXJMb2dpbiIgVHJhbnNsYXRhYmxlPSIxIj5DdXN0b21lciB1c2VyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcm9tIiBUcmFuc2xhdGFibGU9IjEiPkZyb208L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRvIiBUcmFuc2xhdGFibGU9IjEiPlRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYyIgVHJhbnNsYXRhYmxlPSIxIj5DYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU3ViamVjdCIgVHJhbnNsYXRhYmxlPSIxIj5TdWJqZWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCb2R5IiBUcmFuc2xhdGFibGU9IjEiPkJvZHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkF0dGFjaG1lbnROYW1lIiBUcmFuc2xhdGFibGU9IjEiPkF0dGFjaG1lbnQgTmFtZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8IS0tIG5vdGlmaWNhdGlvbnMgLS0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6OkFkbWluOjpBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQjIyNFdmVudE9iamVjdFR5cGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6QWRtaW5Ob3RpZmljYXRpb25FdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkNhbGVuZGFyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+QXBwb2ludG1lbnQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRXZlbnRzIyMjQ2FsZW5kYXIiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+Q2FsZW5kYXJDcmVhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5DYWxlbmRhclVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJFdmVudHMjIyNBcHBvaW50bWVudCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW48L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5BcHBvaW50bWVudENyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkFwcG9pbnRtZW50VXBkYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+QXBwb2ludG1lbnREZWxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5BcHBvaW50bWVudE5vdGlmaWNhdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpFdmVudE1vZHVsZVBvc3QjIyMxMDAtTm90aWZpY2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpFdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6Ok5vdGlmaWNhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihBcHBvaW50bWVudENyZWF0ZXxBcHBvaW50bWVudFVwZGF0ZXxBcHBvaW50bWVudERlbGV0ZXxBcHBvaW50bWVudE5vdGlmaWNhdGlvbnxDYWxlbmRhckNyZWF0ZXxDYWxlbmRhclVwZGF0ZSk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPCEtLSBub3RpZmljYXRpb25zIHVpIC0tPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBhZG1pbiBhcmVhIG9mIE9UUlMuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnM8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5TeXN0ZW08L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8Q1NTPkNvcmUuQWdlbnQuQWRtaW4uTm90aWZpY2F0aW9uRXZlbnQuY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5BZG1pbi5Ob3RpZmljYXRpb25FdmVudC5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgIDwvTG9hZGVyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpBZG1pbjo6QWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50IyMjUmljaFRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VXNlcyByaWNodGV4dCBmb3Igdmlld2luZyBhbmQgZWRpdGluZyB0aWNrZXQgbm90aWZpY2F0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6QWRtaW5Ob3RpZmljYXRpb25FdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCMjI1JpY2hUZXh0V2lkdGgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgd2lkdGggZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yIGNvbXBvbmVudCBmb3IgdGhpcyBzY3JlZW4uIEVudGVyIG51bWJlciAocGl4ZWxzKSBvciBwZXJjZW50IHZhbHVlIChyZWxhdGl2ZSkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXlxkKyU/JCI+NjIwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6OkFkbWluOjpBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQjIyNSaWNoVGV4dEhlaWdodCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBoZWlnaHQgZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yIGNvbXBvbmVudCBmb3IgdGhpcyBzY3JlZW4uIEVudGVyIG51bWJlciAocGl4ZWxzKSBvciBwZXJjZW50IHZhbHVlIChyZWxhdGl2ZSkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXlxkKyU/JCI+MzIwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IlByZWZlcmVuY2VzR3JvdXBzIyMjQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6UHJlZmVyZW5jZXM6OkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHVtbiI+Tm90aWZpY2F0aW9uIFNldHRpbmdzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCIgVHJhbnNsYXRhYmxlPSIxIj5BcHBvaW50bWVudCBub3RpZmljYXRpb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIiBUcmFuc2xhdGFibGU9IjEiPkNob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZLZXkiPkFkbWluQXBwb2ludG1lbnROb3RpZmNhdGlvbkV2ZW50VHJhbnNwb3J0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj44MDAxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOb3RpZmljYXRpb246OkNoYXJhY3RlcnNQZXJMaW5lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgcGVyIGxpbmUgdXNlZCBpbiBjYXNlIGFuIEhUTUwgYXJ0aWNsZSBwcmV2aWV3IHJlcGxhY2VtZW50IG9uIFRlbXBsYXRlR2VuZXJhdG9yIGZvciBFdmVudE5vdGlmaWNhdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj44MDwvU3RyaW5nPjwhLS0gZGVmYXVsdCAxIGhvdXIgLS0+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDwhLS0gbm90aWZpY2F0aW9uIHRyYW5zcG9ydHMgLS0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnROb3RpZmljYXRpb246OlRyYW5zcG9ydCMjI0VtYWlsIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG5vdGlmaWNhdGlvbiB0cmFuc3BvcnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpFbWFpbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5FbWFpbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvbiI+ZmEgZmEtZW52ZWxvcGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjEwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSXNPVFJTQnVzaW5lc3NUcmFuc3BvcnQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uOjpUcmFuc3BvcnQjIyNOb3RpZmljYXRpb25WaWV3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG5vdGlmaWNhdGlvbiB0cmFuc3BvcnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpOb3RpZmljYXRpb25WaWV3PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPldlYiBWaWV3PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uIj5mYSBmYS10aC1saXN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj4xMTA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklzT1RSU0J1c2luZXNzVHJhbnNwb3J0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBZ2VudEVuYWJsZWRCeURlZmF1bHQiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudE5vdGlmaWNhdGlvbjo6VHJhbnNwb3J0IyMjU01TIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG5vdGlmaWNhdGlvbiB0cmFuc3BvcnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpTTVM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+U01TIChTaG9ydCBNZXNzYWdlIFNlcnZpY2UpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uIj5mYSBmYS1tb2JpbGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjEyMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSXNPVFJTQnVzaW5lc3NUcmFuc3BvcnQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OkV2ZW50TW9kdWxlUG9zdCMjIzIwMC1UaWNrZXRBcHBvaW50bWVudHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI6OkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VGlja2V0QXBwb2ludG1lbnRzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+QXBwb2ludG1lbnRVcGRhdGU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPCEtLSBkYXNoYm9hcmQgd2lkZ2V0IC0tPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRGFzaGJvYXJkQmFja2VuZCMjIzA1MDAtQXBwb2ludG1lbnRDYWxlbmRhciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZGFzaGJvYXJkIGJhY2tlbmQuICJMaW1pdCIgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZGlzcGxheWVkIGJ5IGRlZmF1bHQuICJHcm91cCIgaXMgdXNlZCB0byByZXN0cmljdCBhY2Nlc3MgdG8gdGhlIHBsdWdpbiAoZS4gZy4gR3JvdXA6IGFkbWluO2dyb3VwMTtncm91cDI7KS4gIkRlZmF1bHQiIGluZGljYXRlcyBpZiB0aGUgcGx1Z2luIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBvciBpZiB0aGUgdXNlciBuZWVkcyB0byBlbmFibGUgaXQgbWFudWFsbHkuICJDYWNoZVRUTExvY2FsIiBkZWZpbmVzIHRoZSBjYWNoZSBleHBpcmF0aW9uIHBlcmlvZCBpbiBtaW51dGVzIGZvciB0aGUgcGx1Z2luLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6RGFzaGJvYXJkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkRhc2hib2FyZDo6QXBwb2ludG1lbnRDYWxlbmRhcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnRzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTaG93RW1haWwiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklkbGVNaW51dGVzIj42MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU29ydEJ5Ij5Vc2VyRnVsbG5hbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZpbHRlciI+VG9kYXk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5Db250ZW50U21hbGw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbWl0Ij4xMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FjaGVUVExMb2NhbCI+NTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8IS0tIGFwcG9pbnRtZW50IGNyZWF0aW9uIGxpbmtlZCB0byBleHRlcm5hbCBvYmplY3RzIC0tPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM1NTAtQXBwb2ludG1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudTo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5OZXcgQXBwb2ludG1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztTdWJhY3Rpb249QXBwb2ludG1lbnRDcmVhdGU7UGx1Z2luS2V5PTAxMDAtVGlja2V0O09iamVjdElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2x1c3Rlck5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+TWlzY2VsbGFuZW91czwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2x1c3RlclByaW9yaXR5Ij44MDA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk92ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkFnZW5kYSBPdmVydmlldzwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5DYWxlbmRhcjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5PdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5BZ2VuZGEgT3ZlcnZpZXc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NjUwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8Q1NTPnRoaXJkcGFydHkvZnVsbGNhbGVuZGFyLTMuMC4xL2Z1bGxjYWxlbmRhci5taW4uY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPENTUz5Db3JlLkFwcG9pbnRtZW50Q2FsZW5kYXIuY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPENTUz5Db3JlLkFwcG9pbnRtZW50Q2FsZW5kYXIuQWdlbmRhLmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvbW9tZW50anMtMi4xMy4wL21vbWVudC5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9mdWxsY2FsZW5kYXItMy4wLjEvZnVsbGNhbGVuZGFyLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgIDwvTG9hZGVyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFnZW50QXBwb2ludG1lbnRFZGl0OjpMb2NhdGlvbjo6TGluayMjIzEtR29vZ2xlTWFwcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTU0NsYXNzIj5Hb29nbGVNYXBzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPl9ibGFuazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGV4dCIgVHJhbnNsYXRhYmxlPSIxIj5Mb2NhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVVJMIj5odHRwOi8vbWFwcy5nb29nbGUuY29tL21hcHM/ej03JmFtcDtxPTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvbk5hbWUiPmZhLWdsb2JlIGZhLWxnPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpFdmVudE1vZHVsZVBvc3QjIyM5NTAtVGlja2V0QXBwb2ludG1lbnRzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpUaWNrZXRBcHBvaW50bWVudHM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRTTEFVcGRhdGV8VGlja2V0UXVldWVVcGRhdGV8VGlja2V0U3RhdGVVcGRhdGV8VGlja2V0Q3JlYXRlfEFydGljbGVDcmVhdGV8VGlja2V0UGVuZGluZ1RpbWVVcGRhdGV8VGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlXy4qPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RXZlbnRNb2R1bGVQb3N0IyMjOTYwLVRpY2tldEFwcG9pbnRtZW50RGVsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRyaWdnZXJzIGRlbGV0aW5nIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCBJRC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpUaWNrZXRBcHBvaW50bWVudERlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPlRpY2tldERlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBDbGFzczo6UmV0dXJuVmFsdWU7CgoKPWhlYWQxIE5BTUUKCkNsYXNzOjpSZXR1cm5WYWx1ZSAtIEEgcmV0dXJuLXZhbHVlIG9iamVjdCB0aGF0IGxldHMgeW91IHRyZWF0IGl0IAphcyBhcyBhIGJvb2xlYW4sIGFycmF5IG9yIG9iamVjdAoKPWhlYWQxIERFU0NSSVBUSU9OCgpDbGFzczo6UmV0dXJuVmFsdWUgaXMgYSAiY2xldmVyIiByZXR1cm4gdmFsdWUgb2JqZWN0IHRoYXQgY2FuIGFsbG93CmNvZGUgY2FsbGluZyB5b3VyIHJvdXRpbmUgdG8gZXhwZWN0OgogICAgYSBib29sZWFuIHZhbHVlIChkaWQgaXQgZmFpbCkKb3IgIGEgbGlzdCAod2hhdCBhcmUgdGhlIHJldHVybiB2YWx1ZXMpCgo9aGVhZDEgRVhBTVBMRQoKICAgIHN1YiBkZW1vIHsKICAgICAgICBteSAkdmFsdWUgPSBzaGlmdDsKICAgICAgICBteSAkcmV0ID0gQ2xhc3M6OlJldHVyblZhbHVlLT5uZXcoKTsKICAgICAgICAkcmV0LT5hc19hcnJheSgnMCcsICdObyByZXN1bHRzIGZvdW5kJyk7CiAgICAKICAgICAgICB1bmxlc3MoJHZhbHVlKSB7CiAgICAgICAgICAgICRyZXQtPmFzX2Vycm9yKGVycm5vID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPT4gIllvdSBkaWRuJ3Qgc3VwcGx5IGEgcGFyYW1ldGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19iYWNrdHJhY2UgPT4gMSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4oJHJldC0+cmV0dXJuX3ZhbHVlKTsKICAgIH0KCiAgICBpZiAoZGVtbygnZm9vJykpeyAKICAgICAgICBwcmludCAidGhlIHJvdXRpbmUgc3VjY2VlZGVkIHdpdGggb25lIHBhcmFtZXRlciI7CiAgICB9CiAgICBpZiAoZGVtbygpKSB7CiAgICAgICAgcHJpbnQgIlRoZSByb3V0aW5lIHN1Y2NlZWRlZCB3aXRoIDAgcGFyYW10ZXJzLiBzaG91bGRuJ3QgaGFwcGVuIjsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQgIlRoZSByb3V0aW5lIGZhaWxlZCB3aXRoIDAgcGFyYW1ldGVycyAoYXMgaXQgc2hvdWxkKS4iOwogICAgfQoKCiAgICBteSAkcmV0dXJuID0gZGVtbygpOwogICAgaWYgKCRyZXR1cm4pIHsKICAgICAgICBwcmludCAiVGhlIHJvdXRpbmUgc3VjY2VlZGVkIHdpdGggMCBwYXJhbXRlcnMuIHNob3VsZG4ndCBoYXBwZW4iOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAiVGhlIHJvdXRpbmUgZmFpbGVkIHdpdGggMCBwYXJhbWV0ZXJzIChhcyBpdCBzaG91bGQpLiAiLgogICAgICAgICAgICAgICJTdGFjayB0cmFjZTpcbiIuCiAgICAgICAgJHJldHVybi0+YmFja3RyYWNlOwogICAgfQoKICAgIG15IEByZXR1cm4zID0gZGVtbygnZm9vJyk7CiAgICBwcmludCAiVGhlIHJvdXRpbmUgZ290ICIuam9pbignLCcsQHJldHVybjMpLgogICAgICAgICAgIndoZW4gYXNraW5nIGZvciBkZW1vJ3MgcmVzdWx0cyBhcyBhbiBhcnJheSI7CgoKICAgIG15ICRyZXR1cm4yID0gZGVtbygnZm9vJyk7CgogICAgdW5sZXNzICgkcmV0dXJuMikgewogICAgICAgIHByaW50ICJUaGUgcm91dGluZSBmYWlsZWQgd2l0aCBhIHBhcmFtZXRlci4gc2hvdWxkbid0IGhhcHBlbi4iLgogICAgICAgICAgICAgIlN0YWNrIHRyYWNlOlxuIi4KICAgICAgICAkcmV0dXJuMi0+YmFja3RyYWNlOwogICAgfQoKICAgIG15IEByZXR1cm4yX2FycmF5ID0gQHskcmV0dXJuMn07ICMgVE9ETzogZG9lcyB0aGlzIHdvcmsKICAgIG15IEByZXR1cm4yX2FycmF5MiA9ICRyZXR1cm4yLT5hc19hcnJheTsKCgo9Y3V0CgoKdXNlIEV4cG9ydGVyOwoKdXNlIHZhcnMgcXcvJFZFUlNJT04gQEVYUE9SVCBASVNBLzsKCkBJU0EgPSBxdy9FeHBvcnRlci87CkBFWFBPUlQgPSBxdyAvJnJldHVybl92YWx1ZS87CnVzZSBDYXJwOwp1c2UgRGV2ZWw6OlN0YWNrVHJhY2U7CnVzZSBEYXRhOjpEdW1wZXI7CgoKJFZFUlNJT04gPSAnMC41NSc7CgoKdXNlIG92ZXJsb2FkICdib29sJyA9PiBcJmVycm9yX2NvbmRpdGlvbjsKdXNlIG92ZXJsb2FkICciIicgPT4gXCZlcnJvcl9jb25kaXRpb247CnVzZSBvdmVybG9hZCAnZXEnID0+IFwmbXlfZXE7CnVzZSBvdmVybG9hZCAnQHt9JyA9PiBcJmFzX2FycmF5Owp1c2Ugb3ZlcmxvYWQgJ2ZhbGxiYWNrJyA9PiBcJmFzX2FycmF5OwoKCj1oZWFkMSBNRVRIT0RTIAoKPWl0ZW0gbmV3CgpJbnN0YW50aWF0ZSBhIG5ldyBDbGFzczo6UmV0dXJuVmFsdWUgb2JqZWN0Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRzZWxmID0ge307CiAgICBibGVzcygkc2VsZik7CiAgICByZXR1cm4oJHNlbGYpOwp9CgpzdWIgbXlfZXEgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIGlmICh3YW50YXJyYXkoKSkgewogICAgICAgIHJldHVybigkc2VsZi0+YXNfYXJyYXkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuKCRzZWxmKTsKICAgIH0gICAgCn0KCj1pdGVtIGFzX2FycmF5CgpSZXR1cm4gdGhlICdhc19hcnJheScgYXR0cmlidXRlIG9mIHRoaXMgb2JqZWN0IGFzIGFuIGFycmF5LgoKPWN1dAoKCj1pdGVtIGFzX2FycmF5IFtBUlJBWV0KCklmICRzZWxmIGlzIGNhbGxlZCBpbiBhbiBhcnJheSBjb250ZXh0LCByZXR1cm5zIHRoZSBhcnJheSBzcGVjaWZpZWQgaW4gQVJSQVkKCj1jdXQKCnN1YiBhc19hcnJheSB7CgogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIGlmIChAXykgeyAKICAgICAgICBAeyRzZWxmLT57J2FzX2FycmF5J319ID0gKEBfKTsKICAgIH0KICAgIHJldHVybihAeyRzZWxmLT57J2FzX2FycmF5J319KTsKfQoKCj1pdGVtIGFzX2Vycm9yIEhBU0gKClR1cm5zIHRoaXMgcmV0dXJuLXZhbHVlIG9iamVjdCBpbnRvICBhbiBlcnJvciByZXR1cm4gb2JqZWN0LiAgVEFrZXMgdGhyZWUgcGFyYW1ldGVyczoKCiAgICBtZXNzYWdlCiAgICBkb19iYWNrdHJhY2UKICAgIGVycm5vIAoKICAgICdtZXNzYWdlJyBpcyBhIGh1bWFuIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UgZXhwbGFpbmluZyB3aGF0J3MgZ29pbmcgb24KCiAgICAnZG9fYmFja3RyYWNlJyBpcyBhIGJvb2xlYW4uIElmIGl0J3MgdHJ1ZSwgYSBjYXJwLXN0eWxlIGJhY2t0cmFjZSB3aWxsIGJlIAogICAgc3RvcmVkIGluICRzZWxmLT57J2JhY2t0cmFjZSd9LiBJdCBkZWZhdWx0cyB0byB0cnVlCgogICAgZXJybm8gYW5kIG1lc3NhZ2UgZGVmYXVsdCB0byB1bmRlZi4gZXJybm8gX211c3RfIGJlIHNwZWNpZmllZC4gCiAgICBJdCdzIGEgbnVtZXJpYyBlcnJvciBudW1iZXIuICBBbnkgdHJ1ZSBpbnRlZ2VyIHZhbHVlICB3aWxsIGNhdXNlIHRoZSAKICAgIG9iamVjdCB0byBldmFsdWF0ZSB0byBmYWxzZSBpbiBhIHNjYWxhciBjb250ZXh0LiBBdCBmaXJzdCwgdGhpcyBtYXkgbG9vayBhIAogICAgYml0IGNvdW50ZXJpbnR1aXRpdmUsIGJ1dCBpdCBtZWFucyB0aGF0IHlvdSBjYW4gaGF2ZSBlcnJvciBjb2RlcyBhbmQgc3RpbGwgCiAgICBhbGxvdyBzaW1wbGUgdXNlIG9mIHlvdXIgZnVuY3Rpb25zIGluIGEgc3R5bGUgbGlrZSB0aGlzOgoKCiAgICAgICAgaWYgKCRvYmotPmRvX3NvbWV0aGluZykgewogICAgICAgICAgICBwcmludCAiWWF5ISBpdCB3b3JrZWQiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50ICJTb3JyeS4gdGhlcmUncyBiZWVuIGFuIGVycm9yLiI7CiAgICAgICAgfQoKCiAgICAgICAgYXMgd2VsbCBhcyBtb3JlIGNvbXBsZXggdXNlIGxpa2UgdGhpczoKCiAgICAgICAgbXkgJHJldHZhbCA9ICRvYmotPmRvX3NvbWV0aGluZzsKICAgICAgICAKICAgICAgICBpZiAoJHJldHZhbCkgewogICAgICAgICAgICBwcmludCAiWWF5LiB3ZSBkaWQgc29tZXRoaW5nXG4iOwogICAgICAgICAgICBteSAoJGZvbywgJGJhciwgJGJheikgPSBAeyRyZXR2YWx9OwogICAgICAgICAgICBteSAkaHVtYW5fcmVhZGFibGVfcmV0dXJuID0gJHJldHZhbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJHJldHZhbC0+ZXJybm8gPT0gMjApIHsKICAgICAgICAgICAgICAgIGRpZSAiRmFpbGVkIHdpdGggZXJyb3IgMjAgKE5vdCBlbm91Z2ggbW9ua2V5cykuIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRpZSAgJHJldHZhbC0+YmFja3RyYWNlOyAjIERpZSBhbmQgcHJpbnQgb3V0IGEgYmFja3RyYWNlIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgCgo9Y3V0CgpzdWIgYXNfZXJyb3IgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICVhcmdzID0gKCBlcnJubyA9PiB1bmRlZiwKICAgICAgICAgICAgICAgICBtZXNzYWdlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgIGRvX2JhY2t0cmFjZSA9PiAxLAogICAgICAgICAgICAgICAgIEBfKTsKCiAgICB1bmxlc3MoJGFyZ3N7J2Vycm5vJ30pIHsKICAgICAgICBjYXJwICIkc2VsZiAtPiBhc19lcnJvciBjYWxsZWQgd2l0aG91dCBhbiAnZXJybm8nIHBhcmFtZXRlciI7CiAgICAgICAgcmV0dXJuICh1bmRlZik7CiAgICB9CgogICAgJHNlbGYtPnsnZXJybm8nfSA9ICRhcmdzeydlcnJubyd9OwogICAgJHNlbGYtPnsnZXJyb3JfbWVzc2FnZSd9ID0gJGFyZ3N7J21lc3NhZ2UnfTsKICAgIGlmICgkYXJnc3snZG9fYmFja3RyYWNlJ30pIHsKICAgICAgICAjIFVzZSBjYXJwJ3MgaW50ZXJuYWwgYmFja3RyYWNlIG1ldGhvZHMsIHJhdGhlciB0aGFuIGR1cGxpY2F0aW5nIHRoZW0gb3Vyc2VsdmVzCiAgICAgICAgIG15ICR0cmFjZSA9IERldmVsOjpTdGFja1RyYWNlLT5uZXcoaWdub3JlX3BhY2thZ2UgPT4gJ0NsYXNzOjpSZXR1cm5WYWx1ZScpOwoKICAgICAgICAkc2VsZi0+eydiYWNrdHJhY2UnfSA9ICR0cmFjZS0+YXNfc3RyaW5nOyAjIGxpa2UgY2FycAogICAgfQoKICAgIHJldHVybigxKTsKfQoKCj1pdGVtIGVycm5vIAoKUmV0dXJucyB0aGUgZXJybm8gaWYgdGhlcmUncyBiZWVuIGFuIGVycm9yLiBPdGhlcndpc2UsIHJldHVybiB1bmRlZgoKPWN1dAoKc3ViIGVycm5vIHsgCiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKCRzZWxmLT57J2Vycm5vJ30pIHsKICAgICAgICByZXR1cm4gKCRzZWxmLT57J2Vycm5vJ30pOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICByZXR1cm4odW5kZWYpOwogICAgIH0KfQoKCj1pdGVtIGVycm9yX21lc3NhZ2UKCklmIHRoZXJlJ3MgYmVlbiBhbiBlcnJvciByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UuCgo9Y3V0CgpzdWIgZXJyb3JfbWVzc2FnZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKCRzZWxmLT57J2Vycm9yX21lc3NhZ2UnfSkgewogICAgICAgIHJldHVybigkc2VsZi0+eydlcnJvcl9tZXNzYWdlJ30pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuKHVuZGVmKTsKICAgIH0KfQoKCj1pdGVtIGJhY2t0cmFjZQoKSWYgdGhlcmUncyBiZWVuIGFuIGVycm9yIGFuZCB3ZSBhc2tlZCBmb3IgYSBiYWNrdHJhY2UsIHJldHVybiB0aGUgYmFja3RyYWNlLiAKT3RoZXJ3aXNlLCByZXR1cm4gdW5kZWYuCgo9Y3V0CgpzdWIgYmFja3RyYWNlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAoJHNlbGYtPnsnYmFja3RyYWNlJ30pIHsKICAgICAgICByZXR1cm4oJHNlbGYtPnsnYmFja3RyYWNlJ30pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuKHVuZGVmKTsKICAgIH0KfQoKPWN1dAoKPWl0ZW0gZXJyb3JfY29uZGl0aW9uCgpJZiB0aGVyZSdzIGJlZW4gYW4gZXJyb3IsIHJldHVybiB1bmRlZi4gT3RoZXJ3aXNlIHJldHVybiAxCgo9Y3V0CgpzdWIgZXJyb3JfY29uZGl0aW9uIHsgCiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKCRzZWxmLT57J2Vycm5vJ30pIHsKICAgICAgICAgICAgcmV0dXJuICh1bmRlZik7CiAgICAgICAgfQogICAgICAgIGVsc2lmICh3YW50YXJyYXkoKSkgewogICAgICAgICAgICByZXR1cm4oQHskc2VsZi0+eydhc19hcnJheSd9fSk7CiAgICAgICAgfQogICAgICAgZWxzZSB7IAogICAgICAgICAgICByZXR1cm4oMSk7CiAgICAgICB9ICAgICAKfQoKc3ViIHJldHVybl92YWx1ZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKHdhbnRhcnJheSkgewogICAgICAgICByZXR1cm4gKCRzZWxmLT5hc19hcnJheSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgIHJldHVybiAoJHNlbGYpOwogICAgfQp9CgoKPWhlYWQxIEFVVEhPUgogICAgCiAgICBKZXNzZSBWaW5jZW50IDxqZXNzZUBiZXN0cHJhY3RpY2FsLmNvbT4KCj1oZWFkMSBCVUdTCgogICAgVGhpcyBtb2R1bGUgaGFzLCBhcyB5ZXQsIG5vdCBiZWVuIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLiBJIHRoaW5nCiAgICBpdCBzaG91bGQgd29yaywgYnV0IGhhdmUgbmV2ZXIgYmVuY2htYXJrZWQgaXQuIEkgaGF2ZSBub3QgeWV0IHVzZWQKICAgIGl0IGV4dGVuc2l2ZWx5LCB0aG91Z2ggSSBkbyBwbGFuIHRvIGluIHRoZSBub3QtdG9vLWRpc3RhbnQgZnV0dXJlLgogICAgSWYgeW91IGhhdmUgcXVlc3Rpb25zIG9yIGNvbW1lbnRzLCAgcGxlYXNlIHdyaXRlIG1lLgoKICAgIElmIHlvdSBuZWVkIHRvIHJlcG9ydCBhIGJ1ZywgcGxlYXNlIHNlbmQgbWFpbCB0byAKICAgIDxidWctY2xhc3MtcmV0dXJudmFsdWVAcnQuY3Bhbi5vcmc+IG9yIHJlcG9ydCB5b3VyIGVycm9yIG9uIHRoZSB3ZWIKICAgIGF0IGh0dHA6Ly9ydC5jcGFuLm9yZy8KCj1oZWFkMSBDT1BZUklHSFQKCiAgICBDb3B5cmlnaHQgKGMpIDIwMDIsMjAwMywyMDA1LDIwMDcgSmVzc2UgVmluY2VudCA8amVzc2VAYmVzdHByYWN0aWNhbC5jb20+CiAgICBZb3UgbWF5IHVzZSwgbW9kaWZ5LCBmb2xkLCBzcGluZGxlIG9yIG11dGlsYXRlIHRoaXMgbW9kdWxlIHVuZGVyCiAgICB0aGUgc2FtZSB0ZXJtcyBhcyBwZXJsIGl0c2VsZi4KCj1oZWFkMSBTRUUgQUxTTwoKICAgIENsYXNzOjpSZXR1cm5WYWx1ZSBpc24ndCBhbiBleGNlcHRpb24gaGFuZGxlci4gSWYgaXQgZG9lc24ndAogICAgZG8gd2hhdCB5b3Ugd2FudCwgeW91IG1pZ2h0IHdhbnQgbG9vayBhdCBvbmUgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycwogICAgYmVsb3c6CgogICAgRXJyb3IsIEV4Y2VwdGlvbiwgRXhjZXB0aW9ucywgRXhjZXB0aW9uczo6Q2xhc3MKCiAgICBZb3UgbWlnaHQgYWxzbyB3YW50IHRvIGxvb2sgYXQgQ29udGV4dHVhbDo6UmV0dXJuLCBhbm90aGVyIGltcGxlbWVudGF0aW9uCiAgICBvZiB0aGUgc2FtZSBjb25jZXB0IGFzIHRoaXMgbW9kdWxlLgoKPWN1dAoKMTsK
cGFja2FnZSBDbGFzczo6QWNjZXNzb3I7CnJlcXVpcmUgNS4wMDUwMjsKdXNlIHN0cmljdDsKJENsYXNzOjpBY2Nlc3Nvcjo6VkVSU0lPTiA9ICcwLjM0JzsKCnN1YiBuZXcgewogICAgbXkoJHByb3RvLCAkZmllbGRzKSA9IEBfOwogICAgbXkoJGNsYXNzKSA9IHJlZiAkcHJvdG8gfHwgJHByb3RvOwoKICAgICRmaWVsZHMgPSB7fSB1bmxlc3MgZGVmaW5lZCAkZmllbGRzOwoKICAgICMgbWFrZSBhIGNvcHkgb2YgJGZpZWxkcy4KICAgIGJsZXNzIHslJGZpZWxkc30sICRjbGFzczsKfQoKc3ViIG1rX2FjY2Vzc29ycyB7CiAgICBteSgkc2VsZiwgQGZpZWxkcykgPSBAXzsKCiAgICAkc2VsZi0+X21rX2FjY2Vzc29ycygncncnLCBAZmllbGRzKTsKfQoKaWYgKGV2YWwgeyByZXF1aXJlIFN1Yjo6TmFtZSB9KSB7CiAgICBTdWI6Ok5hbWUtPmltcG9ydDsKfQoKewogICAgbm8gc3RyaWN0ICdyZWZzJzsKCiAgICBzdWIgaW1wb3J0IHsKICAgICAgICBteSAoJGNsYXNzLCBAd2hhdCkgPSBAXzsKICAgICAgICBteSAkY2FsbGVyID0gY2FsbGVyOwogICAgICAgIGZvciAoQHdoYXQpIHsKICAgICAgICAgICAgaWYgKC9eKD86YW50bGVyc3xtb29zZS0/bGlrZSkkL2kpIHsKICAgICAgICAgICAgICAgICp7IiR7Y2FsbGVyfTo6aGFzIn0gPSBzdWIgewogICAgICAgICAgICAgICAgICAgIG15ICgkZiwgJWFyZ3MpID0gQF87CiAgICAgICAgICAgICAgICAgICAgJGNhbGxlci0+X21rX2FjY2Vzc29ycygoJGFyZ3N7aXN9fHwicnciKSwgJGYpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICp7IiR7Y2FsbGVyfTo6ZXh0ZW5kcyJ9ID0gc3ViIHsKICAgICAgICAgICAgICAgICAgICBAeyIke2NhbGxlcn06OklTQSJ9ID0gQF87CiAgICAgICAgICAgICAgICAgICAgdW5sZXNzIChncmVwICRfLT5jYW4oIl9ta19hY2Nlc3NvcnMiKSwgQF8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyIke2NhbGxlcn06OklTQSJ9LCAkY2xhc3M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICMgd2UnbGwgdXNlIHRoZWlyIEBJU0EgYXMgYSBkZWZhdWx0LCBpbiBjYXNlIGl0IGhhcHBlbnMgdG8gYmUKICAgICAgICAgICAgICAgICMgc2V0IGFscmVhZHkKICAgICAgICAgICAgICAgICZ7IiR7Y2FsbGVyfTo6ZXh0ZW5kcyJ9KEB7IiR7Y2FsbGVyfTo6SVNBIn0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN1YiBmb2xsb3dfYmVzdF9wcmFjdGljZSB7CiAgICAgICAgbXkoJHNlbGYpID0gQF87CiAgICAgICAgbXkgJGNsYXNzID0gcmVmICRzZWxmIHx8ICRzZWxmOwogICAgICAgICp7IiR7Y2xhc3N9OjphY2Nlc3Nvcl9uYW1lX2ZvciJ9ICA9IFwmYmVzdF9wcmFjdGljZV9hY2Nlc3Nvcl9uYW1lX2ZvcjsKICAgICAgICAqeyIke2NsYXNzfTo6bXV0YXRvcl9uYW1lX2ZvciJ9ICA9IFwmYmVzdF9wcmFjdGljZV9tdXRhdG9yX25hbWVfZm9yOwogICAgfQoKICAgIHN1YiBfbWtfYWNjZXNzb3JzIHsKICAgICAgICBteSgkc2VsZiwgJGFjY2VzcywgQGZpZWxkcykgPSBAXzsKICAgICAgICBteSAkY2xhc3MgPSByZWYgJHNlbGYgfHwgJHNlbGY7CiAgICAgICAgbXkgJHJhID0gJGFjY2VzcyBlcSAncncnIHx8ICRhY2Nlc3MgZXEgJ3JvJzsKICAgICAgICBteSAkd2EgPSAkYWNjZXNzIGVxICdydycgfHwgJGFjY2VzcyBlcSAnd28nOwoKICAgICAgICBmb3JlYWNoIG15ICRmaWVsZCAoQGZpZWxkcykgewogICAgICAgICAgICBteSAkYWNjZXNzb3JfbmFtZSA9ICRzZWxmLT5hY2Nlc3Nvcl9uYW1lX2ZvcigkZmllbGQpOwogICAgICAgICAgICBteSAkbXV0YXRvcl9uYW1lID0gJHNlbGYtPm11dGF0b3JfbmFtZV9mb3IoJGZpZWxkKTsKICAgICAgICAgICAgaWYoICRhY2Nlc3Nvcl9uYW1lIGVxICdERVNUUk9ZJyBvciAkbXV0YXRvcl9uYW1lIGVxICdERVNUUk9ZJyApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fY2FycCgiSGF2aW5nIGEgZGF0YSBhY2Nlc3NvciBuYW1lZCBERVNUUk9ZICBpbiAnJGNsYXNzJyBpcyB1bndpc2UuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRhY2Nlc3Nvcl9uYW1lIGVxICRtdXRhdG9yX25hbWUpIHsKICAgICAgICAgICAgICAgIG15ICRhY2Nlc3NvcjsKICAgICAgICAgICAgICAgIGlmICgkcmEgJiYgJHdhKSB7CiAgICAgICAgICAgICAgICAgICAgJGFjY2Vzc29yID0gJHNlbGYtPm1ha2VfYWNjZXNzb3IoJGZpZWxkKTsKICAgICAgICAgICAgICAgIH0gZWxzaWYgKCRyYSkgewogICAgICAgICAgICAgICAgICAgICRhY2Nlc3NvciA9ICRzZWxmLT5tYWtlX3JvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRhY2Nlc3NvciA9ICRzZWxmLT5tYWtlX3dvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkZnVsbG5hbWUgPSAiJHtjbGFzc306OiRhY2Nlc3Nvcl9uYW1lIjsKICAgICAgICAgICAgICAgIG15ICRzdWJuYW1lZCA9IDA7CiAgICAgICAgICAgICAgICB1bmxlc3MgKGRlZmluZWQgJnskZnVsbG5hbWV9KSB7CiAgICAgICAgICAgICAgICAgICAgc3VibmFtZSgkZnVsbG5hbWUsICRhY2Nlc3NvcikgaWYgZGVmaW5lZCAmc3VibmFtZTsKICAgICAgICAgICAgICAgICAgICAkc3VibmFtZWQgPSAxOwogICAgICAgICAgICAgICAgICAgICp7JGZ1bGxuYW1lfSA9ICRhY2Nlc3NvcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkYWNjZXNzb3JfbmFtZSBlcSAkZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAjIHRoZSBvbGQgYmVoYXZpb3VyCiAgICAgICAgICAgICAgICAgICAgbXkgJGFsaWFzID0gIiR7Y2xhc3N9OjpfJHtmaWVsZH1fYWNjZXNzb3IiOwogICAgICAgICAgICAgICAgICAgIHN1Ym5hbWUoJGFsaWFzLCAkYWNjZXNzb3IpIGlmIGRlZmluZWQgJnN1Ym5hbWUgYW5kIG5vdCAkc3VibmFtZWQ7CiAgICAgICAgICAgICAgICAgICAgKnskYWxpYXN9ID0gJGFjY2Vzc29yIHVubGVzcyBkZWZpbmVkICZ7JGFsaWFzfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRmdWxsYWNjbmFtZSA9ICIke2NsYXNzfTo6JGFjY2Vzc29yX25hbWUiOwogICAgICAgICAgICAgICAgbXkgJGZ1bGxtdXRuYW1lID0gIiR7Y2xhc3N9OjokbXV0YXRvcl9uYW1lIjsKICAgICAgICAgICAgICAgIGlmICgkcmEgYW5kIG5vdCBkZWZpbmVkICZ7JGZ1bGxhY2NuYW1lfSkgewogICAgICAgICAgICAgICAgICAgIG15ICRhY2Nlc3NvciA9ICRzZWxmLT5tYWtlX3JvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgc3VibmFtZSgkZnVsbGFjY25hbWUsICRhY2Nlc3NvcikgaWYgZGVmaW5lZCAmc3VibmFtZTsKICAgICAgICAgICAgICAgICAgICAqeyRmdWxsYWNjbmFtZX0gPSAkYWNjZXNzb3I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJHdhIGFuZCBub3QgZGVmaW5lZCAmeyRmdWxsbXV0bmFtZX0pIHsKICAgICAgICAgICAgICAgICAgICBteSAkbXV0YXRvciA9ICRzZWxmLT5tYWtlX3dvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgc3VibmFtZSgkZnVsbG11dG5hbWUsICRtdXRhdG9yKSBpZiBkZWZpbmVkICZzdWJuYW1lOwogICAgICAgICAgICAgICAgICAgICp7JGZ1bGxtdXRuYW1lfSA9ICRtdXRhdG9yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKfQoKc3ViIG1rX3JvX2FjY2Vzc29ycyB7CiAgICBteSgkc2VsZiwgQGZpZWxkcykgPSBAXzsKCiAgICAkc2VsZi0+X21rX2FjY2Vzc29ycygncm8nLCBAZmllbGRzKTsKfQoKc3ViIG1rX3dvX2FjY2Vzc29ycyB7CiAgICBteSgkc2VsZiwgQGZpZWxkcykgPSBAXzsKCiAgICAkc2VsZi0+X21rX2FjY2Vzc29ycygnd28nLCBAZmllbGRzKTsKfQoKc3ViIGJlc3RfcHJhY3RpY2VfYWNjZXNzb3JfbmFtZV9mb3IgewogICAgbXkgKCRjbGFzcywgJGZpZWxkKSA9IEBfOwogICAgcmV0dXJuICJnZXRfJGZpZWxkIjsKfQoKc3ViIGJlc3RfcHJhY3RpY2VfbXV0YXRvcl9uYW1lX2ZvciB7CiAgICBteSAoJGNsYXNzLCAkZmllbGQpID0gQF87CiAgICByZXR1cm4gInNldF8kZmllbGQiOwp9CgpzdWIgYWNjZXNzb3JfbmFtZV9mb3IgewogICAgbXkgKCRjbGFzcywgJGZpZWxkKSA9IEBfOwogICAgcmV0dXJuICRmaWVsZDsKfQoKc3ViIG11dGF0b3JfbmFtZV9mb3IgewogICAgbXkgKCRjbGFzcywgJGZpZWxkKSA9IEBfOwogICAgcmV0dXJuICRmaWVsZDsKfQoKc3ViIHNldCB7CiAgICBteSgkc2VsZiwgJGtleSkgPSBzcGxpY2UoQF8sIDAsIDIpOwoKICAgIGlmKEBfID09IDEpIHsKICAgICAgICAkc2VsZi0+eyRrZXl9ID0gJF9bMF07CiAgICB9CiAgICBlbHNpZihAXyA+IDEpIHsKICAgICAgICAkc2VsZi0+eyRrZXl9ID0gW0BfXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRzZWxmLT5fY3JvYWsoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgcmVjZWl2ZWQiKTsKICAgIH0KfQoKc3ViIGdldCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIGlmKEBfID09IDEpIHsKICAgICAgICByZXR1cm4gJHNlbGYtPnskX1swXX07CiAgICB9CiAgICBlbHNpZiggQF8gPiAxICkgewogICAgICAgIHJldHVybiBAeyRzZWxmfXtAX307CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkc2VsZi0+X2Nyb2FrKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIHJlY2VpdmVkIik7CiAgICB9Cn0KCnN1YiBtYWtlX2FjY2Vzc29yIHsKICAgIG15ICgkY2xhc3MsICRmaWVsZCkgPSBAXzsKCiAgICByZXR1cm4gc3ViIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgICAgICBpZihAXykgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPnNldCgkZmllbGQsIEBfKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPmdldCgkZmllbGQpOwogICAgICAgIH0KICAgIH07Cn0KCnN1YiBtYWtlX3JvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgICAgIGlmIChAXykgewogICAgICAgICAgICBteSAkY2FsbGVyID0gY2FsbGVyOwogICAgICAgICAgICAkc2VsZi0+X2Nyb2FrKCInJGNhbGxlcicgY2Fubm90IGFsdGVyIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiBvYmplY3RzIG9mIGNsYXNzICckY2xhc3MnIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPmdldCgkZmllbGQpOwogICAgICAgIH0KICAgIH07Cn0KCnN1YiBtYWtlX3dvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgICAgIHVubGVzcyAoQF8pIHsKICAgICAgICAgICAgbXkgJGNhbGxlciA9IGNhbGxlcjsKICAgICAgICAgICAgJHNlbGYtPl9jcm9haygiJyRjYWxsZXInIGNhbm5vdCBhY2Nlc3MgdGhlIHZhbHVlIG9mICckZmllbGQnIG9uIG9iamVjdHMgb2YgY2xhc3MgJyRjbGFzcyciKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkc2VsZi0+c2V0KCRmaWVsZCwgQF8pOwogICAgICAgIH0KICAgIH07Cn0KCgp1c2UgQ2FycCAoKTsKCnN1YiBfY2FycCB7CiAgICBteSAoJHNlbGYsICRtc2cpID0gQF87CiAgICBDYXJwOjpjYXJwKCRtc2cgfHwgJHNlbGYpOwogICAgcmV0dXJuOwp9CgpzdWIgX2Nyb2FrIHsKICAgIG15ICgkc2VsZiwgJG1zZykgPSBAXzsKICAgIENhcnA6OmNyb2FrKCRtc2cgfHwgJHNlbGYpOwogICAgcmV0dXJuOwp9CgoxOwoKX19FTkRfXwoKPWhlYWQxIE5BTUUKCiAgQ2xhc3M6OkFjY2Vzc29yIC0gQXV0b21hdGVkIGFjY2Vzc29yIGdlbmVyYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKICBwYWNrYWdlIEZvbzsKICB1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpOwogIEZvby0+Zm9sbG93X2Jlc3RfcHJhY3RpY2U7CiAgRm9vLT5ta19hY2Nlc3NvcnMocXcobmFtZSByb2xlIHNhbGFyeSkpOwoKICAjIG9yIGlmIHlvdSBwcmVmZXIgYSBNb29zZS1saWtlIGludGVyZmFjZS4uLgogCiAgcGFja2FnZSBGb287CiAgdXNlIENsYXNzOjpBY2Nlc3NvciAiYW50bGVycyI7CiAgaGFzIG5hbWUgPT4gKCBpcyA9PiAicnciLCBpc2EgPT4gIlN0ciIgKTsKICBoYXMgcm9sZSA9PiAoIGlzID0+ICJydyIsIGlzYSA9PiAiU3RyIiApOwogIGhhcyBzYWxhcnkgPT4gKCBpcyA9PiAicnciLCBpc2EgPT4gIk51bSIgKTsKCiAgIyBNZWFud2hpbGUsIGluIGEgbmVhcmJ5IHBpZWNlIG9mIGNvZGUhCiAgIyBDbGFzczo6QWNjZXNzb3IgcHJvdmlkZXMgbmV3KCkuCiAgbXkgJG1wID0gRm9vLT5uZXcoeyBuYW1lID0+ICJNYXJ0eSIsIHJvbGUgPT4gIkpBUEgiIH0pOwoKICBteSAkam9iID0gJG1wLT5yb2xlOyAgIyBnZXRzICRtcC0+e3JvbGV9CiAgJG1wLT5zYWxhcnkoNDAwMDAwKTsgICMgc2V0cyAkbXAtPntzYWxhcnl9ID0gNDAwMDAwICMgSSB3aXNoCiAgCiAgIyBsaWtlIG15IEBpbmZvID0gQHskbXB9e3F3KG5hbWUgcm9sZSl9CiAgbXkgQGluZm8gPSAkbXAtPmdldChxdyhuYW1lIHJvbGUpKTsKICAKICAjICRtcC0+e3NhbGFyeX0gPSA0MDAwMDAKICAkbXAtPnNldCgnc2FsYXJ5JywgNDAwMDAwKTsKCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgbW9kdWxlIGF1dG9tYWdpY2FsbHkgZ2VuZXJhdGVzIGFjY2Vzc29ycy9tdXRhdG9ycyBmb3IgeW91ciBjbGFzcy4KCk1vc3Qgb2YgdGhlIHRpbWUsIHdyaXRpbmcgYWNjZXNzb3JzIGlzIGFuIGV4ZXJjaXNlIGluIGN1dHRpbmcgYW5kCnBhc3RpbmcuICBZb3UgdXN1YWxseSB3aW5kIHVwIHdpdGggYSBzZXJpZXMgb2YgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgc3ViIG5hbWUgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgICAgaWYoQF8pIHsKICAgICAgICAgICAgJHNlbGYtPntuYW1lfSA9ICRfWzBdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHNlbGYtPntuYW1lfTsKICAgIH0KCiAgICBzdWIgc2FsYXJ5IHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgIGlmKEBfKSB7CiAgICAgICAgICAgICRzZWxmLT57c2FsYXJ5fSA9ICRfWzBdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHNlbGYtPntzYWxhcnl9OwogICAgfQoKICAjIGV0Yy4uLgoKT25lIGZvciBlYWNoIHBpZWNlIG9mIGRhdGEgaW4geW91ciBvYmplY3QuICBXaGlsZSBzb21lIHdpbGwgYmUgdW5pcXVlLApkb2luZyB2YWx1ZSBjaGVja3MgYW5kIHNwZWNpYWwgc3RvcmFnZSB0cmlja3MsIG1vc3Qgd2lsbCBzaW1wbHkgYmUKZXhlcmNpc2VzIGluIHJlcGV0aXRpb24uICBOb3Qgb25seSBpcyBpdCBCYWQgU3R5bGUgdG8gaGF2ZSBhIGJ1bmNoIG9mCnJlcGV0aXRpb3VzIGNvZGUsIGJ1dCBpdCdzIGFsc28gc2ltcGx5IG5vdCBsYXp5LCB3aGljaCBpcyB0aGUgcmVhbAp0cmFnZWR5LgoKSWYgeW91IG1ha2UgeW91ciBtb2R1bGUgYSBzdWJjbGFzcyBvZiBDbGFzczo6QWNjZXNzb3IgYW5kIGRlY2xhcmUgeW91cgphY2Nlc3NvciBmaWVsZHMgd2l0aCBta19hY2Nlc3NvcnMoKSB0aGVuIHlvdSdsbCBmaW5kIHlvdXJzZWxmIHdpdGggYQpzZXQgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYWNjZXNzb3JzIHdoaWNoIGNhbiBldmVuIGJlCmN1c3RvbWl6ZWQhCgpUaGUgYmFzaWMgc2V0IHVwIGlzIHZlcnkgc2ltcGxlOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKCBxdyhmYXIgYmFyIGNhcikgKTsKCkRvbmUuICBGb28gbm93IGhhcyBzaW1wbGUgZmFyKCksIGJhcigpIGFuZCBjYXIoKSBhY2Nlc3NvcnMKZGVmaW5lZC4KCkFsdGVybmF0aXZlbHksIGlmIHlvdSB3YW50IHRvIGZvbGxvdyBEYW1pYW4ncyBJPGJlc3QgcHJhY3RpY2U+IGd1aWRlbGluZXMgCnlvdSBjYW4gdXNlOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+Zm9sbG93X2Jlc3RfcHJhY3RpY2U7CiAgICBGb28tPm1rX2FjY2Vzc29ycyggcXcoZmFyIGJhciBjYXIpICk7CgpCPE5vdGU6PiB5b3UgbXVzdCBjYWxsIEM8Zm9sbG93X2Jlc3RfcHJhY3RpY2U+IGJlZm9yZSBjYWxsaW5nIEM8bWtfYWNjZXNzb3JzPi4KCj1oZWFkMiBNb29zZS1saWtlCgpCeSBwb3B1bGFyIGRlbWFuZCB3ZSBub3cgaGF2ZSBhIHNpbXBsZSBNb29zZS1saWtlIGludGVyZmFjZS4gIFlvdSBjYW4gbm93IGRvOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIENsYXNzOjpBY2Nlc3NvciAiYW50bGVycyI7CiAgICBoYXMgZmFyID0+ICggaXMgPT4gInJ3IiApOwogICAgaGFzIGJhciA9PiAoIGlzID0+ICJydyIgKTsKICAgIGhhcyBjYXIgPT4gKCBpcyA9PiAicnciICk7CgpDdXJyZW50bHkgb25seSB0aGUgQzxpcz4gYXR0cmlidXRlIGlzIHN1cHBvcnRlZC4KCj1oZWFkMSBDT05TVFJVQ1RPUgoKQ2xhc3M6OkFjY2Vzc29yIHByb3ZpZGVzIGEgYmFzaWMgY29uc3RydWN0b3IsIEM8bmV3Pi4gIEl0IGdlbmVyYXRlcyBhCmhhc2gtYmFzZWQgb2JqZWN0IGFuZCBjYW4gYmUgY2FsbGVkIGFzIGVpdGhlciBhIGNsYXNzIG1ldGhvZCBvciBhbgpvYmplY3QgbWV0aG9kLiAgCgo9aGVhZDIgbmV3CgogICAgbXkgJG9iaiA9IEZvby0+bmV3OwogICAgbXkgJG9iaiA9ICRvdGhlcl9vYmotPm5ldzsKCiAgICBteSAkb2JqID0gRm9vLT5uZXcoXCVmaWVsZHMpOwogICAgbXkgJG9iaiA9ICRvdGhlcl9vYmotPm5ldyhcJWZpZWxkcyk7CgpJdCB0YWtlcyBhbiBvcHRpb25hbCAlZmllbGRzIGhhc2ggd2hpY2ggaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZQpvYmplY3QgKGhhbmR5IGlmIHlvdSB1c2UgcmVhZC1vbmx5IGFjY2Vzc29ycykuICBUaGUgZmllbGRzIG9mIHRoZSBoYXNoCmNvcnJlc3BvbmQgdG8gdGhlIG5hbWVzIG9mIHlvdXIgYWNjZXNzb3JzLCBzby4uLgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKCdmb28nKTsKCiAgICBteSAkb2JqID0gRm9vLT5uZXcoeyBmb28gPT4gNDIgfSk7CiAgICBwcmludCAkb2JqLT5mb287ICAgICMgNDIKCmhvd2V2ZXIgJWZpZWxkcyBjYW4gY29udGFpbiBhbnl0aGluZywgbmV3KCkgd2lsbCBzaG92ZSB0aGVtIGFsbCBpbnRvCnlvdXIgb2JqZWN0LgoKPWhlYWQxIE1BS0lORyBBQ0NFU1NPUlMKCj1oZWFkMiBmb2xsb3dfYmVzdF9wcmFjdGljZQoKSW4gRGFtaWFuJ3MgUGVybCBCZXN0IFByYWN0aWNlcyBib29rIGhlIHJlY29tbWVuZHMgc2VwYXJhdGUgZ2V0IGFuZCBzZXQgbWV0aG9kcwp3aXRoIHRoZSBwcmVmaXggc2V0XyBhbmQgZ2V0XyB0byBtYWtlIGl0IGV4cGxpY2l0IHdoYXQgeW91IGludGVuZCB0byBkby4gIElmIHlvdQp3YW50IHRvIGNyZWF0ZSB0aG9zZSBhY2Nlc3NvciBtZXRob2RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lcywgY2FsbDoKCiAgICBfX1BBQ0tBR0VfXy0+Zm9sbG93X2Jlc3RfcHJhY3RpY2UKCkI8YmVmb3JlPiB5b3UgY2FsbCBhbnkgb2YgdGhlIGFjY2Vzc29yLW1ha2luZyBtZXRob2RzLgoKPWhlYWQyIGFjY2Vzc29yX25hbWVfZm9yIC8gbXV0YXRvcl9uYW1lX2ZvcgoKWW91IG1heSBoYXZlIHlvdXIgb3duIGNyYXp5IGlkZWFzIGZvciB0aGUgbmFtZXMgb2YgdGhlIGFjY2Vzc29ycywgc28geW91IGNhbgptYWtlIHRob3NlIGhhcHBlbiBieSBvdmVycmlkaW5nIEM8YWNjZXNzb3JfbmFtZV9mb3I+IGFuZCBDPG11dGF0b3JfbmFtZV9mb3I+IGluCnlvdXIgc3ViY2xhc3MuICAoSSBjb3BpZWQgdGhhdCBpZGVhIGZyb20gQ2xhc3M6OkRCSS4pCgo9aGVhZDIgbWtfYWNjZXNzb3JzCgogICAgX19QQUNLQUdFX18tPm1rX2FjY2Vzc29ycyhAZmllbGRzKTsKClRoaXMgY3JlYXRlcyBhY2Nlc3Nvci9tdXRhdG9yIG1ldGhvZHMgZm9yIGVhY2ggbmFtZWQgZmllbGQgZ2l2ZW4gaW4KQGZpZWxkcy4gIEZvcmVhY2ggZmllbGQgaW4gQGZpZWxkcyBpdCB3aWxsIGdlbmVyYXRlIHR3byBhY2Nlc3NvcnMuCk9uZSBjYWxsZWQgImZpZWxkKCkiIGFuZCB0aGUgb3RoZXIgY2FsbGVkICJfZmllbGRfYWNjZXNzb3IoKSIuICBGb3IKZXhhbXBsZToKCiAgICAjIEdlbmVyYXRlcyBmb28oKSwgX2Zvb19hY2Nlc3NvcigpLCBiYXIoKSBhbmQgX2Jhcl9hY2Nlc3NvcigpLgogICAgX19QQUNLQUdFX18tPm1rX2FjY2Vzc29ycyhxdyhmb28gYmFyKSk7CgpTZWUgTDxDQVZFQVRTIEFORCBUUklDS1MvIk92ZXJyaWRpbmcgYXV0b2dlbmVyYXRlZCBhY2Nlc3NvcnMiPgpmb3IgZGV0YWlscy4KCj1oZWFkMiBta19yb19hY2Nlc3NvcnMKCiAgX19QQUNLQUdFX18tPm1rX3JvX2FjY2Vzc29ycyhAcmVhZF9vbmx5X2ZpZWxkcyk7CgpTYW1lIGFzIG1rX2FjY2Vzc29ycygpIGV4Y2VwdCBpdCB3aWxsIGdlbmVyYXRlIHJlYWQtb25seSBhY2Nlc3NvcnMKKGllLiB0cnVlIGFjY2Vzc29ycykuICBJZiB5b3UgYXR0ZW1wdCB0byBzZXQgYSB2YWx1ZSB3aXRoIHRoZXNlCmFjY2Vzc29ycyBpdCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4gIEl0IG9ubHkgdXNlcyBnZXQoKSBhbmQgbm90CnNldCgpLgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfcm9fYWNjZXNzb3JzKHF3KGZvbyBiYXIpKTsKCiAgICAjIExldCdzIGFzc3VtZSB3ZSBoYXZlIGFuIG9iamVjdCAkZm9vIG9mIGNsYXNzIEZvby4uLgogICAgcHJpbnQgJGZvby0+Zm9vOyAgIyBvaywgcHJpbnRzIHdoYXRldmVyIHRoZSB2YWx1ZSBvZiAkZm9vLT57Zm9vfSBpcwogICAgJGZvby0+Zm9vKDQyKTsgICAgIyBCT09NISAgTmF1Z2h0eSB5b3UuCgoKPWhlYWQyIG1rX3dvX2FjY2Vzc29ycwoKICBfX1BBQ0tBR0VfXy0+bWtfd29fYWNjZXNzb3JzKEB3cml0ZV9vbmx5X2ZpZWxkcyk7CgpTYW1lIGFzIG1rX2FjY2Vzc29ycygpIGV4Y2VwdCBpdCB3aWxsIGdlbmVyYXRlIHdyaXRlLW9ubHkgYWNjZXNzb3JzCihpZS4gbXV0YXRvcnMpLiAgSWYgeW91IGF0dGVtcHQgdG8gcmVhZCBhIHZhbHVlIHdpdGggdGhlc2UgYWNjZXNzb3JzCml0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLiAgSXQgb25seSB1c2VzIHNldCgpIGFuZCBub3QgZ2V0KCkuCgpCPE5PVEU+IEknbSBub3QgZW50aXJlbHkgc3VyZSB3aHkgdGhpcyBpcyB1c2VmdWwsIGJ1dCBJJ20gc3VyZSBzb21lb25lCndpbGwgbmVlZCBpdC4gIElmIHlvdSd2ZSBmb3VuZCBhIHVzZSwgbGV0IG1lIGtub3cuICBSaWdodCBub3cgaXQncyBoZXJlCmZvciBvcnRob2dpbmFsaXR5IGFuZCBiZWNhdXNlIGl0J3MgZWFzeSB0byBpbXBsZW1lbnQuCgogICAgcGFja2FnZSBGb287CiAgICB1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpOwogICAgRm9vLT5ta193b19hY2Nlc3NvcnMocXcoZm9vIGJhcikpOwoKICAgICMgTGV0J3MgYXNzdW1lIHdlIGhhdmUgYW4gb2JqZWN0ICRmb28gb2YgY2xhc3MgRm9vLi4uCiAgICAkZm9vLT5mb28oNDIpOyAgICAgICMgT0suICBTZXRzICRzZWxmLT57Zm9vfSA9IDQyCiAgICBwcmludCAkZm9vLT5mb287ICAgICMgQk9PTSEgIENhbid0IHJlYWQgZnJvbSB0aGlzIGFjY2Vzc29yLgoKPWhlYWQxIE1vb3NlIQoKSWYgeW91IHByZWZlciBhIE1vb3NlLWxpa2UgaW50ZXJmYWNlIHRvIGNyZWF0ZSBhY2Nlc3NvcnMsIHlvdSBjYW4gdXNlIEM8aGFzPiBieQppbXBvcnRpbmcgdGhpcyBtb2R1bGUgbGlrZSB0aGlzOgoKICB1c2UgQ2xhc3M6OkFjY2Vzc29yICJhbnRsZXJzIjsKCm9yCgogIHVzZSBDbGFzczo6QWNjZXNzb3IgIm1vb3NlLWxpa2UiOwoKVGhlbiB5b3UgY2FuIGRlY2xhcmUgYWNjZXNzb3JzIGxpa2UgdGhpczoKCiAgaGFzIGFscGhhID0+ICggaXMgPT4gInJ3IiwgaXNhID0+ICJTdHIiICk7CiAgaGFzIGJldGEgID0+ICggaXMgPT4gInJvIiwgaXNhID0+ICJTdHIiICk7CiAgaGFzIGdhbW1hID0+ICggaXMgPT4gIndvIiwgaXNhID0+ICJTdHIiICk7CgpDdXJyZW50bHkgb25seSB0aGUgQzxpcz4gYXR0cmlidXRlIGlzIHN1cHBvcnRlZC4gIEFuZCBvdXIgQzxpcz4gYWxzbyBzdXBwb3J0cwp0aGUgIndvIiB2YWx1ZSB0byBtYWtlIGEgd3JpdGUtb25seSBhY2Nlc3Nvci4KCklmIHlvdSBhcmUgdXNpbmcgdGhlIE1vb3NlLWxpa2UgaW50ZXJmYWNlIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIEM8ZXh0ZW5kcz4KcmF0aGVyIHRoYW4gdHdlYWtpbmcgeW91ciBDPEBJU0E+IGRpcmVjdGx5LiAgQmFzaWNhbGx5LCByZXBsYWNlCgogIEBJU0EgPSBxdy9Gb28gQmFyLzsKCndpdGgKCiAgZXh0ZW5kcyhxdy9Gb28gQmFyLyk7Cgo9aGVhZDEgREVUQUlMUwoKQW4gYWNjZXNzb3IgZ2VuZXJhdGVkIGJ5IENsYXNzOjpBY2Nlc3NvciBsb29rcyBzb21ldGhpbmcgbGlrZQp0aGlzOgoKICAgICMgWW91ciBmb28gbWF5IHZhcnkuCiAgICBzdWIgZm9vIHsKICAgICAgICBteSgkc2VsZikgPSBzaGlmdDsKICAgICAgICBpZihAXykgeyAgICAjIHNldAogICAgICAgICAgICByZXR1cm4gJHNlbGYtPnNldCgnZm9vJywgQF8pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRzZWxmLT5nZXQoJ2ZvbycpOwogICAgICAgIH0KICAgIH0KClZlcnkgc2ltcGxlLiAgQWxsIGl0IGRvZXMgaXMgZGV0ZXJtaW5lIGlmIHlvdSdyZSB3YW50aW5nIHRvIHNldCBhCnZhbHVlIG9yIGdldCBhIHZhbHVlIGFuZCBjYWxscyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kLgpDbGFzczo6QWNjZXNzb3IgcHJvdmlkZXMgZGVmYXVsdCBnZXQoKSBhbmQgc2V0KCkgbWV0aG9kcyB3aGljaAp5b3VyIGNsYXNzIGNhbiBvdmVycmlkZS4gIFRoZXkncmUgZGV0YWlsZWQgbGF0ZXIuCgo9aGVhZDIgTW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvZiB0aGUgYWNjZXNzb3IKClJhdGhlciB0aGFuIGFjdHVhbGx5IG1vZGlmeWluZyB0aGUgYWNjZXNzb3IgaXRzZWxmLCBpdCBpcyBtdWNoIG1vcmUKc2Vuc2libGUgdG8gc2ltcGx5IG92ZXJyaWRlIHRoZSB0d28ga2V5IG1ldGhvZHMgd2hpY2ggdGhlIGFjY2Vzc29yCmNhbGxzLiAgTmFtZWx5IHNldCgpIGFuZCBnZXQoKS4KCklmIHlvdSAtcmVhbGx5LSB3YW50IHRvLCB5b3UgY2FuIG92ZXJyaWRlIG1ha2VfYWNjZXNzb3IoKS4KCj1oZWFkMiBzZXQKCiAgICAkb2JqLT5zZXQoJGtleSwgJHZhbHVlKTsKICAgICRvYmotPnNldCgka2V5LCBAdmFsdWVzKTsKCnNldCgpIGRlZmluZXMgaG93IGdlbmVyYWxseSBvbmUgc3RvcmVzIGRhdGEgaW4gdGhlIG9iamVjdC4KCm92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSBob3cgZGF0YSBpcyBzdG9yZWQgYnkgeW91ciBhY2Nlc3NvcnMuCgo9aGVhZDIgZ2V0CgogICAgJHZhbHVlICA9ICRvYmotPmdldCgka2V5KTsKICAgIEB2YWx1ZXMgPSAkb2JqLT5nZXQoQGtleXMpOwoKZ2V0KCkgZGVmaW5lcyBob3cgZGF0YSBpcyByZXRyZWl2ZWQgZnJvbSB5b3VyIG9iamVjdHMuCgpvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2UgaG93IGl0IGlzIHJldHJlaXZlZC4KCj1oZWFkMiBtYWtlX2FjY2Vzc29yCgogICAgJGFjY2Vzc29yID0gX19QQUNLQUdFX18tPm1ha2VfYWNjZXNzb3IoJGZpZWxkKTsKCkdlbmVyYXRlcyBhIHN1YnJvdXRpbmUgcmVmZXJlbmNlIHdoaWNoIGFjdHMgYXMgYW4gYWNjZXNzb3IgZm9yIHRoZSBnaXZlbgokZmllbGQuICBJdCBjYWxscyBnZXQoKSBhbmQgc2V0KCkuCgpJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHlvdXIgYWNjZXNzb3JzLCB0cnkgb3ZlcnJpZGluZwpnZXQoKSBhbmQgc2V0KCkgYmVmb3JlIHlvdSBzdGFydCBtdWNraW5nIHdpdGggbWFrZV9hY2Nlc3NvcigpLgoKPWhlYWQyIG1ha2Vfcm9fYWNjZXNzb3IKCiAgICAkcmVhZF9vbmx5X2FjY2Vzc29yID0gX19QQUNLQUdFX18tPm1ha2Vfcm9fYWNjZXNzb3IoJGZpZWxkKTsKCkdlbmVyYXRlcyBhIHN1YnJvdXRpbmUgcmVmcmVuY2Ugd2hpY2ggYWN0cyBhcyBhIHJlYWQtb25seSBhY2Nlc3NvciBmb3IKdGhlIGdpdmVuICRmaWVsZC4gIEl0IG9ubHkgY2FsbHMgZ2V0KCkuCgpPdmVycmlkZSBnZXQoKSB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHlvdXIgYWNjZXNzb3JzLgoKPWhlYWQyIG1ha2Vfd29fYWNjZXNzb3IKCiAgICAkcmVhZF9vbmx5X2FjY2Vzc29yID0gX19QQUNLQUdFX18tPm1ha2Vfd29fYWNjZXNzb3IoJGZpZWxkKTsKCkdlbmVyYXRlcyBhIHN1YnJvdXRpbmUgcmVmcmVuY2Ugd2hpY2ggYWN0cyBhcyBhIHdyaXRlLW9ubHkgYWNjZXNzb3IKKG11dGF0b3IpIGZvciB0aGUgZ2l2ZW4gJGZpZWxkLiAgSXQgb25seSBjYWxscyBzZXQoKS4KCk92ZXJyaWRlIHNldCgpIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgeW91ciBhY2Nlc3NvcnMuCgo9aGVhZDEgRVhDRVBUSU9OUwoKSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgQ2xhc3M6OkFjY2Vzc29yIHdpbGwgd2FybiBvciBkaWUgYnkgY2FsbGluZyBDYXJwOjpjYXJwCm9yIENhcnA6OmNyb2FrLiAgSWYgeW91IGRvbid0IGxpa2UgdGhpcyB5b3UgY2FuIG92ZXJyaWRlIF9jYXJwKCkgYW5kIF9jcm9haygpIGluCnlvdXIgc3ViY2xhc3MgYW5kIGRvIHdoYXRldmVyIGVsc2UgeW91IHdhbnQuCgo9aGVhZDEgRUZGSUNJRU5DWQoKQ2xhc3M6OkFjY2Vzc29yIGRvZXMgbm90IGVtcGxveSBhbiBhdXRvbG9hZGVyLCB0aHVzIGl0IGlzIG11Y2ggZmFzdGVyCnRoYW4geW91J2QgdGhpbmsuICBJdHMgZ2VuZXJhdGVkIG1ldGhvZHMgaW5jdXIgbm8gc3BlY2lhbCBwZW5hbHR5IG92ZXIKb25lcyB5b3UnZCB3cml0ZSB5b3Vyc2VsZi4KCiAgYWNjZXNzb3JzOgogICAgICAgICAgICAgIFJhdGUgIEJhc2ljICAgRmFzdCBGYXN0ZXIgRGlyZWN0CiAgQmFzaWMgICAzNjc1ODkvcyAgICAgLS0gICAtNTElICAgLTU1JSAgIC04OSUKICBGYXN0ICAgIDc0Nzk2NC9zICAgMTAzJSAgICAgLS0gICAgLTklICAgLTc3JQogIEZhc3RlciAgODE5MTk5L3MgICAxMjMlICAgIDEwJSAgICAgLS0gICAtNzUlCiAgRGlyZWN0IDMyNDU4ODcvcyAgIDc4MyUgICAzMzQlICAgMjk2JSAgICAgLS0KCiAgbXV0YXRvcnM6CiAgICAgICAgICAgICAgUmF0ZSAgICBBY2MgICBGYXN0IEZhc3RlciBEaXJlY3QKICBBY2MgICAgIDI2NTU2NC9zICAgICAtLSAgIC01NCUgICAtNjMlICAgLTkxJQogIEZhc3QgICAgNTczNDM5L3MgICAxMTYlICAgICAtLSAgIC0yMSUgICAtODAlCiAgRmFzdGVyICA3MjQ3MTAvcyAgIDE3MyUgICAgMjYlICAgICAtLSAgIC03NSUKICBEaXJlY3QgMjg2MDk3OS9zICAgOTc3JSAgIDM5OSUgICAyOTUlICAgICAtLQoKQ2xhc3M6OkFjY2Vzc29yOjpGYXN0IGlzIGZhc3RlciB0aGFuIG1ldGhvZHMgd3JpdHRlbiBieSBhbiBhdmVyYWdlIHByb2dyYW1tZXIKKHdoZXJlICJhdmVyYWdlIiBpcyBiYXNlZCBvbiBTY2h3ZXJuJ3MgZXhhbXBsZSBjb2RlKS4KCkNsYXNzOjpBY2Nlc3NvciBpcyBzbG93ZXIgdGhhbiBhdmVyYWdlLCBidXQgbW9yZSBmbGV4aWJsZS4KCkNsYXNzOjpBY2Nlc3Nvcjo6RmFzdGVyIGlzIGV2ZW4gZmFzdGVyIHRoYW4gQ2xhc3M6OkFjY2Vzc29yOjpGYXN0LiAgSXQgdXNlcyBhbgphcnJheSBpbnRlcm5hbGx5LCBub3QgYSBoYXNoLiAgVGhpcyBjb3VsZCBiZSBhIGdvb2Qgb3IgYmFkIGZlYXR1cmUgZGVwZW5kaW5nIG9uCnlvdXIgcG9pbnQgb2Ygdmlldy4KCkRpcmVjdCBoYXNoIGFjY2VzcyBpcywgb2YgY291cnNlLCBtdWNoIGZhc3RlciB0aGFuIGFsbCBvZiB0aGVzZSwgYnV0IGl0CnByb3ZpZGVzIG5vIGVuY2Fwc3VsYXRpb24uCgpPZiBjb3Vyc2UsIGl0J3Mgbm90IGFzIHNpbXBsZSBhcyBzYXlpbmcgIkNsYXNzOjpBY2Nlc3NvciBpcyBzbG93ZXIgdGhhbgphdmVyYWdlIi4gIFRoZXNlIGFyZSBiZW5jaG1hcmtzIGZvciBhIHNpbXBsZSBhY2Nlc3Nvci4gIElmIHlvdXIgYWNjZXNzb3JzIGRvCmFueSBzb3J0IG9mIGNvbXBsaWNhdGVkIHdvcmsgKHN1Y2ggYXMgdGFsa2luZyB0byBhIGRhdGFiYXNlIG9yIHdyaXRpbmcgdG8gYQpmaWxlKSB0aGUgdGltZSBzcGVudCBkb2luZyB0aGF0IHdvcmsgd2lsbCBxdWlja2x5IHN3YW1wIHRoZSB0aW1lIHNwZW5kIGp1c3QKY2FsbGluZyB0aGUgYWNjZXNzb3IuICBJbiB0aGF0IGNhc2UsIENsYXNzOjpBY2Nlc3NvciBhbmQgdGhlIG9uZXMgeW91IHdyaXRlCndpbGwgYmUgcm91Z2hseSB0aGUgc2FtZSBzcGVlZC4KCgo9aGVhZDEgRVhBTVBMRVMKCkhlcmUncyBhbiBleGFtcGxlIG9mIGdlbmVyYXRpbmcgYW4gYWNjZXNzb3IgZm9yIGV2ZXJ5IHB1YmxpYyBmaWVsZCBvZgp5b3VyIGNsYXNzLgoKICAgIHBhY2thZ2UgQWx0b2lkczsKICAgIAogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yIENsYXNzOjpGaWVsZHMpOwogICAgdXNlIGZpZWxkcyBxdyhjdXJpb3VzbHkgc3Ryb25nIG1pbnRzKTsKICAgIEFsdG9pZHMtPm1rX2FjY2Vzc29ycyggQWx0b2lkcy0+c2hvd19maWVsZHMoJ1B1YmxpYycpICk7CgogICAgc3ViIG5ldyB7CiAgICAgICAgbXkgJHByb3RvID0gc2hpZnQ7CiAgICAgICAgbXkgJGNsYXNzID0gcmVmICRwcm90byB8fCAkcHJvdG87CiAgICAgICAgcmV0dXJuIGZpZWxkczo6bmV3KCRjbGFzcyk7CiAgICB9CgogICAgbXkgQWx0b2lkcyAkdGluID0gQWx0b2lkcy0+bmV3OwoKICAgICR0aW4tPmN1cmlvdXNseSgnQ3VyaW91c2VyIGFuZCBjdXJpb3VzZXInKTsKICAgIHByaW50ICR0aW4tPntjdXJpb3VzbHl9OyAgICAjIHByaW50cyAnQ3VyaW91c2VyIGFuZCBjdXJpb3VzZXInCgogICAgCiAgICAjIFN1YmNsYXNzaW5nIHdvcmtzLCB0b28uCiAgICBwYWNrYWdlIE1pbnQ6OlNudWZmOwogICAgdXNlIGJhc2UgcXcoQWx0b2lkcyk7CgogICAgbXkgTWludDo6U251ZmYgJHBvdWNoID0gTWludDo6U251ZmYtPm5ldzsKICAgICRwb3VjaC0+c3Ryb25nKCdCbG93IHlvdXIgaGVhZCBvZmYhJyk7CiAgICBwcmludCAkcG91Y2gtPntzdHJvbmd9OyAgICAgIyBwcmludHMgJ0Jsb3cgeW91ciBoZWFkIG9mZiEnCgoKSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGUgb2YgYWx0ZXJpbmcgdGhlIGJlaGF2aW9yIG9mIHlvdXIgYWNjZXNzb3JzLgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKHF3KHRoaXMgdGhhdCB1cCBkb3duKSk7CgogICAgc3ViIGdldCB7CiAgICAgICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICAgICAgIyBOb3RlIGV2ZXJ5IHRpbWUgc29tZW9uZSBnZXRzIHNvbWUgZGF0YS4KICAgICAgICBwcmludCBTVERFUlIgIkdldHRpbmcgQF9cbiI7CgogICAgICAgICRzZWxmLT5TVVBFUjo6Z2V0KEBfKTsKICAgIH0KCiAgICBzdWIgc2V0IHsKICAgICAgICBteSAoJHNlbGYsICRrZXkpID0gc3BsaWNlKEBfLCAwLCAyKTsKCiAgICAgICAgIyBOb3RlIGV2ZXJ5IHRpbWUgc29tZW9uZSBzZXRzIHNvbWUgZGF0YS4KICAgICAgICBwcmludCBTVERFUlIgIlNldHRpbmcgJGtleSB0byBAX1xuIjsKCiAgICAgICAgJHNlbGYtPlNVUEVSOjpzZXQoJGtleSwgQF8pOwogICAgfQoKCj1oZWFkMSBDQVZFQVRTIEFORCBUUklDS1MKCkNsYXNzOjpBY2Nlc3NvciBoYXMgdG8gZG8gc29tZSBpbnRlcm5hbCB3YWNraW5lc3MgdG8gZ2V0IGl0cwpqb2IgZG9uZSBxdWlja2x5IGFuZCBlZmZpY2llbnRseS4gIEJlY2F1c2Ugb2YgdGhpcywgdGhlcmUncyBhIGZldwp0cmlja3MgYW5kIHRyYXBzIG9uZSBtdXN0IGtub3cgYWJvdXQuCgpIZXksIG5vdGhpbmcncyBwZXJmZWN0LgoKPWhlYWQyIERvbid0IG1ha2UgYSBmaWVsZCBjYWxsZWQgREVTVFJPWQoKVGhpcyBpcyBiYWQuICBTaW5jZSBERVNUUk9ZIGlzIGEgbWFnaWNhbCBtZXRob2QgaXQgd291bGQgYmUgYmFkIGZvciB1cwp0byBkZWZpbmUgYW4gYWNjZXNzb3IgdXNpbmcgdGhhdCBuYW1lLiAgQ2xhc3M6OkFjY2Vzc29yIHdpbGwKY2FycCBpZiB5b3UgdHJ5IHRvIHVzZSBpdCB3aXRoIGEgZmllbGQgbmFtZWQgIkRFU1RST1kiLgoKPWhlYWQyIE92ZXJyaWRpbmcgYXV0b2dlbmVyYXRlZCBhY2Nlc3NvcnMKCllvdSBtYXkgd2FudCB0byBvdmVycmlkZSB0aGUgYXV0b2dlbmVyYXRlZCBhY2Nlc3NvciB3aXRoIHlvdXIgb3duLCB5ZXQKaGF2ZSB5b3VyIGN1c3RvbSBhY2Nlc3NvciBjYWxsIHRoZSBkZWZhdWx0IG9uZS4gIEZvciBpbnN0YW5jZSwgbWF5YmUKeW91IHdhbnQgdG8gaGF2ZSBhbiBhY2Nlc3NvciB3aGljaCBjaGVja3MgaXRzIGlucHV0LiAgTm9ybWFsbHksIG9uZQp3b3VsZCBleHBlY3QgdGhpcyB0byB3b3JrOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKHF3KGVtYWlsIHRoaXMgdGhhdCB3aGF0ZXZlcikpOwoKICAgICMgT25seSBhY2NlcHQgYWRkcmVzc2VzIHdoaWNoIGxvb2sgdmFsaWQuCiAgICBzdWIgZW1haWwgewogICAgICAgIG15KCRzZWxmKSA9IHNoaWZ0OwogICAgICAgIG15KCRlbWFpbCkgPSBAXzsKCiAgICAgICAgaWYoIEBfICkgeyAgIyBTZXR0aW5nCiAgICAgICAgICAgIHJlcXVpcmUgRW1haWw6OlZhbGlkOwogICAgICAgICAgICB1bmxlc3MoIEVtYWlsOjpWYWxpZC0+YWRkcmVzcygkZW1haWwpICkgewogICAgICAgICAgICAgICAgY2FycCgiJGVtYWlsIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgYWRkcmVzcy4iKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzZWxmLT5TVVBFUjo6ZW1haWwoQF8pOwogICAgfQoKVGhlcmUncyBhIHN1YnRsZSBwcm9ibGVtIGluIHRoZSBsYXN0IGV4YW1wbGUsIGFuZCBpdCdzIGluIHRoaXMgbGluZToKCiAgICByZXR1cm4gJHNlbGYtPlNVUEVSOjplbWFpbChAXyk7CgpJZiB3ZSBsb29rIGF0IGhvdyBGb28gd2FzIGRlZmluZWQsIGl0IGNhbGxlZCBta19hY2Nlc3NvcnMoKSB3aGljaApzdHVjayBlbWFpbCgpIHJpZ2h0IGludG8gRm9vJ3MgbmFtZXNwYWNlLiAgVGhlcmUgKmlzKiBubwpTVVBFUjo6ZW1haWwoKSB0byBkZWxlZ2F0ZSB0byEgIFR3byB3YXlzIGFyb3VuZCB0aGlzLi4uIGZpcnN0IGlzIHRvCm1ha2UgYSAicHVyZSIgYmFzZSBjbGFzcyBmb3IgRm9vLiAgVGhpcyBwdXJlIGNsYXNzIHdpbGwgZ2VuZXJhdGUgdGhlCmFjY2Vzc29ycyBhbmQgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IHN1cGVyIGNsYXNzIGZvciBGb28gdG8gdXNlOgoKICAgIHBhY2thZ2UgUHVyZTo6T3JnYW5pYzo6Rm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIFB1cmU6Ok9yZ2FuaWM6OkZvby0+bWtfYWNjZXNzb3JzKHF3KGVtYWlsIHRoaXMgdGhhdCB3aGF0ZXZlcikpOwoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoUHVyZTo6T3JnYW5pYzo6Rm9vKTsKCkFuZCBub3cgRm9vOjplbWFpbCgpIGNhbiBvdmVycmlkZSB0aGUgZ2VuZXJhdGVkClB1cmU6Ok9yZ2FuaWM6OkZvbzo6ZW1haWwoKSBhbmQgdXNlIGl0IGFzIFNVUEVSOjplbWFpbCgpLgoKVGhpcyBpcyBwcm9iYWJseSB0aGUgbW9zdCBvYnZpb3VzIHNvbHV0aW9uIHRvIGV2ZXJ5b25lIGJ1dCBtZS4KSW5zdGVhZCwgd2hhdCBmaXJzdCBtYWRlIHNlbnNlIHRvIG1lIHdhcyBmb3IgbWtfYWNjZXNzb3JzKCkgdG8gZGVmaW5lCmFuIGFsaWFzIG9mIGVtYWlsKCksIF9lbWFpbF9hY2Nlc3NvcigpLiAgVXNpbmcgdGhpcyBzb2x1dGlvbiwKRm9vOjplbWFpbCgpIHdvdWxkIGJlIHdyaXR0ZW4gd2l0aDoKCiAgICByZXR1cm4gJHNlbGYtPl9lbWFpbF9hY2Nlc3NvcihAXyk7CgppbnN0ZWFkIG9mIHRoZSBleHBlY3RlZCBTVVBFUjo6ZW1haWwoKS4KCgo9aGVhZDEgQVVUSE9SUwoKQ29weXJpZ2h0IDIwMDkgTWFydHkgUGF1bGV5IDxtYXJ0eStwZXJsQGthc2VpLmNvbT4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCnRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiAgVGhhdCBtZWFucyBlaXRoZXIgKGEpIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBvciAoYikgdGhlIEFydGlzdGljIExpY2Vuc2UuCgo9aGVhZDIgT1JJR0lOQUwgQVVUSE9SCgpNaWNoYWVsIEcgU2Nod2VybiA8c2Nod2VybkBwb2JveC5jb20+Cgo9aGVhZDIgVEhBTktTCgpMaXogYW5kIFJVWiBmb3IgcGVyZm9ybWFuY2UgdHdlYWtzLgoKVGVscywgZm9yIGhpcyBiaWcgZmVhdHVyZSByZXF1ZXN0L2J1ZyByZXBvcnQuCgpWYXJpb3VzIHByZXNlbnRlcnMgYXQgWUFQQzo6QXNpYSAyMDA5IGZvciBjcml0aWNpc2luZyB0aGUgbm9uLU1vb3NlIGludGVyZmFjZS4KCj1oZWFkMSBTRUUgQUxTTwoKU2VlIEw8Q2xhc3M6OkFjY2Vzc29yOjpGYXN0PiBhbmQgTDxDbGFzczo6QWNjZXNzb3I6OkZhc3Rlcj4gaWYgc3BlZWQgaXMgbW9yZQppbXBvcnRhbnQgdGhhbiBmbGV4aWJpbGl0eS4KClRoZXNlIGFyZSBzb21lIG1vZHVsZXMgd2hpY2ggZG8gc2ltaWxhciB0aGluZ3MgaW4gZGlmZmVyZW50IHdheXMKTDxDbGFzczo6U3RydWN0PiwgTDxDbGFzczo6TWV0aG9kbWFrZXI+LCBMPENsYXNzOjpHZW5lcmF0ZT4sCkw8Q2xhc3M6OkNsYXNzPiwgTDxDbGFzczo6Q29udHJhY3Q+LCBMPE1vb3NlPiwgTDxNb3VzZT4KClNlZSBMPENsYXNzOjpEQkk+IGZvciBhbiBleGFtcGxlIG9mIHRoaXMgbW9kdWxlIGluIHVzZS4KCj1jdXQK
dXNlIHN0cmljdDsKcGFja2FnZSBDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ7CnVzZSBiYXNlICdDbGFzczo6QWNjZXNzb3InOwpvdXIgJFZFUlNJT04gPSAnMC4wMSc7CgpzdWIgbWFrZV9hY2Nlc3NvciB7CiAgICBteSgkY2xhc3MsICRmaWVsZCkgPSBAXzsKCiAgICAjIEJ1aWxkIGEgY2xvc3VyZSBhcm91bmQgJGZpZWxkLgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgbXkoJHNlbGYpID0gc2hpZnQ7CgogICAgICAgIGlmIChAXykgewogICAgICAgICAgICAkc2VsZi0+c2V0KCRmaWVsZCwgQF8pOwogICAgICAgICAgICByZXR1cm4gJHNlbGY7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPmdldCgkZmllbGQpOwogICAgICAgIH0KICAgIH07Cn0KCnN1YiBtYWtlX3dvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15KCRzZWxmKSA9IHNoaWZ0OwoKICAgICAgICB1bmxlc3MgKEBfKSB7CiAgICAgICAgICAgIG15ICRjYWxsZXIgPSBjYWxsZXI7CiAgICAgICAgICAgIHJlcXVpcmUgQ2FycDsKICAgICAgICAgICAgQ2FycDo6Y3JvYWsoIickY2FsbGVyJyBjYW5ub3QgYWNjZXNzIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiAiLgogICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0cyBvZiBjbGFzcyAnJGNsYXNzJyIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPnNldCgkZmllbGQsIEBfKTsKICAgICAgICAgICAgcmV0dXJuICRzZWxmOwogICAgICAgIH0KICAgIH07Cn0KCjE7Cl9fRU5EX18KCj1oZWFkMSBOQU1FCgpDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQgLSBtYWtlIGNoYWluZWQgYWNjZXNzb3JzCgo9aGVhZDEgU1lOT1BTSVMKCiBwYWNrYWdlIEZvbzsKIHVzZSBiYXNlIHF3KCBDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQgKTsKIF9fUEFDS0FHRV9fLT5ta19hY2Nlc3NvcnMocXcoIGZvbyBiYXIgYmF6ICkpOwoKIG15ICRmb28gPSBGb28tPm5ldy0+Zm9vKDEpLT5iYXIoMiktPmJheig0KTsKIHByaW50ICRmb28tPmJhcjsgIyBwcmludHMgMgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIGNoYWluZWQgYWNjZXNzb3IgaXMgb25lIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIG9iamVjdCB3aGVuIGNhbGxlZAp3aXRoIHBhcmFtZXRlcnMgKHRvIHNldCksIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHdoZW4gY2FsbGVkIHdpdGgKbm8gYXJndW1lbnRzLgoKVGhpcyBtb2R1bGUgc3ViY2xhc3NlcyBDbGFzczo6QWNjZXNzb3IgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgc2FtZQpta19hY2Nlc3NvcnMgaW50ZXJmYWNlLgoKPWhlYWQxIEFVVEhPUgoKUmljaGFyZCBDbGFtcCA8cmljaGFyZGNAdW5peGJlYXJkLm5ldD4KCj1oZWFkMSBDT1BZUklHSFQKCkNvcHlyaWdodCAoQykgMjAwMyBSaWNoYXJkIENsYW1wLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9aGVhZDEgU0VFIEFMU08KCkw8Q2xhc3M6OkFjY2Vzc29yPiwgTDxDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ6OkZhc3Q+Cgo9Y3V0Cg==
cGFja2FnZSBDbGFzczo6QWNjZXNzb3I6OkZhc3Q7CnVzZSBiYXNlICdDbGFzczo6QWNjZXNzb3InOwp1c2Ugc3RyaWN0OwokQ2xhc3M6OkFjY2Vzc29yOjpGYXN0OjpWRVJTSU9OID0gJzAuMzQnOwoKc3ViIG1ha2VfYWNjZXNzb3IgewogICAgbXkoJGNsYXNzLCAkZmllbGQpID0gQF87CgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgcmV0dXJuICRfWzBdLT57JGZpZWxkfSBpZiBzY2FsYXIoQF8pID09IDE7CiAgICAgICAgcmV0dXJuICRfWzBdLT57JGZpZWxkfSAgPSBzY2FsYXIoQF8pID09IDIgPyAkX1sxXSA6IFtAX1sxLi4kI19dXTsKICAgIH07Cn0KCgpzdWIgbWFrZV9yb19hY2Nlc3NvciB7CiAgICBteSgkY2xhc3MsICRmaWVsZCkgPSBAXzsKCiAgICByZXR1cm4gc3ViIHsKICAgICAgICByZXR1cm4gJF9bMF0tPnskZmllbGR9IGlmIEBfID09IDE7CiAgICAgICAgbXkgJGNhbGxlciA9IGNhbGxlcjsKICAgICAgICAkX1swXS0+X2Nyb2FrKCInJGNhbGxlcicgY2Fubm90IGFsdGVyIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiBvYmplY3RzIG9mIGNsYXNzICckY2xhc3MnIik7CiAgICB9Owp9CgoKc3ViIG1ha2Vfd29fYWNjZXNzb3IgewogICAgbXkoJGNsYXNzLCAkZmllbGQpID0gQF87CgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgaWYgKEBfID09IDEpIHsKICAgICAgICAgICAgbXkgJGNhbGxlciA9IGNhbGxlcjsKICAgICAgICAgICAgJF9bMF0tPl9jcm9haygiJyRjYWxsZXInIGNhbm5vdCBhY2Nlc3MgdGhlIHZhbHVlIG9mICckZmllbGQnIG9uIG9iamVjdHMgb2YgY2xhc3MgJyRjbGFzcyciKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkX1swXS0+eyRmaWVsZH0gPSAkX1sxXSBpZiBAXyA9PSAyOwogICAgICAgICAgICByZXR1cm4gKHNoaWZ0KS0+eyRmaWVsZH0gPSBcQF87CiAgICAgICAgfQogICAgfTsKfQoKCjE7CgpfX0VORF9fCgo9aGVhZDEgTkFNRQoKQ2xhc3M6OkFjY2Vzc29yOjpGYXN0IC0gRmFzdGVyLCBidXQgbGVzcyBleHBhbmRhYmxlLCBhY2Nlc3NvcnMKCj1oZWFkMSBTWU5PUFNJUwoKICBwYWNrYWdlIEZvbzsKICB1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3I6OkZhc3QpOwoKICAjIFRoZSByZXN0IGlzIHRoZSBzYW1lIGFzIENsYXNzOjpBY2Nlc3NvciBidXQgd2l0aG91dCBzZXQoKSBhbmQgZ2V0KCkuCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgaXMgYSBmYXN0ZXIgYnV0IGxlc3MgZXhwYW5kYWJsZSB2ZXJzaW9uIG9mIENsYXNzOjpBY2Nlc3Nvci4KQ2xhc3M6OkFjY2Vzc29yJ3MgZ2VuZXJhdGVkIGFjY2Vzc29ycyByZXF1aXJlIHR3byBtZXRob2QgY2FsbHMgdG8gYWNjb21waXNoCnRoZWlyIHRhc2sgKG9uZSBmb3IgdGhlIGFjY2Vzc29yLCBhbm90aGVyIGZvciBnZXQoKSBvciBzZXQoKSkuCkNsYXNzOjpBY2Nlc3Nvcjo6RmFzdCBlbGltaW5hdGVzIGNhbGxpbmcgc2V0KCkvZ2V0KCkgYW5kIGRvZXMgdGhlIGFjY2VzcyBpdHNlbGYsCnJlc3VsdGluZyBpbiBhIHNvbWV3aGF0IGZhc3RlciBhY2Nlc3Nvci4KClRoZSBkb3duc2lkZSBpcyB0aGF0IHlvdSBjYW4ndCBlYXNpbHkgYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHlvdXIKYWNjZXNzb3JzLCBub3IgY2FuIHlvdXIgc3ViY2xhc3Nlcy4gIE9mIGNvdXJzZSwgc2hvdWxkIHlvdSBuZWVkIHRoaXMKbGF0ZXIsIHlvdSBjYW4gYWx3YXlzIHN3YXAgb3V0IENsYXNzOjpBY2Nlc3Nvcjo6RmFzdCBmb3IKQ2xhc3M6OkFjY2Vzc29yLgoKUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQ2xhc3M6OkFjY2Vzc29yIGZvciBtb3JlIGluZm8uCgo9aGVhZDEgRUZGSUNJRU5DWQoKTDxDbGFzczo6QWNjZXNzb3IvRUZGSUNJRU5DWT4gZm9yIGFuIGVmZmljaWVuY3kgY29tcGFyaXNvbi4KCj1oZWFkMSBBVVRIT1JTCgpDb3B5cmlnaHQgMjAwNyBNYXJ0eSBQYXVsZXkgPG1hcnR5K3BlcmxAa2FzZWkuY29tPgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuICBUaGF0IG1lYW5zIGVpdGhlciAoYSkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIG9yIChiKSB0aGUgQXJ0aXN0aWMgTGljZW5zZS4KCj1oZWFkMiBPUklHSU5BTCBBVVRIT1IKCk1pY2hhZWwgRyBTY2h3ZXJuIDxzY2h3ZXJuQHBvYm94LmNvbT4KCj1oZWFkMSBTRUUgQUxTTwoKTDxDbGFzczo6QWNjZXNzb3I+Cgo9Y3V0Cg==
dXNlIHN0cmljdDsKcGFja2FnZSBDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ6OkZhc3Q7CnVzZSBiYXNlICdDbGFzczo6QWNjZXNzb3I6OkZhc3QnOwoKc3ViIG1ha2VfYWNjZXNzb3IgewogICAgbXkoJGNsYXNzLCAkZmllbGQpID0gQF87CgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICAgICBpZihAXykgewogICAgICAgICAgICAkc2VsZi0+eyRmaWVsZH0gPSAoQF8gPT0gMSA/ICRfWzBdIDogW0BfXSk7CiAgICAgICAgICAgIHJldHVybiAkc2VsZjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzZWxmLT57JGZpZWxkfTsKICAgIH07Cn0KCnN1YiBtYWtlX3dvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15KCRzZWxmKSA9IHNoaWZ0OwoKICAgICAgICB1bmxlc3MgKEBfKSB7CiAgICAgICAgICAgIG15ICRjYWxsZXIgPSBjYWxsZXI7CiAgICAgICAgICAgIHJlcXVpcmUgQ2FycDsKICAgICAgICAgICAgQ2FycDo6Y3JvYWsoIickY2FsbGVyJyBjYW5ub3QgYWNjZXNzIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiAiLgogICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0cyBvZiBjbGFzcyAnJGNsYXNzJyIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPnskZmllbGR9ID0gKEBfID09IDEgPyAkX1swXSA6IFtAX10pOwogICAgICAgICAgICByZXR1cm4gJHNlbGY7CiAgICAgICAgfQogICAgfTsKfQoKMTsKCj1oZWFkMSBOQU1FCgpDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ6OkZhc3QgLSBGYXN0ZXIsIGJ1dCBsZXNzIGV4cGFuZGFibGUsIGNoYWluZWQgYWNjZXNzb3JzCgo9aGVhZDEgU1lOT1BTSVMKCiBwYWNrYWdlIEZvbzsKIHVzZSBiYXNlIHF3KENsYXNzOjpBY2Nlc3Nvcjo6Q2hhaW5lZDo6RmFzdCk7CgogICMgVGhlIHJlc3QgYXMgQ2xhc3M6OkFjY2Vzc29yOjpDaGFpbmVkIGV4Y2VwdCBubyBzZXQoKSBvciBnZXQoKS4KCj1oZWFkMSBERVNDUklQVElPTgoKQnkgYW5hbG9ndWUgdG8gQ2xhc3M6OkFjY2Vzc29yIGFuZCBDbGFzczo6QWNjZXNzb3I6OkZhc3QgdGhpcyBtb2R1bGUKcHJvdmlkZXMgYSBmYXN0ZXIgbGVzcy1mbGV4aWJsZSBjaGFpbmVkIGFjY2Vzc29yIG1ha2VyLgoKPWhlYWQxIEFVVEhPUgoKUmljaGFyZCBDbGFtcCA8cmljaGFyZGNAdW5peGJlYXJkLm5ldD4KCj1oZWFkMSBDT1BZUklHSFQKCkNvcHlyaWdodCAoQykgMjAwMyBSaWNoYXJkIENsYW1wLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9aGVhZDEgU0VFIEFMU08KCkw8Q2xhc3M6OkFjY2Vzc29yOjpGYXN0PiwgTDxDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ+Cgo9Y3V0Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOwp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgp1c2UgQ2xhc3M6OlJldHVyblZhbHVlOwp1c2UgVGV4dDo6dkZpbGU6OmFzRGF0YTsKCm91ciAkVkVSU0lPTiA9ICcwLjIyJzsKCnVzZSBDYXJwOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWwgLSBHZW5lcmF0ZXMgaUNhbGVuZGFyIChSRkMgMjQ0NSkgY2FsZW5kYXIgZmlsZXMKCj1oZWFkMSBTWU5PUFNJUwoKICAgIHVzZSBEYXRhOjpJQ2FsOwoKICAgIG15ICRjYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldygpOwoKICAgIG15ICR2dG9kbyA9IERhdGE6OklDYWw6OkVudHJ5OjpUb2RvLT5uZXcoKTsKICAgICR2dG9kby0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgIyAuLi4gc2VlIERhdGE6OklDYWw6OkVudHJ5OjpUb2RvIGRvY3VtZW50YXRpb24KICAgICk7CgogICAgIyAuLi4gb3IKICAgICRjYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldyhmaWxlbmFtZSA9PiAnZm9vLmljcycpOyAjIHBhcnNlIGV4aXN0aW5nIGZpbGUKICAgICRjYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldyhkYXRhID0+ICdCRUdJTjpWQ0FMRU5EQVIuLi4nKTsgIyBwYXJzZSBmcm9tIHNjYWxhcgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZ0b2RvKTsKICAgIHByaW50ICRjYWxlbmRhci0+YXNfc3RyaW5nOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbD4gb2JqZWN0IHJlcHJlc2VudHMgYSBDPFZDQUxFTkRBUj4gb2JqZWN0IGFzIGRlZmluZWQgaW4gdGhlCmlDYWxlbmRhciBwcm90b2NvbCAoUkZDIDI0NDUsIE1JTUUgdHlwZSAidGV4dC9jYWxlbmRhciIpLCBhcyBpbXBsZW1lbnRlZCBpbiBtYW55CnBvcHVsYXIgY2FsZW5kYXJpbmcgcHJvZ3JhbXMgc3VjaCBhcyBBcHBsZSdzIGlDYWwuCgpFYWNoIEw8RGF0YTo6SUNhbD4gb2JqZWN0IGlzIGEgY29sbGVjdGlvbiBvZiAiZW50cmllcyIsIHdoaWNoIGFyZSBvYmplY3RzIG9mIGEKc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeT4uICBUaGUgdHlwZXMgb2YgZW50cmllcyBkZWZpbmVkIGJ5IGlDYWxlbmRhcgood2hpY2ggcmVmZXJzIHRvIHRoZW0gYXMgImNvbXBvbmVudHMiKSBpbmNsdWRlIGV2ZW50cywgdG8tZG8gaXRlbXMsIGpvdXJuYWwKZW50cmllcywgZnJlZS9idXN5IHRpbWUgaW5kaWNhdG9ycywgYW5kIHRpbWUgem9uZSBkZXNjcmlwdG9yczsgaW4gYWRkaXRpb24sCmV2ZW50cyBhbmQgdG8tZG8gaXRlbXMgY2FuIGNvbnRhaW4gYWxhcm0gZW50cmllcy4gIChDdXJyZW50bHksIEw8RGF0YTo6SUNhbD4Kb25seSBpbXBsZW1lbnRzIHRvLWRvIGl0ZW1zIGFuZCBldmVudHMuKQoKTDxEYXRhOjpJQ2FsPiBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+OyBzZWUgaXRzIG1hbnBhZ2UgZm9yIG1vcmUKbWV0aG9kcyBhcHBsaWNhYmxlIHRvIEw8RGF0YTo6SUNhbD4uCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldyBbIGRhdGEgPT4gJGRhdGEsIF0gWyBmaWxlbmFtZSA9PiAkZmlsZSBdLCBbIGNhbG5hbWUgPT4gJHN0cmluZyBdLCBbIHZjYWwxMCA9PiAkYm9vbCBdLCBbIHJmY19zdHJpY3QgPT4gJGJvb2wgXSwgWyBhdXRvX3VpZCA9PiAkYm9vbCBdCgpDcmVhdGVzIGEgbmV3IEw8RGF0YTo6SUNhbD4gb2JqZWN0LgoKSWYgaXQgaXMgZ2l2ZW4gYSBmaWxlbmFtZSBvciBkYXRhIGFyZ3VtZW50IGlzIHBhc3NlZCwgdGhlbiB0aGlzIHBhcnNlcyB0aGUKY29udGVudCBvZiB0aGUgZmlsZSBvciBzdHJpbmcgaW50byB0aGUgb2JqZWN0LiAgSWYgdGhlIEM8dmNhbDEwPiBmbGFnIGlzIHBhc3NlZCwKcGFyc2VzIGl0IGFjY29yZGluZyB0byB2Q2FsZW5kYXIgMS4wLCBub3QgaUNhbGVuZGFyIDIuMDsgdGhpcyBpbiBwYXJ0aWN1bGFyIGltcGFjdHMKdGhlIHBhcnNpbmcgb2YgY29udGludWF0aW9uIGxpbmVzIGluIHF1b3RlZC1wcmludGFibGUgc2VjdGlvbnMuCgpJZiBhIGNhbG5hbWUgaXMgcGFzc2VkLCBzZXRzIHgtd3ItY2FsbmFtZSB0byB0aGUgZ2l2ZW4gc3RyaW5nLiAgQWx0aG91Z2gKbm90IHNwZWNpZmllZCBpbiBSRkMyNDQ1LCBtb3N0IGNhbGVuZGFyIHNvZnR3YXJlIHJlc3BlY3RzIHgtd3ItY2FsbmFtZQphcyB0aGUgZGlzcGxheWVkIG5hbWUgb2YgdGhlIGNhbGVuZGFyLgoKSWYgdGhlIEM8cmZjX3N0cmljdD4gZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgd2lsbCByZXF1aXJlIERhdGE6OklDYWwgdG8KaW5jbHVkZSBVSURzLCBhcyBwZXIgUkZDMjQ0NToKCiAgICA0LjguNC43IFVuaXF1ZSBJZGVudGlmaWVyCiAgICAuLi4gVGhlIHByb3BlcnR5IE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSAiVkVWRU5UIiwgIlZUT0RPIiwKICAgICJWSk9VUk5BTCIgb3IgIlZGUkVFQlVTWSIgY2FsZW5kYXIgY29tcG9uZW50cyIKCklmIHRoZSBDPGF1dG9fdWlkPiBmbGFnIGlzIHNldCB0byB0cnVlLCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYQpkZWZhdWx0IFVJRCBmb3IgZWFjaCB0eXBlIHdoaWNoIHJlcXVpcmVzIGl0LCBiYXNlZCBvbiB0aGUgUkZDLXN1Z2dlc3RlZAphbGdvcml0aG0uICBFeHBsaWNpdGx5LXNldCBVSUQgYXR0cmlidXRlcyB3aWxsIG92ZXJyaWRlIHRoaXMKYXV0by1nZW5lcmF0ZWQgdmFsdWUuCgpJZiBhIGZpbGVuYW1lIG9yIGRhdGEgYXJndW1lbnQgaXMgbm90IHBhc3NlZCwgdGhpcyBqdXN0IHNldHMgdGhlCm9iamVjdCdzIEM8VkVSU0lPTj4gYW5kIEM8UFJPRElEPiBwcm9wZXJ0aWVzIHRvICIyLjAiIChvciAiMS4wIiBpZiB0aGUKQzx2Y2FsMTA+IGZsYWcgaXMgcGFzc2VkKSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBDPHByb2R1Y3RfaWQ+IG1ldGhvZApyZXNwZWN0aXZlbHkuCgpSZXR1cm5zIGEgZmFsc2UgdmFsdWUgdXBvbiBmYWlsdXJlIHRvIG9wZW4gb3IgcGFyc2UgdGhlIGZpbGUgb3IgZGF0YTsgdGhpcyBmYWxzZQp2YWx1ZSBpcyBhIEw8Q2xhc3M6OlJldHVyblZhbHVlPiBvYmplY3QgYW5kIGNhbiBiZSBxdWVyaWVkIGFzIHRvIGl0cwpDPGVycm9yX21lc3NhZ2U+LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CgogICAgbXkgJWFyZ3MgPSAoCiAgICAgICAgZmlsZW5hbWUgICA9PiB1bmRlZiwKICAgICAgICBjYWxuYW1lICAgID0+IHVuZGVmLAogICAgICAgIGRhdGEgICAgICAgPT4gdW5kZWYsCiAgICAgICAgdmNhbDEwICAgICA9PiAwLAogICAgICAgIHJmY19zdHJpY3QgPT4gMCwKICAgICAgICBhdXRvX3VpZCAgID0+IDAsCiAgICAgICAgQF8KICAgICk7CgogICAgJHNlbGYtPnZjYWwxMCggJGFyZ3N7dmNhbDEwfSApOwogICAgJHNlbGYtPnJmY19zdHJpY3QoICRhcmdze3JmY19zdHJpY3R9ICk7CiAgICAkc2VsZi0+YXV0b191aWQoICRhcmdze2F1dG9fdWlkfSApOwoKICAgIGlmICggZGVmaW5lZCAkYXJnc3tmaWxlbmFtZX0gb3IgZGVmaW5lZCAkYXJnc3tkYXRhfSApIHsKCiAgICAgICAgIyBtaWdodCByZXR1cm4gYSBDbGFzczo6UmV0dXJuVmFsdWUgaWYgcGFyc2luZyBmYWlscwogICAgICAgIHJldHVybiAkc2VsZi0+cGFyc2UoJWFyZ3MpOwogICAgfSBlbHNlIHsKICAgICAgICAkc2VsZi0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgICAgIHZlcnNpb24gPT4gKCAkc2VsZi0+dmNhbDEwID8gJzEuMCcgOiAnMi4wJyApLAogICAgICAgICAgICBwcm9kaWQgPT4gJHNlbGYtPnByb2R1Y3RfaWQsCiAgICAgICAgKTsKICAgICAgICAkc2VsZi0+YWRkX3Byb3BlcnR5KCd4LXdyLWNhbG5hbWUnID0+ICRhcmdze2NhbG5hbWV9KQogICAgICAgICAgICBpZiBkZWZpbmVkICRhcmdze2NhbG5hbWV9OwoKICAgICAgICByZXR1cm4gJHNlbGY7CiAgICB9Cn0KCj1oZWFkMiBwYXJzZSBbIGRhdGEgPT4gJGRhdGEsIF0gWyBmaWxlbmFtZSA9PiAkZmlsZSwgXQoKUGFyc2UgYSBDPC5pY3M+IGZpbGUgb3Igc3RyaW5nIGNvbnRhaW5pbmcgb25lLCBhbmQgcG9wdWxhdGUgQzwkc2VsZj4Kd2l0aCBpdHMgY29udGVudHMuCgpTaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBvbiBhIGdpdmVuIG9iamVjdCwgYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseQpjYWxsZWQgYnkgQzxuZXc+IGlmIHlvdSBwcm92aWRlIGFyZ3VtZW50cyB0byBDPG5ldz4uCgpSZXR1cm5zIEM8JHNlbGY+IG9uIHN1Y2Nlc3MuICBSZXR1cm5zIGEgZmFsc2UgdmFsdWUgdXBvbiBmYWlsdXJlIHRvCm9wZW4gb3IgcGFyc2UgdGhlIGZpbGUgb3IgZGF0YTsgdGhpcyBmYWxzZSB2YWx1ZSBpcyBhCkw8Q2xhc3M6OlJldHVyblZhbHVlPiBvYmplY3QgYW5kIGNhbiBiZSBxdWVyaWVkIGFzIHRvIGl0cwpDPGVycm9yX21lc3NhZ2U+LgoKPWN1dAoKc3ViIHBhcnNlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAlYXJncyA9ICgKICAgICAgICBmaWxlbmFtZSA9PiB1bmRlZiwKICAgICAgICBkYXRhICAgICA9PiB1bmRlZiwKICAgICAgICBAXwogICAgKTsKCiAgICB1bmxlc3MgKCBkZWZpbmVkICRhcmdze2ZpbGVuYW1lfSBvciBkZWZpbmVkICRhcmdze2RhdGF9ICkgewogICAgICAgIHJldHVybiAkc2VsZi0+X2Vycm9yKAogICAgICAgICAgICAicGFyc2UgY2FsbGVkIHdpdGggbm8gZmlsZW5hbWUgb3IgZGF0YSBzcGVjaWZpZWQiKTsKICAgIH0KCiAgICBteSBAbGluZXM7CgogICAgIyBvcGVuIHRoZSBmaWxlIChjaGVja2luZyBhcyB3ZSBnbywgbGlrZSBnb29kIGxpdHRsZSBQZXJsIG1vbmdlcnMpCiAgICBpZiAoIGRlZmluZWQgJGFyZ3N7ZmlsZW5hbWV9ICkgewogICAgICAgIG9wZW4gbXkgJGZoLCAnPCcsICRhcmdze2ZpbGVuYW1lfQogICAgICAgICAgICBvciByZXR1cm4gJHNlbGYtPl9lcnJvcigiY291bGQgbm90IG9wZW4gJyRhcmdze2ZpbGVuYW1lfSc6ICQhIik7CiAgICAgICAgQGxpbmVzID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmaD47CiAgICB9IGVsc2UgewogICAgICAgIEBsaW5lcyA9IHNwbGl0IC9ccj9cbi8sICRhcmdze2RhdGF9OwogICAgfQoKICAgIEBsaW5lcyA9ICRzZWxmLT5fdmNhbDEwX2lucHV0X2NsZWFudXAoQGxpbmVzKSBpZiAkc2VsZi0+dmNhbDEwOwoKICAgICMgUGFyc2UgdGhlIGxpbmVzOyBUZXh0Ojp2RmlsZSBkb2Vzbid0IHdhbnQgdHJhaWxpbmcgbmV3bGluZXMKICAgIG15ICRjYWwgPSBldmFsIHsgVGV4dDo6dkZpbGU6OmFzRGF0YS0+bmV3LT5wYXJzZV9saW5lcyhAbGluZXMpIH07CiAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigicGFyc2UgZmFpbHVyZTogJEAiKSBpZiAkQDsKCiAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigicGFyc2UgZmFpbHVyZSIpCiAgICAgICAgdW5sZXNzICRjYWwgYW5kIGV4aXN0cyAkY2FsLT57b2JqZWN0c307CgogICAgIyBsb29wIHRocm91Z2ggYWxsIHRoZSB2Y2FyZHMKICAgIGZvcmVhY2ggbXkgJG9iamVjdCAoIEB7ICRjYWwtPntvYmplY3RzfSB9ICkgewogICAgICAgICRzZWxmLT5wYXJzZV9vYmplY3QoJG9iamVjdCk7CiAgICB9CgogICAgbXkgJHZlcnNpb25fcmVmID0gJHNlbGYtPnByb3BlcnR5KCJ2ZXJzaW9uIik7CiAgICBteSAkdmVyc2lvbiA9ICR2ZXJzaW9uX3JlZiA/ICR2ZXJzaW9uX3JlZi0+WzBdLT52YWx1ZSA6IHVuZGVmOwogICAgdW5sZXNzICggZGVmaW5lZCAkdmVyc2lvbiApIHsKICAgICAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigiZGF0YSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBwcm9wZXJ0eSIpOwogICAgfQoKICAgIGlmICggICAkdmVyc2lvbiBlcSAnMS4wJyBhbmQgbm90ICRzZWxmLT52Y2FsMTAKICAgICAgICBvciAkdmVyc2lvbiBlcSAnMi4wJyBhbmQgJHNlbGYtPnZjYWwxMCApCiAgICB7CiAgICAgICAgcmV0dXJuICRzZWxmLT5fZXJyb3IoICdhcHBsaWNhdGlvbiBjbGFpbXMgZGF0YSBpcycKICAgICAgICAgICAgICAgIC4gKCAkc2VsZi0+dmNhbDEwID8gJycgOiAnIG5vdCcgKQogICAgICAgICAgICAgICAgLiAnIHZDYWwgMS4wIGJ1dCBkb2MgY29udGFpbnMgVkVSU0lPTjonCiAgICAgICAgICAgICAgICAuICR2ZXJzaW9uICk7CiAgICB9CgogICAgcmV0dXJuICRzZWxmOwp9CgpzdWIgX2Vycm9yIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnICA9IHNoaWZ0OwoKICAgIG15ICRyZXQgPSBDbGFzczo6UmV0dXJuVmFsdWUtPm5ldzsKICAgICRyZXQtPmFzX2Vycm9yKCBlcnJubyA9PiAxLCBtZXNzYWdlID0+ICRtc2cgKTsKICAgIHJldHVybiAkcmV0Owp9Cgo9aGVhZDIgaWNhbF9lbnRyeV90eXBlCgpSZXR1cm5zIEM8VkNBTEVOREFSPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZDQUxFTkRBUid9Cgo9aGVhZDIgcHJvZHVjdF9pZAoKUmV0dXJucyB0aGUgcHJvZHVjdCBJRCB1c2VkIGluIHRoZSBjYWxlbmRhcidzIEM8UFJPRElEPiBwcm9wZXJ0eTsgeW91IG1heQp3aXNoIHRvIG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyBmb3IgeW91ciBvd24gYXBwbGljYXRpb24uCgo9Y3V0CgpzdWIgcHJvZHVjdF9pZCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgcmV0dXJuICJEYXRhOjpJQ2FsICRWRVJTSU9OIjsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtdXN0IGJlIHNwZWNpZmllZApleGFjdGx5IG9uZSB0aW1lIGZvciBhIGNhbGVuZGFyOgoKICAgICAgcHJvZGlkIHZlcnNpb24KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgcHJvZGlkIHZlcnNpb24KICAgICk7Cn0KCj1oZWFkMiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUgc3BlY2lmaWVkCmF0IG1vc3Qgb25lIHRpbWUgZm9yIGEgY2FsZW5kYXI6CgogICAgICBjYWxzY2FsZSBtZXRob2QKCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7CiAgICBxdygKICAgICAgICBjYWxzY2FsZSBtZXRob2QKICAgICk7Cn0KCiMgSW4gcXVvdGVkLXByaW50YWJsZSBzZWN0aW9ucywgY29udmVydCBmcm9tIHZjYWwxMCAiPVxuIiBsaW5lIGVuZGluZ3MgdG8KIyBpY2FsMjAgIlxuICIuCnN1YiBfdmNhbDEwX2lucHV0X2NsZWFudXAgewogICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CiAgICBteSBAaW5fbGluZXMgPSBAXzsKCiAgICBteSBAb3V0X2xpbmVzOwoKICAgIG15ICRpbl9xcCA9IDA7CkxJTkU6IHdoaWxlIChAaW5fbGluZXMpIHsKICAgICAgICBteSAkbGluZSA9IHNoaWZ0IEBpbl9saW5lczsKCiAgICAgICAgaWYgKCBub3QgJGluX3FwIGFuZCAkbGluZSA9fiAvXlteOl0rO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEUvaSApIHsKICAgICAgICAgICAgJGluX3FwID0gMTsKICAgICAgICB9CgogICAgICAgIHVubGVzcyAoJGluX3FwKSB7CiAgICAgICAgICAgIHB1c2ggQG91dF9saW5lcywgJGxpbmU7CiAgICAgICAgICAgIG5leHQgTElORTsKICAgICAgICB9CgogICAgICAgIGlmICggJGxpbmUgPX4gcy89JC8vICkgewogICAgICAgICAgICBwdXNoIEBvdXRfbGluZXMsICRsaW5lOwogICAgICAgICAgICAkaW5fbGluZXNbMF0gPSAnICcgLiAkaW5fbGluZXNbMF0gaWYgQGluX2xpbmVzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHB1c2ggQG91dF9saW5lcywgJGxpbmU7CiAgICAgICAgICAgICRpbl9xcCA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAb3V0X2xpbmVzOwp9Cgo9aGVhZDEgREVQRU5ERU5DSUVTCgpMPERhdGE6OklDYWw+IHJlcXVpcmVzIEw8Q2xhc3M6OkFjY2Vzc29yPiwgTDxUZXh0Ojp2RmlsZTo6YXNEYXRhPiwKTDxNSU1FOjpRdW90ZWRQcmludD4sIGFuZCBMPENsYXNzOjpSZXR1cm5WYWx1ZT4uCgo9aGVhZDEgQlVHUyBBTkQgTElNSVRBVElPTlMKCkw8RGF0YTo6SUNhbD4gZG9lcyBub3Qgc3VwcG9ydCB0aW1lIHpvbmUgZGF5bGlnaHQgb3Igc3RhbmRhcmQgZW50cmllcywKc28gdGltZSB6b25lIGNvbXBvbmVudHMgYXJlIGJhc2ljYWxseSB1c2VsZXNzLgoKV2hpbGUgTDxEYXRhOjpJQ2FsPiB0cmllcyB0byBjaGVjayB3aGljaCBwcm9wZXJ0aWVzIGFyZSByZXF1aXJlZCBhbmQKcmVwZWF0YWJsZSwgdGhpcyBvbmx5IHdvcmtzIGluIHNpbXBsZSBjYXNlczsgaXQgZG9lcyBub3QgY2hlY2sgZm9yCnByb3BlcnRpZXMgdGhhdCBtdXN0IGVpdGhlciBib3RoIGV4aXN0IG9yIGJvdGggbm90IGV4aXN0LCBvciBmb3IKbXV0dWFsbHkgZXhjbHVzaXZlIHByb3BlcnRpZXMuCgpMPERhdGE6OklDYWw+IGRvZXMgbm90IGNoZWNrIHRvIHNlZSBpZiBwcm9wZXJ0eSBwYXJhbWV0ZXIgbmFtZXMgYXJlCmtub3duIGluIGdlbmVyYWwgb3IgYWxsb3dlZCBvbiB0aGUgcGFydGljdWxhciBwcm9wZXJ0eS4KCkw8RGF0YTo6SUNhbD4gZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIG5lc3RlZCBlbnRyaWVzIGFyZSBuZXN0ZWQKcHJvcGVybHkgKGFsYXJtcyBpbiB0b2RvcyBhbmQgZXZlbnRzIG9ubHksIGV2ZXJ5dGhpbmcgZWxzZSBpbgpjYWxlbmRhcnMgb25seSkuCgpUaGUgb25seSBwcm9wZXJ0eSBlbmNvZGluZyBzdXBwb3J0ZWQgYnkgTDxEYXRhOjpJQ2FsPiBpcyBxdW90ZWQKcHJpbnRhYmxlLgoKUGxlYXNlIHJlcG9ydCBhbnkgYnVncyBvciBmZWF0dXJlIHJlcXVlc3RzIHRvCkM8YnVnLWRhdGEtaWNhbEBydC5jcGFuLm9yZz4sIG9yIHRocm91Z2ggdGhlIHdlYiBpbnRlcmZhY2UgYXQKTDxodHRwOi8vcnQuY3Bhbi5vcmc+LgoKCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpQcm9wZXJ0eTsKCnVzZSBiYXNlIHF3L0NsYXNzOjpBY2Nlc3Nvci87Cgp1c2UgQ2FycDsKdXNlIE1JTUU6OlF1b3RlZFByaW50ICgpOwoKb3VyICRWRVJTSU9OID0gJzAuMDYnOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OlByb3BlcnR5IC0gUmVwcmVzZW50cyBhIHByb3BlcnR5IG9uIGFuIGVudHJ5IGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpQcm9wZXJ0eT4gb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgcHJvcGVydHkgb24gYW4KZW50cnkgaW4gYW4gaUNhbGVuZGFyIGZpbGUuICBQcm9wZXJ0aWVzIGhhdmUgcGFyYW1ldGVycyBpbiBhZGRpdGlvbiB0bwp0aGVpciB2YWx1ZS4KCllvdSBzaG91bGRuJ3QgbmVlZCB0byBjcmVhdGUgTDxEYXRhOjpJQ2FsOjpQcm9wZXJ0eT4gdmFsdWVzIGRpcmVjdGx5Ci0tIGp1c3QgdXNlIEM8YWRkX3Byb3BlcnR5PiBpbiBMPERhdGE6OklDYWw6OkVudHJ5Pi4KClRoZSBDPGVuY29kaW5nPiBwYXJhbWV0ZXIgdmFsdWUgaXMgb25seSBpbnRlcnByZXRlZCBieSBMPERhdGE6OklDYWw+CmluIHRoZSBDPGRlY29kZWRfdmFsdWU+IGFuZCBDPGVuY29kZT4gbWV0aG9kczogYWxsIG90aGVyIG1ldGhvZHMKYWNjZXNzIHRoZSBlbmNvZGVkIHZlcnNpb24gZGlyZWN0bHkgKGlmIHRoZXJlIGlzIGFuIGVuY29kaW5nKS4KCkN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIGVuY29kaW5nIGlzIEM8UVVPVEVELVBSSU5UQUJMRT4uCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldyAka2V5LCAkdmFsdWUsIFskcGFyYW1ldGVyX2hhc2hdCgpDcmVhdGVzIGEgbmV3IEw8RGF0YTo6SUNhbDo6UHJvcGVydHk+IHdpdGgga2V5IEM8JGtleT4gYW5kIHZhbHVlIEM8JHZhbHVlPi4KCklmIEM8JHBhcmFtZXRlcl9oYXNoPiBpcyBwcm92aWRlZCwgc2V0cyB0aGUgcHJvcGVydHkncyBwYXJhbWV0ZXJzIHRvCml0LiAgVGhlIHBhcmFtZXRlciBoYXNoIHNob3VsZCBoYXZlIGtleXMgZXF1YWwgdG8gdGhlIG5hbWVzIG9mIHRoZQpwYXJhbWV0ZXJzIChjYXNlIGluc2Vuc2l0aXZlOyBwYXJhbWV0ZXIgaGFzaGVzIHNob3VsZCBub3QgY29udGFpbiB0d28KZGlmZmVyZW50IGtleXMgd2hpY2ggYXJlIHRoZSBzYW1lIHdoZW4gY29udmVydGVkIHRvIHVwcGVyIGNhc2UpOyB0aGUKdmFsdWVzIHNob3VsZCBlaXRoZXIgYmUgYSBzdHJpbmcgaWYgdGhlIHBhcmFtZXRlciBoYXMgYSBzaW5nbGUgdmFsdWUKb3IgYW4gYXJyYXkgcmVmZXJlbmNlIG9mIHN0cmluZ3MgaWYgdGhlIHBhcmFtZXRlciBoYXMgbXVsdGlwbGUgdmFsdWVzLgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9IHt9OwoKICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CgogICAgJHNlbGYtPmtleShzaGlmdCk7CiAgICAkc2VsZi0+dmFsdWUoc2hpZnQpOwogICAgJHNlbGYtPnBhcmFtZXRlcnMoIHNoaWZ0IHx8IHt9ICk7CiAgICByZXR1cm4gKCRzZWxmKTsKfQoKPWhlYWQyIGtleSBbJGtleV0KCkdldHMgb3Igc2V0cyB0aGUga2V5IG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS4KCj1oZWFkMiB2YWx1ZSBbJHZhbHVlXQoKR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgoKPWhlYWQyIHBhcmFtZXRlcnMgWyRwYXJhbV9oYXNoXQoKR2V0cyBvciBzZXRzIHRoZSBwYXJhbWV0ZXIgaGFzaCByZWZlcmVuY2Ugb2YgdGhpcyBwcm9wZXJ0eS4gIFBhcmFtZXRlcgprZXlzIGFyZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZS4KCj1oZWFkMiB2Y2FsMTAgWyRib29sXQoKR2V0cyBvciBzZXRzIGEgYm9vbGVhbiBzYXlpbmcgd2hldGhlciB0aGlzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcwp2Q2FsZW5kYXIgMS4wIChhcyBvcHBvc2VkIHRvIGlDYWxlbmRhciAyLjApLiAgR2VuZXJhbGx5LCB5b3UgY2FuIGp1c3QKc2V0IHRoaXMgb24geW91ciBtYWluIEw8RGF0YTo6SUNhbD4gb2JqZWN0IHdoZW4geW91IGNvbnN0cnVjdCBpdDsKQzxhZGRfZW50cnk+IGF1dG9tYXRpY2FsbHkgbWFrZXMgc3VyZSB0aGF0IHN1Yi1lbnRyaWVzIGVuZCB1cCB3aXRoIHRoZQpzYW1lIHZhbHVlIGFzIHRoZWlyIHBhcmVudHMsIGFuZCBDPGFkZF9wcm9wZXJ0eT4gbWFrZXMgc3VyZSB0aGF0CnByb3BlcnRpZXMgZW5kIHVwIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgdGhlaXIgZW50cnkuCgo9Y3V0CgpfX1BBQ0tBR0VfXy0+bWtfYWNjZXNzb3JzKHF3KGtleSB2YWx1ZSBfcGFyYW1ldGVycyB2Y2FsMTApKTsKCnN1YiBwYXJhbWV0ZXJzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgaWYgKEBfKSB7CiAgICAgICAgbXkgJHBhcmFtcyAgICAgPSBzaGlmdDsKICAgICAgICBteSAkbmV3X3BhcmFtcyA9IHt9OwogICAgICAgIHdoaWxlICggbXkgKCAkaywgJHYgKSA9IGVhY2ggJSRwYXJhbXMgKSB7CiAgICAgICAgICAgICRuZXdfcGFyYW1zLT57IHVjICRrIH0gPSAkdjsKICAgICAgICB9CiAgICAgICAgJHNlbGYtPl9wYXJhbWV0ZXJzKCRuZXdfcGFyYW1zKTsKICAgIH0KCiAgICByZXR1cm4gJHNlbGYtPl9wYXJhbWV0ZXJzOwp9CgpteSAlRU5DT0RJTkdTID0gKAogICAgJ1FVT1RFRC1QUklOVEFCTEUnID0+IHsKICAgICAgICBlbmNvZGUgPT4gc3ViIHsKICAgICAgICAgICAgbXkgJGRlYyA9IHNoaWZ0IHx8ICcnOwogICAgICAgICAgICAkZGVjID1+IHMvXG4vXHJcbi9nOwogICAgICAgICAgICByZXR1cm4gTUlNRTo6UXVvdGVkUHJpbnQ6OmVuY29kZSggJGRlYywgJycgKTsKICAgICAgICB9LAogICAgICAgIGRlY29kZSA9PiBzdWIgewogICAgICAgICAgICBteSAkZGVjID0gTUlNRTo6UXVvdGVkUHJpbnQ6OmRlY29kZSggc2hpZnQgfHwgJycgKTsKICAgICAgICAgICAgJGRlYyA9fiBzL1xyXG4vXG4vZzsKICAgICAgICAgICAgcmV0dXJuICRkZWM7CiAgICAgICAgICAgIH0KICAgIH0sCik7Cgo9aGVhZDIgZGVjb2RlZF92YWx1ZQoKR2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSwgY29udmVydGVkIGZyb20gdGhlIGVuY29kaW5nIHNwZWNpZmllZAppbiBpdHMgZW5jb2RpbmcgcGFyYW1ldGVyLiAgKFRoYXQgaXMsIEM8dmFsdWU+IHdpbGwgcmV0dXJuIHRoZSBlbmNvZGVkCnZlcnNpb247IHRoaXMgd2lsbCBhcHBseSB0aGUgZW5jb2RpbmcuKSAgSWYgdGhlIGVuY29kaW5nIGlzIG5vdApzcGVjaWZpZWQgb3IgcmVjb2duaXplZCwganVzdCByZXR1cm5zIHRoZSByYXcgdmFsdWUuCgo9Y3V0CgpzdWIgZGVjb2RlZF92YWx1ZSB7CiAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKICAgIG15ICR2YWx1ZSAgICA9ICRzZWxmLT52YWx1ZTsKICAgIG15ICRlbmNvZGluZyA9IHVjKCAkc2VsZi0+cGFyYW1ldGVycy0+eydFTkNPRElORyd9IHx8ICIiICk7CgogICAgaWYgKCAkRU5DT0RJTkdTeyRlbmNvZGluZ30gKSB7CiAgICAgICAgcmV0dXJuICRFTkNPRElOR1N7JGVuY29kaW5nfXsnZGVjb2RlJ30tPigkdmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQp9Cgo9aGVhZDIgZW5jb2RlICRlbmNvZGluZwoKQ2FsbHMgQzxkZWNvZGVkX3ZhbHVlPiB0byBnZXQgdGhlIGN1cnJlbnQgZGVjb2RlZCB2YWx1ZSwgdGhlbiBlbmNvZGVzCml0IGluIEM8JGVuY29kaW5nPiwgc2V0cyB0aGUgdmFsdWUgdG8gdGhhdCwgYW5kIHNldHMgdGhlIGVuY29kaW5nCnBhcmFtZXRlciB0byBDPCRlbmNvZGluZz4uIChDPCRlbmNvZGluZz4gaXMgZmlyc3QgY29udmVydGVkIHRvIHVwcGVyCmNhc2UuKQoKSWYgQzwkZW5jb2Rpbmc+IGlzIHVuZGVmLCBkZWxldGVzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXIgYW5kIHNldHMgdGhlCnZhbHVlIHRvIHRoZSBkZWNvZGVkIHZhbHVlLiAgRG9lcyBub3RoaW5nIGlmIHRoZSBlbmNvZGluZyBpcyBub3QKcmVjb2duaXplZC4KCj1jdXQKCnN1YiBlbmNvZGUgewogICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CiAgICBteSAkZW5jb2RpbmcgPSB1YyBzaGlmdDsKCiAgICBteSAkZGVjb2RlZF92YWx1ZSA9ICRzZWxmLT5kZWNvZGVkX3ZhbHVlOwoKICAgIGlmICggbm90IGRlZmluZWQgJGVuY29kaW5nICkgewogICAgICAgICRzZWxmLT52YWx1ZSgkZGVjb2RlZF92YWx1ZSk7CiAgICAgICAgZGVsZXRlICRzZWxmLT5wYXJhbWV0ZXJzLT57J0VOQ09ESU5HJ307CiAgICB9IGVsc2lmICggJEVOQ09ESU5HU3skZW5jb2Rpbmd9ICkgewogICAgICAgICRzZWxmLT52YWx1ZSggJEVOQ09ESU5HU3skZW5jb2Rpbmd9eydlbmNvZGUnfS0+KCRkZWNvZGVkX3ZhbHVlKSApOwogICAgICAgICRzZWxmLT5wYXJhbWV0ZXJzLT57J0VOQ09ESU5HJ30gPSAkZW5jb2Rpbmc7CiAgICB9CiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBhc19zdHJpbmcgQVJHUwoKUmV0dXJucyB0aGUgcHJvcGVydHkgZm9ybWF0dGVkIGFzIGEgc3RyaW5nIChpbmNsdWRpbmcgdHJhaWxpbmcKbmV3bGluZSkuCgpUYWtlcyBuYW1lZCBhcmd1bWVudHM6Cgo9b3ZlcgoKPWl0ZW0gZm9sZAoKRGVmYXVsdHMgdG8gdHJ1ZS4gcGFzcyBpbiBhIGZhbHNlIHZhbHVlIGlmIHlvdSBuZWVkIHRvIGdlbmVyYXRlCm5vbi1yZmMtY29tcGxpYW50IGNhbGVuZGFycy4KCj1pdGVtIGNybGYKCkRlZmF1bHRzIHRvIEM8XHgwZFx4MGE+LCBwZXIgUkZDIDI0NDUgc3BlYy4gIFRoaXMgb3B0aW9uIGlzIHByaW1hcmlseQpmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlIHByaW9yIHRvIDAuMTYsCndoaWNoIHVzZWQgQzxceDBhPi4KCj1iYWNrCgo9Y3V0CgpzdWIgYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAlYXJncyA9ICgKICAgICAgICBmb2xkID0+IDEsCiAgICAgICAgY3JsZiA9PiBEYXRhOjpJQ2FsOjpFbnRyeS0+Q1JMRiwKICAgICAgICBAXwogICAgKTsKICAgIG15ICRzdHJpbmcKICAgICAgICA9IHVjKCAkc2VsZi0+a2V5ICkKICAgICAgICAuICRzZWxmLT5fcGFyYW1ldGVyc19hc19zdHJpbmcgLiAiOiIKICAgICAgICAuICRzZWxmLT5fdmFsdWVfYXNfc3RyaW5nKCAkc2VsZi0+a2V5ICkKICAgICAgICAuICRhcmdze2NybGZ9OwoKICAjIEFzc3VtcHRpb246IHRoZSBvbmx5IHBsYWNlIGluIGFuIGlDYWxlbmRhciB0aGF0IG5lZWRzIGZvbGRpbmcgYXJlIHByb3BlcnR5CiAgIyBsaW5lcwogICAgaWYgKCAkYXJnc3snZm9sZCd9ICkgewogICAgICAgIHJldHVybiAkc2VsZi0+X2ZvbGQoICRzdHJpbmcsICRhcmdze2NybGZ9ICk7CiAgICB9CgogICAgcmV0dXJuICRzdHJpbmc7Cn0KCj1iZWdpbiBwcml2YXRlCgo9aGVhZDIgX3ZhbHVlX2FzX3N0cmluZwoKUmV0dXJucyB0aGUgcHJvcGVydHkncyB2YWx1ZSBhcyBhIHN0cmluZy4gIENvbW1hIGFuZCBzZW1pY29sb24gYXJlIG5vdAplc2NhcGVkIHdoZW4gdGhlIHZhbHVlIGlzIHJlY3VyIHR5cGUgKHRoZSBrZXkgaXMgcnJ1bGUpLgoKVmFsdWVzIGFyZSBxdW90ZWQgYWNjb3JkaW5nIHRoZSBpQ2FsIHNwZWMsIHVubGVzcyB0aGlzIGlzIGluIHZDYWwgMS4wCm1vZGUuCgo9ZW5kIHByaXZhdGUKCj1jdXQKCnN1YiBfdmFsdWVfYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGtleSAgID0gc2hpZnQ7CiAgICBteSAkdmFsdWUgPSBkZWZpbmVkKCAkc2VsZi0+dmFsdWUoKSApID8gJHNlbGYtPnZhbHVlKCkgOiAnJzsKCiAgICB1bmxlc3MgKCAkc2VsZi0+dmNhbDEwICkgewogICAgICAgICR2YWx1ZSA9fiBzL1xcL1xcXFwvZ3M7CiAgICAgICAgJHZhbHVlID1+IHMvOy9cXDsvZ3MgdW5sZXNzIGxjKCRrZXkpIGVxICdycnVsZSc7CiAgICAgICAgJHZhbHVlID1+IHMvLC9cXCwvZ3MgdW5sZXNzIGxjKCRrZXkpIGVxICdycnVsZSc7CiAgICAgICAgJHZhbHVlID1+IHMvXHgwZD9ceDBhL1xcbi9nczsKICAgIH0KCiAgICByZXR1cm4gJHZhbHVlOwp9Cgo9YmVnaW4gcHJpdmF0ZQoKPWhlYWQyIF9wYXJhbWV0ZXJzX2FzX3N0cmluZwoKUmV0dXJucyB0aGUgcHJvcGVydHkncyBwYXJhbWV0ZXJzIGFzIGEgc3RyaW5nLiAgUHJvcGVydGllcyBhcmUgc29ydGVkIGFscGhhYmV0aWNhbGx5CnRvIGFpZCB0ZXN0aW5nLgoKPWVuZCBwcml2YXRlCgo9Y3V0CgpzdWIgX3BhcmFtZXRlcnNfYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkb3V0ICA9ICcnOwogICAgZm9yIG15ICRuYW1lICggc29ydCBrZXlzICV7ICRzZWxmLT5wYXJhbWV0ZXJzIH0gKSB7CiAgICAgICAgbXkgJHZhbHVlID0gJHNlbGYtPnBhcmFtZXRlcnMtPnskbmFtZX07CiAgICAgICAgJG91dAogICAgICAgICAgICAuPSAnOycKICAgICAgICAgICAgLiAkbmFtZSAuICc9JwogICAgICAgICAgICAuICRzZWxmLT5fcXVvdGVkX3BhcmFtZXRlcl92YWx1ZXMoCiAgICAgICAgICAgIHJlZiAkdmFsdWUgPyBAJHZhbHVlIDogJHZhbHVlICk7CiAgICB9CiAgICByZXR1cm4gJG91dDsKfQoKPWJlZ2luIHByaXZhdGUKCj1oZWFkMiBfcXVvdGVkX3BhcmFtZXRlcl92YWx1ZXMgQHZhbHVlcwoKUXVvdGVzIGFueSBvZiB0aGUgdmFsdWVzIGluIEM8QHZhbHVlcz4gdGhhdCBuZWVkIHRvIGJlIHF1b3RlZCBhbmQKcmV0dXJucyB0aGUgcXVvdGVkIHZhbHVlcyBqb2luZWQgYnkgY29tbWFzLgoKSWYgYW55IG9mIHRoZSB2YWx1ZXMgY29udGFpbnMgYSBkb3VibGUtcXVvdGUsIGVyYXNlcyBpdCBhbmQgZW1pdHMgYQp3YXJuaW5nLgoKPWVuZCBwcml2YXRlCgo9Y3V0CgpzdWIgX3F1b3RlZF9wYXJhbWV0ZXJfdmFsdWVzIHsKICAgIG15ICRzZWxmICAgPSBzaGlmdDsKICAgIG15IEB2YWx1ZXMgPSBAXzsKCiAgICBmb3IgbXkgJHZhbCAoQHZhbHVlcykgewogICAgICAgIGlmICggJHZhbCA9fiAvIi8gKSB7CgogICAgICAgICAgICAjIEdldCBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSB1c2VyJ3MgY29kZQogICAgICAgICAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gJENhcnA6OkNhcnBMZXZlbCArIDE7CiAgICAgICAgICAgIGNhcnAgIkludmFsaWQgcGFyYW1ldGVyIHZhbHVlIChjb250YWlucyBkb3VibGUgcXVvdGUpOiAkdmFsIjsKICAgICAgICAgICAgJHZhbCA9fiB0ci8iLy9kOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gam9pbiAnLCcsIG1hcCB7IC9bOyw6XS8gPyBxcSgiJF8iKSA6ICRfIH0gQHZhbHVlczsKfQoKPWJlZ2luIHByaXZhdGUKCj1oZWFkMiBfZm9sZCAkc3RyaW5nICRjcmxmCgpSZXR1cm5zIEM8JHN0cmluZz4gZm9sZGVkIHdpdGggbmV3bGluZXMgYW5kIGxlYWRpbmcgd2hpdGVzcGFjZSBzbyB0aGF0CmVhY2ggbGluZSBpcyBhdCBtb3N0IDc1IGNoYXJhY3RlcnMuCgooTm90ZSB0aGF0IGl0IGZvbGRzIGF0IDc1IGNoYXJhY3RlcnMsIG5vdCA3NSBieXRlcyBhcyBzcGVjaWZpZWQgaW4gdGhlCnN0YW5kYXJkLikKCklmIHRoaXMgaXMgdkNhbGVuZGFyIDEuMCBhbmQgZW5jb2RlZCB3aXRoIFFVT1RFRC1QUklOVEFCTEUsIGRvZXMgbm90CmZvbGQgYXQgYWxsLgoKPWVuZCBwcml2YXRlCgo9Y3V0CgpzdWIgX2ZvbGQgewogICAgbXkgJHNlbGYgICA9IHNoaWZ0OwogICAgbXkgJHN0cmluZyA9IHNoaWZ0OwogICAgbXkgJGNybGYgICA9IHNoaWZ0OwoKICAgIG15ICRxdW90ZWRfcHJpbnRhYmxlID0gJHNlbGYtPnZjYWwxMAogICAgICAgICYmIHVjKCAkc2VsZi0+cGFyYW1ldGVycy0+eydFTkNPRElORyd9IHx8ICcnICkgZXEgJ1FVT1RFRC1QUklOVEFCTEUnOwoKICAgIGlmICgkcXVvdGVkX3ByaW50YWJsZSkgewoKICAgICAjIEluIG9sZCB2Y2FsLCBxdW90ZWQtcHJpbnRhYmxlIHByb3BlcnRpZXMgaGF2ZSBkaWZmZXJlbnQgZm9sZGluZyBydWxlcy4KICAgICAjIEJ1dCBzb21lIGludGVyb3AgdGVzdHMgc3VnZ2VzdCBpdCdzIHdpc2VyIGp1c3QgdG8gbm90IGZvbGQgZm9yIHZjYWwgMS4wCiAgICAgIyBhdCBhbGwgKGluIHF1b3RlZC1wcmludGFibGUpLgogICAgfSBlbHNlIHsKICAgICAgICBteSAkcG9zID0gMDsKCiAgICAgICAgIyBXYWxrIHRocm91Z2ggdGhlIHZhbHVlLCBsb29raW5nIHRvIHJlcGxhY2UgNzUgY2hhcmFjdGVycyBhdAogICAgICAgICMgYSB0aW1lLiAgV2UgYXNzaWduIHRvIHBvcygpIHRvIHVwZGF0ZSB3aGVyZSB0byBwaWNrIHVwIGZvcgogICAgICAgICMgdGhlIG5leHQgbWF0Y2guCiAgICAgICAgd2hpbGUgKCAkc3RyaW5nID1+IHMvXEcoLns3NX0pKD89LikvJDEkY3JsZiAvICkgewogICAgICAgICAgICAkcG9zICs9IDc1ICsgbGVuZ3RoKCRjcmxmKTsKICAgICAgICAgICAgcG9zKCRzdHJpbmcpID0gJHBvczsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRzdHJpbmc7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsKCg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTsKdXNlIGJhc2UgcXcvQ2xhc3M6OkFjY2Vzc29yLzsKdXNlIERhdGE6OklDYWw6OlByb3BlcnR5Owp1c2UgU3lzOjpIb3N0bmFtZSBxdygpOyAgICAgICAgICMgRm9yIHVuaXF1ZSBVSURzIGZvciBlbnRyaWVzCnVzZSBDYXJwOwoKdXNlIGNvbnN0YW50IENSTEYgPT4gIlx4MGRceDBhIjsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeSAtIFJlcHJlc2VudHMgYW4gZW50cnkgaW4gYW4gaUNhbGVuZGFyIGZpbGUKCj1oZWFkMSBTWU5PUFNJUwoKICAgIG15ICR2dG9kbyA9IERhdGE6OklDYWw6OkVudHJ5OjpUb2RvLT5uZXcoKTsKICAgICR2dG9kby0+YWRkX3Byb3BlcnR5KAogICAgIyAuLi4gc2VlIERhdGE6OklDYWw6OkVudHJ5OjpUb2RvIGRvY3VtZW50YXRpb24KICAgICk7CiAgICAkdnRvZG8tPmFkZF9wcm9wZXJ0aWVzKCAuLi4gKTsKCiAgICAkY2FsZW5kYXItPmFkZF9lbnRyeSgkdnRvZG8pOwoKICAgICRldmVudC0+YWRkX2VudHJ5KCRhbGFybSk7CiAgICAkZXZlbnQtPmFkZF9lbnRyaWVzKCRhbGFybTEsIC4uLik7CgogICAgIyBvciBhbGwgaW4gb25lIGdvCiAgICBteSAkdnRvZG8gPSBEYXRhOjpJQ2FsOjpFbnRyeTo6VG9kby0+bmV3KCBcJXByb3BzLCBcQGVudHJpZXMgKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5PiBvYmplY3QgcmVwcmVzZW50cyBhIHNpbmdsZSBlbnRyeSBpbiBhbgppQ2FsZW5kYXIgZmlsZS4gIChOb3RlIHRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzIHRvIGVudHJpZXMgYXMKImNvbXBvbmVudHMiLikgIGlDYWxlbmRhciBkZWZpbmVzIHNldmVyYWwgdHlwZXMgb2YgZW50cmllcywgc3VjaCBhcwpldmVudHMgYW5kIHRvLWRvIGxpc3RzOyBlYWNoIG9mIHRoZXNlIGNvcnJlc3BvbmRzIHRvIGEgc3ViY2xhc3Mgb2YKTDxEYXRhOjpJQ2FsOjpFbnRyeT4gKHRob3VnaCBvbmx5IHRvLWRvIGxpc3RzIGFuZCBldmVudHMgYXJlIGN1cnJlbnRseQppbXBsZW1lbnRlZCkuICBMPERhdGE6OklDYWw6OkVudHJ5PiBzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBhYnN0cmFjdApiYXNlIGNsYXNzIC0tIGFsbCBvYmplY3RzIGNyZWF0ZWQgc2hvdWxkIGJlIG9mIGl0cyBzdWJjbGFzc2VzLiAgVGhlCmVudGlyZSBjYWxlbmRhciBpdHNlbGYgKHRoZSBMPERhdGE6OklDYWw+IG9iamVjdCkgaXMgYWxzbyByZXByZXNlbnRlZAphcyBhIEw8RGF0YTo6SUNhbDo6RW50cnk+IG9iamVjdC4KCkVhY2ggZW50cnkgaGFzIGFuIGVudHJ5IHR5cGUgKHN1Y2ggYXMgQzxWQ0FMRU5EQVI+IG9yIEM8VkVWRU5UPiksIGEKc2VyaWVzIG9mICJwcm9wZXJ0aWVzIiwgYW5kIHBvc3NpYmx5IHNvbWUgc3ViLWVudHJpZXMuICAoT25seSB0aGUgcm9vdApMPERhdGE6OklDYWw+IG9iamVjdCBjYW4gaGF2ZSBzdWItZW50cmllcywgZXhjZXB0IGZvciBhbGFybSBlbnRyaWVzCmNvbnRhaW5lZCBpbiBldmVudHMgYW5kIHRvLWRvcyAobm90IHlldCBpbXBsZW1lbnRlZCkuKQoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgZW50cnkgb2JqZWN0IHdpdGggbm8gcHJvcGVydGllcyBvciBzdWItZW50cmllcy4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAkc2VsZiAgPSAkY2xhc3MtPlNVUEVSOjpuZXcoKTsKICAgICMgQUxMT1cgcGFzc2luZyBhcmd1bWVudHMgaGVyZSEKICAgICRzZWxmLT5zZXQoIHByb3BlcnRpZXMgPT4ge30gKTsKICAgICRzZWxmLT5zZXQoIGVudHJpZXMgICAgPT4gW10gKTsKICAgIGZvciAoQF8pIHsKICAgICAgICByZWYgJF8gZXEgIkhBU0giICBhbmQgJHNlbGYtPmFkZF9wcm9wZXJ0aWVzKCAlJF8gKTsKICAgICAgICByZWYgJF8gZXEgIkFSUkFZIiBhbmQgJHNlbGYtPmFkZF9lbnRyaWVzKCBAJF8gKTsKICAgIH0KICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIGFzX3N0cmluZyBbIGNybGYgPT4gQzxDUkxGPiBdCgpSZXR1cm5zIHRoZSBlbnRyeSBhcyBhbiBhcHByb3ByaWF0ZWx5IGZvcm1hdHRlZCBzdHJpbmcgKHdpdGggdHJhaWxpbmcKbmV3bGluZSkuCgpQcm9wZXJ0aWVzIGFyZSByZXR1cm5lZCBpbiBhbHBoYWJldGljYWwgb3JkZXIsIHdpdGggbXVsdGlwbGUKcHJvcGVydGllcyBvZiB0aGUgc2FtZSBuYW1lIHJldHVybmVkIGluIHRoZSBvcmRlciBhZGRlZC4gIChQcm9wZXJ0eQpvcmRlciBpcyB1bmltcG9ydGFudCBpbiBpQ2FsZW5kYXIsIGFuZCB0aGlzIG1ha2VzIHRlc3RpbmcgZWFzaWVyLikKCklmIGFueSBtYW5kYXRvcnkgcHJvcGVydHkgaXMgbWlzc2luZywgaXNzdWVzIGEgd2FybmluZy4KClRoZSBzdHJpbmcgdG8gdXNlIGFzIGEgbmV3bGluZSBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgYnkgZ2l2aW5nCnRoZSBhIEM8Y3JsZj4gYXJndW1lbnQsIHdoaWNoIGRlZmF1bHRzIHRvIEM8XHgwZFx4MGE+LCBwZXIgUkZDIDI0NDUKc3BlYzsgdGhpcyBvcHRpb24gaXMgcHJpbWFyaWx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCnZlcnNpb25zIG9mIHRoaXMgbW9kdWxlIGJlZm9yZSAwLjE2LgoKPWN1dAoKbXkgJHVpZCA9IDA7CnN1YiBhc19zdHJpbmcgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICVhcmdzID0gKAogICAgICAgIGNybGYgPT4gQ1JMRiwKICAgICAgICBAXwogICAgKTsKICAgIG15ICRvdXRwdXQgPSAkc2VsZi0+aGVhZGVyKCVhcmdzKTsKCiAgICBteSBAbWFuZGF0b3J5ID0gKAogICAgICAgICRzZWxmLT5tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgJHNlbGYtPm1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMsCiAgICApOwoKICAgIGlmIChncmVwIHskXyBlcSAidWlkIn0gQG1hbmRhdG9yeSBhbmQgIWRlZmluZWQgJHNlbGYtPnByb3BlcnRpZXMtPnt1aWR9CiAgICAgICAgICAgIGFuZCAkc2VsZi0+YXV0b191aWQpIHsKICAgICAgIyBQZXIgdGhlIFJGQywgY3JlYXRlIGEgInBlcnNpc3RlbnQsIGdsb2JhbGx5IHVuaXF1ZSIgVUlEIGZvciB0aGlzCiAgICAgICMgZXZlbnQ7ICJwZXJzaXN0ZW50IiBpbiB0aGlzIGNvbnRleHQgZG9lcyBub3QgbWVhbiBjb25zaXN0ZW50CiAgICAgICMgYWNyb3NzIHRpbWUsIGJ1dCByYXRoZXIgInVuaXF1ZSBhY3Jvc3MgYWxsIHRpbWUiCiAgICAgICRzZWxmLT5hZGRfcHJvcGVydHkoCiAgICAgICAgICB1aWQgPT4gdGltZSgpIC4gJy0nIC4kJCAuICctJyAuICR1aWQrKyAuICdAJyAuIFN5czo6SG9zdG5hbWU6Omhvc3RuYW1lKCkKICAgICAgKTsKICAgIH0KCiAgICBmb3IgbXkgJG5hbWUgKCBAbWFuZGF0b3J5ICkgewogICAgICAgIGNhcnAgIk1hbmRhdG9yeSBwcm9wZXJ0eSBmb3IgIiAuICggcmVmICRzZWxmICkgLiAiIG1pc3Npbmc6ICRuYW1lIgogICAgICAgICAgICB1bmxlc3MgJHNlbGYtPnByb3BlcnRpZXMtPnskbmFtZX0KICAgICAgICAgICAgICAgIGFuZCBAeyAkc2VsZi0+cHJvcGVydGllcy0+eyRuYW1lfSB9OwogICAgfQoKICAgIG15IEBwcm9wZXJ0aWVzID0gc29ydCB7CiAgICAgICAgIyBSRkMyNDQ1IGltcGxpZXMgYW4gb3JkZXIgKHNlZSA0LjYgQ2FsZW5kYXIgQ29tcG9uZW50cykgYnV0IGRvZXMgbm90CiAgICAgICAgIyByZXF1aXJlIGl0LiAgSG93ZXZlciwgc29tZSBhcHBsaWNhdGlvbnMgYnJlYWsgaWYgVkVSU0lPTiBpcyBub3QgZmlyc3QKICAgICAgICAjIChzZWUgaHR0cDovL2ljYWx2YWxpZC5jbG91ZGFwcC5uZXQvRGVmYXVsdC5hc3B4IGFuZCBbcnQuY3Bhbi5vcmcgIyAjNjU0NDddKS4KICAgICAgICByZXR1cm4gLTEgaWYgJGEgZXEgJ3ZlcnNpb24nOwogICAgICAgIHJldHVybiAgMSBpZiAkYiBlcSAndmVyc2lvbic7CiAgICAgICAgcmV0dXJuICRhIGNtcCAkYjsKICAgIH0ga2V5cyAleyAkc2VsZi0+cHJvcGVydGllcyB9OwoKICAgIGZvciBteSAkbmFtZSAoQHByb3BlcnRpZXMpIHsKICAgICAgICAkb3V0cHV0IC49ICRfCiAgICAgICAgICAgIGZvciBtYXAgeyAkXy0+YXNfc3RyaW5nKCVhcmdzKSB9IEB7ICRzZWxmLT5wcm9wZXJ0aWVzLT57JG5hbWV9IH07CiAgICB9CgogICAgZm9yIG15ICRlbnRyeSAoIEB7ICRzZWxmLT5lbnRyaWVzIH0gKSB7CiAgICAgICAgJG91dHB1dCAuPSAkZW50cnktPmFzX3N0cmluZyglYXJncyk7CiAgICB9CiAgICAkb3V0cHV0IC49ICRzZWxmLT5mb290ZXIoJWFyZ3MpOwoKICAgIHJldHVybiAkb3V0cHV0Owp9Cgo9aGVhZDIgYWRkX2VudHJ5ICRlbnRyeQoKQWRkcyBhbiBlbnRyeSB0byB0aGlzIGVudHJ5LiAgKEFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQsIHRoaXMgc2hvdWxkCm9ubHkgYmUgY2FsbGVkIG9uIGVpdGhlciBhIHRvLWRvIG9yIGV2ZW50IGVudHJ5IHdpdGggYW4gYWxhcm0gZW50cnksCm9yIG9uIGEgY2FsZW5kYXIgZW50cnkgKEw8RGF0YTo6SUNhbD4pIHdpdGggYSB0by1kbywgZXZlbnQsIGpvdXJuYWwsCnRpbWV6b25lLCBvciBmcmVlL2J1c3kgZW50cnkuKQoKUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyeSB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlCihwZXJoYXBzIGJlY2F1c2UgeW91IHRyaWVkIHRvIGFkZCBhbiBlbnRyeSBvZiBhbiBpbnZhbGlkIHR5cGUsIGJ1dAp0aGlzIGNoZWNrIGhhc24ndCBiZWVuIGltcGxlbWVudGVkIHlldCkuCgo9Y3V0CgpzdWIgYWRkX2VudHJ5IHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGVudHJ5ID0gc2hpZnQ7CiAgICBwdXNoIEB7ICRzZWxmLT57ZW50cmllc30gfSwgJGVudHJ5OwoKICAgICRlbnRyeS0+dmNhbDEwKCAkc2VsZi0+dmNhbDEwICk7CiAgICAkZW50cnktPnJmY19zdHJpY3QoICRzZWxmLT5yZmNfc3RyaWN0ICk7CiAgICAkZW50cnktPmF1dG9fdWlkKCAkc2VsZi0+YXV0b191aWQgKTsKCiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBhZGRfZW50cmllcyAkZW50cnkxLCBbJGVudHJ5MiwgLi4uXQoKQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY2FsbCBDPGFkZF9lbnRyeT4gc2V2ZXJhbCB0aW1lcyB3aXRoIGEgbGlzdApvZiBlbnRyaWVzLgoKPWN1dAoKc3ViIGFkZF9lbnRyaWVzIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgJHNlbGYtPmFkZF9lbnRyeSggJF8gKSBmb3IgQF87CiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBlbnRyaWVzCgpSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBvZiBzdWJlbnRyaWVzIG9mIHRoaXMgZW50cnkuCgo9Y3V0CgpfX1BBQ0tBR0VfXy0+bWtfcm9fYWNjZXNzb3JzKCdlbnRyaWVzJyk7Cgo9aGVhZDIgcHJvcGVydGllcwoKUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgaGFzaCBvZiBwcm9wZXJ0aWVzIG9mIHRoaXMgZW50cnkuICBUaGUga2V5cwphcmUgcHJvcGVydHkgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIGFycmF5IHJlZmVyZW5jZXMgY29udGFpbmluZwpMPERhdGE6OklDYWw6OlByb3BlcnR5PiBvYmplY3RzLgoKPWN1dAoKX19QQUNLQUdFX18tPm1rX3JvX2FjY2Vzc29ycygncHJvcGVydGllcycpOwoKPWhlYWQyIHByb3BlcnR5CgpHaXZlbiBhIHByb3BlcnR5IG5hbWUgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgb2YKTDxEYXRhOjpJQ2FsOjpQcm9wZXJ0eT4gb2JqZWN0cy4KCj1jdXQKCnN1YiBwcm9wZXJ0eSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHByb3AgPSBsYyBzaGlmdDsKICAgIHJldHVybiAkc2VsZi0+eydwcm9wZXJ0aWVzJ30tPnskcHJvcH07Cn0KCj1oZWFkMiBhZGRfcHJvcGVydHkgJHByb3BuYW1lID0+ICRwcm9wdmFsCgpDcmVhdGVzIGEgbmV3IEw8RGF0YTo6SUNhbDo6UHJvcGVydHk+IG9iamVjdCB3aXRoIG5hbWUgQzwkcHJvcG5hbWU+CmFuZCB2YWx1ZSBDPCRwcm9wdmFsPiBhbmQgYWRkcyBpdCB0byB0aGUgZXZlbnQuCgpJZiB0aGUgcHJvcGVydHkgaXMgbm90IGtub3duIHRvIGV4aXN0IGZvciB0aGF0IG9iamVjdCB0eXBlIGFuZCBkb2VzCm5vdCBiZWdpbiB3aXRoIEM8WC0+LCBpc3N1ZXMgYSB3YXJuaW5nLgoKSWYgdGhlIHByb3BlcnR5IGlzIGtub3duIHRvIGJlIHVuaXF1ZSwgcmVwbGFjZXMgdGhlIG9yaWdpbmFsIHByb3BlcnR5LgoKVG8gc3BlY2lmeSBwYXJhbWV0ZXJzIGZvciB0aGUgcHJvcGVydHksIGxldCBDPCRwcm9wdmFsPiBiZSBhCnR3by1lbGVtZW50IGFycmF5IHJlZmVyZW5jZSB3aGVyZSB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgcHJvcGVydHkKdmFsdWUgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBpcyBhIGhhc2ggcmVmZXJlbmNlLiAgVGhlIGtleXMgb2YgdGhlCmhhc2ggYXJlIHBhcmFtZXRlciBuYW1lczsgdGhlIHZhbHVlcyBzaG91bGQgYmUgZWl0aGVyIHN0cmluZ3Mgb3IgYXJyYXkKcmVmZXJlbmNlcyBvZiBzdHJpbmdzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcGFyYW1ldGVyIHNob3VsZCBoYXZlCm9uZSBvciBtdWx0aXBsZSAodG8gYmUgY29tbWEtc2VwYXJhdGVkKSB2YWx1ZXMuCgpFeGFtcGxlcyBvZiBzZXR0aW5nIHBhcmFtZXRlcnM6CgogIyBBZGQgYSBwcm9wZXJ0eSB3aXRoIGEgcGFyYW1ldGVyIG9mIFZBTFVFIHNldCB0byAnREFURScKICRldmVudC0+YWRkX3Byb3BlcnR5KCByZGF0ZSA9PiBbICRkYXRlLCB7IFZBTFVFID0+ICdEQVRFJyB9IF0gKTsKCj1jdXQKCnN1YiBhZGRfcHJvcGVydHkgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRwcm9wID0gbGMgc2hpZnQ7CiAgICBteSAkdmFsICA9IHNoaWZ0OwoKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkcHJvcDsKCiAgICB1bmxlc3MgKCAkc2VsZi0+aXNfcHJvcGVydHkoJHByb3ApIG9yICRwcm9wID1+IC9eeC0vaSApIHsKICAgICAgICBjYXJwICJVbmtub3duIHByb3BlcnR5IGZvciAiIC4gKCByZWYgJHNlbGYgKSAuICI6ICRwcm9wIjsKICAgIH0KCiAgICBpZiAoICRzZWxmLT5pc191bmlxdWUoJHByb3ApICkgewoKICAgICAgICAjIEl0IHNob3VsZCBiZSB1bmlxdWUsIHNvIGNsZWFyIG91dCBhbnl0aGluZyB3ZSBtaWdodCBoYXZlIGZpcnN0CiAgICAgICAgJHNlbGYtPnByb3BlcnRpZXMtPnskcHJvcH0gPSBbXTsKICAgIH0KCiAgICAkdmFsID0gWyAkdmFsLCB7fSBdIHVubGVzcyByZWYgJHZhbCBlcSAnQVJSQVknOwoKICAgIG15ICggJHByb3BfdmFsdWUsICRwYXJhbV9oYXNoICkgPSBAJHZhbDsKCiAgICBteSAkcCA9IERhdGE6OklDYWw6OlByb3BlcnR5LT5uZXcoICRwcm9wID0+ICRwcm9wX3ZhbHVlLCAkcGFyYW1faGFzaCApOwogICAgJHAtPnZjYWwxMCggJHNlbGYtPnZjYWwxMCApOwoKICAgIHB1c2ggQHsgJHNlbGYtPnByb3BlcnRpZXMtPnskcHJvcH0gfSwgJHA7CiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBhZGRfcHJvcGVydGllcyAkcHJvcG5hbWUxID0+ICRwcm9wdmFsMSwgWyRwcm9wbmFtZTIgPT4gJHByb3BuYW1lMiwgLi4uXQoKQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY2FsbCBDPGFkZF9wcm9wZXJ0eT4gc2V2ZXJhbCB0aW1lcyB3aXRoIGEgbGlzdApvZiBwcm9wZXJ0aWVzLgoKVGhpcyBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBjYWxsIGFkZCBDPGFkZF9wcm9wZXJ0eT4gb24gdGhlbSBpbiB0aGUKb3JkZXIgZ2l2ZW4sIHNvIHRoYXQgdW5pcXVlIHByb3BlcnRpZXMgZ2l2ZW4gbGF0ZXIgaW4gdGhlIGNhbGwgd2lsbAp0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSBnaXZlbiBlYXJsaWVyLiAgKFRoaXMgaXMgdW5yZWxhdGVkIHRvIHRoZQpvcmRlciBvZiBwcm9wZXJ0aWVzIHdoZW4gdGhlIGVudHJ5IGlzIHJlbmRlcmVkIGFzIGEgc3RyaW5nLCB0aG91Z2guKQoKUGFyYW1ldGVycyBmb3IgdGhlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBpbiB0aGUgc2FtZSB3YXkgYXMgaW4KQzxhZGRfcHJvcGVydHk+LgoKPWN1dAoKc3ViIGFkZF9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgaWYgKCBAXyAlIDIgKSB7CiAgICAgICAgY2FycCAiT2RkIG51bWJlciBvZiBlbGVtZW50cyBpbiBhZGRfcHJvcGVydGllcyBjYWxsIjsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKEBfKSB7CiAgICAgICAgbXkgJHByb3AgPSBzaGlmdDsKICAgICAgICBteSAkdmFsICA9IHNoaWZ0OwogICAgICAgICRzZWxmLT5hZGRfcHJvcGVydHkoICRwcm9wID0+ICR2YWwgKTsKICAgIH0KICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgKHdoaWNoIHJldHVybnMgYW4gZW1wdHkgbGlzdCBieQpkZWZhdWx0KSB0byBwcm92aWRlIGEgbGlzdCBvZiBsb3dlciBjYXNlIHN0cmluZ3MgaWRlbnRpZnlpbmcgdGhlCnByb3BlcnRpZXMgd2hpY2ggbXVzdCBhcHBlYXIgZXhhY3RseSBvbmNlIGluIHRoZSBzdWJjbGFzcydzIGVudHJ5CnR5cGUuCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsgKCkgfQoKPWhlYWQyIG1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKClN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kICh3aGljaCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgYnkKZGVmYXVsdCkgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgbG93ZXIgY2FzZSBzdHJpbmdzIGlkZW50aWZ5aW5nIHRoZQpwcm9wZXJ0aWVzIHdoaWNoIG11c3QgYXBwZWFyIGF0IGxlYXN0IG9uY2UgaW4gdGhlIHN1YmNsYXNzJ3MgZW50cnkKdHlwZS4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsgKCkgfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCAod2hpY2ggcmV0dXJucyBhbiBlbXB0eSBsaXN0IGJ5CmRlZmF1bHQpIHRvIHByb3ZpZGUgYSBsaXN0IG9mIGxvd2VyIGNhc2Ugc3RyaW5ncyBpZGVudGlmeWluZyB0aGUKcHJvcGVydGllcyB3aGljaCBtdXN0IGFwcGVhciBhdCBtb3N0IG9uY2UgaW4gdGhlIHN1YmNsYXNzJ3MgZW50cnkKdHlwZS4KCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7ICgpIH0KCj1oZWFkMiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKClN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kICh3aGljaCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgYnkKZGVmYXVsdCkgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgbG93ZXIgY2FzZSBzdHJpbmdzIGlkZW50aWZ5aW5nIHRoZQpwcm9wZXJ0aWVzIHdoaWNoIG1heSBhcHBlYXIgemVybywgb25lLCBvciBtb3JlIHRpbWVzIGluIHRoZSBzdWJjbGFzcydzCmVudHJ5IHR5cGUuCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsgKCkgfQoKPWhlYWQyIGlzX3Byb3BlcnR5ICRuYW1lCgpSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wZXJ0eQpDPCRuYW1lPiBpcyBrbm93biB0byB0aGUgY2xhc3MgKHRoYXQgaXMsIGlmIGl0J3MgbGlzdGVkIGluCkM8KG1hbmRhdG9yeS9vcHRpb25hbClfKHVuaXF1ZS9yZXBlYXRhYmxlKV9wcm9wZXJ0aWVzPikuCgo9Y3V0CgpzdWIgaXNfcHJvcGVydHkgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICByZXR1cm4gc2NhbGFyIGdyZXAgeyAkXyBlcSAkbmFtZSB9ICRzZWxmLT5tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgJHNlbGYtPm1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMsCiAgICAgICAgJHNlbGYtPm9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzLAogICAgICAgICRzZWxmLT5vcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXM7Cn0KCj1oZWFkMiBpc19tYW5kYXRvcnkgJG5hbWUKClJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHByb3BlcnR5CkM8JG5hbWU+IGlzIGtub3duIHRvIHRoZSBjbGFzcyBhcyBtYW5kYXRvcnkgKHRoYXQgaXMsIGlmIGl0J3MgbGlzdGVkCmluIEM8bWFuZGF0b3J5Xyh1bmlxdWUvcmVwZWF0YWJsZSlfcHJvcGVydGllcz4pLgoKPWN1dAoKc3ViIGlzX21hbmRhdG9yeSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJG5hbWUgPSBzaGlmdDsKICAgIHJldHVybiBzY2FsYXIgZ3JlcCB7ICRfIGVxICRuYW1lIH0gJHNlbGYtPm1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcywKICAgICAgICAkc2VsZi0+bWFuZGF0b3J5X3JlcGVhdGFibGVfcHJvcGVydGllczsKfQoKPWhlYWQyIGlzX29wdGlvbmFsICRuYW1lCgpSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wZXJ0eQpDPCRuYW1lPiBpcyBrbm93biB0byB0aGUgY2xhc3MgYXMgb3B0aW9uYWwgKHRoYXQgaXMsIGlmIGl0J3MgbGlzdGVkIGluCkM8b3B0aW9uYWxfKHVuaXF1ZS9yZXBlYXRhYmxlKV9wcm9wZXJ0aWVzPikuCgo9Y3V0CgpzdWIgaXNfb3B0aW9uYWwgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICByZXR1cm4gc2NhbGFyIGdyZXAgeyAkXyBlcSAkbmFtZSB9ICRzZWxmLT5vcHRpb25hbF91bmlxdWVfcHJvcGVydGllcywKICAgICAgICAkc2VsZi0+b3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzOwp9Cgo9aGVhZDIgaXNfdW5pcXVlICRuYW1lCgpSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wZXJ0eQpDPCRuYW1lPiBpcyBrbm93biB0byB0aGUgY2xhc3MgYXMgdW5pcXVlICh0aGF0IGlzLCBpZiBpdCdzIGxpc3RlZCBpbgpDPChtYW5kYXRvcnkvb3B0aW9uYWwpX3VuaXF1ZV9wcm9wZXJ0aWVzPikuCgo9Y3V0CgpzdWIgaXNfdW5pcXVlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkbmFtZSA9IHNoaWZ0OwogICAgcmV0dXJuIHNjYWxhciBncmVwIHsgJF8gZXEgJG5hbWUgfSAkc2VsZi0+bWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzLAogICAgICAgICRzZWxmLT5vcHRpb25hbF91bmlxdWVfcHJvcGVydGllczsKfQoKPWhlYWQyIGlzX3JlcGVhdGFibGUgJG5hbWUKClJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHByb3BlcnR5CkM8JG5hbWU+IGlzIGtub3duIHRvIHRoZSBjbGFzcyBhcyByZXBlYXRhYmxlICh0aGF0IGlzLCBpZiBpdCdzIGxpc3RlZAppbiBDPChtYW5kYXRvcnkvb3B0aW9uYWwpX3JlcGVhdGFibGVfcHJvcGVydGllcz4pLgoKPWN1dAoKc3ViIGlzX3JlcGVhdGFibGUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICByZXR1cm4gc2NhbGFyIGdyZXAgeyAkXyBlcSAkbmFtZSB9ICRzZWxmLT5tYW5kYXRvcnlfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzLAogICAgICAgICRzZWxmLT5vcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXM7Cn0KCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGlkZW50aWZ5aW5nIHR5cGUKbmFtZSBvZiB0aGUgZW50cnkgKHN1Y2ggYXMgQzxWQ0FMRU5EQVI+IG9yIEM8VlRPRE8+KS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydVTkRFRklORUQnfQoKPWhlYWQyIHZjYWwxMCBbJGJvb2xdCgpHZXRzIG9yIHNldHMgYSBib29sZWFuIHNheWluZyB3aGV0aGVyIHRoaXMgZW50cnkgc2hvdWxkIGJlIGludGVycHJldGVkCmFzIHZDYWxlbmRhciAxLjAgKGFzIG9wcG9zZWQgdG8gaUNhbGVuZGFyIDIuMCkuICBHZW5lcmFsbHksIHlvdSBjYW4KanVzdCBzZXQgdGhpcyBvbiB5b3VyIG1haW4gTDxEYXRhOjpJQ2FsPiBvYmplY3Qgd2hlbiB5b3UgY29uc3RydWN0IGl0OwpDPGFkZF9lbnRyeT4gYXV0b21hdGljYWxseSBtYWtlcyBzdXJlIHRoYXQgc3ViLWVudHJpZXMgZW5kIHVwIHdpdGggdGhlCnNhbWUgdmFsdWUgYXMgdGhlaXIgcGFyZW50cy4KCj1jdXQKCl9fUEFDS0FHRV9fLT5ta19hY2Nlc3NvcnMoJ3ZjYWwxMCcpOwoKPWhlYWQyIHJmY19zdHJpY3QgWyRib29sXQoKR2V0cyBvciBzZXRzIGEgYm9vbGVhbiBzYXlpbmcgd2hldGhlciB0aGlzIGVudHJ5IHdpbGwgY29tcGxhaW4gYWJvdXQKbWlzc2luZyBVSURzIGFzIHBlciBSRkMyNDQ2LiBEZWZhdWx0cyB0byBmYWxzZSwgZm9yIGJhY2t3YXJkcwpjb21wYXRpYmlsaXR5LiAgR2VuZXJhbGx5LCB5b3UgY2FuIGp1c3Qgc2V0IHRoaXMgb24geW91ciBtYWluCkw8RGF0YTo6SUNhbD4gb2JqZWN0IHdoZW4geW91IGNvbnN0cnVjdCBpdDsgQzxhZGRfZW50cnk+IGF1dG9tYXRpY2FsbHkKbWFrZXMgc3VyZSB0aGF0IHN1Yi1lbnRyaWVzIGVuZCB1cCB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHRoZWlyIHBhcmVudHMuCgo9Y3V0CgpfX1BBQ0tBR0VfXy0+bWtfYWNjZXNzb3JzKCdyZmNfc3RyaWN0Jyk7Cgo9aGVhZDIgYXV0b191aWQgWyRib29sXQoKR2V0cyBvciBzZXRzIGEgYm9vbGVhbiBzYXlpbmcgd2hldGhlciB0aGlzIGVudHJ5IHNob3VsZCBhdXRvbWF0aWNhbGx5CmdlbmVyYXRlIGl0cyBvd24gcGVyc2lzdGVudGx5IHVuaXF1ZSBVSURzLiAgRGVmYXVsdHMgdG8gZmFsc2UuCkdlbmVyYWxseSwgeW91IGNhbiBqdXN0IHNldCB0aGlzIG9uIHlvdXIgbWFpbiBMPERhdGE6OklDYWw+IG9iamVjdCB3aGVuCnlvdSBjb25zdHJ1Y3QgaXQ7IEM8YWRkX2VudHJ5PiBhdXRvbWF0aWNhbGx5IG1ha2VzIHN1cmUgdGhhdCBzdWItZW50cmllcwplbmQgdXAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGVpciBwYXJlbnRzLgoKPWN1dAoKX19QQUNLQUdFX18tPm1rX2FjY2Vzc29ycygnYXV0b191aWQnKTsKCj1oZWFkMiBoZWFkZXIKClJldHVybnMgdGhlIGhlYWRlciBsaW5lIGZvciB0aGUgZW50cnkgKGluY2x1ZGluZyB0cmFpbGluZyBuZXdsaW5lKS4KCj1jdXQKCnN1YiBoZWFkZXIgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICVhcmdzID0gKAogICAgICAgIGNybGYgPT4gQ1JMRiwKICAgICAgICBAXwogICAgKTsKICAgIHJldHVybiAnQkVHSU46JyAuICRzZWxmLT5pY2FsX2VudHJ5X3R5cGUgLiAkYXJnc3tjcmxmfTsKfQoKPWhlYWQyIGZvb3RlcgoKUmV0dXJucyB0aGUgZm9vdGVyIGxpbmUgZm9yIHRoZSBlbnRyeSAoaW5jbHVkaW5nIHRyYWlsaW5nIG5ld2xpbmUpLgoKPWN1dAoKc3ViIGZvb3RlciB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJWFyZ3MgPSAoCiAgICAgICAgY3JsZiA9PiBDUkxGLAogICAgICAgIEBfCiAgICApOwogICAgcmV0dXJuICdFTkQ6JyAuICRzZWxmLT5pY2FsX2VudHJ5X3R5cGUgLiAkYXJnc3tjcmxmfTsKfQoKIyBtYXBwaW5nIG9mIGV2ZW50IHR5cGVzIHRvIGNsYXNzICh1bmRlciB0aGUgRGF0YTo6SWNhbDo6RXZlbnQgbmFtZXNwYWNlKQpteSAlX2dlbmVyaWMgPSAoCiAgICB2ZXZlbnQgICAgPT4gJ0V2ZW50JywKICAgIHZ0b2RvICAgICA9PiAnVG9kbycsCiAgICB2am91cm5hbCAgPT4gJ0pvdXJuYWwnLAogICAgdmZyZWVidXN5ID0+ICdGcmVlQnVzeScsCiAgICB2dGltZXpvbmUgPT4gJ1RpbWVab25lJywKICAgIHN0YW5kYXJkICA9PiAnVGltZVpvbmU6OlN0YW5kYXJkJywKICAgIGRheWxpZ2h0ICA9PiAnVGltZVpvbmU6OkRheWxpZ2h0JywKKTsKCj1oZWFkMiBwYXJzZV9vYmplY3QKClRyYW5zbGF0ZSBhIEw8VGV4dDo6dkZpbGU6OmFzRGF0YT4gc3ViIG9iamVjdCBpbnRvIHRoZSBhcHByb3ByaWF0ZQpMPERhdGE6OmlDYWw6OkV2ZW50PiBzdWJ0eXBlLgoKPWN1dAoKIyBUT0RPOiB0aGlzIGlzIGN1cnJlbnRseSByZWN1cnNpdmUgd2hpY2ggY291bGQgYmxvdyB0aGUgc3RhY2sgLQojICAgICAgIGl0IG1pZ2h0IGJlIHdvcnRoIHJlZmFjdG9yaW5nIHRvIG1ha2UgaXQgc2VxdWVudGlhbApzdWIgcGFyc2Vfb2JqZWN0IHsKICAgIG15ICggJHNlbGYsICRvYmplY3QgKSA9IEBfOwoKICAgIG15ICR0eXBlID0gJG9iamVjdC0+e3R5cGV9OwoKICAgIG15ICRuZXdfc2VsZjsKCiAgICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBpdCdzIGdlbmVyaWMgbG9uZyBuYW1lIGp1c3QgaW4gY2FzZSB0aGVyZQogICAgIyBldmVudCB0dXJucyBvdXQgdG8gYmUgYSBWR0VORVJJQyBlbnRyeSB0eXBlCiAgICBpZiAoIG15ICRjbGFzcyA9ICRfZ2VuZXJpY3sgbGMoJHR5cGUpIH0gKSB7CiAgICAgICAgJG5ld19zZWxmID0gJHNlbGYtPl9wYXJzZV9kYXRhX2ljYWxfZ2VuZXJpYyggJGNsYXNzLCAkb2JqZWN0ICk7CgogICAgICAgICMgdGhlbiBsb29rIGZvciBzcGVjaWZpYyBvdmVycmlkZXMKICAgIH0gZWxzaWYgKCBteSAkc3ViID0gJHNlbGYtPmNhbiggJ19wYXJzZV8nIC4gbGMoJHR5cGUpICkgKSB7CiAgICAgICAgJG5ld19zZWxmID0gJHNlbGYtPiRzdWIoJG9iamVjdCk7CgogICAgICAgICMgY29tcGxhaW4KICAgIH0gZWxzZSB7CiAgICAgICAgd2FybiAiQ2FuJ3QgcGFyc2UgdHlwZSAkdHlwZSB5ZXQiOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlY3Vyc2UgdGhyb3VnaCBzdWItb2JqZWN0cwogICAgZm9yZWFjaCBteSAkc3ViX29iamVjdCAoIEB7ICRvYmplY3QtPntvYmplY3RzfSB9ICkgewogICAgICAgICRuZXdfc2VsZi0+cGFyc2Vfb2JqZWN0KCRzdWJfb2JqZWN0KTsKICAgIH0KCiAgICByZXR1cm4gJHNlbGY7Cn0KCiMgc3BlY2lhbCBiZWNhdXNlIHdlIHdhbnQgdG8gdXNlIG91cnNlbHZlcyBhcyB0aGUgcGFyZW50CnN1YiBfcGFyc2VfdmNhbGVuZGFyIHsKICAgIG15ICggJHNlbGYsICRvYmplY3QgKSA9IEBfOwogICAgJHNlbGYtPl9wYXJzZV9nZW5lcmljX2V2ZW50KCAkc2VsZiwgJG9iamVjdCApOwogICAgcmV0dXJuICRzZWxmOwp9CgojIG1hcHBpbmcgb2YgYWN0aW9uIHR5cGVzIHRvIGNsYXNzICh1bmRlciB0aGUgRGF0YTo6SWNhbDo6RXZlbnQ6OkFsYXJtIG5hbWVzcGFjZSkKbXkgJV9hY3Rpb25fbWFwID0gKAogICAgQVVESU8gICAgID0+ICdBdWRpbycsCiAgICBESVNQTEFZICAgPT4gJ0Rpc3BsYXknLAogICAgRU1BSUwgICAgID0+ICdFbWFpbCcsCiAgICBQUk9DRURVUkUgPT4gJ1Byb2NlZHVyZScsCiAgICBOT05FICAgICAgPT4gJ05vbmUnLAogICAgVVJJICAgICAgID0+ICdVUkknLAopOwoKIyBhbGFybXMgaGF2ZSBhY3Rpb25zCnN1YiBfcGFyc2VfdmFsYXJtIHsKICAgIG15ICggJHBhcmVudCwgJG9iamVjdCApID0gQF87CgogICAgIyBpY2sKICAgIG15ICRhY3Rpb24gPSAkb2JqZWN0LT57cHJvcGVydGllc30tPntBQ1RJT059LT5bMF0tPnt2YWx1ZX07CiAgICBkaWUgIkNhbid0IHBhcnNlIFZBTEFSTSB3aXRoIGFjdGlvbiAkYWN0aW9uIgogICAgICAgIHVubGVzcyBleGlzdHMgJF9hY3Rpb25fbWFweyRhY3Rpb259OwoKICAgICRhY3Rpb24gPSAkX2FjdGlvbl9tYXB7JGFjdGlvbn07CiAgICBteSAkYWxhcm1fY2xhc3MgPSAiRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjokYWN0aW9uIjsKICAgIGV2YWwgInJlcXVpcmUgJGFsYXJtX2NsYXNzIjsKICAgIGRpZSAiRmFpbGVkIHRvIHJlcXVpcmUgJGFsYXJtX2NsYXNzIDogJEAiIGlmICRAOwoKICAgICRhbGFybV9jbGFzcy0+aW1wb3J0OwogICAgbXkgJGFsYXJtID0gJGFsYXJtX2NsYXNzLT5uZXc7CiAgICAkcGFyZW50LT5fcGFyc2VfZ2VuZXJpY19ldmVudCggJGFsYXJtLCAkb2JqZWN0ICk7CiAgICAkcGFyZW50LT5hZGRfZW50cnkoJGFsYXJtKTsKICAgIHJldHVybiAkYWxhcm07Cn0KCiMgZ2VuZXJpYyBldmVudCBoYW5kbGVyCnN1YiBfcGFyc2VfZGF0YV9pY2FsX2dlbmVyaWMgewogICAgbXkgKCAkcGFyZW50LCAkY2xhc3MsICRvYmplY3QgKSA9IEBfOwoKICAgIG15ICRlbnRyeV9jbGFzcyA9ICJEYXRhOjpJQ2FsOjpFbnRyeTo6JGNsYXNzIjsKICAgIGV2YWwgInJlcXVpcmUgJGVudHJ5X2NsYXNzIjsKICAgIGRpZSAiRmFpbGVkIHRvIHJlcXVpcmUgJGVudHJ5X2NsYXNzIDogJEAiIGlmICRAOwoKICAgICRlbnRyeV9jbGFzcy0+aW1wb3J0OwogICAgbXkgJGVudHJ5ID0gJGVudHJ5X2NsYXNzLT5uZXc7CiAgICAkZW50cnktPnZjYWwxMCgkcGFyZW50LT52Y2FsMTApOwogICAgJHBhcmVudC0+X3BhcnNlX2dlbmVyaWNfZXZlbnQoICRlbnRyeSwgJG9iamVjdCApOwogICAgJHBhcmVudC0+YWRkX2VudHJ5KCRlbnRyeSk7CiAgICByZXR1cm4gJGVudHJ5Owp9CgojIGhhbmRsZSB0cmFuc2ZlcnJpbmcgb2YgcHJvcGVydGllcwpzdWIgX3BhcnNlX2dlbmVyaWNfZXZlbnQgewogICAgbXkgKCAkcGFyZW50LCAkZW50cnksICRvYmplY3QgKSA9IEBfOwoKICAgIG15ICRwID0gJG9iamVjdC0+e3Byb3BlcnRpZXN9OwogICAgZm9yIG15ICRrZXkgKCBzb3J0IGtleXMgJSRwICkgewogICAgICAgIGZvcmVhY2ggbXkgJG9jY3VyZW5jZSAoQHsgJHAtPnska2V5fSB9KSB7CiAgICAgICAgICAgIG15ICRwcm9wOwoKICAgICAgICAgICAgIyBVbmVzY2FwZXMsIGJ1dCBvbmx5IGluIHYyLCBhbmQgbm90IGlmIGl0J3MgZXhwbGljaXRseSBub3QgVEVYVAogICAgICAgICAgICBpZiAobm90ICRwYXJlbnQtPnZjYWwxMAogICAgICAgICAgICAgICAgYW5kICggIG5vdCAkb2NjdXJlbmNlLT57cGFyYW19CiAgICAgICAgICAgICAgICAgICAgb3Igbm90IGRlZmluZWQgJG9jY3VyZW5jZS0+e3BhcmFtfXtWQUxVRX0KICAgICAgICAgICAgICAgICAgICBvciAkb2NjdXJlbmNlLT57cGFyYW19e1ZBTFVFfSBlcSAiVEVYVCIgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkb2NjdXJlbmNlLT57dmFsdWV9ID1+IHMvXFwoWzssXFxdKS8kMS9nOwogICAgICAgICAgICAgICAgJG9jY3VyZW5jZS0+e3ZhbHVlfSA9fiBzL1xcbi9cbi9pZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgb3B0aW9uYWwgcGFyYW1zIGFuZCAnbm9ybWFsJyBrZXkvdmFsdWUgcGFpcnMKICAgICAgICAgICAgIyBUT0RPOiBsaW5lIHdyYXBwaW5nPwogICAgICAgICAgICBpZiAoICRvY2N1cmVuY2UtPntwYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkcHJvcCA9IFsgJG9jY3VyZW5jZS0+e3ZhbHVlfSwgJG9jY3VyZW5jZS0+e3BhcmFtfSBdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHByb3AgPSAkb2NjdXJlbmNlLT57dmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRlbnRyeS0+YWRkX3Byb3BlcnR5KCBsYygka2V5KSA9PiAkcHJvcCApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkZW50cnk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6RnJlZUJ1c3k7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkZyZWVCdXN5IC0gUmVwcmVzZW50cyBibG9ja3Mgb2YgZnJlZSBhbmQgYnVzeSB0aW1lIGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmZyZWVidXN5ID0gRGF0YTo6SUNhbDo6RW50cnk6OkZyZWVCdXN5LT5uZXcoKTsKICAgICR2ZnJlZWJ1c3ktPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgIG9yZ2FuaXplciA9PiAnTUFJTFRPOmpzbWl0aEBob3N0LmNvbScsCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgZnJlZWJ1c3kgICA9PiBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IC4uLiApLT5pY2FsIC4gJy8nIC4gRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiAuLi4gKS0+aWNhbCwKICAgICk7CgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZmcmVlYnVzeSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6RnJlZUJ1c3k+IG9iamVjdCByZXByZXNlbnRzIGEgcmVxdWVzdCBmb3IKaW5mb3JtYXRpb24gYWJvdXQgZnJlZSBhbmQgYnVzeSB0aW1lIG9yIGEgcmVwb25zZSB0byBzdWNoIGEgcmVxdWVzdCwKaW4gYW4gaUNhbGVuZGFyIGZpbGUuICAoTm90ZSB0aGF0IHRoZSBpQ2FsZW5kYXIgUkZDIHJlZmVycyB0byBlbnRyaWVzCmFzICJjb21wb25lbnRzIi4pICBJdCBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+IGFuZAphY2NlcHRzIGFsbCBvZiBpdHMgbWV0aG9kcy4KCj1oZWFkMSBNRVRIT0RTCgo9Y3V0Cgo9aGVhZDIgaWNhbF9lbnRyeV90eXBlCgpSZXR1cm5zIEM8VkZSRUVCVVNZPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZGUkVFQlVTWSd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpUaGUgQzx1aWQ+IHByb3BlcnR5IGlzIG1hbmRhdG9yeSBpZiBDPHJmY19zdHJpY3Q+IHdhcyBwYXNzZWQgdG8KTDxEYXRhOjpJQ2FsL25ldz4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnJmY19zdHJpY3QgPyAoInVpZCIpIDogKCkKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYXQgbW9zdCBvbmUgdGltZSBmb3IgYSBmcmVlL2J1c3kgZW50cnk6CgogICAgICAgIGNvbnRhY3QgIGR0c3RhcnQgIGR0ZW5kICBkdXJhdGlvbiAgZHRzdGFtcAogICAgICAgIG9yZ2FuaXplciAgdWlkICB1cmwKCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgQHJldCA9IHF3KAogICAgICAgIGNvbnRhY3QgIGR0c3RhcnQgIGR0ZW5kICBkdXJhdGlvbiAgZHRzdGFtcAogICAgICAgIG9yZ2FuaXplciAgdXJsCiAgICApOwogICAgcHVzaCBAcmV0LCAidWlkIiB1bmxlc3MgJHNlbGYtPnJmY19zdHJpY3Q7CiAgICByZXR1cm4gQHJldDsKfQoKPWhlYWQyIG9wdGlvbmFsX3JlcGVhdGFibGVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUKc3BlY2lmaWVkIGFueSBudW1iZXIgb2YgdGltZXMgZm9yIGZyZWUvYnVzeSBlbnRyeToKCiAgICAgICAgYXR0ZW5kZWUgY29tbWVudCBmcmVlYnVzeSByZXF1ZXN0LXN0YXR1cwoKPWN1dAoKc3ViIG9wdGlvbmFsX3JlcGVhdGFibGVfcHJvcGVydGllcyB7CiAgICBxdygKICAgICAgICBhdHRlbmRlZSBjb21tZW50IGZyZWVidXN5IHJlcXVlc3Qtc3RhdHVzCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OlRpbWVab25lIC0gUmVwcmVzZW50cyBhIHRpbWUgem9uZSBkZWZpbml0aW9uIGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdnRpbWV6b25lID0gRGF0YTo6SUNhbDo6RW50cnk6OlRpbWVab25lLT5uZXcoKTsKICAgICR2dGltZXpvbmUtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgIHR6aWQgPT4gIlVTLUVhc3Rlcm4iLAogICAgICAgIHR6dXJsID0+ICJodHRwOi8vem9uZXMuc3Rkc19yX3VzLm5ldC90ei9VUy1FYXN0ZXJuIgogICAgKTsKCiAgICAkdnRpbWV6b25lLT5hZGRfZW50cnkoJGRheWxpZ2h0KTsgIyBkYXlsaWdodC8gc3RhbmRhcmQgbm90IHlldCBpbXBsZW1lbnRlZAogICAgJHZ0aW1lem9uZS0+YWRkX2VudHJ5KCRzdGFuZGFyZCk7ICMgOi0oCgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZ0aW1lem9uZSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU+IG9iamVjdCByZXByZXNlbnRzIHRoZSBkZWNsYXJhdGlvbiBvZgphIHRpbWUgem9uZSBpbiBhbiBpQ2FsZW5kYXIgZmlsZS4gIChOb3RlIHRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzCnRvIGVudHJpZXMgYXMgImNvbXBvbmVudHMiLikgIEl0IGlzIGEgc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeT4KYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKVGhpcyBtb2R1bGUgaXMgbm90IHlldCB1c2VmdWwsIGJlY2F1c2UgZXZlcnkgdGltZSB6b25lIGRlY2xhcmF0aW9uCm5lZWRzIHRvIGNvbnRhaW4gYXQgbGVhc3Qgb25lIEM8U1RBTkRBUkQ+IG9yIEM8REFZTElHSFQ+IGNvbXBvbmVudCwKYW5kIHRoZXNlIGhhdmUgbm90IHlldCBiZWVuIGltcGxlbWVudGVkLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxWVElNRVpPTkU+LCBpdHMgaUNhbGVuZGFyIGVudHJ5IG5hbWUuCgo9Y3V0CgpzdWIgaWNhbF9lbnRyeV90eXBlIHsnVlRJTUVaT05FJ30KCj1oZWFkMiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUKc3BlY2lmaWVkIGF0IG1vc3Qgb25lIHRpbWUgZm9yIGEgdGltZSB6b25lIGRlY2xhcmF0aW9uOgoKICAgICAgICBsYXN0LW1vZGlmaWVkIHR6dXJsCgo9Y3V0CgpzdWIgb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgbGFzdC1tb2RpZmllZCB0enVybAogICAgKTsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBDPHR6aWQ+IHByb3BlcnR5IG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25lIHRpbWUgaW4gYSB0aW1lIHpvbmUgZGVjbGFyYXRpb24uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIHR6aWQKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6RXZlbnQ7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkV2ZW50IC0gUmVwcmVzZW50cyBhbiBldmVudCBpbiBhbiBpQ2FsZW5kYXIgZmlsZQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZldmVudCA9IERhdGE6OklDYWw6OkVudHJ5OjpFdmVudC0+bmV3KCk7CiAgICAkdmV2ZW50LT5hZGRfcHJvcGVydGllcygKICAgICAgICBzdW1tYXJ5ID0+ICJteSBwYXJ0eSIsCiAgICAgICAgZGVzY3JpcHRpb24gPT4gIkknbGwgY3J5IGlmIEkgd2FudCB0byIsCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgZHRzdGFydCAgID0+IERhdGU6OklDYWwtPm5ldyggZXBvY2ggPT4gdGltZSApLT5pY2FsLAogICAgKTsKCiAgICAkY2FsZW5kYXItPmFkZF9lbnRyeSgkdmV2ZW50KTsKCiAgICAkdmV2ZW50LT5hZGRfZW50cnkoJGFsYXJtKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5OjpFdmVudD4gb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgZXZlbnQgaW4gYW4KaUNhbGVuZGFyIGZpbGUuICAoTm90ZSB0aGF0IHRoZSBpQ2FsZW5kYXIgUkZDIHJlZmVycyB0byBlbnRyaWVzIGFzCiJjb21wb25lbnRzIi4pICBJdCBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+IGFuZCBhY2NlcHRzCmFsbCBvZiBpdHMgbWV0aG9kcy4KCj1oZWFkMSBNRVRIT0RTCgo9Y3V0Cgo9aGVhZDIgaWNhbF9lbnRyeV90eXBlCgpSZXR1cm5zIEM8VkVWRU5UPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZFVkVOVCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpUaGUgQzx1aWQ+IHByb3BlcnR5IGlzIG1hbmRhdG9yeSBpZiBDPHJmY19zdHJpY3Q+IHdhcyBwYXNzZWQgdG8KTDxEYXRhOjpJQ2FsL25ldz4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnJmY19zdHJpY3QgPyAoInVpZCIpIDogKCkKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYXQgbW9zdCBvbmUgdGltZSBmb3IgYW4gZXZlbnQ6CgogICAgICAgIGNsYXNzICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFydCAgZ2VvCiAgICAgICAgbGFzdC1tb2RpZmllZCAgbG9jYXRpb24gIG9yZ2FuaXplciAgcHJpb3JpdHkKICAgICAgICBkdHN0YW1wICBzZXF1ZW5jZSAgc3RhdHVzICBzdW1tYXJ5ICB0cmFuc3AKICAgICAgICB1aWQgIHVybCAgcmVjdXJyZW5jZS1pZAoKSW4gYWRkaXRpb24sIEM8ZHRlbmQ+IGFuZCBDPGR1cmF0aW9uPiBtYXkgYmUgc3BlY2lmaWVkIGF0IG1vc3Qgb25jZQplYWNoLCBidXQgbm90IGJvdGggaW4gdGhlIHNhbWUgZW50cnkgKHRob3VnaCB0aGlzIHJlc3RyaWN0aW9uIGlzIG5vdAplbmZvcmNlZCkuCgpPciBpZiBDPDwgdmNhbDEwID0+IDEgPj46CgogICAgICAgIGNsYXNzIGRjcmVhdGVkIGNvbXBsZXRlZCBkZXNjcmlwdGlvbiBkdHN0YXJ0IGR0ZW5kCiAgICAgICAgbGFzdC1tb2RpZmllZCBsb2NhdGlvbiBybnVtIHByaW9yaXR5CiAgICAgICAgc2VxdWVuY2Ugc3RhdHVzIHN1bW1hcnkgdHJhbnNwCiAgICAgICAgdXJsIHVpZAoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAcmV0ID0gJHNlbGYtPnJmY19zdHJpY3QgPyAoKSA6ICgidWlkIik7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBwdXNoIEByZXQsIHF3KAogICAgICAgICAgICBjbGFzcyAgY3JlYXRlZCAgZGVzY3JpcHRpb24gIGR0c3RhcnQgIGdlbwogICAgICAgICAgICBsYXN0LW1vZGlmaWVkICBsb2NhdGlvbiAgb3JnYW5pemVyICBwcmlvcml0eQogICAgICAgICAgICBkdHN0YW1wICBzZXF1ZW5jZSAgc3RhdHVzICBzdW1tYXJ5ICB0cmFuc3AKICAgICAgICAgICAgdXJsICByZWN1cnJlbmNlLWlkCgogICAgICAgICAgICBkdGVuZCBkdXJhdGlvbgogICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIHB1c2ggQHJldCwgcXcoCiAgICAgICAgICAgIGNsYXNzIGRjcmVhdGVkIGNvbXBsZXRlZCBkZXNjcmlwdGlvbiBkdHN0YXJ0IGR0ZW5kCiAgICAgICAgICAgIGxhc3QtbW9kaWZpZWQgbG9jYXRpb24gcm51bSBwcmlvcml0eQogICAgICAgICAgICBzZXF1ZW5jZSBzdGF0dXMgc3VtbWFyeSB0cmFuc3AKICAgICAgICAgICAgdXJsCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBAcmV0Owp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYW55IG51bWJlciBvZiB0aW1lcyBmb3IgYW4gZXZlbnQ6CgogICAgICAgIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMgIGNvbW1lbnQKICAgICAgICBjb250YWN0ICBleGRhdGUgIGV4cnVsZSAgcmVxdWVzdC1zdGF0dXMgIHJlbGF0ZWQtdG8KICAgICAgICByZXNvdXJjZXMgIHJkYXRlICBycnVsZQoKT3IgaWYgQzw8IHZjYWwxMCA9PiAxID4+OgoKICAgICAgICBhYWxhcm0gIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMKICAgICAgICBkYWxhcm0gIGV4ZGF0ZSAgZXhydWxlICBtYWxhcm0gIHBhbGFybSAgcmVsYXRlZC10bwogICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBxdygKICAgICAgICAgICAgYXR0YWNoICBhdHRlbmRlZSAgY2F0ZWdvcmllcyAgY29tbWVudAogICAgICAgICAgICBjb250YWN0ICBleGRhdGUgIGV4cnVsZSAgcmVxdWVzdC1zdGF0dXMgIHJlbGF0ZWQtdG8KICAgICAgICAgICAgcmVzb3VyY2VzICByZGF0ZSAgcnJ1bGUKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICBxdygKICAgICAgICAgICAgYWFsYXJtICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzCiAgICAgICAgICAgIGRhbGFybSAgZXhkYXRlICBleHJ1bGUgIG1hbGFybSAgcGFsYXJtICByZWxhdGVkLXRvCiAgICAgICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCiAgICAgICAgKTsKICAgIH0KfQoKPWhlYWQxIFNFRSBBTFNPCgo9b3ZlciA0Cgo9aXRlbSBMPERhdGE6OklDYWw6OkRhdGVUaW1lPgoKRm9yIGRhdGUgcGFyc2luZyBhbmQgZm9ybWF0dGluZywgaW5jbHVkaW5nIGRlbm90aW5nICJhbGwgZGF5IiBldmVudHMsCmNvbnNpZGVyaW5nIHVzaW5nIHRoaXMgbW9kdWxlLiBCZWNhdXNlIGl0J3MgYSAibWl4IGluIiwgeW91IGNhbiBzdGlsbAp1c2UgYWxsIHRoZSBtZXRob2RzIGhlcmUgYXMgd2VsbCBhcyB0aGUgbmV3IGRhdGUgaGFuZGxpbmcgbWV0aG9kcyBpdApkZWZpbmVzLgoKPWJhY2sKCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbDsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5LzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbCAtIFJlcHJlc2VudHMgYSBqb3VybmFsIGVudHJ5IGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmpvdXJuYWwgPSBEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbC0+bmV3KCk7CiAgICAkdmpvdXJuYWwtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgIHN1bW1hcnkgPT4gIk1pbnV0ZXMgb2YgbXkgcGFydHkiLAogICAgICAgIGRlc2NyaXB0aW9uID0+ICJJIGNyaWVkIGJlY2F1c2UgSSB3YW50ZWQgdG8uIiwKICAgICAgICAjIERhdCplKjo6SUNhbCBpcyBub3QgYSB0eXBvIGhlcmUKICAgICAgICBkdHN0YXJ0ICAgPT4gRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiB0aW1lICktPmljYWwsCiAgICApOwoKICAgICRjYWxlbmRhci0+YWRkX2VudHJ5KCR2am91cm5hbCk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbD4gb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgam91cm5hbAplbnRyeSBpbiBhbiBpQ2FsZW5kYXIgZmlsZS4gIChOb3RlIHRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzIHRvCmVudHJpZXMgYXMgImNvbXBvbmVudHMiLikgIEl0IGlzIGEgc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeT4KYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxWSk9VUk5BTD4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydWSk9VUk5BTCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpUaGUgQzx1aWQ+IHByb3BlcnR5IGlzIG1hbmRhdG9yeSBpZiBDPHJmY19zdHJpY3Q+IHdhcyBwYXNzZWQgdG8KTDxEYXRhOjpJQ2FsL25ldz4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnJmY19zdHJpY3QgPyAoInVpZCIpIDogKCkKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYXQgbW9zdCBvbmUgdGltZSBmb3IgYSBqb3VybmFsIGVudHJ5OgoKICAgIGNsYXNzICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFydCAgZHRzdGFtcAogICAgbGFzdC1tb2RpZmllZCAgb3JnYW5pemVyICByZWN1cnJlbmNlLWlkICBzZXF1ZW5jZSAgc3RhdHVzCiAgICBzdW1tYXJ5ICB1aWQgIHVybAoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAcmV0ID0gcXcoCiAgICAgICAgY2xhc3MgIGNyZWF0ZWQgIGRlc2NyaXB0aW9uICBkdHN0YXJ0ICBkdHN0YW1wCiAgICAgICAgbGFzdC1tb2RpZmllZCAgb3JnYW5pemVyICByZWN1cnJlbmNlLWlkICBzZXF1ZW5jZSAgc3RhdHVzCiAgICAgICAgc3VtbWFyeSB1cmwKICAgICk7CiAgICBwdXNoIEByZXQsICJ1aWQiIHVubGVzcyAkc2VsZi0+cmZjX3N0cmljdDsKICAgIHJldHVybiBAcmV0Owp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYW55IG51bWJlciBvZiB0aW1lcyBmb3IgYSBqb3VybmFsIGVudHJ5OgoKICAgICAgICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzICBjb21tZW50CiAgICAgICAgY29udGFjdCAgZXhkYXRlICBleHJ1bGUgIHJlbGF0ZWQtdG8gIHJkYXRlCiAgICAgICAgcnJ1bGUgIHJlcXVlc3Qtc3RhdHVzCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMgIGNvbW1lbnQKICAgICAgICBjb250YWN0ICBleGRhdGUgIGV4cnVsZSAgcmVsYXRlZC10byAgcmRhdGUKICAgICAgICBycnVsZSAgcmVxdWVzdC1zdGF0dXMKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VG9kbzsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5LzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6VG9kbyAtIFJlcHJlc2VudHMgYSB0by1kbyBlbnRyeSBpbiBhbiBpQ2FsZW5kYXIgZmlsZQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZ0b2RvID0gRGF0YTo6SUNhbDo6RW50cnk6OlRvZG8tPm5ldygpOwogICAgJHZ0b2RvLT5hZGRfcHJvcGVydGllcygKICAgICAgICBzdW1tYXJ5ICAgPT4gImdvIHRvIHNsZWVwIiwKICAgICAgICBzdGF0dXMgICAgPT4gJ0lOQ09NUExFVEUnLAogICAgICAgICMgRGF0KmUqOjpJQ2FsIGlzIG5vdCBhIHR5cG8gaGVyZQogICAgICAgIGR0c3RhcnQgICA9PiBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IHRpbWUgKS0+aWNhbCwKICAgICk7CgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZ0b2RvKTsKCiAgICAkdnRvZG8tPmFkZF9lbnRyeSgkYWxhcm0pOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbDo6RW50cnk6OlRvZG8+IG9iamVjdCByZXByZXNlbnRzIGEgc2luZ2xlIHRvLWRvIGVudHJ5IGluCmFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUgaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcwoiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZiBMPERhdGE6OklDYWw6OkVudHJ5PiBhbmQgYWNjZXB0cwphbGwgb2YgaXRzIG1ldGhvZHMuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIGljYWxfZW50cnlfdHlwZQoKUmV0dXJucyBDPFZUT0RPPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZUT0RPJ30KCj1oZWFkMiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMKClRoZSBDPHVpZD4gcHJvcGVydHkgaXMgbWFuZGF0b3J5IGlmIEM8cmZjX3N0cmljdD4gd2FzIHBhc3NlZCB0bwpMPERhdGE6OklDYWwvbmV3Pi4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAkc2VsZi0+cmZjX3N0cmljdCA/ICgidWlkIikgOiAoKQp9Cgo9aGVhZDIgb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbWF5IGJlCnNwZWNpZmllZCBhdCBtb3N0IG9uZSB0aW1lIGZvciBhIHRvLWRvIGl0ZW06CgogICAgICBjbGFzcyAgY29tcGxldGVkICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFtcAogICAgICBkdHN0YXJ0ICBnZW8gIGxhc3QtbW9kaWZpZWQgIGxvY2F0aW9uICBvcmdhbml6ZXIKICAgICAgcGVyY2VudC1jb21wbGV0ZSAgcHJpb3JpdHkgIHJlY3VycmVuY2UtaWQgIHNlcXVlbmNlICBzdGF0dXMKICAgICAgc3VtbWFyeSAgdWlkICB1cmwKCkluIGFkZGl0aW9uLCBDPGR1ZT4gYW5kIEM8ZHVyYXRpb24+IG1heSBiZSBzcGVjaWZpZWQgYXQgbW9zdCBvbmNlCmVhY2gsIGJ1dCBub3QgYm90aCBpbiB0aGUgc2FtZSBlbnRyeSAodGhvdWdoIHRoaXMgcmVzdHJpY3Rpb24gaXMgbm90CmVuZm9yY2VkKS4KCk9yIGlmIEM8PCB2Y2FsMTAgPT4gMSA+PjoKCiAgICAgICAgY2xhc3MgZGNyZWF0ZWQgY29tcGxldGVkIGRlc2NyaXB0aW9uIGR0c3RhcnQgZHVlCiAgICAgICAgbGFzdC1tb2RpZmllZCBsb2NhdGlvbiBybnVtIHByaW9yaXR5CiAgICAgICAgc2VxdWVuY2Ugc3RhdHVzIHN1bW1hcnkgdHJhbnNwCiAgICAgICAgdXJsIHVpZAoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAcmV0ID0gJHNlbGYtPnJmY19zdHJpY3QgPyAoKSA6ICgidWlkIik7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBwdXNoIEByZXQsIHF3KAogICAgICAgICAgICBjbGFzcyAgY29tcGxldGVkICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFtcAogICAgICAgICAgICBkdHN0YXJ0ICBnZW8gIGxhc3QtbW9kaWZpZWQgIGxvY2F0aW9uICBvcmdhbml6ZXIKICAgICAgICAgICAgcGVyY2VudC1jb21wbGV0ZSAgcHJpb3JpdHkgIHJlY3VycmVuY2UtaWQgIHNlcXVlbmNlICBzdGF0dXMKICAgICAgICAgICAgc3VtbWFyeSAgdWlkICB1cmwKCiAgICAgICAgICAgIGR1ZSBkdXJhdGlvbgogICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIHB1c2ggQHJldCwgcXcoCiAgICAgICAgICAgIGNsYXNzIGRjcmVhdGVkIGNvbXBsZXRlZCBkZXNjcmlwdGlvbiBkdHN0YXJ0IGR1ZQogICAgICAgICAgICBsYXN0LW1vZGlmaWVkIGxvY2F0aW9uIHJudW0gcHJpb3JpdHkKICAgICAgICAgICAgc2VxdWVuY2Ugc3RhdHVzIHN1bW1hcnkgdHJhbnNwCiAgICAgICAgICAgIHVybCB1aWQKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIEByZXQ7Cn0KCj1oZWFkMiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbWF5IGJlCnNwZWNpZmllZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGZvciBhIHRvLWRvIGl0ZW06CgogICAgICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzICBjb21tZW50ICBjb250YWN0CiAgICAgIGV4ZGF0ZSAgZXhydWxlICByZXF1ZXN0LXN0YXR1cyAgcmVsYXRlZC10byAgcmVzb3VyY2VzCiAgICAgIHJkYXRlICBycnVsZQoKT3IgaWYgQzw8IHZjYWwxMCA9PiAxID4+OgoKICAgICAgICBhYWxhcm0gIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMKICAgICAgICBkYWxhcm0gIGV4ZGF0ZSAgZXhydWxlICBtYWxhcm0gIHBhbGFybSAgcmVsYXRlZC10bwogICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBxdygKICAgICAgICAgICAgYXR0YWNoICBhdHRlbmRlZSAgY2F0ZWdvcmllcyAgY29tbWVudCAgY29udGFjdAogICAgICAgICAgICBleGRhdGUgIGV4cnVsZSAgcmVxdWVzdC1zdGF0dXMgIHJlbGF0ZWQtdG8gIHJlc291cmNlcwogICAgICAgICAgICByZGF0ZSAgcnJ1bGUKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICBxdygKICAgICAgICAgICAgYWFsYXJtICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzCiAgICAgICAgICAgIGRhbGFybSAgZXhkYXRlICBleHJ1bGUgIG1hbGFybSAgcGFsYXJtICByZWxhdGVkLXRvCiAgICAgICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCiAgICAgICAgKTsKICAgIH0KfQoKPWhlYWQxIEFVVEhPUgoKQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMgRTxsdD5tb2R1bGVzQGJlc3RwcmFjdGljYWwuY29tRTxndD4KCj1oZWFkMSBMSUNFTkNFIEFORCBDT1BZUklHSFQKCkNvcHlyaWdodCAoYykgMjAwNSAtIDIwMTUsIEJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIFNlZSBMPHBlcmxhcnRpc3RpYz4uCgo9Y3V0CgoxOwo=
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm07Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxhcm1zCgo9aGVhZDEgREVTQ1JJUFRJT04KCkw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtPiBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aGUgb3RoZXIgdHlwZQpvZiBzdXBwb3J0ZWQgYnkgYWxhcm1zOgoKPW92ZXIKCj1pdGVtIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpBdWRpbz4KCj1pdGVtIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpEaXNwbGF5PgoKPWl0ZW0gTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkVtYWlsPgoKPWl0ZW0gTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZT4KCj1iYWNrCgpJdCBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+IGFuZCBhY2NlcHRzIGFsbCBvZiBpdHMgbWV0aG9kcy4KCj1oZWFkMSBNRVRIT0RTCgo9Y3V0Cgo9aGVhZDIgbmV3CgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CiAgICBkaWUgIkNhbid0IGluc3RhbnRpYXRlIGFic3RyYWN0IGJhc2UgY2xhc3MgRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtIgogICAgICAgIGlmICRjbGFzcyBlcSBfX1BBQ0tBR0VfXzsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIGljYWxfZW50cnlfdHlwZQoKUmV0dXJucyBDPFZBTEFSTT4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydWQUxBUk0nfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIEM8ZHVyYXRpb24+IGFuZCBDPHJldHJlYXQ+CnByb3BlcnRpZXMgbWF5IGJlIHNwZWNpZmllZCBhdCBtb3N0IG9uZSB0aW1lIGFsbCB0eXBlcyBvZiBhbGFybXM7IGlmIG9uZQppcyBzcGVjaWZpZWQsIHRoZSBvdGhlciBvbmUgbXVzdCBiZSBhbHNvLCB0aG91Z2ggdGhpcyBtb2R1bGUgZG9lcyBub3QKZW5mb3JjZSB0aGF0IHJlc3RyaWN0aW9uLgoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGR1cmF0aW9uIHJlcGVhdAogICAgKTsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBDPHRyaWdnZXI+IHByb3BlcnR5IG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25jZSBmb3IgYW4gYWxsIHR5cGVzIG9mIGFsYXJtczsgc3ViY2xhc3NlcyBtYXkgaGF2ZQphZGRpdGlvbmFsIHJlcXVpcmVkIHByb3BlcnRpZXMuCgpJbiBhZGRpdGlvbiwgdGhlIEM8YWN0aW9uPiBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBleGFjdGx5IG9uY2UsIGJ1dAphbGwgc3ViY2xhc3NlcyBhdXRvbWF0aWNhbGx5IHNldCBzYWlkIHByb3BlcnR5IGFwcHJvcHJpYXRlbHkuCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGFjdGlvbiB0cmlnZ2VyCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU6OlN0YW5kYXJkOwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnkvOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpUaW1lWm9uZTo6U3RhbmRhcmQgLSBSZXByZXNlbnRzIGEgU3RhbmRhcmQgVGltZSBiYXNlIG9mZnNldCBmcm9tIFVUQyBmb3IgcGFyZW50IFRpbWVab25lCgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgdGltZSB6b25lIGlzIHVuYW1iaWd1b3VzbHkgZGVmaW5lZCBieSB0aGUgc2V0IG9mIHRpbWUgbWVhc3VyZW1lbnQKcnVsZXMgZGV0ZXJtaW5lZCBieSB0aGUgZ292ZXJuaW5nIGJvZHkgZm9yIGEgZ2l2ZW4gZ2VvZ3JhcGhpYwphcmVhLiBUaGVzZSBydWxlcyBkZXNjcmliZSBhdCBhIG1pbmltdW0gdGhlIGJhc2Ugb2Zmc2V0IGZyb20gVVRDIGZvcgp0aGUgdGltZSB6b25lLCBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgU3RhbmRhcmQgVGltZSBvZmZzZXQuIE1hbnkKbG9jYXRpb25zIGFkanVzdCB0aGVpciBTdGFuZGFyZCBUaW1lIGZvcndhcmQgb3IgYmFja3dhcmQgYnkgb25lIGhvdXIsCmluIG9yZGVyIHRvIGFjY29tbW9kYXRlIHNlYXNvbmFsIGNoYW5nZXMgaW4gbnVtYmVyIG9mIGRheWxpZ2h0IGhvdXJzLApvZnRlbiByZWZlcnJlZCB0byBhcyBEYXlsaWdodCBTYXZpbmcgVGltZS4gU29tZSBsb2NhdGlvbnMgYWRqdXN0IHRoZWlyCnRpbWUgYnkgYSBmcmFjdGlvbiBvZiBhbiBob3VyLiBTdGFuZGFyZCBUaW1lIGlzIGFsc28ga25vd24gYXMgV2ludGVyClRpbWUuIERheWxpZ2h0IFNhdmluZyBUaW1lIGlzIGFsc28ga25vd24gYXMgQWR2YW5jZWQgVGltZSwgU3VtbWVyClRpbWUsIG9yIExlZ2FsIFRpbWUgaW4gY2VydGFpbiBjb3VudHJpZXMuIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MKdGhlIGNoYW5nZXMgaW4gdGltZSB6b25lIHJ1bGVzIGluIGVmZmVjdCBmb3IgTmV3IFlvcmsgQ2l0eSBzdGFydGluZwpmcm9tIDE5NjcuIEVhY2ggbGluZSByZXByZXNlbnRzIGEgZGVzY3JpcHRpb24gb3IgcnVsZSBmb3IgYSBwYXJ0aWN1bGFyCm9ic2VydmFuY2UuCgogICAgIEVmZmVjdGl2ZSBPYnNlcnZhbmNlIFJ1bGUKCiAgICAgRGF0ZSAgICAgICAoRGF0ZS9UaW1lKSAgICAgICAgICAgICBPZmZzZXQgIEFiYnJldmlhdGlvbgoKICAgICAxOTY3LSogICAgIGxhc3QgU3VuIGluIE9jdCwgMDI6MDAgIC0wNTAwICAgRVNUCgogICAgIDE5NjctMTk3MyAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk3NC0xOTc0ICBKYW4gNiwgIDAyOjAwICAgICAgICAgICAtMDQwMCAgIEVEVAoKICAgICAxOTc1LTE5NzUgIEZlYiAyMywgMDI6MDAgICAgICAgICAgIC0wNDAwICAgRURUCgogICAgIDE5NzYtMTk4NiAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk4Ny0qICAgICBmaXJzdCBTdW4gaW4gQXByLCAwMjowMCAtMDQwMCAgIEVEVAoKTm90ZTogVGhlIHNwZWNpZmljYXRpb24gb2YgYSBnbG9iYWwgdGltZSB6b25lIHJlZ2lzdHJ5IGlzIG5vdAphZGRyZXNzZWQgYnkgdGhpcyBkb2N1bWVudCBhbmQgaXMgbGVmdCBmb3IgZnV0dXJlIHN0dWR5LiAgSG93ZXZlciwKaW1wbGVtZW50ZXJzIG1heSBmaW5kIHRoZSBPbHNvbiB0aW1lIHpvbmUgZGF0YWJhc2UgW1RaXSBhIHVzZWZ1bApyZWZlcmVuY2UuIEl0IGlzIGFuIGluZm9ybWFsLCBwdWJsaWMtZG9tYWluIGNvbGxlY3Rpb24gb2YgdGltZSB6b25lCmluZm9ybWF0aW9uLCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgbWFpbnRhaW5lZCBieSB2b2x1bnRlZXIgSW50ZXJuZXQKcGFydGljaXBhbnRzLCBhbmQgaXMgdXNlZCBpbiBzZXZlcmFsIG9wZXJhdGluZyBzeXN0ZW1zLiBUaGlzIGRhdGFiYXNlCmNvbnRhaW5zIGN1cnJlbnQgYW5kIGhpc3RvcmljYWwgdGltZSB6b25lIGluZm9ybWF0aW9uIGZvciBhIHdpZGUKdmFyaWV0eSBvZiBsb2NhdGlvbnMgYXJvdW5kIHRoZSBnbG9iZTsgaXQgcHJvdmlkZXMgYSB0aW1lIHpvbmUKaWRlbnRpZmllciBmb3IgZXZlcnkgdW5pcXVlIHRpbWUgem9uZSBydWxlIHNldCBpbiBhY3R1YWwgdXNlIHNpbmNlCjE5NzAsIHdpdGggaGlzdG9yaWNhbCBkYXRhIGdvaW5nIGJhY2sgdG8gdGhlIGludHJvZHVjdGlvbiBvZiBzdGFuZGFyZAp0aW1lLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxTVEFOREFSRD4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydTVEFOREFSRCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25lIHRpbWUgaW4gYSBzdGFuZGFyZCB0aW1lIGRlY2xhcmF0aW9uOgoKICAgICAgICBkdHN0YXJ0ICB0em9mZnNldHRvICB0em9mZnNldGZyb20KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgZHRzdGFydAogICAgICAgIHR6b2Zmc2V0dG8KICAgICAgICB0em9mZnNldGZyb20KICAgICk7Cn0KCj1oZWFkMiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbWF5IGJlCnNwZWNpZmllZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGZvciBhIHN0YW5kYXJkIHRpbWUgZGVjbGFyYXRpb246CgogICAgICAgIGNvbW1lbnQgIHJkYXRlICBycnVsZSAgdHpuYW1lCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGNvbW1lbnQKICAgICAgICByZGF0ZQogICAgICAgIHJydWxlCiAgICAgICAgdHpuYW1lCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU6OkRheWxpZ2h0OwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnkvOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpUaW1lWm9uZTo6RGF5bGlnaHQgLSBSZXByZXNlbnRzIGEgRGF5bGlnaHQgVGltZSBiYXNlIG9mZnNldCBmcm9tIFVUQyBmb3IgcGFyZW50IFRpbWVab25lCgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgdGltZSB6b25lIGlzIHVuYW1iaWd1b3VzbHkgZGVmaW5lZCBieSB0aGUgc2V0IG9mIHRpbWUgbWVhc3VyZW1lbnQKcnVsZXMgZGV0ZXJtaW5lZCBieSB0aGUgZ292ZXJuaW5nIGJvZHkgZm9yIGEgZ2l2ZW4gZ2VvZ3JhcGhpYwphcmVhLiBUaGVzZSBydWxlcyBkZXNjcmliZSBhdCBhIG1pbmltdW0gdGhlIGJhc2Ugb2Zmc2V0IGZyb20gVVRDIGZvcgp0aGUgdGltZSB6b25lLCBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgU3RhbmRhcmQgVGltZSBvZmZzZXQuIE1hbnkKbG9jYXRpb25zIGFkanVzdCB0aGVpciBTdGFuZGFyZCBUaW1lIGZvcndhcmQgb3IgYmFja3dhcmQgYnkgb25lIGhvdXIsCmluIG9yZGVyIHRvIGFjY29tbW9kYXRlIHNlYXNvbmFsIGNoYW5nZXMgaW4gbnVtYmVyIG9mIGRheWxpZ2h0IGhvdXJzLApvZnRlbiByZWZlcnJlZCB0byBhcyBEYXlsaWdodCBTYXZpbmcgVGltZS4gU29tZSBsb2NhdGlvbnMgYWRqdXN0IHRoZWlyCnRpbWUgYnkgYSBmcmFjdGlvbiBvZiBhbiBob3VyLiBTdGFuZGFyZCBUaW1lIGlzIGFsc28ga25vd24gYXMgV2ludGVyClRpbWUuIERheWxpZ2h0IFNhdmluZyBUaW1lIGlzIGFsc28ga25vd24gYXMgQWR2YW5jZWQgVGltZSwgU3VtbWVyClRpbWUsIG9yIExlZ2FsIFRpbWUgaW4gY2VydGFpbiBjb3VudHJpZXMuIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MKdGhlIGNoYW5nZXMgaW4gdGltZSB6b25lIHJ1bGVzIGluIGVmZmVjdCBmb3IgTmV3IFlvcmsgQ2l0eSBzdGFydGluZwpmcm9tIDE5NjcuIEVhY2ggbGluZSByZXByZXNlbnRzIGEgZGVzY3JpcHRpb24gb3IgcnVsZSBmb3IgYSBwYXJ0aWN1bGFyCm9ic2VydmFuY2UuCgogICAgIEVmZmVjdGl2ZSBPYnNlcnZhbmNlIFJ1bGUKCiAgICAgRGF0ZSAgICAgICAoRGF0ZS9UaW1lKSAgICAgICAgICAgICBPZmZzZXQgIEFiYnJldmlhdGlvbgoKICAgICAxOTY3LSogICAgIGxhc3QgU3VuIGluIE9jdCwgMDI6MDAgIC0wNTAwICAgRVNUCgogICAgIDE5NjctMTk3MyAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk3NC0xOTc0ICBKYW4gNiwgIDAyOjAwICAgICAgICAgICAtMDQwMCAgIEVEVAoKICAgICAxOTc1LTE5NzUgIEZlYiAyMywgMDI6MDAgICAgICAgICAgIC0wNDAwICAgRURUCgogICAgIDE5NzYtMTk4NiAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk4Ny0qICAgICBmaXJzdCBTdW4gaW4gQXByLCAwMjowMCAtMDQwMCAgIEVEVAoKTm90ZTogVGhlIHNwZWNpZmljYXRpb24gb2YgYSBnbG9iYWwgdGltZSB6b25lIHJlZ2lzdHJ5IGlzIG5vdAphZGRyZXNzZWQgYnkgdGhpcyBkb2N1bWVudCBhbmQgaXMgbGVmdCBmb3IgZnV0dXJlIHN0dWR5LiAgSG93ZXZlciwKaW1wbGVtZW50ZXJzIG1heSBmaW5kIHRoZSBPbHNvbiB0aW1lIHpvbmUgZGF0YWJhc2UgW1RaXSBhIHVzZWZ1bApyZWZlcmVuY2UuIEl0IGlzIGFuIGluZm9ybWFsLCBwdWJsaWMtZG9tYWluIGNvbGxlY3Rpb24gb2YgdGltZSB6b25lCmluZm9ybWF0aW9uLCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgbWFpbnRhaW5lZCBieSB2b2x1bnRlZXIgSW50ZXJuZXQKcGFydGljaXBhbnRzLCBhbmQgaXMgdXNlZCBpbiBzZXZlcmFsIG9wZXJhdGluZyBzeXN0ZW1zLiBUaGlzIGRhdGFiYXNlCmNvbnRhaW5zIGN1cnJlbnQgYW5kIGhpc3RvcmljYWwgdGltZSB6b25lIGluZm9ybWF0aW9uIGZvciBhIHdpZGUKdmFyaWV0eSBvZiBsb2NhdGlvbnMgYXJvdW5kIHRoZSBnbG9iZTsgaXQgcHJvdmlkZXMgYSB0aW1lIHpvbmUKaWRlbnRpZmllciBmb3IgZXZlcnkgdW5pcXVlIHRpbWUgem9uZSBydWxlIHNldCBpbiBhY3R1YWwgdXNlIHNpbmNlCjE5NzAsIHdpdGggaGlzdG9yaWNhbCBkYXRhIGdvaW5nIGJhY2sgdG8gdGhlIGludHJvZHVjdGlvbiBvZiBzdGFuZGFyZAp0aW1lLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxEQVlMSUdIVD4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydEQVlMSUdIVCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25lIHRpbWUgaW4gYSBkYXlsaWdodCBkZWNsYXJhdGlvbjoKCiAgICAgICAgZHRzdGFydCAgdHpvZmZzZXR0byAgdHpvZmZzZXRmcm9tCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGR0c3RhcnQKICAgICAgICB0em9mZnNldHRvCiAgICAgICAgdHpvZmZzZXRmcm9tCiAgICApOwp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYW55IG51bWJlciBvZiB0aW1lcyBmb3IgYSBkYXlsaWdodCBkZWNsYXJhdGlvbjoKCiAgICAgICAgY29tbWVudCAgcmRhdGUgIHJydWxlICB0em5hbWUKCj1jdXQKCnN1YiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgY29tbWVudAogICAgICAgIHJkYXRlCiAgICAgICAgcnJ1bGUKICAgICAgICB0em5hbWUKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZTsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5OjpBbGFybS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpQcm9jZWR1cmUgLSBSZXByZXNlbnRzIGEgcHJvY2VkdXJlLWNhbGwgYWxhcm0gaW4gYW4gaUNhbGVuZGFyIGZpbGUKCj1oZWFkMSBTWU5PUFNJUwoKICAgIG15ICR2YWxhcm0gPSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZS0+bmV3KCk7CiAgICAkdmFsYXJtLT5hZGRfcHJvcGVydGllcygKICAgICAgICBhdHRhY2ggPT4gWyAiZnRwOi8vaG9zdC5jb20vbm92by1wcm9jcy9mZWxpemFuby5leGUiLCB7IGZtdHR5cGUgPT4gImFwcGxpY2F0aW9uL2JpbmFyeSIgfSBdLAogICAgICAgICMgRGF0KmUqOjpJQ2FsIGlzIG5vdCBhIHR5cG8gaGVyZQogICAgICAgIHRyaWdnZXIgICA9PiBbIERhdGU6OklDYWwtPm5ldyggZXBvY2ggPT4gLi4uICktPmljYWwsIHsgdmFsdWUgPT4gJ0RBVEUtVElNRScgfSBdLAogICAgKTsKCiAgICAkdmV2ZW50LT5hZGRfZW50cnkoJHZhbGFybSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZT4gb2JqZWN0IHJlcHJlc2VudHMgYW4gYWxhcm0KdGhhdCBjYWxscyBhIHByb2NlZHVyZSAoaW4gc29tZSBhcHBsaWNhdGlvbi1kZWZpbmVkIHdheSksIHdoaWNoIGlzCmF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluIGFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUKaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcyAiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZgpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZT4gb2JqZWN0OyBzZXRzIGl0cwpDPEFDVElPTj4gcHJvcGVydHkgdG8gQzxQUk9DRURVUkU+LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CiAgICAkc2VsZi0+YWRkX3Byb3BlcnR5KCBhY3Rpb24gPT4gIlBST0NFRFVSRSIgKTsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGR1cmF0aW9uPiBhbmQgQzxyZXBlYXQ+IChzZWUKTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXM+KSwgcHJvY2VkdXJlLWNhbGwKYWxhcm1zIG1heSBhbHNvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgQzxkZXNjcmlwdGlvbj4uCgo9Y3V0CgpzdWIgb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcmV0dXJuICgKICAgICAgICBzaGlmdC0+U1VQRVI6Om9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzLAogICAgICAgICJkZXNjcmlwdGlvbiIsCiAgICApOwp9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGFjdGlvbj4gYW5kIEM8dHJpZ2dlcj4gKHNlZQpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybS9tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXM+KSwgcHJvY2VkdXJlLWNhbGwKYWxhcm1zIG11c3QgYWxzbyBzcGVjaWZ5IGEgdmFsdWUgZm9yIEM8YXR0YWNoPi4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcmV0dXJuICgKICAgICAgICBzaGlmdC0+U1VQRVI6Om1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcywKICAgICAgICAiYXR0YWNoIiwKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06Ok5vbmU7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6Tm9uZSAtIFJlcHJlc2VudHMgYW4gZGVmYXVsdCBuby1vcCBhbGFybQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZhbGFybSA9IERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6Tm9uZS0+bmV3KCk7CiAgICAkdmV2ZW50LT5hZGRfZW50cnkoJHZhbGFybSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06Ok5vbmU+IG9iamVjdCByZXByZXNlbnRzIGEgZGVmYXVsdCBhbGFybQp0aGF0IGRvZXMgbm90aGluZzsgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhIGxhY2sgb2YgYWxhcm0sIGJlY2F1c2UKY2xpZW50cyBtYXkgYmUgZXhwZWN0ZWQgdG8gIm92ZXJyaWRlIiBhbnkgZGVmYXVsdCBhbGFybSBwcmVzZW50IGluCmNhbGVuZGFyIGRhdGEgd2l0aCB0aGUgY3VycmVudCB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgc2VydmVyLiAgVGhpcwpjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtPiBhbmQgYWNjZXB0cyBhbGwgb2YKaXRzIG1ldGhvZHMuCgpUaGlzIGVsZW1lbnQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBvZmZpY2lhbCBpQ2FsIFJGQywgYnV0IGlzIHJhdGhlciBhbgp1bmFjY2VwdGVkIGRyYWZ0IHN0YW5kYXJkOyBzZWUKTDxodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtZGFib28tdmFsYXJtLWV4dGVuc2lvbnMtMDQjc2VjdGlvbi0xMT4KQjxJdHMgaW50ZXJvcGVyYWJpbGl0eSBhbmQgc3VwcG9ydCBpcyB0aHVzIGxpbWl0ZWQuPiBUaGlzIGlzIGFsYXJtIHR5cGUKaXMgcHJpbWFyaWx5IHVzZWQgYnkgQXBwbGUuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldwoKQ3JlYXRlcyBhIG5ldyBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6Tm9uZT4gb2JqZWN0OyBzZXRzIGl0cwpDPEFDVElPTj4gcHJvcGVydHkgdG8gQzxOT05FPi4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAkc2VsZiAgPSAkY2xhc3MtPlNVUEVSOjpuZXcoQF8pOwogICAgJHNlbGYtPmFkZF9wcm9wZXJ0eSggYWN0aW9uID0+ICJOT05FIiApOwogICAgcmV0dXJuICRzZWxmOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkRpc3BsYXk7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6RGlzcGxheSAtIFJlcHJlc2VudHMgYSBkaXNwbGF5ZWQgYWxhcm0gaW4gYW4gaUNhbGVuZGFyIGZpbGUKCj1oZWFkMSBTWU5PUFNJUwoKICAgIG15ICR2YWxhcm0gPSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkRpc3BsYXktPm5ldygpOwogICAgJHZhbGFybS0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgZGVzY3JpcHRpb24gPT4gIldha2UgdXAhIiwKICAgICAgICAjIERhdCplKjo6SUNhbCBpcyBub3QgYSB0eXBvIGhlcmUKICAgICAgICB0cmlnZ2VyICAgPT4gWyBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IC4uLiApLT5pY2FsLCB7IHZhbHVlID0+ICdEQVRFLVRJTUUnIH0gXSwKICAgICk7CgogICAgJHZldmVudC0+YWRkX2VudHJ5KCR2YWxhcm0pOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpEaXNwbGF5PiBvYmplY3QgcmVwcmVzZW50cyBhIGFsYXJtIHRoYXQKZGlzcGxheXMgYSBtZXNzYWdlIHdoaWNoIGlzIGF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluIGFuCmlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUgaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcwoiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZiBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kCmFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkRpc3BsYXk+IG9iamVjdDsgc2V0cyBpdHMKQzxBQ1RJT04+IHByb3BlcnR5IHRvIEM8RElTUExBWT4uCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgJHNlbGYgID0gJGNsYXNzLT5TVVBFUjo6bmV3KEBfKTsKICAgICRzZWxmLT5hZGRfcHJvcGVydHkoIGFjdGlvbiA9PiAiRElTUExBWSIgKTsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKSW4gYWRkaXRpb24gdG8gQzxhY3Rpb24+IGFuZCBDPHRyaWdnZXI+IChzZWUKTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzPiksIGRpc3BsYXllZAphbGFybXMgbXVzdCBhbHNvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgQzxkZXNjcmlwdGlvbj4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHJldHVybiAoCiAgICAgICAgc2hpZnQtPlNVUEVSOjptYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgImRlc2NyaXB0aW9uIiwKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlVSSTsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5OjpBbGFybS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpVUkkgLSBSZXByZXNlbnRzIG5vdGlmaWNhdGlvbiB2aWEgYSBjdXN0b20gVVJJCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmFsYXJtID0gRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpVUkktPm5ldygpOwogICAgJHZhbGFybS0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgdXJpID0+ICJzbXM6KzE1MTA1NTUwMTAxP2JvZHk9aGVsbG8lMjB0aGVyZSIsCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgdHJpZ2dlciAgID0+IFsgRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiAuLi4gKS0+aWNhbCwgeyB2YWx1ZSA9PiAnREFURS1USU1FJyB9IF0sCiAgICApOwoKICAgICR2ZXZlbnQtPmFkZF9lbnRyeSgkdmFsYXJtKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6VVJJPiBvYmplY3QgcmVwcmVzZW50cyBhbiBhbGFybSB0aGF0Cm5vdGlmaWVzIHZpYSBhcmJpdHJhcnkgVVJJIHdoaWNoIGlzIGF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluCmFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUgaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcwoiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZiBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kCmFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKVGhpcyBlbGVtZW50IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgb2ZmaWNpYWwgaUNhbCBSRkMsIGJ1dCBpcyByYXRoZXIgYW4KdW5hY2NlcHRlZCBkcmFmdCBzdGFuZGFyZDsgc2VlCkw8aHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWRhYm9vLXZhbGFybS1leHRlbnNpb25zLTA0I3NlY3Rpb24tNj4KQjxJdHMgaW50ZXJvcGVyYWJpbGl0eSBhbmQgc3VwcG9ydCBpcyB0aHVzIGxpbWl0ZWQuPiBUaGlzIGlzIGFsYXJtIHR5cGUKaXMgcHJpbWFyaWx5IHVzZWQgYnkgQXBwbGUuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldwoKQ3JlYXRlcyBhIG5ldyBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6QWxhcm0+IG9iamVjdDsgc2V0cyBpdHMKQzxBQ1RJT04+IHByb3BlcnR5IHRvIEM8Tk9ORT4uCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgJHNlbGYgID0gJGNsYXNzLT5TVVBFUjo6bmV3KEBfKTsKICAgICRzZWxmLT5hZGRfcHJvcGVydHkoIGFjdGlvbiA9PiAiVVJJIiApOwogICAgcmV0dXJuICRzZWxmOwp9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGFjdGlvbj4gYW5kIEM8dHJpZ2dlcj4gKHNlZQpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybS9tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXM+KSwgdXJpIGFsYXJtcwptdXN0IGFsc28gc3BlY2lmeSBhIHZhbHVlIGZvciBDPHVyaT4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHJldHVybiAoCiAgICAgICAgc2hpZnQtPlNVUEVSOjptYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgInVyaSIsCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkVtYWlsOwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtLzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkVtYWlsIC0gUmVwcmVzZW50cyBhbiBlbWFpbGVkIGFsYXJtIGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmFsYXJtID0gRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpBdWRpby0+bmV3KCk7CiAgICAkdmFsYXJtLT5hZGRfcHJvcGVydGllcygKICAgICAgICBhdHRhY2ggPT4gWyAiYmFzaWM6ZnRwOi8vaG9zdC5jb20vcHViL3NvdW5kcy9iZWxsLTAxLmF1ZCIsIHsgZm10dHlwZSA9PiAiYXVkaW8vYmFzaWMiIH0gXSwKICAgICAgICAjIERhdCplKjo6SUNhbCBpcyBub3QgYSB0eXBvIGhlcmUKICAgICAgICB0cmlnZ2VyICAgPT4gWyBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IC4uLiApLT5pY2FsLCB7IHZhbHVlID0+ICdEQVRFLVRJTUUnIH0gXSwKICAgICk7CgogICAgJHZldmVudC0+YWRkX2VudHJ5KCR2YWxhcm0pOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpFbWFpbD4gb2JqZWN0IHJlcHJlc2VudHMgYW4gZW1haWxlZAphbGFybSBhdHRhY2hlZCB0byBhIHRvZG8gaXRlbSBvciBldmVudCBpbiBhbiBpQ2FsZW5kYXIgZmlsZS4gIChOb3RlCnRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzIHRvIGVudHJpZXMgYXMgImNvbXBvbmVudHMiLikgIEl0IGlzIGEKc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0+IGFuZCBhY2NlcHRzIGFsbCBvZiBpdHMgbWV0aG9kcy4KClRoZSBDPGF0dGVuZGVlPiBwcm9wZXJ0aWVzIGFyZSBpbnRlbmRlZCBhcyB0aGUgcmVjaXBpZW50IGxpc3Qgb2YgdGhlCmVtYWlsOyB0aGUgQzxzdW1tYXJ5PiBhcyBpdHMgc3ViamVjdDsgdGhlIEM8ZGVzY3JpcHRpb24+IGFzIGl0cyBib2R5OwphbmQgdGhlIEM8YXR0YWNoPiBhcyBpdHMgYXR0YWNobWVudHMuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldwoKQ3JlYXRlcyBhIG5ldyBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6RW1haWw+IG9iamVjdDsgc2V0cyBpdHMKQzxBQ1RJT04+IHByb3BlcnR5IHRvIEM8RU1BSUw+LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CiAgICAkc2VsZi0+YWRkX3Byb3BlcnR5KCBhY3Rpb24gPT4gIkVNQUlMIiApOwogICAgcmV0dXJuICRzZWxmOwp9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGFjdGlvbj4gYW5kIEM8dHJpZ2dlcj4gKHNlZQpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybS9tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXM+KSwgZW1haWxlZCBhbGFybXMKbXVzdCBhbHNvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgQzxkZXNjcmlwdGlvbj4gYW5kIEM8c3VtbWFyeT4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHJldHVybiAoCiAgICAgICAgc2hpZnQtPlNVUEVSOjptYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgImRlc2NyaXB0aW9uIiwgInN1bW1hcnkiLAogICAgKTsKfQoKPWhlYWQyIG1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgQzxhdHRlbmRlZT4gcHJvcGVydHkgbXVzdCBiZQpzcGVjaWZpZWQgYXQgbGVhc3Qgb25jZSBmb3IgYW4gZW1haWxlZCBhbGFybS4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGF0dGVuZGVlCiAgICApOwp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIEM8YXR0YWNoPiBwcm9wZXJ0eSBtYXkgYmUKc3BlY2lmaWVkIGFueSBudW1iZXIgb2YgdGltZXMgZm9yIGFuIGVtYWlsZWQgYWxhcm0uCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGF0dGFjaAogICAgKTsKfQoKPWhlYWQxIEFVVEhPUgoKQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMgRTxsdD5tb2R1bGVzQGJlc3RwcmFjdGljYWwuY29tRTxndD4KCj1oZWFkMSBMSUNFTkNFIEFORCBDT1BZUklHSFQKCkNvcHlyaWdodCAoYykgMjAwNSAtIDIwMTUsIEJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIFNlZSBMPHBlcmxhcnRpc3RpYz4uCgo9Y3V0CgoxOwo=
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkF1ZGlvOwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtLzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkF1ZGlvIC0gUmVwcmVzZW50cyBhbiBhdWRpbyBhbGFybSBpbiBhbiBpQ2FsZW5kYXIgZmlsZQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZhbGFybSA9IERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6QXVkaW8tPm5ldygpOwogICAgJHZhbGFybS0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgYXR0YWNoID0+IFsgImZ0cDovL2hvc3QuY29tL3B1Yi9zb3VuZHMvYmVsbC0wMS5hdWQiLCB7IGZtdHR5cGUgPT4gImF1ZGlvL2Jhc2ljIiB9IF0sCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgdHJpZ2dlciAgID0+IFsgRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiAuLi4gKS0+aWNhbCwgeyB2YWx1ZSA9PiAnREFURS1USU1FJyB9IF0sCiAgICApOwoKICAgICR2ZXZlbnQtPmFkZF9lbnRyeSgkdmFsYXJtKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6QXVkaW8+IG9iamVjdCByZXByZXNlbnRzIGFuIGF1ZGlvIGFsYXJtCmF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluIGFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUKaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcyAiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZgpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkF1ZGlvPiBvYmplY3Q7IHNldHMgaXRzCkM8QUNUSU9OPiBwcm9wZXJ0eSB0byBDPEFVRElPPi4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAkc2VsZiAgPSAkY2xhc3MtPlNVUEVSOjpuZXcoQF8pOwogICAgJHNlbGYtPmFkZF9wcm9wZXJ0eSggYWN0aW9uID0+ICJBVURJTyIgKTsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGR1cmF0aW9uPiBhbmQgQzxyZXBlYXQ+IChzZWUKTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXM+KSwgYXVkaW8gYWxhcm1zCm1heSBzcGVjaWZ5IGEgdmFsdWUgZm9yIEM8YXR0YWNoPi4KCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7CiAgICByZXR1cm4gKAogICAgICAgIHNoaWZ0LT5TVVBFUjo6b3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgImF0dGFjaCIsCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
IyAkUmV2OiA2NzggJApwYWNrYWdlIERhdGU6OklDYWw7CnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdygkVkVSU0lPTiAkbG9jYWx6b25lICRsb2NhbG9mZnNldCBAbW9udGhzIEBsZWFwbW9udGhzICVhZGRfdW5pdHMpOwokVkVSU0lPTiA9ICcyLicuKHF3JyRSZXY6IDY3OCAkJylbMV07CnVzZSBDYXJwOwp1c2UgVGltZTo6TG9jYWw7CnVzZSBEYXRlOjpMZWFweWVhciBxdygpOwp1c2UgRGF0ZTo6SUNhbDo6RHVyYXRpb247CnVzZSBvdmVybG9hZCAnPD0+JyA9PiAnY29tcGFyZScsCiAgICAgICAgICAgICAnZmFsbGJhY2snID0+IDEsCiAgICAgICAgICAgICAnLScgPT4gXCZzdWJ0cmFjdCwKICAgICAgICAgICAgICcrJyA9PiBcJmFkZF9vdmVybG9hZDsKCiRsb2NhbHpvbmUgICA9ICRFTlZ7VFp9IHx8IDA7CiRsb2NhbG9mZnNldCA9IF9jYWxjX2xvY2FsX29mZnNldCgpOwoKIyBEb2N1bWVudGF0aW9uIHt7ewoKPWhlYWQxIE5BTUUKCkRhdGU6OklDYWwgLSBQZXJsIGV4dGVuc2lvbiBmb3IgSUNhbGVuZGFyIGRhdGUgb2JqZWN0cy4KCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDY3OCAkCgo9aGVhZDEgU1lOT1BTSVMKCiAgICB1c2UgRGF0ZTo6SUNhbDsKCiAgICAkaWNhbCA9IERhdGU6OklDYWwtPm5ldyggaWNhbCA9PiAnMTk5NzEwMjRUMTIwMDAwJyApOwogICAgJGljYWwgPSBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IHRpbWUgKTsKICAgICRpY2FsID0gRGF0ZTo6SUNhbC0+bmV3KCB5ZWFyID0+IDE5NjQsCiAgICAgICAgbW9udGggPT4gMTAsIGRheSA9PiAxNiwgaG91ciA9PiAxNiwKICAgICAgICBtaW4gPT4gMTIsIHNlYyA9PiA0NyApOwoKICAgICRob3VyID0gJGljYWwtPmhvdXI7CiAgICAkeWVhciA9ICRpY2FsLT55ZWFyOwoKICAgICRpY2FsX3N0cmluZyA9ICRpY2FsLT5pY2FsOwogICAgJGVwb2NoX3RpbWUgPSAkaWNhbC0+ZXBvY2g7CgogICAgJGljYWwyID0gJGljYWwgKyAkZHVyYXRpb247CgooV2hlcmUgJGR1cmF0aW9uIGlzIGVpdGhlciBhIGR1cmF0aW9uIHN0cmluZywgbGlrZSAnUDJXM0RUN0g5TScsIG9yIGEKRGF0ZTo6SUNhbDo6RHVyYXRpb24gKHF2KSBvYmplY3QuCgogICAgJGljYWwgKz0gJ1A2RFQxMkgnOwoKICAgICRkdXJhdGlvbiA9ICRpY2FsIC0gJGljYWwyOwogICAgJGljYWwzID0gJGljYWwgLSAkZHVyYXRpb247Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkRhdGU6OklDYWwgdGFsa3MgdGhlIElDYWwgZGF0ZSBmb3JtYXQsIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIGJhc2UgY2xhc3MgZm9yCm90aGVyIGRhdGUvY2FsZW5kYXIgbW9kdWxlcyB0aGF0IGtub3cgYWJvdXQgSUNhbCB0aW1lIGZvcm1hdCBhbHNvLgoKPWhlYWQxIEFVVEhPUgoKUmljaCBCb3dlbiwgYW5kIHRoZSBSZWVma25vdCB0ZWFtLiBBbGFzLCBSZWVma25vdCBpcyBubyBtb3JlLiBTZWUKaHR0cDovL2RhdGV0aW1lLnBlcmwub3JnLyBmb3IgbW9yZSBtb2Rlcm4gYW5kIGFjY3VyYXRlIG1vZHVsZXMuCgpMYXN0IHRvdWNoZWQgYnkgJEF1dGhvcjogcmJvd2VuICQKCj1oZWFkMSBNRVRIT0RTCgpEYXRlOjpJQ2FsIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXZhaWxhYmxlOgoKPWhlYWQyIG5ldwoKQSBuZXcgRGF0ZTo6SUNhbCBvYmplY3QgY2FuIGJlIGNyZWF0ZWQgd2l0aCBhbnkgdmFsaWQgSUNhbCBzdHJpbmc6CgogICAgbXkgJGljYWwgPSBEYXRlOjpJQ2FsLT5uZXcoIGljYWwgPT4gJzE5OTcxMDI0VDEyMDAwMCcgKTsKICAgICMgd2lsbCBkZWZhdWx0IHRvIHRoZSB0aW1lem9uZSBzcGVjaWZpZWQgaW4gJFRaLCBzZWUgYmVsb3cKCk9yIHdpdGggYW55IGVwb2NoIHRpbWU6CgogICAgbXkgJGljYWwgPSBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IHRpbWUgKTsKCk9yLCBiZXR0ZXIgc3RpbGwsIGNyZWF0ZSBpdCB3aXRoIGNvbXBvbmVudHMKCiAgICBteSAkZGF0ZSA9IERhdGU6OklDYWwtPm5ldyggCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheSA9PiAyNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0+IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PiAxMDY2LAogICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0+IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9PiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjID0+IDQ3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgpJZiB5b3UgY2FsbCBuZXcgd2l0aG91dCBhbnkgYXJndW1lbnRzLCB5b3UnbGwgZ2V0IGEgRGF0ZTo6SUNhbCBvYmplY3QgdGhhdCBpcwpzZXQgdG8gdGhlIHRpbWUgcmlnaHQgbm93LgoKICAgIG15ICRpY2FsID0gRGF0ZTo6SUNhbC0+bmV3KCk7CgpJZiB5b3UgYWxyZWFkeSBoYXZlIGFuIG9iamVjdCBpbiBEYXRlOjpJQ2FsLCBvciBzb21lIG90aGVyIHN1YmNsYXNzCnRoZXJlb2YsIHlvdSBjYW4gY3JlYXRlIGEgbmV3IERhdGU6OklDYWwgKG9yIHN1YmNsYXNzKSBvYmplY3QgdXNpbmcKdGhhdCBvYmplY3QgdG8gc3RhcnQgd2l0aC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBjb252ZXJ0aW5nCmZyb20gb25lIGNhbGVuZGFyIHRvIGFub3RoZXI6CgogICAjIERpcmVjdCBjb252ZXJzaW9uIGZyb20gRGlzY29yZGlhbiB0byBJU08gZGF0ZXMKICAgbXkgJGRpc2NvID0gRGF0ZTo6RGlzY29yZGlhbi0+bmV3KCBkaXNjbyA9PiAnMTIgQ2hhb3MsIFlPTEQgMzE3NycgKTsKICAgbXkgJGlzbyA9IERhdGU6OklTTy0+bmV3KCAkZGlzY28gKTsKICAgcHJpbnQgJGlzby0+aXNvOwoKbmV3KCkgaGFuZGxlcyB0aW1lem9uZXMuIEl0IGRlZmF1bHRzIHRpbWVzIHRvIFVUQyAoR3JlZW53aWNoCk1lYW4gVGltZSwgYWxzbyBjYWxsZWQgWnVsdSkuIElmIHlvdSB3YW50IHRvIHNldCB1cCBhIHRpbWUKdGhhdCdzIGluIHRoZSBVUyAiUGFjaWZpYyIgdGltZXpvbmUsIHdoaWNoIGlzIEdNVC04LCB1c2Ugc29tZXRoaW5nCmxpa2U6CiAgICAKICAgIG15ICRpY2FsID0gRGF0ZTo6SUNhbC0+bmV3KCBpY2FsID0+ICcxOTk3MTAyNFQxMjAwMDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9PiAiLTA4MDAiKTsKICAgCk5vdGUgdGhhdCBhcyBvZiB2ZXJzaW9uIDEuNDQsIG5ldygpIHRyaWVzIHRvIGJlIGludGVsbGlnZW50CmFib3V0IGZpZ3VyaW5nIG91dCB5b3VyIGxvY2FsIHRpbWUgem9uZS4gSWYgeW91IGVudGVyCmEgdGltZSB0aGF0J3Mgbm90ICpleHBsaWNpdGx5KiBpbiBVVEMsIGl0IGxvb2tzIGF0CnRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkVFosIGlmIGl0IGV4aXN0cywgdG8gZGV0ZXJtaW5lCnlvdXIgbG9jYWwgb2Zmc2V0LiBJZiAkVFogaXNuJ3Qgc2V0LCBuZXcoKSB3aWxsIGNvbXBsYWluLgoKPWN1dAoKI319fQoKI3t7eyBzdWIgbmV3CgpzdWIgbmV3IHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgKCAkc2VsZiwgJWFyZ3MsICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyLCAkdHogKTsKCiAgICAjICR6ZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyB0aW1lIGlzIG5hdGl2ZWx5IGluIFVUQyAgICAKICAgIG15ICR6ZmxhZyA9IDA7CgogICAgIyBGaXJzdCBhcmd1bWVudCBjYW4gYmUgYSBEYXRlOjpJQ2FsIChvciBzdWJjbGFzcyB0aGVyZW9mKSBvYmplY3QKICAgIGlmICggcmVmICRfWzBdICkgewogICAgICAgICRhcmdze2ljYWx9ID0gJF9bMF0tPmljYWw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJWFyZ3MgPSBAXzsKICAgIH0KCiAgICAkc2VsZiA9IHt9OwoKICAgICMgRGF0ZSBpcyBzcGVjaWZpZWQgYXMgZXBvY2gje3t7CiAgICBpZiAoIGRlZmluZWQoICRhcmdze2Vwb2NofSApICkgewoKICAgICAgICAoICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyICkgPQogICAgICAgICAgKCBnbXRpbWUoICRhcmdze2Vwb2NofSApIClbIDAsIDEsIDIsIDMsIDQsIDUgXTsKICAgICAgICAkeWVhciArPSAxOTAwOwogICAgICAgICRtb250aCsrOwoKICAgICAgICAkemZsYWcgPSAxOyAgICAjIGVwb2NoIHRpbWVzIGFyZSBieSBkZWZpbml0aW9uIGluIEdNVAogICAgfSAgICAjfX19CgogICAgIyBEYXRlIGlzIHNwZWNpZmllZCBhcyBpY2FsIHN0cmluZyN7e3sKICAgIGVsc2lmICggZGVmaW5lZCggJGFyZ3N7aWNhbH0gKSApIHsKCiAgICAgICAgIyBUaW1lem9uZSwgaWYgYW55CiAgICAgICAgJGFyZ3N7aWNhbH0gPX4gcy9eKD86VFpJRD0oW146XSspOik/Ly87CiAgICAgICAgJHR6ID0gJDE7CgogICAgICAgICMgU3BsaXQgdXAgaWNhbCBzdHJpbmcKICAgICAgICAoICR5ZWFyLCAkbW9udGgsICRkYXksICRob3VyLCAkbWluLCAkc2VjLCAkemZsYWcgKSA9CiAgICAgICAgICAkYXJnc3tpY2FsfSA9fiAvXig/OihcZHs0fSkoXGRcZCkoXGRcZCkpCiAgICAgICAgICAgICAgICg/OlQoXGRcZCk/KFxkXGQpPyhcZFxkKT8pPwogICAgICAgICAgICAgICAgICAgICAgICAgKFopPyQveDsKCiAgICAgICAgIyBUT0RPOiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaWYgd2UgZ2V0IGEgVFpJRC4gCiAgICAgICAgIyBJJ2Qgc3VnZ2VzdCB3ZSBzdG9yZSBpdCBmb3IgdXNlIGJ5IG1vZHVsZXMgdGhhdCBjYXJlCiAgICAgICAgIyBhYm91dCBUWklEIG5hbWVzLiBCdXQgd2UgZG9uJ3Qgd2FudCB0aGlzIG1vZHVsZQogICAgICAgICMgdG8gZGVhbCB3aXRoIHRpbWV6b25lIG5hbWVzLCBvbmx5IG9mZnNldHMsIEkgdGhpbmsuCiAgICAgICAgIyAtLXNybAoKICAgIH0gICAgI319fQoKICAgICMgVGltZSBzcGVjaWZpZWQgYXMgY29tcG9uZW50cyN7e3sKICAgIGVsc2lmICggZGVmaW5lZCggJGFyZ3N7ZGF5fSApICkgewoKICAgICAgICAjIENob2tlIGlmIG1pc3NpbmcgYXJndW1lbnRzCiAgICAgICAgZm9yZWFjaCBteSAkYXR0cmliKHF3KGRheSBtb250aCB5ZWFyICkpIHsKICAgICAgICAgICAgd2FybiAiQXR0cmlidXRlICRhdHRyaWIgcmVxdWlyZWQiIHVubGVzcyBkZWZpbmVkICRhcmdzeyRhdHRyaWJ9OwogICAgICAgIH0KICAgICAgICBmb3JlYWNoIG15ICRhdHRyaWIocXcoIGhvdXIgbWluIHNlYyApKSB7CiAgICAgICAgICAgICRhcmdzeyRhdHRyaWJ9ID0gMCB1bmxlc3MgZGVmaW5lZCAkYXJnc3skYXR0cmlifTsKICAgICAgICB9CgogICAgICAgICMgQW5kIHRoZW4ganVzdCB1c2Ugd2hhdCB3YXMgcGFzc2VkIGluCiAgICAgICAgKCAkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciApID0KICAgICAgICAgIEBhcmdzeyAnc2VjJywgJ21pbicsICdob3VyJywgJ2RheScsICdtb250aCcsICd5ZWFyJyB9OwoKICAgIH0gICAgI319fQoKICAgIGVsc2UgeyAgICAjIEp1c3QgdXNlIGN1cnJlbnQgZ210aW1lI3t7ewoKICAgICAgICAjIFNpbmNlIHdlIGFyZSBkZWZhdWx0aW5nLCB0aGlzIHF1YWxpZmllcyBhcyBVVEMKICAgICAgICAkemZsYWcgPSAxOwoKICAgICAgICAoICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyICkgPSAoIGdtdGltZSh0aW1lKSApWyAwIC4uIDUgXTsKICAgICAgICAkeWVhciArPSAxOTAwOwogICAgICAgICRtb250aCsrOwogICAgfSAgICAjfX19CgogICAgJHNlbGYtPntqdWxpYW59ID0gZ3JlZzJqZCggJHllYXIsICRtb250aCwgJGRheSApOwogICAgJHNlbGYtPntqdWxzZWN9ID0gdGltZV9hc19zZWNvbmRzKCAkaG91ciwgJG1pbiwgJHNlYyApOwogICAgYmxlc3MgJHNlbGYsICRjbGFzczsKCiAgICBpZiAoIGV4aXN0cyggJGFyZ3N7b2Zmc2V0fSApICkgewogICAgICAgICMgV2Ugc2hvdWxkIGNvbXBsYWluIGlmIHRoZXkncmUgdHJ5aW5nIHRvIHNldCBhIG5vbi1VVEMKICAgICAgICAjIG9mZnNldCBvbiBhIHRpbWUgdGhhdCdzIGluaGVyZW50bHkgVVRDLiAgLWp2CiAgICAgICAgaWYgKCR6ZmxhZyAmJiAoJGFyZ3N7b2Zmc2V0fSAhPSAwKSkgewogICAgICAgICAgICBjYXJwICJUaW1lIGhhZCBjb25mbGljdGluZyBvZmZzZXQgYW5kIFVUQyBpbmZvLiBVc2luZyBVVEMiCiAgICAgICAgICAgICAgdW5sZXNzICRFTlZ7SEFSTkVTU19BQ1RJVkV9OwogICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICMgU2V0IHVwIHRoZSBvZmZzZXQgZm9yIHRoaXMgZGF0ZXRpbWUuCiAgICAgICAgICAgICRzZWxmLT5vZmZzZXQoICRhcmdze29mZnNldH0gfHwgMCApOwogICAgICAgIH0KICAgICAgfSBlbHNpZiAoICEkemZsYWcgKSB7CgogICAgICAgICMgQ2hlY2sgaWYgdGhlIHRpbWV6b25lIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgY2hlY2tlZC4KICAgICAgICAjIEFwcGFyZW50bHkgdGhpcyBoYXBwZW5zIG9uIHNvbWUgc3lzdGVtcy4gUGF0Y2ggZnJvbSBNaWtlCiAgICAgICAgIyBIZWlucy4gQXNrIGhpbS4KICAgICAgICBteSAkdHogID0gJEVOVntUWn0gfHwgJzAnOwogICAgICAgIG15ICRsb2MgPSAkdHogZXEgJGxvY2Fsem9uZSA/ICRsb2NhbG9mZnNldCA6IF9jYWxjX2xvY2FsX29mZnNldCgpOwogICAgICAgICRzZWxmLT5vZmZzZXQoJGxvYykgaWYgZGVmaW5lZCAkc2VsZjsKICAgIH0KCiAgICByZXR1cm4gJHNlbGY7Cn0KCiN9fX0KCiN7e3sgc3ViIGljYWwKCj1oZWFkMiBpY2FsCgogICAgJGljYWxfc3RyaW5nID0gJGljYWwtPmljYWw7CgpSZXRyaWV2ZXMsIG9yIHNldHMsIHRoZSBkYXRlIG9uIHRoZSBvYmplY3QsIHVzaW5nIGFueSB2YWxpZCBJQ2FsIGRhdGUvdGltZQpzdHJpbmcuIE91dHB1dCBpcyBpbiBVVEMgKGVuZHMgd2l0aCBhICJaIikgYnkgZGVmYXVsdC4gVG8gZ2V0Cm91dHB1dCBpbiBsb2NhbHRpbWUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbWFjaGluZSwgZG86CiAgICAKICAgICRpY2FsX3N0cmluZyA9ICRpY2FsLT5pY2FsKCBsb2NhbHRpbWUgPT4gMSApOwoKVG8gZ2V0IG91dHB1dCByZWxhdGl2ZSB0byBhbiBhcmJpdHJhcnkgb2Zmc2V0LCBkbzoKCiAgICAkaWNhbF9zdHJpbmcgPSAkaWNhbC0+aWNhbCggb2Zmc2V0ID0+ICcrMDU0NScgKTsKCj1jdXQKCnN1YiBpY2FsIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAoIDEgJiBAXyApIHsgICAgICMgb2RkIG51bWJlciBvZiBwYXJhbWV0ZXJzPwogICAgICAgIGNhcnAgIkJhZCBhcmdzOiBleHBlY3RlZCBuYW1lZCBwYXJhbWV0ZXIgbGlzdCI7CiAgICAgICAgc2hpZnQ7ICAgICMgYXZvaWQgd2FybmluZyBmcm9tICVhcmdzPUBfIGFzc2lnbm1lbnQKICAgIH0KICAgIG15ICVhcmdzID0gQF87CiAgICBteSAkaWNhbDsKCiAgICBpZiAoIGV4aXN0cyAkYXJnc3tsb2NhbHRpbWV9ICkgewogICAgICAgIGNhcnAgImNhbid0IGhhdmUgbG9jYWx0aW1lIGFuZCBvZmZzZXQgdG9nZXRoZXIsIHVzaW5nIGxvY2FsdGltZSBvZmZzZXQiCiAgICAgICAgICBpZiBleGlzdHMgJGFyZ3N7b2Zmc2V0fTsKCiAgICAgICAgIyBtYWtlIG91dHB1dCBpbiBsb2NhbHRpbWUgZm9ybWF0IGJ5IHNldHRpbmcgJGFyZ3N7b2Zmc2V0fQogICAgICAgICRhcmdze29mZnNldH0gPSAkc2VsZi0+b2Zmc2V0OwogICAgfQoKICAgIGlmICggZXhpc3RzICRhcmdze29mZnNldH0gKSB7CgogICAgICAgICMgbWFrZSBvdXRwdXQgYmFzZWQgb24gYW4gYXJiaXRyYXJ5IG9mZnNldAogICAgICAgICMgTm8gWiBvbiB0aGUgZW5kIQogICAgICAgIG15ICRqdWxpYW4gPSAkc2VsZi0+e2p1bGlhbn07CiAgICAgICAgbXkgJGp1bHNlYyA9ICRzZWxmLT57anVsc2VjfTsKICAgICAgICBteSAkYWRqdXN0ID0gb2Zmc2V0X3RvX3NlY29uZHMoICRhcmdze29mZnNldH0gKTsKICAgICAgICAkc2VsZi0+YWRkKCBzZWNvbmRzID0+ICRhZGp1c3QgKTsKICAgICAgICAkaWNhbCA9CiAgICAgICAgICBzcHJpbnRmKCAnJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCcsICRzZWxmLT55ZWFyLCAkc2VsZi0+bW9udGgsCiAgICAgICAgICAkc2VsZi0+ZGF5LCAkc2VsZi0+aG91ciwgJHNlbGYtPm1pbnV0ZSwgJHNlbGYtPnNlY29uZCwgKTsKICAgICAgICAkc2VsZi0+e2p1bGlhbn0gPSAkanVsaWFuOwogICAgICAgICRzZWxmLT57anVsc2VjfSA9ICRqdWxzZWM7CiAgICAgIH0gZWxzZSB7CgogICAgICAgICMgbWFrZSBvdXRwdXQgaW4gVVRDIGJ5IGRlZmF1bHQKICAgICAgICAjIGlmIHdlIHdlcmUgb3JpZ2luYWxseSBnaXZlbiB0aGlzIHRpbWUgaW4gb2Zmc2V0CiAgICAgICAgIyBmb3JtLCB3ZSdsbCBuZWVkIHRvIGFkanVzdCBpdCBmb3Igb3V0cHV0CiAgICAgICAgaWYgKCAkc2VsZi0+aG91ciB8fCAkc2VsZi0+bWluIHx8ICRzZWxmLT5zZWMgKSB7CiAgICAgICAgICAgICRpY2FsID0KICAgICAgICAgICAgICBzcHJpbnRmKCAnJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZFonLCAkc2VsZi0+eWVhciwgJHNlbGYtPm1vbnRoLAogICAgICAgICAgICAgICRzZWxmLT5kYXksICRzZWxmLT5ob3VyLCAkc2VsZi0+bWludXRlLCAkc2VsZi0+c2Vjb25kICk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkaWNhbCA9CiAgICAgICAgICAgICAgc3ByaW50ZiggJyUwNGQlMDJkJTAyZFonLCAkc2VsZi0+eWVhciwgJHNlbGYtPm1vbnRoLCAkc2VsZi0+ZGF5ICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkaWNhbDsKfSAgICAjfX19Cgoje3t7IHN1YiBlcG9jaAoKPWhlYWQyIGVwb2NoCgogICAgJGVwb2NoX3RpbWUgPSAkaWNhbC0+ZXBvY2g7CiAgICAKICAgICRpY2FsLT5lcG9jaCggOTg2ODc0MzEgKTsKClNldHMsIG9yIHJldHJpZXZlcywgdGhlIGVwb2NoIHRpbWUgcmVwcmVzZW50ZWQgYnkgdGhlIG9iamVjdCwgaWYgaXQgaXMKcmVwcmVzZW50YWJsZSBhcyBzdWNoLiAoRGF0ZXMgYmVmb3JlIDE5NzEgb3IgYWZ0ZXIgMjAzOCB3aWxsIG5vdCBoYXZlIGFuIGVwb2NoCnJlcHJlc2VudGF0aW9uLikKCkludGVybmFscyBub3RlOiBUaGUgSUNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0ZSBpcyBjb25zaWRlcmVkIHRoZSBvbmx5CmF1dGhvcml0YXRpdmUgb25lLiBUaGlzIG1lYW5zIHRoYXQgd2UgbWF5IG5lZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIGVwb2NoIHRpbWUKZnJvbSB0aGUgSUNhbCByZXByZXNlbnRhdGlvbiBpZiB3ZSBhcmUgbm90IHN1cmUgdGhhdCB0aGV5IGFyZSBpbiBzeW5jaC4gV2UnbGwKbmVlZCB0byBkbyBjbGV2ZXIgdGhpbmdzIHRvIGtlZXAgdHJhY2sgb2Ygd2hlbiB0aGUgdHdvIG1heSBub3QgYmUgaW4gc3luY2guCkFuZCwgb2YgY291cnNlLCB0aGUgc2FtZSB3aWxsIGdvIGZvciBhbnkgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzLgoKPWN1dAoKc3ViIGVwb2NoIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGNsYXNzID0gcmVmKCRzZWxmKTsKCiAgICBteSAkZXBvY2g7CgogICAgaWYgKCAkZXBvY2ggPSBzaGlmdCApIHsgICAgIyBQYXNzZWQgaW4gYSBuZXcgdmFsdWUKCiAgICAgICAgbXkgJG5ld2Vwb2NoID0gJGNsYXNzLT5uZXcoIGVwb2NoID0+ICRlcG9jaCApOwogICAgICAgICRzZWxmLT57anVsaWFufSA9ICRuZXdlcG9jaC0+e2p1bGlhbn07CiAgICAgICAgJHNlbGYtPntqdWxzZWN9ID0gJG5ld2Vwb2NoLT57anVsc2VjfTsKCiAgICB9CgogICAgZWxzZSB7ICAgICMgQ2FsY3VsYXRlIGVwb2NoIGZyb20gY29tcG9uZW50cywgaWYgcG9zc2libGUKCiAgICAgICAgJGVwb2NoID0KICAgICAgICAgIHRpbWVnbSggJHNlbGYtPnNlYywgJHNlbGYtPm1pbiwgJHNlbGYtPmhvdXIsICRzZWxmLT5kYXksCiAgICAgICAgICAoICRzZWxmLT5tb250aCApIC0gMSwgKCAkc2VsZi0+eWVhciApIC0gMTkwMCApOwogICAgfQoKICAgIHJldHVybiAkZXBvY2g7Cn0KCiN9fX0KCiN7e3sgc3ViIG9mZnNldF90b19zZWNvbmRzCgo9aGVhZDIgb2Zmc2V0X3RvX3NlY29uZHMKCiAgICAkc2Vjb25kc19wbHVzX29yX21pbnVzID0gb2Zmc2V0X3RvX3NlY29uZHMoJG9mZnNldCk7CiAgIApDaGFuZ2VzIC0wNjAwIHRvIC0yMTYwMC4gTm90IG9iamVjdCBtZXRob2QsIG5vIHNpZGUtZWZmZWN0cy4KCj1jdXQKCnN1YiBvZmZzZXRfdG9fc2Vjb25kcyB7CiAgICBteSAkb2Zmc2V0ID0gc2hpZnQ7CgogICAgIyBSZWxvY2F0ZWQgZnJvbSBvZmZzZXQgZm9yIHJlLXVzZQogICAgbXkgJG5ld29mZnNldDsKCiAgICBpZiAoICRvZmZzZXQgZXEgJzAnICkgewogICAgICAgICRuZXdvZmZzZXQgPSAwOwogICAgICB9IGVsc2lmICggJG9mZnNldCA9fiAvXihbKy1dKShcZFxkKShcZFxkKVx6LyApCiAgICB7CiAgICAgICAgbXkgKCAkc2lnbiwgJGhvdXJzLCAkbWludXRlcyApID0gKCAkMSwgJDIsICQzICk7CgogICAgICAgICMgY29udmVydCB0byBzZWNvbmRzLCBpZ25vcmluZyB0aGUgcG9zc2liaWxpdHkgb2YgbGVhcCBzZWNvbmRzCiAgICAgICAgIyBvciBkYXlsaWdodC1zYXZpbmdzLXRpbWUgc2hpZnRzCiAgICAgICAgJG5ld29mZnNldCA9ICRob3VycyAqIDYwICogNjAgKyAkbWludXRlcyAqIDYwOwogICAgICAgICRuZXdvZmZzZXQgKj0gLTEgaWYgJHNpZ24gZXEgJy0nOwogICAgICB9IGVsc2UgewogICAgICAgIGNhcnAoIllvdSBnYXZlIGFuIG9mZnNldCwgJG9mZnNldCwgdGhhdCBtYWtlcyBubyBzZW5zZSIpOwogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KICAgIHJldHVybiAkbmV3b2Zmc2V0Owp9CgojfX19Cgoje3t7IHN1YiBvZmZzZXRfZnJvbV9zZWNvbmRzCgo9aGVhZDIgb2Zmc2V0X2Zyb21fc2Vjb25kcwoKICAgICRzZWNvbmRzX3BsdXNfb3JfbWludXMgPSBvZmZzZXRfZnJvbV9zZWNvbmRzKCRvZmZzZXRfaW5fc2Vjb25kcyk7CiAgIApDaGFuZ2VzIC0xODAwMCAoc2Vjb25kcykgdG8gLTA2MDAgKGhvdXJzLCBtaW51dGVzKS4gCk5vdCBvYmplY3QgbWV0aG9kLCBubyBzaWRlLWVmZmVjdHMuCgo9Y3V0CgpzdWIgb2Zmc2V0X2Zyb21fc2Vjb25kcyB7CiAgICBteSAkc2Vjb2Zmc2V0ICA9IHNoaWZ0OwogICAgbXkgJGhobW1vZmZzZXQgPSAwOwoKICAgIGlmICggJHNlY29mZnNldCBuZSAnMCcgKSB7CiAgICAgICAgbXkgKCAkc2lnbiwgJHNlY3MgKSA9ICggIiIsICIiICk7CiAgICAgICAgKCAkc2lnbiwgJHNlY3MgKSA9ICRzZWNvZmZzZXQgPX4gLyhbKy1dKT8oXGQrKS87CgogICAgICAgICMgdGhyb3cgaW4gYSArIHRvIG1ha2UgdGhpcyBsb29rIGxpa2UgYW4gb2Zmc2V0IGlmIHBvc2l0aXZlCiAgICAgICAgJHNpZ24gPSAiKyIgdW5sZXNzICRzaWduOwoKICAgICAgICAjIE5PVEU6IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHJldHVybiAiKzAwMDAiIGlmIHlvdSBnaXZlIGl0IGEgbnVtYmVyCiAgICAgICAgIyBvZiBzZWNvbmRzIHRoYXQgYXJlIGEgbXVsdGlwbGUgb2YgYSBkYXkuIEhvd2V2ZXIsIGZvciBzcGVlZCByZWFzb25zCiAgICAgICAgIyBJJ20gbm90IGdvaW5nIHRvIHdyaXRlIGluIGEgY29tcGFyaXNvbiB0byByZWZvcm1hdCB0aGF0IGJhY2sgdG8gMC4KICAgICAgICAjIAogICAgICAgIG15ICRob3VycyA9ICRzZWNzIC8gKCA2MCAqIDYwICk7CiAgICAgICAgJGhvdXJzID0gJGhvdXJzICUgMjQ7CiAgICAgICAgbXkgJG1pbnMgPSAoICRzZWNzICUgKCA2MCAqIDYwICkgKSAvIDYwOwogICAgICAgICRoaG1tb2Zmc2V0ID0gc3ByaW50ZiggJyVzJTAyZCUwMmQnLCAkc2lnbiwgJGhvdXJzLCAkbWlucyApOwoKICAgIH0KCiAgICByZXR1cm4gJGhobW1vZmZzZXQ7Cn0KCiN9fX0KCiN7e3sgc3ViIG9mZnNldAoKPWhlYWQyIG9mZnNldCAKCiAgICAkb2Zmc2V0ID0gJGljYWwtPm9mZnNldDsKICAgCiAgICAjIFdlIG5lZWQgdGVzdHMgZm9yIHRoZXNlLiAgCiAgICAkaWNhbC0+b2Zmc2V0KCAnKzExMDAnICk7ICMgYSBudW1iZXIgb2YgaG91cnMgYW5kIG1pbnV0ZXM6IFVUQysxMQogICAgJGljYWwtPm9mZnNldCggMCApOyAgICAgICAjIHJlc2V0IHRvIFVUQwoKU2V0cyBvciByZXRyaWV2ZXMgdGhlIG9mZnNldCBmcm9tIFVUQyBmb3IgdGhpcyB0aW1lLiBUaGlzIGFsbG93cwp0aW1lem9uZSBzdXBwb3J0LCBhc3N1bWluZyB5b3Uga25vdyB3aGF0IHlvdXIgbG9jYWwgKG9yIG5vbi1sb2NhbCkKVVRDIG9mZnNldCBpcy4gRGVmYXVsdHMgdG8gMC4gCgpJbnRlcm5hbHMgbm90ZTogYWxsIHRpbWVzIGFyZSBpbnRlcm5hbGx5IHN0b3JlZCBpbiBVVEMsIGV2ZW4gdGhvdWdoIHRoZXkKbWF5IGhhdmUgc29tZSBvZmZzZXQgaW5mb3JtYXRpb24uIE9mZnNldHMgYXJlIGludGVybmFsbHkgc3RvcmVkIGluCnNpZ25lZCBpbnRlZ2VyIHNlY29uZHMuIAoKQkUgQ0FSRUZVTCBhYm91dCB1c2luZyB0aGlzIGZ1bmN0aW9uIG9uIG9iamVjdHMgdGhhdCB3ZXJlIGluaXRpYWxpemVkCndpdGggYW4gb2Zmc2V0LiBJZiB5b3Ugc3RhcnRlZCBhbiBvYmplY3Qgd2l0aDoKICAgIAogICAgbXkgJGQgPSBuZXcoaWNhbD0+JzE5NzAwMTAxMTIwMDAwJywgb2Zmc2V0PT4nKzAxMDAnKTsgCgphbmQgeW91IHRoZW4gY2FsbDogCgogICAgJGQtPm9mZnNldCgnKzAyMDAnKTsgCiAgICAKeW91J2xsIGJlIHNheWluZyAiWWVhaCwgSSBrbm93IEkgKnNhaWQqIGl0IHdhcyBpbiArMDEwMCwgYnV0IHJlYWxseSBJCndhbnQgaXQgdG8gYmUgaW4gKzAyMDAgbm93IGFuZCBmb3JldmVyLiIgV2hpY2ggbWF5IGJlIHlvdXIgaW50ZW50aW9uLAppZiB5b3UncmUgdHJ5aW5nIHRvIHRyYW5zcG9zZSBhIHdob2xlIHNldCBvZiBkYXRlcyB0byBhbm90aGVyIHRpbWV6b25lLS0tCmJ1dCB5b3UgY2FuIGFsc28gZG8gdGhhdCBhdCB0aGUgcHJlc2VudGF0aW9uIGxldmVsLCB3aXRoCnRoZSBpY2FsKCkgbWV0aG9kLiBFaXRoZXIgd2F5IHdpbGwgd29yay4KCj1jdXQKCnN1YiBvZmZzZXQgewogICAgbXkgKCAkc2VsZiwgJG9mZnNldCApID0gQF87CiAgICBteSAkbmV3b2Zmc2V0ID0gdW5kZWY7CgogICAgaWYgKCBkZWZpbmVkKCRvZmZzZXQpICkgeyAgICAjIFBhc3NlZCBpbiBhIG5ldyB2YWx1ZQogICAgICAgICRuZXdvZmZzZXQgPSBvZmZzZXRfdG9fc2Vjb25kcygkb2Zmc2V0KTsKCiAgICAgICAgdW5sZXNzICggZGVmaW5lZCAkbmV3b2Zmc2V0ICkgeyByZXR1cm4gdW5kZWY7IH0KCiAgICAgICAgIyBzaW5jZSB3ZSdyZSBpbnRlcm5hbGx5IHN0b3JpbmcgaW4gR01ULCB3ZSBuZWVkIHRvCiAgICAgICAgIyBhZGp1c3QgdGhlIHRpbWUgd2Ugd2VyZSBnaXZlbiBieSB0aGUgb2Zmc2V0IHNvIHRoYXQKICAgICAgICAjIHRoZSBpbnRlcm5hbCBkYXRlL3RpbWUgd2lsbCBiZSByaWdodC4KCiAgICAgICAgaWYgKCAkc2VsZi0+e29mZnNldH0gKSB7CgogICAgICAgICAgICAjIGZpZ3VyZSBvdXQgd2hldGhlciB0aGVyZSdzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuCiAgICAgICAgICAgICMgdGhlIGV4aXN0aW5nIG9mZnNldCBhbmQgdGhlIG9mZnNldCB3ZSB3ZXJlIGdpdmVuLgogICAgICAgICAgICAjIElmIHNvLCBhZGp1c3QgYXBwcm9wcmlhdGVseS4KICAgICAgICAgICAgbXkgJG9mZnNldGRpZmYgPSAkc2VsZi0+e29mZnNldH0gLSAkbmV3b2Zmc2V0OwoKICAgICAgICAgICAgaWYgKCRvZmZzZXRkaWZmKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+e29mZnNldH0gPSAkbmV3b2Zmc2V0OwogICAgICAgICAgICAgICAgJHNlbGYtPmFkZCggc2Vjb25kcyA9PiAkb2Zmc2V0ZGlmZiApOwogICAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgIyBsZWF2ZSB0aGUgb2Zmc2V0IHRoZSB3YXkgaXQgaXMKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPmFkZCggc2Vjb25kcyA9PiAtJG5ld29mZnNldCApOwogICAgICAgICAgICAkc2VsZi0+e29mZnNldH0gPSAkbmV3b2Zmc2V0OwogICAgICAgIH0KCiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCAkc2VsZi0+e29mZnNldH0gKSB7CiAgICAgICAgICAgICRvZmZzZXQgPSBvZmZzZXRfZnJvbV9zZWNvbmRzKCAkc2VsZi0+e29mZnNldH0gKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRvZmZzZXQgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJG9mZnNldDsKfQoKI319fQoKIyBzdWIgYWRkIHt7ewoKPWhlYWQyIGFkZAoKICAgICRzZWxmLT5hZGQoIHllYXIgPT4gMywgbW9udGggPT4gMiwgd2VlayA9PiAxLCBkYXkgPT4gMTIsCiAgICAgICAgICAgICAgICBob3VyID0+IDEsIG1pbnV0ZSA9PiAzNCwgc2VjID0+IDU5ICk7CiAgICAkZGF0ZS0+YWRkKCBkdXJhdGlvbiA9PiAnUDFXVDFIMU0xUycgKTsgIyBhZGQgMSB3aywgMSBociwgMSBtaW4sIGFuZCAxIHNlYwoKQWRkcyBhIGR1cmF0aW9uIHRvIGEgRGF0ZTo6SUNhbCBvYmplY3QuCgpTdXBwb3J0ZWQgcGFyYXRlcnMgYXJlOiBkdXJhdGlvbiwgZW9tX21vZGUsIHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksCmhvdXIsIG1pbiwgc2VjIG9yIHNlY29uZHMuCgonZHVyYXRpb24nIGlzIGEgSUNhbGVuZGFyIGR1cmF0aW9uIHN0cmluZyAoc2VlIGR1cmF0aW9uX3ZhbHVlKS4KCklmIGEgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIG9taXR0ZWQsIDEgaXMgYXNzdW1lZDoKCiAgICAkaWNhbC0+YWRkKCAnbWludXRlJyApOyAjIGFkZCBhIG1pbnV0ZQoKVGhlIHJlc3VsdCB3aWxsIGJlIG5vcm1hbGl6ZWQuIFRoYXQgaXMsIHRoZSBvdXRwdXQgdGltZSB3aWxsIGhhdmUKbWVhbmluZ2Z1bCB2YWx1ZXMsIHJhdGhlciB0aGFuIGJlaW5nIDQ4OjczIHBtIG9uIHRoZSAzNHRoIG9mIApoZXhhZGVjZW1iZXIuCgpBZGRpbmcgbW9udGhzIG9yIHllYXJzIGNhbiBiZSBkb25lIHZpYSB0aHJlZSBkaWZmZXJlbnQgbWV0aG9kcywKc3BlY2lmaWVkIGJ5IHRoZSBlb21fbW9kZSBwYXJhbWV0ZXIsIHdoaWNoIHRoZW4gYXBwbGllcyB0byBhbGwKYWRkaXRpb25zIChvciBzdWJ0cmFjdGlvbnMpIG9mIG1vbnRocyBvciB5ZWFycyBmb2xsb3dpbmcgaXQgaW4gdGhlCnBhcmFtZXRlciBsaXN0LgoKVGhlIGRlZmF1bHQsIGVvbV9tb2RlID0+ICd3cmFwJywgbWVhbnMgYWRkaW5nIG1vbnRocyBvciB5ZWFycyB0aGF0CnJlc3VsdCBpbiBkYXlzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBuZXcgbW9udGggd2lsbCByb2xsIG92ZXIgaW50byB0aGUKZm9sbG93aW5nIG1vbnRoLiAgRm9yIGluc3RhbmNlLCBhZGRpbmcgb25lIHllYXIgdG8gRmViIDI5IHdpbGwgcmVzdWx0CmluIE1hciAxLgoKSWYgeW91IHNwZWNpZnkgZW9tX21vZGUgPT4gJ2xpbWl0JywgdGhlIGVuZCBvZiB0aGUgbW9udGggaXMgbmV2ZXIKY3Jvc3NlZC4gIFRodXMsIGFkZGluZyBvbmUgeWVhciB0byBGZWIgMjksIDIwMDAgd2lsbCByZXN1bHQgaW4gRmViIDI4LAoyMDAxLiAgSG93ZXZlciwgYWRkaW5nIHRocmVlIG1vcmUgeWVhcnMgd2lsbCByZXN1bHQgaW4gRmViIDI4LCAyMDA0LApub3QgRmViIDI5LgoKSWYgeW91IHNwZWNpZnkgZW9tX21vZGUgPT4gJ3ByZXNlcnZlJywgdGhlIHNhbWUgY2FsY3VsYXRpb24gaXMgZG9uZSBhcwpmb3IgJ2xpbWl0JyBleGNlcHQgdGhhdCBpZiB0aGUgb3JpZ2luYWwgZGF0ZSBpcyBhdCB0aGUgZW5kIG9mIHRoZQptb250aCB0aGUgbmV3IGRhdGUgd2lsbCBhbHNvIGJlLiAgRm9yIGluc3RhbmNlLCBhZGRpbmcgb25lIG1vbnRoIHRvCkZlYiAyOSwgMjAwMCB3aWxsIHJlc3VsdCBpbiBNYXIgMzEsIDIwMDAuCgpBbGwgYWRkaXRpb25zIGFyZSBwZXJmb3JtZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4gIEZvciBpbnN0YW5jZSwKd2l0aCB0aGUgZGVmYXVsdCBzZXR0aW5nIG9mIGVvbV9tb2RlID0+ICd3cmFwJywgYWRkaW5nIG9uZSBkYXkgYW5kIG9uZQptb250aCB0byBGZWIgMjkgd2lsbCByZXN1bHQgaW4gQXByIDEsIHdoaWxlIGFkZGluZyBvbmUgbW9udGggYW5kIG9uZQpkYXkgd2lsbCByZXN1bHQgaW4gTWFyIDMwLgoKPWN1dAoKc3ViIGFkZCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgY2FycCAiRGF0ZTo6SUNhbDo6YWRkIHdhcyBjYWxsZWQgd2l0aG91dCBhbiBhdHRyaWJ1dGUgYXJnIiB1bmxlc3MgQF87CiAgICAoICRzZWxmLT57anVsaWFufSwgJHNlbGYtPntqdWxzZWN9KSA9CiAgICAgICAgX2FkZCgkc2VsZi0+e2p1bGlhbn0sICRzZWxmLT57anVsc2VjfSwgQF8pOwogICAgcmV0dXJuICRzZWxmOwp9CgojfX19CgojIHN1YiBfYWRkIHt7ewoKPWJlZ2luIGludGVybmFsCgogICAgQWRkIChvciBzdWJ0cmFjdCkgdG8gYSBkYXRlL3RpbWUuICBGaXJzdCB0d28gcGFyYW1ldGVycyBhcmUKICAgIHRoZSBqZCBhbmQgc2VjcyBvZiB0aGUgZGF5LiAgRm9yIHRoZSByZXN0LCBzZWUgdGhlIGFkZCBtZXRob2QuCiAgICBSZXR1cm5zIHRoZSBhZGp1c3RlZCBqZCBhbmQgc2Vjcy4KCj1lbmQgaW50ZXJuYWwKCj1jdXQKCiMgZm9yIGVhY2ggdW5pdCwgc3BlY2lmeSB3aGF0IGl0IGNoYW5nZXMgYnkgKDA9ZGF5LCAxPXNlY29uZCwgMj1tb250aCkKIyBhbmQgYnkgd2hhdCBmYWN0b3IKCiVhZGRfdW5pdHMgPSAoeWVhcj0+WzIsMTJdLCBtb250aD0+WzIsMV0sIHdlZWs9PlswLDddLCBkYXk9PlswLDFdLAogICAgICAgICAgICAgIGhvdXI9PlsxLDM2MDBdLCBtaW49PlsxLDYwXSwgc2VjPT5bMSwxXSwgc2Vjb25kcz0+WzEsMV0pOwoKc3ViIF9hZGQgewogICAgbXkgKCRqZCwgJHNlY3MpID0gc3BsaWNlKEBfLCAwLCAyKTsKICAgIG15ICRlb21fbW9kZSA9IDA7CiAgICBteSAoJGFkZCwgJHVuaXQsICRjb3VudCk7CgogICAgIyBsb29wIHRocm91Z2ggdW5pdD0+Y291bnQgcGFyYW1ldGVycwogICAgd2hpbGUgKCgkdW5pdCwgJGNvdW50KSA9IHNwbGljZShAXywgMCwgMikpIHsKCiAgICAgICAgaWYgKCR1bml0IGVxICdkdXJhdGlvbicpIHsgIyBhZGQgYSBkdXJhdGlvbiBzdHJpbmcKICAgICAgICAgICAgbXkgJWR1cjsKICAgICAgICAgICAgQGR1cnsnZGF5Jywnc2VjJywnbW9udGgnfSA9IGR1cmF0aW9uX3ZhbHVlKCRjb3VudCk7CgogICAgICAgICAgICAjIHByZXRlbmQgdGhlc2Ugd2VyZSBwYXNzZWQgdG8gdXMgYXMgZS5nLiBtb250aD0+MSwgZGF5PT4xLCBzZWM9PjEuCiAgICAgICAgICAgICMgc2luY2UgbW9udGhzL3llYXJzIGNvbWUgZmlyc3QgaW4gdGhlIGR1cmF0aW9uIHN0cmluZywgd2UKICAgICAgICAgICAgIyBwdXQgdGhlbSBmaXJzdC4KICAgICAgICAgICAgdW5zaGlmdCBAXywgbWFwICRkdXJ7JF99ID8gKCRfLCRkdXJ7JF99KSA6ICgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vbnRoJywgJ2RheScsICdzZWMnOwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0gZWxzaWYgKCR1bml0IGVxICdlb21fbW9kZScpIHsKICAgICAgICAgICAgaWYgKCRjb3VudCBlcSAnd3JhcCcpIHsgJGVvbV9tb2RlID0gMCB9CiAgICAgICAgICAgIGVsc2lmICgkY291bnQgZXEgJ2xpbWl0JykgeyAkZW9tX21vZGUgPSAxIH0KICAgICAgICAgICAgZWxzaWYgKCRjb3VudCBlcSAncHJlc2VydmUnKSB7ICRlb21fbW9kZSA9IDIgfQogICAgICAgICAgICBlbHNlIHsgY2FycCAiVW5yZWNvZ25pemVkIGVvbV9tb2RlLCAkY291bnQsIGlnbm9yZWQiIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmxlc3MgKCRhZGQgPSAkYWRkX3VuaXRzeyR1bml0fSkgewogICAgICAgICAgICAgICAgY2FycCAiVW5yZWNvZ25pemVkIHRpbWUgdW5pdCwgJHVuaXQsIHNraXBwZWQiOwogICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNvdW50ID0gMSBpZiAhZGVmaW5lZCAkY291bnQ7ICMgY291bnQgZGVmYXVsdHMgdG8gMQogICAgICAgICAgICAkY291bnQgKj0gJGFkZC0+WzFdOyAjIG11bHRpcGx5IGJ5IHRoZSBmYWN0b3IgZm9yIHRoaXMgdW5pdAoKICAgICAgICAgICAgaWYgKCRhZGQtPlswXSA9PSAwKSB7ICMgYWRkIHRvIGRheXMKICAgICAgICAgICAgICAgICRqZCArPSAkY291bnQ7CiAgICAgICAgICAgIH0gZWxzaWYgKCRhZGQtPlswXSA9PSAxKSB7ICMgYWRkIHRvIHNlY29uZHMKICAgICAgICAgICAgICAgICRzZWNzICs9ICRjb3VudDsKICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAjIGFkZCB0byBtb250aHMKICAgICAgICAgICAgICAgIG15ICgkeSwgJG1vLCAkZCk7CgogICAgICAgICAgICAgICAgX25vcm1hbGl6ZV9zZWNvbmRzKCAkamQsICRzZWNzICk7CiAgICAgICAgICAgICAgICBpZiAoJGVvbV9tb2RlID09IDIpIHsgIyBzdGlja3kgZW9tIG1vZGUKICAgICAgICAgICAgICAgICAgICAjIGlmIGl0IGlzIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIG1ha2UgaXQgdGhlIDB0aAogICAgICAgICAgICAgICAgICAgICMgZGF5IG9mIHRoZSBmb2xsb3dpbmcgbW9udGggKHdoaWNoIHRoZW4gd2lsbCBub3JtYWxpemUKICAgICAgICAgICAgICAgICAgICAjIGJhY2sgdG8gdGhlIGxhc3QgZGF5IG9mIHRoZSBuZXcgbW9udGgpLgogICAgICAgICAgICAgICAgICAgICgkeSwgJG1vLCAkZCkgPSBqZDJncmVnKCAkamQrMSApOwogICAgICAgICAgICAgICAgICAgIC0tJGQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICgkeSwgJG1vLCAkZCkgPSBqZDJncmVnKCAkamQgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGVvbV9tb2RlICYmICRkID4gMjgpIHsgIyBsaW1pdCBkYXkgdG8gbGFzdCBvZiBuZXcgbW9udGgKICAgICAgICAgICAgICAgICAgICAjIGZpbmQgdGhlIGpkIG9mIHRoZSBsYXN0IGRheSBvZiBvdXIgdGFyZ2V0IG1vbnRoCiAgICAgICAgICAgICAgICAgICAgJGpkID0gZ3JlZzJqZCggJHksICRtbyskY291bnQrMSwgMCApOwoKICAgICAgICAgICAgICAgICAgICAjIHdoYXQgZGF5IG9mIHRoZSBtb250aCBpcyBpdD8gKGRpc2NhcmQgeWVhciBhbmQgbW9udGgpCiAgICAgICAgICAgICAgICAgICAgbXkgJGxhc3RkYXkgPSBzY2FsYXIgamQyZ3JlZyggJGpkICk7CgogICAgICAgICAgICAgICAgICAgICMgaWYgb3VyIG9yaWdpbmFsIGRheSB3YXMgbGVzcyB0aGFuIHRoZSBsYXN0IGRheSwKICAgICAgICAgICAgICAgICAgICAjIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAkamQgLT0gJGxhc3RkYXkgLSAkZCBpZiAkbGFzdGRheSA+ICRkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkamQgPSBncmVnMmpkKCAkeSwgJG1vKyRjb3VudCwgJGQgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBfbm9ybWFsaXplX3NlY29uZHMoICRqZCwgJHNlY3MgKTsKfQoKI319fQoKIyBzdWIgYWRkX292ZXJsb2FkIHt7ewoKPWhlYWQyIGFkZF9vdmVybG9hZAoKICAgICRkYXRlID0gJGRhdGUxICsgJGR1cmF0aW9uOwoKV2hlcmUgJGR1cmF0aW9uIGlzIGVpdGhlciBhIGR1cmF0aW9uIHN0cmluZywgb3IgYSBEYXRlOjpJQ2FsOjpEdXJhdGlvbgpvYmplY3QuCgogICAgJGRhdGUgKz0gJ1AyRFQ0SDdNJzsKCkFkZHMgYSBkdXJhdGlvbiB0byBhIGRhdGUgb2JqZWN0LiBSZXR1cm5zIGEgbmV3IG9iamVjdCwgb3IsIGluIHRoZSBjYXNlCm9mICs9LCBtb2RpZmllcyB0aGUgZXhpc3Rpbmcgb2JqZWN0LgoKPWN1dAoKc3ViIGFkZF9vdmVybG9hZCB7CiAgICBteSAkb25lID0gc2hpZnQ7CiAgICBteSAkdHdvID0gc2hpZnQ7CgogICAgbXkgJHJldCA9ICRvbmUtPmNsb25lOwoKICAgIGlmICggcmVmICR0d28gKSB7CiAgICAgICAgJHJldC0+YWRkKCBkdXJhdGlvbiA9PiAkdHdvLT5hc19pY2FsICk7CiAgICB9IGVsc2UgewogICAgICAgICRyZXQtPmFkZCggZHVyYXRpb24gPT4gJHR3byApOwogICAgfQoKICAgIHJldHVybiAkcmV0Owp9ICMgfX19CgojIHN1YiBfbm9ybWFsaXplX3NlY29uZHMge3t7Cgo9YmVnaW4gaW50ZXJuYWwKCiAgICAoJGpkLCAkc2VjcykgPSBfbm9ybWFsaXplX3NlY29uZHMoICRqZCwgJHNlY3MgKTsKCiAgICBDb3JyZWN0cyBzZWNvbmRzIHRoYXQgaGF2ZSBnb25lIGludG8gZm9sbG93aW5nIG9yIHByZXZpb3VzIGRheShzKS4KICAgIEFkanVzdHMgdGhlIHBhc3NlZCBkYXlzIGFuZCBzZWNvbmRzIGFzIHdlbGwgYXMgcmV0dXJuaW5nIHRoZW0uCgo9ZW5kIGludGVybmFsCgo9Y3V0CgpzdWIgX25vcm1hbGl6ZV9zZWNvbmRzIHsKICAgIG15ICRhZGo7CgogICAgaWYgKCRfWzFdIDwgMCkgewogICAgICAgICRhZGogPSBpbnQoICgkX1sxXS04NjM5OSkvODY0MDAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJGFkaiA9IGludCggJF9bMV0vODY0MDAgKTsKICAgIH0KICAgICgkX1swXSArPSAkYWRqKSwgKCRfWzFdIC09ICRhZGoqODY0MDApOwp9CgojfX19CgojIHN1YiBkdXJhdGlvbl92YWx1ZSB7e3sKCj1oZWFkMiBkdXJhdGlvbl92YWx1ZQoKR2l2ZW4gYSBkdXJhdGlvbiBzdHJpbmcsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMsCnNlY29uZHMsIGFuZCBtb250aHMgcmVwcmVzZW50ZWQgYnkgdGhhdCBkdXJhdGlvbi4gSW4gdGhhdCBvcmRlci4gU2VlbXMKb2RkIHRvIG1lLiBUaGlzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIGludGVybmFsIGZ1bmN0aW9uLCBhbmQgeW91CnNob3VsZCBleHBlY3QgdGhlIEFQSSB0byBjaGFuZ2UgaW4gdGhlIHZlcnkgbmVhciBmdXR1cmUuCgo9Y3V0CgpzdWIgZHVyYXRpb25fdmFsdWUgewogICAgbXkgJHN0ciA9IHNoaWZ0OwoKICAgIG15IEB0ZW1wID0gJHN0ciA9fiBtewogICAgICAgICAgICAoW1wrXC1dKT8gICAoPyMgU2lnbikKICAgICAgICAgICAgKFApICAgICAoPyMgJ1AnIGZvciBwZXJpb2Q/IFRoaXMgaXMgb3VyIG1hZ2ljIGNoYXJhY3RlcikKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAoPzooXGQrKVkpPyAoPyMgWWVhcnMpCiAgICAgICAgICAgICAgICAoPzooXGQrKU0pPyAoPyMgTW9udGhzKQogICAgICAgICAgICAgICAgKD86KFxkKylXKT8gKD8jIFdlZWtzKQogICAgICAgICAgICAgICAgKD86KFxkKylEKT8gKD8jIERheXMpCiAgICAgICAgICAgICk/CiAgICAgICAgICAgICg/OlQgICAgICAgICg/IyBUaW1lIHByZWZpeCkKICAgICAgICAgICAgICAgICg/OihcZCspSCk/ICg/IyBIb3VycykKICAgICAgICAgICAgICAgICg/OihcZCspTSk/ICg/IyBNaW51dGVzKQogICAgICAgICAgICAgICAgKD86KFxkKylTKT8gKD8jIFNlY29uZHMpCiAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICB9eDsKICAgIG15ICggJHNpZ24sICRtYWdpYyApID0gQHRlbXBbIDAgLi4gMSBdOwogICAgbXkgKCAkeWVhcnMsICRtb250aHMsICR3ZWVrcywgJGRheXMsICRob3VycywgJG1pbnMsICRzZWNzICkgPQogICAgICBtYXAgeyBkZWZpbmVkKCRfKSA/ICRfIDogMCB9IEB0ZW1wWyAyIC4uICQjdGVtcCBdOwoKICAgIHVubGVzcyAoIGRlZmluZWQoJG1hZ2ljKSApIHsKICAgICAgICBjYXJwICJJbnZhbGlkIGR1cmF0aW9uOiAkc3RyIjsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9CiAgICAkc2lnbiA9ICggKCBkZWZpbmVkKCRzaWduKSAmJiAkc2lnbiBlcSAnLScgKSA/IC0xIDogMSApOwoKICAgIG15ICRzID0gJHNpZ24gKiAoICRzZWNzICsgKCAkbWlucyAqIDYwICkgKyAoICRob3VycyAqIDM2MDAgKSApOwogICAgbXkgJGQgPSAkc2lnbiAqICggJGRheXMgKyAoICR3ZWVrcyAqIDcgKSApOwogICAgbXkgJG0gPSAkc2lnbiAqICggJG1vbnRocyArICggJHllYXJzICogMTIgKSApOwogICAgcmV0dXJuICggJGQsICRzLCAkbSApOwp9CgojfX19CgojIHN1YiBzdWJ0cmFjdCB7e3sKCj1oZWFkMiBzdWJ0cmFjdAoKICAkZHVyYXRpb24gPSAkZGF0ZTEgLSAkZGF0ZTI7CgpTdWJ0cmFjdCBvbmUgRGF0ZTo6SUNhbCBvYmplY3QgZnJvbSBhbm90aGVyIHRvIGdpdmUgYSBkdXJhdGlvbiAtIHRoZQpsZW5ndGggb2YgdGhlIGludGVydmFsIGJldHdlZW4gdGhlIHR3byBkYXRlcy4gVGhlIHJldHVybiB2YWx1ZSBpcyBhCkRhdGU6OklDYWw6OkR1cmF0aW9uIG9iamVjdCAocXYpIGFuZCBhbGxvd3MgeW91IHRvIGdldCBhdCBlYWNoIG9mIHRoZQppbmRpdmlkdWFsIGNvbXBvbmVudHMsIG9yIHRoZSBlbnRpcmUgZHVyYXRpb24gc3RyaW5nOgoKICAgICRkID0gJGRhdGUxIC0gJFg7CgpOb3RlIHRoYXQgJFggY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgoKSWYgJFggaXMgYW5vdGhlciBEYXRlOjpJQ2FsIG9iamVjdCAob3Igc3ViY2xhc3MgdGhlcmVvZikgdGhlbiAkZCB3aWxsIGJlCmEgRGF0ZTo6SUNhbDo6RHVyYXRpb24gb2JqZWN0LgoKICAgICR3ZWVrID0gJGQtPndlZWtzOyAjIGhvdyBtYW55IHdlZWtzIGFwYXJ0PwogICAgJGRheXMgPSAkZC0+YXNfZGF5czsgIyBIb3cgbWFueSBkYXlzIGFwYXJ0PwoKSWYgJFggaXMgYSBkdXJhdGlvbiBzdHJpbmcsIG9yIGEgRGF0ZTo6SUNhbDo6RGlyYXRpb24gb2JqZWN0LCB0aGVuICRkCndpbGwgYmUgYW4gb2JqZWN0IGluIHRoZSBzYW1lIGNsYXNzIGFzICRkYXRlMTsKCiAgICAkbmV3ZGF0ZSA9ICRkYXRlIC0gJGR1cmF0aW9uOyAKCj1jdXQKCnN1YiBzdWJ0cmFjdCB7CiAgICBteSAoICRkYXRlMSwgJGRhdGUyLCAkcmV2ZXJzZWQgKSA9IEBfOwogICAgbXkgJGR1cjsKCiAgICAjIElmIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzIHdhcyByZXZlcnNlZCwgb3ZlcmxvYWQgdGVsbHMgdXMKICAgICMgYWJvdXQgaXQgaW4gdGhlIHRoaXJkIGFyZ3VtZW50LgogICAgaWYgKCRyZXZlcnNlZCkgewogICAgICAgICggJGRhdGUyLCAkZGF0ZTEgKSA9ICggJGRhdGUxLCAkZGF0ZTIgKTsKICAgIH0KCiAgICBpZiAocmVmICRkYXRlMSAmJiByZWYgJGRhdGUyKSB7CiAgICAjIElmICRkYXRlMSBpcyBhIERhdGU6OklDYWwgb2JqZWN0LCBhbmQgJGRhdGUyIGlzIGEgRHVyYXRpb24gb2JqZWN0LAogICAgIyB0aGVuIHdlIHNob3VsZCBzdWJ0cmFjdCBhbmQgZ2V0IGEgZGF0ZS4KICAgICAgICBpZiAoKHJlZiAkZGF0ZTIpIGVxICdEYXRlOjpJQ2FsOjpEdXJhdGlvbicpIHsKICAgICAgICAgICAgbXkgJHNlY29uZHMgPSAkZGF0ZTItPmFzX3NlY29uZHM7CiAgICAgICAgICAgIG15ICRyZXQgPSAkZGF0ZTEtPmNsb25lOwogICAgICAgICAgICAkcmV0LT5hZGQoIHNlY29uZHMgPT4gLTEgKiAkc2Vjb25kcyApOwogICAgICAgICAgICByZXR1cm4gJHJldDsKCiAgICAgICAgfSBlbHNlIHsKICAgICMgSWYgJGRhdGUyIGlzIGEgRGF0ZTo6SUNhbCBvYmplY3QsIG9yIHNvbWUgY2xhc3MgdGhlcmVvZiwgd2Ugc2hvdWxkCiAgICAjIHN1YnRyYWN0IGFuZCBnZXQgYSBkdXJhdGlvbgoKICAgICAgICAgICAgbXkgJGRheXMgPSAkZGF0ZTEtPntqdWxpYW59IC0gJGRhdGUyLT57anVsaWFufTsKICAgICAgICAgICAgbXkgJHNlY3MgPSAkZGF0ZTEtPntqdWxzZWN9IC0gJGRhdGUyLT57anVsc2VjfTsKCiAgICAgICAgICAgIHJldHVybiBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3KAogICAgICAgICAgICAgIGRheXMgICAgPT4gJGRheXMsCiAgICAgICAgICAgICAgc2Vjb25kcyA9PiAkc2VjcwogICAgICAgICAgICApOwogICAgICAgIH0gCiAgICB9IGVsc2lmICggcmVmICRkYXRlMSAmJiAKICAgICAgICAgICAgICAoICRkdXIgPSBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3KCBpY2FsID0+ICRkYXRlMiApICkKICAgICAgICAgICAgKSB7CiAgICAjIElmICRkYXRlMSBpcyBhIERhdGU6OklDYWwgb2JqZWN0LCBhbmQgJGRhdGUyIGlzIGEgZHVyYXRpb24gc3RyaW5nLAogICAgIyB3ZSBzaG91bGQgc3VidHJhY3QgYW5kIGdldCBhIGRhdGUKICAgICAgICByZXR1cm4gJGRhdGUxIC0gJGR1cjsgIyBJcyB0aGF0IGNoZWF0aW5nPwoKICAgICMgT3RoZXJ3aXNlLCByZXR1cm4gdW5kZWYKICAgIH0gZWxzZSB7CiAgICAgICAgd2FybiAiSW52YWxpZCBhcmd1bWVudHMuIFlvdSBjYW4gc3VidHJhY3QgYSBkYXRlIGZyb20gYSBkYXRlLCBvciBhIGR1cmF0aW9uIGZyb20gYSBkYXRlIjsKICAgICAgICByZXR1cm47CiAgICB9Cgp9ICMgfX19CgojIHN1YiBjbG9uZSB7e3sKCj1oZWFkMiBjbG9uZQoKICAgICRjb3B5ID0gJGRhdGUtPmNsb25lOwoKUmV0dXJucyBhIHJlcGxpY2Egb2YgdGhlIGRhdGUgb2JqZWN0LCBpbmNsdWRpbmcgYWxsIGF0dHJpYnV0ZXMuCgo9Y3V0CgpzdWIgY2xvbmUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRjbGFzcyA9IHJlZiAkc2VsZjsKICAgIG15ICVoYXNoID0gJSRzZWxmOwogICAgbXkgJG5ldyA9IFwlaGFzaDsKICAgIGJsZXNzICRuZXcsICRjbGFzczsKICAgIHJldHVybiAkbmV3Owp9ICMgfX19CgojIHN1YiBjb21wYXJlIHt7ewoKPWhlYWQyIGNvbXBhcmUKCiAgICAkY21wID0gJGRhdGUxLT5jb21wYXJlKCRkYXRlMik7CgogICAgQGRhdGVzID0gc29ydCB7JGEtPmNvbXBhcmUoJGIpfSBAZGF0ZXM7CgpDb21wYXJlIHR3byBEYXRlOjpJQ2FsIG9iamVjdHMuIFNlbWFudGljcyBhcmUgY29tcGF0aWJsZSB3aXRoCnNvcnQ7IHJldHVybnMgLTEgaWYgJGEgPCAkYiwgMCBpZiAkYSA9PSAkYiwgMSBpZiAkYSA+ICRiLiAKCj1jdXQKCnN1YiBjb21wYXJlIHsKICAgIG15ICggJHNlbGYsICRvdGhlcmRhdGUgKSA9IChAXyk7CgogICAgdW5sZXNzICggZGVmaW5lZCgkb3RoZXJkYXRlKSApIHsgcmV0dXJuIHVuZGVmIH0KCiAgICAjIE9uZSBvciBtb3JlIGRheXMgZGlmZmVyZW50CgogICAgaWYgKCAkc2VsZi0+e2p1bGlhbn0gPCAkb3RoZXJkYXRlLT57anVsaWFufSApIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0gZWxzaWYgKCAkc2VsZi0+e2p1bGlhbn0gPiAkb3RoZXJkYXRlLT57anVsaWFufSApCiAgICB7CiAgICAgICAgcmV0dXJuIDE7CgogICAgICAgICMgVGhleSBhcmUgdGhlIHNhbWUgZGF5CiAgICAgIH0gZWxzaWYgKCAkc2VsZi0+e2p1bHNlY30gPCAkb3RoZXJkYXRlLT57anVsc2VjfSApCiAgICB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9IGVsc2lmICggJHNlbGYtPntqdWxzZWN9ID4gJG90aGVyZGF0ZS0+e2p1bHNlY30gKQogICAgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgICAgIyBpZiB3ZSBnb3QgYWxsIHRoaXMgd2F5IGFuZCBoYXZlbid0IHlldCByZXR1cm5lZCwgdGhlIHVuaXRzIGFyZSBlcXVhbC4KICAgIHJldHVybiAwOwp9CgojfX19CgojIGludGVybmFsIHN0dWZmIHt7ewoKPWJlZ2luIGludGVybmFsCgogQG1vbnRocyA9IG1vbnRocygkeWVhcik7CgpSZXR1cm5zIHRoZSBKdWxpYW4gZGF5IGF0IHRoZSBlbmQgb2YgYSBtb250aCwgY29ycmVjdCBmb3IgdGhhdCB5ZWFyLgoKPWVuZCBpbnRlcm5hbCAKCj1jdXQKCiMgcHJlY2FsY3VsYXRlIHRoZXNlIHZhbHVlcyBhdCBtb2R1bGUgbG9hZCB0aW1lIHNvIHRoYXQgd2UgZG9uJ3QKIyBoYXZlIHRvIGRvIGl0IHJlcGVhdGVkbHkgZHVyaW5nIHJ1bnRpbWUuIAojIApCRUdJTiB7CgogICAgIyAgICAgICAgICAgKyAgMzEsIDI4LCAzMSwgMzAsICAzMSwgIDMwLCAgMzEsICAzMSwgIDMwLCAgMzEsICAzMCwgIDMxCiAgICBAbW9udGhzID0gKCAwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNCwgMzY1ICk7CiAgICBAbGVhcG1vbnRocyA9IEBtb250aHM7CgogICAgZm9yICggMiAuLiAxMiApIHsKICAgICAgICAkbGVhcG1vbnRoc1skX10gPSAkbW9udGhzWyRfXSArIDE7CiAgICB9Cn0KCnN1YiBtb250aHMgewogICAgcmV0dXJuIERhdGU6OkxlYXB5ZWFyOjppc2xlYXAoc2hpZnQpID8gQGxlYXBtb250aHMgOiBAbW9udGhzOwp9Cgo9YmVnaW4gaW50ZXJuYWwKCiAgICB0aW1lX2FzX3NlY29uZHMoICRhcmdze2hvdXJ9LCAkYXJnc3ttaW59LCAkYXJnc3tzZWN9ICk7CgpSZXR1cm5zIHRoZSB0aW1lIG9mIGRheSBhcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgaW4gdGhlIGRheS4KCj1lbmQgaW50ZXJuYWwKCj1jdXQKCiMgfX19CgojIHN1YiB0aW1lX2FzX3NlY29uZHMge3t7CgpzdWIgdGltZV9hc19zZWNvbmRzIHsKICAgIG15ICggJGhvdXIsICRtaW4sICRzZWMgKSA9IEBfOwoKICAgICRob3VyIHx8PSAwOwogICAgJG1pbiB8fD0gMDsKICAgICRzZWMgfHw9IDA7CgogICAgbXkgJHNlY3MgPSAkaG91ciAqIDM2MDAgKyAkbWluICogNjAgKyAkc2VjOwogICAgcmV0dXJuICRzZWNzOwp9ICN9fX0KCiMgc3ViIGRheSB7e3sKCj1oZWFkMiBkYXkKCiAgICBteSAkZGF5ID0gJGRhdGUtPmRheTsKClJldHVybnMgdGhlIGRheSBvZiB0aGUgbW9udGguCgpEYXkgaXMgaW4gdGhlIHJhbmdlIDEuLjMxCgo9Y3V0CgpzdWIgZGF5IHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gKCBqZDJncmVnKCAkc2VsZi0+e2p1bGlhbn0gKSApWzJdOwp9ICMgfX19CgojIHN1YiBtb250aCB7e3sKCj1oZWFkMiBtb250aAoKICAgIG15ICRtb250aCA9ICRkYXRlLT5tb250aDsKClJldHVybnMgdGhlIG1vbnRoIG9mIHRoZSB5ZWFyLgoKTW9udGggaXMgcmV0dXJuZWQgYXMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIDEuLjEyCgo9Y3V0CgpzdWIgbW9udGggewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAoIGpkMmdyZWcoICRzZWxmLT57anVsaWFufSApIClbMV07Cn0gIyB9fX0KCiMgc3ViIG1vbiB7e3sKCnN1YiBtb24geyByZXR1cm4gbW9udGgoQF8pOyB9CgojfX19CgojIHN1YiB5ZWFyIHt7ewoKPWhlYWQyIHllYXIKCiAgICBteSAkeWVhciA9ICRkYXRlLT55ZWFyOwoKUmV0dXJucyB0aGUgeWVhci4gIAoKPWN1dAoKc3ViIHllYXIgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAoIGpkMmdyZWcoICRzZWxmLT57anVsaWFufSApIClbMF07Cn0gIyB9fX0KCiMgc3ViIGpkMmdyZWcge3t7Cgo9aGVhZDIgamQyZ3JlZwoKICAgICgkeWVhciwgJG1vbnRoLCAkZGF5KSA9IGpkMmdyZWcoICRqZCApOwoKICAgIENvbnZlcnQgbnVtYmVyIG9mIGRheXMgb24gb3IgYWZ0ZXIgSmFuIDEsIDEgQ0UgKEdyZWdvcmlhbikgdG8KICAgIGdyZWdvcmlhbiB5ZWFyLG1vbnRoLGRheS4KCj1jdXQKCnN1YiBqZDJncmVnIHsKICAgIHVzZSBpbnRlZ2VyOwogICAgbXkgJGQgPSBzaGlmdDsKICAgIG15ICR5YWRqID0gMDsKICAgIG15ICggJGMsICR5LCAkbSApOwoKICAgICMgYWRkIDMwNiBkYXlzIHRvIG1ha2UgcmVsYXRpdmUgdG8gTWFyIDEsIDA7IGFsc28gYWRqdXN0ICRkIHRvIGJlIHdpdGhpbgogICAgIyBhIHJhbmdlICgxLi4yKioyOC0xKSB3aGVyZSBvdXIgY2FsY3VsYXRpb25zIHdpbGwgd29yayB3aXRoIDMyYml0IGludHMKICAgIGlmICggJGQgPiAyKioyOCAtIDMwNyApIHsKCiAgICAgICAgIyBhdm9pZCBvdmVyZmxvdyBpZiAkZCBjbG9zZSB0byBtYXhpbnQKICAgICAgICAkeWFkaiA9ICggJGQgLSAxNDYwOTcgKyAzMDYgKSAvIDE0NjA5NyArIDE7CiAgICAgICAgJGQgLT0gJHlhZGogKiAxNDYwOTcgLSAzMDY7CiAgICAgIH0gZWxzaWYgKCAoICRkICs9IDMwNiApIDw9IDAgKQogICAgewogICAgICAgICR5YWRqID0KICAgICAgICAgIC0oIC0kZCAvIDE0NjA5NyArIDEgKTsgICAgIyBhdm9pZCBhbWJpZ3VpdHkgaW4gQyBkaXZpc2lvbiBvZiBuZWdhdGl2ZXMKICAgICAgICAkZCAtPSAkeWFkaiAqIDE0NjA5NzsKICAgIH0KCiAgICAkYyA9CiAgICAgICggJGQgKiA0IC0gMSApIC8gMTQ2MDk3OyAgICAjIGNhbGMgIyBvZiBjZW50dXJpZXMgJGQgaXMgYWZ0ZXIgMjkgRmViIG9mIHlyIDAKICAgICRkIC09ICRjICogMTQ2MDk3IC8gNDsgICAgIyAgICAgKDQgY2VudHVyaWVzID0gMTQ2MDk3IGRheXMpCiAgICAkeSA9ICggJGQgKiA0IC0gMSApIC8gMTQ2MTsgICAgIyBjYWxjIG51bWJlciBvZiB5ZWFycyBpbnRvIHRoZSBjZW50dXJ5LAogICAgJGQgLT0gJHkgKiAxNDYxIC8gNDsgICAgIyAgICAgYWdhaW4gTWFyY2gtYmFzZWQgKDQgeXJzID1+IDE0NlswMV0gZGF5cykKICAgICRtID0KICAgICAgKCAkZCAqIDEyICsgMTA5MyApIC8gMzY3OyAgICAjIGdldCB0aGUgbW9udGggKDMuLjE0IHJlcHJlc2VudCBNYXJjaCB0aHJvdWdoCiAgICAkZCAtPSAoICRtICogMzY3IC0gMTA5NCApIC8gMTI7ICAgICMgICAgIEZlYnJ1YXJ5IG9mIGZvbGxvd2luZyB5ZWFyKQogICAgJHkgKz0gJGMgKiAxMDAgKyAkeWFkaiAqIDQwMDsgICAgIyBnZXQgdGhlIHJlYWwgeWVhciwgd2hpY2ggaXMgb2ZmIGJ5CiAgICArKyR5LCAkbSAtPSAxMiBpZiAkbSA+IDEyOyAgICAgICAgICMgICAgIG9uZSBpZiBtb250aCBpcyBKYW51YXJ5IG9yIEZlYnJ1YXJ5CiAgICByZXR1cm4gKCAkeSwgJG0sICRkICk7Cn0gICAgI319fQoKIyBzdWIgZ3JlZzJqZCB7e3sKCj1oZWFkMiBncmVnMmpkCgogICAgJGpkID0gZ3JlZzJqZCggJHllYXIsICRtb250aCwgJGRheSApOwoKICAgIENvbnZlcnQgZ3JlZ29yaWFuIHllYXIsbW9udGgsZGF5IHRvIGRheXMgb24gb3IgYWZ0ZXIgSmFuIDEsIDEgQ0UKICAgIChHcmVnb3JpYW4pLiAgTm9ybWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgKGUuZy4gbW9udGggb2YgMjggbWVhbnMKICAgIEFwcmlsIHR3byB5ZWFycyBhZnRlciBnaXZlbiB5ZWFyKSBmb3IgbW9udGggPCAxIG9yID4gMTIgb3IgZGF5IDwgMQogICAgb3IgPiBsYXN0IGRheSBvZiBtb250aC4KCj1jdXQKCnN1YiBncmVnMmpkIHsKICAgIHVzZSBpbnRlZ2VyOwogICAgbXkgKCAkeSwgJG0sICRkICkgPSBAXzsKICAgIG15ICRhZGo7CgogICAgIyBtYWtlIG1vbnRoIGluIHJhbmdlIDMuLjE0ICh0cmVhdCBKYW4gJiBGZWIgYXMgbW9udGhzIDEzLi4xNCBvZiBwcmV2IHllYXIpCiAgICBpZiAoICRtIDw9IDIgKSB7CiAgICAgICAgJHkgLT0gKCAkYWRqID0gKCAxNCAtICRtICkgLyAxMiApOwogICAgICAgICRtICs9IDEyICogJGFkajsKICAgICAgfSBlbHNpZiAoICRtID4gMTQgKQogICAgewogICAgICAgICR5ICs9ICggJGFkaiA9ICggJG0gLSAzICkgLyAxMiApOwogICAgICAgICRtIC09IDEyICogJGFkajsKICAgIH0KCiAgICAjIG1ha2UgeWVhciBwb3NpdGl2ZSAob2gsIGZvciBhIHVzZSBpbnRlZ2VyICdzYW5lX2RpdichKQogICAgaWYgKCAkeSA8IDAgKSB7CiAgICAgICAgJGQgLT0gMTQ2MDk3ICogKCAkYWRqID0gKCAzOTkgLSAkeSApIC8gNDAwICk7CiAgICAgICAgJHkgKz0gNDAwICogJGFkajsKICAgIH0KCiAgICAjIGFkZDogZGF5IG9mIG1vbnRoLCBkYXlzIG9mIHByZXZpb3VzIDAtMTEgbW9udGggcGVyaW9kIHRoYXQgYmVnYW4gdy9NYXJjaCwKICAgICMgZGF5cyBvZiBwcmV2aW91cyAwLTM5OSB5ZWFyIHBlcmlvZCB0aGF0IGJlZ2FuIHcvTWFyY2ggb2YgYSA0MDAtbXVsdGlwbGUKICAgICMgeWVhciksIGRheXMgb2YgYW55IDQwMC15ZWFyIHBlcmlvZHMgYmVmb3JlIHRoYXQsIGFuZCAzMDYgZGF5cyB0byBhZGp1c3QKICAgICMgZnJvbSBNYXIgMSwgeWVhciAwLXJlbGF0aXZlIHRvIEphbiAxLCB5ZWFyIDEtcmVsYXRpdmUgKHdoZXcpCgogICAgJGQgKz0gKCAkbSAqIDM2NyAtIDEwOTQgKSAvIDEyICsgJHkgJSAxMDAgKiAxNDYxIC8gNCArCiAgICAgICggJHkgLyAxMDAgKiAzNjUyNCArICR5IC8gNDAwICkgLSAzMDY7Cn0gICAgIyB9fX0KCiMgc3ViIGRheXNfdGhpc195ZWFyIHt7ewoKPWhlYWQyIGRheXNfdGhpc195ZWFyCgogICR5ZGF5ID0gRGF0ZTo6SUNhbDo6ZGF5c190aGlzX3llYXIoJGRheSwgJG1vbnRoLCAkeWVhcik7CgpSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBzbyBmYXIgdGhpcyB5ZWFyLiBBbmFsb2dvdXMgdG8gdGhlIHlkYXkKYXR0cmlidXRlIG9mIGdtdGltZSAob3IgbG9jYWx0aW1lKSBleGNlcHQgdGhhdCBpdCB3b3JrcyBvdXRzaWRlIG9mIHRoZQplcG9jaC4KCj1jdXQKCnN1YiBkYXlzX3RoaXNfeWVhciB7CiAgICBteSAoICRkLCAkbSwgJHkgKSA9IEBfOwogICAgbXkgQG1saXN0ID0gJm1vbnRocygkeSk7CiAgICByZXR1cm4gJG1saXN0WyRtIC0gMV0gKyAkZCAtIDE7Cn0gICAgI319fQoKIyBzdWIgZGF5X29mX3dlZWsge3t7Cgo9aGVhZDIgZGF5X29mX3dlZWsKCiAgICBteSAkZGF5X29mX3dlZWsgPSAkZGF0ZS0+ZGF5X29mX3dlZWsKClJldHVybnMgdGhlIGRheSBvZiB3ZWVrIGFzIDAuLjYgKDAgaXMgU3VuZGF5LCA2IGlzIFNhdHVyZGF5KS4KCj1jdXQKCnN1YiBkYXlfb2Zfd2VlayB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgcmV0dXJuICRzZWxmLT57anVsaWFufSAlIDc7Cn0gICAgI319fQoKIyBzdWIgaG91ciB7e3sKCj1oZWFkMiBob3VyCgogICAgbXkgJGhvdXIgPSAkZGF0ZS0+aG91cgoKUmV0dXJucyB0aGUgaG91ciBvZiB0aGUgZGF5LgoKSG91ciBpcyBpbiB0aGUgcmFuZ2UgMC4uMjMKCj1jdXQKCnN1YiBob3VyIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gKCAkc2VsZi0+cGFyc2V0aW1lIClbMl07Cn0gIyB9fX0KCiMgc3ViIG1pbiB7e3sKCj1oZWFkMiBtaW4KCiAgICBteSAkbWluID0gJGRhdGUtPm1pbjsKClJldHVybnMgdGhlIG1pbnV0ZS4KCk1pbnV0ZSBpcyBpbiB0aGUgcmFuZ2UgMC4uNTkKCj1jdXQKCnN1YiBtaW4gewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAoICRzZWxmLT5wYXJzZXRpbWUgKVsxXTsKfQoKc3ViIG1pbnV0ZSB7IHJldHVybiBtaW4oQF8pOyB9CgojIH19fQoKIyBzdWIgc2VjIHt7ewoKPWhlYWQyIHNlYwoKICAgIG15ICRzZWMgPSAkZGF0ZS0+c2VjOwoKUmV0dXJucyB0aGUgc2Vjb25kLgoKU2Vjb25kIGlzIGluIHRoZSByYW5nZSAwLi42MC4gVGhlIHZhbHVlIG9mIDYwIGlzIChtYXliZSkgbmVlZGVkIGZvcgpsZWFwIHNlY29uZHMuIEJ1dCBJJ20gbm90IHN1cmUgaWYgd2UncmUgZ29pbmcgdG8gZ28gdGhlcmUuCgo9Y3V0CgpzdWIgc2VjIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gKCAkc2VsZi0+cGFyc2V0aW1lIClbMF07Cn0KCnN1YiBzZWNvbmQgeyByZXR1cm4gc2VjKEBfKTsgfQoKIyB9fX0KCiMgc3ViIHBhcnNldGltZSB7e3sKCj1iZWdpbiBpbnRlcm5hbAoKICggJHNlYywgJG1pbiwgJGhvdXIgKSA9IHBhcnNldGltZSggJHNlY29uZHMgKTsKCkdpdmVuIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzbyBmYXIgdG9kYXksIHJldHVybnMgdGhlIHNlY29uZHMsCm1pbnV0ZXMsIGFuZCBob3VycyBvZiB0aGUgY3VycmVudCB0aW1lLgoKPWVuZCBpbnRlcm5hbAoKPWN1dAoKc3ViIHBhcnNldGltZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHRpbWUgPSAkc2VsZi0+e2p1bHNlY307CgogICAgbXkgJGhvdXIgPSBpbnQoICR0aW1lIC8gMzYwMCApOwogICAgJHRpbWUgLT0gJGhvdXIgKiAzNjAwOwoKICAgIG15ICRtaW4gPSBpbnQoICR0aW1lIC8gNjAgKTsKICAgICR0aW1lIC09ICRtaW4gKiA2MDsKCiAgICByZXR1cm4gKCBpbnQoJHRpbWUpLCAkbWluLCAkaG91ciApOwp9ICMgfX19CgojIHN1YiBqdWxpYW4vamQgI3t7ewoKPWhlYWQyIGp1bGlhbgoKICBteSAkamQgPSAkZGF0ZS0+amQ7CgpSZXR1cm5zIGEgbGlzdHJlZiwgY29udGFpbmluZyB0d28gZWxlbWVudHMuIFRoZSBkYXRlIGFzIGEganVsaWFuIGRheSwKYW5kIHRoZSB0aW1lIGFzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBtaWRuaWdodC4gVGhpcyBzaG91bGQgbm90IApiZSB0aG91Z2h0IG9mIGFzIGEgcmVhbCBqdWxpYW4gZGF5LCBiZWNhdXNlIGl0J3Mgbm90LiBUaGUgbW9kdWxlIGlzCmludGVybmFsbHkgY29uc2lzdGVudCwgYW5kIHRoYXQncyBlbm91Z2guCgpUaGlzIG1ldGhvZCByZWFsbHkgb25seSBpcyBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMKdmVyc2lvbnMsIGFzIHRoZSBqZCBtZXRob2QgaXMgbm93IHRocm93biBvdmVyIGZvciBwbGFpbiBoYXNoIHJlZmVyZW5jZXMuCgpTZWUgdGhlIGZpbGUgSU5URVJOQUxTIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW50ZXJuYWwKZm9ybWF0LgoKPWN1dAoKc3ViIGpkIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgaWYgKCBteSAkamQgPSBzaGlmdCApIHsKICAgICAgICAoICRzZWxmLT57anVsaWFufSwgJHNlbGYtPntqdWxzZWN9ICkgPSBAJGpkOwogICAgfQoKICAgIHJldHVybiBbICRzZWxmLT57anVsaWFufSwgJHNlbGYtPntqdWxzZWN9IF07Cn0KCnN1YiBqdWxpYW4geyByZXR1cm4gamQoQF8pIH0KCiMgSU5URVJOQUwgT05MWTogZmlndXJlcyBvdXQgd2hhdCB0aGUgVVRDIG9mZnNldCAoaW4gSEhNTSkgaXMKIyBpcyBmb3IgdGhlIGN1cnJlbnQgbWFjaGluZS4Kc3ViIF9jYWxjX2xvY2FsX29mZnNldCB7CgogICAgdXNlIFRpbWU6OkxvY2FsOwogICAgbXkgQHQgPSBnbXRpbWU7CgogICAgbXkgJGxvY2FsID0gdGltZWxvY2FsKEB0KTsKICAgIG15ICRnbSAgICA9IHRpbWVnbShAdCk7CgogICAgbXkgJHNlY2RpZmYgPSAkZ20gLSAkbG9jYWw7CiAgICByZXR1cm4gb2Zmc2V0X2Zyb21fc2Vjb25kcygkc2VjZGlmZik7Cn0KCiN9fX0KCjE7CgojIE1vcmUgZG9jcyB7e3sKCj1oZWFkMSBUT0RPCgo9b3ZlciA0IAoKPWl0ZW0gLSBhZGQgZ210aW1lIGFuZCBsb2NhbHRpbWUgbWV0aG9kcywgcGVyaGFwcz8KCj1pdGVtIC0gRml4IHRoZSBJTlRFUk5BTFMgZmlsZSBzbyB0aGF0IGl0IGFjdHVhbGx5IHJlZmxlY3RzIHJlYWxpdHkKCj1iYWNrCgo9aGVhZDEgSU5URVJOQUxTCgpQbGVhc2Ugc2VlIHRoZSBmaWxlIElOVEVSTkFMUyBmb3IgZGlzY3Vzc2lvbiBvbiB0aGUgaW50ZXJuYWxzLgoKPWhlYWQxIEFVVEhPUgoKUmljaCBCb3dlbiAoRHJCYWNjaHVzKSByYm93ZW5AcmNib3dlbi5jb20KCkFuZCB0aGUgcmVzdCBvZiB0aGUgUmVlZmtub3QgdGVhbS4gU2VlIHRoZSBzb3VyY2UgZm9yIGEgZnVsbApsaXN0IG9mIHBhdGNoIGNvbnRyaWJ1dG9ycyBhbmQgdmVyc2lvbi1ieS12ZXJzaW9uIG5vdGVzLgoKPWhlYWQxIFNFRSBBTFNPCgpkYXRldGltZUBwZXJsLm9yZyBtYWlsaW5nIGxpc3QKCmh0dHA6Ly9kYXRldGltZS5wZXJsLm9yZy8KClRpbWU6OkxvY2FsCgpOZXQ6OklDYWwKCj1jdXQKCiN9fX0KCg==
IyAkSGVhZGVyOiAvY3Zzcm9vdC9kYXRlLWxlYXB5ZWFyL2xpYi9EYXRlL0xlYXB5ZWFyLnBtLHYgMS43MSAyMDAyLzA4LzMwIDAwOjAwOjI1IHJib3dlbiBFeHAgJApwYWNrYWdlIERhdGU6OkxlYXB5ZWFyOwp1c2Ugc3RyaWN0OwoKdXNlIEV4cG9ydGVyOwp1c2UgdmFycyBxdyhASVNBIEBFWFBPUlQgJFZFUlNJT04pOwpASVNBID0gcXcoRXhwb3J0ZXIpOwoKQEVYUE9SVCA9IHF3KCBpc2xlYXAgKTsKJFZFUlNJT04gPSAoIHF3JyRSZXZpc2lvbjogMS43MiAkJyApWzFdOwoKPWhlYWQxIE5BTUUKCkRhdGU6OkxlYXB5ZWFyIC0gSXMgYSBwYXJ0aWN1bGFyIHllYXIgYSBsZWFwIHllYXI/Cgo9aGVhZDEgU1lOT1BTSVMKCiAgdXNlIERhdGU6OkxlYXB5ZWFyOwogIGlmICggaXNsZWFwKDE5NDUpICkgewogICAgLi4uCiAgfQoKPWhlYWQxIERFU0NSSVBUSU9OCgpEYXRlOjpMZWFweWVhciBleHBvcnRzIG9uZSBmdW5jdGlvbiAtIGlzbGVhcCAtIHdoaWNoIHJldHVybnMgMSBvciAwIGlmCmEgeWVhciBpcyBsZWFwLCBvciBub3QsIHJlc3BlY3RpdmVseS4KCj1oZWFkMSBpc2xlYXAKCiAgICAkdHJ1ZSA9IGlzbGVhcCggMjAwNCApOwoKUmV0dXJucyAxIGluIGEgbGVhcCB5ZWFyLCAwIG90aGVyd2lzZS4KCj1jdXQKCnN1YiBpc2xlYXAgewogICAgbXkgKCR5ZWFyKSA9IEBfOwogICAgcmV0dXJuIDEgaWYgKCggJHllYXIgJSA0MDAgKSA9PSAwICk7ICMgNDAwJ3MgYXJlIGxlYXAKICAgIHJldHVybiAwIGlmICgoICR5ZWFyICUgMTAwICkgPT0gMCApOyAjIE90aGVyIGNlbnR1cmllcyBhcmUgbm90CiAgICByZXR1cm4gMSBpZiAoKCAkeWVhciAlIDQgKSA9PSAwICk7ICMgQWxsIG90aGVyIDQncyBhcmUgbGVhcAogICAgcmV0dXJuIDA7ICMgRXZlcnl0aGluZyBlbHNlIGlzIG5vdAp9CgoxOwoKPWhlYWQxIEFVVEhPUgoKUmljaCBCb3dlbiAocmJvd2VuQHJjYm93ZW4uY29tKQoKPWN1dAoK
cGFja2FnZSBEYXRlOjpJQ2FsOjpEdXJhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSBDYXJwOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04gKTsKJFZFUlNJT04gPSAocXcnJFJldmlzaW9uOiAxLjYxICQnKVsxXTsKCiMgRG9jdW1lbnRhdGlvbiB7e3sKCj1oZWFkMSBOQU1FCgpEYXRlOjpJQ2FsOjpEdXJhdGlvbiAtIGR1cmF0aW9ucyBpbiBpQ2FsZW5kYXIgZm9ybWF0LCBmb3IgbWF0aCBwdXJwb3Nlcy4KCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNjEgJAoKPWhlYWQxIFNZTk9QU0lTCgogICAgdXNlIERhdGU6OklDYWw6OkR1cmF0aW9uOwoKICAgICRkID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyggaWNhbCA9PiAnLVAxVzNEVDJIM000NVMnICk7CgogICAgJGQgPSBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3KCB3ZWVrcyA9PiAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5cyA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VycyA9PiA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVzID0+IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzID0+IDQ1KTsgCgogICAgIyBhIG9uZSBob3VyIGR1cmF0aW9uLCB3aXRob3V0IG90aGVyIGNvbXBvbmVudHMKICAgICRkID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyggc2Vjb25kcyA9PiAiMzYwMCIpOyAKCiAgICAjIFJlYWQtb25seSBhY2Nlc3NvcnM6CiAgICAkZC0+d2Vla3M7CiAgICAkZC0+ZGF5czsKICAgICRkLT5ob3VyczsKICAgICRkLT5taW51dGVzOwogICAgJGQtPnNlY29uZHM7CiAgICAkZC0+c2lnbjsKCiAgICAjIFRPRE86IFJlc29sdmUgc2lnbigpIGRpc2N1c3Npb24gZnJvbSByay1kZXZlbCBhbmQgdXBkYXRlIHN5bm9wc2lzLgogICAgCiAgICAkZC0+YXNfc2Vjb25kcyAoKTsgICAjIHJldHVybnMganVzdCBzZWNvbmRzCiAgICAkZC0+YXNfZWxlbWVudHMgKCk7ICAjIHJldHVybnMgYSBoYXNoIG9mIGVsZW1lbnRzLCBsaWtlIHRoZSBhY2Nlc3NvcnMgYWJvdmUKICAgICRkLT5hc19pY2FsKCk7ICAgICAgICMgcmV0dXJucyBhbiBpQ2FsZW5kYXIgZHVyYXRpb24gc3RyaW5nCiAgICAKPWhlYWQxIERFU0NSSVBUSU9OCgpUaGlzIGlzIGEgdHJpdmlhbCBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGR1cmF0aW9uIG9iamVjdHMsIGZvciBkb2luZyBtYXRoCmluIERhdGU6OklDYWwKCj1oZWFkMSBBVVRIT1IKClJpY2ggQm93ZW4sIGFuZCB0aGUgUmVlZmtub3QgdGVhbS4gQWxhcywgUmVlZmtub3QgaXMgbm8gbW9yZS4gU2VlCmh0dHA6Ly9kYXRldGltZS5wZXJsLm9yZy8gZm9yIG1vcmUgbW9kZXJuIG1vZHVsZXMuCgpMYXN0IHRvdWNoZWQgYnkgJEF1dGhvcjogcmJvd2VuICQKCj1oZWFkMSBNRVRIT0RTCgpEYXRlOjpJQ2FsOjpEdXJhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzIGF2YWlsYWJsZToKCj1oZWFkMiBuZXcKCkEgbmV3IERhdGU6OklDYWw6OkR1cmF0aW9uIG9iamVjdCBjYW4gYmUgY3JlYXRlZCB3aXRoIGFuIGlDYWxlbmRhciBzdHJpbmcgOgoKICAgIG15ICRpY2FsID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyAoIGljYWwgPT4gJ1AzVzJEJyApOwogICAgIyAzIHdlZWtzLCAyIGRheXMsIHBvc2l0aXZlIGRpcmVjdGlvbgogICAgbXkgJGljYWwgPSBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3ICggaWNhbCA9PiAnLVA2SDNNMzBTJyApOwogICAgIyA2IGhvdXJzLCAzIG1pbnV0ZXMsIDMwIHNlY29uZHMsIG5lZ2F0aXZlIGRpcmVjdGlvbgogICAgCk9yIHdpdGggYSBudW1iZXIgb2Ygc2Vjb25kczoKCiAgICBteSAkaWNhbCA9IERhdGU6OklDYWw6OkR1cmF0aW9uLT5uZXcgKCBzZWNvbmRzID0+ICIzNjAwIiApOwogICAgIyBvbmUgaG91ciBwb3NpdGl2ZQoKT3IsIGJldHRlciBzdGlsbCwgY3JlYXRlIGl0IHdpdGggY29tcG9uZW50cwoKICAgIG15ICRkYXRlID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrcyA9PiA2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5cyA9PiAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91cnMgPT4gNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlcyA9PiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyA9PiA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9PiAiKyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKClRoZSBzaWduIGRlZmF1bHRzIHRvICIrIiwgYnV0ICIrIiBhbmQgIi0iIGFyZSBsZWdhbCB2YWx1ZXMuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPWN1dAoKI319fQoKI3t7eyBzdWIgbmV3CgpzdWIgbmV3IHsKICAgIG15ICgkY2xhc3MsICVhcmdzKSA9IEBfOwogICAgbXkgJHZlcmlmaWVkID0ge307CiAgICBteSAkc2VsZiA9IHt9OwogICAgYmxlc3MgJHNlbGYsICRjbGFzczsKCiAgICBteSAkc2Vjb25kc19vbmx5ID0gMTsgICAgIyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2Ugd2VyZSBnaXZlbiBsZW5ndGggaW4gc2Vjb25kcyBvbmx5CiAgICAkc2Vjb25kc19vbmx5ID0gMCB1bmxlc3MgKGRlZmluZWQgJGFyZ3N7J3NlY29uZHMnfSk7IAoKICAgICMgSWYgb25lIG9mIHRoZSBhdHRyaWJ1dGVzIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZXkgYWxsIG11c3QgYmUKICAgICMgbmVnYXRpdmUuIE90aGVyd2lzZSwgd2UncmUgbm90IHN1cmUgd2hhdCB0aGlzIG1lYW5zLgogICAgZm9yZWFjaCAocXcoaG91cnMgbWludXRlcyBzZWNvbmRzIGRheXMgd2Vla3MpKSB7CiAgICAgICAgaWYgKGRlZmluZWQoJGFyZ3N7JF99KSApICAgewogICAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGlzIGFyZ3VtZW50IGlzIGFsbCBkaWdpdHMsIG9wdGlvbmFsIC0gc2lnbgogICAgICAgICAgICBpZiAoJGFyZ3N7JF99ID1+IG0vLT9bMC05XSskLykgeyAKICAgICAgICAgICAgICAgIGlmICgkYXJnc3skX30gPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgJGFyZ3N7c2lnbn0gPSAnLSc7CiAgICAgICAgICAgICAgICAgICAgJGFyZ3N7JF99ID0gYWJzKCRhcmdzeyRffSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdmVyaWZpZWQtPnskX30gPSAkYXJnc3skX307CiAgICAgICAgICAgICAgICB1bmxlc3MgKCRfIGVxICdzZWNvbmRzJykgewogICAgICAgICAgICAgICAgICAgICRzZWNvbmRzX29ubHkgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2FycCAoIlBhcmFtZXRlciAkXyBjb250YWlucyBub24tbnVtZXJpYyB2YWx1ZSAiIC4gJGFyZ3N7JF99IC4gIlxuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGRlZmluZWQgKCRhcmdze3NpZ259KSApIHsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhpcyBhcmd1bWVudCArIG9yIC0KICAgICAgICBpZiAoJGFyZ3N7c2lnbn0gPX4gbS9bKy1dLykgewogICAgICAgICAgICAjIGlmIHNvLCBhc3NpZ24gaXQKICAgICAgICAgICAgJHNlbGYtPntzaWdufSA9ICgkYXJnc3tzaWdufSBlcSAiKyIpID8gMSA6IC0xOwogICAgICAgICAgICAkdmVyaWZpZWQtPntzaWdufSA9ICgkYXJnc3tzaWdufSBlcSAiKyIpID8gJysnIDogJy0nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNhcnAgKCJQYXJhbWV0ZXIgc2lnbiBjb250YWlucyBhIHZhbHVlIG90aGVyIHRoYW4gKyBvciAtIDogIgogICAgICAgICAgICAgICAgLiAkYXJnc3tzaWdufSAuICJcbiIpOwogICAgICAgIH0KICAgICAgICAKICAgIH0KCiAgICAjIElmIGEgbnVtYmVyIGlzIGdpdmVuLCBjb252ZXJ0IGl0IHRvIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kcywKICAgICMgYnV0ICpkb24ndCogZXh0cmFjdCBkYXlzIC0tIHdlIHdhbnQgaXQgdG8gcmVwcmVzZW50IGFuIGFic29sdXRlCiAgICAjIGFtb3VudCBvZiB0aW1lLCByZWdhcmRsZXNzIG9mIHRpbWV6b25lCiAgICBpZiAoJHNlY29uZHNfb25seSkgeyAjIGlmIHdlIHdlcmUgZ2l2ZW4gYW4gaW50ZWdlciB0aW1lX3QKICAgICAgICAkc2VsZi0+X3NldF9mcm9tX3NlY29uZHMoJGFyZ3N7J3NlY29uZHMnfSk7CiAgICB9IGVsc2lmIChkZWZpbmVkICgkYXJnc3snaWNhbCd9KSApIHsgICAKICAgICAgICAjIEEgc3RhbmRhcmQgZHVyYXRpb24gc3RyaW5nCiAgICAgICAgI3dhcm4gInNldHRpbmcgZnJvbSBpY2FsXG4iOwogICAgICAgICRzZWxmLT5fc2V0X2Zyb21faWNhbCgkYXJnc3snaWNhbCd9KTsKICAgIH0gZWxzaWYgKG5vdCAkc2Vjb25kc19vbmx5KSB7CiAgICAgICAgI3dhcm4gInNldHRpbmcgZnJvbSBjb21wb25lbnRzIjsKICAgICAgICAjdXNlIERhdGE6OkR1bXBlcjsgd2FybiBEdW1wZXIgJHZlcmlmaWVkOwogICAgICAgICRzZWxmLT5fc2V0X2Zyb21fY29tcG9uZW50cygkdmVyaWZpZWQpOwogICAgfQogICAgCiAgICByZXR1cm4gdW5kZWYgdW5sZXNzICVhcmdzOwogICAKICAgIHJldHVybiAkc2VsZjsKfQoKI319fQoKIyBBY2Nlc3NvcnMge3t7Cgo9aGVhZDIgc2lnbiwgd2Vla3MsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzCgpSZWFkLW9ubHkgYWNjZXNzb3JzIGZvciB0aGUgZWxlbWVudHMgb2YgdGhlIG9iamVjdC4gCgo9Y3V0IAoKI319fQoKIyB7e3sgc3ViIHNpZ24gCgpzdWIgc2lnbiB7CiAgICBteSAoJHNlbGYpID0gQF87CiAgICByZXR1cm4gJHNlbGYtPntzaWdufTsKfQoKI319fQoKIyB7e3sgc3ViIHdlZWtzIAoKc3ViIHdlZWtzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICR3ID0gJHskc2VsZi0+X3dkfVswXTsKICAgIHJldHVybiB1bmxlc3MgJHc7CiAgICByZXR1cm4gJHNlbGYtPntzaWdufSAqICR3Owp9CgojfX19CgojIHt7eyBzdWIgZGF5cyAKCnN1YiBkYXlzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICRkID0gJHskc2VsZi0+X3dkfVsxXTsKICAgIHJldHVybiB1bmxlc3MgJGQ7CiAgICByZXR1cm4gICRzZWxmLT57c2lnbn0gKiAkZDsKCn0gI319fQoKI3t7eyBzdWIgaG91cnMgCgpzdWIgaG91cnMgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgbXkgJGggPSAkeyRzZWxmLT5faG1zfVswXTsKICAgIHJldHVybiB1bmxlc3MgJGg7CiAgICByZXR1cm4gJHNlbGYtPntzaWdufSAqICRoOwp9CgojfX19CgojIHt7eyBzdWIgbWludXRlcyAKCnN1YiBtaW51dGVzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICRtID0gJHskc2VsZi0+X2htc31bMV07CiAgICByZXR1cm4gdW5sZXNzICRtOwogICAgcmV0dXJuICRzZWxmLT57c2lnbn0gKiAkbTsKfQoKI319fQoKIyB7e3sgc3ViIHNlY29uZHMgCgpzdWIgc2Vjb25kcyB7CiAgICBteSAoJHNlbGYpID0gQF87CiAgICBteSAkcyA9ICR7JHNlbGYtPl9obXN9WzJdOwogICAgcmV0dXJuIHVubGVzcyAkczsKICAgIHJldHVybiAkc2VsZi0+e3NpZ259ICogJHM7Cn0KCiN9fX0KCiMgc3ViIGFzX3NlY29uZHMge3t7Cgo9aGVhZDIgYXNfc2Vjb25kcwoKUmV0dXJucyB0aGUgZHVyYXRpb24gaW4gcmF3IHNlY29uZHMuIAoKV0FSTklORyAtLSB0aGlzIGZvbGRzIGluIHRoZSBudW1iZXIgb2YgZGF5cywgYXNzdW1pbmcgdGhhdCB0aGV5IGFyZSBhbHdheXMgODY0MDAKc2Vjb25kcyBsb25nICh3aGljaCBpcyBub3QgdHJ1ZSB0d2ljZSBhIHllYXIgaW4gYXJlYXMgdGhhdCBob25vciBkYXlsaWdodApzYXZpbmdzIHRpbWUpLiAgSWYgeW91J3JlIHVzaW5nIHRoaXMgZm9yIGRhdGUgYXJpdGhtZXRpYywgY29uc2lkZXIgdXNpbmcgdGhlCkk8YWRkKCk+IG1ldGhvZCBmcm9tIGEgTDxEYXRlOjpJQ2FsPiBvYmplY3QsIGFzIHRoaXMgd2lsbCBiZWhhdmUgYmV0dGVyLgpPdGhlcndpc2UsIHlvdSBtaWdodCBleHBlcmllbmNlIHNvbWUgZXJyb3Igd2hlbiB3b3JraW5nIHdpdGggdGltZXMgdGhhdCBhcmUKc3BlY2lmaWVkIGluIGEgdGltZSB6b25lIHRoYXQgb2JzZXJ2ZXMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLgoKCj1jdXQgCgpzdWIgYXNfc2Vjb25kcyB7CiAgICBteSAoJHNlbGYpID0gQF87CgogICAgbXkgJG5zZWNzID0gJHNlbGYtPntuc2Vjc30gfHwgMDsKICAgIG15ICRuZGF5cyA9ICRzZWxmLT57bmRheXN9IHx8IDA7CiAgICBteSAkc2lnbiAgPSAkc2VsZi0+e3NpZ259ICB8fCAxOwogICAgcmV0dXJuICRzaWduKigkbnNlY3MrKCRuZGF5cyoyNCo2MCo2MCkpOwp9CgojfX19CgojIHN1YiBhc19kYXlzIHt7ewoKPWhlYWQyIGFzX2RheXMKCiAgICAkZGF5cyA9ICRkdXJhdGlvbi0+YXNfZGF5czsKClJldHVybnMgdGhlIGR1cmF0aW9uIGFzIGEgbnVtYmVyIG9mIGRheXMuIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHRoZQpDPGRheXM+IG1ldGhvZCwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGRheXMsIHJhdGhlcgp0aGFuIG1vZCdpbmcgb3V0IHRoZSBjb21wbGV0ZSB3ZWVrcy4gVGh1cywgaWYgd2UgaGF2ZSBhIGR1cmF0aW9uIG9mIDMzCmRheXMsIEM8d2Vla3M+IHdpbGwgcmV0dXJuIDQsIEM8ZGF5cz4gd2lsbCByZXR1cm4gNSwgYnV0IEM8YXNfZGF5cz4gd2lsbApyZXR1cm4gMzMuCgpOb3RlIHRoYXQgdGhpcyBpcyBhIGxhenkgY29udmVuaWVuY2UgZnVuY3Rpb24gd2hpY2ggaXMganVzdCB3ZWVrcyo3ICsKZGF5cy4KCj1jdXQKCnN1YiBhc19kYXlzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICR3ZCA9ICRzZWxmLT5fd2Q7CiAgICByZXR1cm4gJHNlbGYtPntzaWdufSAqICggJHdkLT5bMF0qNyArICR3ZC0+WzFdICk7Cn0jIH19fQoKI3t7eyBzdWIgYXNfaWNhbCAKCj1oZWFkMiBhc19pY2FsCgpSZXR1cm4gdGhlIGR1cmF0aW9uIGluIGFuIGlDYWxlbmRhciBmb3JtYXQgdmFsdWUgc3RyaW5nIChlLmcuLCAiUFQySDBNMFMiKQoKPWN1dCAKCnN1YiBhc19pY2FsIHsKICAgIG15ICgkc2VsZikgPSBAXzsKCiAgICBteSAkdHBhcnQgPSAnJzsKCiAgICBpZiAobXkgJGFyX2htcyA9ICRzZWxmLT5faG1zKSB7CiAgICAgICAgJHRwYXJ0ID0gc3ByaW50ZignVCVkSCVkTSVkUycsIEAkYXJfaG1zKTsKICAgIH0KCiAgICBteSAkYXJfd2QgPSAkc2VsZi0+X3dkKCk7CiAgICAKICAgIG15ICRkcGFydCA9ICcnOwogICAgaWYgKGRlZmluZWQgJGFyX3dkKSB7CiAgICAgICAgbXkgKCR3ZWVrcywgJGRheXMpID0gQCRhcl93ZDsKICAgICAgICBpZiAoJHdlZWtzICYmICRkYXlzKSB7CiAgICAgICAgICAgICRkcGFydCA9IHNwcmludGYoJyVkVyVkRCcsICR3ZWVrcywgJGRheXMpOwogICAgICAgIH0gZWxzaWYgKCR3ZWVrcykgeyAgICMgKGlmIGRheXMgPSAwKQogICAgICAgICAgICAkZHBhcnQgPSBzcHJpbnRmKCclZFcnLCAkd2Vla3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRkcGFydCA9IHNwcmludGYoJyVkRCcsICRkYXlzKTsKICAgICAgICB9CiAgICB9CgogICAgIyBwdXQgYSBzaWduIGluIHRoZSByZXR1cm4gdmFsdWUgaWYgbmVjZXNzYXJ5CiAgICBteSAkdmFsdWUgPSBqb2luKCcnLCAoKCRzZWxmLT57c2lnbn0gPCAwKSA/ICctJyA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgJ1AnLCAkZHBhcnQsICR0cGFydCk7CgogICAgIyByZW1vdmUgYW55IHplcm8gY29tcG9uZW50cyBmcm9tIHRoZSB0aW1lIHN0cmluZyAoLVAxMEQwSCAtPiAtUDEwRCkKICAgICR2YWx1ZSA9fiBzLyg/PD1bXlxkXSkwW1dESE1TXS8vZzsKCiAgICAjIHJldHVybiBlaXRoZXIgdGhlIHRpbWUgdmFsdWUgb3IgUFQwUyAoaWYgdGhlIHRpbWUgdmFsdWUgaXMgemVybykuCiAgICByZXR1cm4gKCgkdmFsdWUgIX4gL1BUPyQvKSA/ICR2YWx1ZSA6ICdQVDBTJyk7Cn0KCiN9fX0KCiN7e3sgc3ViIGFzX2VsZW1lbnRzCgo9aGVhZDIgYXNfZWxlbWVudHMKClJldHVybnMgdGhlIGR1cmF0aW9uIGFzIGEgaGFzaHJlZiBvZiBlbGVtZW50cy4gCgo9Y3V0IAoKc3ViIGFzX2VsZW1lbnRzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgCiAgICAjIGdldCB2YWx1ZXMgZm9yIGFsbCB0aGUgZWxlbWVudHMKICAgIG15ICR3ZCA9ICRzZWxmLT5fd2Q7CiAgICBteSAkaG1zID0gJHNlbGYtPl9obXM7CiAgIAogICAgbXkgJHJldHVybiA9IHsKICAgICAgICBzaWduID0+ICRzZWxmLT57c2lnbn0sIAogICAgICAgIHdlZWtzID0+ICR7JHdkfVswXSwKICAgICAgICBkYXlzID0+ICR7JHdkfVsxXSwKICAgICAgICBob3VycyA9PiAkeyRobXN9WzBdLAogICAgICAgIG1pbnV0ZXMgPT4gJHskaG1zfVsxXSwKICAgICAgICBzZWNvbmRzID0+ICR7JGhtc31bMl0sCiAgICB9OwogICAgcmV0dXJuICRyZXR1cm47Cn0KCiN9fX0KCiMgSU5URVJOQUxTIHt7ewoKPWhlYWQxIElOVEVSTkFMUwoKaGVhZDIgR0VORVJBTCBNT0RFTAoKSW50ZXJuYWxseSwgd2Ugc3RvcmUgMyBkYXRhIHZhbHVlczogYSBudW1iZXIgb2YgZGF5cywgYSBudW1iZXIgb2Ygc2Vjb25kcyAoYW55dGhpbmcKc2hvcnRlciB0aGFuIGEgZGF5KSwgYW5kIGEgc2lnbiAoMSBvciAtMSkuIFdlIGFyZSBhc3N1bWluZyB0aGF0IGEgZGF5IGlzIDI0IGhvdXJzIGZvcgpwdXJwb3NlcyBvZiB0aGlzIG1vZHVsZTsgeWVzLCB3ZSBrbm93IHRoYXQncyBub3QgY29tcGxldGVseSBhY2N1cmF0ZSBiZWNhdXNlIG9mCmRheWxpZ2h0LXNhdmluZ3MtdGltZSBzd2l0Y2hvdmVycywgYnV0IGl0J3MgbW9zdGx5IGNvcnJlY3QuIFN1Z2dlc3Rpb25zIGFyZSB3ZWxjb21lLgoKTk9URTogVGhlIG1ldGhvZHMgYmVsb3cgU0hPVUxEIE5PVCBiZSByZWxpZWQgb24gdG8gc3RheSB0aGUgc2FtZSBpbiBmdXR1cmUgdmVyc2lvbnMuCgo9aGVhZDIgX3NldF9mcm9tX2ljYWwgKCRzZWxmLCAkZHVyYXRpb25fc3RyaW5nKQoKQ29udmVydHMgYSBSRkMyNDQ1IERVUkFUSU9OIGZvcm1hdCBzdHJpbmcgdG8gdGhlIGludGVybmFsIHN0b3JhZ2UgZm9ybWF0LgoKPWN1dAoKI319fQoKIyBzdWIgX3NldF9mcm9tX2ljYWwgKGludGVybmFsKSB7e3sKCnN1YiBfc2V0X2Zyb21faWNhbCB7CiAgICBteSAoJHNlbGYsICRzdHIpID0gQF87CgogICAgbXkgJHBhcnNlZF92YWx1ZXMgPSBfcGFyc2VfaWNhbF9zdHJpbmcoJHN0cik7CiAgICAKICAgIHJldHVybiAkc2VsZi0+X3NldF9mcm9tX2NvbXBvbmVudHMoJHBhcnNlZF92YWx1ZXMpOwp9ICMgfX19CgojIHN1YiBfcGFyc2VfaWNhbF9zdHJpbmcgKGludGVybmFsKSB7e3sKCj1oZWFkMiBfcGFyc2VfaWNhbF9zdHJpbmcgKCRzdHJpbmcpCgpSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHBhcnNpbmcgaUNhbGVuZGFyIGludG8gdXNhYmxlIHZhbHVlcy4gCgo9Y3V0CgpzdWIgX3BhcnNlX2ljYWxfc3RyaW5nIHsKICAgIG15ICgkc3RyKSA9IEBfOwogICAgCiAgICAjIFJGQyAyNDQ1IHNlY3Rpb24gNC4zLjYKICAgICMKICAgICMgZHVyLXZhbHVlICA9IChbIisiXSAvICItIikgIlAiIChkdXItZGF0ZSAvIGR1ci10aW1lIC8gZHVyLXdlZWspCiAgICAjIGR1ci1kYXRlICAgPSBkdXItZGF5IFtkdXItdGltZV0KICAgICMgZHVyLXRpbWUgICA9ICJUIiAoZHVyLWhvdXIgLyBkdXItbWludXRlIC8gZHVyLXNlY29uZCkKICAgICMgZHVyLXdlZWsgICA9IDEqRElHSVQgIlciCiAgICAjIGR1ci1ob3VyICAgPSAxKkRJR0lUICJIIiBbZHVyLW1pbnV0ZV0KICAgICMgZHVyLW1pbnV0ZSA9IDEqRElHSVQgIk0iIFtkdXItc2Vjb25kXQogICAgIyBkdXItc2Vjb25kID0gMSpESUdJVCAiUyIKICAgICMgZHVyLWRheSAgICA9IDEqRElHSVQgIkQiCgogICAgbXkgKCRzaWduX3N0ciwgJG1hZ2ljLCAkd2Vla3MsICRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykgPQogICAgICAgICRzdHIgPX4gbXsKICAgICAgICAgICAgKFtcK1wtXSk/ICAgKD8jIFNpZ24pCiAgICAgICAgICAgIChQKSAgICAgKD8jICdQJyBmb3IgcGVyaW9kPyBUaGlzIGlzIG91ciBtYWdpYyBjaGFyYWN0ZXIpCiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgKD86KFxkKylXKT8gKD8jIFdlZWtzKQogICAgICAgICAgICAgICAgKD86KFxkKylEKT8gKD8jIERheXMpCiAgICAgICAgICAgICk/CiAgICAgICAgICAgICg/OlQgICAgICAgICg/IyBUaW1lIHByZWZpeCkKICAgICAgICAgICAgICAgICg/OihcZCspSCk/ICg/IyBIb3VycykKICAgICAgICAgICAgICAgICg/OihcZCspTSk/ICg/IyBNaW51dGVzKQogICAgICAgICAgICAgICAgKD86KFxkKylTKT8gKD8jIFNlY29uZHMpCiAgICAgICAgICAgICk/CiAgICAgICAgfXg7CgogICAgaWYgKCFkZWZpbmVkKCRtYWdpYykpIHsKICAgICAgICBjYXJwICJJbnZhbGlkIGR1cmF0aW9uOiAkc3RyIjsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9CgogICAgIyBtYWtlIHN1cmUgdGhlIHNpZ24gZ2V0cyBzZXQsIGFuZCB0dXJuIGl0IGludG8gYW4gaW50ZWdlciBtdWx0aXBsaWVyCiAgICAkc2lnbl9zdHIgfHw9ICIrIjsKICAgIG15ICRzaWduID0gKCRzaWduX3N0ciBlcSAiLSIpID8gLTEgOiAxOwogICAgCiAgICBteSAkcmV0dXJuID0ge307CiAgICAkcmV0dXJuLT57J3dlZWtzJ30gPSAkd2Vla3M7CiAgICAkcmV0dXJuLT57J2RheXMnfSA9ICRkYXlzOwogICAgJHJldHVybi0+eydob3Vycyd9ID0gJGhvdXJzOwogICAgJHJldHVybi0+eydtaW51dGVzJ30gPSAkbWludXRlczsKICAgICRyZXR1cm4tPnsnc2Vjb25kcyd9ID0gJHNlY29uZHM7CiAgICAkcmV0dXJuLT57J3NpZ24nfSA9ICRzaWduOwoKICAgIHJldHVybiAkcmV0dXJuOwp9ICMgfX19CgojIHN1YiBfc2V0X2Zyb21fY29tcG9uZW50cyAoaW50ZXJuYWwpIHt7ewoKPWhlYWQyIF9zZXRfZnJvbV9jb21wb25lbnRzICgkc2VsZiwgJGhhc2hyZWYpCgpDb252ZXJ0cyBmcm9tIGEgaGFzaHJlZiB0byB0aGUgaW50ZXJuYWwgc3RvcmFnZSBmb3JtYXQuClRoZSBoYXNocmVmIGNhbiBjb250YWluIGVsZW1lbnRzICJzaWduIiwgIndlZWtzIiwgImRheXMiLCAiaG91cnMiLCAibWludXRlcyIsICJzZWNvbmRzIi4KCj1jdXQKCnN1YiBfc2V0X2Zyb21fY29tcG9uZW50cyB7CiAgICBteSAoJHNlbGYsICRhcmdzKSA9IEBfOwoKICAgICMgU2V0IHVwIHNvbWUgZWFzaWVyLXRvLXJlYWQgdmFyaWFibGVzCiAgICBteSAoJHNpZ24sICR3ZWVrcywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKTsKICAgICRzaWduID0gJGFyZ3MtPnsnc2lnbid9OwogICAgJHdlZWtzID0gJGFyZ3MtPnsnd2Vla3MnfTsKICAgICRkYXlzID0gJGFyZ3MtPnsnZGF5cyd9OwogICAgJGhvdXJzID0gJGFyZ3MtPnsnaG91cnMnfTsKICAgICRtaW51dGVzID0gJGFyZ3MtPnsnbWludXRlcyd9OwogICAgJHNlY29uZHMgPSAkYXJncy0+eydzZWNvbmRzJ307CiAgICAKICAgICRzZWxmLT57c2lnbn0gPSAoZGVmaW5lZCgkc2lnbikgJiYgJHNpZ24gZXEgJy0nKSA/IC0xIDogMTsKCiAgICBpZiAoZGVmaW5lZCgkd2Vla3MpIG9yIGRlZmluZWQoJGRheXMpKSB7CiAgICAgICAgJHNlbGYtPl93ZChbJHdlZWtzIHx8IDAsICRkYXlzIHx8IDBdKTsKICAgIH0KCiAgICBpZiAoZGVmaW5lZCgkaG91cnMpIHx8IGRlZmluZWQoJG1pbnV0ZXMpIHx8IGRlZmluZWQoJHNlY29uZHMpKSB7CiAgICAgICAgJHNlbGYtPl9obXMoWyRob3VycyB8fCAwLCAkbWludXRlcyB8fCAwLCAkc2Vjb25kcyB8fCAwXSk7CiAgICB9CgogICAgcmV0dXJuICRzZWxmOwp9ICMgfX19CgojIHN1YiBfc2V0X2Zyb21faWNhbCAoaW50ZXJuYWwpIHt7ewoKPWhlYWQyIF9zZXRfZnJvbV9pY2FsICgkc2VsZiwgJG51bV9zZWNvbmRzKQoKU2V0cyBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgcHJvcGVybHkgaWYgd2Ugd2VyZSBvbmx5IGdpdmVuIHNlY29uZHMgYXMgYSBwYXJhbWV0ZXIuCgo9Y3V0CgpzdWIgX3NldF9mcm9tX3NlY29uZHMgewogICAgbXkgKCRzZWxmLCAkc2Vjb25kcykgPSBAXzsKICAgICAgICAgICAgCiAgICAkc2VsZi0+e3NpZ259ID0gKCgkc2Vjb25kcyA8IDApID8gLTEgOiAxKTsKICAgICMgZmluZCB0aGUgbnVtYmVyIG9mIGRheXMsIGlmIGFueQogICAgbXkgJG5kYXlzID0gaW50ICgkc2Vjb25kcyAvICgyNCo2MCo2MCkpOwogICAgIyBub3csIGhvdyBtYW55IGhvdXJzL21pbnV0ZXMvc2Vjb25kcyBhcmUgdGhlcmUsIGFmdGVyCiAgICAjIGRheXMgYXJlIHRha2VuIG91dD8KICAgIG15ICRuc2VjcyA9ICRzZWNvbmRzICUgKDI0KjYwKjYwKTsKICAgICRzZWxmLT57bmRheXN9ID0gYWJzKCRuZGF5cyk7CiAgICAkc2VsZi0+e25zZWNzfSA9IGFicygkbnNlY3MpOwoKCiAgICByZXR1cm4gJHNlbGY7Cn0gIyB9fX0KCiMgc3ViIF9obXMgKGludGVybmFsKSB7e3sKCj1oZWFkMiAkc2VsZi0+X2htcygpOwoKUmV0dXJuIGFuIGFycmF5cmVmIHRvIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kIGNvbXBvbmVudHMsIG9yIHVuZGVmCmlmIG5zZWNzIGlzIHVuZGVmaW5lZC4gIElmIGdpdmVuIGFuIGFycmF5cmVmLCBjb21wdXRlcyB0aGUgbmV3IG5zZWNzIHZhbHVlIApmb3IgdGhlIGR1cmF0aW9uLiAgCgo9Y3V0IAoKc3ViIF9obXMgewogICAgbXkgKCRzZWxmLCAkaG1zX2FycmF5cmVmKSA9IEBfOwoKICAgIGlmIChkZWZpbmVkKCRobXNfYXJyYXlyZWYpKSB7CiAgICAgICAgbXkgJG5ld19zZWNfdmFsdWUgPSAkaG1zX2FycmF5cmVmLT5bMF0qMzYwMCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaG1zX2FycmF5cmVmLT5bMV0qNjAgICArICRobXNfYXJyYXlyZWYtPlsyXTsKICAgICAgICAkc2VsZi0+e25zZWNzfSA9ICgkbmV3X3NlY192YWx1ZSk7CiAgICB9IAoKICAgIG15ICRuc2VjcyA9ICRzZWxmLT57bnNlY3N9OwogICAgaWYgKGRlZmluZWQoJG5zZWNzKSkgewogICAgICAgIG15ICRob3VycyA9IGludCgkbnNlY3MvMzYwMCk7CiAgICAgICAgbXkgJG1pbnV0ZXMgID0gaW50KCgkbnNlY3MtJGhvdXJzKjM2MDApLzYwKTsKICAgICAgICBteSAkc2Vjb25kcyAgPSAkbnNlY3MgJSA2MDsKICAgICAgICByZXR1cm4gWyAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcyBdOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAicmV0dXJuaW5nIHVuZGVmXG4iOwogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KfSAjIH19fQoKIyBzdWIgX3dkIChpbnRlcm5hbCkge3t7Cgo9aGVhZDIgJHNlbGYtPl93ZCgpIAoKUmV0dXJuIGFuIGFycmF5cmVmIHRvIHdlZWtzIGFuZCBkYXkgY29tcG9uZW50cywgb3IgdW5kZWYgaWYgbmRheXMKaXMgdW5kZWZpbmVkLiAgSWYgR2l2ZW4gYW4gYXJyYXlyZWYsIGNvbXB1dHMgdGhlIG5ldyBuZGF5cyB2YWx1ZQpmb3IgdGhlIGR1cmF0aW9uLiAgCgo9Y3V0IAoKc3ViIF93ZCAgewogICAgbXkgKCRzZWxmLCAkd2RfYXJyYXlyZWYpID0gQF87CgogICAgI3ByaW50ICJlbnRlcmluZyBfd2RcbiI7CiAgICAKICAgIGlmIChkZWZpbmVkKCR3ZF9hcnJheXJlZikpIHsKICAgICAgICAKICAgICAgICBteSAkbmV3X25kYXlzID0gJHdkX2FycmF5cmVmLT5bMF0qNyArICR3ZF9hcnJheXJlZi0+WzFdOwogICAgICAgICRzZWxmLT57bmRheXN9ID0gJG5ld19uZGF5czsKICAgIH0KICAgIAogICAgI3VzZSBEYXRhOjpEdW1wZXI7IHByaW50IER1bXBlciAkc2VsZi0+e25kYXlzfTsKICAgIAogICAgaWYgKGRlZmluZWQobXkgJG5kYXlzPSAkc2VsZi0+e25kYXlzfSkpIHsKICAgICAgICBteSAkd2Vla3MgPSBpbnQoJG5kYXlzLzcpOwogICAgICAgIG15ICRkYXlzICA9ICRuZGF5cyAlIDc7CiAgICAgICAgcmV0dXJuIFsgJHdlZWtzLCAkZGF5cyBdOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9Cn0gIyB9fX0KCjE7Cg==
cGFja2FnZSBEZXZlbDo6U3RhY2tUcmFjZTsKCnVzZSA1LjAwNjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkVkVSU0lPTiA9ICcyLjAxJzsKCnVzZSBEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWU7CnVzZSBGaWxlOjpTcGVjOwp1c2UgU2NhbGFyOjpVdGlsIHF3KCBibGVzc2VkICk7Cgp1c2Ugb3ZlcmxvYWQKICAgICciIicgICAgID0+IFwmYXNfc3RyaW5nLAogICAgZmFsbGJhY2sgPT4gMTsKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAlcCAgICAgPSBAXzsKCiAgICAkcHt1bnNhZmVfcmVmX2NhcHR1cmV9ID0gIWRlbGV0ZSAkcHtub19yZWZzfQogICAgICAgIGlmIGV4aXN0cyAkcHtub19yZWZzfTsKCiAgICBteSAkc2VsZiA9IGJsZXNzIHsKICAgICAgICBpbmRleCAgPT4gdW5kZWYsCiAgICAgICAgZnJhbWVzID0+IFtdLAogICAgICAgIHJhdyAgICA9PiBbXSwKICAgICAgICAlcCwKICAgIH0sICRjbGFzczsKCiAgICAkc2VsZi0+X3JlY29yZF9jYWxsZXJfZGF0YSgpOwoKICAgIHJldHVybiAkc2VsZjsKfQoKc3ViIF9yZWNvcmRfY2FsbGVyX2RhdGEgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICBteSAkZmlsdGVyID0gJHNlbGYtPntmaWx0ZXJfZnJhbWVzX2Vhcmx5fSAmJiAkc2VsZi0+X21ha2VfZnJhbWVfZmlsdGVyKCk7CgogICAgIyBXZSBleGNsdWRlIHRoaXMgbWV0aG9kIGJ5IHN0YXJ0aW5nIGF0IGxlYXN0IG9uZSBmcmFtZSBiYWNrLgogICAgbXkgJHggPSAxICsgKCAkc2VsZi0+e3NraXBfZnJhbWVzfSB8fCAwICk7CgogICAgd2hpbGUgKAogICAgICAgIG15IEBjCiAgICAgICAgPSAkc2VsZi0+e25vX2FyZ3N9CiAgICAgICAgPyBjYWxsZXIoICR4KysgKQogICAgICAgIDogZG8gewogICAgICAgICAgICAjIyBubyBjcml0aWMgKE1vZHVsZXM6OlByb2hpYml0TXVsdGlwbGVQYWNrYWdlcywgVmFyaWFibGVzOjpQcm9oaWJpdFBhY2thZ2VWYXJzKQogICAgICAgICAgICBwYWNrYWdlICAgICMgdGhlIG5ld2xpbmUga2VlcHMgZHppbCBmcm9tIGFkZGluZyBhIHZlcnNpb24gaGVyZQogICAgICAgICAgICAgICAgREI7CiAgICAgICAgICAgIEBEQjo6YXJncyA9ICgpOwogICAgICAgICAgICBjYWxsZXIoICR4KysgKTsKICAgICAgICB9CiAgICAgICAgKSB7CgogICAgICAgIG15IEBhcmdzOwoKICAgICAgICAjIyBubyBjcml0aWMgKFZhcmlhYmxlczo6UHJvaGliaXRQYWNrYWdlVmFycykKICAgICAgICBAYXJncyA9ICRzZWxmLT57bm9fYXJnc30gPyAoKSA6IEBEQjo6YXJnczsKICAgICAgICAjIyB1c2UgY3JpdGljCgogICAgICAgIG15ICRyYXcgPSB7CiAgICAgICAgICAgIGNhbGxlciA9PiBcQGMsCiAgICAgICAgICAgIGFyZ3MgICA9PiBcQGFyZ3MsCiAgICAgICAgfTsKCiAgICAgICAgbmV4dCBpZiAkZmlsdGVyICYmICEkZmlsdGVyLT4oJHJhdyk7CgogICAgICAgIHVubGVzcyAoICRzZWxmLT57dW5zYWZlX3JlZl9jYXB0dXJlfSApIHsKICAgICAgICAgICAgJHJhdy0+e2FyZ3N9ID0gWyBtYXAgeyByZWYgJF8gPyAkc2VsZi0+X3JlZl90b19zdHJpbmcoJF8pIDogJF8gfQogICAgICAgICAgICAgICAgICAgIEB7ICRyYXctPnthcmdzfSB9IF07CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRzZWxmLT57cmF3fSB9LCAkcmF3OwogICAgfQp9CgpzdWIgX3JlZl90b19zdHJpbmcgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRyZWYgID0gc2hpZnQ7CgogICAgcmV0dXJuIG92ZXJsb2FkOjpBZGRyUmVmKCRyZWYpCiAgICAgICAgaWYgYmxlc3NlZCAkcmVmICYmICRyZWYtPmlzYSgnRXhjZXB0aW9uOjpDbGFzczo6QmFzZScpOwoKICAgIHJldHVybiBvdmVybG9hZDo6QWRkclJlZigkcmVmKSB1bmxlc3MgJHNlbGYtPntyZXNwZWN0X292ZXJsb2FkfTsKCiAgICAjIyBubyBjcml0aWMgKFZhcmlhYmxlczo6UmVxdWlyZUluaXRpYWxpemF0aW9uRm9yTG9jYWxWYXJzKQogICAgbG9jYWwgJEA7CiAgICBsb2NhbCAkU0lHe19fRElFX199OwogICAgIyMgdXNlIGNyaXRpYwoKICAgIG15ICRzdHIgPSBldmFsIHsgJHJlZiAuIHF7fSB9OwoKICAgIHJldHVybiAkQCA/IG92ZXJsb2FkOjpBZGRyUmVmKCRyZWYpIDogJHN0cjsKfQoKc3ViIF9tYWtlX2ZyYW1lcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIG15ICRmaWx0ZXIgPSAhJHNlbGYtPntmaWx0ZXJfZnJhbWVzX2Vhcmx5fSAmJiAkc2VsZi0+X21ha2VfZnJhbWVfZmlsdGVyKCk7CgogICAgbXkgJHJhdyA9IGRlbGV0ZSAkc2VsZi0+e3Jhd307CiAgICBmb3IgbXkgJHIgKCBAeyRyYXd9ICkgewogICAgICAgIG5leHQgaWYgJGZpbHRlciAmJiAhJGZpbHRlci0+KCRyKTsKCiAgICAgICAgJHNlbGYtPl9hZGRfZnJhbWUoICRyLT57Y2FsbGVyfSwgJHItPnthcmdzfSApOwogICAgfQp9CgpteSAkZGVmYXVsdF9maWx0ZXIgPSBzdWIgezF9OwoKc3ViIF9tYWtlX2ZyYW1lX2ZpbHRlciB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIG15ICggQGlfcGFja19yZSwgJWlfY2xhc3MgKTsKICAgIGlmICggJHNlbGYtPntpZ25vcmVfcGFja2FnZX0gKSB7CiAgICAgICAgIyMgbm8gY3JpdGljIChWYXJpYWJsZXM6OlJlcXVpcmVJbml0aWFsaXphdGlvbkZvckxvY2FsVmFycykKICAgICAgICBsb2NhbCAkQDsKICAgICAgICBsb2NhbCAkU0lHe19fRElFX199OwogICAgICAgICMjIHVzZSBjcml0aWMKCiAgICAgICAgJHNlbGYtPntpZ25vcmVfcGFja2FnZX0gPSBbICRzZWxmLT57aWdub3JlX3BhY2thZ2V9IF0KICAgICAgICAgICAgdW5sZXNzIGV2YWwgeyBAeyAkc2VsZi0+e2lnbm9yZV9wYWNrYWdlfSB9IH07CgogICAgICAgIEBpX3BhY2tfcmUKICAgICAgICAgICAgPSBtYXAgeyByZWYgJF8gPyAkXyA6IHFyL15cUSRfXEUkLyB9IEB7ICRzZWxmLT57aWdub3JlX3BhY2thZ2V9IH07CiAgICB9CgogICAgbXkgJHAgPSBfX1BBQ0tBR0VfXzsKICAgIHB1c2ggQGlfcGFja19yZSwgcXIvXlxRJHBcRSQvOwoKICAgIGlmICggJHNlbGYtPntpZ25vcmVfY2xhc3N9ICkgewogICAgICAgICRzZWxmLT57aWdub3JlX2NsYXNzfSA9IFsgJHNlbGYtPntpZ25vcmVfY2xhc3N9IF0KICAgICAgICAgICAgdW5sZXNzIHJlZiAkc2VsZi0+e2lnbm9yZV9jbGFzc307CiAgICAgICAgJWlfY2xhc3MgPSBtYXAgeyAkXyA9PiAxIH0gQHsgJHNlbGYtPntpZ25vcmVfY2xhc3N9IH07CiAgICB9CgogICAgbXkgJHVzZXJfZmlsdGVyID0gJHNlbGYtPntmcmFtZV9maWx0ZXJ9OwoKICAgIHJldHVybiBzdWIgewogICAgICAgIHJldHVybiAwIGlmIGdyZXAgeyAkX1swXXtjYWxsZXJ9WzBdID1+IC8kXy8gfSBAaV9wYWNrX3JlOwogICAgICAgIHJldHVybiAwIGlmIGdyZXAgeyAkX1swXXtjYWxsZXJ9WzBdLT5pc2EoJF8pIH0ga2V5cyAlaV9jbGFzczsKCiAgICAgICAgaWYgKCR1c2VyX2ZpbHRlcikgewogICAgICAgICAgICByZXR1cm4gJHVzZXJfZmlsdGVyLT4oICRfWzBdICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMTsKICAgIH07Cn0KCnN1YiBfYWRkX2ZyYW1lIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkYyAgICA9IHNoaWZ0OwogICAgbXkgJHAgICAgPSBzaGlmdDsKCiAgICAjIGV2YWwgYW5kIGlzX3JlcXVpcmUgYXJlIG9ubHkgcmV0dXJuZWQgd2hlbiBhcHBsaWNhYmxlIHVuZGVyIDUuMDA1MDMuCiAgICBwdXNoIEAkYywgKCB1bmRlZiwgdW5kZWYgKSBpZiBzY2FsYXIgQCRjID09IDY7CgogICAgcHVzaCBAeyAkc2VsZi0+e2ZyYW1lc30gfSwKICAgICAgICBEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWUtPm5ldygKICAgICAgICAkYywKICAgICAgICAkcCwKICAgICAgICAkc2VsZi0+e3Jlc3BlY3Rfb3ZlcmxvYWR9LAogICAgICAgICRzZWxmLT57bWF4X2FyZ19sZW5ndGh9LAogICAgICAgICRzZWxmLT57bWVzc2FnZX0sCiAgICAgICAgJHNlbGYtPntpbmRlbnR9CiAgICAgICAgKTsKfQoKc3ViIG5leHRfZnJhbWUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICAjIHJlc2V0IHRvIHRvcCBpZiBuZWNlc3NhcnkuCiAgICAkc2VsZi0+e2luZGV4fSA9IC0xIHVubGVzcyBkZWZpbmVkICRzZWxmLT57aW5kZXh9OwoKICAgIG15IEBmID0gJHNlbGYtPmZyYW1lcygpOwogICAgaWYgKCBkZWZpbmVkICRmWyAkc2VsZi0+e2luZGV4fSArIDEgXSApIHsKICAgICAgICByZXR1cm4gJGZbICsrJHNlbGYtPntpbmRleH0gXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRzZWxmLT57aW5kZXh9ID0gdW5kZWY7CiAgICAgICAgIyMgbm8gY3JpdGljIChTdWJyb3V0aW5lczo6UHJvaGliaXRFeHBsaWNpdFJldHVyblVuZGVmKQogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KfQoKc3ViIHByZXZfZnJhbWUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICBteSBAZiA9ICRzZWxmLT5mcmFtZXMoKTsKCiAgICAjIHJlc2V0IHRvIHRvcCBpZiBuZWNlc3NhcnkuCiAgICAkc2VsZi0+e2luZGV4fSA9IHNjYWxhciBAZiB1bmxlc3MgZGVmaW5lZCAkc2VsZi0+e2luZGV4fTsKCiAgICBpZiAoIGRlZmluZWQgJGZbICRzZWxmLT57aW5kZXh9IC0gMSBdICYmICRzZWxmLT57aW5kZXh9ID49IDEgKSB7CiAgICAgICAgcmV0dXJuICRmWyAtLSRzZWxmLT57aW5kZXh9IF07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAjIyBubyBjcml0aWMgKFN1YnJvdXRpbmVzOjpQcm9oaWJpdEV4cGxpY2l0UmV0dXJuVW5kZWYpCiAgICAgICAgJHNlbGYtPntpbmRleH0gPSB1bmRlZjsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9Cn0KCnN1YiByZXNldF9wb2ludGVyIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgJHNlbGYtPntpbmRleH0gPSB1bmRlZjsKCiAgICByZXR1cm47Cn0KCnN1YiBmcmFtZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICBpZiAoQF8pIHsKICAgICAgICBkaWUKICAgICAgICAgICAgIkRldmVsOjpTdGFja1RyYWNlLT5mcmFtZXMoKSBjYW4gb25seSB0YWtlIERldmVsOjpTdGFja1RyYWNlOjpGcmFtZSBhcmdzXG4iCiAgICAgICAgICAgIGlmIGdyZXAgeyAhJF8tPmlzYSgnRGV2ZWw6OlN0YWNrVHJhY2U6OkZyYW1lJykgfSBAXzsKCiAgICAgICAgJHNlbGYtPntmcmFtZXN9ID0gXEBfOwogICAgICAgIGRlbGV0ZSAkc2VsZi0+e3Jhd307CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkc2VsZi0+X21ha2VfZnJhbWVzKCkgaWYgJHNlbGYtPntyYXd9OwogICAgfQoKICAgIHJldHVybiBAeyAkc2VsZi0+e2ZyYW1lc30gfTsKfQoKc3ViIGZyYW1lIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkaSAgICA9IHNoaWZ0OwoKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkaTsKCiAgICByZXR1cm4gKCAkc2VsZi0+ZnJhbWVzKCkgKVskaV07Cn0KCnN1YiBmcmFtZV9jb3VudCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiBzY2FsYXIoICRzZWxmLT5mcmFtZXMoKSApOwp9CgpzdWIgYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkcCAgICA9IHNoaWZ0OwoKICAgIG15ICRzdCAgICA9IHF7fTsKICAgIG15ICRmaXJzdCA9IDE7CiAgICBmb3JlYWNoIG15ICRmICggJHNlbGYtPmZyYW1lcygpICkgewogICAgICAgICRzdCAuPSAkZi0+YXNfc3RyaW5nKCAkZmlyc3QsICRwICkgLiAiXG4iOwogICAgICAgICRmaXJzdCA9IDA7CiAgICB9CgogICAgcmV0dXJuICRzdDsKfQoKewogICAgIyMgbm8gY3JpdGljIChNb2R1bGVzOjpQcm9oaWJpdE11bHRpcGxlUGFja2FnZXMsIENsYXNzSGllcmFyY2hpZXM6OlByb2hpYml0RXhwbGljaXRJU0EpCiAgICBwYWNrYWdlICAgICMgaGlkZSBmcm9tIFBBVVNFCiAgICAgICAgRGV2ZWw6OlN0YWNrVHJhY2VGcmFtZTsKCiAgICBvdXIgQElTQSA9ICdEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWUnOwp9CgoxOwoKIyBBQlNUUkFDVDogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHN0YWNrIHRyYWNlCgpfX0VORF9fCgo9cG9kCgo9aGVhZDEgTkFNRQoKRGV2ZWw6OlN0YWNrVHJhY2UgLSBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgc3RhY2sgdHJhY2UKCj1oZWFkMSBWRVJTSU9OCgp2ZXJzaW9uIDIuMDEKCj1oZWFkMSBTWU5PUFNJUwoKICB1c2UgRGV2ZWw6OlN0YWNrVHJhY2U7CgogIG15ICR0cmFjZSA9IERldmVsOjpTdGFja1RyYWNlLT5uZXcoKTsKCiAgcHJpbnQgJHRyYWNlLT5hc19zdHJpbmcoKTsgIyBsaWtlIGNhcnAKCiAgIyBmcm9tIHRvcCAobW9zdCByZWNlbnQpIG9mIHN0YWNrIHRvIGJvdHRvbS4KICB3aGlsZSAoIG15ICRmcmFtZSA9ICR0cmFjZS0+bmV4dF9mcmFtZSgpICkgewogICAgICBwcmludCAiSGFzIGFyZ3NcbiIgaWYgJGZyYW1lLT5oYXNhcmdzKCk7CiAgfQoKICAjIGZyb20gYm90dG9tIChsZWFzdCByZWNlbnQpIG9mIHN0YWNrIHRvIHRvcC4KICB3aGlsZSAoIG15ICRmcmFtZSA9ICR0cmFjZS0+cHJldl9mcmFtZSgpICkgewogICAgICBwcmludCAiU3ViOiAiLCAkZnJhbWUtPnN1YnJvdXRpbmUoKSwgIlxuIjsKICB9Cgo9aGVhZDEgREVTQ1JJUFRJT04KClRoZSBDPERldmVsOjpTdGFja1RyYWNlPiBtb2R1bGUgY29udGFpbnMgdHdvIGNsYXNzZXMsIEMsRGV2ZWw6OlN0YWNrVHJhY2U+IGFuZApMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgdGhlIGluZm9ybWF0aW9uIHRoYXQKY2FuIHJldHJpZXZlZCB2aWEgUGVybCdzIEM8Y2FsbGVyKCk+IGZ1bmN0aW9uLCBhcyB3ZWxsIGFzIHByb3ZpZGluZyBhIHNpbXBsZQppbnRlcmZhY2UgdG8gdGhpcyBkYXRhLgoKVGhlIEM8RGV2ZWw6OlN0YWNrVHJhY2U+IG9iamVjdCBjb250YWlucyBhIHNldCBvZiBDPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4Kb2JqZWN0cywgb25lIGZvciBlYWNoIGxldmVsIG9mIHRoZSBzdGFjay4gVGhlIGZyYW1lcyBjb250YWluIGFsbCB0aGUgZGF0YQphdmFpbGFibGUgZnJvbSBDPGNhbGxlcigpPi4KClRoaXMgY29kZSB3YXMgY3JlYXRlZCB0byBzdXBwb3J0IG15IEw8RXhjZXB0aW9uOjpDbGFzczo6QmFzZT4gY2xhc3MgKHBhcnQgb2YKTDxFeGNlcHRpb246OkNsYXNzPikgYnV0IG1heSBiZSB1c2VmdWwgaW4gb3RoZXIgY29udGV4dHMuCgo9ZW5jb2RpbmcgVVRGLTgKCj1oZWFkMSAnVE9QJyBBTkQgJ0JPVFRPTScgT0YgVEhFIFNUQUNLCgpXaGVuIGRlc2NyaWJpbmcgdGhlIG1ldGhvZHMgb2YgdGhlIHRyYWNlIG9iamVjdCwgSSB1c2UgdGhlIHdvcmRzICd0b3AnIGFuZAonYm90dG9tJy4gSW4gdGhpcyBjb250ZXh0LCB0aGUgJ3RvcCcgZnJhbWUgb24gdGhlIHN0YWNrIGlzIHRoZSBtb3N0IHJlY2VudApmcmFtZSBhbmQgdGhlICdib3R0b20nIGlzIHRoZSBsZWFzdCByZWNlbnQuCgpIZXJlJ3MgYW4gZXhhbXBsZToKCiAgZm9vKCk7ICAjIGJvdHRvbSBmcmFtZSBpcyBoZXJlCgogIHN1YiBmb28gewogICAgIGJhcigpOwogIH0KCiAgc3ViIGJhciB7CiAgICAgRGV2ZWw6OlN0YWNrVHJhY2UtPm5ldygpOyAgIyB0b3AgZnJhbWUgaXMgaGVyZS4KICB9Cgo9aGVhZDEgTUVUSE9EUwoKVGhpcyBjbGFzcyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKCj1oZWFkMiBEZXZlbDo6U3RhY2tUcmFjZS0+bmV3KCVuYW1lZF9wYXJhbXMpCgpSZXR1cm5zIGEgbmV3IERldmVsOjpTdGFja1RyYWNlIG9iamVjdC4KClRha2VzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKCj1vdmVyIDQKCj1pdGVtICogZnJhbWVfZmlsdGVyID0+ICRzdWIKCkJ5IGRlZmF1bHQsIERldmVsOjpTdGFja1RyYWNlIHdpbGwgaW5jbHVkZSBhbGwgc3RhY2sgZnJhbWVzIGJlZm9yZSB0aGUKY2FsbCB0byBpdHMgY29uc3RydWN0b3IuCgpIb3dldmVyLCB5b3UgbWF5IHdhbnQgdG8gZmlsdGVyIG91dCBzb21lIGZyYW1lcyB3aXRoIG1vcmUgZ3JhbnVsYXJpdHkKdGhhbiAnaWdub3JlX3BhY2thZ2UnIG9yICdpZ25vcmVfY2xhc3MnIGFsbG93LgoKWW91IGNhbiBwcm92aWRlIGEgc3Vicm91dGluZSB3aGljaCBpcyBjYWxsZWQgd2l0aCB0aGUgcmF3IGZyYW1lIGRhdGEKZm9yIGVhY2ggZnJhbWUuIFRoaXMgaXMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHR3byBrZXlzLCAiY2FsbGVyIiwgYW5kCiJhcmdzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXkgcmVmZXJlbmNlcy4gVGhlICJjYWxsZXIiIGtleSBpcyB0aGUKcmF3IGRhdGEgYXMgcmV0dXJuZWQgYnkgUGVybCdzIEM8Y2FsbGVyKCk+IGZ1bmN0aW9uLCBhbmQgdGhlICJhcmdzIgprZXkgYXJlIHRoZSBzdWJyb3V0aW5lIGFyZ3VtZW50cyBmb3VuZCBpbiBDPEBEQjo6YXJncz4uCgpUaGUgZmlsdGVyIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhbWUgc2hvdWxkIGJlIGluY2x1ZGVkLCBvcgpmYWxzZSBpZiBpdCBzaG91bGQgYmUgc2tpcHBlZC4KCj1pdGVtICogZmlsdGVyX2ZyYW1lc19lYXJseSA9PiAkYm9vbGVhbgoKSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgQzxmcmFtZV9maWx0ZXI+IHdpbGwgYmUgY2FsbGVkIGFzIHNvb24gYXMgdGhlCnN0YWNrdHJhY2UgaXMgY3JlYXRlZCwgYW5kIGJlZm9yZSByZWZzIGFyZSBzdHJpbmdpZmllZCAoaWYKQzx1bnNhZmVfcmVmX2NhcHR1cmU+IGlzIG5vdCBzZXQpLCByYXRoZXIgdGhhbiBiZWluZyBmaWx0ZXJlZCBsYXppbHkgd2hlbgpMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0cyBhcmUgZmlyc3QgbmVlZGVkLgoKVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZmlsdGVyIGJhc2VkIG9uIHRoZSBmcmFtZSdzIGFyZ3VtZW50cyBhbmQgd2FudAp0byBiZSBhYmxlIHRvIGV4YW1pbmUgb2JqZWN0IHByb3BlcnRpZXMsIGZvciBleGFtcGxlLgoKPWl0ZW0gKiBpZ25vcmVfcGFja2FnZSA9PiAkcGFja2FnZV9uYW1lIE9SIFxAcGFja2FnZV9uYW1lcwoKQW55IGZyYW1lcyB3aGVyZSB0aGUgcGFja2FnZSBpcyBvbmUgb2YgdGhlc2UgcGFja2FnZXMgd2lsbCBub3QgYmUgb24KdGhlIHN0YWNrLgoKPWl0ZW0gKiBpZ25vcmVfY2xhc3MgPT4gJHBhY2thZ2VfbmFtZSBPUiBcQHBhY2thZ2VfbmFtZXMKCkFueSBmcmFtZXMgd2hlcmUgdGhlIHBhY2thZ2UgaXMgYSBzdWJjbGFzcyBvZiBvbmUgb2YgdGhlc2UgcGFja2FnZXMKKG9yIGlzIHRoZSBzYW1lIHBhY2thZ2UpIHdpbGwgbm90IGJlIG9uIHRoZSBzdGFjay4KCkRldmVsOjpTdGFja1RyYWNlIGludGVybmFsbHkgYWRkcyBpdHNlbGYgdG8gdGhlICdpZ25vcmVfcGFja2FnZScKcGFyYW1ldGVyLCBtZWFuaW5nIHRoYXQgdGhlIERldmVsOjpTdGFja1RyYWNlIHBhY2thZ2UgaXMgQjxBTFdBWVM+Cmlnbm9yZWQuIEhvd2V2ZXIsIGlmIHlvdSBjcmVhdGUgYSBzdWJjbGFzcyBvZiBEZXZlbDo6U3RhY2tUcmFjZSBpdAp3aWxsIG5vdCBiZSBpZ25vcmVkLgoKPWl0ZW0gKiBza2lwX2ZyYW1lcyA9PiAkaW50ZWdlcgoKVGhpcyB3aWxsIGNhdXNlIHRoaXMgbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBleGNsdWRlZCBmcm9tIHRvcCBvZiB0aGUKc3RhY2sgdHJhY2UuIFRoaXMgcHJldmVudHMgdGhlIGZyYW1lcyBmcm9tIGJlaW5nIGNhcHR1cmVkIGF0IGFsbCwgYW5kIGFwcGxpZXMKYmVmb3JlIHRoZSBDPGZyYW1lX2ZpbHRlcj4sIEM8aWdub3JlX3BhY2thZ2U+LCBvciBDPGlnbm9yZV9jbGFzcz4gb3B0aW9ucywKZXZlbiB3aXRoIEM8ZmlsdGVyX2ZyYW1lc19lYXJseT4uCgo9aXRlbSAqIHVuc2FmZV9yZWZfY2FwdHVyZSA9PiAkYm9vbGVhbgoKSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlbiBEZXZlbDo6U3RhY2tUcmFjZSB3aWxsIHN0b3JlCnJlZmVyZW5jZXMgaW50ZXJuYWxseSB3aGVuIGdlbmVyYXRpbmcgc3RhY2t0cmFjZSBmcmFtZXMuCgpCPFRoaXMgb3B0aW9uIGlzIHZlcnkgZGFuZ2Vyb3VzLCBhbmQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgd2l0aCBleGNlcHRpb24Kb2JqZWN0cz4uIFVzaW5nIHRoaXMgb3B0aW9uIHdpbGwga2VlcCBhbnkgb2JqZWN0cyBvciByZWZlcmVuY2VzIGFsaXZlIHBhc3QKdGhlaXIgbm9ybWFsIGxpZmV0aW1lLCB1bnRpbCB0aGUgc3RhY2sgdHJhY2Ugb2JqZWN0IGdvZXMgb3V0IG9mIHNjb3BlLiBJdCBjYW4Ka2VlcCBvYmplY3RzIGFsaXZlIGV2ZW4gYWZ0ZXIgdGhlaXIgQzxERVNUUk9ZPiBzdWIgaXMgY2FsbGVkLCByZXN1bHRpbmcgaXQgaXQKYmVpbmcgY2FsbGVkIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIG9iamVjdC4KCklmIG5vdCBzZXQsIERldmVsOjpTdGFja1RyYWNlIHJlcGxhY2VzIGFueSByZWZlcmVuY2VzIHdpdGggdGhlaXIgc3RyaW5naWZpZWQKcmVwcmVzZW50YXRpb24uCgo9aXRlbSAqIG5vX2FyZ3MgPT4gJGJvb2xlYW4KCklmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoZW4gRGV2ZWw6OlN0YWNrVHJhY2Ugd2lsbCBub3Qgc3RvcmUgY2FsbGVyCmFyZ3VtZW50cyBpbiBzdGFjayB0cmFjZSBmcmFtZXMgYXQgYWxsLgoKPWl0ZW0gKiByZXNwZWN0X292ZXJsb2FkID0+ICRib29sZWFuCgpCeSBkZWZhdWx0LCBEZXZlbDo6U3RhY2tUcmFjZSB3aWxsIGNhbGwgQzxvdmVybG9hZDo6QWRkclJlZigpPiB0byBnZXQKdGhlIHVuZGVybHlpbmcgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCwgaW5zdGVhZCBvZgpyZXNwZWN0aW5nIHRoZSBvYmplY3QncyBzdHJpbmdpZmljYXRpb24gb3ZlcmxvYWRpbmcuIElmIHlvdSB3b3VsZApwcmVmZXIgdG8gc2VlIHRoZSBvdmVybG9hZGVkIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdHMgaW4gc3RhY2sKdHJhY2VzLCB0aGVuIHNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlLgoKPWl0ZW0gKiBtYXhfYXJnX2xlbmd0aCA9PiAkaW50ZWdlcgoKQnkgZGVmYXVsdCwgRGV2ZWw6OlN0YWNrVHJhY2Ugd2lsbCBkaXNwbGF5IHRoZSBlbnRpcmUgYXJndW1lbnQgZm9yIGVhY2gKc3Vicm91dGluZSBjYWxsLiBTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIGNhdXNlcyB0cnVuY2F0ZXMgZWFjaCBzdWJyb3V0aW5lCmFyZ3VtZW50J3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlmIGl0IGlzIGxvbmdlciB0aGFuIHRoaXMgbnVtYmVyIG9mCmNoYXJhY3RlcnMuCgo9aXRlbSAqIG1lc3NhZ2UgPT4gJHN0cmluZwoKQnkgZGVmYXVsdCwgRGV2ZWw6OlN0YWNrVHJhY2Ugd2lsbCB1c2UgJ1RyYWNlIGJlZ3VuJyBhcyB0aGUgbWVzc2FnZSBmb3IgdGhlCmZpcnN0IHN0YWNrIGZyYW1lIHdoZW4geW91IGNhbGwgQzxhc19zdHJpbmc+LiBZb3UgY2FuIHN1cHBseSBhbiBhbHRlcm5hdGl2ZQptZXNzYWdlIHVzaW5nIHRoaXMgb3B0aW9uLgoKPWl0ZW0gKiBpbmRlbnQgPT4gJGJvb2xlYW4KCklmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIGVhY2ggc3RhY2sgZnJhbWUgYWZ0ZXIgdGhlIGZpcnN0IHdpbGwgc3RhcnQgd2l0aCBhCnRhYiBjaGFyYWN0ZXIsIGp1c3QgbGlrZSBDPENhcnA6OmNvbmZlc3MoKT4uCgo9YmFjawoKPWhlYWQyICR0cmFjZS0+bmV4dF9mcmFtZSgpCgpSZXR1cm5zIHRoZSBuZXh0IEw8RGV2ZWw6OlN0YWNrVHJhY2U6OkZyYW1lPiBvYmplY3Qgb24gdGhlIHN0YWNrLCBnb2luZwpkb3duLiBJZiB0aGlzIG1ldGhvZCBoYXNuJ3QgYmVlbiBjYWxsZWQgYmVmb3JlIGl0IHJldHVybnMgdGhlIGZpcnN0IGZyYW1lLiBJdApyZXR1cm5zIEM8dW5kZWY+IHdoZW4gaXQgcmVhY2hlcyB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayBhbmQgdGhlbiByZXNldHMgaXRzCnBvaW50ZXIgc28gdGhlIG5leHQgY2FsbCB0byBDPDwgJHRyYWNlLT5uZXh0X2ZyYW1lKCkgPj4gb3IgQzw8CiR0cmFjZS0+cHJldl9mcmFtZSgpID4+IHdpbGwgd29yayBwcm9wZXJseS4KCj1oZWFkMiAkdHJhY2UtPnByZXZfZnJhbWUoKQoKUmV0dXJucyB0aGUgbmV4dCBMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0IG9uIHRoZSBzdGFjaywgZ29pbmcgdXAuIElmCnRoaXMgbWV0aG9kIGhhc24ndCBiZWVuIGNhbGxlZCBiZWZvcmUgaXQgcmV0dXJucyB0aGUgbGFzdCBmcmFtZS4gSXQgcmV0dXJucwp1bmRlZiB3aGVuIGl0IHJlYWNoZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHRoZW4gcmVzZXRzIGl0cyBwb2ludGVyIHNvIHRoZQpuZXh0IGNhbGwgdG8gQzw8ICR0cmFjZS0+bmV4dF9mcmFtZSgpID4+IG9yIEM8PCAkdHJhY2UtPnByZXZfZnJhbWUoKSA+PiB3aWxsCndvcmsgcHJvcGVybHkuCgo9aGVhZDIgJHRyYWNlLT5yZXNldF9wb2ludGVyCgpSZXNldHMgdGhlIHBvaW50ZXIgc28gdGhhdCB0aGUgbmV4dCBjYWxsIHRvIEM8PCAkdHJhY2UtPm5leHRfZnJhbWUoKSA+PiBvciBDPDwKJHRyYWNlLT5wcmV2X2ZyYW1lKCkgPj4gd2lsbCBzdGFydCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgc3RhY2ssIGFzCmFwcHJvcHJpYXRlLgoKPWhlYWQyICR0cmFjZS0+ZnJhbWVzKCkKCldoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCBpdCByZXR1cm5zIGEgbGlzdCBvZgpMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0cy4gVGhleSBhcmUgcmV0dXJuZWQgaW4gb3JkZXIgZnJvbSB0b3AgKG1vc3QKcmVjZW50KSB0byBib3R0b20uCgpUaGlzIG1ldGhvZCBjYW4gYWxzbyBiZSB1c2VkIHRvIHNldCB0aGUgb2JqZWN0J3MgZnJhbWVzIGlmIHlvdSBwYXNzIGl0IGEgbGlzdApvZiBMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0cy4KClRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGZpbHRlciB0aGUgbGlzdCBvZiBmcmFtZXMgaW4gd2F5cyB0aGF0IGFyZSBtb3JlCmNvbXBsZXggdGhhbiBjYW4gYmUgaGFuZGxlZCBieSB0aGUgQzw8ICR0cmFjZS0+ZmlsdGVyX2ZyYW1lcygpID4+IG1ldGhvZDoKCiAgJHN0YWNrdHJhY2UtPmZyYW1lcyggbXlfZmlsdGVyKCAkc3RhY2t0cmFjZS0+ZnJhbWVzKCkgKSApOwoKPWhlYWQyICR0cmFjZS0+ZnJhbWUoJGluZGV4KQoKR2l2ZW4gYW4gaW5kZXgsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlbGV2YW50IGZyYW1lLCBvciB1bmRlZiBpZiB0aGVyZSBpcwpubyBmcmFtZSBhdCB0aGF0IGluZGV4LiBUaGUgaW5kZXggaXMgZXhhY3RseSBsaWtlIGEgUGVybCBhcnJheS4gVGhlIGZpcnN0CmZyYW1lIGlzIDAgYW5kIG5lZ2F0aXZlIGluZGV4ZXMgYXJlIGFsbG93ZWQuCgo9aGVhZDIgJHRyYWNlLT5mcmFtZV9jb3VudCgpCgpSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSB0cmFjZSBvYmplY3QuCgo9aGVhZDIgJHRyYWNlLT5hc19zdHJpbmcoXCVwKQoKQ2FsbHMgQzw8ICRmcmFtZS0+YXNfc3RyaW5nKCkgPj4gb24gZWFjaCBmcmFtZSBmcm9tIHRvcCB0byBib3R0b20sIHByb2R1Y2luZwpvdXRwdXQgcXVpdGUgc2ltaWxhciB0byB0aGUgQ2FycCBtb2R1bGUncyBjbHVjay9jb25mZXNzIG1ldGhvZHMuCgpUaGUgb3B0aW9uYWwgQzxcJXA+IHBhcmFtZXRlciBvbmx5IGhhcyBvbmUgb3B0aW9uLiBUaGUgQzxtYXhfYXJnX2xlbmd0aD4KcGFyYW1ldGVyIHRydW5jYXRlcyBlYWNoIHN1YnJvdXRpbmUgYXJndW1lbnQncyBzdHJpbmcgcmVwcmVzZW50YXRpb24gaWYgaXQgaXMKbG9uZ2VyIHRoYW4gdGhpcyBudW1iZXIgb2YgY2hhcmFjdGVycy4KCj1oZWFkMSBTVVBQT1JUCgpQbGVhc2Ugc3VibWl0IGJ1Z3MgdG8gdGhlIENQQU4gUlQgc3lzdGVtIGF0Cmh0dHA6Ly9ydC5jcGFuLm9yZy9Ob0F1dGgvUmVwb3J0QnVnLmh0bWw/UXVldWU9RGV2ZWwlM0ElM0FTdGFja1RyYWNlCm9yIHZpYSBlbWFpbCBhdCBidWctZGV2ZWwtc3RhY2t0cmFjZUBydC5jcGFuLm9yZy4KCj1oZWFkMSBBVVRIT1IKCkRhdmUgUm9sc2t5IDxhdXRhcmNoQHVydGgub3JnPgoKPWhlYWQxIENPTlRSSUJVVE9SUwoKPWZvciBzdG9wd29yZHMgRGFnZmlubiBJbG1hcmkgTWFubnPDpWtlciBEYXZpZCBDYW50cmVsbCBHcmFoYW0gS25vcCBNYXJrIEZvd2xlciBSaWNhcmRvIFNpZ25lcwoKPW92ZXIgNAoKPWl0ZW0gKgoKRGFnZmlubiBJbG1hcmkgTWFubnPDpWtlciA8aWxtYXJpQGlsbWFyaS5vcmc+Cgo9aXRlbSAqCgpEYXZpZCBDYW50cmVsbCA8ZGF2aWRAY2FudHJlbGwub3JnLnVrPgoKPWl0ZW0gKgoKR3JhaGFtIEtub3AgPGhhYXJnQGhhYXJnLm9yZz4KCj1pdGVtICoKCk1hcmsgRm93bGVyIDxtYXJrQHR3b3Nob3J0cGxhbmtzLmNvbT4KCj1pdGVtICoKClJpY2FyZG8gU2lnbmVzIDxyamJzQGNwYW4ub3JnPgoKPWJhY2sKCj1oZWFkMSBDT1BZUklHSFQgQU5EIExJQ0VOU0UKClRoaXMgc29mdHdhcmUgaXMgQ29weXJpZ2h0IChjKSAyMDAwIC0gMjAxNiBieSBEYXZpZCBSb2xza3kuCgpUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGxpY2Vuc2VkIHVuZGVyOgoKICBUaGUgQXJ0aXN0aWMgTGljZW5zZSAyLjAgKEdQTCBDb21wYXRpYmxlKQoKPWN1dAo=
cGFja2FnZSBEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJFZFUlNJT04gPSAnMi4wMSc7CgojIENyZWF0ZSBhY2Nlc3NvciByb3V0aW5lcwpCRUdJTiB7CiAgICAjIyBubyBjcml0aWMgKFRlc3RpbmdBbmREZWJ1Z2dpbmc6OlByb2hpYml0Tm9TdHJpY3QpCiAgICBubyBzdHJpY3QgJ3JlZnMnOwogICAgZm9yZWFjaCBteSAkZiAoCiAgICAgICAgcXcoIHBhY2thZ2UgZmlsZW5hbWUgbGluZSBzdWJyb3V0aW5lIGhhc2FyZ3MKICAgICAgICB3YW50YXJyYXkgZXZhbHRleHQgaXNfcmVxdWlyZSBoaW50cyBiaXRtYXNrIGFyZ3MgKQogICAgICAgICkgewogICAgICAgIG5leHQgaWYgJGYgZXEgJ2FyZ3MnOwogICAgICAgICp7JGZ9ID0gc3ViIHsgbXkgJHMgPSBzaGlmdDsgcmV0dXJuICRzLT57JGZ9IH07CiAgICB9Cn0KCnsKICAgIG15IEBmaWVsZHMgPSAoCiAgICAgICAgcXcoIHBhY2thZ2UgZmlsZW5hbWUgbGluZSBzdWJyb3V0aW5lIGhhc2FyZ3Mgd2FudGFycmF5CiAgICAgICAgICAgIGV2YWx0ZXh0IGlzX3JlcXVpcmUgaGludHMgYml0bWFzayApCiAgICApOwoKICAgIHN1YiBuZXcgewogICAgICAgIG15ICRwcm90byA9IHNoaWZ0OwogICAgICAgIG15ICRjbGFzcyA9IHJlZiAkcHJvdG8gfHwgJHByb3RvOwoKICAgICAgICBteSAkc2VsZiA9IGJsZXNzIHt9LCAkY2xhc3M7CgogICAgICAgIEB7JHNlbGZ9e0BmaWVsZHN9ID0gQHsgc2hpZnQoKSB9OwoKICAgICAgICAjIGZpeHVwIHVuaXgtc3R5bGUgcGF0aHMgb24gd2luMzIKICAgICAgICAkc2VsZi0+e2ZpbGVuYW1lfSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCggJHNlbGYtPntmaWxlbmFtZX0gKTsKCiAgICAgICAgJHNlbGYtPnthcmdzfSA9IHNoaWZ0OwoKICAgICAgICAkc2VsZi0+e3Jlc3BlY3Rfb3ZlcmxvYWR9ID0gc2hpZnQ7CgogICAgICAgICRzZWxmLT57bWF4X2FyZ19sZW5ndGh9ID0gc2hpZnQ7CgogICAgICAgICRzZWxmLT57bWVzc2FnZX0gPSBzaGlmdDsKCiAgICAgICAgJHNlbGYtPntpbmRlbnR9ID0gc2hpZnQ7CgogICAgICAgIHJldHVybiAkc2VsZjsKICAgIH0KfQoKc3ViIGFyZ3MgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gQHsgJHNlbGYtPnthcmdzfSB9Owp9CgpzdWIgYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGZpcnN0ID0gc2hpZnQ7CiAgICBteSAkcCAgICAgPSBzaGlmdDsKCiAgICBteSAkc3ViID0gJHNlbGYtPnN1YnJvdXRpbmU7CgogICAgIyBUaGlzIGNvZGUgc3RvbGVuIHN0cmFpZ2h0IGZyb20gQ2FycC5wbSBhbmQgdGhlbiB0d2Vha2VkLiAgQWxsCiAgICAjIGVycm9ycyBhcmUgcHJvYmFibHkgbXkgZmF1bHQgIC1kYXZlCiAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgJHN1YgogICAgICAgICAgICA9IGRlZmluZWQgJHNlbGYtPnttZXNzYWdlfQogICAgICAgICAgICA/ICRzZWxmLT57bWVzc2FnZX0KICAgICAgICAgICAgOiAnVHJhY2UgYmVndW4nOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgQnVpbGQgYSBzdHJpbmcsICRzdWIsIHdoaWNoIG5hbWVzIHRoZSBzdWItcm91dGluZSBjYWxsZWQuCiAgICAgICAgIyBUaGlzIG1heSBhbHNvIGJlICJyZXF1aXJlIC4uLiIsICJldmFsICcuLi4nIG9yICJldmFsIHsuLi59IgogICAgICAgIGlmICggbXkgJGV2YWwgPSAkc2VsZi0+ZXZhbHRleHQgKSB7CiAgICAgICAgICAgIGlmICggJHNlbGYtPmlzX3JlcXVpcmUgKSB7CiAgICAgICAgICAgICAgICAkc3ViID0gInJlcXVpcmUgJGV2YWwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJGV2YWwgPX4gcy8oW1xcXCddKS9cXCQxL2c7CiAgICAgICAgICAgICAgICAkc3ViID0gImV2YWwgJyRldmFsJyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkc3ViIGVxICcoZXZhbCknICkgewogICAgICAgICAgICAkc3ViID0gJ2V2YWwgey4uLn0nOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGVyZSBhcmUgYW55IGFyZ3VtZW50cyBpbiB0aGUgc3ViLXJvdXRpbmUgY2FsbCwgZm9ybWF0CiAgICAgICAgIyB0aGVtIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IHZhcmlhYmxlcyBkZWZpbmVkIGVhcmxpZXIgaW4KICAgICAgICAjIHRoaXMgZmlsZSBhbmQgam9pbiB0aGVtIG9udG8gdGhlICRzdWIgc3ViLXJvdXRpbmUgc3RyaW5nCiAgICAgICAgIwogICAgICAgICMgV2UgY29weSB0aGVtIGJlY2F1c2UgdGhleSdyZSBnb2luZyB0byBiZSBtb2RpZmllZC4KICAgICAgICAjCiAgICAgICAgaWYgKCBteSBAYSA9ICRzZWxmLT5hcmdzICkgewogICAgICAgICAgICBmb3IgKEBhKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgYXJncyB0byB0aGUgc3RyaW5nICJ1bmRlZiIgaWYgdW5kZWZpbmVkCiAgICAgICAgICAgICAgICB1bmxlc3MgKCBkZWZpbmVkICRfICkgewogICAgICAgICAgICAgICAgICAgICRfID0gJ3VuZGVmJzsKICAgICAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaGFjayEKICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoU3Vicm91dGluZXM6OlByb3RlY3RQcml2YXRlU3VicykKICAgICAgICAgICAgICAgICRfID0gJHNlbGYtPkRldmVsOjpTdGFja1RyYWNlOjpfcmVmX3RvX3N0cmluZygkXykKICAgICAgICAgICAgICAgICAgICBpZiByZWYgJF87CiAgICAgICAgICAgICAgICAjIyB1c2UgY3JpdGljOwoKICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoVmFyaWFibGVzOjpSZXF1aXJlSW5pdGlhbGl6YXRpb25Gb3JMb2NhbFZhcnMpCiAgICAgICAgICAgICAgICBsb2NhbCAkU0lHe19fRElFX199OwogICAgICAgICAgICAgICAgbG9jYWwgJEA7CiAgICAgICAgICAgICAgICAjIyB1c2UgY3JpdGljOwoKICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoRXJyb3JIYW5kbGluZzo6UmVxdWlyZUNoZWNraW5nUmV0dXJuVmFsdWVPZkV2YWwpCiAgICAgICAgICAgICAgICBldmFsIHsKICAgICAgICAgICAgICAgICAgICBteSAkbWF4X2FyZ19sZW5ndGgKICAgICAgICAgICAgICAgICAgICAgICAgPSBleGlzdHMgJHAtPnttYXhfYXJnX2xlbmd0aH0KICAgICAgICAgICAgICAgICAgICAgICAgPyAkcC0+e21heF9hcmdfbGVuZ3RofQogICAgICAgICAgICAgICAgICAgICAgICA6ICRzZWxmLT57bWF4X2FyZ19sZW5ndGh9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRtYXhfYXJnX2xlbmd0aAogICAgICAgICAgICAgICAgICAgICAgICAmJiBsZW5ndGggJF8gPiAkbWF4X2FyZ19sZW5ndGggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoQnVpbHRpbkZ1bmN0aW9uczo6UHJvaGliaXRMdmFsdWVTdWJzdHIpCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJF8sICRtYXhfYXJnX2xlbmd0aCApID0gJy4uLic7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzLycvXFwnL2c7CgogICAgICAgICAgICAgICAgICAgICMgJ3F1b3RlJyBhcmcgdW5sZXNzIGl0IGxvb2tzIGxpa2UgYSBudW1iZXIKICAgICAgICAgICAgICAgICAgICAkXyA9ICInJF8nIiB1bmxlc3MgL14tP1tcZC5dKyQvOwoKICAgICAgICAgICAgICAgICAgICAjIHByaW50IGNvbnRyb2wvaGlnaCBBU0NJSSBjaGFycyBhcyAnTS08Y2hhcj4nIG9yICdePGNoYXI+JwogICAgICAgICAgICAgICAgICAgIHMvKFtcMjAwLVwzNzddKS9zcHJpbnRmKCJNLSVjIixvcmQoJDEpJjAxNzcpL2VnOwogICAgICAgICAgICAgICAgICAgIHMvKFtcMC1cMzdcMTc3XSkvc3ByaW50ZigiXiVjIixvcmQoJDEpXjY0KS9lZzsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAjIyB1c2UgY3JpdGljCgogICAgICAgICAgICAgICAgaWYgKCBteSAkZSA9ICRAICkgewogICAgICAgICAgICAgICAgICAgICRfID0gJGUgPX4gL21hbGZvcm1lZCB1dGYtOC9pID8gJyhiYWQgdXRmLTgpJyA6ICc/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhcHBlbmQgKCdhbGwnLCAndGhlJywgJ2FyZ3VtZW50cycpIHRvIHRoZSAkc3ViIHN0cmluZwogICAgICAgICAgICAkc3ViIC49ICcoJyAuIGpvaW4oICcsICcsIEBhICkgLiAnKSc7CiAgICAgICAgICAgICRzdWIgLj0gJyBjYWxsZWQnOwogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHRoZSB1c2VyIG9wdGVkIGludG8gaW5kZW50YXRpb24gKGEgbGEgQ2FycDo6Y29uZmVzcyksIHByZS1hZGQgYSB0YWIKICAgIG15ICR0YWIgPSAkc2VsZi0+e2luZGVudH0gJiYgISRmaXJzdCA/ICJcdCIgOiBxe307CgogICAgcmV0dXJuICIke3RhYn0kc3ViIGF0ICIgLiAkc2VsZi0+ZmlsZW5hbWUgLiAnIGxpbmUgJyAuICRzZWxmLT5saW5lOwp9CgoxOwoKIyBBQlNUUkFDVDogQSBzaW5nbGUgZnJhbWUgaW4gYSBzdGFjayB0cmFjZQoKX19FTkRfXwoKPXBvZAoKPWhlYWQxIE5BTUUKCkRldmVsOjpTdGFja1RyYWNlOjpGcmFtZSAtIEEgc2luZ2xlIGZyYW1lIGluIGEgc3RhY2sgdHJhY2UKCj1oZWFkMSBWRVJTSU9OCgp2ZXJzaW9uIDIuMDEKCj1oZWFkMSBERVNDUklQVElPTgoKU2VlIEw8RGV2ZWw6OlN0YWNrVHJhY2U+IGZvciBkZXRhaWxzLgoKPWZvciBQb2Q6OkNvdmVyYWdlIG5ldwoKPWhlYWQxIE1FVEhPRFMKClNlZSBQZXJsJ3MgQzxjYWxsZXIoKT4gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aGF0IHRoZXNlCm1ldGhvZHMgcmV0dXJuLgoKPWhlYWQyICRmcmFtZS0+cGFja2FnZSgpCgo9aGVhZDIgJGZyYW1lLT5maWxlbmFtZSgpCgo9aGVhZDIgJGZyYW1lLT5saW5lKCkKCj1oZWFkMiAkZnJhbWUtPnN1YnJvdXRpbmUoKQoKPWhlYWQyICRmcmFtZS0+aGFzYXJncygpCgo9aGVhZDIgJGZyYW1lLT53YW50YXJyYXkoKQoKPWhlYWQyICRmcmFtZS0+ZXZhbHRleHQoKQoKUmV0dXJucyB1bmRlZiBpZiB0aGUgZnJhbWUgd2FzIG5vdCBwYXJ0IG9mIGFuIGV2YWwuCgo9aGVhZDIgJGZyYW1lLT5pc19yZXF1aXJlKCkKClJldHVybnMgdW5kZWYgaWYgdGhlIGZyYW1lIHdhcyBub3QgcGFydCBvZiBhIHJlcXVpcmUuCgo9aGVhZDIgJGZyYW1lLT5hcmdzKCkKClJldHVybnMgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZyYW1lLiAgTm90ZSB0aGF0IGFueSBhcmd1bWVudHMgdGhhdCBhcmUKcmVmZXJlbmNlcyBhcmUgcmV0dXJuZWQgYXMgcmVmZXJlbmNlcywgbm90IGNvcGllcy4KCj1oZWFkMiAkZnJhbWUtPmhpbnRzKCkKCj1oZWFkMiAkZnJhbWUtPmJpdG1hc2soKQoKPWhlYWQyICRmcmFtZS0+YXNfc3RyaW5nKCkKClJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmcmFtZS4KCj1oZWFkMSBBVVRIT1IKCkRhdmUgUm9sc2t5IDxhdXRhcmNoQHVydGgub3JnPgoKPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQoKVGhpcyBzb2Z0d2FyZSBpcyBDb3B5cmlnaHQgKGMpIDIwMDAgLSAyMDE2IGJ5IERhdmlkIFJvbHNreS4KClRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgbGljZW5zZWQgdW5kZXI6CgogIFRoZSBBcnRpc3RpYyBMaWNlbnNlIDIuMCAoR1BMIENvbXBhdGlibGUpCgo9Y3V0Cg==
cGFja2FnZSBUZXh0Ojp2RmlsZTo6YXNEYXRhOwp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cm5vIHdhcm5pbmdzICd1bmluaXRpYWxpemVkJzsKdXNlIGJhc2UgcXcoIENsYXNzOjpBY2Nlc3Nvcjo6Q2hhaW5lZDo6RmFzdCApOwpfX1BBQ0tBR0VfXy0+bWtfYWNjZXNzb3JzKHF3KCBwcmVzZXJ2ZV9wYXJhbXMgKSk7Cm91ciAkVkVSU0lPTiA9ICcwLjA4JzsKCj1oZWFkMSBOQU1FCgpUZXh0Ojp2RmlsZTo6YXNEYXRhIC0gcGFyc2UgdkZpbGUgZm9ybWF0dGVkIGZpbGVzIGludG8gZGF0YSBzdHJ1Y3R1cmVzCgo9aGVhZDEgU1lOT1BTSVMKCiAgdXNlIFRleHQ6OnZGaWxlOjphc0RhdGE7CiAgb3BlbiBteSAkZmgsICJmb28uaWNzIgogICAgb3IgZGllICJjb3VsZG4ndCBvcGVuIGljczogJCEiOwogIG15ICRkYXRhID0gVGV4dDo6dkZpbGU6OmFzRGF0YS0+bmV3LT5wYXJzZSggJGZoICk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KClRleHQ6OnZGaWxlOjphc0RhdGEgcmVhZHMgdkZpbGUgZm9ybWF0IGZpbGVzLCBzdWNoIGFzIHZDYXJkIChSRkMgMjQyNikgYW5kCnZDYWxlbmRhciAoUkZDIDI0NDUpLgoKPWN1dAoKc3ViIF91bndyYXBfbGluZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15IEBsaW5lczsKICAgIGZvciAoQF8pIHsKICAgICAgICBteSAkbGluZSA9ICRfOyAjICRfIG1heSBiZSByZWFkb25seQogICAgICAgICRsaW5lID1+IHN7W1xyXG5dKyR9e307ICMgbGluZXMgU0hPVUxEIGVuZCBDUkxGCiAgICAgICAgaWYgKCRsaW5lID1+IC9eWyBcdF0oLiopLykgeyAjIENvbnRpbnVhdGlvbiBsaW5lIChSRkMgU2VjdC4gNC4xKQogICAgICAgICAgICBkaWUgIkNvbnRpbnVhdGlvbiBsaW5lLCBidXQgbm8gcHJlY2VkaW5nIGxpbmUiIHVubGVzcyBAbGluZXM7CiAgICAgICAgICAgICRsaW5lc1stMV0gLj0gJDE7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgICAgIHB1c2ggQGxpbmVzLCAkbGluZTsKICAgIH0KICAgIHJldHVybiBAbGluZXM7Cn0KCnN1YiBwYXJzZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZoID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnBhcnNlX2xpbmVzKCA8JGZoPiApOwp9CgojIGxpa2UgVGV4dDo6UGFyc2VXb3JkcycgcGFyc2VfbGluZSwgb25seSBDLXN0eWxlIHNvIHRoZSByZWdleCBlbmdpbmUgZG9lc24ndAojIGJsb3cgaXRzIHN0YWNrLCBhbmQgaXQncyBhbHNvIGdvdCBhICRsaW1pdCBsaWtlIHNwbGl0CgojIHRoaXMgb25seSB0b29rIGEgdHJhaW5yaWRlLCBzbyBJJ20gcHJldHR5IHN1cmUgdGhlcmUgYXJlIGx1cmtpbmcKIyBjb3JuZXIgY2FzZXMgLSB3aGVuIEkgZ2V0IGEgdHVpdCBJJ2xsIHRha2UgdGhlIFRleHQ6OlBhcnNlV29yZHMKIyB0ZXN0cyBhbmQgcnVuIHRoZW0gdGhyb3VnaCBpdAoKc3ViIHBhcnNlX2xpbmUgewogICAgbXkgKCRkZWxpbSwgJGtlZXAsICR0ZXh0LCAkbGltaXQpID0gQF87CgogICAgbXkgKCRjdXJyZW50LCBAcGFydHMpOwogICAgbXkgKCRxdW90ZSwgJGVzY2FwZWQpOwogICAgd2hpbGUgKGxlbmd0aCAkdGV4dCkgewogICAgICAgIGlmICgkdGV4dCA9fiBze14oXFwpfXt9KSB7CiAgICAgICAgICAgICRjdXJyZW50IC49ICQxIGlmICRlc2NhcGVkIHx8ICRrZWVwOwogICAgICAgICAgICAkZXNjYXBlZCA9ICEkZXNjYXBlZDsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcXVvdGUgJiYgISRlc2NhcGVkICYmICR0ZXh0ID1+IHN7XiRkZWxpbX17fSkgewogICAgICAgICAgICBwdXNoIEBwYXJ0cywgJGN1cnJlbnQ7CiAgICAgICAgICAgICRjdXJyZW50ID0gdW5kZWY7CiAgICAgICAgICAgIGlmIChkZWZpbmVkICRsaW1pdCAmJiBAcGFydHMgPT0gJGxpbWl0IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQHBhcnRzLCAkdGV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBwdWxsIHRoZSBjaGFyYWN0ZXIgb2ZmIHRvIHRha2UgYSBsb29rc2VlCiAgICAgICAgICAgICR0ZXh0ID1+IHN7KC4pfXt9OwogICAgICAgICAgICBteSAkY2hhciA9ICQxOwogICAgICAgICAgICBpZiAoJGNoYXIgZXEgJyInICYmICEkZXNjYXBlZCkgewogICAgICAgICAgICAgICAgIyBlaXRoZXIgaXQncyBkZWZpbmVkIGFuZCBtYXRjaGVzLCBpbiB3aGljaCBjYXNlIHdlCiAgICAgICAgICAgICAgICAjIGNsZWFyIHRoZSBxdW90ZSB2YXJpYWJsZSwgb3IgaXQncyB1bmRlZmluZWQgd2hpY2gKICAgICAgICAgICAgICAgICMgbWFrZXMgdGhpcyBxdW90ZSBhbiBvcGVuaW5nIHF1b3RlCiAgICAgICAgICAgICAgICAkcXVvdGUgPSAhJHF1b3RlOwogICAgICAgICAgICAgICAgJGN1cnJlbnQgLj0gJGNoYXIgaWYgJGtlZXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkY3VycmVudCAuPSAkY2hhcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZXNjYXBlZCA9IDA7CiAgICB9CgogICAgcmV0dXJuIEBwYXJ0cywgJGN1cnJlbnQ7Cn0KCnN1YiBwYXJzZV9saW5lcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIG15IEBwYXRoOwogICAgbXkgJGN1cnJlbnQ7CiAgICBmb3IgKCRzZWxmLT5fdW53cmFwX2xpbmVzKCBAXyApKSB7CiAgICAgICAgIyBJZ25vcmUgbGVhZGluZyBvciB0cmFpbGluZyBibGFuayBsaW5lcyBhdCB0aGUgdG9wL2JvdHRvbSBvZiB0aGUKICAgICAgICAjIGlucHV0LiAgTm90IHN1cmUgYWJvdXQgY29tcGxldGVseSBibGFuayBsaW5lcyB3aXRoaW4gdGhlIGlucHV0CiAgICAgICAgbmV4dCBpZiBzY2FsYXIgQHBhdGggPT0gMCBhbmQgJF8gPX4gL15ccyokLzsKCiAgICAgICAgaWYgKC9eQkVHSU46KC4qKS9pKSB7CiAgICAgICAgICAgIHB1c2ggQHBhdGgsICRjdXJyZW50OwogICAgICAgICAgICAkY3VycmVudCA9IHsgdHlwZSA9PiAkMSB9OwogICAgICAgICAgICBwdXNoIEB7ICRwYXRoWy0xXXtvYmplY3RzfSB9LCAkY3VycmVudDsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKC9eRU5EOiguKikvaSkgewogICAgICAgICAgICBkaWUgIkVORCAkMSBpbiAkY3VycmVudC0+e3R5cGV9IgogICAgICAgICAgICAgIHVubGVzcyBsYyAkY3VycmVudC0+e3R5cGV9IGVxIGxjICQxOwogICAgICAgICAgICAkY3VycmVudCA9IHBvcCBAcGF0aDsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CgogICAgICAgICMgd2UnZCB1c2UgVGV4dDo6UGFyc2VXb3JkcyBoZXJlLCBidXQgaXQgbGlrZXMgdG8gc2VnZmF1bHQuCiAgICAgICAgbXkgKCRuYW1lLCAkdmFsdWUpID0gcGFyc2VfbGluZSggJzonLCAxLCAkXywgMik7CiAgICAgICAgJHZhbHVlID0gJycgdW5sZXNzIGRlZmluZWQgJHZhbHVlOwogICAgICAgIG15IEBwYXJhbXMgPSBwYXJzZV9saW5lKCAnOycsIDAsICRuYW1lICk7CiAgICAgICAgJG5hbWUgPSBzaGlmdCBAcGFyYW1zOwoKICAgICAgICAkdmFsdWUgPSB7IHZhbHVlID0+ICR2YWx1ZSB9OwoKICAgICAgICBmb3JlYWNoIG15ICRwYXJhbSAoQHBhcmFtcykgewogICAgICAgICAgICBteSAoJHBfbmFtZSwgJHBfdmFsdWUpID0gc3BsaXQgLz0vLCAkcGFyYW07CiAgICAgICAgICAgIHB1c2ggQHsgJHZhbHVlLT57cGFyYW1zfSB9LCB7ICRwX25hbWUgPT4gJHBfdmFsdWUgfQogICAgICAgICAgICAgIGlmICRzZWxmLT5wcmVzZXJ2ZV9wYXJhbXM7CiAgICAgICAgICAgICR2YWx1ZS0+e3BhcmFtfXsgJHBfbmFtZSB9ID0gJHBfdmFsdWU7CiAgICAgICAgfQogICAgICAgIHB1c2ggQHsgJGN1cnJlbnQtPntwcm9wZXJ0aWVzfXsgJG5hbWUgfSB9LCAkdmFsdWU7CiAgICB9CgogICAgIyBzb21ldGhpbmcgZGlkIGEgQkVHSU4gYnV0IG5vIEVORCAtIFRPRE8sIHVud2luZCB0aGlzIG5pY2VseSBhcwogICAgIyBpdCBtYXkgYmUgbW9yZSB0aGFuIG9uZSBsZXZlbAogICAgZGllICJCRUdJTiAkY3VycmVudC0+e3R5cGV9IHdpdGhvdXQgbWF0Y2hpbmcgRU5EIgogICAgICBpZiBAcGF0aDsKCiAgICByZXR1cm4gJGN1cnJlbnQ7Cn0KCiMgdGhpcyBtaWdodCBub3Qgc3RyaWN0bHkgY29tcGx5CnN1YiBnZW5lcmF0ZV9saW5lcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHRoaXMgPSBzaGlmdDsKCiAgICBteSBAbGluZXM7CiAgICAjIFhYWCBhbGwgdGhlIGV4aXN0ZW5jZSBjaGVja3MgYXJlIHRvIHByZXZlbnQgYXV0by12aXZpZmljYXRpb24KICAgICMgYnJlYWtpbmcgaWZfZGlmZiB0ZXN0cyAtIGRvIHdlIG1pbmQsIG9yIHNob3VsZCB0aGUgZmllbGRzIGhhdmUgYmVlbgogICAgIyB0aGVyZSBhbnl3YXk/CgogICAgcHVzaCBAbGluZXMsICJCRUdJTjokdGhpcy0+e3R5cGV9IiBpZiBleGlzdHMgJHRoaXMtPnt0eXBlfTsKICAgIGlmIChleGlzdHMgJHRoaXMtPntwcm9wZXJ0aWVzfSkgewogICAgICAgIHdoaWxlIChteSAoJG5hbWUsICR2KSA9IGVhY2ggJXsgJHRoaXMtPntwcm9wZXJ0aWVzfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJHZhbHVlIChAJHYpIHsKICAgICAgICAgICAgICAgICMgWFhYIHNvIHdlJ3JlIHRha2luZyBwYXJhbXMgaW4gcHJlZmVyZW5jZSB0byBwYXJhbSwKICAgICAgICAgICAgICAgICMgbGV0J3MgYmUgc3VyZSB0byBkb2N1bWVudCB0aGF0IHdoZW4gd2UgZG9jdW1lbnQgdGhpcwogICAgICAgICAgICAgICAgIyBtZXRob2QKICAgICAgICAgICAgICAgIG15ICRwYXJhbSA9IGpvaW4gJzsnLCAnJywgbWFwIHsKICAgICAgICAgICAgICAgICAgICBteSAkaGFzaCA9ICRfOwogICAgICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgICAgICIkXyIgLiAoZGVmaW5lZCAkaGFzaC0+eyRffSA/ICAiPSIgLiAkaGFzaC0+eyRffSA6ICIiKQogICAgICAgICAgICAgICAgICAgIH0ga2V5cyAlJGhhc2gKICAgICAgICAgICAgICAgIH0gQHsgJHZhbHVlLT57cGFyYW1zfSB8fCBbICR2YWx1ZS0+e3BhcmFtfSBdIH07CiAgICAgICAgICAgICAgICBteSAkbGluZSA9ICIkbmFtZSRwYXJhbTokdmFsdWUtPnt2YWx1ZX0iOwogICAgICAgICAgICAgICAgIyB3cmFwcGluZywgYnV0IGRvbmUgdWdseQogICAgICAgICAgICAgICAgbXkgQGNodW5rcyA9ICRsaW5lID1+IG0vKC57MSw3Mn0pL2c7CiAgICAgICAgICAgICAgICBwdXNoIEBsaW5lcywgc2hpZnQgQGNodW5rczsKICAgICAgICAgICAgICAgIHB1c2ggQGxpbmVzLCBtYXAgeyAiICRfIiB9IEBjaHVua3M7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGV4aXN0cyAkdGhpcy0+e29iamVjdHN9KSB7CiAgICAgICAgcHVzaCBAbGluZXMsICRzZWxmLT5nZW5lcmF0ZV9saW5lcyggJF8gKSBmb3IgQHsgJHRoaXMtPntvYmplY3RzfSB9CiAgICB9CiAgICBwdXNoIEBsaW5lcywgIkVORDokdGhpcy0+e3R5cGV9IiBpZiBleGlzdHMgJHRoaXMtPnt0eXBlfTsKICAgIHJldHVybiBAbGluZXM7Cn0KCgoxOwpfX0VORF9fCgo9aGVhZDEgREFUQSBTVFJVQ1RVUkUKCkEgdkZpbGUgY29udGFpbnMgb25lIG9yIG1vcmUgb2JqZWN0cywgZGVsaW1pdGVkIGJ5IEJFR0lOIGFuZCBFTkQgdGFncy4KCiAgQkVHSU46VkNBUkQKICAuLi4KICBFTkQ6VkNBUkQKCk9iamVjdHMgbWF5IGNvbnRhaW4gc3ViLW9iamVjdHM7CgogIEJFR0lOOlZDQUxFTkRBUgogIC4uLgogIEJFR0lOOlZFVkVOVAogIC4uLgogIEVORDpWRVZFTlQKICAuLi4KICBFTlY6VkNBTEVOREFSCgpFYWNoIG9iamVjdCBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzLiAgRWFjaCBwcm9wZXJ0eQpjb25zaXN0cyBvZiBhIG5hbWUsIHplcm8gb3IgbW9yZSBvcHRpb25hbCBwYXJhbWV0ZXJzLCBhbmQgdGhlbiBhCnZhbHVlLiAgVGhpcyBmcmFnbWVudDoKCiAgRFRTVEFSVDtWQUxVRT1EQVRFOjE5OTcwMzE3CgppZGVudGlmaWVzIGEgcHJvcGVydHkgd2l0aCB0aGUgbmFtZSwgQzxEU1RBUlQ+LCB0aGUgcGFyYW1ldGVyCkM8VkFMVUU+LCB3aGljaCBoYXMgdGhlIHZhbHVlIEM8REFURT4sIGFuZCB0aGUgcHJvcGVydHkncyB2YWx1ZSBpcwpDPDE5OTcwMzE3Pi4gIFRob3NlIG9mIHlvdSB3aXRoIGFuIFhNTCBiZW50IG1pZ2h0IGZpbmQgdGhpcyBtb3JlCnJlY29nbmlzYWJsZSBhczoKCiAgPGR0c3RhcnQgdmFsdWU9ImRhdGUiPjE5OTcwMzE3PC9kdHN0YXJ0PgoKVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBDPHBhcnNlKCk+IG1ldGhvZCBpcyBhIGhhc2ggcmVmLgoKVGhlIHRvcCBsZXZlbCBrZXksIEM8b2JqZWN0cz4sIHJlZmVycyB0byBhbiBhcnJheSByZWYuICBFYWNoIGVudHJ5IGluIHRoZQphcnJheSByZWYgaXMgYSBoYXNoIHJlZiB3aXRoIHR3byBvciB0aHJlZSBrZXlzLgoKVGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBrZXksIEM8dHlwZT4sIGlzIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlCnR5cGUgb2YgdGhlIG9iamVjdC4gIEUuZy4sIEM8VkNBUkQ+LCBDPFZFVkVOVD4sIGFuZCBzbyBvbi4KClRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGtleSwgQzxwcm9wZXJ0aWVzPiwgaXMgYSBoYXNoIHJlZiwgd2l0aCBwcm9wZXJ0eQpuYW1lcyBhcyBrZXlzLCBhbmQgYW4gYXJyYXkgcmVmIG9mIHRob3NlIHByb3BlcnR5IHZhbHVlcy4gIEl0J3MgYW4gYXJyYXkKcmVmLCBiZWNhdXNlIHNvbWUgcHJvcGVydGllcyBtYXkgYXBwZWFyIHdpdGhpbiBhbiBvYmplY3QgbXVsdGlwbGUgdGltZXMKd2l0aCBkaWZmZXJlbnQgdmFsdWVzLiAgRm9yIGV4YW1wbGU7CgogIEJFR0lOOlZFVkVOVAogIEFUVEVOREVFO0NOPSJOaWsgQ2xheXRvbiI6bWFpbHRvOm5pa0BGcmVlQlNELm9yZwogIEFUVEVOREVFO0NOPSJSaWNoYXJkIENsYW1wIjptYWlsdG86cmljaGFyZGNAdW5peGJlYXJkLm5ldAogIC4uLgogIEVORDpWRVZFTlQKCkVhY2ggZW50cnkgaW4gdGhlIGFycmF5IHJlZiBpcyBhIGhhc2ggcmVmIHdpdGggb25lIG9yIHR3byBrZXlzLgoKVGhlIGZpcnN0IGtleSwgQzx2YWx1ZT4sIGNvcnJlc3BvbmRzIHRvIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLgoKVGhlIHNlY29uZCBrZXksIEM8cGFyYW0+LCBjb250YWlucyBhIGhhc2ggcmVmIG9mIHRoZSBwcm9wZXJ0eSdzCnBhcmFtZXRlcnMuICBLZXlzIGluIHRoaXMgaGFzaCByZWYgYXJlIHRoZSBwYXJhbWV0ZXIncyBuYW1lLCB0aGUgdmFsdWUKaXMgdGhlIHBhcmFtZXRlcidzIHZhbHVlLiAgKElmIHlvdSBlbmFibGUgdGhlIEM8cHJlc2VydmVfcGFyYW1zPgpvcHRpb24gdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBrZXkgcG9wdWxhdGVkLCBjYWxsZWQgQzxwYXJhbXM+LiAgSXQgaXMKYW4gYXJyYXkgcmVmIG9mIGhhc2ggcmVmcywgZWFjaCBoYXNoIHJlZiBpcyB0aGUgcGFyYW1ldGVyJ3MgbmFtZSBhbmQKdGhlIHBhcmFtZXRlcidzIHZhbHVlIC0gdGhlc2UgYXJlIGNvbGxlY3RlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUKZW5jb3VudGVyZWQgdG8gcHJldmVudCBoYXNoIGNvbGxpc2lvbnMgYXMgc2VlbiBpbiBzb21lIHZDYXJkIGZpbGVzKQpsaW5lLikKClRoZSB0aGlyZCBrZXkgaW4gdGhlIHRvcCBsZXZlbCBDPG9iamVjdHM+IGhhc2ggcmVmIGlzIEM8b2JqZWN0cz4uICBJZgppdCBleGlzdHMsIGl0IGluZGljYXRlcyB0aGF0IHN1Yi1vYmplY3RzIHdlcmUgZm91bmQuICBUaGUgdmFsdWUgb2YKdGhpcyBrZXkgaXMgYW4gYXJyYXkgcmVmIG9mIHN1Yi1vYmplY3RzLCB3aXRoIGlkZW50aWNhbCBrZXlzIGFuZApiZWhhdmlvdXIgdG8gdGhhdCBvZiB0aGUgdG9wIGxldmVsIEM8b2JqZWN0cz4ga2V5LiAgVGhpcyByZWN1cnNpdmUKc3RydWN0dXJlIGNvbnRpbnVlcywgbmVzdGluZyBhcyBkZWVwbHkgYXMgdGhlcmUgd2VyZSBzdWItb2JqZWN0cyBpbgp0aGUgaW5wdXQgZmlsZS4KClRoZSBDPGJpbi92MnlhbWw+IHNjcmlwdCB0aGF0IGNvbWVzIHdpdGggdGhpcyBkaXN0cmlidXRpb24gZGlzcGxheXMgdGhlCmZvcm1hdCBvZiBhIHZGaWxlIGFzIFlBTUwuICBDPHQvMDN1c2FnZS50PiBoYXMgZXhhbXBsZXMgb2YgcGlja2luZyBvdXQKdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIGRhdGEgc3RydWN0dXJlLgoKPWhlYWQxIEFVVEhPUlMKClJpY2hhcmQgQ2xhbXAgPHJpY2hhcmRjQHVuaXhiZWFyZC5uZXQ+IGFuZCBOaWsgQ2xheXRvbiA8bmlrQEZyZWVCU0Qub3JnPgoKPWhlYWQxIENPUFlSSUdIVAoKQ29weXJpZ2h0IDIwMDQsIDIwMTAsIDIwMTMgUmljaGFyZCBDbGFtcCBhbmQgTmlrIENsYXl0b24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CmFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9aGVhZDEgQ0FWRUFUUwoKV2UgZG9uJ3QgZG8gYW55IGRlY29kaW5nIG9mIHByb3BlcnR5IHZhbHVlcywgaW5jbHVkaW5nIGRlc2NhcGluZwpDPFwsPiwgd2UncmUgc3RpbGwgdW5kZWNpZGVkIGFzIHRvIHdoZXRoZXIgdGhpcyBpcyBhIGJ1Zy4KCj1oZWFkMSBCVUdTCgpBc2lkZSBmcm9tIHRoZSBUT0RPIGxpc3QgaXRlbXMsIG5vbmUga25vd24uCgo9aGVhZDEgU0VFIEFMU08KClRleHQ6OnZGaWxlIC0gcGFyc2VzIHRvIG9iamVjdHMsIGRvZXNuJ3QgaGFuZGxlIG5lc3RlZCBpdGVtcwoKUkZDIDI0MjYgLSB2Q2FyZCBzcGVjaWZpY2F0aW9uCgpSRkMgMjQ0NSAtIHZDYWxlbmRhciBzcGVjaWZpY2F0aW9uCgo9Y3V0CgojIEVtYWNzIGxvY2FsIHZhcmlhYmxlcyB0byBrZWVwIHRoZSBzdHlsZSBjb25zaXN0ZW50CgogIExvY2FsIFZhcmlhYmxlczoKICBjcGVybC1pbmRlbnQtbGV2ZWw6IDQKICBFbmQ6Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdCZW5hY2hyaWNodGlndW5nIMO8YmVyIEVycmVpY2hlbiBkZXIgRXJpbm5lcnVuZ3N6ZWl0IHZvbiBUZXJtaW5lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnU2llIGVyaGFsdGVuIGltbWVyIGRhbm4gZWluZSBCZW5hY2hyaWNodGlndW5nLCB3ZW5uIGRlciBCZW5hY2hyaWNodGlndW5nc3plaXRwdW5rdCBmw7xyIGVpbmVuIElocmVyIFRlcm1pbmUgZXJyZWljaHQgd3VyZGUuJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnVmVyd2FsdHVuZyB2b24gVGVybWluYmVuYWNocmljaHRpZ3VuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnSGllciBrw7ZubmVuIFNpZSBlaW5lIEtvbmZpZ3VyYXRpb25zZGF0ZWkgaG9jaGxhZGVuLCBtaXQgZGVyIFRlcm1pbmJlbmFjaHJpY2h0aWd1bmdlbiBpbSBTeXN0ZW0gaW1wb3J0aWVydCB3ZXJkZW4ga8O2bm5lbi4gRGllIERhdGVpIG11c3MgaW0gLnltbC1Gb3JtYXQgdm9ybGllZ2VuLCBzbyB3aWUgc2llIGF1Y2ggdm9tIFRlcm1pbmJlbmFjaHJpY2h0aWd1bmdzbW9kdWwgZXhwb3J0aWVydCB3aXJkLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0hpZXIga8O2bm5lbiBTaWUgYXVzd8OkaGxlbiwgd2VsY2hlIEVyZWlnbmlzc2UgZGllc2UgQmVuYWNocmljaHRpZ3VuZyBhdXNsw7ZzZW4uIEVpbiB6dXPDpHR6bGljaGVyIFRlcm1pbmZpbHRlciBrYW5uIHdlaXRlciB1bnRlbiBlaW5nZXN0ZWxsdCB3ZXJkZW4sIHVtIGRpZSBCZW5hY2hyaWNodGlndW5nZW4gbnVyIGbDvHIgVGVybWluZSBtaXQgYmVzdGltbXRlbiBNZXJrbWFsZW4genUgdmVyc2VuZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdUZXJtaW5maWx0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ1RlYW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICdSZXNvdXJjZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ051ciBlaW5tYWwgYW0gVGFnIHBybyBUZXJtaW4gdW5kIEJlbmFjaHJpY2h0aWd1bmdzLVRyYW5zcG9ydG1ldGhvZGUgdmVyc2VuZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ0JlbmFjaHJpY2h0aWd1bmdlbiB3dXJkZW4gYW4gZWluZW4gQWdlbnRlbiB2ZXJzZW5kZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdEaWUgZXJzdGVuIDIwIFplaWNoZW4gZGVzIFRlcm1pbmJldHJlZmZzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ0RpZSBUZXJtaW4tQXR0cmlidXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnRGllIEthbGVuZGVyLUF0dHJpYnV0ZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICdBZ2VuZGHDvGJlcnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdLYWxlbmRlciB2ZXJ3YWx0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnVGVybWluIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnRmFyYmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdFbmR6ZWl0cHVua3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwZWF0J30gPSAnV2llZGVyaG9sdW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ0tlaW5lIEthbGVuZGVyIGdlZnVuZGVuLiBCaXR0ZSBsZWdlbiBTaWUgenVlcnN0IGVpbmVuIEthbGVuZGVyIMO8YmVyIGRpZSBLYWxlbmRlcnZlcndhbHR1bmcgYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnVGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdEaWVzZXIgVGVybWluIHdpZWRlcmhvbHQgc2ljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ03DtmNodGVuIFNpZSBudXIgZGllc2VuIFRlcm1pbiBvZGVyIGFsbGUgVm9ya29tbW5pc3NlIGJlYXJiZWl0ZW4/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ0FsbGUgVm9ya29tbW5pc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnTnVyIGRpZXNlbiBUZXJtaW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ0thbGVuZGVydmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ0thbGVuZGVyw7xiZXJzaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAnRWluZW4gbmV1ZW4gS2FsZW5kZXIgYW5sZWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdOZXVlbiBLYWxlbmRlciBhbmxlZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdUZXJtaW5lIGltcG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0thbGVuZGVyIGltcG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnSGllciBrw7ZubmVuIFNpZSBlaW5lIEtvbmZpZ3VyYXRpb25zZGF0ZWkgaG9jaGxhZGVuLCB1bSBlaW5lbiBLYWxlbmRlciBpbiBJaHIgU3lzdGVtIHp1IGltcG9ydGllcmVuLiBEaWUgRGF0ZWkgbXVzcyBpbSAueW1sIEZvcm1hdCB2b3JsaWVnZW4sIHNvIHdpZSBzaWUgaW4gZGVyIEthbGVuZGVydmVyd2FsdHVuZyBleHBvcnRpZXJ0IHd1cmRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ0thbGVuZGVyLUtvbmZpZ3VyYXRpb24gaG9jaGxhZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ0thbGVuZGVyIGltcG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdGVyIGbDvHIgS2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnQWJow6RuZ2lnIHZvbiBkZXIgR3J1cHBlbnp1Z2Vow7ZyaWdrZWl0IHdpcmQgZGFzIFN5c3RlbSBCZW51dHplcm4gZGVuIFp1Z3JpZmYgYW5oYW5kIGlocmVyIEJlcmVjaHRpZ3VuZ2VuIGVybGF1YmVuIGJ6dy4gdmVyd2VpZ2Vybi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdSTzogQmVudXR6ZXIga8O2bm5lbiBUZXJtaW5lIHNlaGVuIHVuZCBLYWxlbmRlciBleHBvcnRpZXJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICdWZXJzY2hpZWJlbiBpbjogQmVudXR6ZXIga8O2bm5lbiBUZXJtaW5lIGlubmVyaGFsYiBlaW5lcyBLYWxlbmRlcnMgYmVhcmJlaXRlbiwgZGllc2UgamVkb2NoIG5pY2h0IGluIGFuZGVyZSBLYWxlbmRlciB2ZXJzY2hpZWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ0Vyc3RlbGxlbjogQmVudXR6ZXIga8O2bm5lbiBUZXJtaW5lIGltIEthbGVuZGVyIGVyc3RlbGxlbiB1bmQgbMO2c2NoZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICdydzogQmVudXR6ZXIga8O2bm5lbiBkaWUgS2FsZW5kZXIgYW4gc2ljaCB2ZXJ3YWx0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdLYWxlbmRlciBleHBvcnRpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ0thbGVuZGVyIGhlcnVudGVybGFkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnw5ZmZmVudGxpY2hlIEthbGVuZGVyIFVSTCBrb3BpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAnS2FsZW5kZXJuYW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ0VpbiBLYWxlbmRlciBtaXQgZ2xlaWNoZW0gTmFtZW4gZXhpc3RpZXJ0IGJlcmVpdHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Blcm1pc3Npb24gZ3JvdXAnfSA9ICdCZXJlY2h0aWd1bmdzZ3J1cHBlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdUaWNrZXQgVGVybWluZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVnZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnVmVyd2VuZGVuIFNpZSBkaWUgZm9sZ2VuZGVuIE9wdGlvbmVuLCAgdW0gZWluenVncmVuemVuIHdlbGNoZSBUaWNrZXQtVGVybWluZSBhdXRvbWF0aXNjaCBlcnN0ZWxsdCB3ZXJkZW4gc29sbGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnQml0dGUgd8OkaGxlbiBTaWUgZWluZSBnw7xsdGlnZSBRdWV1ZSBhdXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAnU3VjaGF0dHJpYnV0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ0RlZmluaXRpb24gdm9uIFJlZ2VsbiwgdW0gYXV0b21hdGlzY2ggVGVybWluZSBpbiBkaWVzZW0gS2FsZW5kZXIgenUgZXJzdGVsbGVuLCB3ZWxjaGUgYXVmIFRpY2tldGRhdGVuIGJhc2llcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ1JlZ2VsIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICdNZWhyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICdXZW5pZ2VyJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0VpbmVuIG5ldWVuIFRlcm1pbiBhbmxlZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0thbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdadXZpZWxlIGFrdGl2ZSBLYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICdCaXR0ZSBkZWFrdGl2aWVyZW4gU2llIHp1ZXJzdCBlaW5pZ2Ugb2RlciBlcmjDtmhlbiBTaWUgZGFzIExpbWl0IGluIGRlciBLb25maWd1cmF0aW9uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnV29jaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICdaZWl0c3RyYWhsIE1vbmF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICdaZWl0c3RyYWhsIFdvY2hlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ1plaXRzdHJhaGwgVGFnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdTcHJpbmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnVmVyd2VyZmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdBbnplaWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ0dydW5kbGVnZW5kZSBJbmZvcm1hdGlvbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGUvVGltZSd9ID0gJ0RhdHVtL1plaXQnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ0JpdHRlIHNldHplbiBTaWUgZWluZW4gV2VydCB2b3IgZGVtIEVuZGRhdHVtLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICdCaXR0ZSBzZXR6ZW4gU2llIGVpbmVuIFdlcnQgbmFjaCBkZW0gU3RhcnRkYXR1bS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ0RpZXMgaXN0IGVpbiBWb3Jrb21tbmlzIGVpbmVzIHNpY2ggd2llZGVyaG9sZW5kZW4gVGVybWlucy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdLbGlja2VuIFNpZSBoaWVyLCB1bSBkZW4gRWx0ZXJuLVRlcm1pbiBhbnp1emVpZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdLbGlja2VuIFNpZSBoaWVyLCB1bSBkZW4gRWx0ZXJuLVRlcm1pbiB6dSBiZWFyYmVpdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVxdWVueic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ0FsbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ1JlbGF0aXZlciBaZWl0cHVua3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnTcO2Y2h0ZW4gU2llIGRpZXNlbiBUZXJtaW4gd2lya2xpY2ggbMO2c2NoZW4/IERpZXNlIMOEbmRlcnVuZyBrYW5uIG5pY2h0IHLDvGNrZ8OkbmdpZyBnZW1hY2h0IHdlcmRlbi4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ1Rlcm1pbmUgaW1wb3J0aWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICdEaWUgaG9jaGdlbGFkZW5lIERhdGVpIG11c3MgaW4gZWluZW0gZ8O8bHRpZ2VuIGlDYWwtRm9ybWF0ICguaWNzKSB2b3JsaWVnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ1NvbGx0ZSBlaW4gZ2V3w7xuc2NodGVyIEthbGVuZGVyIGhpZXIgbmljaHQgYXVmZ2VsaXN0ZXQgc2Vpbiwgc3RlbGxlbiBTaWUgYml0dGUgc2ljaGVyLCBkYXNzIFNpZSBtaW5kZXN0ZW5zIGRpZSBCZXJlY2h0aWd1bmcgenVtIEVyc3RlbGxlbiB2b24gS2FsZW5kZXJuIGJlc2l0emVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ0V4aXN0aWVyZW5kZSBUZXJtaW5lIMO8YmVyc2NocmVpYmVuPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ0FsbGUgZXhpc3RpZXJlbmRlbiBUZXJtaW5lIG1pdCBkZXIgc2VsYmVuICJVbmlxdWVJRCIgaW0gZW50c3ByZWNoZW5kZW4gS2FsZW5kZXIgd2VyZGVuIMO8YmVyc2NocmllYmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdLYWxlbmRlciBob2NobGFkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ1Rlcm1pbmUgaW1wb3J0aWVyZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTmV1ZXIgVGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdEZW1uw6RjaHN0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgVGFnZSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICdCZW5hY2hyaWNodGlndW5nc25hbWUgZXhpc3RpZXJ0IGJlcmVpdHMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBZ2VudGVuIChSZXNvdXJjZW4pLCB3ZWxjaGUgaW5uZXJoYWxiIGRlcyBUZXJtaW5zIGF1c2dld8OkaGx0IHd1cmRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBbGxlIEFnZW50ZW4gbWl0IChtaW5kZXN0ZW5zKSBMZXNlYmVyZWNodGlndW5nIGbDvHIgZGVuIFRlcm1pbihrYWxlbmRlciknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBbGxlIEFnZW50ZW4gbWl0IFNjaHJlaWJiZXJlY2h0aWd1bmcgZsO8ciBkZW4gVGVybWluKGthbGVuZGVyKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnRGFzIFN5c3RlbSBrb25udGVuIGRlbiBLYWxlbmRlciBuaWNodCBlcnN0ZWxsZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnS2VpbmUgQ2FsZW5kZXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAnU2llIGhhYmVuIGtlaW5lIFp1Z3JpZmZzYmVyZWNodGlndW5nIGF1ZiBkaWVzZW4gS2FsZW5kZXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdLYWxlbmRlciBiZWFyYmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdGZWhsZXIgYmVpbSBBa3R1YWxpc2llcmVuIGRlcyBLYWxlbmRlcnMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdLYWxlbmRlciBLb25maWd1cmF0aW9uc2RhdGVpIGtvbm50ZSBuaWNodCBnZWxlc2VuIHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAnQml0dGUgc3RlbGxlbiBTaWUgc2ljaGVyLCBkYXNzIGRpZSBEYXRlaSBnw7xsdGlnIGlzdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAnS2FsZW5kZXIga29ubnRlIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdLYWxlbmRlciB3dXJkZSBpbXBvcnRpZXJ0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnQ2FsZW5kYXJJRCB3aXJkIGJlbsO2dGlndCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdEYXRlbiBrb25udGVuIG5pY2h0IGFiZ2VydWZlbiB3ZXJkZW4gZsO8ciBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdFcyB3dXJkZShuKSAlcyBUZXJtaW4oZSkgZXJmb2xncmVpY2ggaW4gS2FsZW5kZXIgJXMgaW1wb3J0aWVydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IE1pbnV0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgTWludXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBTdHVuZGUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAnQWxsZSBUZXJtaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ01pciB6dWdld2llc2VuZSBUZXJtaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdFcyB3ZXJkZW4gbnVyIFRlcm1pbmUgYW5nZXplaWd0LCBkaWUgSWhuZW4genVnZXdpZXNlbiBzaW5kISBFaW5zdGVsbHVuZ2VuIMOkbmRlcm4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnVGVybWluIHd1cmRlIG5pY2h0IGdlZnVuZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ05pZW1hbHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnSmVkZW4gVGFnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdKZWRlIFdvY2hlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnSmVkZW4gTW9uYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ0plZGVzIEphaHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnQmVudXR6ZXJkZWZpbmllcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICd0w6RnbGljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICd3w7ZjaGVudGxpY2gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ21vbmF0bGljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICdqw6RocmxpY2gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdhbGxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAnZsO8ciAlcyBXaWVkZXJob2x1bmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdiaXMgLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJ2bDvHIgLi4uIFdpZWRlcmhvbHVuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnYmlzICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ0tlaW5lIEJlbmFjaHJpY2h0aWd1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzIE1pbnV0ZShuKSB2b3JoZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBTdHVuZGUobikgdm9yaGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBUYWcoZSkgdm9yaGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgV29jaGUobikgdm9yaGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAnYmV2b3IgZGVyIFRlcm1pbiBiZWdpbm50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnbmFjaGRlbSBkZXIgVGVybWluIGJlZ29ubmVuIGhhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICdiZXZvciBkZXIgVGVybWluIGVuZGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ25hY2hkZW0gZGVyIFRlcm1pbiBnZWVuZGV0IGhhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ0tlaW5lIEJlcmVjaHRpZ3VuZyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnVGlja2V0LVRlcm1pbiBrb25udGUgbmljaHQgZ2Vsw7ZzY2h0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnS2VpbmUgQmVyZWNodGlndW5nISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEltcG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMnfSA9ICdLZWluZSBCZXJlY2h0aWd1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnRGFzIFN5c3RlbSBrb25udGUgZGllIERhdGVpIG5pY2h0IGltcG9ydGllcmVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdCaXR0ZSBwcsO8ZmVuIFNpZSBkYXMgU3lzdGVtcHJvdG9rb2xsIGbDvHIgd2VpdGVyZSBJbmZvcm1hdGlvbmVuLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkIG1laHInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICdLZWluICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnS2VpbiBCZW51dHplciBnZWZ1bmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdVbmfDvGx0aWdlciBLYWxlbmRlciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnVW5nw7xsdGlnZSBVUkwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0VzIGlzdCBlaW4gRmVobGVyIGJlaW0gRXhwb3J0aWVyZW4gZGVzIEthbGVuZGVycyBhdWZnZXRyZXRlbiEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdBa3R1YWxpc2llcnVuZyAoTWludXRlbiknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ1Rlcm1pbmthbGVuZGVyIMOcYmVyc2ljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ1Rlcm1pbmJlbmFjaHJpY2h0aWd1bmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnVGVybWlua2FsZW5kZXIgRXZlbnQtTW9kdWwsIHdlbGNoZXMgQmVuYWNocmljaHRpZ3VuZ3NlaW50csOkZ2UgZsO8ciBUZXJtaW5lIHZvcmJlcmVpdGV0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnVGVybWluLUthbGVuZGVyIEV2ZW50bW9kdWwsIHdlbGNoZXMgVGlja2V0cyBtaXQgRGF0ZW4gYXVzIFRpY2tldC1UZXJtaW5lbiBha3R1YWxpc2llcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1Rlcm1pbmJlYXJiZWl0dW5nc2Fuc2ljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ1Rlcm1pbmxpc3RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnVGVybWlubGlzdGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdUZXJtaW5iZW5hY2hyaWNodGlndW5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnVGVybWluZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ0thbGVuZGVydmVyd2FsdHVuZ3NhbnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ0bDvHIgd2VsY2hlIFZlcsOkbmRlcnVuZ2VuIGFuIFRlcm1pbmVuIG3DtmNodGVuIFNpZSBCZW5hY2hyaWNodGlndW5nZW4gZXJoYWx0ZW4/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdFcnN0ZWxsdCBlaW5lbiBuZXVlbiBUZXJtaW4gaW4gZWluZW0gS2FsZW5kZXIsIHdlbGNoZXIgZGlyZWt0IG1pdCBkaWVzZW0gVGlja2V0IHZlcmtuw7xwZnQgaXN0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnVGVybWluYmVuYWNocmljaHRpZ3VuZ2VuIGVyc3RlbGxlbiB1bmQgdmVyd2FsdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0VpbmVuIG5ldWVuIFRlcm1pbiBlcnN0ZWxsZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICdMZWd0IGZlc3Qgd2VsY2hlIFNwYWx0ZW4gaW0gVGVybWludmVya27DvHBmdW5ncy1XaWRnZXQgYW5nZXplaWd0IHdlcmRlbiAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBNw7ZnbGljaGUgRWluc3RlbGx1bmdlbjogMCA9IERlYWt0aXZpZXJ0LCAxID0gVmVyZsO8Z2JhciwgMiA9IFN0YW5kYXJkbcOkw59pZyBha3RpdmllcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0Jlc2NocmVpYnQgZWluIFN5bWJvbCBtaXQgVmVya27DvHBmdW5nIHp1ciBHb29nbGUgTWFwcyBXZWJzZWl0ZSBtaXQgZGVtIGFrdHVlbGxlbiBTdGFuZG9ydCBhbHMgZW50c3ByZWNoZW5kZXMgWmllbCBpbiBkZXIgVGVybWluYmVhcmJlaXR1bmdzLU9iZXJmbMOkY2hlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ0xlZ3QgZGllIEV2ZW50LU9iamVrdHR5cGVuIGZlc3QsIHdlbGNoZSB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50IHZlcmFyYmVpdGV0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdMZWd0IGRpZSBMaXN0ZSBkZXIgUGFyYW1ldGVyIGZlc3QsIHdlbGNoZSBtaXQgZGVyIFRpY2tldHN1Y2hmdW5rdGlvbiB2ZXJ3ZW5kZXQgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ0Jlc2NocmVpYnQgZGVuIFRpY2tldC1UZXJtaW4tQmFja2VuZCBUeXAgZsO8ciBEYXR1bS9VaHJ6ZWl0IGR1cmNoIGR5bmFtaXNjaGUgRmVsZGVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnQmVzY2hyZWlidCBkZW4gVGlja2V0LVRlcm1pbi1CYWNrZW5kIFR5cCBmw7xyIFRpY2tldGVza2FsYXRpb25lbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ0Jlc2NocmVpYnQgZGVuIFRpY2tldC1UZXJtaW4tQmFja2VuZCBUeXAgZsO8ciBUaWNrZXRwZW5kaW5nemVpdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnTGVndCBkYXMgVGlja2V0LVBsdWdpbiBmw7xyIFRlcm1pbmUgZmVzdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdUZXJtaW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnWmVpdCBmw7xyIGVyc3RlIFJlYWt0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ1Rlcm1pbi1JbXBvcnQgT2JlcmZsw6RjaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnVmVya27DvHBmdCBUZXJtaW5lIHVuZCBUaWNrZXRzIG1pdCBlaW5lbSBMaW5rIHZvbSBUeXAgIk5vcm1hbCIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0ZSBhbGxlciBUZXJtaW4tRXZlbnRzLCB3ZWxjaGUgaW4gZGVyIEdVSSBhbmdlemVpZ3Qgd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGUgYWxsZXIgS2FsZW5kZXJlcmVpZ25pc3NlLCB3ZWxjaGUgaW4gZGVyIGdyYWZpc2NoZW4gQmVudXR6ZXJvYmVyZmzDpGNoZSBhbmdlemVpZ3Qgd2VyZGVuIHNvbGxlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdMaXN0ZSBhbiBGYXJiZW4gaW4gSGV4YWRlemltYWwgUkdCLCB3ZWxjaGUgdmVyc2NoaWVkZW5lbiBCZW51dHplcmthbGVuZGVybiB6dWdld2llc2VuIHdlcmRlbi4gU3RlbGxlbiBTaWUgc2ljaGVyLCBkYXNzIGRpZSBGYXJiZW4gZHVua2VsIGdlbnVnIHNpbmQsIHVtIHdlacOfZW4gVGV4dCBkYXJhdWYgZGFyenVzdGVsbGVuLiBTb2Zlcm4gZGllIEFuemFobCBkZXIgS2FsZW5kZXIgZGllIEFuemFobCBkZXIgdmVyZsO8Z2JhcmVuIEZhcmJlbiDDvGJlcnNjaHJlaXRldCwgd2lyZCBkaWVzZSBMaXN0ZSBlcm5ldXQgdm9uIEFuZmFuZyBhbiBnZW51dHp0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdWZXJzY2hpZWRlbmUgS2FsZW5kZXIgdmVyd2FsdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnTWF4aW1hbGUgQW56YWhsIGFuIGFrdGl2ZW4gS2FsZW5kZXJuIGluIGRlciBLYWxlbmRlcsO8YmVyc2ljaHQgb2RlciBSZXNvdXJjZW7DvGJlcnNpY2h0LiBCaXR0ZSBiZWFjaHRlbiBTaWUsIGRhc3Mgc2ljaCB6dXZpZWxlIGdsZWljaHplaXRpZyBha3RpdmUgS2FsZW5kZXIgYXVmZ3J1bmQgdmllbGVyIGdsZWljaHplaXRpZ2VyIEFuZnJhZ2VuIGF1ZiBkaWUgUGVyZm9ybWFuY2UgZGVzIFN5c3RlbXMgYXVzd2lya2VuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ09UUlMgdW50ZXJzdMO8dHp0IGtlaW5lIHdpZWRlcmhvbGVuZGVuIFRlcm1pbmUgb2huZSBFbmRkYXR1bSBvZGVyIEFuemFobCBkZXIgRHVyY2hsw6R1ZmUuIFfDpGhyZW5kIGRlcyBJbXBvcnRpZXJ1bmdzcHJvemVzc2VzIGthbm4gZXMgdm9ya29tbWVuLCBkYXNzIGRpZSBlbnRzcHJlY2hlbmRlIElDUy1EYXRlaSBzb2xjaGUgVGVybWluIGVudGjDpGx0LiBTdGF0dGRlc3NlbiB3aXJkIGRhcyBTeXN0ZW0gYWxsZSB2ZXJnYW5nZW5lbiBUZXJtaW5lIGVyc3RlbGxlbiwgc293aWUgenVzw6R0emxpY2ggVGVybWluZSBmw7xyIGRpZSBrb21tZW5kZW4gbiBNb25hdGUgKDEyMCBNb25hdGUgLyAxMCBKYWhyZSBzdGFuZGFyZG3DpMOfaWcpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ8OcYmVyc2ljaHQgYWxsZXIgVGVybWluZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdXYXJ0ZW4gYmlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICdQbHVnaW5zdWNoZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ01vZHVsZSB6dXIgUGx1Z2luc3VjaGUgZsO8ciBkaWUgQXV0b3ZlcnZvbGxzdMOkbmRpZ3VuZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnw5ZmZmVudGxpY2hlciBLYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnw5ZmZmVudGxpY2hlciBLYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Jlc291cmNlbsO8YmVyc2ljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUmVzb3VyY2Vuw7xiZXJzaWNodCAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnWmVpZ3QgZWluZW4gTGluayBpbSBNZW7DvCBkZXIgVGlja2V0Wm9vbS1BbnNpY2h0IGltIEFnZW50ZW4tSW50ZXJmYWNlIGFuLCB1bSBUZXJtaW5lIHp1IGVyc3RlbGxlbiwgd2VsY2hlIGRpcmVrdCBtaXQgZGVtIGVudHNwcmVjaGVuZGVuIFRpY2tldCB2ZXJrbsO8cGZ0IHNpbmQuIFp1c8OkdHpsaWNoZSBadWdyaWZmc2tvbnRyb2xsZSwgb2IgZGVyIE1lbsO8cHVua3QgYW5nZXplaWd0IHdpcmQgb2RlciBuaWNodCwga2FubiBtaXQgZGVtIFNjaGzDvHNzZWwgIkdydXBwZSIgdW5kICJJbmhhbHQiIHdpZSB6LkIuICgicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiKSBlcnJlaWNodCB3ZXJkZW4uIFVtIE1lbsO8ZWludHLDpGdlIHp1IGdydXBwaWVyZW4sIHZlcndlbmRlbiBTaWUgZGVuIFNjaGzDvHNzZWwgIkNsdXN0ZXJOYW1lIiB1bmQgaW0gSW5oYWx0IGRlbiBOYW1lbiwgd2VsY2hlbiBTaWUgaW4gZGVyIEFuc2ljaHQgdmVyd2VuZGVuIG3DtmNodGVuLiBWZXJ3ZW5kZW4gU2llICJDbHVzdGVyUHJpb3JpdHkiIHVtIGRpZSBSZWloZW5mb2xnZSBpbiBkZXIgamV3ZWlsaWdlbiBHcnVwcGllcnVuZyB6dSBiZWVpbmZsdXNzZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICdMw7ZzdW5nc3plaXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdUcmFuc3BvcnRhdXN3YWhsIGbDvHIgVGVybWluYmVuYWNocmljaHRpZ3VuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ1N0w7bDn3QgZGFzIEhpbnp1ZsO8Z2VuIG9kZXIgQWt0dWFsaXNpZXJlbiB2b24gYXV0b21hdGlzY2hlbiBUZXJtaW5lbiBhbiwgYmFzaWVyZW5kIGF1ZiBUaWNrZXR6ZWl0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAnQWt0dWFsaXNpZXJ1bmdzemVpdCc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0NPX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIE5vdGlmaWNhY2lvbmVzIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIGxhcyBub3RpZmljYWNpb25lcyBkZSBsYXMgY2l0YXMgYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBjb21vIGxvcyBleHBvcnRhZG9zIHBvciBlbCBtw7NkdWxvIGRlIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0FxdcOtIGVzIHBvc2libGUgZWxlZ2lyIGxvcyBldmVudG9zIHF1ZSBpbmljaWFyw6FuIGVzdGEgbm90aWZpY2FjacOzbi4gVW4gZmlsdHJvIGFkaWNpb25hbCBkZSBsYSBjaXRhIHNlIHB1ZWRlIGFwbGljYXIgYSBjb250aW51YWNpw7NuIHBhcmEgZW52aWFyIHPDs2xvIHBhcmEgY2l0YXMgY29uIGNpZXJ0b3MgY3JpdGVyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdGaWx0cm8gZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0VxdWlwbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1JlY3Vyc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdOb3RpZmljYXIgYWwgdXN1YXJpbyBzb2xvIHVuYSB2ZXogYWwgZMOtYSBhY2VyY2EgZGUgdW5hIHNvbGEgY2l0YSB1c2FuZG8gZWwgdHJhbnNwb3J0ZSBzZWxlY2Npb25hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnTGFzIG5vdGlmaWNhY2lvbmVzIHNlIGVudsOtYW4gYSB1biBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdQYXJhIG9idGVuZXIgbG9zIHByaW1lcm9zIDIwIGNhcmFjdGVyZXMgZGVsIHTDrXR1bG8gZGUgbGEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ1BhcmEgb2J0ZW5lciBlbCBhdHJpYnV0byBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlbCBjYWxlbmRhcmlvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgbGEgQWdlbmRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdHZXN0aW9uYXIgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnQ29sb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdGZWNoYSBkZSB0w6lybWlubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdSZXBldGljacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICdObyBzZSBlbmNvbnRyYXJvbiBjYWxlbmRhcmlvLiBQb3IgZmF2b3IgcHJpbWVybyBhw7FhZGEgdW4gY2FsZW5kYXJpbyB1dGlsaXphZG8gbGEgcGFnaW5hIGRlIEdlc3Rpb25hciBDYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFc3RhIGVzIHVuYSBjaXRhIHJlcGV0aXRpdmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICdEZXNlYSBlZGl0YXIgc29sbyBlc3RhIG8gdG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ1RvZGFzIGxhcyBvY3VycmVuY2lhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ1NvbG8gZXN0YSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdSZXN1bWVuIGRlIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIHVuIENhbGVuZGFyaW8gbnVldm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnQcOxYWRpciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIHVuIGNhbGVuZGFyaW8gYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBwYXJhIHBvZGVyIHNlciBleHBvcnRhZG8gcG9yIGVsIG3Ds2R1bG8gZGUgZ2VzdGnDs24gZGUgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnQ2FyZ2FyIGNvbmZpZ3VyYWNpw7NuIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnSW1wb3J0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0ZpbHRybyBwYXJhIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ0RlcGVuZGllbmRvIGRlbCBjYW1wbyBkZSBncnVwbywgZWwgc2lzdGVtYSBwZXJtaXRlIGVsIGFjY2VzbyBhIHVzdWFyaW9zIGFsIGNhbGVuZGFyaW8gZGUgYWN1ZXJkbyBhIHN1cyBuaXZlbGVzIGRlIHBlcm1pc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1JPOiB1c3VhcmlvcyBxdWUgcHVlZGVuIHZlciB5IGV4cG9ydGFyIHRvZGFzIGxhcyBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ01vdmVyX0E6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gbW9kaWZpY2FyIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8sIHBlcm8gc2luIGNhbWJpYXIgbGEgc2VsZWNjacOzbiBkZSBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQ3JlYXI6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gY3JlYXIgeSBib3JyYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ1JXOiB1c3VhcmlvIHF1ZSBwdWVkZW4gZ2VzdGlvbmFyIGVsIGNhbGVuZGFyaW8gZW4gc8OtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnRGVzY2FyZ2FyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnQ29waWFyIFVSTCBww7pibGljYSBkZSBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdOb21icmUgZGVsIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnWWEgZXhpc3RlIHVuIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIG5vbWJyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBvIGRlIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdDaXRhcyBkZSBUaWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1JlZ2xhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ1VzZSBsYXMgb3BjaW9uZXMgbW9zdHJhZGFzIGFiYWpvIHBhcmEgYWNvcnRhciBsYXMgY2l0YXMgZGUgdGlja2V0cyBzZXLDoW4gY3JlYWRhcyBhdXRvbcOhdGljYW1lbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnUG9vciBmYXZvciBzZWxlY2Npb25lIHVuYSBmaWxhIHbDoWxpZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdBdHJpYnV0b3MgZGUgYsO6c3F1ZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnRGVmaW5lIHJlZ2xhcyBwYXJhIGNyZWFjacOzbiBkZSBjaXRhcyBhdXRvbcOhdGljYXMgZW4gZXN0ZSBjYWxlbmRhcmlvIGJhc2FkYXMgZW4gbG9zIGRhdG9zIGRlIGxvcyB0aWNrZXRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ0HDsWFkaXIgcmVnbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ03DoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ01lbm9zJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0HDsWFkaXIgbnVldmEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICdDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnRGVtYXNpYWRvcyBjYWxlbmRhcmlvcyBhY3Rpdm9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJ1BvciBmYXZvciBkZXNhY3RpdmUgYWxndW5vcyBwcmltZXJvIG8gaW5jcmVtZW50ZSBlbCBsw61taXRlIGVuIGxhIGNvbmZpZ3VyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdTZW1hbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICdMw61uZWEgZGUgdGllbXBvIE1lbnN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gU2VtYW5hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICdMw61uZWEgZGUgdGllbXBvIERpYXJpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAnU2FsdGFyIGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ0Rlc2NhcnRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAnTW9zdHJhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWFjacOzbiBiw6FzaWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGUvVGltZSd9ID0gJ0ZlY2hhL0hvcmEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ1BvciBmYXZvciBmaWplIGVzdGUgdmFsb3IgYW50ZXMgZGUgbGEgZmVjaGEgZGUgdMOpcm1pbm8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ1BvciBmYXZvciBmaWplIGVzdGUgdmFsb3IgZGVzcHXDqXMgZGUgbGEgZmVjaGEgZGUgaW5pY2lvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICdFc3RhIGVzIHVuYSBvY3VycmVuY2lhIGRlIHVuYSBjaXRhIHJlcGV0aXRpdmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnUHJlY2lvbmUgYXF1w60gIHBhcmEgdmVyIGxhIGNpdGEgcGFkcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ1ByZWNpb25lIGFxdcOtICBwYXJhIGVkaXRhciBsYSBjaXRhIHBhZHJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVjdWVuY2lhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnQ2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUHVudG8gZGUgdGllbXBvIHJlbGF0aXZvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICfCv0VzdMOhIHNlZ3VybyBkZSBxdWUgZGVzZWEgZWxpbWluYXIgZXN0YSBjaXRhPyBFc3RhIG9wZXJhY2nDs24gbm8gc2UgcHVlZGUgZGVzaGFjZXIuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdJbXBvcnRhciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnRWwgYXJjaGl2byBjYXJnYWRvIHRpZW5lIHF1ZSBlc3RhciBlbiB1biBmb3JtYXRvIGlDYWwgdsOhbGlkbyAoLmljcyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnU2kgZWwgQ2FsZW5kYXJpbyBkZXNlYWRvIG5vIGFwYXJlY2UgZW4gbGEgbGlzdGEsIHBvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSB0ZW5nYSBhbCBtZW5vcyBlbCBwZXJtaXNvIGRlICJjcmVhciInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICfCv0FjdHVhbGl6YXIgbGFzIGNpdGFzIGV4aXN0ZW50ZXM/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnVG9kYXMgbGFzIGNpdGFzIGV4aXN0ZW50ZXMgZW4gZWwgY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gVW5pcXVlSUQgc2Ugc29icmVzY3JpYmlyw6FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0NhcmdhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBjaXRhcyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOdWV2YSBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdQcm9udG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBkw61hcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICdFbCBub21icmUgZGUgbGEgbm90aWZpY2FjacOzbiB5YSBleGlzdGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBZ2VudGVzIChyZWN1cnNvcyksIHF1ZSBwdWVkZW4gc2VyIHNlbGVjY2lvbmFkb3MgZGVudHJvIGRlIHVuYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FnZW50ZXMgY29uIChhbCBtZW5vcykgcGVybWlzb3MgZGUgbGVjdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3MgbG9zIGFnZW50ZXMgY29uIHBlcm1pc29zIGRlIGVzY3JpdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdFbCBzaXN0ZW1hIG5vIHB1ZG8gY3JlYXIgZWwgQ2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdObyBzZSB0aWVuZSBlbCBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdObyB0aWVuZSBhY2Nlc28gYSBlc3RlIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdFZGl0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnRXJyb3IgYWwgYWN0dWFsaXplciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnTm8gc2UgcHVlZGUgbGVlciBlbCBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIGRlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdQb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgZWwgYXJjaGl2byBlcyB2w6FsaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdObyBzZSBwdWVkZSBpbXBvcnRhciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdDYWxlbmRhcmlvIGltcG9ydGFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ1NlIG5lY2VzaXRhIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnTm90IHNlIHB1ZWRlbiBvYnRlbmVyIGxvcyBkYXRvcyBwYXJhIGVsIENhbGVuZGFySUQgZXNwZWNpZmljYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdTZSBoYW4gaW1wb3J0YWRvICVzIGNpdGEocykgYWwgY2FsZW5kYXJpbyAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IG1pbnV0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgbWludXRvcyAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgaG9yYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdUb2RhcyBsYXMgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnQ2l0YXMgYXNpZ25hZGFzIGEgbcOtICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAnTW9zdHJhbmRvIHNvbG8gY2l0YXMgYXNpZ25hZGFzIGEgdMOtISBDYW1iaWFyIGNvbmZpZ3VyYWNpw7NuJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ0xhIGNpdGEgbm8gZnVlIGVuY29udHJhZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTnVuY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnQ2FkYSBEw61hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdDYWRhIFNlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ0NhZGEgTWVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdDYWRhIEHDsW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnUGVyc29uYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RpYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNZW5zdWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ0FudWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnY2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ3BvciAlcyB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdoYXN0YSAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAncG9yIC4uLiB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ2hhc3RhICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ1NpbiBub3RpZmljYWNpb25lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgbWludXRvKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMgaG9yYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZMOtYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHNlbWFuYXMgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdhbnRlcyBkZSBxdWUgbGEgY2l0YSBpbmljaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdkZXNwdcOpcyBkZSBxdWUgbGEgY2l0YSBoYWxsYSBpbmljaWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICdhbnRlcyBkZSBxdWUgdGVybWluZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2Rlc3B1w6lzIGRlIHF1ZSBsYSBjaXRhIGhhbGxhIGZpbmFsaXphZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICdObyB0aWVuZSBwZXJtaXNvcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnTGEgY2l0YSBubyBwdWVkZSBzZXIgYm9ycmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnTm8gdGllbmUgcGVybWlzb3MhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ05vIHRpZW5lIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ0VsIHNpc3RlbWEgbm8gcHVkbyBpbXBvcnRhciBlbCBhcmNoaXZvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCBtw6FzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnTm8gc2UgdGllbmUgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdObyBleGlzdGUgZWwgdXN1YXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdDYWxlbmRhcmlvIGludsOhbGlkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICdVUkwgaW52w6FsaWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdTZSBwcm9kdWpvIHVuIGVycm9yIGFsIGV4cG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnQWN0dWFsaXphdGlvbiAobWludXRvcyknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ1DDoWdpbmEgZGUgcmVzdW1lbiBkZWwgQ2FsZW5kYXJpbyBkZSBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnTm90aWZpY2FjaW9uZXMgZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvcyBkZWwgY2FsZW5kYXJpbyBkZSBjaXRhcyBxdWUgcHJlcGFyYSBlbnRyYWRhcyBwYXJhIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG9zIGRlIGNhbGVuZGFyaW8gcXVlIGFjdHVhbGl6YSBsb3MgZGF0b3MgZGVsIHRpY2tldCBkZXNkZSB1bmEgY2l0YSBkZSB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGVkaWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnTGlzdGEgZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdMaXN0YSBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ05vdGlmaWNhY2lvbmVzIGRlIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ0NpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgZ2VzdGnDs24gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnRWxpamEgZWwgdGlwbyBkZSBjYW1iaW9zIGVuIGxhcyBjaXRhcyBwYXIgbGFzIGN1YWxlcyBkZXNlYSByZWNpYmlyIG5vdGlmaWNhY2lvbmVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAnQ3JlYXIgdW5hIG51ZXZhIGNpdGEgZGUgY2FsZW5kYXJpbyB2aW5jdWxhZGEgYSBlc3RlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ0NyZWFyIHkgZ2VzdGlvbmFyIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0NyZWFyIG51ZXZhIGNpdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnRGVmaW5lIGN1YWxlcyBjb2x1bW5hcyBzZXLDoW4gbW9zdHJhZGFzIGVuIHdpZGdldCBkZSBjaXRhcyB2aW5jdWxhZGFzIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGVqYSIpLiBQb3NpYmxlcyBhanVzdGVzOiAwID0gRGVzaGFiaXRhZGEsIDEgPSBIYWJpbGl0YWRhLCAyID0gSGFiaWxpdGFkYSBwb3Igb21pc2nDs24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluZSB1biBpY29ubyBkZSB2w61uY3VsbyBhIGxhIHBhZ2luYSBkZSBnb29nbGUgbWFwIGRlIGxhIHViaWNhY2nDs24gYWN0dWFsIGVuIGxhIHBhbnRhbGxhIGRlIGVkaWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ0RlZmluZSBsb3MgdGlwb3MgZGUgb2JqZXRvIGRlIGV2ZW50byBxdWUgc2UgbWFuZWphbiBhIHRyYXbDqXMgZGVsIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdEZWZpbmUgbGEgbGlzdGEgZGUgcGFyw6FtZXRyb3MgcXVlIHB1ZWRlbiBzZXIgZW52aWFkb3MgYSBsYSBmdW5jacOzbiBkZSBiw7pzcXVlZGEgZGUgdGlja2V0cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBjYW1wb3MgZGluw6FtaWNvcyBkZSB0aWNrZXQgZGUgdGlwbyBmZWNoYSB5IGhvcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGVsIHRpZW1wbyBkZSBlc2NhbGFtaWVudG8gZGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBlbCB0aWVtcG8gZGUgZXNwZXJhIGRlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnRGVmaW5lIGVsIHBsdWdpbiBkZSB0aWNrZXQgcGFyYSBsYXMgY2l0YXMgZGUgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnQ2FtcG9EaW7DoW1pY29fJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VkaXRhciBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdUaWVtcG8gZGUgcHJpbWVyYSByZXNwdWVzdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgaW1wb3J0YWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdWaW5jdWxhciBjaXRhcyB5IHRpY2tldHMgY29uIGVsIHRpcG8gZGUgdsOtbmN1bG8gIk5vcm1hbCIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBsb3MgZXZlbnRvcyBkZSBjaXRhcyBxdWUgc29uIGRlc3BsZWdhb3MgZW4gbGEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3MgbG9zIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBxdWUgc29uIGRlc3BsZWdhZG9zIGVuIGxhIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdMaXN0YSBkZSBjb2xvcmVzIGVuIGhleGFkZWNpbWFsIFJHQiBxdWUgZXN0YXLDoW4gZGlzcG9uaWJsZXMgcGFyYSBzdSBzZWxlY2Npw7NuIGR1cmFudGUgbGEgY3JlYWNpw7NuIGRlIGNhbGVuZGFyaW9zLiBBc2Vnw7pyZXNlIHF1ZSBsb3MgY29sb3JlcyBzZWFuIHN1ZmljaWVudGVtZW50ZSBvYnNjdXJvcyBwYXJhIHF1ZSBlbCB0ZXh0byBiYW5jbyBzZSB2ZWEgY29ycmVjdGFtZW50ZSBzb2JyZSBlbGxvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnR2VzdGlvbmFyIGRpZmVyZW50ZXMgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnTnVtZXJvIG3DoXhpbW8gZGUgY2FsZW5kYXJpb3MgYWN0aXZvcyBlbiBsYXMgcGFudGFsbGFzIGRlIHJlc3VtZW4uIFBvciBmYXZvciBub3RlIHF1ZSB1biBudW1lcm8gZ3JhbmRlIGRlIGNhbGVuZGFyaW9zIGFjdGl2b3MgcHVlZGUgdGVuZXIgdW4gaW1wYWN0byBuZWdhdGl2byBlbiBlbCBkZXNlbXBlw7FvIGRlbCBzZXJ2aWRvciBkZWJpZG8gYSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBsbGFtYWRhcyBzaW11bHTDoW5lYXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ09UUlMgbm8gYWRtaXRlIGNpdGFzIHJlY3VycmVudGVzIHNpbiBmZWNoYSBkZSBmaW5hbGl6YWNpw7NuIG8gc2luIG7Dum1lcm8gZGUgaXRlcmFjaW9uZXMuIER1cmFudGUgZWwgcHJvY2VzbyBkZSBpbXBvcnRhY2nDs24sIHB1ZWRlIG9jdXJyaXIgcXVlIGVsIGFyY2hpdm8gSUNTIGNvbnRlbmdhIGRpY2hhcyBjaXRhcy4gRW4gc3UgbHVnYXIsIGVsIHNpc3RlbWEgY3JlYSB0b2RhcyBsYXMgY2l0YXMgZW4gZWwgcGFzYWRvLCBhZGVtw6FzIGRlIGNpdGFzIHBhcmEgbG9zIHByw7N4aW1vcyBuIG1lc2VzICgxMjAgbWVzZXMgLyAxMCBhw7FvcyBwb3IgZGVmZWN0bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnUmVzdW1lbiBkZSB0b2RhcyBsYXMgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVGllbXBvIGRlIGVzcGVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnQsO6c3F1ZWRhIGRlIHBsdWctaW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnTcOzZHVsbyBQbHVnLWluIGRlIGLDunNxdWVkYSBwYXJhIGF1dG8tY29tcGxldGFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdDYWxlbmRhcmlvIFDDunBsaWNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdDYWxlbmRhcmlvIHDDumJsaWNvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgUmVjdXJzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUmVzdW1lbiBkZSBSZWN1cnNvcyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnTXVlc3RyYSB1biB2w61uY3VsbyBlbiBlbCBtZW7DuiBwYXJhIGNyZWFyIHVuYSBjaXRhIGRlIGNhbGVuZGFyaW8gdmluY3VsYWRhIGFsIHRpY2tldCBkaXJlY3RvIGRlc2RlICBsYSB2aXN0YSBkZSBkZXRhbGxlIGRlIHRpY2tldCBkZSBsYSBpbnRlcmZhY2UgZGVsIGFnZW50ZS4gQWRpY2lvbmFsbWVudGUgc2UgcHVlZGUgaGFjZXIgaW4gY29udHJvbCBkZSBhY2Nlc28gcGFyYSBtb3N0cmFyIG8gbm8gZXN0ZSB2w61uY3VsbyB1c2FuZG8gbGEgQ2xhdmUgIkdyb3VwIiB5IGVsIENvbnRlbmlkbyBjb21vICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFBhcmEgYWdydXBhciBlbGVtZW50byBkZWwgbWVuw7ogdXNlIGxhIENsYXZlICJDbHVzdGVyTmFtZSIgcGFyYSBlbCBDb250ZW5pZG8gY3VhbHF1aWVyIG5vbWJyZSBxdWUgZGVzZWUgdmVyIGVuIGxhIGludGVyZmFjZSBkZWwgdXN1YXJpby4gVXRpbGl6ZSAiQ2x1c3RlclByaW9yaXR5IiBwYXJhIGNvbmZpZ3VyYXIgZWwgb3JkZW4gZGUgdW4gY2llcnRvIGdydXBvIGRlbnRybyBkZSBsYSBiYXJyYSBkZSBoZXJyYW1pZW50YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICdUaWVtcG8gZGUgU29sdWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnU2VsZWN0aW9uIGRlIHRyYW5zcG9ydGUgcGFyYSBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnRGlzcGFyYSBsYSBhY2Npw7NuIGRlIGHDsWFkaXIgbyBhY3R1YWxpemFyIGNpdGFzIGF1dG9tw6F0aWNhcyBkZSBjYWxlbmRhcmlvcyBiYXNhZGFzIGVuIGNpZXJ0b3MgdGllbXBvcyBkZSB0aWNrZXRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ1RpZW1wbyBkZSBBY3R1YWxpemFjacOzbic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX01YX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIE5vdGlmaWNhY2lvbmVzIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIGxhcyBub3RpZmljYWNpb25lcyBkZSBsYXMgY2l0YXMgYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBjb21vIGxvcyBleHBvcnRhZG9zIHBvciBlbCBtw7NkdWxvIGRlIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0FxdcOtIGVzIHBvc2libGUgZWxlZ2lyIGxvcyBldmVudG9zIHF1ZSBpbmljaWFyw6FuIGVzdGEgbm90aWZpY2FjacOzbi4gVW4gZmlsdHJvIGFkaWNpb25hbCBkZSBsYSBjaXRhIHNlIHB1ZWRlIGFwbGljYXIgYSBjb250aW51YWNpw7NuIHBhcmEgZW52aWFyIHPDs2xvIHBhcmEgY2l0YXMgY29uIGNpZXJ0b3MgY3JpdGVyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdGaWx0cm8gZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0VxdWlwbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1JlY3Vyc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdOb3RpZmljYXIgYWwgdXN1YXJpbyBzb2xvIHVuYSB2ZXogYWwgZMOtYSBhY2VyY2EgZGUgdW5hIHNvbGEgY2l0YSB1c2FuZG8gZWwgdHJhbnNwb3J0ZSBzZWxlY2Npb25hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnTGFzIG5vdGlmaWNhY2lvbmVzIHNlIGVudsOtYW4gYSB1biBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdQYXJhIG9idGVuZXIgbG9zIHByaW1lcm9zIDIwIGNhcmFjdGVyZXMgZGVsIHTDrXR1bG8gZGUgbGEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ1BhcmEgb2J0ZW5lciBlbCBhdHJpYnV0byBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlbCBjYWxlbmRhcmlvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgbGEgQWdlbmRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdHZXN0aW9uYXIgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnQ29sb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdGZWNoYSBkZSB0w6lybWlubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdSZXBldGljacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICdObyBzZSBlbmNvbnRyYXJvbiBjYWxlbmRhcmlvLiBQb3IgZmF2b3IgcHJpbWVybyBhw7FhZGEgdW4gY2FsZW5kYXJpbyB1dGlsaXphZG8gbGEgcGFnaW5hIGRlIEdlc3Rpb25hciBDYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFc3RhIGVzIHVuYSBjaXRhIHJlcGV0aXRpdmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICdEZXNlYSBlZGl0YXIgc29sbyBlc3RhIG8gdG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ1RvZGFzIGxhcyBvY3VycmVuY2lhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ1NvbG8gZXN0YSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdSZXN1bWVuIGRlIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIHVuIENhbGVuZGFyaW8gbnVldm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnQcOxYWRpciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIHVuIGNhbGVuZGFyaW8gYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBwYXJhIHBvZGVyIHNlciBleHBvcnRhZG8gcG9yIGVsIG3Ds2R1bG8gZGUgZ2VzdGnDs24gZGUgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnQ2FyZ2FyIGNvbmZpZ3VyYWNpw7NuIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnSW1wb3J0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0ZpbHRybyBwYXJhIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ0RlcGVuZGllbmRvIGRlbCBjYW1wbyBkZSBncnVwbywgZWwgc2lzdGVtYSBwZXJtaXRlIGVsIGFjY2VzbyBhIHVzdWFyaW9zIGFsIGNhbGVuZGFyaW8gZGUgYWN1ZXJkbyBhIHN1cyBuaXZlbGVzIGRlIHBlcm1pc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1JPOiB1c3VhcmlvcyBxdWUgcHVlZGVuIHZlciB5IGV4cG9ydGFyIHRvZGFzIGxhcyBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ01vdmVyX0E6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gbW9kaWZpY2FyIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8sIHBlcm8gc2luIGNhbWJpYXIgbGEgc2VsZWNjacOzbiBkZSBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQ3JlYXI6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gY3JlYXIgeSBib3JyYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ1JXOiB1c3VhcmlvIHF1ZSBwdWVkZW4gZ2VzdGlvbmFyIGVsIGNhbGVuZGFyaW8gZW4gc8OtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnRGVzY2FyZ2FyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnQ29waWFyIFVSTCBww7pibGljYSBkZSBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdOb21icmUgZGVsIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnWWEgZXhpc3RlIHVuIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIG5vbWJyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBvIGRlIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdDaXRhcyBkZSBUaWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1JlZ2xhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ1VzZSBsYXMgb3BjaW9uZXMgbW9zdHJhZGFzIGFiYWpvIHBhcmEgYWNvcnRhciBsYXMgY2l0YXMgZGUgdGlja2V0cyBzZXLDoW4gY3JlYWRhcyBhdXRvbcOhdGljYW1lbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnUG9vciBmYXZvciBzZWxlY2Npb25lIHVuYSBmaWxhIHbDoWxpZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdBdHJpYnV0b3MgZGUgYsO6c3F1ZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnRGVmaW5lIHJlZ2xhcyBwYXJhIGNyZWFjacOzbiBkZSBjaXRhcyBhdXRvbcOhdGljYXMgZW4gZXN0ZSBjYWxlbmRhcmlvIGJhc2FkYXMgZW4gbG9zIGRhdG9zIGRlIGxvcyB0aWNrZXRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ0HDsWFkaXIgcmVnbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ03DoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ01lbm9zJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0HDsWFkaXIgbnVldmEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICdDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnRGVtYXNpYWRvcyBjYWxlbmRhcmlvcyBhY3Rpdm9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJ1BvciBmYXZvciBkZXNhY3RpdmUgYWxndW5vcyBwcmltZXJvIG8gaW5jcmVtZW50ZSBlbCBsw61taXRlIGVuIGxhIGNvbmZpZ3VyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdTZW1hbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICdMw61uZWEgZGUgdGllbXBvIE1lbnN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gU2VtYW5hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICdMw61uZWEgZGUgdGllbXBvIERpYXJpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAnU2FsdGFyIGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ0Rlc2NhcnRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAnTW9zdHJhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWFjacOzbiBiw6FzaWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGUvVGltZSd9ID0gJ0ZlY2hhL0hvcmEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ1BvciBmYXZvciBmaWplIGVzdGUgdmFsb3IgYW50ZXMgZGUgbGEgZmVjaGEgZGUgdMOpcm1pbm8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ1BvciBmYXZvciBmaWplIGVzdGUgdmFsb3IgZGVzcHXDqXMgZGUgbGEgZmVjaGEgZGUgaW5pY2lvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICdFc3RhIGVzIHVuYSBvY3VycmVuY2lhIGRlIHVuYSBjaXRhIHJlcGV0aXRpdmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnUHJlY2lvbmUgYXF1w60gIHBhcmEgdmVyIGxhIGNpdGEgcGFkcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ1ByZWNpb25lIGFxdcOtICBwYXJhIGVkaXRhciBsYSBjaXRhIHBhZHJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVjdWVuY2lhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnQ2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUHVudG8gZGUgdGllbXBvIHJlbGF0aXZvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICfCv0VzdMOhIHNlZ3VybyBkZSBxdWUgZGVzZWEgZWxpbWluYXIgZXN0YSBjaXRhPyBFc3RhIG9wZXJhY2nDs24gbm8gc2UgcHVlZGUgZGVzaGFjZXIuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdJbXBvcnRhciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnRWwgYXJjaGl2byBjYXJnYWRvIHRpZW5lIHF1ZSBlc3RhciBlbiB1biBmb3JtYXRvIGlDYWwgdsOhbGlkbyAoLmljcyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnU2kgZWwgQ2FsZW5kYXJpbyBkZXNlYWRvIG5vIGFwYXJlY2UgZW4gbGEgbGlzdGEsIHBvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSB0ZW5nYSBhbCBtZW5vcyBlbCBwZXJtaXNvIGRlICJjcmVhciInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICfCv0FjdHVhbGl6YXIgbGFzIGNpdGFzIGV4aXN0ZW50ZXM/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnVG9kYXMgbGFzIGNpdGFzIGV4aXN0ZW50ZXMgZW4gZWwgY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gVW5pcXVlSUQgc2Ugc29icmVzY3JpYmlyw6FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0NhcmdhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBjaXRhcyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOdWV2YSBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdQcm9udG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBkw61hcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICdFbCBub21icmUgZGUgbGEgbm90aWZpY2FjacOzbiB5YSBleGlzdGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBZ2VudGVzIChyZWN1cnNvcyksIHF1ZSBwdWVkZW4gc2VyIHNlbGVjY2lvbmFkb3MgZGVudHJvIGRlIHVuYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FnZW50ZXMgY29uIChhbCBtZW5vcykgcGVybWlzb3MgZGUgbGVjdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3MgbG9zIGFnZW50ZXMgY29uIHBlcm1pc29zIGRlIGVzY3JpdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdFbCBzaXN0ZW1hIG5vIHB1ZG8gY3JlYXIgZWwgQ2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdObyBzZSB0aWVuZSBlbCBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdObyB0aWVuZSBhY2Nlc28gYSBlc3RlIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdFZGl0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnRXJyb3IgYWwgYWN0dWFsaXplciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnTm8gc2UgcHVlZGUgbGVlciBlbCBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIGRlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdQb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgZWwgYXJjaGl2byBlcyB2w6FsaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdObyBzZSBwdWVkZSBpbXBvcnRhciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdDYWxlbmRhcmlvIGltcG9ydGFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ1NlIG5lY2VzaXRhIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnTm90IHNlIHB1ZWRlbiBvYnRlbmVyIGxvcyBkYXRvcyBwYXJhIGVsIENhbGVuZGFySUQgZXNwZWNpZmljYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdTZSBoYW4gaW1wb3J0YWRvICVzIGNpdGEocykgYWwgY2FsZW5kYXJpbyAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IG1pbnV0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgbWludXRvcyAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgaG9yYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdUb2RhcyBsYXMgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnQ2l0YXMgYXNpZ25hZGFzIGEgbcOtICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAnTW9zdHJhbmRvIHNvbG8gY2l0YXMgYXNpZ25hZGFzIGEgdMOtISBDYW1iaWFyIGNvbmZpZ3VyYWNpw7NuJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ0xhIGNpdGEgbm8gZnVlIGVuY29udHJhZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTnVuY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnQ2FkYSBEw61hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdDYWRhIFNlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ0NhZGEgTWVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdDYWRhIEHDsW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnUGVyc29uYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RpYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNZW5zdWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ0FudWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnY2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ3BvciAlcyB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdoYXN0YSAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAncG9yIC4uLiB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ2hhc3RhICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ1NpbiBub3RpZmljYWNpb25lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgbWludXRvKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMgaG9yYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZMOtYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHNlbWFuYXMgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdhbnRlcyBkZSBxdWUgbGEgY2l0YSBpbmljaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdkZXNwdcOpcyBkZSBxdWUgbGEgY2l0YSBoYWxsYSBpbmljaWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICdhbnRlcyBkZSBxdWUgdGVybWluZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2Rlc3B1w6lzIGRlIHF1ZSBsYSBjaXRhIGhhbGxhIGZpbmFsaXphZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICdObyB0aWVuZSBwZXJtaXNvcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnTGEgY2l0YSBubyBwdWVkZSBzZXIgYm9ycmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnTm8gdGllbmUgcGVybWlzb3MhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ05vIHRpZW5lIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ0VsIHNpc3RlbWEgbm8gcHVkbyBpbXBvcnRhciBlbCBhcmNoaXZvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCBtw6FzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnTm8gc2UgdGllbmUgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdObyBleGlzdGUgZWwgdXN1YXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdDYWxlbmRhcmlvIGludsOhbGlkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICdVUkwgaW52w6FsaWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdTZSBwcm9kdWpvIHVuIGVycm9yIGFsIGV4cG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnQWN0dWFsaXphdGlvbiAobWludXRvcyknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ1DDoWdpbmEgZGUgcmVzdW1lbiBkZWwgQ2FsZW5kYXJpbyBkZSBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnTm90aWZpY2FjaW9uZXMgZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvcyBkZWwgY2FsZW5kYXJpbyBkZSBjaXRhcyBxdWUgcHJlcGFyYSBlbnRyYWRhcyBwYXJhIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG9zIGRlIGNhbGVuZGFyaW8gcXVlIGFjdHVhbGl6YSBsb3MgZGF0b3MgZGVsIHRpY2tldCBkZXNkZSB1bmEgY2l0YSBkZSB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGVkaWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnTGlzdGEgZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdMaXN0YSBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ05vdGlmaWNhY2lvbmVzIGRlIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ0NpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgZ2VzdGnDs24gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnRWxpamEgZWwgdGlwbyBkZSBjYW1iaW9zIGVuIGxhcyBjaXRhcyBwYXIgbGFzIGN1YWxlcyBkZXNlYSByZWNpYmlyIG5vdGlmaWNhY2lvbmVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAnQ3JlYXIgdW5hIG51ZXZhIGNpdGEgZGUgY2FsZW5kYXJpbyB2aW5jdWxhZGEgYSBlc3RlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ0NyZWFyIHkgZ2VzdGlvbmFyIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0NyZWFyIG51ZXZhIGNpdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnRGVmaW5lIGN1YWxlcyBjb2x1bW5hcyBzZXLDoW4gbW9zdHJhZGFzIGVuIHdpZGdldCBkZSBjaXRhcyB2aW5jdWxhZGFzIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGVqYSIpLiBQb3NpYmxlcyBhanVzdGVzOiAwID0gRGVzaGFiaXRhZGEsIDEgPSBIYWJpbGl0YWRhLCAyID0gSGFiaWxpdGFkYSBwb3Igb21pc2nDs24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluZSB1biBpY29ubyBkZSB2w61uY3VsbyBhIGxhIHBhZ2luYSBkZSBnb29nbGUgbWFwIGRlIGxhIHViaWNhY2nDs24gYWN0dWFsIGVuIGxhIHBhbnRhbGxhIGRlIGVkaWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ0RlZmluZSBsb3MgdGlwb3MgZGUgb2JqZXRvIGRlIGV2ZW50byBxdWUgc2UgbWFuZWphbiBhIHRyYXbDqXMgZGVsIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdEZWZpbmUgbGEgbGlzdGEgZGUgcGFyw6FtZXRyb3MgcXVlIHB1ZWRlbiBzZXIgZW52aWFkb3MgYSBsYSBmdW5jacOzbiBkZSBiw7pzcXVlZGEgZGUgdGlja2V0cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBjYW1wb3MgZGluw6FtaWNvcyBkZSB0aWNrZXQgZGUgdGlwbyBmZWNoYSB5IGhvcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGVsIHRpZW1wbyBkZSBlc2NhbGFtaWVudG8gZGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBlbCB0aWVtcG8gZGUgZXNwZXJhIGRlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnRGVmaW5lIGVsIHBsdWdpbiBkZSB0aWNrZXQgcGFyYSBsYXMgY2l0YXMgZGUgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnQ2FtcG9EaW7DoW1pY29fJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VkaXRhciBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdUaWVtcG8gZGUgcHJpbWVyYSByZXNwdWVzdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgaW1wb3J0YWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdWaW5jdWxhciBjaXRhcyB5IHRpY2tldHMgY29uIGVsIHRpcG8gZGUgdsOtbmN1bG8gIk5vcm1hbCIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBsb3MgZXZlbnRvcyBkZSBjaXRhcyBxdWUgc29uIGRlc3BsZWdhb3MgZW4gbGEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3MgbG9zIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBxdWUgc29uIGRlc3BsZWdhZG9zIGVuIGxhIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdMaXN0YSBkZSBjb2xvcmVzIGVuIGhleGFkZWNpbWFsIFJHQiBxdWUgZXN0YXLDoW4gZGlzcG9uaWJsZXMgcGFyYSBzdSBzZWxlY2Npw7NuIGR1cmFudGUgbGEgY3JlYWNpw7NuIGRlIGNhbGVuZGFyaW9zLiBBc2Vnw7pyZXNlIHF1ZSBsb3MgY29sb3JlcyBzZWFuIHN1ZmljaWVudGVtZW50ZSBvYnNjdXJvcyBwYXJhIHF1ZSBlbCB0ZXh0byBiYW5jbyBzZSB2ZWEgY29ycmVjdGFtZW50ZSBzb2JyZSBlbGxvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnR2VzdGlvbmFyIGRpZmVyZW50ZXMgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnTnVtZXJvIG3DoXhpbW8gZGUgY2FsZW5kYXJpb3MgYWN0aXZvcyBlbiBsYXMgcGFudGFsbGFzIGRlIHJlc3VtZW4uIFBvciBmYXZvciBub3RlIHF1ZSB1biBudW1lcm8gZ3JhbmRlIGRlIGNhbGVuZGFyaW9zIGFjdGl2b3MgcHVlZGUgdGVuZXIgdW4gaW1wYWN0byBuZWdhdGl2byBlbiBlbCBkZXNlbXBlw7FvIGRlbCBzZXJ2aWRvciBkZWJpZG8gYSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBsbGFtYWRhcyBzaW11bHTDoW5lYXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ09UUlMgbm8gYWRtaXRlIGNpdGFzIHJlY3VycmVudGVzIHNpbiBmZWNoYSBkZSBmaW5hbGl6YWNpw7NuIG8gc2luIG7Dum1lcm8gZGUgaXRlcmFjaW9uZXMuIER1cmFudGUgZWwgcHJvY2VzbyBkZSBpbXBvcnRhY2nDs24sIHB1ZWRlIG9jdXJyaXIgcXVlIGVsIGFyY2hpdm8gSUNTIGNvbnRlbmdhIGRpY2hhcyBjaXRhcy4gRW4gc3UgbHVnYXIsIGVsIHNpc3RlbWEgY3JlYSB0b2RhcyBsYXMgY2l0YXMgZW4gZWwgcGFzYWRvLCBhZGVtw6FzIGRlIGNpdGFzIHBhcmEgbG9zIHByw7N4aW1vcyBuIG1lc2VzICgxMjAgbWVzZXMgLyAxMCBhw7FvcyBwb3IgZGVmZWN0bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnUmVzdW1lbiBkZSB0b2RhcyBsYXMgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVGllbXBvIGRlIGVzcGVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnQsO6c3F1ZWRhIGRlIHBsdWctaW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnTcOzZHVsbyBQbHVnLWluIGRlIGLDunNxdWVkYSBwYXJhIGF1dG8tY29tcGxldGFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdDYWxlbmRhcmlvIFDDunBsaWNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdDYWxlbmRhcmlvIHDDumJsaWNvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgUmVjdXJzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUmVzdW1lbiBkZSBSZWN1cnNvcyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnTXVlc3RyYSB1biB2w61uY3VsbyBlbiBlbCBtZW7DuiBwYXJhIGNyZWFyIHVuYSBjaXRhIGRlIGNhbGVuZGFyaW8gdmluY3VsYWRhIGFsIHRpY2tldCBkaXJlY3RvIGRlc2RlICBsYSB2aXN0YSBkZSBkZXRhbGxlIGRlIHRpY2tldCBkZSBsYSBpbnRlcmZhY2UgZGVsIGFnZW50ZS4gQWRpY2lvbmFsbWVudGUgc2UgcHVlZGUgaGFjZXIgaW4gY29udHJvbCBkZSBhY2Nlc28gcGFyYSBtb3N0cmFyIG8gbm8gZXN0ZSB2w61uY3VsbyB1c2FuZG8gbGEgQ2xhdmUgIkdyb3VwIiB5IGVsIENvbnRlbmlkbyBjb21vICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFBhcmEgYWdydXBhciBlbGVtZW50byBkZWwgbWVuw7ogdXNlIGxhIENsYXZlICJDbHVzdGVyTmFtZSIgcGFyYSBlbCBDb250ZW5pZG8gY3VhbHF1aWVyIG5vbWJyZSBxdWUgZGVzZWUgdmVyIGVuIGxhIGludGVyZmFjZSBkZWwgdXN1YXJpby4gVXRpbGl6ZSAiQ2x1c3RlclByaW9yaXR5IiBwYXJhIGNvbmZpZ3VyYXIgZWwgb3JkZW4gZGUgdW4gY2llcnRvIGdydXBvIGRlbnRybyBkZSBsYSBiYXJyYSBkZSBoZXJyYW1pZW50YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICdUaWVtcG8gZGUgU29sdWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnU2VsZWN0aW9uIGRlIHRyYW5zcG9ydGUgcGFyYSBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnRGlzcGFyYSBsYSBhY2Npw7NuIGRlIGHDsWFkaXIgbyBhY3R1YWxpemFyIGNpdGFzIGF1dG9tw6F0aWNhcyBkZSBjYWxlbmRhcmlvcyBiYXNhZGFzIGVuIGNpZXJ0b3MgdGllbXBvcyBkZSB0aWNrZXRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ1RpZW1wbyBkZSBBY3R1YWxpemFjacOzbic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdOb3RpZmljYWNpw7NuIGRlIHJlY29yZGF0b3JpbyBkZSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdSZWNpYmlyw6EgdW5hIG5vdGlmaWNhY2nDs24gY2FkYSB2ZXogcXVlIHNlIGFsY2FuY2UgbGEgaG9yYSBkZSB1biByZWNvcmRhdG9yaW8gcGFyYSB1bmEgZGUgc3VzIGNpdGFzLic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIE5vdGlmaWNhY2lvbmVzIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIGxhcyBub3RpZmljYWNpb25lcyBkZSBsYXMgY2l0YXMgYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBjb21vIGxvcyBleHBvcnRhZG9zIHBvciBlbCBtw7NkdWxvIGRlIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0FxdcOtIGVzIHBvc2libGUgZWxlZ2lyIGxvcyBldmVudG9zIHF1ZSBpbmljaWFyw6FuIGVzdGEgbm90aWZpY2FjacOzbi4gVW4gZmlsdHJvIGFkaWNpb25hbCBkZSBsYSBjaXRhIHNlIHB1ZWRlIGFwbGljYXIgYSBjb250aW51YWNpw7NuIHBhcmEgZW52aWFyIHPDs2xvIHBhcmEgY2l0YXMgY29uIGNpZXJ0b3MgY3JpdGVyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdGaWx0cm8gZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0VxdWlwbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1JlY3Vyc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdOb3RpZmljYXIgYWwgdXN1YXJpbyBzb2xvIHVuYSB2ZXogYWwgZMOtYSBhY2VyY2EgZGUgdW5hIHNvbGEgY2l0YSB1c2FuZG8gZWwgdHJhbnNwb3J0ZSBzZWxlY2Npb25hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnTGFzIG5vdGlmaWNhY2lvbmVzIHNlIGVudsOtYW4gYSB1biBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdQYXJhIG9idGVuZXIgbG9zIHByaW1lcm9zIDIwIGNhcmFjdGVyZXMgZGVsIHTDrXR1bG8gZGUgbGEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ1BhcmEgb2J0ZW5lciBlbCBhdHJpYnV0byBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlbCBjYWxlbmRhcmlvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgbGEgQWdlbmRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdHZXN0aW9uYXIgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnQ29sb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdGZWNoYSBkZSB0w6lybWlubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdSZXBldGljacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICdObyBzZSBlbmNvbnRyYXJvbiBjYWxlbmRhcmlvLiBQb3IgZmF2b3IgcHJpbWVybyBhw7FhZGEgdW4gY2FsZW5kYXJpbyB1dGlsaXphZG8gbGEgcGFnaW5hIGRlIEdlc3Rpb25hciBDYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFc3RhIGVzIHVuYSBjaXRhIHJlcGV0aXRpdmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICdEZXNlYSBlZGl0YXIgc29sbyBlc3RhIG8gdG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ1RvZGFzIGxhcyBvY3VycmVuY2lhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ1NvbG8gZXN0YSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdSZXN1bWVuIGRlIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIHVuIENhbGVuZGFyaW8gbnVldm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnQcOxYWRpciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIHVuIGNhbGVuZGFyaW8gYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBwYXJhIHBvZGVyIHNlciBleHBvcnRhZG8gcG9yIGVsIG3Ds2R1bG8gZGUgZ2VzdGnDs24gZGUgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnQ2FyZ2FyIGNvbmZpZ3VyYWNpw7NuIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnSW1wb3J0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0ZpbHRybyBwYXJhIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ0RlcGVuZGllbmRvIGRlbCBjYW1wbyBkZSBncnVwbywgZWwgc2lzdGVtYSBwZXJtaXRlIGVsIGFjY2VzbyBhIHVzdWFyaW9zIGFsIGNhbGVuZGFyaW8gZGUgYWN1ZXJkbyBhIHN1cyBuaXZlbGVzIGRlIHBlcm1pc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1JPOiB1c3VhcmlvcyBxdWUgcHVlZGVuIHZlciB5IGV4cG9ydGFyIHRvZGFzIGxhcyBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ01vdmVyX0E6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gbW9kaWZpY2FyIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8sIHBlcm8gc2luIGNhbWJpYXIgbGEgc2VsZWNjacOzbiBkZSBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQ3JlYXI6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gY3JlYXIgeSBib3JyYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ1JXOiB1c3VhcmlvIHF1ZSBwdWVkZW4gZ2VzdGlvbmFyIGVsIGNhbGVuZGFyaW8gZW4gc8OtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnRGVzY2FyZ2FyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnQ29waWFyIGxhIFVSTCBww7pibGljYSBkZSBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdOb21icmUgZGVsIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnWWEgZXhpc3RlIHVuIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIG5vbWJyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBvIGRlIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdDaXRhcyBkZSBUaWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1JlZ2xhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ1VzZSBsYXMgb3BjaW9uZXMgbW9zdHJhZGFzIGFiYWpvIHBhcmEgYWNvcnRhciBsYXMgY2l0YXMgZGUgdGlja2V0cyBxdWUgc2Vyw6FuIGNyZWFkYXMgYXV0b23DoXRpY2FtZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ1BvciBmYXZvciBzZWxlY2Npb25lIHVuYSBjb2xhIHbDoWxpZGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAnQXRyaWJ1dG9zIGRlIGLDunNxdWVkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ0RlZmluZSByZWdsYXMgcGFyYSBjcmVhY2nDs24gZGUgbGFzIGNpdGFzIGF1dG9tw6F0aWNhcyBlbiBlc3RlIGNhbGVuZGFyaW8gYmFzYWRhcyBlbiBsb3MgZGF0b3MgZGUgbG9zIHRpY2tldHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnQcOxYWRpciByZWdsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnTcOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWVub3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBudWV2YSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0NhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdEZW1hc2lhZG9zIGNhbGVuZGFyaW9zIGFjdGl2b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnUG9yIGZhdm9yIGRlc2FjdGl2ZSBhbGd1bm9zIHByaW1lcm8gbyBpbmNyZW1lbnRlIGVsIGzDrW1pdGUgZW4gbGEgY29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ1NlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gTWVuc3VhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAnTMOtbmVhIGRlIHRpZW1wbyBTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gRGlhcmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdTYWx0YXIgYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnRGVzY2FydGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdNb3N0cmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYWNpw7NuIGLDoXNpY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRmVjaGEvSG9yYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAnUG9yIGZhdm9yIGZpamUgZXN0ZSB2YWxvciBhbnRlcyBkZSBsYSBmZWNoYSBkZSB0w6lybWluby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnUG9yIGZhdm9yIGZpamUgZXN0ZSB2YWxvciBkZXNwdcOpcyBkZSBsYSBmZWNoYSBkZSBpbmljaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ0VzdGEgZXMgdW5hIG9jdXJyZW5jaWEgZGUgdW5hIGNpdGEgcmVwZXRpdGl2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdQcmVjaW9uZSBhcXXDrSAgcGFyYSB2ZXIgbGEgY2l0YSBwYWRyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnUHJlY2lvbmUgYXF1w60gIHBhcmEgZWRpdGFyIGxhIGNpdGEgcGFkcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ0ZyZWN1ZW5jaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICdDYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICdQdW50byBkZSB0aWVtcG8gcmVsYXRpdm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnwr9Fc3TDoSBzZWd1cm8gZGUgcXVlIGRlc2VhIGVsaW1pbmFyIGVzdGEgY2l0YT8gRXN0YSBvcGVyYWNpw7NuIG5vIHNlIHB1ZWRlIGRlc2hhY2VyLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSW1wb3J0YXIgQ2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ0VsIGFyY2hpdm8gY2FyZ2FkbyB0aWVuZSBxdWUgZXN0YXIgZW4gdW4gZm9ybWF0byBpQ2FsIHbDoWxpZG8gKC5pY3MpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ1NpIGVsIENhbGVuZGFyaW8gZGVzZWFkbyBubyBhcGFyZWNlIGVuIGxhIGxpc3RhLCBwb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgdGVuZ2EgYWwgbWVub3MgZWwgcGVybWlzbyBkZSAiY3JlYXIiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnwr9BY3R1YWxpemFyIGxhcyBjaXRhcyBleGlzdGVudGVzPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ1RvZGFzIGxhcyBjaXRhcyBleGlzdGVudGVzIGVuIGVsIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIFVuaXF1ZUlEIHNlIHNvYnJlc2NyaWJpcsOhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdDYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0YXIgY2l0YXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTnVldmEgQ2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnUHJvbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZMOtYXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnwqFFbCBub21icmUgZGUgbGEgbm90aWZpY2FjacOzbiB5YSBleGlzdGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBZ2VudGVzIChyZWN1cnNvcyksIHF1ZSBwdWVkZW4gc2VyIHNlbGVjY2lvbmFkb3MgZGVudHJvIGRlIHVuYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FnZW50ZXMgY29uIChhbCBtZW5vcykgcGVybWlzb3MgZGUgbGVjdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3MgbG9zIGFnZW50ZXMgY29uIHBlcm1pc29zIGRlIGVzY3JpdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdFbCBzaXN0ZW1hIG5vIHB1ZG8gY3JlYXIgZWwgQ2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdObyBzZSB0aWVuZSBlbCBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdObyB0aWVuZSBhY2Nlc28gYSBlc3RlIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdFZGl0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnRXJyb3IgYWwgYWN0dWFsaXplciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnTm8gc2UgcHVlZGUgbGVlciBlbCBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIGRlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdQb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgZWwgYXJjaGl2byBlcyB2w6FsaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdObyBzZSBwdWVkZSBpbXBvcnRhciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICfCoUNhbGVuZGFyaW8gaW1wb3J0YWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnU2UgbmVjZXNpdGEgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOb3Qgc2UgcHVlZGVuIG9idGVuZXIgbG9zIGRhdG9zIHBhcmEgZWwgQ2FsZW5kYXJJRCBlc3BlY2lmaWNhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ1NlIGhhbiBpbXBvcnRhZG8gJXMgY2l0YShzKSBhbCBjYWxlbmRhcmlvICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dG9zICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBob3JhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1RvZGFzIGxhcyBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICdDaXRhcyBhc2lnbmFkYXMgYSBtw60gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdNb3N0cmFuZG8gc29sbyBjaXRhcyBhc2lnbmFkYXMgYSB0w60hIENhbWJpYXIgY29uZmlndXJhY2nDs24nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnwqFDaXRhIG5vIGVuY29udHJhZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTnVuY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnQ2FkYSBEw61hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdDYWRhIFNlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ0NhZGEgTWVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdDYWRhIEHDsW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnUGVyc29uYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RpYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNZW5zdWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ0FudWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnY2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ3BvciAlcyB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdoYXN0YSAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAncG9yIC4uLiB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ2hhc3RhICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ1NpbiBub3RpZmljYWNpb25lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgbWludXRvKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMgaG9yYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZMOtYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHNlbWFuYXMgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdhbnRlcyBkZWwgaW5pY2lvIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdkZXNwdcOpcyBkZWwgaW5pY2lvIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAnYW50ZXMgZGVsIGZpbiBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2Rlc3B1w6lzIGRlbCBmaW4gZGUgbGEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ8KhTm8gdGllbmUgcGVybWlzb3MhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ0xhIGNpdGEgbm8gcHVlZGUgc2VyIGJvcnJhZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ8KhTm8gdGllbmUgcGVybWlzb3MhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ05vIHRpZW5lIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ0VsIHNpc3RlbWEgbm8gcHVkbyBpbXBvcnRhciBlbCBhcmNoaXZvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdQb3IgZmF2b3IsIHJldmlzZSBlbCByZWdpc3RybyBwYXJhIG1hcyBpbmZvcm1hY2nDs24uJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQgbcOhcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ8KhTm8gc2UgdGllbmUgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICfCoU5vIGV4aXN0ZSBlbCB1c3VhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ8KhQ2FsZW5kYXJpbyBubyB2YWxpZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ8KhVVJMIG5vIHbDoWxpZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ8KhU2UgcHJvZHVqbyB1biBlcnJvciBhbCBleHBvcnRhciBlbCBjYWxlbmRhcmlvISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ0FjdHVhbGl6YWNpw7NuIChtaW51dG9zKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnUMOhZ2luYSBkZSByZXN1bWVuIGRlbCBDYWxlbmRhcmlvIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYWNpb25lcyBkZSBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG9zIGRlbCBjYWxlbmRhcmlvIGRlIGNpdGFzIHF1ZSBwcmVwYXJhIGVudHJhZGFzIHBhcmEgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBxdWUgYWN0dWFsaXphIGxvcyBkYXRvcyBkZWwgdGlja2V0IGRlc2RlIHVuYSBjaXRhIGRlIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgZWRpY2nDs24gZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdMaXN0YSBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ0xpc3RhIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnTm90aWZpY2FjaW9uZXMgZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBnZXN0acOzbiBkZSBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdFbGlqYSBlbCB0aXBvIGRlIGNhbWJpb3MgZW4gbGFzIGNpdGFzIHBhciBsYXMgY3VhbGVzIGRlc2VhIHJlY2liaXIgbm90aWZpY2FjaW9uZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdDcmVhciB1bmEgbnVldmEgY2l0YSBkZSBjYWxlbmRhcmlvIHZpbmN1bGFkYSBhIGVzdGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnQ3JlYSB5IGdlc3Rpb25hIGxhcyBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdDcmVhciBudWV2YSBjaXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ0RlZmluZSBjdWFsZXMgY29sdW1uYXMgc2Vyw6FuIG1vc3RyYWRhcyBlbiB3aWRnZXQgZGUgY2l0YXMgdmluY3VsYWRhcyAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBBanVzdGVzIHBvc2libGVzOiAwID0gRGVzYWN0aXZhZG8sIDEgPSBEaXNwb25pYmxlLCAyID0gQWN0aXZhZG8gZGUgZm9ybWEgcHJlZGV0ZXJtaW5hZGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluZSB1biBpY29ubyBkZSB2w61uY3VsbyBhIGxhIHBhZ2luYSBkZSBnb29nbGUgbWFwIGRlIGxhIHViaWNhY2nDs24gYWN0dWFsIGVuIGxhIHBhbnRhbGxhIGRlIGVkaWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ0RlZmluZSBsb3MgdGlwb3MgZGUgb2JqZXRvIGRlIGV2ZW50byBxdWUgc2UgbWFuZWphbiBhIHRyYXbDqXMgZGVsIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdEZWZpbmUgbGEgbGlzdGEgZGUgcGFyw6FtZXRyb3MgcXVlIHB1ZWRlbiBzZXIgZW52aWFkb3MgYSBsYSBmdW5jacOzbiBkZSBiw7pzcXVlZGEgZGUgdGlja2V0cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBjYW1wb3MgZGluw6FtaWNvcyBkZSB0aWNrZXQgZGUgdGlwbyBmZWNoYSB5IGhvcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGVsIHRpZW1wbyBkZSBlc2NhbGFtaWVudG8gZGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBlbCB0aWVtcG8gZGUgZXNwZXJhIGRlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnRGVmaW5lIGVsIHBsdWdpbiBkZSB0aWNrZXQgcGFyYSBsYXMgY2l0YXMgZGUgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnQ2FtcG9EaW7DoW1pY29fJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VkaXRhciBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdUaWVtcG8gZGUgcHJpbWVyYSByZXNwdWVzdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgaW1wb3J0YWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdWaW5jdWxhciBjaXRhcyB5IHRpY2tldHMgY29uIGVsIHRpcG8gZGUgdsOtbmN1bG8gIk5vcm1hbCIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBsb3MgZXZlbnRvcyBkZSBjaXRhcyBxdWUgc29uIGRlc3BsZWdhb3MgZW4gbGEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3MgbG9zIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBxdWUgc29uIGRlc3BsZWdhZG9zIGVuIGxhIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdMaXN0YSBkZSBjb2xvcmVzIGVuIGhleGFkZWNpbWFsIFJHQiBxdWUgZXN0YXLDoW4gZGlzcG9uaWJsZXMgcGFyYSBzdSBzZWxlY2Npw7NuIGR1cmFudGUgbGEgY3JlYWNpw7NuIGRlIGNhbGVuZGFyaW9zLiBBc2Vnw7pyZXNlIHF1ZSBsb3MgY29sb3JlcyBzZWFuIHN1ZmljaWVudGVtZW50ZSBvYnNjdXJvcyBwYXJhIHF1ZSBlbCB0ZXh0byBiYW5jbyBzZSB2ZWEgY29ycmVjdGFtZW50ZSBzb2JyZSBlbGxvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnR2VzdGlvbmFyIGRpZmVyZW50ZXMgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnTnVtZXJvIG3DoXhpbW8gZGUgY2FsZW5kYXJpb3MgYWN0aXZvcyBlbiBsYXMgcGFudGFsbGFzIGRlIHJlc3VtZW4uIFBvciBmYXZvciBub3RlIHF1ZSB1biBudW1lcm8gZ3JhbmRlIGRlIGNhbGVuZGFyaW9zIGFjdGl2b3MgcHVlZGUgdGVuZXIgdW4gaW1wYWN0byBuZWdhdGl2byBlbiBlbCBkZXNlbXBlw7FvIGRlbCBzZXJ2aWRvciBkZWJpZG8gYSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBsbGFtYWRhcyBzaW11bHTDoW5lYXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ09UUlMgbm8gYWRtaXRlIGNpdGFzIHJlY3VycmVudGVzIHNpbiBmZWNoYSBkZSBmaW5hbGl6YWNpw7NuIG8gc2luIG7Dum1lcm8gZGUgaXRlcmFjaW9uZXMuIER1cmFudGUgZWwgcHJvY2VzbyBkZSBpbXBvcnRhY2nDs24sIHB1ZWRlIG9jdXJyaXIgcXVlIGVsIGFyY2hpdm8gSUNTIGNvbnRlbmdhIGRpY2hhcyBjaXRhcy4gRW4gc3UgbHVnYXIsIGVsIHNpc3RlbWEgY3JlYSB0b2RhcyBsYXMgY2l0YXMgZW4gZWwgcGFzYWRvLCBhZGVtw6FzIGRlIGNpdGFzIHBhcmEgbG9zIHByw7N4aW1vcyBuIG1lc2VzICgxMjAgbWVzZXMgLyAxMCBhw7FvcyBwb3IgZGVmZWN0bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnUmVzdW1lbiBkZSB0b2RhcyBsYXMgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVGllbXBvIGRlIGVzcGVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnQsO6c3F1ZWRhIGRlIHBsdWctaW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnTcOzZHVsbyBQbHVnLWluIGRlIGLDunNxdWVkYSBwYXJhIGF1dG8tY29tcGxldGFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdDYWxlbmRhcmlvIFDDunBsaWNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdDYWxlbmRhcmlvIHDDumJsaWNvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgUmVjdXJzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUmVzdW1lbiBkZSBSZWN1cnNvcyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnTXVlc3RyYSB1biB2w61uY3VsbyBlbiBlbCBtZW7DuiBwYXJhIGNyZWFyIHVuYSBjaXRhIGRlIGNhbGVuZGFyaW8gdmluY3VsYWRhIGFsIHRpY2tldCBkaXJlY3RvIGRlc2RlICBsYSB2aXN0YSBkZSBkZXRhbGxlIGRlIHRpY2tldCBkZSBsYSBpbnRlcmZhY2UgZGVsIGFnZW50ZS4gQWRpY2lvbmFsbWVudGUgc2UgcHVlZGUgaGFjZXIgaW4gY29udHJvbCBkZSBhY2Nlc28gcGFyYSBtb3N0cmFyIG8gbm8gZXN0ZSB2w61uY3VsbyB1c2FuZG8gbGEgQ2xhdmUgIkdyb3VwIiB5IGVsIENvbnRlbmlkbyBjb21vICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFBhcmEgYWdydXBhciBlbGVtZW50byBkZWwgbWVuw7ogdXNlIGxhIENsYXZlICJDbHVzdGVyTmFtZSIgcGFyYSBlbCBDb250ZW5pZG8gY3VhbHF1aWVyIG5vbWJyZSBxdWUgZGVzZWUgdmVyIGVuIGxhIGludGVyZmFjZSBkZWwgdXN1YXJpby4gVXRpbGl6ZSAiQ2x1c3RlclByaW9yaXR5IiBwYXJhIGNvbmZpZ3VyYXIgZWwgb3JkZW4gZGUgdW4gY2llcnRvIGdydXBvIGRlbnRybyBkZSBsYSBiYXJyYSBkZSBoZXJyYW1pZW50YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICdUaWVtcG8gZGUgc29sdWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnU2VsZWN0aW9uIGRlIHRyYW5zcG9ydGUgcGFyYSBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnRGlzcGFyYSBsYSBhY2Npw7NuIGRlIGHDsWFkaXIgbyBhY3R1YWxpemFyIGNpdGFzIGF1dG9tw6F0aWNhcyBkZSBjYWxlbmRhcmlvcyBiYXNhZGFzIGVuIGNpZXJ0b3MgdGllbXBvcyBkZSB0aWNrZXRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ1RpZW1wbyBkZSBhY3R1YWxpemFjacOzbic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Omh1X09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdJZMWRcG9udCBlbWzDqWtlenRldMWRIMOpcnRlc8OtdMOpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnRWd5IMOpcnRlc8OtdMOpc3QgZm9nIGthcG5pIG1pbmRlbiBhbGthbG9tbWFsLCBhbWlrb3IgZWd5IGVtbMOpa2V6dGV0xZEgaWTFkSBlbMOpcsOpc3JlIGtlcsO8bCBheiBpZMWRcG9udGphaSBlZ3lpa8OpbsOpbC4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICdJZMWRcG9udC3DqXJ0ZXPDrXTDqXMga2V6ZWzDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICdJdHQgdHVkIGVneSBiZcOhbGzDrXTDs2bDoWpsdCBmZWx0w7ZsdGVuaSBheiBpZMWRcG9udC3DqXJ0ZXPDrXTDqXNlayBpbXBvcnTDoWzDoXPDoWhveiBhIHJlbmRzemVycmUuIEEgZsOhamxuYWsgLnltbCBmb3Jtw6F0dW1iYW4ga2VsbCBsZW5uaWUsIGFob2d5IGF6IGlkxZFwb250LcOpcnRlc8OtdMOpcyBtb2R1bCBleHBvcnTDoWx0YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICdJdHQgdsOhbGFzenRoYXRqYSBraSwgaG9neSBtZWx5IGVzZW3DqW55ZWsgZm9nasOhayBha3RpdsOhbG5pIGV6dCBheiDDqXJ0ZXPDrXTDqXN0LiBFZ3kgdG92w6FiYmkgaWTFkXBvbnRzesWxcsWRIGFsa2FsbWF6aGF0w7MgbGVudCBhIGNzYWsgZWd5IGJpem9ueW9zIGZlbHTDqXRlbGxlbCByZW5kZWxrZXrFkSBpZMWRcG9udG9rbsOhbCB0w7ZydMOpbsWRIGvDvGxkw6lzaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdJZMWRcG9udCBzesWxcsWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW0nfSA9ICdDc2FwYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICdFcsWRZm9ycsOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ0EgZmVsaGFzem7DoWzDsyDDqXJ0ZXPDrXTDqXNlIGNzYWsgZWd5c3plciBlZ3kgbmFwIGVneSBlZ3llZMO8bGkgaWTFkXBvbnRyw7NsIGVneSBraXbDoWxhc3p0b3R0IMOhdHZpdGVsIGhhc3puw6FsYXTDoXZhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdBeiDDqXJ0ZXPDrXTDqXNlayBlZ3kgw7xneWludMOpesWRbmVrIGtlcsO8bG5layBlbGvDvGxkw6lzcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdBeiBpZMWRcG9udGPDrW0gZWxzxZEgMjAga2FyYWt0ZXLDqW5layBsZWvDqXLDqXPDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICdBeiBpZMWRcG9udCBqZWxsZW16xZFqw6luZWsgbGVrw6lyw6lzw6loZXonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdBIG5hcHTDoXIgamVsbGVtesWRasOpbmVrIGxla8OpcsOpc8OpaGV6JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ05hcGlyZW5kIMOhdHRla2ludMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdOYXB0w6FyYWsga2V6ZWzDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ0lkxZFwb250IGhvenrDoWFkw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ1N6w61uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAnQmVmZWplesOpc2kgZMOhdHVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ0lzbcOpdGzDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnTmVtIHRhbMOhbGhhdMOzayBuYXB0w6FyYWsuIEVsxZFzesO2ciBhZGpvbiBob3p6w6EgZWd5IG5hcHTDoXJhdCBhIG5hcHTDoXJhayBrZXplbMOpc2Ugb2xkYWwgaGFzem7DoWxhdMOhdmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0lkxZFwb250JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFeiBlZ3kgaXNtw6l0bMWRZMWRIGlkxZFwb250JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnQ3NhayBlenQgYXogZWzFkWZvcmR1bMOhc3Qgc3plcmV0bsOpIHN6ZXJrZXN6dGVuaSB2YWd5IGF6IMO2c3N6ZXNldD8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnw5Zzc3plcyBlbMWRZm9yZHVsw6FzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnQ3NhayBleiBheiBlbMWRZm9yZHVsw6FzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdOYXB0w6Fya2V6ZWzDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdOYXB0w6FyIMOhdHRla2ludMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICfDmmogbmFwdMOhciBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnTmFwdMOhciBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0lkxZFwb250b2sgaW1wb3J0w6Fsw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdOYXB0w6FyIGltcG9ydMOhbMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdJdHQgdMO2bHRoZXQgZmVsIGVneSBiZcOhbGzDrXTDs2bDoWpsdCBlZ3kgbmFwdMOhciBpbXBvcnTDoWzDoXPDoWhveiBhIHJlbmRzemVycmUuIEEgZsOhamxuYWsgLnltbCBmb3Jtw6F0dW1iYW4ga2VsbCBsZW5uaWUsIGFob2d5IGEgbmFwdMOhcmtlemVsxZEgbW9kdWwgZXhwb3J0w6FsdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnTmFwdMOhcmJlw6FsbMOtdMOhcyBmZWx0w7ZsdMOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnTmFwdMOhciBpbXBvcnTDoWzDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnU3rFsXLFkSBhIG5hcHTDoXJha2hveic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICdBIGNzb3BvcnRtZXrFkXTFkWwgZsO8Z2fFkWVuIGEgcmVuZHN6ZXIgYSBmZWxoYXN6bsOhbMOza2F0IGEgam9nb3N1bHRzw6FnaSBzemludGrDvGsgYWxhcGrDoW4gZm9namEgZW5nZWRuaSBob3p6w6Fmw6lybmkgYSBuYXB0w6FyaG96Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ0NzYWsgb2x2YXPDoXM6IGEgZmVsaGFzem7DoWzDs2sgbMOhdGhhdGrDoWsgw6lzIGV4cG9ydMOhbGhhdGrDoWsgYSBuYXB0w6FyYmFuIGzDqXbFkSDDtnNzemVzIGlkxZFwb250b3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnw4F0bW96Z2F0w6FzOiBhIGZlbGhhc3puw6Fsw7NrIG3Ds2Rvc8OtdGhhdGrDoWsgYXogaWTFkXBvbnRva2F0IGEgbmFwdMOhcmJhbiwgZGUgYSBuYXB0w6FydsOhbGFzenTDoXMgbWVndsOhbHRvenRhdMOhc2EgbsOpbGvDvGwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdMw6l0cmVob3rDoXM6IGEgZmVsaGFzem7DoWzDs2sgbMOpdHJlaG96aGF0bmFrIMOpcyB0w7Zyw7ZsaGV0bmVrIGlkxZFwb250b2thdCBhIG5hcHTDoXJiYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICfDjXLDoXMsIG9sdmFzw6FzOiBhIGZlbGhhc3puw6Fsw7NrIG1hZ8OhdCBhIG5hcHTDoXJhdCBrZXplbGhldGlrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICdVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAnTmFwdMOhciBleHBvcnTDoWzDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnTmFwdMOhciBsZXTDtmx0w6lzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdOeWlsdsOhbm9zIG5hcHTDoXIgVVJMIG3DoXNvbMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05hcHTDoXIgbmV2ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdNw6FyIGzDqXRlemlrIGVneSBpbHllbiBuZXbFsSBuYXB0w6FyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnSm9nb3N1bHRzw6FnaSBjc29wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdKZWd5aWTFkXBvbnRvayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnU3phYsOhbHknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnSGFzem7DoWxqYSBhIGxlbnRpIGxlaGV0xZFzw6lnZWtldCBhbm5hayBsZXN6xbFrw610w6lzw6loZXosIGhvZ3kgbWVseSBqZWd5ZWsgaWTFkXBvbnRqYWkgbGVneWVuZWsgYXV0b21hdGlrdXNhbiBsw6l0cmVob3p2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ1bDoWxhc3N6b24gZWd5IMOpcnbDqW55ZXMgdsOhcsOzbGlzdMOhdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdLZXJlc8Opc2kgYXR0cmliw7p0dW1vayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ1N6YWLDoWx5b2sgbWVnaGF0w6Fyb3rDoXNhIGF1dG9tYXRpa3VzIGlkxZFwb250b2sgbMOpdHJlaG96w6Fzw6Fob3ogZWJiZW4gYSBuYXB0w6FyYmFuIGEgamVneWFkYXRvayBhbGFwasOhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICdTemFiw6FseSBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ1TDtmJiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICdLZXZlc2ViYic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQXBwb2ludG1lbnQnfSA9ICfDmmogaWTFkXBvbnQgaG96esOhYWTDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ05hcHTDoXJhayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnVMO6bCBzb2sgYWt0w612IG5hcHTDoXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnVmFneSBrYXBjc29sam9uIGtpIG7DqWjDoW55YXQgZWzFkXN6w7ZyLCB2YWd5IG7DtnZlbGplIGEga29ybMOhdG90IGEgYmXDoWxsw610w6Fzb2tiYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdIw6l0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAnSGF2aSBpZMWRdm9uYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ0hldGkgaWTFkXZvbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ05hcGkgaWTFkXZvbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdVZ3LDoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ0VsdMO8bnRldMOpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAnTWVnamVsZW7DrXTDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICdBbGFwIGluZm9ybcOhY2nDs2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRMOhdHVtL2lkxZEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ8OBbGzDrXRzYSBlenQgZWd5IGJlZmVqZXrDqXNpIGTDoXR1bSBlbMWRdHRpIMOpcnTDqWtyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnw4FsbMOtdHNhIGV6dCBlZ3kga2V6ZMOpc2kgZMOhdHVtIHV0w6FuaSDDqXJ0w6lrcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICdFeiBlZ3kgaXNtw6l0bMWRZMWRIGlkxZFwb250IGVsxZFmb3JkdWzDoXNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0thdHRpbnRzb24gaWRlIGEgc3rDvGzFkWlkxZFwb250IG1lZ3Rla2ludMOpc8OpaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdLYXR0aW50c29uIGlkZSBhIHN6w7xsxZFpZMWRcG9udCBzemVya2VzenTDqXPDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAnR3lha29yaXPDoWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICdNaW5kZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ1JlbGF0w612IGlkxZFwb250JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJ0JpenRvc2FuIHTDtnLDtmxuaSBzemVyZXRuw6kgZXp0IGF6IGlkxZFwb250b3Q/IEV6dCBhIG3FsXZlbGV0ZXQgbmVtIGxlaGV0IHZpc3N6YXZvbm5pLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSWTFkXBvbnQgaW1wb3J0w6Fsw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ0EgZmVsdMO2bHTDtnR0IGbDoWpsbmFrIMOpcnbDqW55ZXMgaUNhbCBmb3Jtw6F0dW1iYW4gKC5pY3MpIGtlbGwgbGVubmllLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICdIYSBhIGvDrXbDoW50IG5hcHTDoXIgbmluY3MgaXR0IGZlbHNvcm9sdmEsIGFra29yIGd5xZF6xZFkasO2biBtZWcgYXJyw7NsLCBob2d5IHZhbi1lIGxlZ2Fsw6FiYiDigJ5sw6l0cmVob3rDoXPigJ0gam9nb3N1bHRzw6FnYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICdGcmlzc8OtdGkgYSBtZWdsw6l2xZEgaWTFkXBvbnRva2F0Pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ0EgbmFwdMOhcmJhbiBsw6l2xZEgaWx5ZW4gZWd5ZWRpIGF6b25vc8OtdMOzdmFsIHJlbmRlbGtlesWRIMO2c3N6ZXMgbWVnbMOpdsWRIGlkxZFwb250IGZlbMO8bCBsZXN6IMOtcnZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdOYXB0w6FyIGZlbHTDtmx0w6lzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSWTFkXBvbnRvayBpbXBvcnTDoWzDoXNhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudERhc2hib2FyZEFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBcHBvaW50bWVudCd9ID0gJ8OaaiBpZMWRcG9udCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnSGFtYXJvc2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgbmFwJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ0F6IMOpcnRlc8OtdMOpcyBuZXZlIG3DoXIgbMOpdGV6aWshJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICfDnGd5aW50w6l6xZEgKGVyxZFmb3Jyw6Fzb2spLCBha2kgYXogaWTFkXBvbnRvbiBiZWzDvGwga2kgbGV0dCBqZWzDtmx2ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBeiDDtnNzemVzIMO8Z3lpbnTDqXrFkSwgYWtpa25layAobGVnYWzDoWJiKSBvbHZhc8Ohc2kgam9nb3N1bHRzw6FndWsgdmFuIGF6IGlkxZFwb250b2tob3ogKG5hcHTDoXJob3opJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnQXogw7Zzc3plcyDDvGd5aW50w6l6xZEsIGFraWtuZWsgw61yw6FzaSBqb2dvc3VsdHPDoWd1ayB2YW4gYXogaWTFkXBvbnRob3ogKG5hcHTDoXJob3opJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdBIHJlbmRzemVyIG5lbSB0dWR0YSBsw6l0cmVob3puaSBhIG5hcHTDoXJhdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdOaW5jcyBuYXB0w6FyLWF6b25vc8OtdMOzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdOaW5jcyBob3p6w6Fmw6lyw6lzZSBlaGhleiBhIG5hcHTDoXJob3ohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdOYXB0w6FyIHN6ZXJrZXN6dMOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0hpYmEgYSBuYXB0w6FyIGZyaXNzw610w6lzZWtvciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ05lbSBzaWtlcsO8bHQgYmVvbHZhc25pIGEgbmFwdMOhcmJlw6FsbMOtdMOzIGbDoWpsdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAnR3nFkXrFkWRqw7ZuIG1lZyBhcnLDs2wsIGhvZ3kgYSBmw6FqbCDDqXJ2w6lueWVzLWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05lbSBzaWtlcsO8bHQgaW1wb3J0w6FsbmkgYSBuYXB0w6FyYXQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ05hcHTDoXIgaW1wb3J0w6FsdmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdOYXB0w6FyLWF6b25vc8OtdMOzIHN6w7xrc8OpZ2VzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ05lbSBzaWtlcsO8bHQgbGVrw6lybmkgYXogYWRhdG9rYXQgYSBtZWdhZG90dCBuYXB0w6FyLWF6b25vc8OtdMOzaG96JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICclcyBpZMWRcG9udCBzaWtlcmVzZW4gaW1wb3J0w6FsdmEgYSh6KSAlcyBuYXB0w6FyYmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNSBwZXJjJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1IHBlcmMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgcGVyYyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgw7NyYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdNaW5kZW4gaWTFkXBvbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnSG96esOhbSByZW5kZWx0IGlkxZFwb250b2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ0NzYWsgYXogw7ZuaMO2eiByZW5kZWx0IGlkxZFwb250b2sgdmFubmFrIG1lZ2plbGVuw610dmUhIEJlw6FsbMOtdMOhc29rIG1lZ3bDoWx0b3p0YXTDoXNhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ0F6IGlkxZFwb250IG5lbSB0YWzDoWxoYXTDsyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdTb2hhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ01pbmRlbiBuYXAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ01pbmRlbiBow6l0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdNaW5kZW4gaMOzbmFwYmFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdNaW5kZW4gw6l2YmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ0VnecOpbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICdOYXBpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ0hldGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ0hhdmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnw4l2ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdtaW5kZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICclcyBhbGthbG9tbWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2VkZGlnOiDigKYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAn4oCmIGFsa2Fsb21tYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICdlZGRpZzogJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnTmluY3Mgw6lydGVzw610w6lzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBwZXJjY2VsIGVsxZF0dGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyDDs3LDoXZhbCBlbMWRdHRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBuYXBwYWwgZWzFkXR0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIGjDqXR0ZWwgZWzFkXR0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2F6IGlkxZFwb250IGtlemRldGUgZWzFkXR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnbWl1dMOhbiBheiBpZMWRcG9udCBlbGtlemTFkWTDtnR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2F6IGlkxZFwb250IHbDqWdlIGVsxZF0dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICdtaXV0w6FuIGF6IGlkxZFwb250IHbDqWdldCDDqXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnTmluY3Mgam9nb3N1bHRzw6FnISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdOZW0gbGVoZXQgdMO2csO2bG5pIGEgamVneWlkxZFwb250b3QhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ05pbmNzZW5layBqb2dvc3VsdHPDoWdvayEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnTmluY3NlbmVrIGpvZ29zdWx0c8OhZ29rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ0EgcmVuZHN6ZXIgbmVtIHR1ZHRhIGltcG9ydMOhbG5pIGEgZsOhamx0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdUb3bDoWJiaSBpbmZvcm3DoWNpw7Nrw6lydCBuw6l6emUgbWVnIGEgbmFwbMOzdC4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJ3RvdsOhYmJpICslZCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ05pbmNzICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnTmluY3MgaWx5ZW4gZmVsaGFzem7DoWzDsyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICfDiXJ2w6lueXRlbGVuIG5hcHTDoXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ8OJcnbDqW55dGVsZW4gVVJMISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdIaWJhIHTDtnJ0w6ludCBhIG5hcHTDoXIgZXhwb3J0w6Fsw6FzYWtvciEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdGcmlzc8OtdMOpcyAocGVyYyknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ0lkxZFwb250bmFwdMOhciDDoXR0ZWtpbnTFkSBvbGRhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ0lkxZFwb250LcOpcnRlc8OtdMOpc2VrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdJZMWRcG9udG5hcHTDoXIgZXNlbcOpbnkgbW9kdWwsIGFtZWx5IGVsxZFrw6lzesOtdGkgYXogw6lydGVzw610w6lzaSBiZWplZ3l6w6lzZWtldCBheiBpZMWRcG9udG9raG96Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnSWTFkXBvbnRuYXB0w6FyIGVzZW3DqW55IG1vZHVsLCBhbWVseSBmcmlzc8OtdGkgYSBqZWd5aWTFkXBvbnRiw7NsIHN6w6FybWF6w7MgYWRhdG9ra2FsIHJlbmRlbGtlesWRIGplZ3lldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnSWTFkXBvbnRzemVya2VzenTDqXMga8OpcGVybnnFkS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ0lkxZFwb250bGlzdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdJZMWRcG9udGxpc3RhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnSWTFkXBvbnQtw6lydGVzw610w6lzZWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnSWTFkXBvbnRvayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ05hcHTDoXJrZXplbMOpcyBrw6lwZXJuecWRLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdWw6FsYXNzemEga2ksIGhvZ3kgbWlseWVuIHTDrXB1c8O6IGlkxZFwb250LXbDoWx0b3p0YXTDoXNyw7NsIHN6ZXJldG5lIMOpcnRlc8OtdMOpc2VrZXQga2FwbmkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdFenplbCBhIGplZ2d5ZWwgw7Zzc3pla2FwY3NvbHQgw7pqIG5hcHTDoXJpZMWRcG9udCBsw6l0cmVob3rDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnSWTFkXBvbnQtw6lydGVzw610w6lzZWsgbMOpdHJlaG96w6FzYSDDqXMga2V6ZWzDqXNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ8OaaiBpZMWRcG9udCBsw6l0cmVob3rDoXNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ0FubmFrIG1lZ2hhdMOhcm96w6FzYSwgaG9neSBtZWx5IG9zemxvcG9rIGxlZ3llbmVrIGzDoXRoYXTDs2sgYSBrYXBjc29sdCBpZMWRcG9udCBmZWzDvGxldGkgZWxlbWVuIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9IOKAnsO2c3N6ZXRldHTigJ0pLiBMZWhldHPDqWdlcyBiZcOhbGzDrXTDoXNvazogMCA9IGxldGlsdHZhLCAxID0gZWzDqXJoZXTFkSwgMiA9IGFsYXDDqXJ0ZWxtZXpldHRlbiBlbmdlZMOpbHllemV0dC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3ogZWd5IGlrb250IGEgamVsZW5sZWdpIGhlbHkgR29vZ2xlIFTDqXJrw6lwIG9sZGFsw6FyYSBtdXRhdMOzIGhpdmF0a296w6Fzc2FsIGF6IGlkxZFwb250c3plcmtlc3p0w6lzIGvDqXBlcm55xZFuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYXpva2F0IGF6IGVzZW3DqW55b2JqZWt0dW0gdMOtcHVzb2thdCwgYW1lbHllayBheiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQgbW9kdWxvbiBrZXJlc3p0w7xsIGxlc3puZWsga2V6ZWx2ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGF6b2tuYWsgYSBwYXJhbcOpdGVyZWtuZWsgYSBsaXN0w6Fqw6F0LCBhbWVseWVrIMOhdGFkaGF0w7NrIGEgamVneWtlcmVzw6lzIGZ1bmtjacOzbmFrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgamVneWlkxZFwb250IHTDrXB1c8OhbmFrIGjDoXR0w6lycHJvZ3JhbWrDoXQgYSBqZWd5IGTDoXR1bSDDqXMgaWTFkSBkaW5hbWlrdXMgbWV6xZFqw6loZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgamVneWlkxZFwb250IHTDrXB1c8OhbmFrIGjDoXR0w6lycHJvZ3JhbWrDoXQgYSBqZWd5IGVzemthbMOhY2nDs3MgaWRlasOpaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIGplZ3lpZMWRcG9udCB0w61wdXPDoW5hayBow6F0dMOpcnByb2dyYW1qw6F0IGEgamVneSBmw7xnZ8WRYmVuIGzDqXbFkSBpZGVqw6loZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICdNZWdoYXTDoXJvenphIGEgamVneWLFkXbDrXRtw6lueXQgYSBuYXB0w6FyaWTFkXBvbnRva2hvei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdJZMWRcG9udCBzemVya2VzenTDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdFbHPFkSB2w6FsYXN6aWTFkSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdJZMWRcG9udG9rIGltcG9ydMOhbMOhc2Ega8OpcGVybnnFkS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnw5Zzc3pla2FwY3NvbGphIGF6IGlkxZFwb250b2thdCDDqXMgamVneWVrZXQgZWd5IOKAnk5vcm3DoWzigJ0gdMOtcHVzw7ogaGl2YXRrb3rDoXNzYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdBeiDDtnNzemVzIGlkxZFwb250ZXNlbcOpbnkgbGlzdMOhamEsIGFtZWx5ZWsgbWVnamVsZW5uZWsgYSBncmFmaWt1cyBmZWzDvGxldGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnQXogw7Zzc3plcyBuYXB0w6FyZXNlbcOpbnkgbGlzdMOhamEsIGFtZWx5ZWsgbWVnamVsZW5uZWsgYSBncmFmaWt1cyBmZWzDvGxldGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ1N6w61uZWsgbGlzdMOhamEgaGV4YWRlY2ltw6FsaXMgUkdCIGZvcm3DoWJhbiwgYW1lbHllayBlbMOpcmhldMWRayBsZXN6bmVrIGEga2l2w6FsYXN6dMOhc2hveiBhIG5hcHTDoXIgbMOpdHJlaG96w6FzYSBrw7Z6YmVuLiBHecWResWRZGrDtm4gbWVnIGFycsOzbCwgaG9neSBhIHN6w61uZWsgZWzDqWcgc8O2dMOpdGVrLWUgYWhob3osIGhvZ3kgYSB2aWzDoWdvcyBzesO2dmVnIG1lZ2plbGVuw610aGV0xZEgbGVneWVuIHJhanR1ay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnS8O8bMO2bmLDtnrFkSBuYXB0w6FyYWsga2V6ZWzDqXNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ0F6IGFrdMOtdiBuYXB0w6FyYWsgbGVnbmFneW9iYiBzesOhbWEgYXogw6F0dGVraW50xZEga8OpcGVybnnFkWvDtm4uIE5lIGZlbGVkamUsIGhvZ3kgYXogYWt0w612IG5hcHTDoXJhayBuYWd5IHN6w6FtYSB0ZWxqZXPDrXRtw6lueWJlbGkgaGF0w6Fzc2FsIGxlaGV0IGEga2lzem9sZ8OhbMOzasOhcmEgYSB0w7psIHNvayBlZ3lpZGVqxbEgaMOtdsOhcyBpbmTDrXTDoXPDoXZhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnQXogT1RSUyBuZW0gdMOhbW9nYXRqYSBhIGJlZmVqZXrDqXNpIGTDoXR1bSB2YWd5IGF6IGlzbcOpdGzDqXNlayBzesOhbWEgbsOpbGvDvGxpIGlzbcOpdGzFkWTFkSBpZMWRcG9udG9rYXQuIEF6IGltcG9ydMOhbMOhc2kgZm9seWFtYXQgc29yw6FuIGVsxZFmb3JkdWxoYXQsIGhvZ3kgYXogSUNTLWbDoWpsIGlseWVuIGlkxZFwb250b2thdCB0YXJ0YWxtYXouIEVoZWx5ZXR0IGEgcmVuZHN6ZXIgYXogw7Zzc3plcyBpZMWRcG9udG90IGEgbcO6bHRiYW4gaG96emEgbMOpdHJlLCB2YWxhbWludCBhIGvDtnZldGtlesWRIG4gaMOzbmFwYmFuICgxMjAgaMOzbmFwLzEwIMOpdiBhbGFww6lydGVsbWV6ZXR0ZW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ0F6IMO2c3N6ZXMgaWTFkXBvbnQgw6F0dGVraW50xZFqZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVsOhcmFrb3rDoXNpIGlkxZEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ0LFkXbDrXRtw6lueSBrZXJlc8Opcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ0LFkXbDrXRtw6lueSBrZXJlc8Opc2kgbW9kdWwgYXogYXV0b21hdGlrdXMga2llZ8Opc3rDrXTDqXNoZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ055aWx2w6Fub3MgbmFwdMOhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnTnlpbHbDoW5vcyBuYXB0w6FyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ0VyxZFmb3Jyw6FzIMOhdHRla2ludMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ0VyxZFmb3Jyw6FzIMOhdHRla2ludMWRIChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICdFZ3kgaGl2YXRrb3rDoXN0IGplbGVuw610IG1lZyBhIG1lbsO8YmVuIGEgamVnZ3llbCDDtnNzemVrYXBjc29sdCBuYXB0w6FyaWTFkXBvbnQgbMOpdHJlaG96w6Fzw6Fob3oga8O2enZldGxlbsO8bCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGplZ3luYWd5w610w6FzIG7DqXpldMOpYsWRbC4gRXplbiBoaXZhdGtvesOhcyBtZWdqZWxlbsOtdMOpc8OpaGV6IHZhZ3kgbWVnIG5lbSBqZWxlbsOtdMOpc8OpaGV6IHRvdsOhYmJpIGhvenrDoWbDqXLDqXNpIHZlesOpcmzFkXQgbGVoZXQga8Opc3rDrXRlbmkgYSDigJ5Hcm91cOKAnSBrdWxjcyDDqXMgYXog4oCecnc6Y3NvcG9ydDE7bW92ZV9pbnRvOmNzb3BvcnQy4oCdIHRhcnRhbG9taG96IGhhc29ubMOzIGhhc3puw6FsYXTDoXZhbC4gQSBtZW7DvHBvbnRvayBjc29wb3J0b2tiYSByZW5kZXrDqXPDqWhleiBoYXN6bsOhbGphIGEg4oCeQ2x1c3Rlck5hbWXigJ0ga3VsY3NvdCBiw6FybWlseWVuIG9seWFuIHRhcnRhbG9tbWFsLCBhbWVseWV0IGEgZmVsaGFzem7DoWzDs2kgZmVsw7xsZXRlbiBsw6F0bmkgc3plcmV0bmUuIEhhc3puw6FsamEgYSDigJ5DbHVzdGVyUHJpb3JpdHnigJ0ga3VsY3NvdCBlZ3kgYml6b255b3MgZsO8cnQgc29ycmVuZGrDqW5layBiZcOhbGzDrXTDoXPDoWhveiBheiBlc3prw7Z6dMOhcm9uIGJlbMO8bC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ01lZ29sZMOhc2kgaWTFkSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ8OBdHZpdGVsa2l2w6FsYXN6dMOhcyBheiBpZMWRcG9udC3DqXJ0ZXPDrXTDqXNla2hlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnQWt0aXbDoWxqYSBheiBhdXRvbWF0aWt1cyBuYXB0w6FyaWTFkXBvbnRvayBob3p6w6FhZMOhc8OhdCB2YWd5IGZyaXNzw610w6lzw6l0IGJpem9ueW9zIGplZ3lpZMWRayBhbGFwasOhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdGcmlzc8OtdMOpc2kgaWTFkSc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICfkuojntITjg6rjg57jgqTjg7Pjg4Djg7zjga7pgJrnn6UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ+S6iOe0hOmAmuefpeOBrueuoeeQhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICfkuojntITjga7jg5XjgqPjg6vjgr/jg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ+ODgeODvOODoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ+ODquOCveODvOOCuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ+mAmuefpeOBr+aLheW9k+iAheOBuOmAgeS/oeOBleOCjOOBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAn5LqI5a6a44Gu5bGe5oCn44KS5Y+W5b6X44GZ44KL44GT44GoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAn44Kr44Os44Oz44OA44O844Gu5bGe5oCn44KS5Y+W5b6X44GZ44KL44GT44GoJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ+OCouOCuOOCp+ODs+ODgOihqOekuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAn44Kr44Os44Oz44OA44O8566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ+S6iOe0hOOBrueZu+mMsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ+iJsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ+e1guS6huaXpeaZgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICfnubDjgorov5TjgZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAn5LqI57SEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICfjgZPjgozjga/nubDjgorov5TjgZfjga7kuojlrprjgafjgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICfjgZPjga7nmbrnlJ/jgb7jgZ/jga/jgZnjgbnjgabnmbrnlJ/jgaDjgZHjgpLnt6jpm4bjgZfjgb7jgZnjgYvvvJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAn5YWo44Gm44Gu55m655SfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAn44GT44Gu55m655Sf5pmC54K5JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICfjgqvjg6zjg7Pjg4Djg7znrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICfjgqvjg6zjg7Pjg4Djg7zooajnpLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ+OCq+ODrOODs+ODgOODvOOBrueZu+mMsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICfjgqvjg6zjg7Pjg4Djg7zjga7nmbvpjLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ+S6iOe0hOOBruOCpOODs+ODneODvOODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgpLjgqTjg7Pjg53jg7zjg4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICfjgZPjgZPjgafjgqvjg6zjg7Pjg4Djg7zjga7oqK3lrprjg5XjgqHjgqTjg6vjgpLjgqLjg4Pjg5fjg63jg7zjg4njgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgILjg5XjgqHjgqTjg6vjga/jgqvjg6zjg7Pjg4Djg7znrqHnkIbjg6Ljgrjjg6Xjg7zjg6vjgYzjgqjjgq/jgrnjg53jg7zjg4jjgZfjgZ8iLnltbCLjg5Xjgqnjg7zjg57jg4Pjg4jjgafjgYLjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICfjgqvjg6zjg7Pjg4Djg7zoqK3lrprjgpLjgqLjg4Pjg5fjg63jg7zjg4njgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAn44Kr44Os44Oz44OA44O844KS44Kk44Oz44Od44O844OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAn44Kr44Os44Oz44OA44O844Gn44OV44Kj44Or44K/44O8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ+OCq+ODrOODs+ODgOODvOOBruOCqOOCr+OCueODneODvOODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ+OCq+ODrOODs+ODgOODvOOBruODgOOCpuODs+ODreODvOODiSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICflhazplovjgqvjg6zjg7Pjg4Djg7zjga5VUkzjgpLjgrPjg5Tjg7zjgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ+OCq+ODrOODs+ODgOODvOWQjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICflkIzjgZjlkI3liY3jga7jgqvjg6zjg7Pjg4Djg7zjga/ml6LjgavlrZjlnKjjgZfjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ+aoqemZkOOCsOODq+ODvOODlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAn44OB44Kx44OD44OI44Gu5LqI57SEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICfjg6vjg7zjg6snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICfmnInlirnjgarjgq3jg6Xjg7zjgpLpgbjmip7jgZfjgabkuIvjgZXjgYTjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICfmpJzntKLlsZ7mgKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICfjg4HjgrHjg4Pjg4jjg4fjg7zjgr/jgavln7rjgaXjgYTjgabjgZPjga7jgqvjg6zjg7Pjg4Djg7zjgafoh6rli5XkuojlrprjgpLkvZzmiJDjgZnjgovjgZ/jgoHjga7jg6vjg7zjg6vjgpLlrprnvqnjgZfjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICfjg6vjg7zjg6vjgpLov73liqAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ+OCguOBo+OBqOWkmuOBjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAn44KC44Gj44Go5bCR44Gq44GPJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ+S6iOe0hOOBrueZu+mMsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICfjgqvjg6zjg7Pjg4Djg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ+acieWKueWMluOBleOCjOOBn+OCq+ODrOODs+ODgOODvOOBjOWkmuOBmeOBjuOBvuOBmSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ+mAsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ+aciOmWk+OCv+OCpOODoOODqeOCpOODsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAn6YCx6ZaT44K/44Kk44Og44Op44Kk44OzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ+aXpeS4reOCv+OCpOODoOODqeOCpOODsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAn44Kr44Os44Oz44OA44O8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICfliYrpmaQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ+ihqOekuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ+WfuuacrOaDheWgsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICfml6XjgavjgaEv5pmC6ZaTJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ+mgu+W6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAn5LqI57SE44Gu44Kk44Oz44Od44O844OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgpLjgqLjg4Pjg5fjg63jg7zjg4knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ+S6iOe0hOOBruOCpOODs+ODneODvOODiCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICfkuojntITjga7nmbvpjLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc15pelJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnQ2FsZW5kYXJJROOBjOOBquOBhCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAn44GC44Gq44Gf44Gv44GT44Gu44Kr44Os44Oz44OA44O844Gr44Ki44Kv44K744K544Gn44GN44G+44Gb44KT77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgpLnt6jpm4YnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ+OCq+ODrOODs+ODgOODvOOBruabtOaWsOS4reOBq+OCqOODqeODvOOBjOeZuueUn+OBl+OBvuOBl+OBnyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ+OCq+ODrOODs+ODgOODvOioreWumuODleOCoeOCpOODq+OCkuiqreOBv+i+vOOCgeOBvuOBm+OCk+OBp+OBl+OBn+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICfjgYLjgarjgZ/jga7jg5XjgqHjgqTjg6vjgYzmnInlirnjgafjgYLjgovjgZPjgajjgpLnorroqo3jgZfjgabkuIvjgZXjgYTjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAn44Kr44Os44Oz44OA44O844KS44Kk44Oz44Od44O844OI44Gn44GN44G+44Gb44KT44Gn44GX44GfISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgpLjgqTjg7Pjg53jg7zjg4ghJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdDYWxlbmRhcklE44GM5b+F6KaBISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNeWIhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNeWIhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMOWIhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzHmmYLplpMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAn5YWo44Gm44Gu5LqI57SEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ+engeOBq+WJsuOCiuW9k+OBpuOCieOCjOOBn+S6iOWumic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAn44GC44Gq44Gf44Gr5Ymy44KK5b2T44Gm44KJ44KM44Gf5LqI57SE44Gg44GR44KS6KGo56S644GZ44KL77yBIOioreWumuOCkuWkieabtOOBl+OBpuS4i+OBleOBhOOAgic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICfkuojntITjgYzopovjgaTjgYvjgorjgb7jgZvjgpPvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICfjgarjgZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAn5q+O5pelJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICfmr47pgLEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICfmr47mnIgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ+avjuW5tCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICfjgqvjgrnjgr/jg6AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICfmr47ml6UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAn5q+O6YCxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICfmr47mnIgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAn5q+O5bm0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAnZm9yICVzIHRpbWUocyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJyVzIOOBvuOBpyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICfpgJrnn6XjgarjgZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzIOWIhuWJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIOaZgumWk+WJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMg5pel5YmNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMg6YCx6ZaT5YmNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICfmqKnpmZDjgYzjgarjgYQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ+ODgeOCseODg+ODiOS6iOe0hOOCkuWJiumZpOOBp+OBjeOBvuOBm+OCk++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICfmqKnpmZDjgYzjgarjgYQhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ+aoqemZkOOBjOOBquOBhCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnJXPjgYzjgYLjgorjgb7jgZvjgpPvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ+OBneOBruOCiOOBhuOBquODpuODvOOCtuODvOOBr+OBguOCiuOBvuOBm+OCk++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ+eEoeWKueOBquOCq+ODrOODs+ODgOODvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICfnhKHlirnjgapVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAn5pu05pawICjliIYpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICfkuojntITjgqvjg6zjg7Pjg4Djg7zjga7ooajnpLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ+S6iOe0hOOBrumAmuefpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICfkuojntITjg6rjgrnjg4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICfkuojntITjg6rjgrnjg4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ+S6iOe0hOmAmuefpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICfkuojntIQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICfjgqvjg6zjg7Pjg4Djg7znrqHnkIbjga7nlLvpnaInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfkuojntITjgpLnmbvpjLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ+S6iOe0hOOBrue3qOmbhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAn5Yid5Zue5b+c562U5pyf6ZmQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ+S6iOe0hOeUu+mdouOCkuOCpOODs+ODneODvOODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ+anmOOAheOBquOCq+ODrOODs+ODgOODvOOCkueuoeeQhuOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICflhajjgabjga7kuojntITjga7kuIDopqcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAn5L+d55WZ5pyf6ZmQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICfjg5fjg6njgrDjgqTjg7PmpJzntKInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICfjgqrjg7zjg4jjgrPjg7Pjg5fjg6rjg7zjg4jnlKjjga7jg5fjg6njgrDjgqTjg7PmpJzntKLjg6Ljgrjjg6Xjg7zjg6snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAn5YWs6ZaL44GZ44KL44Kr44Os44Oz44OA44O8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICflhazplovjgZnjgovjgqvjg6zjg7Pjg4Djg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICfjg6rjgr3jg7zjgrnooajnpLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAn44Oq44K944O844K56KGo56S6IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ+ino+axuuacn+mZkCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICfmm7TmlrDml6XmmYInOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5iX05PX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdWYXJzZWwgbWVkIHDDpW1pbm5lbHNlIG9tIGF2dGFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnRHUgdmlsIG1vdHRhIGVuIHZhcnNlbCBodmVyIGdhbmcgcMOlbWlubmVsc2VzdGlkc3B1bmt0ZXQgbsOlZXMgZm9yIGVuIGF2IGRpbmUgYXZ0YWxlci4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICdBZG1pbmlzdHJlciB2YXJzbGVyIG9tIGF2dGFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdBdnRhbGVmaWx0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0dydXBwZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1Jlc3N1cnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdWYXJzbGluZ2VyIHNlbmRlcyB0aWwgZW4gc2Frc2JlaGFuZGxlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ0ZvciDDpSBoZW50ZSBkZSBmw7hyc3RlIDIwIHRlZ25lbmUgaSBhdnRhbGVvdmVyc2tyaWZ0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnRm9yIMOlIGhlbnRlIGF2dGFsZWF0dHJpYnV0dGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnRm9yIMOlIGhlbnRlIGthbGVuZGVyYXR0cmlidXR0ZXQnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnQWdlbmRhb3ZlcnNpa3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0thbGVuZGVyYWRtaW5pc3RyYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnTGVnZyB0aWwgYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnRmFyZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdTbHV0dGRhdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwZWF0J30gPSAnR2plbnRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ0luZ2VuIGthbGVuZGVyZSBmdW5uZXQuIFbDpnIgdmVubmxpZyDDpSBsZWdnZSB0aWwgZW4ga2FsZW5kZXIgZsO4cnN0IHZlZCDDpSBiZW55dHRlIHNpZGVuIGZvciBrYWxlbmRlcmFkbWluaXN0cmFzam9uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0F2dGFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50J30gPSAnRGV0dGUgZXIgZW4gZ2plbnRhZ2VuZGUgYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnw5huc2tlciBkdSBrdW4gw6UgcmVkaWdlcmUgZGVubmUgYXZ0YWxlbiBlbGxlciBhbGxlIGZvcmVrb21zdGVuZT8gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ0FsbGUgZm9yZWtvbXN0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICdCYXJlIGRlbm5lIGF2dGFsZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ0thbGVuZGVyYWRtaW5pc3RyYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdLYWxlbmRlcm92ZXJzaWt0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdMZWdnIHRpbCBueSBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdMZWdnIHRpbCBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0ZXIgYXZ0YWxlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdLYWxlbmRlcmltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ0xhc3Qgb3BwIGthbGVuZGVya29uZmlndXJhc2pvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdJbXBvcnRlciBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0ZpbHRlciBmb3Iga2FsZW5kZXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1Nrcml2ZWJlc2t5dHRldDogYnJ1a2VyZSBrYW4gc2Ugb2cgZWtzcG9ydGVyZSBhbGxlIGF2dGFsZXIgaSBrYWxlbmRlcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnT3BwcmV0dDogYnJ1a2VyZSBrYW4gb3BwcmV0dGUgb2cgc2xldHRlIGF2dGFsZXIgaSBrYWxlbmRlcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnTGVzL3Nrcml2OiBicnVrZXJlIGthbiBzZWx2IGFkbWluaXN0cmVyZSBrYWxlbmRlcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICdVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAnRWtzcG9ydGVyIGthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnTGFzdCBuZWQga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnS29waWVyIG9mZmVudGxpZyBrYWxlbmRlciBVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ0thbGVuZGVybmF2bic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdLYWxlbmRlciBtZWQgc2FtbWUgbmF2biBla3Npc3RlcmVyIGFsbGVyZWRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnUmV0dGlnaGV0ZXJzZ3J1cHBlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdBdnRhbGVyIHRpbGtueXR0ZXQgc2FrZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1JlZ2VsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAnU8O4a2VhdHJpYnV0dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnTGVnZyB0aWwgcmVnZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ0ZsZXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICdGw6ZycmUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnTGVnZyB0aWwgbnkgYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0thbGVuZGVyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnRm9yIG1hbmdlIGFrdGl2ZSBrYWxlbmRlcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdVa2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ0hvcHAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAnVmlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGUvVGltZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVrdmVucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ0h2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ0F2dGFsZWltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAnTGFzdCBvcHAga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGVyIGF2dGFsZXInOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTnkgYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdTbmFydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc1IGRhZ2VyJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdBbGRyaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdIdmVyIGRhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBXZWVrJ30gPSAnSHZlciB1a2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdIdmVyIG3DpW5lZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAnSHZlcnQgw6VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ1RpbHBhc3NldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RhZ2xpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdVa2VudGxpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnTcOlbmVkbGlnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ8OFcmxpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ2h2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICclcyBnYW5nKGVyKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICd0aWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnLi4uIGdhbmcoZXIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAndGlsICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ0luZ2VuIHZhcnNsaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dHQoZXIpIGbDuHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyB0aW1lKHIpIGbDuHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzIGRhZyhlcikgZsO4cic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHVrZShyKSBmw7hyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAnZsO4ciBhdnRhbGVuIGJlZ3lubmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnZXR0ZXIgYXQgYXZ0YWxlbiBoYXIgYmVneW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2bDuHIgYXZ0YWxlbiBzbHV0dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2V0dGVyIGF0IGF2dGFsZW4gZXIgc2x1dHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEltcG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMnfSA9ICdJbmdlbiByZXR0aWdoZXRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNoZWNrIHRoZSBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdPdmVyc2lrdHNzaWRlIGZvciBhdnRhbGVrYWxlbmRlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ1ZhcnNsZXIgb20gYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdTaWRlIGZvciBhdnRhbGVyZWdpc3RyZXJpbmcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdBdnRhbGVsaXN0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ0F2dGFsZWxpc3RlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnVmFyc2xlciBvbSBhdnRhbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnQXZ0YWxlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ1NpZGUgZm9yIGthbGVuZGVyYWRtaW5pc3RyYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnVmVsZyBodmlsa2UgdHlwZXIgYXZ0YWxlciBzb20gZHUgdmlsIG1vdHRhIHZhcnNsZXIgb20uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdPcHByZXR0IGVuIGF2dGFsZSBzb21lciBrb2JsZXQgdGlsIGRlbm5lIHNha2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnQWRtaW5pc3RyYXNqb24gYXYgYXZ0YWxldmFyc2xpbmdlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdPcHByZXR0IGVuIG55IGF2dGFsZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VuZHJlIGF2dGFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnRsO4cnN0ZSByZXNwb25zdGlkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ1NpZGUgZm9yIGF2dGFsZWltcG9ydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnS29ibGUgYXZ0YWxlciBvZyBzYWtlciBtZWQgZW4gIm5vcm1hbCIgbGVua2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdBZG1pbmlzdHJlcmUgdWxpa2Uga2FsZW5kZXJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdPdmVyc2lrdCBvdmVyIGFsbGUgYXZ0YWxlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVmVudGV0aWRzcHVua3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdPZmZlbnRsaWcga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ09mZmVudGxpZyBrYWxlbmRlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdSZXNzdXJzb3ZlcnNpa3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUmVzc3Vyc292ZXJzaWt0IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ0zDuHNuaW5nc3RpZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdPcHBkYXRlcmluZ3N0aWQnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnBsX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ1phcnrEhWR6YW5pZSBQb3dpYWRvbWllbmlhbWkgV3lkYXJ6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0ZpbHRyIHd5ZGFyemXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnWmVzcMOzxYInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICdaYXNvYnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdQb3dpYWRhbWlhaiB1xbx5dGtvd25pa2EgbyBwb2plZHluY3p5bSB3eWRhcnplbml1LCBwcnp5IHXFvHljaXUgd3licmFuZWdvIHRyYW5zcG9ydHUsIHR5bGtvIHJheiBkemllbm5pZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdQb3dpYWRvbWllbmlhIHPEhSB3eXN5xYJhbmUgZG8gYWdlbnRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAnQnkgcG9icmHEhyBwaWVyd3N6ZSAyMCB6bmFrw7N3IHR5dHXFgnUgd3lkYXJ6ZW5pYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICdCeSBwb2JyYcSHIGF0cnlidXQgd3lkYXJ6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGNhbGVuZGFyIGF0dHJpYnV0ZSd9ID0gJ0J5IHBvYnJhxIcgYXRyeWJ1dCBrYWxlbmRhcnphJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1ByemVnbMSFZCB0ZXJtaW5hcnphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdaYXJ6xIVkemFqIGthbGVuZGFyemFtaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdEb2RhaiB3eWRhcnplbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnS29sb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdEYXRhIHpha2/FhGN6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdQb3d0YXJ6YWonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnTmllIHpuYWxlemlvbm8ga2FsZW5kYXJ6eS4gUHJvc3rEmSBkb2RhxIcgbmFqcGllcncga2FsZW5kYXJ6IHXFvHl3YWrEhWMgc3Ryb255IFphcnrEhWR6YW5pZSBLYWxlbmRhcnphbWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnV3lkYXJ6ZW5pZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50J30gPSAnVG8gcG93dGFyemFqxIVjZSB3eWRhcnplbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnQ3p5IGNoY2lhxYJiecWbIGVkeXRvd2HEhyB0eWxrbyB0byB3eXN0xIVwaWVuaWUgY3p5IHdzenlzdGtpZT8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnV3N6eXN0a2llIHd5c3TEhXBpZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ1R5bGtvIHRvIHd5c3TEhXBpZW5pZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnWmFyesSFZHphbmllIEthbGVuZGFyemFtaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1ByemVnbMSFZCBLYWxlbmRhcnp5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdEb2RhaiBub3d5IEthbGVuZGFyeic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdEb2RhaiBLYWxlbmRhcnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ1phaW1wb3J0dWogV3lkYXJ6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnQgS2FsZW5kYXJ6YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ1cgdHltIG1pZWpzY3UgbW/FvGVzeiB6YcWCYWRvd2HEhyBwbGlrIGtvbmZpZ3VyYWN5am55IGJ5IHphaW1wb3J0b3dhxIcga2FsZW5kYXJ6IHRvIHN5c3RlbXUuIFBsaWsgbXVzaSBiecSHIHcgZm9ybWFjaWUgLnltbCwgcG9kb2JuaWUgamFrIHd5ZWtzcG9ydG93YW55IG1vZHXFgiB6YXJ6xIVkemFuaWEga2FsZW5kYXJ6ZW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnV2N6eXRhaiBrb25maWd1cmFjasSZIGthbGVuZGFyemEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnWmFpbXBvcnR1aiBLYWxlbmRhcnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICdGaWx0ciBkbGEga2FsZW5kcnpheSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICdXIHphbGXFvG5vxZtjaSBvZCBwb2xhIGdydXB5LCBzeXN0ZW0gdWRvc3TEmXBuaSB1xbx5dGtvd25pa29tIGRvc3TEmXAgZG8ga2FsZW5kYXJ6YSB6Z29kbmllIHogaWNoIHVwcmF3bmllbmlhbWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnVHlsa28gZG8gb2Rjenl0dTogdcW8eXRrb3duaWN5IG1vZ8SFIHdpZHppZcSHIGkgZWtzcG9ydG93YcSHIHdzenlzdGtpZSB3eWRhcnplbmlhIHcga2FsZW5kYXJ6dS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICdQcnplbmllxZsgbmE6IHXFvHl0a293bmljeSBtb2fEhSBtb2R5Zmlrb3dhxIcgd3lkYXJ6ZW5pYSB3IGthbGVuZGFyenUsIGplZG5hayBiZXogbW/FvGxpd2/Fm2NpIHptaWFueSB3eWJyYW5lZ28ga2FsZW5kYXJ6YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1V0d8Ozcno6IHXFvHl0a293bmljeSBtb2fEhSB0d29yennEhyBpIHVzdXdhxIcgd3lkYXJ6ZW5pYSB3IGthbGVuZGFyenUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICdDenl0YWovWmFwaXN6OiB1xbx5dGtvd25pY3kgbW9nxIUgemFyesSFZHphxIcgc2FteW0ga2FsZW5kYXJ6ZW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdXeWVrc3BvcnR1aiBrYWxlbmRhcnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICfFmmNpxIVnbmlqIGthbGVuZGFyeic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdTa29waXVqIFVSTCBwdWJsaWN6bmVnbyBrYWxlbmRhcnphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdOYXp3YSBrYWxlbmRhcnphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ0thbGVuZGFyeiB6IHTEhSBuYXp3xIUganXFvCBpc3RuaWVqZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBhIHVwcmF3bmllxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ1d5ZGFyemVuaWEgWmfFgm9zemXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVndcWCYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICdVxbx5aiBvcGNqaSBwb25pxbxlaiBieSB6YXfEmXppxIcgZGxhIGpha2ljaCB6Z8WCb3N6ZcWEIGLEmWTEhSB0d29yem9uZSBhdXRvbWF0eWN6bmUgd3lkYXJ6ZW5haS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ1Byb3N6xJkgd3licmHEhyB3YcW8bsSFIGtvbGVqa8SZLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0F0cnlidXR5IHd5c3p1a2l3YW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ0RlZmluaXVqZSByZWd1xYJ5IGRsYSBhdXRvbWF0eWN6bmVnbyB0d29yemVuaWEgd3lkYXJ6ZcWEIHcgdHltIGthbGVuZGFyenUsIHcgemFsZcW8bm/Fm2NpIG9kIGRhbnljaCB6Z8WCb3N6ZW5pYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICdEb2RhaiByZWd1xYLEmSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnV2nEmWNlaic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTW5pZWonOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnRG9kYWogbm93ZSB3eWRhcnplbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0thbGVuZGFyemUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ1pieXQgZHXFvG8gYWt0eXdueWNoIGthbGVuZGFyenknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnUHJvc3rEmSB3ecWCxIVjennEhyBraWxrYSBsdWIgendpxJlrc3p5xIcgbGltaXQgdyBrb25maWd1cmFjamkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdUeWR6aWXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ1dpZG9rIE1pZXNpxJljem55JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICdXaWRvayBUeWdvZG5pb3d5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ1dpZG9rIER6aWVubnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1ByemVqZMW6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdad29sbmlqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdQb2thxbwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICdQb2RzdGF3b3dlIGluZm9ybWFjamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0YS9DemFzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICdQcm9zesSZIHVzdGF3acSHIHTEmSB3YXJ0b8WbxIcgcHJ6ZWQgZGF0xIUgemFrb8WEY3plbmlhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICdQcm9zesSZIHVzdGF3acSHIHTEmSB3YXJ0b8WbxIcgcG8gZGFjaWUgcm96cG9jesSZY2lhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnVG8gamVzdCB3eXN0xIVwaWVuaWUgcG93dGFyemFsbmVnbyB3eWRhcnplbmlhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0tsaWtuaWogdHV0YWogYnkgc3ByYXdkemnEhyB3eWRhcnplbmllIGfFgsOzd25lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdLbGlrbmlqIHR1dGFqIGJ5IGVkeXRvd2HEhyB3eWRhcnplbmllIGfFgsOzd25lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdDesSZc3RvdGxpd2/Fm8SHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnS2HFvGR5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnQ3p5IGplc3RlxZsgcGV3aWVuLCDFvGUgY2hjZXN6IHVzdW7EhcSHIHRvIHd5ZGFyemVuaWU/IFRlaiBvcGVyYWNqaSBuaWUgbW/FvG5hIGNvZm7EhcSHLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSW1wb3J0IFd5ZGFyemXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ1djenl0YW55IHBsaWsgbXVzaSBwb3NpYWRhxIcgcHJhd2lkxYJvd3kgZm9ybWF0IGlDQUwgKC5pY3MpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICdKZcWbbGkgc3p1a2FueSBLYWxlbmRhcnogbmllIGplc3QgdHV0YWogd3nFm3dpZXRsb255LCBwcm9zesSZIHVwZXduacSHIHNpxJksIMW8ZSBwb3NpYWRhc3ogcHJ6eSBuYWptbmllaiB1cHJhd25pZW5pZSBcJ1V0d8OzcnpcJy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICdaYWt0dWFsaXpvd2HEhyBpc3RuaWVqxIVjZSB3eWRhcnplbmlhPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ1dzenlzdGtpZSBpc3RuaWVqxIVjZSB3eWRhcnplbmlhIHcga2FsZW5kYXJ6dSB6IHR5bSBzYW15bSBVbmlxdWVJRCB6b3N0YW7EhSBuYWRwaXNhbmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ1djenl0YWoga2FsZW5kYXJ6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0IHd5ZGFyemXFhCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOb3dlIHd5ZGFyemVuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ05pZWJhd2VtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZG5pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ1Bvd2lhZG9taWVuaWUgbyB0ZWogc2FtZWogbmF6d2llIGp1xbwgaXN0bmllamUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBZ2VuY2kgKHphc29ieSksIHd5YnJhbmkgdyByYW1hY2ggd3lkYXJ6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdXc3p5c2N5IGFnZW5jaSBwb3NpYWRhasSFY3kgKHByenluYWptbmllaikgcHJhd28gb2Rjenl0dSB6ZGFyemVuaWEgKGthbGVuZGFyemEpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnV3N6eXNjeSBhZ2VuY2kgeiBwcmF3ZW0gemFwaXN1IHd5ZGFyemVuaWEgKGthbGVuZGFyemEpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdTeXN0ZW0gbmllIGJ5xYIgdyBzdGFuaWUgc3R3b3J6ecSHIEthbGVuZGFyemEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnQnJhayBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdOaWUgbWFzeiBkb3N0xJlwdSBkbyB0ZWdvIGthbGVuZGFyemEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdFZHl0dWogS2FsZW5kYXJ6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdCxYLEhWQgYWt0dWFsaXphY2ppIGthbGVuZGFyemEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdOaWUgbW/FvG5hIG9kY3p5dGHEhyBwbGlrdSBrb25maWd1cmFjeWpuZWdvIGthbGVuZGFyemEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ1Byb3N6xJkgdXBld25pxIcgc2nEmSwgxbxlIHBsaWsgamVzdCB3xYJhxZtjaXd5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdOaWUgbW/FvG5hIHphaW1wb3J0b3dhxIcga2FsZW5kYXJ6YSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAnS2FsZW5kYXJ6IFphaW1wb3J0b3dhbnkhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdQb3RyemVibmUgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOaWUgbW/FvG5hIG9kY3p5dGHEhyBpbmZvcm1hY2ppIGRsYSBwb2RhbmVnbyBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdQb3ByYXduaWUgemFpbXBvcnRvd2FubyAlcyB3eWRhcnplxYQgZG8ga2FsZW5kYXJ6YSAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IG1pbnV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1IG1pbnV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIG1pbnV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBnb2R6aW5hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1dzenlzdGtpZSB3eWRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ1d5ZGFyemVuaWEgcHJ6eXBpc2FuZSBkbyBtbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdXecWbd2lldGxhbmllIHd5ZGFyemXFhCBwcnp5cGlzYW55Y2ggZG8gQ2llYmllISBabWllxYQgdXN0YXdpZW5pYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICdXeWRhcnplbmllIG5pZSBvZG5hbGV6aW9uZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdOaWdkeSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdDb2R6aWVubmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdDbyB0eWR6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnQ28gbWllc2nEhWMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ0NvIHJvayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdXxYJhc25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRHppZW5uaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAnVHlnb2RuaW93byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnTWllc2nEmWN6bmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ1JvY3puaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdrYcW8ZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAnZG9ww7NraSAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnYcW8IGRvICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ0JyYWsgcG93aWFkb21pZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dCh5KSBwcnplZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIGdvZHppbih5KSBwcnplZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZG5pKGR6aWXFhCkgcHJ6ZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclcyB0eWdvZG5pZSBwcnplZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ3phbmltIHd5ZGFyemVuaWUgcm96cG9jem5pZSBzacSZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAncG8gcm96cG9jesSZY2l1IHd5ZGFyemVuaXUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAncHJ6ZWQgemFrb8WEY3plbmllbSB3eWRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ3BvIHpha2/FhGN6ZW5pdSB3eWRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnQnJhayB1cHJhd25pZcWEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdOaWUgbW/FvG5hIHVzdW7EhcSHIHd5ZGFyemVuaWEgZGxhIHpnxYJvc3plbmlhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICdCcmFrIHVwcmF3bmllxYQhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ0JyYWsgdXByYXduaWXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICdTeXN0ZW0gbmllIGJ5xYIgdyBzdGFuaWUgemFpbXBvcnRvd2HEhyBwbGlrdSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNoZWNrIHRoZSBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPSAnUHJvc3rEmSBzcHJhd2R6acSHIGxvZ2kgZGxhIGRva8WCYWRuaWVqc3p5Y2ggaW5mb3JtYWNqaS4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCB3acSZY2VqJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnQnJhayAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ05pZSBtYSB0YWtpZWdvIHXFvHl0a293bmlrYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdOaWV3xYJhxZtjaXd5IGthbGVuZGFyeiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnTmlld8WCYcWbY2l3eSBVUkwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0LFgsSFZCBwb2RjemFzIGVrc3BvcnRvd2FuaWEga2FsZW5kYXJ6YSEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdPZMWbd2llxbxhaiAobWludXR5KSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnU3Ryb25hIHBvZHN1bW93dWrEhWNhIEthbGVuZGFyeiBXeWRhcnplxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ1Bvd2lhZG9taWVuaWEgV3lkYXJ6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdFa3JhbiBlZHljamkgd3lkYXJ6ZcWELic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnTGlzdGEgd3lkYXJ6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnTGlzdGEgd3lkYXJ6ZcWELic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnUG93aWFkb21pZW5pYSB3eWRhcnplxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnV3lkYXJ6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ0VrcmFuIHphcnrEhWR6YW5pYSBLYWxlbmRhcnplbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdXeWJpZXJ6LCBkbGEgamFraWVnbyByb2R6YWp1IHptaWFuIHcgd3lkYXJ6ZW5pYWNoLCBjaGNlc3ogb3RyenlteXdhxIcgcG93aWFkb21pZW5pYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ1V0d8Ozcnogbm93eSBrYWxlbmRhcnogd3lkYXJ6ZcWEIHBvxYLEhWN6b255IHogdHltIHpnxYJvc3plbmllbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ1V0d8OzcnogaSB6YXJ6xIVkemFqIHBvd2lhZG9taWVuaWFtaSB3eWRhcnplxYQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAnVXR3w7NyeiBub3dlIHd5ZGFyemVuaWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdFZHl0dWogd3lkYXJ6ZW5pZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnQ3phcyBwaWVyd3N6ZWogb2Rwb3dpZWR6aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdFa3JhbiBpbXBvcnR1IHd5ZGFyemXFhC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnUHJ6ZWdsxIVkIHdzenlzdGtpY2ggd3lkYXJ6ZcWELic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdDemFzIG9jemVraXdhbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnS2FsZW5kYXJ6IFB1YmxpY3pueSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnS2FsZW5kYXJ6IHB1YmxpY3pueS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdQcnplZ2zEhWQgemFzb2LDs3cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUHJ6ZWdsxIVkIHphc29iw7N3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ0N6YXMgcm96d2nEhXphbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnV3liw7NyIHJvZHphanUgdHJhbnNwb3J0dSBkbGEgcG93aWFkb21pZcWEIG8gd3lkYXJ6ZW5pYWNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdDemFzIGFrdHVhbGl6YWNqaSc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdOb3RpZmljYcOnw6NvIGRlIGxlbWJyZXRlIGRvIGNvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdWb2PDqiByZWNlYmVyw6EgdW1hIG5vdGlmaWNhw6fDo28gdG9kYSB2ZXogcXVlIG8gdGVtcG8gZGUgbGVtYnJldGUgcGFyYSB1bSBkZSBzZXVzIGNvbXByb21pc3NvcyBmb3IgYXRpbmdpZG8gLic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ0dlcmVuY2lhbWVudG8gZGUgbm90aWZpY2HDp8OjbyBkbyBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ0FxdWkgdm9jw6ogcG9kZSBmYXplciB1cGxvYWQgZGUgdW0gYXJxdWl2byBkZSBjb25maWd1cmHDp8OjbyBwYXJhIGltcG9ydGFyIG5vdGlmaWNhw6fDtWVzIGRlIGNvbXByb21pc3NvIHBhcmEgbyBzZXUgc2lzdGVtYS4gTyBhcnF1aXZvIGRldmUgZXN0YXIgbm8gZm9ybWF0byAueW1sIGNvbW8gZXhwb3J0YWRvIHBlbG8gbcOzZHVsbyBkZSBub3RpZmljYcOnw6NvIGRlIGNvbXByb21pc3NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0FxdWkgdm9jw6ogcG9kZSBlc2NvbGhlciBxdWFpcyBldmVudG9zIGlyw6NvIGFjaW9uYXIgZXNzYSBub3RpZmljYcOnw6NvLiBVbSBmaWx0cm8gZGUgY29tcHJvbWlzc28gYWRpY2lvbmFsIHBvZGUgc2VyIGFwbGljYWRvIGFiYWl4byBwYXJhIGVudmlhciBhcGVuYXMgY29tcHJvbWlzc29zIGNvbSBkZXRlcm1pbmFkb3MgY3JpdMOpcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAnRmlsdHJhciBDb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnVGltZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1JlY3Vyc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdOb3RpZmljYXIgbyB1c3XDoXJpbyBhcGVuYXMgdW1hIHZleiBwb3IgZGlhIHNvYnJlIHVtIMO6bmljbyBjb21wcm9taXNzbyB1c2FuZG8gdW0gdHJhbnNwb3J0ZSBzZWxlY2lvbmFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdBcyBub3RpZmljYcOnw7VlcyBzw6NvIGVudmlhZGFzIGEgdW0gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAnUGFyYSBvYnRlciBvcyAyMCBwcmltZWlyb3MgY2FyYWN0ZXJlcyBkbyB0w610dWxvIGRvIGNvbXByb21pc3NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ1BhcmEgb2J0ZXIgbyBhdHJpYnV0byBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGNhbGVuZGFyIGF0dHJpYnV0ZSd9ID0gJ1BhcmEgb2J0ZXIgbyBhdHJpYnV0byBjYWxlbmTDoXJpbyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICdWaXPDo28gZ2VyYWwgZGEgQWdlbmRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdHZXJlbmNpYXIgQ2FsZW5kw6FyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ0FkaWNpb25hciBDb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ0Nvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0RhdGEgZmluYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwZWF0J30gPSAnUmVwZXRpcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICdOZW5odW0gY2FsZW5kw6FyaW8gZW5jb250cmFkby4gUG9yIGZhdm9yLCBwcmltZWlybyBhZGljaW9uZSB1bSBjYWxlbmTDoXJpbyB1c2FuZG8gYSBww6FnaW5hIGRlIEdlcmVuY2lhbWVudG8gZGUgQ2FsZW5kw6FyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0NvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFc3RlIMOpIHVtIGNvbXByb21pc3NvIHJlcGV0aWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnVm9jw6ogZGVzZWphIGVkaXRhciBhcGVuYXMgZXNzYSBvY29ycsOqbmNpYSBvdSB0b2RhcyBhcyBvY29ycsOqbmNpYXM/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ1RvZGFzIGFzIG9jb3Jyw6puY2lhcyAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICdBcGVuYXMgZXNzYSBvY29ycsOqbmNpYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnR2VyZW5jaWFtZW50byBkZSBDYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1Zpc8OjbyBnZXJhbCBkZSBDYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAnQWRpY2lvbmFyIG5vdm8gQ2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnQWRpY2lvbmFyIENhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBDb21wcm9taXNzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAnSW1wb3J0YXIgQ2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdBcXVpIHZvY8OqIHBvZGUgY2FycmVnYXIgdW0gYXJxdWl2byBkZSBjb25maWd1cmHDp8OjbyBwYXJhIGltcG9ydGFyIHVtIGNhbGVuZMOhcmlvIHBhcmEgc2V1IHNpc3RlbWEuIE8gYXJxdWl2byBwcmVjaXNhIHNlciBlbSAueW1sICBjb21vIG8gZXhwb3J0YWRvIHBlbG8gbcOzZHVsbyBkZSBnZXJlbmNpYW1lbnRvIGRlIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ0NhcnJlZ2FyIGNvbmZpZ3VyYcOnw6NvIGRvIGNhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ0ltcG9ydGFyIENhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdHJvIHBhcmEgY2FsZW5kw6FyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ0RlcGVuZGVuZG8gZG8gY2FtcG8gZ3J1cG8sIG8gc2lzdGVtYSBsaWJlcmFyw6EgdXN1w6FyaW9zIHBhcmEgYWNlc3NhciBvIGNhbGVuZMOhcmlvIGRlIGFjb3JkbyBjb20gbyBuw612ZWwgZGUgcGVybWlzc8OjbyBkZWxlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdBcGVuYXMgbGVpdHVyYTogdXN1w6FyaW9zIHBvZGVtIHZlciBlIGV4cG9ydGFyIHRvZG9zIG9zIGNvbXByb21pc3NvcyBuZXNzZSBjYWxlbmTDoXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICdNb3ZlciBwYXJhOiB1c3XDoXJpb3MgcG9kZXLDo28gbW9kaWZpY2FyIGNvbXByb21pc3NvcyBubyBjYWxlbmTDoXJpbywgbWFzIHNlbSBhbHRlcmFyIGEgc2VsZcOnw6NvIGRvIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQ3JpYXI6IHVzdcOhcmlvcyBwb2RlbSBjcmlhciBlIGV4Y2x1aXIgY29tcHJvbWlzc29zIG5vIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnTGVpdHVyYS9lc2NyaXRhOiBvcyB1c3XDoXJpb3MgcG9kZW0gZ2VyZW5jaWFyIG8gcHLDs3ByaW8gY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRhciBjYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ0JhaXhhciBjYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdDb3BpYXIgVVJMIHB1YmxpY2EgZG8gY2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05vbWUgZG8gY2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnQ2FsZW5kw6FyaW8gY29tIG1lc21vIG5vbWUgasOhIGV4aXN0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBvIGRlIHBlcm1pc3PDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0NvbXByb21pc3NvcyBkZSBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICdSZWdyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICdVc2UgYXMgb3DDp8O1ZXMgYWJhaXhvIHBhcmEgZGltaW51aXIgcXVhaXMgY29tcHJvbWlzc29zIGRlIGNoYW1hZG8gc2Vyw6NvIGNyaWFkb3MgYXV0b21hdGljYW1lbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnUG9yIGZhdm9yLCBzZWxlY2lvbmUgdW1hIGZpbGEgdsOhbGlkYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdBdHJpYnV0b3MgZGEgcGVzcXVpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICdEZWZpbmlyIHJlZ3JhcyBwYXJhIGNyaWHDp8OjbyBhdXRvbcOhdGljYSBkZSBjb21wcm9taXNzb3MgbmVzdGUgY2FsZW5kw6FyaW8gYmFzZWFkbyBlbSBkYWRvcyBkZSBjaGFtYWRvLiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICdBZGljaW9uYXIgcmVncmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ01haXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ01lbm9zJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0FkaWNpb25hciBub3ZvIENvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0NhbGVuZMOhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnTXVpdG9zIGNhbGVuZMOhcmlvcyBhdGl2b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnUG9yIGZhdm9yLCBkZXNsaWd1ZSBhbGd1bnMgcHJpbWVpcm8gb3UgYXVtZW50ZSBvIGxpbWl0ZSBuYSBjb25maWd1cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ1NlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ0xpbmhhIGRlIHRlbXBvIGRvIG3DqnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ0xpbmhhIGRlIHRlbXBvIGRhIHNlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICdMaW5oYSBkZSB0ZW1wbyBkbyBkaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1B1bGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdSZWN1c2FyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdNb3N0cmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYcOnw6NvIGLDoXNpY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0YS9Ib3JhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IsIGNvbmZpZ3VyZSBvIHZhbG9yIGFudGVzIGRhIGRhdGEgZmluYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ1BvciBmYXZvciwgY29uZmlndXJlIG8gdmFsb3IgYW50ZXMgZGEgZGF0YSBpbmljaWFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnRXN0YSB1bWEgb2NvcnLDqm5jaWEgZGUgdW0gY29tcHJvbWlzc28gZGUgcmVwZXRpw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnQ2xpcXVlIGFxdWkgcGFyYSB2ZXIgbyBjb21wcm9taXNzbyBwYWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgZWRpdGFyIG8gY29tcHJvbWlzc28gcGFpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVxdcOqbmNpYSAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICdUb2Rvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUG9udG8gZGUgdGVtcG8gcmVsYXRpdm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnVGVtIGNlcnRlemEgcXVlIGRlc2VqYSByZW1vdmVyIGVzc2UgY29tcHJvbWlzc28/IEVzc2Egb3BlcmHDp8OjbyBuw6NvIHBvZGUgc2VyIGRlc2ZlaXRhLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSW1wb3J0YcOnw6NvIGRlIGNvbXByb21pc3Nvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ08gYXJxdWl2byBlbnZpYWRvIGRldmUgZXN0YXIgbm8gZm9ybWF0byB2w6FsaWRvIGlDYWwgKC5pY3MpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICdTZSBvIENhbGVuZMOhcmlvIGRlc2VqYWRvIG7Do28gZXN0aXZlciBsaXN0YWRvIGFxdWksIHBvciBmYXZvciBjZXJ0aWZpcXVlLXNlIHF1ZSB2b2PDqiB0ZW5oYSwgcGVsbyBtZW5vcyBwZXJtaXNzw7VlcyAiQ3JpYXIiLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ0F0dWFsaXphciBjb21wcm9taXNzb3MgZXhpc3RlbnRlcz8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICdUb2RvcyBvcyBjb21wcm9taXNzb3Mgbm8gY2FsZW5kw6FyaW8gY29tIG8gbWVzbW8gVW5pcXVlSUQgc2Vyw6NvIHNvYnJlc2NyaXRvLiAgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0NhcnJlZ2FyIGNhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBjb21wcm9taXNzb3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTm92byBDb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnRW0gYnJldmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBkaWFzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ05vbWUgZGEgbm90aWZpY2HDp8OjbyBqw6EgZXhpc3RlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnQXRlbmRlbnRlIChyZWN1cnNvcyksIHF1ZSBzw6NvIHNlbGVjaW9uYWRvcyBkZW50cm8gZG8gY29tcHJvbWlzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3Mgb3MgYWdlbnRlcyBjb20gKG5vIG3DrW5pbW8pIHBlcm1pc3PDo28gZGUgbGVpdHVyYSBkbyBjb21wcm9taXNzbyAoY2FsZW5kw6FyaW8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3Mgb3MgYXRlbmRlbnRlcyBjb20gcGVybWlzc8OjbyBkZSBlc2NyaXRhIG5vIGNvbXByb21pc3NvIChjYWxlbmTDoXJpbyknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ1Npc3RlbWEgbsOjbyBmb2kgY2FwYXogZGUgY3JpYXIgbyBDYWxlbmTDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdOZW5odW0gQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAnVm9jw6ogbsOjbyB0ZW0gYWNlc3NvIGEgZXN0ZSBjYWxlbmTDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0VkaXRhciBDYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnRXJybyBhbyBhdHVhbGl6YXIgbyBjYWxlbmTDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ07Do28gZm9pIHBvc3PDrXZlbCBsZXIgYXJxdWl2byBkZSBjb25maWd1cmHDp8OjbyBkbyBjYWxlbmTDoXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAnUG9yIGZhdm9yLCB2ZXJpZmlxdWUgc2UgbyBzZXUgYXJxdWl2byDDqSB2w6FsaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdOw6NvIGZvaSBwb3Nzw612ZWwgaW1wb3J0YXIgbyBjYWxlbmTDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAnQ2FsZW5kw6FyaW8gaW1wb3J0YWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnTmVjZXNzw6FyaW8gQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOw6NvIGZvaSBwb3Nzw612ZWwgb2J0ZXIgZGFkb3MgcGFyYSBkZXRlcm1pbmFkbyBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdJbXBvcnRhZG8gY29tIHN1Y2Vzc28gJXMgY29tcHJvbWlzc28ocykgcGFyYSBvIGNhbGVuZMOhcmlvICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIG1pbnV0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxIGhvcmEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAnVG9kb3Mgb3MgY29tcHJvbWlzc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ0NvbXByb21pc3NvcyBhdHJpYnXDrWRvcyBhIG1pbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAnTW9zdHJhciBhcGVuYXMgY29tcHJvbWlzc29zIGFzc2luYWRvcyBhIHZvY8OqISBBbHRlcmFyIGNvbmZpZ3VyYcOnw7Vlcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICdDb21wcm9taXNzbyBuw6NvIGVuY29udHJhZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTnVuY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnVG9kbyBkaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ1RvZG8gc2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnVG9kbyBNw6pzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdUb2RvIEFubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdDdXN0b21pemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0Rpw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAnU2VtYW5hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnTWVuc2FsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ0FudWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAndG9kb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICdkZSAlcyB0ZW1wbyhzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdhdMOpIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICdkZSAuLi4gdGVtcG8ocyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICdhdMOpICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ05lbmh1bWEgbm90aWZpY2HDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgbWludXRvKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMgaG9yYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZGlhKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgc2VtYW5hIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAnYW50ZXMgZG8gY29tcHJvbWlzc28gaW5pY2lhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ2RlcG9pcyBxdWUgbyBjb21wcm9taXNzbyBmb2kgaW5pY2lhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAnYW50ZXMgZG8gY29tcHJvbWlzc28gZW5jZXJyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnZGVwb2lzIHF1ZSBvIGNvbXByb21pc3NvIGZvaSBlbmNlcnJhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICdTZW0gcGVybWlzc8OjbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnTsOjbyDDqSBwb3Nzw612ZWwgZXhjbHVpciBvIGNvbXByb21pc3NvIGRvIGNoYW1hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ1NlbSBwZXJtaXNzw7VlcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnU2VtIHBlcm1pc3PDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnU2lzdGVtYSBuw6NvIGZvaSBjYXBheiBkZSBpbXBvcnRhciBhcnF1aXZvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdQb3IgZmF2b3IgdmVyaWZpcXVlIG8gbG9nIHBhcmEgbWFpcyBpbmZvcm1hw6fDtWVzLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkIG1haXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICdOZW5odW0gJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdVc3XDoXJpbyBuw6NvIGVuY29udHJhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdDYWxlbmTDoXJpbyBpbnZhbGlkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnVVJMIGludsOhbGlkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnSG91dmUgdW0gZXJybyBhbyBleHBvcnRhciBvIGNhbGVuZMOhcmlvISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ0F0dWFsaXphw6fDo28gKG1pbnV0b3MpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdQw6FnaW5hIGRlIHZpc8OjbyBnZXJhbCBkZSBjYWxlbmTDoXJpbyBkZSBjb21wcm9taXNzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYcOnw7VlcyBkZSBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG8gZG8gY2FsZW5kw6FyaW8gZGUgY29tcHJvbWlzc29zIHF1ZSBwcmVwYXJhIGEgZW50cmFkYSBkZSBub3RpZmljYcOnw6NvIHBhcmEgYXBvbnRhbWVudG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG8gZG8gY2FsZW5kw6FyaW8gZGUgY29tcHJvbWlzc29zIHF1ZSBhdHVhbGl6YSBvIGNoYW1hZG8gY29tIGRhZG9zIGRvIGNvbXByb21pc3NvIGRlIGNoYW1hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1RlbGEgZGUgZWRpw6fDo28gZGUgY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdMaXN0YSBkZSBjb21wcm9taXNzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdMaXN0YSBkZSBjb21wcm9taXNzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYcOnw7VlcyBkZSBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdDb21wcm9taXNzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICdUZWxhIGRlIGdlcmVuY2lhbWVudG8gZGUgY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ0VzY29saGEgcGFyYSBhIHF1YWwgdGlwbyBkZSBhbHRlcmHDp8O1ZXMgbm8gY29tcHJvbWlzc28gdm9jw6ogZGVzZWphIHJlY2ViZXIgbm90aWZpY2HDp8O1ZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdDcmlhciB1bSBub3ZvIGNvbXByb21pc3NvIGRlIGNhbGVuZMOhcmlvIGFzc29jaWFkbyBhIGVzc2UgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIG5vdGlmaWNhw6fDtWVzIGRlIGNvbXByb21pc3NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0NyaWFyIG5vdm8gY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnRGVmaW5lIHF1YWlzIGNvbHVuYXMgc2Vyw6NvIGV4aWJpZGFzIG5vIHdpZGdldCBkZSBjb21wcm9taXNzb3MgYXNzb2NpYWRvcyAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBDb25maWd1cmHDp8O1ZXMgcG9zc8OtdmVpczogMCA9IERlc2FiaWxpdGFkbyAsIDEgPSBEaXNwb27DrXZlbCwgMiA9IEF0aXZhZG8gcG9yIHBhZHLDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluZSB1bSDDrWNvbmUgY29tIGxpbmsgcGFyYSBhIHDDoWdpbmEgY29tIG1hcGEgZG8gZ29vZ2xlIGRhIGxvY2FsaXphw6fDo28gYXR1YWwgbmEgdGVsYSBkZSBlZGnDp8OjbyBkZSBjb21wcm9taXNzby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICdEZWZpbmUgb3MgdGlwb3MgZGUgZXZlbnRvcyBkZSBvYmpldG9zIHF1ZSBzZXLDo28gdHJhdGFkYXMgYXRyYXbDqXMgZGUgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ0RlZmluZSBhIGxpc3RhIGRlIHBhcsOibWV0cm9zIHF1ZSBwb2RlbSBzZXIgcGFzc2Fkb3MgcGFyYSBhIGZ1bsOnw6NvIGRlIGJ1c2NhIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBwYXJhIG8gdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBwYXJhIG8gdGlja2V0IGVzY2FsYXRpb24gdGltZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgcGFyYSBvIHRpY2tldCBwZW5kaW5nIHRpbWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICdEZWZpbmUgbyBwbHVnaW4gZG8gdGlja2V0IHBhcmEgY29tcHJvbWlzc29zIGRvIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VkaXRhciBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnVGVtcG8gZGUgcHJpbWVpcmEgcmVzcG9zdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnVGVsYSBkZSBpbXBvcnRhw6fDo28gZGUgY29tcHJvbWlzc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ0Fzc29jaWFyIGNvbXByb21pc3NvcyBlIGNoYW1hZG9zIGNvbW8gdW1hIHRpcG8gIk5vcm1hbCIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBvcyBldmVudG9zIGRlIGNvbXByb21pc3NvIHF1ZSBzZXLDo28gZXhpYmlkbyBuYSBHVUkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBvcyBldmVudG9zIGRvIGNhbGVuZMOhcmlvIGEgc2VyIGV4aWJpZG8gbmEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ0xpc3RhIGRlIGNvcmVzIGVtIFJHQiBoZXhhZGVjaW1hbCBxdWUgZXN0YXLDo28gZGlzcG9uw612ZWlzIHBhcmEgc2VsZcOnw6NvIGR1cmFudGUgYSBjcmlhw6fDo28gZG8gY2FsZW5kw6FyaW8uIENlcnRpZmlxdWUtc2UgZGUgYXMgY29yZXMgc8OjbyBlc2N1cmFzIG8gc3VmaWNpZW50ZSwgdGV4dG8gYnJhbmNhcyBwb2RlbSBzZXIgc29icmVwb3N0b3MuICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdHZXJlbmNpYXIgY2FsZW5kw6FyaW8gZGlmZXJlbnRlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICdOw7ptZXJvIG3DoXhpbW8gZGUgY2FsZW5kw6FyaW8gYXRpdm9zIG5hcyB2aXPDtWVzIGdlcmFpcy4gUG9yIGZhdm9yLCBub3RlIHF1ZSB1bSBudW1lcm8gZ3JhbmRlIGRlIGNhbGVuZMOhcmlvIGF0aXZvcyB2b2PDqiBwb2RlcsOhIHRlciBpbXBhY3RvcyBuYSBwZXJmb3JtYW5jZSBkbyBzZXJ2aWRvciBkZXZpZG8gYSBtdWl0YXMgY2hhbWFkYXMgc2ltdWx0w6JuZWFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPIE9UUlMgbsOjbyBzdXBvcnRhIGNvbXByb21pc3NvcyByZWNvcnJlbnRlcywgc2VtIGRhdGEgZGUgdMOpcm1pbm8gb3UgbyBuw7ptZXJvIGRlIGl0ZXJhw6fDtWVzLiBEdXJhbnRlIG8gcHJvY2Vzc28gZGUgaW1wb3J0YcOnw6NvLCBwb2RlIGFjb250ZWNlciBkbyBhcnF1aXZvIElDUywgY29udGVyIGVzc2VzIGNvbXByb21pc3Nvcy4gRW0gdmV6IGRpc3NvLCBvIHNpc3RlbWEgY3JpYSB0b2RvcyBvcyBjb21wcm9taXNzb3Mgbm8gcGFzc2FkbywgYWzDqW0gZGUgY29tcHJvbWlzc29zIHBhcmEgb3MgcHLDs3hpbW9zIG4gbWVzZXMgKDEyMCBtZXNlcy8xMCBhbm9zIHBvciBwYWRyw6NvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdWaXPDo28gZ2VyYWwgZGUgdG9kb3Mgb3MgY29tcHJvbWlzc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdEYXRhIGRlIHBlbmTDqm5jaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ1Blc3F1aXNhciBQbHVnaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICdNw7NkdWxvIGRlIHBlc3F1aXNhIGRlIGF1dG9jb21wbGV0YXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ0NhbGVuZMOhcmlvIHDDumJsaWNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdDYWxlbmTDoXJpbyBww7pibGljbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Zpc8OjbyBnZXJhbCBkZSByZWN1cnNvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdWaXPDo28gZ2VyYWwgZGUgcmVjdXJzbyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnTW9zdHJhIHVtIGxpbmsgbm8gbWVudSBwYXJhIGNyaWFyIHVtIGNvbXByb21pc3NvIGRlIGNhbGVuZMOhcmlvIHZpbmN1bGFkbyBhbyBjaGFtYWRvIG5hIHZpc8OjbyB0aWNrZXQgem9vbSBuYSBpbnRlcmZhY2UgZG8gYXRlbmRlbnRlLiBDb250cm9sZSBkZSBhY2Vzc28gYWRpY2lvbmFsIHBhcmEgbW9zdHJhciBvdSBuw6NvIG8gdsOtbmN1bG8gcG9kZSBzZXIgZmVpdG8gdXNhbmRvIGEgY2hhdmUgIkdyb3VwIiBlIG8gY29udGXDumRvIGNvbW8gInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gUGFyYSBhZ3J1cGFyIGl0ZW5zIGRlIG1lbnUgdXNlIGEgY2hhdmUgIkNsdXN0ZXJOYW1lIiBlIHBhcmEgbyBjb250ZcO6ZG8gcXVhbHF1ZXIgbm9tZSBxdWUgZGVzZWplIHZlciBuYSBpbnRlcmZhY2UgZG8gdXN1w6FyaW8uIFVzZSAiQ2x1c3RlclByaW9yaXR5IiBwYXJhIGNvbmZpZ3VyYXIgYSBvcmRlbSBkZSB1bSBkZXRlcm1pbmFkbyBjb25qdW50byBkZW50cm8gZG8gdG9vbGJhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ1RlbXBvIGRlIHNvbHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ1NlbGXDp8OjbyBkZSB0cmFuc3BvcnRlIHBhcmEgbm90aWZpY2HDp8O1ZXMgZGUgY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ0Rpc3BhcmEgYWRpw6fDo28gb3UgYXR1YWxpemHDp8OjbyBkZSBjb21wcm9taXNzb3MgZG8gY2FsZW5kw6FyaW8gYXV0b23DoXRpY28gY29tIGJhc2UgZW0gZGV0ZXJtaW5hZG9zIHRlbXBvcyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAnVGVtcG8gZGUgYXR1YWxpemHDp8Ojbyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnJ1X09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICfQo9Cy0LXQtNC+0LzQu9C10L3QuNC1INC+INC90LDQv9C+0LzQuNC90LDQvdC40Lgg0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAn0JLRiyDQv9C+0LvRg9GH0LjRgtC1INGC0LDQutC+0LUg0YPQstC10LTQvtC80LvQtdC90LjQtSDQstGB0Y/QutC40Lkg0YDQsNC3INC60L7Qs9C00LAg0L3QsNGB0YLRg9C/0LjRgiDRgdGA0L7QuiDQvdCw0L/QvtC80LjQvdCw0L3QuNGPINC/0L4g0L7QtNC90L7QvNGDINC40Lcg0LLQsNGI0LjRhSDQvNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLQu9C10L3QuNC1INGD0LLQtdC00L7QvNC70LXQvdC40Y/QvNC4INC+INC80LXRgNC+0L/RgNC40Y/RgtC40Y/RhSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ9CX0LTQtdGB0Ywg0LLRiyDQvNC+0LbQtdGC0LUg0LfQsNCz0YDRg9C30LjRgtGMINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90L3Ri9C5INGE0LDQudC7INC00LvRjyDQuNC80L/QvtGA0YLQsCDRg9Cy0LXQtNC+0LzQu9C10L3QuNC5INC+INC80LXRgNC+0L/RgNC40Y/RgtC40Y/RhSDQsiDQstCw0YjRgyDRgdC40YHRgtC10LzRgy4g0KTQsNC50Lsg0LTQvtC70LbQtdC9INCx0YvRgtGMINCyINGE0L7RgNC80LDRgtC1IC55bWwg0LIg0LrQvtGC0L7RgNC+0Lwg0Y3QutGB0L/QvtGA0YLQuNGA0YPRjtGC0YHRjyDQuNC3INC80L7QtNGD0LvRjyDRg9Cy0LXQtNC+0LzQu9C10L3QuNC5INC+INC80LXRgNC+0L/RgNC40Y/RgtC40Y/RhS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICfQl9C00LXRgdGMINCy0Ysg0LzQvtC20LXRgtC1INCy0YvQsdGA0LDRgtGMINC60LDQutC40LUg0YHQvtCx0YvRgtC40Y8g0LHRg9C00YPRgiDQstC60LvRjtGH0LDRgtGMINGN0YLQviDRg9Cy0LXQtNC+0LzQu9C10L3QuNC1LiDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C5INGE0LjQu9GM0YLRgCDQvNC+0LbQtdGCINCx0YvRgtGMINC/0YDQuNC80LXQvdGR0L0g0L3QuNC20LUg0LTQu9GPINC40YUg0L7RgtC/0YDQsNCy0LrQuCDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSwg0YPQtNC+0LLQu9C10YLQstC+0YDRj9GO0YnQuNGFINC30LDQtNCw0L3QvdC+0LzRgyDRg9GB0LvQvtCy0LjRji4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAn0KTQuNC70YzRgtGAINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW0nfSA9ICfQmtC+0LzQsNC90LTQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ9Cg0LXRgdGD0YDRgdGLJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAn0KPQstC10LTQvtC80LjRgtGMINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjyDRgtC+0LvRjNC60L4g0YDQsNC3INCyINC00LXQvdGMINC00LvRjyDQutCw0LbQtNC+0LPQviDQvtGC0LTQtdC70YzQvdC+0LPQviDQvNC10YDQvtC/0YDQuNGP0YLQuNGPLCDQuNGB0L/QvtC70YzQt9GD0Y8g0YPQutCw0LfQsNC90L3Ri9C5INGB0L/QvtGB0L7QsSDQtNC+0YHRgtCw0LLQutC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ9Cj0LLQtdC00L7QvNC70LXQvdC40Y8g0L3QsNC/0YDQsNCy0LvRj9GO0YLRgdGPINC6INCw0LPQtdC90YLRgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ9Cn0YLQvtCx0Ysg0L/QvtC70YPRh9C40YLRjCDQv9C10YDQstGL0LUgMjAg0YHQuNC80LLQvtC70L7QsiDRgtC10LzRiyDQvNC10YDQvtC/0YDQuNGP0YLQuNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ9Cn0YLQvtCx0Ysg0L/QvtC70YPRh9C40YLRjCDQsNGC0YDQuNCx0YPRgiDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAn0KfRgtC+0LHRiyDQv9C+0LvRg9GH0LjRgtGMINCw0YLRgNC40LHRg9GCINC60LDQu9C10L3QtNCw0YDRjyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICfQntCx0LfQvtGAINC/0L7QstC10YHRgtC60Lgg0LTQvdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICfQo9C/0YDQsNCy0LvRj9GC0Ywg0LrQsNC70LXQvdC00LDRgNGP0LzQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICfQlNC+0LHQsNCy0LjRgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICfQptCy0LXRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ9CU0LDRgtCwINC+0LrQvtC90YfQsNC90LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICfQn9C+0LLRgtC+0YDQtdC90LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICfQndC1INC90LDQt9C90LDRh9C10L0g0LrQsNC70LXQvdC00LDRgNGMLiDQlNC+0LHQsNCy0YzRgtC1INC60LDQu9C10L3QtNCw0YDRjCDQuNGB0L/QvtC70YzQt9GD0Y8g0Y3QutGA0LDQvSDRg9C/0YDQsNCy0LvQtdC90LjRjyDQutCw0LvQtdC90LTQsNGA0Y/QvNC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ9Ct0YLQviDQv9C+0LLRgtC+0YDRj9GO0YnQtdC10YHRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAn0JLRiyDQttC10LvQsNC10YLQtSDRgNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDRgtC+0LvRjNC60L4g0YLQtdC60YPRidC10LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSDQuNC70Lgg0LLRgdC1INC10LPQviDQv9C+0LLRgtC+0YDQtdC90LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICfQktGB0LUg0LLRhdC+0LbQtNC10L3QuNGPL9C60L7Qv9C40LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICfQotC+0LvRjNC60L4g0Y3RgtGDINC60L7Qv9C40Y4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLQu9C10L3QuNC1INC60LDQu9C10L3QtNCw0YDRj9C80LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICfQntCx0LfQvtGAINC60LDQu9C10L3QtNCw0YDQtdC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICfQlNC+0LHQsNCy0LjRgtGMINC90L7QstGL0Lkg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ9CU0L7QsdCw0LLQuNGC0Ywg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICfQmNC80L/QvtGA0YLQuNGA0L7QstCw0YLRjCDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ9CY0LzQv9C+0YDRgiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICfQl9C00LXRgdGMINCy0Ysg0LzQvtC20LXRgtC1INC30LDQs9GA0YPQt9C40YLRjCDRhNCw0LnQuyDQutC+0L3RhNC40LPRg9GA0LDRhtC40Lgg0LTQu9GPINC40LzQv9C+0YDRgtCwINC60LDQu9C10L3QtNCw0YDRjyDQsiDQstCw0YjRgyDRgdC40YHRgtC10LzRgy4g0KTQsNC50Lsg0LTQvtC70LbQtdC9INCx0YvRgtGMINCyINGE0L7RgNC80LDRgtC1IC55bWwg0YTQsNC50Lsg0Y3QutGB0L/QvtGA0YLQsCDQuNC3INC80L7QtNGD0LvRjyDRg9C/0YDQsNCy0LvQtdC90LjRjyDQutCw0LvQtdC90LTQsNGA0Y/QvNC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ9CX0LDQs9GA0YPQt9C40YLRjCDQutC+0L3RhNC40LPRg9GA0LDRhtC40Y4g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ9CY0LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINC60LDQu9C10L3QtNCw0YDRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ9Ck0LjQu9GM0YLRgCDQtNC70Y8g0JrQsNC70LXQvdC00LDRgNC10LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAn0JIg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDQvtGCINC30L3QsNGH0LXQvdC40Y8g0LIg0L/QvtC70LUgZ3JvdXAsINGB0LjRgdGC0LXQvNCwINC/0YDQtdC00L7RgdGC0LDQstC70Y/QtdGCINCw0LPQtdC90YLQsNC8INC00L7RgdGC0YPQvyDQuiDQutCw0LvQtdC90LTQsNGA0Y4g0LIg0LIg0YHQvtC+0YLQstC10YLRgdGC0LLQuNC4INGBINGD0YDQvtCy0L3QtdC8INC10LPQviDQv9C+0LvQvdC+0LzQvtGH0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICfQotC+0LvRjNC60L4g0YfRgtC10L3QuNC1OiDQv9C+0LvRjNC30L7QstCw0YLQtdC70Lgg0LzQvtCz0YPRgiDRgdC80L7RgtGA0LXRgtGMINC4INGN0LrRgdC/0L7RgNGC0LjRgNC+0LLQsNGC0Ywg0LLRgdC1INC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0LrQsNC70LXQvdC00LDRgNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ9Cf0LXRgNC10LzQtdGB0YLQuNGC0Ywg0LI6INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQuCDQvNC+0LPRg9GCINC40LfQvNC10L3Rj9GC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQsiDQutCw0LvQtdC90LTQsNGA0LUsINC90L4g0LHQtdC3INCy0YvQsdC+0YDQsCDQutCw0LvQtdC90LTQsNGA0Y8gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICfQodC+0LfQtNCw0YLRjDog0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C4INC80L7Qs9GD0YIg0YHQvtC30LTQsNCy0LDRgtGMINC4INGD0LTQsNC70Y/RgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0LIg0LrQsNC70LXQvdC00LDRgNC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAn0JfQsNC/0LjRgdGML9GH0YLQtdC90LjQtTog0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C4INC40LzQtdGO0YIg0L/QvtC70L3QvtC1INGD0L/RgNCw0LLQu9C10L3QuNC1INC60LDQu9C10L3QtNCw0YDQtdC8Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICdVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAn0K3QutGB0L/QvtGA0YIg0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAn0JfQsNCz0YDRg9C30LrQsCDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAn0JrQvtC/0LjRgNC+0LLQsNGC0Ywg0L/Rg9Cx0LvQuNGH0L3Ri9C5IFVSTCDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ9CY0LzRjyDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAn0JrQsNC70LXQvdC00LDRgNGMINGBINGC0LDQutC40Lwg0LjQvNC10L3QtdC8INGD0LbQtSDRgdGD0YnQtdGB0YLQstGD0LXRgi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ9CT0YDRg9C/0L/QvtCy0YvQtSDQv9GA0LDQstCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICfQnNC10YDQvtC/0YDQuNGP0YLQuNGPINC30LDRj9Cy0LrQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAn0J/RgNCw0LLQuNC70L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAn0JjRgdC/0L7Qu9GM0LfRg9C50YLQtSDQvtC/0YbQuNC4INC90LjQttC1LCDRh9GC0L7QsdGLINGD0LrQsNC30LDRgtGMLCDQutCw0LrQuNC1INC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0LfQsNGP0LLQvtC6INCx0YPQtNGD0YIg0YHQvtC30LTQsNC90Ysg0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICfQktGL0LHQtdGA0LjRgtC1INC/0YDQsNCy0LjQu9GM0L3Rg9GOINC+0YfQtdGA0LXQtNGMLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ9CQ0YLRgNC40LHRg9GC0Ysg0L/QvtC40YHQutCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAn0JfQsNC00LDRgtGMINC/0YDQsNCy0LjQu9CwINC00LvRjyDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQvtCz0L4g0YHQvtC30LTQsNC90LjRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5INCyINGN0YLQvtC8INC60LDQu9C10L3QtNCw0YDQtSwg0L7RgdC90L7QstCw0L3QvdGL0YUg0L3QsCDQtNCw0L3QvdGL0YUg0LfQsNGP0LLQutC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ9CU0L7QsdCw0LLQuNGC0Ywg0L/RgNCw0LLQuNC70L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ9CR0L7Qu9C10LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ9Cc0LXQvdC10LUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAn0JTQvtCx0LDQstC40YLRjCDQvdC+0LLQvtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAn0JrQsNC70LXQvdC00LDRgNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICfQodC70LjRiNC60L7QvCDQvNC90L7Qs9C+INCw0LrRgtC40LLQvdGL0YUg0LrQsNC70LXQvdC00LDRgNC10LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAn0J/QvtC20LDQu9GD0LnRgdGC0LAg0LjQu9C4INC+0YLQutC70Y7Rh9C40YLQtSDQvdC10LrQvtGC0L7RgNGL0LUg0LjQu9C4INGD0LLQtdC70LjRh9GM0YLQtSDQv9GA0LXQtNC10LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQsiDQvdCw0YHRgtGA0L7QudC60LDRhS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ9Cd0LXQtNC10LvRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ9Cc0LXRgdGP0YfQvdGL0Lkg0LPRgNCw0YTQuNC6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICfQndC10LTQtdC70YzQvdGL0Lkg0LPRgNCw0YTQuNC6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ9CT0YDQsNGE0LjQuiDQtNC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ9Cf0LXRgNC10LnRgtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICfQntGC0LrQu9C+0L3QuNGC0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ9Cf0L7QutCw0LfQsNGC0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICfQntGB0L3QvtCy0L3Ri9C1INC00LDQvdC90YvQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICfQlNCw0YLQsC/QktGA0LXQvNGPJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICfQn9C+0LbQsNC70YPQudGB0YLQsCwg0YPRgdGC0LDQvdC+0LLQuNGC0LUg0Y3RgtC+INC30L3QsNGH0LXQvdC40LUg0LTQviDQstGA0LXQvNC10L3QuCDQvtC60L7QvdGH0LDQvdC40Y8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ9Cf0L7QttCw0LvRg9C50YHRgtCwLCDRg9GB0YLQsNC90L7QstC40YLQtSDRjdGC0L4g0LfQvdCw0YfQtdC90LjQtSDQv9C+0YHQu9C1INCy0YDQtdC80LXQvdC4INC90LDRh9Cw0LvQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ9Ct0YLQviDRgNGP0LQg0L/QvtCy0YLQvtGA0Y/RjtGJ0LjRhdGB0Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfQmtC70LjQutC90LjRgtC1INGB0Y7QtNCwINGH0YLQvtCx0Ysg0L7RgtC60YDRi9GC0Ywg0YDQvtC00LjRgtC10LvRjNGB0LrQvtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ9Ca0LvQuNC60L3QuNGC0LUg0YHRjtC00LAg0YfRgtC+0LHRiyDRgNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAn0KfQsNGB0YLQvtGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICfQmtCw0LbQtNGL0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ9Ce0YLQvdC+0YHQuNGC0LXQu9GM0L3QsNGPINGC0L7Rh9C60LAg0LLRgNC10LzQtdC90LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAn0JLRiyDQtNC10LnRgdGC0LLQuNGC0LXQu9GM0L3QviDQttC10LvQsNC10YLQtSDRg9C00LDQu9C40YLRjCDRjdGC0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtT8g0K3RgtCwINC+0L/QtdGA0LDRhtC40Y8g0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINC+0YLQvNC10L3QtdC90LAuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICfQmNC80L/QvtGA0YIg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ9CX0LDQs9GA0YPQttCw0LXQvNGL0Lkg0YTQsNC50Lsg0LTQvtC70LbQtdC9INC40LzQtdGC0Ywg0L/RgNCw0LLQuNC70YzQvdGL0LkgaUNhbCDRhNC+0YDQvNCw0YIgKC5pY3MpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICfQldGB0LvQuCDQttC10LvQsNC10LzRi9C5INC60LDQu9C10L3QtNCw0YDRjCDQvtGC0YHRg9GC0YHRgtCy0YPQtdGCINCyINGB0L/QuNGB0LrQtSwg0YPQsdC10LTQuNGC0LXRgdGMLCDRh9GC0L4g0YMg0LLQsNGBINC10YHRgtGMINGF0L7RgtGPINCx0Ysg0L/RgNCw0LLQsCDQvdCwINGB0L7Qt9C00LDQvdC40LUgLSBcJ2NyZWF0ZVwnLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ9Ce0LHQvdC+0LLQuNGC0Ywg0YHRg9GJ0LXRgdGC0LLRg9GO0YnQtdC1INC80LXRgNC+0L/RgNC40Y/RgtC40LU/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAn0JLRgdC1INGB0YPRidC10YHRgtCy0YPRjtGJ0LjQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINCyINC60LDQu9C10L3QtNCw0YDQtSDRgSDQvtC00LjQvdCw0LrQvtCy0YvQvCBVbmlxdWVJRCDQsdGD0LTRg9GCINC/0LXRgNC10LfQsNC/0LjRgdCw0L3Riy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAn0JfQsNCz0YDRg9C30LjRgtGMINC60LDQu9C10L3QtNCw0YDRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAn0JjQvNC/0L7RgNGC0LjRgNC+0LLQsNGC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICfQndC+0LLQvtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ9Ch0LrQvtGA0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSDQtNC90LXQuSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICfQo9Cy0LXQtNC+0LzQu9C10L3QuNC1INGBINGC0LDQutC40Lwg0LjQvNC10L3QtdC8INGD0LbQtSDRgdGD0YnQtdGB0YLQstGD0LXRgiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ9CQ0LPQtdC90YIgKNGA0LXRgdGD0YDRgSksINC60L7RgtC+0YDRi9C5INCy0YvQsdGA0LDQvSDQsiDQvNC10YDQvtC/0YDQuNGP0YLQuNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ9CS0YHQtSDQsNCz0LXQvdGC0Ysg0YEg0L/RgNCw0LLQvtC8INGH0YLQtdC90LjRjyAo0LrQsNC6INC80LjQvdC40LzRg9C8KSDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyAo0LrQsNC70LXQvdC00LDRgNGPKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ9CS0YHQtSDQsNCz0LXQvdGC0Ysg0YEg0L/RgNCw0LLQvtC8IC13L9C30LDQv9C40YHQuCDQvdCwINC30LDRj9Cy0LrRgyDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyAo0LrQsNC70LXQvdC00LDRgNGPKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAn0KHQuNGB0YLQtdC80LUg0L3QtSDRg9C00LDQu9C+0YHRjCDRgdC+0LfQtNCw0YLRjCDQutCw0LvQtdC90LTQsNGA0YwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAn0J7RgtGB0YPRgtGB0YLQstGD0LXRgiBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICfQoyDQstCw0YEg0L3QtdGCINC/0YDQsNCyINC90LAg0LTQvtGB0YLRg9C/INC6INGN0YLQvtC80YMg0LrQsNC70LXQvdC00LDRgNGOISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAn0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfQntGI0LjQsdC60Lgg0L/RgNC4INC+0LHQvdC+0LLQu9C10L3QuNC4INC60LDQu9C10L3QtNCw0YDRjyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ9Cd0LXQstC+0LfQvNC+0LbQvdC+INC/0YDQvtGH0LjRgtCw0YLRjCDRhNCw0LnQuyDQvdCw0YHRgtGA0L7QtdC6INC60LDQu9C10L3QtNCw0YDRjy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAn0KPQsdC10LTQuNGC0LXRgdGMLCDQv9C+0LbQsNC70YPQudGB0YLQsCwg0YfRgtC+INGE0LDQudC7INC40LzQtdC10YIg0L/RgNCw0LLQuNC70YzQvdGL0Lkg0YTQvtGA0LzQsNGCLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICfQndC10LLQvtC30LzQvtC20L3QviDQuNC80L/QvtGA0YLQuNGA0L7QstCw0YLRjCDQutCw0LvQtdC90LTQsNGA0YwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ9Ca0LDQu9C10L3QtNCw0YDRjCDQuNC80L/QvtGA0YLQuNGA0L7QstCw0L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICfQotGA0LXQsdGD0LXRgtGB0Y8gQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICfQndC10LLQvtC30LzQvtC20L3QviDQv9C+0LvRg9GH0LjRgtGMINC00LDQvdC90YvQtSDQtNC70Y8g0YPQutCw0LfQsNC90L3QvtCz0L4gQ2FsZW5kYXJJRCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAn0KPRgdC/0LXRiNC90L4g0LjQvNC/0L7RgNGC0LjRgNC+0LLQsNC90YsgJXMg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQsiDQutCw0LvQtdC90LTQsNGA0YwgJXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcgKzUg0LzQuNC90YPRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSDQvNC40L3Rg9GCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwINC80LjQvdGD0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxINGH0LDRgSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICfQktGB0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICfQnNC10YDQvtC/0YDQuNGP0YLQuNGPINC90LDQt9C90LDRh9C10L3QvdGL0LUg0LzQvdC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICfQn9C+0LrQsNC30LDQvdGLINGC0L7Qu9GM0LrQviDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINC90LDQt9C90LDRh9C10L3QvdGL0LUg0JLQsNC8ISDQmNC30LzQtdC90LjRgtC1INC90LDRgdGC0YDQvtC50LrQuCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICfQnNC10YDQvtC/0YDQuNGP0YLQuNGPINC90LUg0L3QsNC50LTQtdC90YshJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAn0J3QuNC60L7Qs9C00LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAn0JrQsNC20LTRi9C5INC00LXQvdGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICfQmtCw0LbQtNGD0Y4g0L3QtdC00LXQu9GOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAn0JrQsNC20LTRi9C5INC80LXRgdGP0YYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ9Ca0LDQttC00YvQuSDQs9C+0LQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAn0J/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICfQldC20LXQtNC90LXQstC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAn0JXQttC10L3QtdC00LXQu9GM0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAn0JXQttC10LzQtdGB0Y/Rh9C90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAn0JXQttC10LPQvtC00L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ9C60LDQttC00YvQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ9C/0L7QstGC0L7RgNC40YLRjCAlcyDRgNCw0Lco0LApJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ9C00L4gLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJ9C/0L7QstGC0L7RgNC40YLRjCAuLi4g0YDQsNC3KNCwKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ9C00L4gJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAn0J3QtSDRg9Cy0LXQtNC+0LzQu9GP0YLRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAn0LfQsCAlcyDQvNC40L3Rg9GCKNGDKSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAn0LfQsCAlcyDRh9Cw0YEo0L7Qsikg0LTQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAn0LfQsCAlcyDQtNC10L3RjCjQtNC90LXQuSkg0LTQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJ9C30LAgJXMg0L3QtdC00LXQu9GOINC00L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICfQtNC+INC90LDRh9Cw0LvQsCDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAn0L/QvtGB0LvQtSDQvdCw0YfQsNC70LAg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICfQtNC+INC+0LrQvtC90YfQsNC90LjRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ9C/0L7RgdC70LUg0L7QutC+0L3Rh9Cw0L3QuNGPINC80LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICfQndC10YIg0L/RgNCw0LIg0LTQvtGB0YLRg9C/0LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ9Cd0LXQstC+0LfQvNC+0LbQvdC+INGD0LTQsNC70LjRgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40LUg0LfQsNGP0LLQutC4ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICfQndC10YIg0L/RgNCw0LIg0LTQvtGB0YLRg9C/0LAhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ9Cd0LXRgiDQv9GA0LDQsiDQtNC+0YHRgtGD0L/QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICfQodC40YHRgtC10LzQtSDQvdC1INGD0LTQsNC70L7RgdGMINC40LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINGE0LDQudC7ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICfQn9C+0LbQsNC70YPQudGB0YLQsCwg0L/RgNC+0LLQtdGA0YzRgtC1INC20YPRgNC90LDQuyDQtNC70Y8g0L/QvtC70YPRh9C10L3QuNGPINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40LguJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQg0LXRidC1JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAn0J7RgtGB0YPRgtGB0YLQstGD0LXRgiAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ9Ci0LDQutC+0Lkg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GMINC90LUg0YHRg9GJ0LXRgdGC0LLRg9C10YIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAn0J3QtdC00LXQudGB0YLQstC40YLQtdC70YzQvdGL0Lkg0LrQsNC70LXQvdC00LDRgNGMISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICfQndC10LLQtdGA0L3Ri9C5IFVSTCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAn0J/RgNC+0LjQt9C+0YjQu9CwINC+0YjQuNCx0LrQsCDQv9GA0Lgg0Y3QutGB0L/QvtGA0YLQtSDQutCw0LvQtdC90LTQsNGA0Y8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAn0JjQvdGC0LXRgNCy0LDQuyDQvtCx0L3QvtCy0LvQtdC90LjRjyAo0LIg0LzQuNC90YPRgtCw0YUpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICfQodGC0YDQsNC90LjRhtCwINC+0LHQt9C+0YDQsCDQmtCw0LvQtdC90LTQsNGA0Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ9Cj0LLQtdC00L7QvNC70LXQvdC40Y8g0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRj9GFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfQnNC+0LTRg9C70Ywg0YPQv9GA0LDQstC70LXQvdC40Y8g0YHQvtCx0YvRgtC40Y/QvNC4INCa0LDQu9C10L3QtNCw0YDRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5LCDQutC+0YLQvtGA0YvQuSDQv9C+0LTQs9C+0YLQsNCy0LvQuNCy0LDQtdGCINGD0LLQtdC00L7QvNC70LXQvdC40Y8g0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICfQnNC+0LTRg9C70Ywg0YPQv9GA0LDQstC70LXQvdC40Y8g0YHQvtCx0YvRgtC40Y/QvNC4INCa0LDQu9C10L3QtNCw0YDRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5LCDQutC+0YLQvtGA0YvQuSDQvtCx0L3QvtCy0LvRj9C10YIg0LfQsNGP0LLQutC4INGBINC00LDQvdC90YvQvNC4INC40Lcg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQt9Cw0Y/QstC60LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ9Ct0LrRgNCw0L0g0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjRjyDQnNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAn0KHQv9C40YHQvtC6INC80LXRgNC+0L/RgNC40Y/RgtC40LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICfQodC/0LjRgdC+0Log0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ9Cj0LLQtdC00L7QvNC70LXQvdC40Y8g0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRj9GFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICfQrdC60YDQsNC9INCj0L/RgNCw0LLQu9C10L3QuNC1INC60LDQu9C10L3QtNCw0YDRj9C80LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ9CS0YvQsdC10YDQuNGC0LUg0LTQu9GPINC60LDQutC+0LPQviDRgtC40L/QsCDQuNC30LzQtdC90LXQvdC40Lkg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQstGLINC20LXQu9Cw0LXRgtC1INC/0L7Qu9GD0YfQsNGC0Ywg0YPQstC10LTQvtC80LvQtdC90LjRjy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ9Ch0L7Qt9C00LDRgtGMINC90L7QstC+0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSDQutCw0LvQtdC90LTQsNGA0Y8g0YHQstGP0LfQsNC90L3QvtC1INGBINGN0YLQvtC5INC30LDRj9Cy0LrQvtC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAn0KHQvtC30LTQsNC90LjQtSDQuCDRg9C/0YDQsNCy0LvQtdC90LjQtSDRg9Cy0LXQtNC+0LzQu9C10L3QuNGP0LzQuCDQv9C+INC80LXRgNC+0L/RgNC40Y/RgtC40Y/QvC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfQodC+0LfQtNCw0YLRjCDQvdC+0LLQvtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAn0JfQsNC00LDQudGC0LUsINC60LDQutC40LUg0LrQvtC70L7QvdC60Lgg0L7RgtC+0LHRgNCw0LbQsNGC0Ywg0LIg0YHQstGP0LfQsNC90L3QvtC8INCy0LjQtNC20LXRgtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LkgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4g0JLQvtC30LzQvtC20L3Ri9C1INC30L3QsNGH0LXQvdC40Y86IDAgPSDQntGC0LrQu9GO0YfQtdC90L4sIDEgPSDQlNCwLCAyID0g0JLQutC70Y7Rh9C10L3QsCDQv9C+INGD0LzQvtC70YfQsNC90LjRji4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC40LrQvtC90LrRgyDRgdC+INGB0YHRi9C70LrQvtC5INC90LAg0YHRgtGA0LDQvdC40YbRgyDRgtC10LrRg9GJ0LXQs9C+INC80LXRgdGC0L7Qv9C+0LvQvtC20LXQvdC40Y8g0LIgR29vZ2xlIE1hcCDQvdCwINGN0LrRgNCw0L3QtSDRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGC0LjQv9GLINGB0L7QsdGL0YLQuNC5LCDQutC+0YLQvtGA0YvQtSDQsdGD0LTRg9GCINGD0L/RgNCw0LLQu9GP0YLRjNGB0Y8gINGBINC/0L7QvNC+0YnRjNGOIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0L/QtdGA0LXRh9C10L3RjCDQsNGC0YDQuNCx0YPRgtC+0LIsINC60L7RgtC+0YDRi9C1INC80L7Qs9GD0YIg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyDQv9GA0Lgg0L/QvtC40YHQutC1INC30LDRj9Cy0L7Qui4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC80L7QtNGD0LvRjCDQvtCx0YDQsNCx0L7RgtC60Lgg0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40Lkg0LfQsNGP0LLQutC4INC00LvRjyDQtNC40L3QsNC80LjRh9C10YHQutC40YUg0L/QvtC70LXQuSDRgtC40L/QsCDQtNCw0YLQsC/QstGA0LXQvNGPIC8gZGF0ZSB0aW1lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC80L7QtNGD0LvRjCDQvtCx0YDQsNCx0L7RgtC60Lgg0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40Lkg0LfQsNGP0LLQutC4INC/0L4gdGlja2V0IGVzY2FsYXRpb24gdGltZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDQvNC+0LTRg9C70Ywg0L7QsdGA0LDQsdC+0YLQutC4INC00LvRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5INC30LDRj9Cy0LrQuCDQv9C+IHRpY2tldCBwZW5kaW5nIHRpbWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICfQl9Cw0LTQsNC10YIg0L/Qu9Cw0LPQuNC9INC+0LHRgNCw0LHQvtGC0LrQuCDQt9Cw0Y/QstC+0Log0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40Lkg0LrQsNC70LXQvdC00LDRgNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ9Cg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ9CS0YDQtdC80Y8g0LTQviDQv9C10YDQstC+0LPQviDQvtGC0LLQtdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAn0K3QutGA0LDQvSDQuNC80L/QvtGA0YLQsCDQvNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICfQodCy0Y/Qt9GL0LLQsNC10YIg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDRgSDQt9Cw0Y/QstC60LDQvNC4INGB0LLRj9C30YzRjiDRgtC40L/QsCAiTm9ybWFsL9Ce0LHRi9GH0L3QsNGPIi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ9Ch0L/QuNGB0L7QuiDQstGB0LXRhSDRgdC+0LHRi9GC0LjQuSwg0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40LksINC+0YLQvtCx0YDQsNC20LDQtdC80YvRhSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ9Ch0L/QuNGB0L7QuiDQstGB0LXRhSDRgdC+0LHRi9GC0LjQuSDQutCw0LvQtdC90LTQsNGA0Y8sINC+0YLQvtCx0YDQsNC20LDQtdC80YvRhSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0YbQstC10YLQvtCyINCyINGI0LXRgdGC0L3QsNC00YbQsNGC0LXRgNC40YfQvdC+0LwgUkdCINC00L7RgdGC0YPQv9C90YvRhSDQtNC70Y8g0LLRi9Cx0L7RgNCwINC/0YDQuCDRgdC+0LfQtNCw0L3QuNC4INC60LDQu9C10L3QtNCw0YDRjy4g0KPQsdC10LTQuNGC0LXRgdGMINC/0YDQuCDQstGL0LHQvtGA0LUsINGH0YLQviDRhtCy0LXRgiDRhNC+0L3QsCDQtNC+0YHRgtCw0YLQvtGH0L3QviDRgtC10LzQvdGL0LksINGH0YLQvtCx0Ysg0LHQtdC70YvQuSDRgtC10LrRgdGCINCx0YvQuyDQvdCwINC90LXQvCDQstC40LTQtdC9L9GH0LjRgtCw0LXQvC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAn0KPQv9GA0LDQstC70Y/RgtGMINGA0LDQt9C70LjRh9C90YvQvNC4INC60LDQu9C10L3QtNCw0YDRj9C80LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAn0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INCw0LrRgtC40LLQvdGL0YUg0LrQsNC70LXQvdC00LDRgNC10Lkg0L3QsCDRjdC60YDQsNC90LDRhSDQvtCx0LfQvtGA0LAuINCf0L7QvNC90LjRgtC1LCDRh9GC0L4g0LHQvtC70YzRiNC+0LUg0YfQuNGB0LvQviDQsNC60YLQuNCy0L3Ri9GFINC60LDQu9C10L3QtNCw0YDQtdC5INC80L7QttC10YIg0L7QutCw0LfQsNGC0Ywg0LLQu9C40Y/QvdC40LUg0L3QsCDQv9GA0L7QuNC30LLQvtC00LjRgtC10LvRjNC90L7RgdGC0Ywg0YHQtdGA0LLQtdGA0LAsINC00LXQu9Cw0Y8g0YHQu9C40YjQutC+0Lwg0LzQvdC+0LPQviDQvtC00L3QvtCy0YDQtdC80LXQvdC90YvRhSDQstGL0LfQvtCy0L7Qsi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSUyDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDQv9C+0LLRgtC+0YDRj9GO0YnQuNC10YHRjyDQnNC10YDQvtC/0YDQuNGP0YLQuNGPINCx0LXQtyDQtNCw0YLRiyDQvtC60L7QvdGH0LDQvdC40Y8g0LjQu9C4INC60L7Qu9C40YfQtdGB0YLQstCwINC/0L7QstGC0L7RgNC10L3QuNC5LiDQn9GA0Lgg0LjQvNC/0L7RgNGC0LUg0LzQvtC20LXRgiDRgtCw0Log0YHQu9GD0YfQuNGC0YzRgdGPLCDRh9GC0L4gSUNTINGE0LDQudC7INGB0L7QtNC10YDQttC40YIg0L/QvtC00L7QsdC90YvQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNGPLiDQkiDRgNC10LfRg9C70YzRgtCw0YLQtSDQvNC+0LbQtdGCINGC0LDQuiDRgdC70YPRh9C40YLRjNGB0Y8sINGH0YLQviDRgdC40YHRgtC10LzQsCDRgdC+0LfQtNCw0YHRgiDQstGB0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQsiDQv9GA0L7RiNC70L7QvCDQuCwg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90L4sINC00LvRjyDQv9C+0YHQu9C10LTRg9GO0YnQuNGFIG4g0LzQtdGB0Y/RhtC10LIgKDEyMCDQvNC10YHRj9GG0LXQsi8xMCDQu9C10YIg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ9Ce0LHQt9C+0YAg0LLRgdC10YUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAn0JLRgNC10LzRjyDQsiDQvtC20LjQtNCw0L3QuNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICfQn9C+0LjRgdC60L7QstGL0Lkg0L/Qu9Cw0LPQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAn0J/QvtC40YHQutC+0LLRi9C5INC/0LvQsNCz0LjQvSDQtNC70Y8g0LDQstGC0L7Qt9Cw0LLQtdGA0YjQtdC90LjRjy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAn0J7QsdGJ0LXQtNC+0YHRgtGD0L/QvdGL0Lkg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICfQntCx0YnQtdC00L7RgdGC0YPQv9C90YvQuSDQutCw0LvQtdC90LTQsNGA0YwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAn0J7QsdC30L7RgCDRgNC10YHRg9GA0YHQvtCyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ9Ce0LHQt9C+0YAg0YDQtdGB0YPRgNGB0L7QsiAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAn0J7RgtC+0LHRgNCw0LbQsNC10YIg0YHRgdGL0LvQutGDL9C/0YPQvdC60YIg0LzQtdC90Y4g0LTQu9GPINGB0L7Qt9C00LDQvdC40Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQutCw0LvQtdC90LTQsNGA0Y8sINGB0LLRj9C30LDQvdC90L7Qs9C+INGBINC30LDRj9Cy0LrQvtC5INC90LXQv9C+0YHRgNC10LTRgdGC0LLQtdC90L3QviDQuNC3INC/0L7QtNGA0L7QsdC90L7Qs9C+INC/0YDQvtGB0LzQvtGC0YDQsCDQt9Cw0Y/QstC60LgvVGlja2V0Wm9vbSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdC+LCDQvNC+0LbQvdC+INC+0LPRgNCw0L3QuNGH0LjRgtGMINC00L7RgdGC0YPQvyDQuiDRjdGC0L7QvNGDINC/0YPQvdC60YLRgyDQvNC10L3Rjiwg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LXQvCDQutC70Y7Rh9CwICJHcm91cCIsINCz0LTQtSDQsiDRgdC+0LTQtdGA0LbQsNC90LjQuCDRg9C60LDQt9GL0LLQsNC10YLRgdGPINC/0LXRgNC10YfQtdC90Ywg0LPRgNGD0L/Qvywg0LrQvtGC0L7RgNGL0Lwg0Y3RgtCwINC60L3QvtC/0LrQsCDQsdGD0LTQtdGCINC00L7RgdGC0YPQv9C90LAgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4g0JTQu9GPINC+0YDQs9Cw0L3QuNC30LDRhtC40Lgg0L/Rg9C90LrRgtC+0LIg0LzQtdC90Y4g0LIg0LPRgNGD0L/Qv9GLL9C60LvQsNGB0YLQtdGA0Ysg0LjRgdC/0L7Qu9GM0LfRg9C50YLQtSDQsiDQutCw0YfQtdGB0YLQstC1INC60LvRjtGH0LAgIkNsdXN0ZXJOYW1lIiDQuCDQsiDRgdC+0LTQtdGA0LbQsNC90LjQuCDRg9C60LDQttC40YLQtSDRgtC+INC40LzRjywg0LrQvtGC0L7RgNC+0LUg0LbQtdC70LDQtdGC0LUg0YPQstC40LTQtdGC0Ywg0LIg0YHRgtGA0L7QutC1INC80LXQvdGOLiDQmNGB0L/QvtC70YzQt9GD0LnRgtC1ICJDbHVzdGVyUHJpb3JpdHkiINC00LvRjyDQvdCw0YHRgtGA0L7QudC60Lgg0L/QvtGA0Y/QtNC60LAg0L7RgtC+0LHRgNCw0LbQtdC90LjRjyDQs9GA0YPQv9C/L9C60LvQsNGB0YLQtdGA0L7QsiDQsiDQvNC10L3Rji4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ9CS0YDQtdC80Y8g0YDQtdGI0LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICfQktGL0LHQvtGAINGB0L/QvtGB0L7QsdCwINC+0YLQv9GA0LDQstC60Lgg0LTQu9GPINGD0LLQtdC00L7QvNC70LXQvdC40Lkg0L/QviDQvNC10YDQvtC/0YDQuNGP0YLQuNGP0LwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ9Cf0LXRgNC10LrQu9GO0YfQsNC10YIg0LTQvtCx0LDQstC40YLRjCDQuNC70Lgg0LjQt9C80LXQvdC40YLRjCDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQvtC1INGB0L7Qt9C00LDQvdC40LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQutCw0LvQtdC90LTQsNGA0Y8sINC+0YHQvdC+0LLQsNC90L3QvtC1INC90LAg0L7Qv9GA0LXQtNC10LvQtdC90L3Ri9GFINCy0YDQtdC80LXQvdCd0YvRhSDQv9Cw0YDQsNC80LXRgtGA0LDRhSDQt9Cw0Y/QstC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICfQktGA0LXQvNGPINC40LfQvNC10L3QtdC90LjRjyDQt9Cw0Y/QstC60LgnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnNyX0N5cmxfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ9Ce0LHQsNCy0LXRiNGC0LXRmtC1INC/0L7QtNGB0LXRgtC90LjQutCwINC+INGC0LXRgNC80LjQvdGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfQlNC+0LHQuNGb0LXRgtC1INC+0LHQsNCy0LXRiNGC0LXRmtC1INGB0LLQsNC60Lgg0L/Rg9GCINC60LDQtGEg0LTQvtGS0LUg0LTQviDQstGA0LXQvNC10L3QsCDQv9C+0LTRgdC10YLQvdC40LrQsCDQt9CwINC90LXQutC4INC+0LQg0LLQsNGI0LjRhSDRgtC10YDQvNC40L3QsC4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICfQo9C/0YDQsNCy0ZnQsNGa0LUg0L7QsdCw0LLQtdGI0YLQtdGa0LjQvNCwINC+INGC0LXRgNC80LjQvdC40LzQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ9Ce0LLQtNC1INC80L7QttC10YLQtSDQv9C+0YHQu9Cw0YLQuCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdGDINC00LDRgtC+0YLQtdC60YMg0LfQsCDRg9Cy0L7QtyDQvtCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3RgyDRgyDQstCw0Ygg0YHQuNGB0YLQtdC8LiDQlNCw0YLQvtGC0LXQutCwINC80L7RgNCwINCx0LjRgtC4INGDINC40YHRgtC+0LwgLnltbCDRhNC+0YDQvNCw0YLRgyDQutC+0ZjQuCDRmNC1INC80L7Qs9GD0ZvQtSDQtNC+0LHQuNGC0Lgg0LjQt9Cy0L7Qt9C+0Lwg0YMg0LXQutGA0LDQvdGDINGD0L/RgNCw0LLRmdCw0ZrQsCDQvtCx0LDQstC10YjRgtC10ZrQuNC80LAg0L4g0YLQtdGA0LzQuNC90LjQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ9Ce0LLQtNC1INC80L7QttC10YLQtSDQuNC30LDQsdGA0LDRgtC4INC60L7RmNC4INC00L7Qs9Cw0ZLQsNGY0Lgg0ZvQtSDQv9C+0LrRgNC10L3Rg9GC0Lgg0L7QsdCw0LLQtdGI0YLQsNCy0LDRmtC1LiDQlNC+0LTQsNGC0L3QuCDRhNC40LvRgtC10YAg0LfQsCDRgtC10YDQvNC40L3QtSDQvNC+0LbQtSDQsdC40YLQuCDQv9GA0LjQvNC10ZrQtdC9INGA0LDQtNC4INGB0LvQsNGa0LAg0YHQsNC80L4g0LfQsCDRgtC10YDQvNC40L3QtSDQv9C+INC+0LTRgNC10ZLQtdC90L7QvCDQutGA0LjRgtC10YDQuNGY0YPQvNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICfQpNC40LvRgtC10YAg0YLQtdGA0LzQuNC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ9Ci0LjQvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ9Cg0LXRgdGD0YDRgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ9Ce0LHQsNCy0LXRgdGC0Lgg0LrQvtGA0LjRgdC90LjQutCwINGB0LDQvNC+INGY0LXQtNC90L7QvCDQtNC90LXQstC90L4g0L4g0L/QvtGY0LXQtNC40L3QsNGH0L3QvtC8INGC0LXRgNC80LjQvdGDINC60L7RgNC40YjRm9C10ZrQtdC8INC40LfQsNCx0YDQsNC90L7QsyDRgtGA0LDQvdGB0L/QvtGA0YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICfQntCx0LDQstC10YjRgtC10ZrQtSDRm9C1INCx0LjRgtC4INC/0L7RgdC70LDRgtC+INC+0L/QtdGA0LDRgtC10YDRgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ9CU0LAg0LLQuNC00LjRgtC1INC/0YDQstC40YUgMjAg0LrQsNGA0LDQutGC0LXRgNCwINC90LDRgdC70L7QstCwINGC0LXRgNC80LjQvdCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ9CU0LAg0LLQuNC00LjRgtC1INCw0YLRgNC40LHRg9GC0LUg0YLQtdGA0LzQuNC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICfQlNCwINCy0LjQtNC40YLQtSDQsNGC0YDQuNCx0YPRgtC1INC60LDQu9C10L3QtNCw0YDQsCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICfQn9GA0LXQs9C70LXQtCDQtNC90LXQstC90L7QsyDRgNC10LTQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAn0KPQv9GA0LDQstGZ0LDRmtC1INC60LDQu9C10L3QtNCw0YDQuNC80LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAn0JTQvtC00LDRmCDRgtC10YDQvNC40L0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICfQkdC+0ZjQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ9CU0LDRgtGD0Lwg0LrRgNCw0ZjQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICfQn9C+0L3QsNCy0ZnQsNGa0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAn0J3QuNGY0LUg0L/RgNC+0L3QsNGS0LXQvSDQvdC40ZjQtdC00LDQvSDQutCw0LvQtdC90LTQsNGALiDQnNC+0LvQuNC80L4g0L/RgNCy0L4g0LTQvtC00LDRmNGC0LUg0LrQsNC70LXQvdC00LDRgCDQutC+0YDQuNGI0ZvQtdGa0LXQvCDQtdC60YDQsNC90LAg0KPQv9GA0LDQstGZ0LDRmtC1INC60LDQu9C10L3QtNCw0YDQuNC80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAn0KLQtdGA0LzQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICfQntCy0LDRmCDRgtC10YDQvNC40L0g0YHQtSDQv9C+0L3QsNCy0ZnQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ9CU0LAg0LvQuCDQttC10LvQuNGC0LUg0LTQsCDQuNC30LzQtdC90Lgg0YHQsNC80L4g0L7QstC+INC40LvQuCDRgdCy0LAg0L/QvtC90LDQstGZ0LDRmtCwPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICfQodCy0LAg0L/QvtC90LDQstGZ0LDRmtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAn0KHQsNC80L4g0L7QstC+INC/0L7QvdCw0LLRmdCw0ZrQtSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAn0KPQv9GA0LDQstGZ0LDRmtC1INC60LDQu9C10L3QtNCw0YDQuNC80LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICfQn9GA0LXQs9C70LXQtCDQutCw0LvQtdC90LTQsNGA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ9CU0L7QtNCw0Zgg0L3QvtCy0Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICfQlNC+0LTQsNGYINC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ9Cj0LLQtdC30Lgg0YLQtdGA0LzQuNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAn0KPQstC+0Lcg0LrQsNC70LXQvdC00LDRgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAn0J7QstC00LUg0LzQvtC20LXRgtC1INGD0YfQuNGC0LDRgtC4INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90YMg0LTQsNGC0L7RgtC10LrRgyDQt9CwINGD0LLQvtC3INC60LDQu9C10L3QtNCw0YDQsCDRgyDQstCw0Ygg0YHQuNGB0YLQtdC8LiDQlNCw0YLQvtGC0LXQutCwINC80L7RgNCwINCx0LjRgtC4INGDIC55bWwg0YTQvtGA0LzQsNGC0YMg0LjQt9Cy0LXQt9C10L3QsCDQvtC0INGB0YLRgNCw0L3QtSDQvNC+0LTRg9C70LAg0LfQsCDRg9C/0YDQsNCy0ZnQsNGa0LUg0LrQsNC70LXQvdC00LDRgNC40LzQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICfQo9GH0LjRgtCw0Zgg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNGY0YMg0LrQsNC70LXQvdC00LDRgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ9Cj0LLQtdC30Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ9Ck0LjQu9GC0LXRgCDQt9CwINC60LDQu9C10L3QtNCw0YDQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICfQoyDQt9Cw0LLQuNGB0L3QvtGB0YLQuCDQvtC0INC/0L7RmdCwINCz0YDRg9C/0LUsINGB0LjRgdGC0LXQvCDRm9C1INC00L7Qt9Cy0L7Qu9C40YLQuCDQv9GA0LjRgdGC0YPQvyDQutCw0LvQtdC90LTQsNGA0YMg0L7Qv9C10YDQsNGC0LXRgNC40LzQsCDQv9GA0LXQvNCwINGa0LjRhdC+0LLQvtC8INC90LjQstC+0YMg0L/RgNC40YHRgtGD0L/QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdSTzog0L7Qv9C10YDQsNGC0LXRgNC4INC80L7Qs9GDINC/0YDQtdCz0LvQtdC00LDRgtC4INC4INC10LrRgdC/0L7RgNGC0L7QstCw0YLQuCDRgdCy0LUg0YLQtdGA0LzQuNC90LUg0YMg0LrQsNC70LXQvdC00LDRgNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ9Cf0YDQtdC80LXRgdGC0Lgg0YM6INC+0L/QtdGA0LDRgtC10YDQuCDQvNC+0LPRgyDQvNC+0LTQuNGE0LjQutC+0LLQsNGC0Lgg0YLQtdGA0LzQuNC90LUg0YMg0LrQsNC70LXQvdC00LDRgNGDLCDQsNC70Lgg0LHQtdC3INC/0YDQvtC80LXQvdC1INC60L7QvCDQutCw0LvQtdC90LTQsNGA0YMg0L/RgNC40L/QsNC00LDRmNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAn0JrRgNC10LjRgNCw0ZrQtTog0L7Qv9C10YDQsNGC0LXRgNC4INC80L7Qs9GDINC60YDQtdC40YDQsNGC0Lgg0Lgg0LHRgNC40YHQsNGC0Lgg0YLQtdGA0LzQuNC90LUg0YMg0LrQsNC70LXQvdC00LDRgNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnUlc6INC+0L/QtdGA0LDRgtC10YDQuCDQvNC+0LPRgyDQsNC00LzQuNC90LjRgdGC0YDQuNGA0LDRgtC4INC4INGB0LDQvCDQutCw0LvQtdC90LTQsNGALic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICfQkNC00YDQtdGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAn0JjQt9Cy0LXQt9C4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICfQn9GA0LXRg9C30LzQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ9CY0YHQutC+0L/QuNGA0LDRmCDRmNCw0LLQvdGDINCw0LTRgNC10YHRgyDQutCw0LvQtdC90LTQsNGA0LAgKFVSTCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ9Cd0LDQt9C40LIg0LrQsNC70LXQvdC00LDRgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ9Ca0LDQu9C10L3QtNCw0YAg0YHQsCDQuNGB0YLQuNC8INC90LDQt9C40LLQvtC8INCy0LXRmyDQv9C+0YHRgtC+0ZjQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ9CT0YDRg9C/0LAg0L/RgNC40YHRgtGD0L/QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAn0KLQtdGA0LzQuNC90Lgg0YLQuNC60LXRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICfQn9GA0LDQstC40LvQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICfQmtC+0YDQuNGB0YLQtdGb0Lgg0L7Qv9GG0LjRmNC1INC40YHQv9C+0LQg0LjQt9Cw0LHQtdGA0LjRgtC1INC30LAg0LrQvtGY0LUg0YLQuNC60LXRgtC1INGb0LUg0YLQtdGA0LzQuNC90Lgg0LHQuNGC0Lgg0LDRg9GC0L7QvNCw0YLRgdC60Lgg0LrRgNC10LjRgNCw0L3QuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ9Cc0L7Qu9C40LzQviDQtNCwINC+0LTQsNCx0LXRgNC10YLQtSDQstCw0LbQtdGb0Lgg0YDQtdC0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ9CQ0YLRgNC40LHRg9GC0Lgg0L/RgNC10YLRgNCw0LPQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LjRgtC1INC/0YDQsNCy0LjQu9CwINC30LAg0LrRgNC10LjRgNCw0ZrQtSDQsNGD0YLQvtC80LDRgtGB0LrQuNGFINGC0LXRgNC80LjQvdCwINGDINC+0LLQvtC8INC60LDQu9C10L3QtNCw0YDRgyDQvdCwINC+0YHQvdC+0LLRgyDRgtC40LrQtdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAn0JTQvtC00LDRmCDQv9GA0LDQstC40LvQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAn0JLQuNGI0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ9Cc0LDRmtC1JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ9CU0L7QtNCw0Zgg0L3QvtCy0Lgg0YLQtdGA0LzQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ9Ca0LDQu9C10L3QtNCw0YDQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAn0J/RgNC10LLQuNGI0LUg0LDQutGC0LjQstC90LjRhSDQutCw0LvQtdC90LTQsNGA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAn0JjQu9C4INC/0YDQstC+INC40YHQutGZ0YPRh9C40YLQtSDQv9GA0LjQutCw0Lcg0L3QtdC60L7QsyDQutCw0LvQtdC90LTQsNGA0LAg0LjQu9C4INC/0L7QstC10ZvQsNGY0YLQtSDQu9C40LzQuNGCINGDINC60L7QvdGE0LjQs9GD0YDQsNGG0LjRmNC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAn0KHQtdC00LzQuNGG0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICfQnNC10YHQtdGH0L3QsCDQvtGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ9Ch0LXQtNC80LjRh9C90LAg0L7RgdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ9CU0L3QtdCy0L3QsCDQvtGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ9Ch0LrQvtGH0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ9Cf0L7QvdC40YjRgtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICfQn9GA0LjQutCw0LbQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ9Ce0YHQvdC+0LLQvdC1INC40L3RhNC+0YDQvNCw0YbQuNGY0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAn0JTQsNGC0YPQvC/QstGA0LXQvNC1JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICfQnNC+0LvQuNC80L4g0L/QvtGB0YLQsNCy0LjRgtC1INC+0LLQsNGYINC00LDRgtGD0Lwg0L/RgNC1INC60YDQsNGY0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ9Cc0L7Qu9C40LzQviDQv9C+0YHRgtCw0LLQuNGC0LUg0L7QstCw0Zgg0LTQsNGC0YPQvCDQv9C+0YHQu9C1INC/0L7Rh9C10YLQutCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAn0J7QstC+INGY0LUg0YLQtdGA0LzQuNC9INC60L7RmNC4INGB0LUg0L/QvtC90LDQstGZ0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAn0JrQu9C40LrQvdC40YLQtSDQvtCy0LTQtSDQt9CwINC/0YDQtdCz0LvQtdC0INC80LDRgtC40YfQvdC+0LMg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ9Ca0LvQuNC60L3QuNGC0LUg0L7QstC00LUg0LfQsCDQuNC30LzQtdC90YMg0LzQsNGC0LjRh9C90L7QsyDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAn0KPRh9C10YHRgtCw0LvQvtGB0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICfQodCy0LDQutC+0LMo0LUpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICfQoNC10LvQsNGC0LjQstC90L4g0LLRgNC10LzQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICfQlNCwINC70Lgg0YHRgtC1INGB0LjQs9GD0YDQvdC4INC00LAg0LbQtdC70LjRgtC1INC00LAg0LjQt9Cx0YDQuNGI0LXRgtC1INC+0LLQsNGYINGC0LXRgNC80LjQvT8g0J7QstGDINC+0L/QtdGA0LDRhtC40ZjRgyDQvdC40ZjQtSDQvNC+0LPRg9Gb0LUg0L7Qv9C+0LfQstCw0YLQuC4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ9Cj0LLQvtC3INGC0LXRgNC80LjQvdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAn0J/QvtGB0LvQsNGC0Lgg0YTQsNGY0Lsg0LzQvtGA0LAg0LHQuNGC0Lgg0YMg0LjRgdC/0YDQsNCy0L3QvtC8IGlDYWwg0YTQvtGA0LzQsNGC0YMgKC5pY3MpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICfQo9C60L7Qu9C40LrQviDQttC10ZnQtdC90Lgg0LrQsNC70LXQvdC00LDRgCDQvdC40ZjQtSDQuNC30LvQuNGB0YLQsNC9LCDQv9GA0L7QstC10YDQuNGC0LUg0LTQsCDQu9C4INC40LzQsNGC0LUg0L3QuNCy0L4g0L/RgNC40YHRgtGD0L/QsCBcJ9C60YDQtdC40YDQsNGa0LVcJyDQt9CwINCz0YDRg9C/0YMg0LrQsNC70LXQvdC00LDRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ9Ce0YHQstC10LbQuCDQv9C+0YHRgtC+0ZjQtdGb0LUg0YLQtdGA0LzQuNC90LU/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAn0KHQstC4INC/0L7RgdGC0L7RmNC10ZvQuCDRgtC10YDQvNC40L3QuCDRgyDQutCw0LvQtdC90LTQsNGA0YMg0YHQsCDQuNGB0YLQuNC8IFVuaXF1ZUlEINC/0L7RmdC10Lwg0ZvQtSDQsdC40YLQuCDQv9GA0LXQsdGA0LjRgdCw0L3QuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAn0J/QvtGI0LDRmdC4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ9Cj0LLQtdC30Lgg0YLQtdGA0LzQuNC90LUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAn0J3QvtCy0Lgg0YLQtdGA0LzQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICfQo9GB0LrQvtGA0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSDQtNCw0L3QsCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICfQntCx0LDQstC10YjRgtC10ZrQtSDRgdCwINC+0LLQuNC8INC90LDQt9C40LLQvtC8INCy0LXRmyDQv9C+0YHRgtC+0ZjQuCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ9Ce0L/QtdGA0LDRgtC10YAgKNGA0LXRgdGD0YDRgSksINC60L7RmNC4INGY0LUg0LjQt9Cw0LHRgNCw0L0g0YMg0YLQtdGA0LzQuNC90YMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAn0KHQstC4INC+0L/QtdGA0LDRgtC10YDQuCDRgdCwICjQvdCw0ZjQvNCw0ZrQtSkg0LTQvtC30LLQvtC70L7QvCDQv9GA0LXQs9C70LXQtNCwINGC0LXRgNC80LjQvdCwICjQutCw0LvQtdC90LTQsNGA0LApJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAn0KHQstC4INC+0L/QtdGA0LDRgtC10YDQuCDRgdCwINC00L7Qt9Cy0L7Qu9C+0Lwg0L/QuNGB0LDRmtCwINGDINGC0LXRgNC80LjQvdGDICjQutCw0LvQtdC90LTQsNGA0YMpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICfQodC40YHRgtC10Lwg0L3QuNGY0LUg0YPRgdC/0LXQviDQtNCwINC60YDQtdC40YDQsCDQutCw0LvQtdC90LTQsNGAISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ9Cd0LXQvNCwIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ9Cd0LXQvNCw0YLQtSDQv9GA0LjRgdGC0YPQvyDQvtCy0L7QvCDQutCw0LvQtdC90LTQsNGA0YMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICfQmNC30LzQtdC90Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAn0JPRgNC10YjQutCwINC/0YDQuNC70LjQutC+0Lwg0LjQt9C80LXQvdC1INC60LDQu9C10L3QtNCw0YDQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAn0KPRh9C40YLQsNCy0LDRmtC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjRmNC1INC60LDQu9C10L3QtNCw0YDQsCDQvdC40ZjQtSDQsdC40LvQviDQvNC+0LPRg9Gb0LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ9Cc0L7Qu9C40LzQviDQstCw0YEg0LTQsCDQv9GA0L7QstC10YDQuNGC0LUg0LTQsCDQu9C4INGY0LUg0LLQsNGIINGE0LDRmNC7INC40YHQv9GA0LDQstCw0L0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ9Cd0LjRmNC1INC80L7Qs9GD0Zsg0YPQstC+0Lcg0LrQsNC70LXQvdC00LDRgNCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICfQmtCw0LvQtdC90LTQsNGAINGY0LUg0YPQstC10LfQtdC9ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAn0J/QvtGC0YDQtdCx0LDQvSDQmNCUINC60LDQu9C10L3QtNCw0YDQsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICfQndC1INC80L7Qs9GDINC/0YDQuNCx0LDQstC40YLQuCDQv9C+0LTQsNGC0LrQtSDQt9CwINC00LDRgtC4IENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ9Cj0YHQv9C10YjQvdC+INGD0LLQtdC30LXQvdC+ICVzINGC0LXRgNC80LjQvSjQsCkg0YMg0LrQsNC70LXQvdC00LDRgCAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1INC80LjQvdGD0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSDQvNC40L3Rg9GC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAg0LzQuNC90YPRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSDRgdCw0YInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAn0KHQstC4INGC0LXRgNC80LjQvdC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ9Ci0LXRgNC80LjQvdC4INC00L7QtNC10ZnQtdC90Lgg0LzQtdC90LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ9Cf0YDQuNC60LDQtyDRgdCw0LzQviDRgtC10YDQvNC40L3QsCDQtNC+0LTQtdGZ0LXQvdC40YUg0LLQsNC80LAhINCY0LfQvNC10L3QuNGC0LUg0L/QvtC00LXRiNCw0LLQsNGa0LAnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAn0KLQtdGA0LzQuNC9INC90LjRmNC1INC/0YDQvtC90LDRktC10L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAn0J3QuNC60LDQtNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ9Ch0LLQsNC60Lgg0LTQsNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICfQodCy0LDQutC1INGB0LXQtNC80LjRhtC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAn0KHQstCw0LrQvtCzINC80LXRgdC10YbQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAn0KHQstCw0LrQtSDQs9C+0LTQuNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAn0J/RgNC40LvQsNCz0L7RktC10L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ9CU0L3QtdCy0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICfQodC10LTQvNC40YfQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICfQnNC10YHQtdGH0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfQk9C+0LTQuNGI0ZrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ9GB0LLQsNC60L7QsyjQtSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICfRg9C60YPQv9C90L4gJXMg0L/Rg9GCKNCwKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICfQtNC+IC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICfRg9C60YPQv9C90L4gLi4uINC/0YPRgijQsCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICfQtNC+ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ9CR0LXQtyDQvtCx0LDQstC10YjRgtC10ZrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMg0LzQuNC90YPRgijQsCkg0L/RgNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMg0YHQsNGCKNCwKSDQv9GA0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzINC00LDQvSjQsCkg0L/RgNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMg0L3QtdC00LXRmdCwINC/0YDQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ9C/0YDQtSDQvdC10LPQviDRiNGC0L4g0YLQtdGA0LzQuNC9INC30LDQv9C+0YfQvdC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAn0L/QvtGI0YLQviDRgtC10YDQvNC40L0g0LfQsNC/0L7Rh9C90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAn0L/RgNC1INC90LXQs9C+INGI0YLQviDRgdC1INGC0LXRgNC80LjQvSDQt9Cw0LLRgNGI0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAn0L/QvtGI0YLQviDRgdC1INGC0LXRgNC80LjQvSDQt9Cw0LLRgNGI0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICfQkdC10Lcg0LTQvtC30LLQvtC70LUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ9Cd0LjRmNC1INC80L7Qs9GD0ZvQtSDQvtCx0YDQuNGB0LDRgtC4INGC0LXRgNC80LjQvSDRgtC40LrQtdGC0LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ9CR0LXQtyDQtNC+0LfQstC+0LvQtSEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAn0JHQtdC3INC00L7Qt9Cy0L7Qu9C1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ9Ch0LjRgdGC0LXQvCDQvdC40ZjQtSDRg9GB0L/QtdC+INC00LAg0YPQstC10LfQtSDRhNCw0ZjQuyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNoZWNrIHRoZSBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPSAn0JzQvtC70LjQvNC+INC/0YDQvtCy0LXRgNC40YLQtSDQu9C+0LMg0LfQsCDQstC40YjQtSDQuNC90YTQvtGA0LzQsNGG0LjRmNCwLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkINCy0LjRiNC1JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAn0JHQtdC3ICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAn0J3QtdC/0L7Qt9C90LDRgiDQutC+0YDQuNGB0L3QuNC6ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ9Cd0LXQuNGB0L/RgNCw0LLQsNC9INC60LDQu9C10L3QtNCw0YAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ9Cd0LXQuNGB0L/RgNCw0LLQvdCwINCw0LTRgNC10YHQsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAn0JPRgNC10YjQutCwINC/0YDQuNC70LjQutC+0Lwg0LXQutGB0L/QvtGA0YLQvtCy0LDRmtCwINC60LDQu9C10L3QtNCw0YDQsCEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICfQntGB0LLQtdC20LggKNC80LjQvdGD0YLQsCknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ9Ch0YLRgNCw0L3QuNGG0LAg0LfQsCDQv9GA0LXQs9C70LXQtCDQutCw0LvQtdC90LTQsNGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICfQntCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3Rgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAn0JzQvtC00YPQuyDQtNC+0LPQsNGS0LDRmNCwINC60LDQu9C10L3QtNCw0YDQsCDQt9CwINC/0YDQuNC/0YDQtdC80YMg0L7QsdCw0LLQtdGI0YLQtdGa0LAg0L4g0YLQtdGA0LzQuNC90LjQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAn0JzQvtC00YPQuyDQtNC+0LPQsNGS0LDRmNCwINC60LDQu9C10L3QtNCw0YDQsCDQt9CwINC+0YHQstC10LbQsNCy0LDRmtC1INGC0LjQutC10YLQsCDQv9C+0LTQsNGG0LjQvNCwINC40Lcg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ9Ch0YLRgNCw0L3QuNGG0LAg0LfQsCDQuNC30LzQtdC90YMg0LrQsNC70LXQvdC00LDRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAn0JvQuNGB0YLQsCDRgtC10YDQvNC40L3QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ9Cb0LjRgdGC0LAg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICfQntCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3Rgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICfQotC10YDQvNC40L3QuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ9Ch0YLRgNCw0L3QuNGG0LAg0LfQsCDRg9C/0YDQsNCy0ZnQsNGa0LUg0LrQsNC70LXQvdC00LDRgNC40LzQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAn0JjQt9Cw0LHQtdGA0Lgg0LfQsCDQutCw0LrQstC1INC/0YDQvtC80LXQvdC1INGC0LXRgNC80LjQvdCwINC20LXQu9C40Ygg0LTQsCDQv9GA0LjQvNC40Ygg0L7QsdCw0LLQtdGI0YLQtdGa0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICfQmtGA0LXQuNGA0LAg0L3QvtCy0Lgg0YLQtdGA0LzQuNC9INGDINC60LDQu9C10L3QtNCw0YDRgyDQv9C+0LLQtdC30LDQvSDRgdCwINC+0LLQuNC8INGC0LjQutC10YLQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAn0JrRgNC10LjRgNCw0ZrQtSDQuCDRg9C/0YDQsNCy0ZnQsNGa0LUg0L7QsdCw0LLQtdGI0YLQtdGa0LjQvNCwINC30LAg0YLQtdGA0LzQuNC90LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAn0JrRgNC10LjRgNCwINC90L7QstC4INGC0LXRgNC80LjQvS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC60L7RmNC1INC60L7Qu9C+0L3QtSDRm9C1INCx0LjRgtC4INC/0YDQuNC60LDQt9Cw0L3QtSDRgyDQsNC/0LvQuNC60LDRgtC40LLQvdC+0Lwg0LTQvtC00LDRgtC60YMg0LvQuNC90LrQvtCy0LDQvdC40YUg0YLQtdGA0LzQuNC90LAgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4g0JzQvtCz0YPRm9CwINC/0L7QtNC10YjQsNCy0LDRmtCwOiAwID0g0J7QvdC10LzQvtCz0YPRm9C10L3QviwgMSA9INCe0LzQvtCz0YPRm9C10L3QviwgMiA9INCf0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC+INC+0LzQvtCz0YPRm9C10L3Qvi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQuNC60L7QvdGDINGB0LAg0LvQuNC90LrQvtC8INC90LAgR29vZ2xlINC80LDQv9GDINGC0YDQtdC90YPRgtC90LUg0LvQvtC60LDRhtC40ZjQtSDRgyDQtdC60YDQsNC90YMg0LfQsCDQuNC30LzQtdC90YMg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDRgtC40L/QvtCy0LUg0L7QsdGY0LXQutGC0LAg0LTQvtCz0LDRktCw0ZjQsCDQutC+0ZjQuCDRm9C1INCx0LjRgtC4INC/0YDQvtGG0LXRgdC40YDQsNC90Lgg0L/Rg9GC0LXQvCBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQu9C40YHRgtGDINC/0LDRgNCw0LzQtdGC0LDRgNCwINC60L7RmNC4INC80L7Qs9GDINCx0LjRgtC4INC/0YDQvtGB0LvQtdGS0LXQvdC4INGE0YPQvdC60YbQuNGY0Lgg0L/RgNC10YLRgNCw0LPQtSDRgtC40LrQtdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LUg0L/QvtC30LDQtNC40L3RgdC60Lgg0LzQvtC00YPQuyDRgtC10YDQvNC40L3QsCDRgtC40LrQtdGC0LAg0LfQsCDQtNC40L3QsNC80LjRh9C60L4g0L/QvtGZ0LUg0LTQsNGC0YPQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQv9C+0LfQsNC00LjQvdGB0LrQuCDQvNC+0LTRg9C7INGC0LXRgNC80LjQvdCwINGC0LjQutC10YLQsCDQt9CwINCy0YDQtdC80LUg0LXRgdC60LDQu9Cw0YbQuNGY0LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC/0L7Qt9Cw0LTQuNC90YHQutC4INC80L7QtNGD0Lsg0YLQtdGA0LzQuNC90LAg0YLQuNC60LXRgtCwINC30LAg0LLRgNC10LzQtSDRh9C10LrQsNGa0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICfQlNC10YTQuNC90LjRiNC1INGC0LjQutC10YIg0LzQvtC00YPQuyDQt9CwINC60LDQu9C10L3QtNCw0YDRgdC60LUg0YLQtdGA0LzQuNC90LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAn0JjQt9C80LXQvdCwINGC0LXRgNC80LjQvdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICfQktGA0LXQvNC1INC/0YDQstC+0LMg0L7QtNCz0L7QstC+0YDQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICfQldC60YDQsNC9INC30LAg0YPQstC+0Lcg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ9Cf0L7QstC10LfRg9GY0LUg0YLQtdGA0LzQuNC90LUg0Lgg0YLQuNC60LXRgtC1ICLQndC+0YDQvNCw0LvQvdC40LwiINCy0YDRgdGC0LDQvNCwINCy0LXQt9CwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAn0JvQuNGB0YLQsCDRgdCy0LjRhSDQvtCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3QuNC80LAg0LfQsCDQv9GA0LjQutCw0Lcg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICfQm9C40YHRgtCwINGB0LLQuNGFINC00L7Qs9Cw0ZLQsNGY0LAg0L3QsCDQutCw0LvQtdC90LTQsNGA0LjQvNCwINC60L7RmNCwINGb0LUg0LHQuNGC0Lgg0L/RgNC40LrQsNC30LDQvdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ9Cb0LjRgdGC0LAg0LHQvtGY0LAg0YMg0YXQtdC60YHQsNC00LXRhtC40LzQsNC70L3QvtC8IFJHQiDQt9Cw0L/QuNGB0YMg0LrQvtGY0LUg0ZvQtSDQsdC40YLQuCDQtNC+0YHRgtGD0L/QvdC1INC30LAg0LjQt9Cx0L7RgCDQv9GA0LjQu9C40LrQvtC8INC/0YDQsNCy0ZnQtdGa0LAg0LrQsNC70LXQvdC00LDRgNCwLiDQntCx0YDQsNGC0LjRgtC1INC/0LDQttGa0YMg0LTQsCDRgdGDINCx0L7RmNC1INC00L7QstC+0ZnQvdC+INGC0LDQvNC90LUg0YLQsNC60L4g0LTQsCDQsdC10LvQuCDRgtC10LrRgdGCINC80L7QttC1INCx0LjRgtC4INC40YHQv9C40YHQsNC9INC90LAg0ZrQuNC80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ9Cj0L/RgNCw0LLRmdCw0ZrQtSDRgNCw0LfQu9C40YfQuNGC0LjQvCDQutCw0LvQtdC90LTQsNGA0LjQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ9Cc0LDQutGB0LjQvNCw0LvQvdC4INCx0YDQvtGYINCw0LrRgtC40LLQvdC40YUg0LrQsNC70LXQvdC00LDRgNCwINGDINC10LrRgNCw0L3QuNC80LAg0LfQsCDQv9GA0LXQs9C70LXQtC4g0J7QsdGA0LDRgtC40YLQtSDQv9Cw0LbRmtGDINC00LAg0LLQtdC70LjQutC4INCx0YDQvtGYINCw0LrRgtC40LLQvdC40YUg0LrQsNC70LXQvdC00LDRgNCwINC80L7QttC1INC40LzQsNGC0Lgg0YPRgtC40YbQsNGYINC90LAg0L/QtdGA0YTQvtGA0LzQsNC90YHQtSDQstCw0YjQtdCzINGB0LXRgNCy0LXRgNCwINC/0YDQsNCy0ZnQtdGa0LXQvCDQv9GA0LXQstC40YjQtSDRgdC40LzRg9C70YLQsNC90LjRhSDQt9Cw0YXRgtC10LLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSUyDQvdC1INC/0L7QtNGA0LbQsNCy0LAg0YLQtdGA0LzQuNC90LUg0LrQvtGY0Lgg0YHQtSDQv9C+0L3QsNCy0ZnQsNGY0YMg0LHQtdC3INC60YDQsNGY0ZrQtdCzINC00LDRgtGD0LzQsCDQuNC70Lgg0LHRgNC+0ZjQsCDQuNGC0LXRgNCw0YbQuNGY0LAuINCf0YDQuNC70LjQutC+0Lwg0YPQstC+0LfQsCDQutCw0LvQtdC90LTQsNGA0LAsINC80L7QttC1INGB0LUg0LTQvtCz0L7QtNC40YLQuCDQtNCwIElDUyDRhNCw0ZjQuyDRgdCw0LTRgNC20Lgg0YLQsNC60LLQtSBcJ9Cx0LXRgdC60L7QvdCw0YfQvdC1XCcg0YLQtdGA0LzQuNC90LUuINCj0LzQtdGB0YLQviDRgtCw0LrQstC+0LMg0L/QvtC90LDRiNCw0ZrQsCwg0YHQuNGB0YLQtdC8INGb0LUg0LrRgNC10LjRgNCw0YLQuCDRgdCy0LUg0YLQtdGA0LzQuNC90LUg0LjQtyDQv9GA0L7RiNC70L7RgdGC0LgsINC60LDQviDQuCDRgtC10YDQvNC40L3QtSDQt9CwINGB0LvQtdC00LXRm9C4IG4g0LHRgNC+0Zgg0LzQtdGB0LXRhtC4ICjQv9C+0LTRgNCw0LfRg9C80LXQstCw0L3QviAxMjAg0LzQtdGB0LXRhtC4LzEwINCz0L7QtNC40L3QsCkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAn0J/RgNC10LPQu9C10LQg0YHQstC40YUg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ9CS0YDQtdC80LUg0YfQtdC60LDRmtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICfQnNC+0LTRg9C7INC/0YDQtdGC0YDQsNCz0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICfQnNC+0LTRg9C7INC/0YDQtdGC0YDQsNCz0LUg0LfQsCDQsNGD0YLQvtC80LDRgtGB0LrQviDQtNC+0L/Rg9Ga0LDQstCw0ZrQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAn0IjQsNCy0L3QuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICfQiNCw0LLQvdC4INC60LDQu9C10L3QtNCw0YAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAn0J/RgNC10LPQu9C10LQg0YDQtdGB0YPRgNGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAn0J/RgNC10LPQu9C10LQg0YDQtdGB0YPRgNGB0LAgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ9Cf0YDQuNC60LDQt9GD0ZjQtSDQstC10LfRgyDRgyDQvNC10L3QuNGY0YMg0YLQuNC60LXRgtCwINC30LAg0LrRgNC10LjRgNCw0ZrQtSDRgtC10YDQvNC40L3QsCDRgyDQutCw0LvQtdC90LTQsNGA0YMg0L/QvtCy0LXQt9Cw0L3QvtCzINGB0LAg0YLQuNC8INGC0LjQutC10YLQvtC8LiDQlNC+0LTQsNGC0L3QsCDQutC+0L3RgtGA0L7Qu9CwINC/0YDQuNC60LDQt9CwINC+0LLQtSDQstC10LfQtSDQvNC+0LbQtSDRgdC1INC/0L7RgdGC0LjRm9C4INC60L7RgNC40YjRm9C10ZrQtdC8INC60ZnRg9GH0LAgIkdyb3VwIiDRgdCwINGB0LDQtNGA0LbQsNGY0LXQvCAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiDQl9CwINC30LTRgNGD0LbQuNCy0LDRmtC1INCy0LXQt9CwINGDINC80LXQvdC40ZjRgyDQv9C+0LTQtdGB0LjRgtC1INC60ZnRg9GHICJDbHVzdGVyTmFtZSIg0YHQsCDRgdCw0LTRgNC20LDRmNC10Lwg0LrQvtGY0Lgg0ZvQtSDQsdC40YLQuCDQvdCw0LfQuNCyINC60L7RmNC4INC20LXQu9C40YLQtSDQtNCwINCy0LjQtNC40YLQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgy4g0JrQvtGA0LjRgdGC0LjRgtC1INC60ZnRg9GHICJDbHVzdGVyUHJpb3JpdHkiINC30LAg0LjQt9C80LXQvdGDINGA0LXQtNC+0YHQu9C10LTQsCDQs9GA0YPQv9CwINGDINC80LXQvdC40ZjRgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ9CS0YDQtdC80LUg0YDQtdGI0LDQstCw0ZrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ9CY0LfQsdC+0YAg0YLRgNCw0L3RgdC/0L7RgNGC0LAg0LfQsCDQvtCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3Rgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAn0JDQutGC0LjQstC40YDQsCDQtNC+0LTQsNCy0LDRmtC1INC40LvQuCDQvtGB0LLQtdC20LDQstCw0ZrQtSDQsNGD0YLQvtC80LDRgtGB0LrQuNGFINGC0LXRgNC80LjQvdCwINC90LAg0L7RgdC90L7QstGDINCy0YDQtdC80LXQvdCwINGC0LjQutC10YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICfQktGA0LXQvNC1INCw0LbRg9GA0LjRgNCw0ZrQsCc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnNyX0xhdG5fT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ09iYXZlxaF0ZW5qZSBwb2RzZXRuaWthIG8gdGVybWludSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnRG9iacSHZXRlIG9iYXZlxaF0ZW5qZSBzdmFraSBwdXQga2FkYSBkb8SRZSBkbyB2cmVtZW5hIHBvZHNldG5pa2EgemEgbmVraSBvZCB2YcWhaWggdGVybWluYS4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICdVcHJhdmxqYW5qZSBvYmF2ZcWhdGVuamltYSBvIHRlcm1pbmltYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ092ZGUgbW/FvmV0ZSBwb3NsYXRpIGtvbmZpZ3VyYWNpb251IGRhdG90ZWt1IHphIHV2b3ogb2JhdmXFoXRlbmphIG8gdGVybWludSB1IHZhxaEgc2lzdGVtLiBEYXRvdGVrYSBtb3JhIGJpdGkgdSBpc3RvbSAueW1sIGZvcm1hdHUga29qaSBqZSBtb2d1xIdlIGRvYml0aSBpenZvem9tIHUgZWtyYW51IHVwcmF2bGphbmphIG9iYXZlxaF0ZW5qaW1hIG8gdGVybWluaW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ092ZGUgbW/FvmV0ZSBpemFicmF0aSBrb2ppIGRvZ2HEkWFqaSDEh2UgcG9rcmVudXRpIG9iYXZlxaF0YXZhbmplLiBEb2RhdG5pIGZpbHRlciB6YSB0ZXJtaW5lIG1vxb5lIGJpdGkgcHJpbWVuamVuIHJhZGkgc2xhbmphIHNhbW8gemEgdGVybWluZSBwbyBvZHJlxJFlbm9tIGtyaXRlcmlqdW11Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdGaWx0ZXIgdGVybWluYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnVGltJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVzdXJzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAnT2JhdmVzdGkga29yaXNuaWthIHNhbW8gamVkbm9tIGRuZXZubyBvIHBvamVkaW5hxI1ub20gdGVybWludSBrb3JpxaHEh2VuamVtIGl6YWJyYW5vZyB0cmFuc3BvcnRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ09iYXZlxaF0ZW5qZSDEh2UgYml0aSBwb3NsYXRvIG9wZXJhdGVydS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ0RhIHZpZGl0ZSBwcnZpaCAyMCBrYXJha3RlcmEgbmFzbG92YSB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ0RhIHZpZGl0ZSBhdHJpYnV0ZSB0ZXJtaW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnRGEgdmlkaXRlIGF0cmlidXRlIGthbGVuZGFyYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICdQcmVnbGVkIGRuZXZub2cgcmVkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAnVXByYXZsamFuamUga2FsZW5kYXJpbWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnRG9kYWogdGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnQm9qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0RhdHVtIGtyYWphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ1BvbmF2bGphbmplJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ05pamUgcHJvbmHEkWVuIG5pamVkYW4ga2FsZW5kYXIuIE1vbGltbyBwcnZvIGRvZGFqdGUga2FsZW5kYXIga29yacWhxIdlbmplbSBla3JhbmEgVXByYXZsamFuamUga2FsZW5kYXJpbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnVGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdPdmFqIHRlcm1pbiBzZSBwb25hdmxqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ0RhIGxpIMW+ZWxpdGUgZGEgaXptZW5pIHNhbW8gb3ZvIGlsaSBzdmEgcG9uYXZsamFuamE/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ1N2YSBwb25hdmxqYW5qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ1NhbW8gb3ZvIHBvbmF2bGphbmplJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdVcHJhdmxqYW5qZSBrYWxlbmRhcmltYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1ByZWdsZWQga2FsZW5kYXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdEb2RhaiBub3ZpIGthbGVuZGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ0RvZGFqIGthbGVuZGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdVdmV6aSB0ZXJtaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ1V2b3oga2FsZW5kYXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnT3ZkZSBtb8W+ZXRlIHXEjWl0YXRpIGtvbmZpZ3VyYWNpb251IGRhdG90ZWt1IHphIHV2b3oga2FsZW5kYXJhIHUgdmHFoSBzaXN0ZW0uIERhdG90ZWthIG1vcmEgYml0aSB1IC55bWwgZm9ybWF0dSBpenZlemVuYSBvZCBzdHJhbmUgbW9kdWxhIHphIHVwcmF2bGphbmplIGthbGVuZGFyaW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ1XEjWl0YWoga29uZmlndXJhY2lqdSBrYWxlbmRhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnVXZlemkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICdGaWx0ZXIgemEga2FsZW5kYXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ1UgemF2aXNub3N0aSBvZCBwb2xqYSBncnVwZSwgc2lzdGVtIMSHZSBkb3p2b2xpdGkgcHJpc3R1cCBrYWxlbmRhcnUgb3BlcmF0ZXJpbWEgcHJlbWEgbmppaG92b20gbml2b3UgcHJpc3R1cGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnUk86IG9wZXJhdGVyaSBtb2d1IHByZWdsZWRhdGkgaSBla3Nwb3J0b3ZhdGkgc3ZlIHRlcm1pbmUgdSBrYWxlbmRhcnUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnUHJlbWVzdGkgdTogb3BlcmF0ZXJpIG1vZ3UgbW9kaWZpa292YXRpIHRlcm1pbmUgdSBrYWxlbmRhcnUsIGFsaSBiZXogcHJvbWVuZSBrb20ga2FsZW5kYXJ1IHByaXBhZGFqdS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ0tyZWlyYW5qZTogb3BlcmF0ZXJpIG1vZ3Uga3JlaXJhdGkgaSBicmlzYXRpIHRlcm1pbmUgdSBrYWxlbmRhcnUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICdSVzogb3BlcmF0ZXJpIG1vZ3UgYWRtaW5pc3RyaXJhdGkgaSBzYW0ga2FsZW5kYXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ0FkcmVzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdJenZlemkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdQcmV1em1pIGthbGVuZGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ0lza29waXJhaiBqYXZudSBhZHJlc3Uga2FsZW5kYXJhIChVUkwpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdOYXppdiBrYWxlbmRhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnS2FsZW5kYXIgc2EgaXN0aW0gbmF6aXZvbSB2ZcSHIHBvc3RvamkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Blcm1pc3Npb24gZ3JvdXAnfSA9ICdHcnVwYSBwcmlzdHVwYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAnVGVybWluaSB0aWtldGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1ByYXZpbG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnS29yaXN0ZcSHaSBvcGNpamUgaXNwb2QgaXphYmVyaXRlIHphIGtvamUgdGlrZXRlIMSHZSB0ZXJtaW5pIGJpdGkgYXV0b21hdHNraSBrcmVpcmFuaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ01vbGltbyBkYSBvZGFiZXJldGUgdmHFvmXEh2kgcmVkLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0F0cmlidXRpIHByZXRyYWdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnRGVmaW5pxaFpdGUgcHJhdmlsYSB6YSBrcmVpcmFuamUgYXV0b21hdHNraWggdGVybWluYSB1IG92b20ga2FsZW5kYXJ1IG5hIG9zbm92dSB0aWtldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnRG9kYWogcHJhdmlsbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnVmnFoWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ01hbmplJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0RvZGFqIG5vdmkgdGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0thbGVuZGFyaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnUHJldmnFoWUgYWt0aXZuaWgga2FsZW5kYXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJ0lsaSBwcnZvIGlza2xqdcSNaXRlIHByaWtheiBuZWtvZyBrYWxlbmRhcmEgaWxpIHBvdmXEh2FqdGUgbGltaXQgdSBrb25maWd1cmFjaWppLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnU2VkbWljYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ01lc2XEjW5hIG9zYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAnU2VkbWnEjW5hIG9zYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICdEbmV2bmEgb3NhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdTa2/EjWknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ1BvbmnFoXRpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdQcmlrYcW+aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ09zbm92bmUgaW5mb3JtYWNpamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0dW0vdnJlbWUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ01vbGltbyBwb3N0YXZpdGUgb3ZhaiBkYXR1bSBwcmUga3JhamEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ01vbGltbyBwb3N0YXZpdGUgb3ZhaiBkYXR1bSBwb3NsZSBwb8SNZXRrYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ092byBqZSB0ZXJtaW4ga29qaSBzZSBwb25hdmxqYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdLbGlrbml0ZSBvdmRlIHphIHByZWdsZWQgbWF0acSNbm9nIHRlcm1pbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0tsaWtuaXRlIG92ZGUgemEgaXptZW51IG1hdGnEjW5vZyB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdVxI1lc3RhbG9zdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ1N2YWtvZyhlKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUmVsYXRpdm5vIHZyZW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJ0RhIGxpIHN0ZSBzaWd1cm5pIGRhIMW+ZWxpdGUgZGEgaXpicmnFoWV0ZSBvdmFqIHRlcm1pbj8gT3Z1IG9wZXJhY2lqdSBuaWplIG1vZ3XEh2Ugb3BvenZhdGkuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdVdm96IHRlcm1pbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICdQb3NsYXRpIGZhamwgbW9yYSBiaXRpIHUgaXNwcmF2bm9tIGlDYWwgZm9ybWF0dSAoLmljcykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ1Vrb2xpa28gxb5lbGplbmkga2FsZW5kYXIgbmlqZSBpemxpc3RhbiwgcHJvdmVyaXRlIGRhIGxpIGltYXRlIG5pdm8gcHJpc3R1cGEgXCdrcmVpcmFuamVcJyB6YSBncnVwdSBrYWxlbmRhcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnT3N2ZcW+aSBwb3N0b2plxIdlIHRlcm1pbmU/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnU3ZpIHBvc3RvamXEh2kgdGVybWluaSB1IGthbGVuZGFydSBzYSBpc3RpbSBVbmlxdWVJRCBwb2xqZW0gxIdlIGJpdGkgcHJlYnJpc2FuaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAnUG/FoWFsamkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ1V2ZXppIHRlcm1pbmUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTm92aSB0ZXJtaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ1Vza29ybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc1IGRhbmEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnT2JhdmXFoXRlbmplIHNhIG92aW0gbmF6aXZvbSB2ZcSHIHBvc3RvamkhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdPcGVyYXRlciAocmVzdXJzKSwga29qaSBqZSBpemFicmFuIHUgdGVybWludSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdTdmkgb3BlcmF0ZXJpIHNhIChuYWptYW5qZSkgZG96dm9sb20gcHJlZ2xlZGEgdGVybWluYSAoa2FsZW5kYXJhKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ1N2aSBvcGVyYXRlcmkgc2EgZG96dm9sb20gcGlzYW5qYSB1IHRlcm1pbnUgKGthbGVuZGFydSknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ1Npc3RlbSBuaWplIHVzcGVvIGRhIGtyZWlyYSBrYWxlbmRhciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdOZW1hIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ05lbWF0ZSBwcmlzdHVwIG92b20ga2FsZW5kYXJ1ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAnSXptZW5pIGthbGVuZGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdHcmXFoWthIHByaWxpa29tIGl6bWVuZSBrYWxlbmRhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ1XEjWl0YXZhbmplIGtvbmZpZ3VyYWNpamUga2FsZW5kYXJhIG5pamUgYmlsbyBtb2d1xIdlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdNb2xpbW8gdmFzIGRhIHByb3Zlcml0ZSBkYSBsaSBqZSB2YcWhIGZhamwgaXNwcmF2YW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05pamUgbW9ndcSHIHV2b3oga2FsZW5kYXJhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdLYWxlbmRhciBqZSB1dmV6ZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdQb3RyZWJhbiBJRCBrYWxlbmRhcmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnTmUgbW9ndSBwcmliYXZpdGkgcG9kYXRrZSB6YSBkYXRpIENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ1VzcGXFoW5vIHV2ZXplbm8gJXMgdGVybWluKGEpIHUga2FsZW5kYXIgJXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNSBtaW51dGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgbWludXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIG1pbnV0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgc2F0JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1N2aSB0ZXJtaW5pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ1Rlcm1pbmkgZG9kZWxqZW5pIG1lbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ1ByaWtheiBzYW1vIHRlcm1pbmEgZG9kZWxqZW5paCB2YW1hISBJem1lbml0ZSBwb2RlxaFhdmFuamEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnVGVybWluIG5pamUgcHJvbmHEkWVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ05pa2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdTdmFraSBkYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ1N2YWtlIHNlZG1pY2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdTdmFrb2cgbWVzZWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdTdmFrZSBnb2RpbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnUHJpbGFnb8SRZW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRG5ldm5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1NlZG1pxI1ubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnTWVzZcSNbm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnR29kacWhbmplJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnc3Zha29nKGUpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAndWt1cG5vICVzIHB1dChhKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdkbyAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAndWt1cG5vIC4uLiBwdXQoYSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICdkbyAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICdCZXogb2JhdmXFoXRlbmphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dChhKSBwcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBzYXQoYSkgcHJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBkYW4oYSkgcHJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgbmVkZWxqYSBwcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdwcmUgbmVnbyDFoXRvIHRlcm1pbiB6YXBvxI1uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ3BvxaF0byB0ZXJtaW4gemFwb8SNbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAncHJlIG5lZ28gxaF0byBzZSB0ZXJtaW4gemF2csWhaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICdwb8WhdG8gc2UgdGVybWluIHphdnLFoWknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICdCZXogZG96dm9sZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnTmlqZSBtb2d1xIdlIG9icmlzYXRpIHRlcm1pbiB0aWtldGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ0JleiBkb3p2b2xlISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEltcG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMnfSA9ICdCZXogZG96dm9sZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICdTaXN0ZW0gbmlqZSB1c3BlbyBkYSB1dmV6ZSBmYWpsISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdNb2xpbW8gcHJvdmVyaXRlIGxvZyB6YSB2acWhZSBpbmZvcm1hY2lqYS4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCB2acWhZSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ0JleiAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ05lcG96bmF0IGtvcmlzbmlrISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ05laXNwcmF2YW4ga2FsZW5kYXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ05laXNwcmF2bmEgYWRyZXNhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdHcmXFoWthIHByaWxpa29tIGVrc3BvcnRvdmFuamEga2FsZW5kYXJhISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ09zdmXFvmkgKG1pbnV0YSknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ1N0cmFuaWNhIHphIHByZWdsZWQga2FsZW5kYXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnT2JhdmXFoXRlbmphIG8gdGVybWludSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnTW9kdWwgZG9nYcSRYWphIGthbGVuZGFyYSB6YSBwcmlwcmVtdSBvYmF2ZcWhdGVuamEgbyB0ZXJtaW5pbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICdNb2R1bCBkb2dhxJFhamEga2FsZW5kYXJhIHphIG9zdmXFvmF2YW5qZSB0aWtldGEgcG9kYWNpbWEgaXogdGVybWluYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnU3RyYW5pY2EgemEgaXptZW51IGthbGVuZGFyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ0xpc3RhIHRlcm1pbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdMaXN0YSB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnT2JhdmXFoXRlbmphIG8gdGVybWludSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdUZXJtaW5pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnU3RyYW5pY2EgemEgdXByYXZsamFuamUga2FsZW5kYXJpbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ0l6YWJlcmkgemEga2FrdmUgcHJvbWVuZSB0ZXJtaW5hIMW+ZWxpxaEgZGEgcHJpbWnFoSBvYmF2ZcWhdGVuamEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdLcmVpcmEgbm92aSB0ZXJtaW4gdSBrYWxlbmRhcnUgcG92ZXphbiBzYSBvdmltIHRpa2V0b20nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdLcmVpcmFuamUgaSB1cHJhdmxqYW5qZSBvYmF2ZcWhdGVuamltYSB6YSB0ZXJtaW5lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0tyZWlyYSBub3ZpIHRlcm1pbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICdEZWZpbmnFoWUga29qZSBrb2xvbmUgxIdlIGJpdGkgcHJpa2F6YW5lIHUgYXBsaWthdGl2bm9tIGRvZGF0a3UgbGlua292YW5paCB0ZXJtaW5hIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIE1vZ3XEh2EgcG9kZcWhYXZhbmphOiAwID0gT25lbW9ndcSHZW5vLCAxID0gT21vZ3XEh2VubywgMiA9IFBvZHJhenVtZXZhbm8gb21vZ3XEh2Vuby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnRGVmaW5pxaFlIGlrb251IHNhIGxpbmtvbSBuYSBHb29nbGUgbWFwdSB0cmVudXRuZSBsb2thY2lqZSB1IGVrcmFudSB6YSBpem1lbnUgdGVybWluYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICdEZWZpbmnFoWUgdGlwb3ZlIG9iamVrdGEgZG9nYcSRYWphIGtvamkgxIdlIGJpdGkgcHJvY2VzaXJhbmkgcHV0ZW0gQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBsaXN0dSBwYXJhbWV0YXJhIGtvamkgbW9ndSBiaXRpIHByb3NsZcSRZW5pIGZ1bmtjaWppIHByZXRyYWdlIHRpa2V0YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnRGVmaW5pxaFlIHBvemFkaW5za2kgbW9kdWwgdGVybWluYSB0aWtldGEgemEgZGluYW1pxI1rbyBwb2xqZSBkYXR1bWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmnFoWUgcG96YWRpbnNraSBtb2R1bCB0ZXJtaW5hIHRpa2V0YSB6YSB2cmVtZSBlc2thbGFjaWplLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnRGVmaW5pxaFlIHBvemFkaW5za2kgbW9kdWwgdGVybWluYSB0aWtldGEgemEgdnJlbWUgxI1la2FuamEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICdEZWZpbmnFoWUgdGlrZXQgbW9kdWwgemEga2FsZW5kYXJza2UgdGVybWluZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdJem1lbmEgdGVybWluYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnVnJlbWUgcHJ2b2cgb2Rnb3ZvcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnRWtyYW4gemEgdXZveiB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdQb3ZlenVqZSB0ZXJtaW5lIGkgdGlrZXRlICJOb3JtYWxuaW0iIHZyc3RhbWEgdmV6YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIHN2aWggb2JhdmXFoXRlbmphIG8gdGVybWluaW1hIHphIHByaWtheiB1IGludGVyZmVqc3UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBzdmloIGRvZ2HEkWFqYSBuYSBrYWxlbmRhcmltYSBrb2phIMSHZSBiaXRpIHByaWthemFuYSB1IGludGVyZmVqc3UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnTGlzdGEgYm9qYSB1IGhla3NhZGVjaW1hbG5vbSBSR0IgemFwaXN1IGtvamUgxIdlIGJpdGkgZG9zdHVwbmUgemEgaXpib3IgcHJpbGlrb20gcHJhdmxqZW5qYSBrYWxlbmRhcmEuIE9icmF0aXRlIHBhxb5uanUgZGEgc3UgYm9qZSBkb3ZvbGpubyB0YW1uZSB0YWtvIGRhIGJlbGkgdGVrc3QgbW/FvmUgYml0aSBpc3Bpc2FuIG5hIG5qaW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdVcHJhdmxqYW5qZSByYXpsacSNaXRpbSBrYWxlbmRhcmltYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICdNYWtzaW1hbG5pIGJyb2ogYWt0aXZuaWgga2FsZW5kYXJhIHUgZWtyYW5pbWEgemEgcHJlZ2xlZC4gT2JyYXRpdGUgcGHFvm5qdSBkYSB2ZWxpa2kgYnJvaiBha3Rpdm5paCBrYWxlbmRhcmEgbW/FvmUgaW1hdGkgdXRpY2FqIG5hIHBlcmZvcm1hbnNlIHZhxaFlZyBzZXJ2ZXJhIHByYXZsamVuamVtIHByZXZpxaFlIHNpbXVsdGFuaWggemFodGV2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSUyBuZSBwb2Ryxb5hdmEgdGVybWluZSBrb2ppIHNlIHBvbmF2bGphanUgYmV6IGtyYWpuamVnIGRhdHVtYSBpbGkgYnJvamEgaXRlcmFjaWphLiBQcmlsaWtvbSB1dm96YSBrYWxlbmRhcmEsIG1vxb5lIHNlIGRvZ29kaXRpIGRhIElDUyBmYWpsIHNhZHLFvmkgdGFrdmUgXCdiZXNrb25hxI1uZVwnIHRlcm1pbmUuIFVtZXN0byB0YWt2b2cgcG9uYcWhYW5qYSwgc2lzdGVtIMSHZSBrcmVpcmF0aSBzdmUgdGVybWluZSBpeiBwcm/FoWxvc3RpLCBrYW8gaSB0ZXJtaW5lIHphIHNsZWRlxIdpIG4gYnJvaiBtZXNlY2kgKHBvZHJhenVtZXZhbm8gMTIwIG1lc2VjaS8xMCBnb2RpbmEpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ1ByZWdsZWQgc3ZpaCB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdWcmVtZSDEjWVrYW5qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnTW9kdWwgcHJldHJhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICdNb2R1bCBwcmV0cmFnZSB6YSBhdXRvbWF0c2tvIGRvcHVuamF2YW5qZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnSmF2bmkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ0phdm5pIGthbGVuZGFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1ByZWdsZWQgcmVzdXJzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdQcmVnbGVkIHJlc3Vyc2EgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ1ByaWthenVqZSB2ZXp1IHUgbWVuaWp1IHRpa2V0YSB6YSBrcmVpcmFuamUgdGVybWluYSB1IGthbGVuZGFydSBwb3ZlemFub2cgc2EgdGltIHRpa2V0b20uIERvZGF0bmEga29udHJvbGEgcHJpa2F6YSBvdmUgdmV6ZSBtb8W+ZSBzZSBwb3N0acSHaSBrb3JpxaHEh2VuamVtIGtsanXEjWEgIkdyb3VwIiBzYSBzYWRyxb5hamVtICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFphIHpkcnXFvml2YW5qZSB2ZXphIHUgbWVuaWp1IHBvZGVzaXRlIGtsanXEjSAiQ2x1c3Rlck5hbWUiIHNhIHNhZHLFvmFqZW0ga29qaSDEh2UgYml0aSBuYXppdiBrb2ppIMW+ZWxpdGUgZGEgdmlkaXRlIHUgaW50ZXJmZWpzdS4gS29yaXN0aXRlIGtsanXEjSAiQ2x1c3RlclByaW9yaXR5IiB6YSBpem1lbnUgcmVkb3NsZWRhIGdydXBhIHUgbWVuaWp1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnVnJlbWUgcmXFoWF2YW5qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ0l6Ym9yIHRyYW5zcG9ydGEgemEgb2JhdmXFoXRlbmphIG8gdGVybWludS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnQWt0aXZpcmEgZG9kYXZhbmplIGlsaSBvc3Zlxb5hdmFuamUgYXV0b21hdHNraWggdGVybWluYSBuYSBvc25vdnUgdnJlbWVuYSB0aWtldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAnVnJlbWUgYcW+dXJpcmFuamEnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnN2X09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdLYWxlbmRlcmjDpG5kZWxzZXDDpW1pbm5lbHNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdEdSBmw6VyIGVuIG5vdGlmaWVyaW5nIGbDtnIgdmFyamUgcMOlbWlubmVsc2V0aWQgZsO2ciBkaW5hIGthbGVuZGVyaMOkbmRlbHNlci4gJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnS2FsZW5kZXJow6RuZGVsc2Vww6VtaW5uZWxzZWhhbnRlcmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ0R1IGthbiBsw6RzYSBpbiBlbiBrb25maWd1cmF0aW9uc2ZpbCBtZWQga2FsZW5kZXJow6RuZGVsc2Vww6VtaW5uZWxzZXIuIEZpbGVuIGJlaMO2dmVyIHZhcmEgcMOlIGRldCAgLnltbC1mb3JtYXQgc29tIGR1IGbDpXIgdmlkIGV4cG9ydCBmcsOlbiBrYWxlbmRlcmjDpG5kZWxzZXDDpW1pbm5lbHNlLXZ5bi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICdCZXN0w6RtIHZpbGthIGjDpG5kZWxzZXIgc29tIGFrdGl2ZXJhciBkZW5uYSBww6VtaW5uZWxzZW5vdGlmaWVyaW5nLiBZdHRlcmxpZ2FyZSBmaWx0ZXIga2FuIGFwcGxpY2VyYXMgZsO2ciBhdHQgZW5kYXN0IHNraWNrYSBww6VtaW5uZWxzZXIgZsO2ciBrYWxlbmRlcmjDpG5kZWxzZXIgc29tIHVwcGZ5bGxlciBmaWx0ZXJrcml0ZXJpZXJuYS4gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0thbGVuZGVyaMOkbmRlbHNmaWx0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0dydXBwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVzdXJzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnUMOlbWlubmVsc2VyIHNraWNrYXMgdGlsbCBoYW5kbMOkZ2dhcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnRGFnb3JkbmluZ3N2eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAnSGFudGVyYSBrYWxlbmRyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnTMOkZ2cgdGlsbCBow6RuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdGw6RyZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ1NsdXRkYXR1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdVcHByZXBhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ0hpdHRhciBpbmdlbiBrYWxlbmRlci4gTMOkZ2cgdGlsbCBlbiBrYWxlbmRlciB1bmRlciBIYW50ZXJhIGthbGVuZHJhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdLYWxlbmRlcmjDpG5kZWxzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50J30gPSAnVXBwcmVwYWQga2FsZW5kZXJow6RuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnQWxsYSBmw7ZyZWtvbXN0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICdFbmRhc3QgZGVubmEgaMOkbmRlbHNlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdLYWxlbmRlcmhhbnRlcmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ0thbGVuZGVyw7Z2ZXJzaWt0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdMw6RnZyB0aWxsIGthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ0zDpGdnIHRpbGwga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGVyYSBrYWxlbmRlcmjDpG5kZWxzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAnSW1wb3J0ZXJhIGthbGVuZHJhciAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICdMw6RzIGluIGthbGVuZGVya29uZmlndXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdJbXBvcnRlcmEga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICdLYWxlbmRlcmZpbHRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRlcmEga2FsZW5kZXJuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnSMOkbXRhIGthbGVuZGVybic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdLb3BpZXJhIGthbGVuZGVybnMgcHVibGlrYSBVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ0thbGVuZGVybmFtbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICdSZWdlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ0zDpGdnIHRpbGwgcmVnZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ01lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWluZHJlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0zDpGdnIHRpbGwgbnkga2FsZW5kZXJow6RuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAnS2FsZW5kcmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdGw7ZyIG3DpW5nYSBha3RpdmEga2FsZW5kcmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnVmVja2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICdNw6VuYWRzdnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ1ZlY2tvdnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAnRGFnc3Z5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdIb3BwYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnQXZmw6RyZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ1Zpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0dW0vdGlkJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnS2FsZW5kZXJow6RuZGVsc2VpbXBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICdJbmzDpHN0YSBmaWxlciBtw6VzdGUgdmFyYSBpQ2FsLWZpbGVyICguaWNzKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnVXBwZGF0ZXJhIG51dmFyYW5kZSBrYWxlbmRlcmjDpG5kZWxzZXI/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnQWxsYSBudXZhcmFuZGUga2FsZW5kZXJow6RuZGVsc2VyIG1lZCBzYW1tYSBJRCBza3JpdnMgw7Z2ZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0zDpHMgaW4gZW4ga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGVyYSBrYWxlbmRlcmjDpG5kZWxzZXInOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTnkga2FsZW5kZXJow6RuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ1NuYXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZGFnYXInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnUMOlbWlubmVsc2VuYW1uZXQgZmlubnMgcmVkYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnQWxsYSBoYW5kbMOkZ2dhcmUgbWVkICjDpXRtaW5zdG9uZSkgbMOkc3LDpHR0aWdoZXRlciBmw7ZyIGthbGVuZGVyaMOkbmRlbHNlbiAoa2FsZW5kZXJuKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FsbGEgaGFuZGzDpGdnYXJlIG1lZCBza3JpdnLDpHR0aWdoZXRlciBmw7ZyIGthbGVuZGVyaMOkbmRlbHNlbiAoa2FsZW5kZXJuKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnS3VuZGUgaW50ZSBza2FwYSBrYWxlbmRlcm4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnS2FsZW5kZXItSUQgc2FrbmFzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdEdSBoYXIgaW5nZW4gw6V0a29tc3QgdGlsbCBrYWxlbmRlcm4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdSZWRpZ2VyYSBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnS3VuZGUgaW50ZSB1cHBkYXRlcmEga2FsZW5kZXJuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnS2FsZW5kZXJrb25maWd1cmF0aW9uc2ZpbGVuIGt1bmRlIGludGUgbMOkc2FzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAnS3VuZGUgaW50ZSBpbXBvcnRlcmEga2FsZW5kZXJuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdLYWxlbmRlciBpbXBvcnRlcmFkISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnS2FsZW5kZXItSUQga3LDpHZzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ0luZ2EgZGF0YSBoaXR0YWRlcyBmw7ZyIGthbGVuZGVyLUlEOnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ0x5Y2thZGVzIGltcG9ydGVyYSAlcyBrYWxlbmRlcmjDpG5kZWxzZShyKSB0aWxsIGthbGVuZGVyICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIG1pbnV0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxIHRpbW1lJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ0FsbGEga2FsZW5kZXJow6RuZGVsc2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ01pbmEga2FsZW5kZXJow6RuZGVsc2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnQWxkcmlnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ1ZhcmplIGRhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBXZWVrJ30gPSAnVmFyamUgdmVja2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdWYXJqZSBtw6VuYWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ1ZhcmplIMOlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdBbnBhc3NhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RhZ2xpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdWZWNrb3Zpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnTcOlbmFkc3Zpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfDhXJsaWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICd2YXJqZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJyVzIGfDpW5nKGVyKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICd0aWxscyAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnLi4uIGfDpW5nKGVyKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ3RpbGxzICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ0luZ2VuIHDDpW1pbm5lbHNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dChlcikgaW5uYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyB0aW1tZS90aW1tYXIgaW5uYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzIGRhZyhhcikgaW5uYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclcyB2ZWNrYS92ZWNrb3IgaW5uYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdpbm5hbiBow6RuZGVsc2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnZWZ0ZXIgaMOkbmRlbHNlbiBiw7ZyamF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2lubmFuIGjDpG5kZWxzZW4gc2x1dGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2VmdGVyIGjDpG5kZWxzZW4gaGFyIHNsdXRhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ1Nha25hciByw6R0dGlnaGV0ZXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ0t1bmRlIGludGUgdGEgYm9ydCBrYWxlbmRlcmjDpG5kZWxzZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ1LDpHR0aWdoZXRlciBzYWtuYXMhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ1LDpHR0aWdoZXRlciBzYWtuYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnS3VuZGUgaW50ZSBpbXBvcnRlcmEgZmlsZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkIGZsZXInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICdJbmdhICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnT2vDpG5kIGFudsOkbmRhcmUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAnT2dpbHRpZyBrYWxlbmRlciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnT2dpbHRpZyBVUkwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0thbGVuZGVybiBrdW5kZSBpbnRlIGV4cG9ydGVyYXMhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnRsO2cm55YSAobWludXRlciknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ0thbGVuZGVyaMOkbmRlbHNlw7Z2ZXJzaWt0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnS2FsZW5kZXJow6RuZGVsc2Vww6VtaW5uZWxzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1JlZGlnZXJhIGthbGVuZGVyaMOkbmRlbHNlLXZ5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnS2FsZW5kZXJow6RuZGVsc2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnS2FsZW5kZXJow6RuZGVsc2VyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnS2FsZW5kZXJow6RuZGVsc2Vww6VtaW5uZWxzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnS2FsZW5kZXJow6RuZGVsc2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnSGFudGVyYSBrYWxlbmRyYXItdnkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAnTMOkZ2cgdGlsbCBrYWxlbmRlcmjDpG5kZWxzZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ1JlZGlnZXJhIGthbGVuZGVyaMOkbmRlbHNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnSW1wb3J0ZXJhIGthbGVuZGVyaMOkbmRlbHNlLXZ5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdLYWxlbmRlcmjDpG5kZWxzZcO2dmVyc2lrdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnw5ZwcGVuIGthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICfDlnBwZW4ga2FsZW5kZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAnUmVzdXJzw7Z2ZXJzaWt0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnVrX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICfQv9C+0LLRltC00L7QvNC70LXQvdC90Y8g0L3QsNCz0LDQtNGD0LLQsNC90L3RjyDQv9GA0L4g0J/QvtC00ZbRjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAn0JLQuCDQsdGD0LTQtdGC0LUg0L7RgtGA0LjQvNGD0LLQsNGC0Lgg0L/QvtCy0ZbQtNC+0LzQu9C10L3QvdGPINGJ0L7RgNCw0LfRgywg0Y/QuiDQvdCw0YHRgtCw0LLQsNGC0LjQvNC1INCy0LjQt9C90LDRh9C10L3QuNC5INGH0LDRgSAo0LTQu9GPINCS0LDRiNC+0Zcg0J/QvtC00ZbRlyknOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICfQo9C/0YDQsNCy0LvRltC90L3RjyDQv9C+0LLRltC00L7QvNC70LXQvdC90Y/QvNC4INCf0L7QtNGW0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAn0KTRltC70YzRgtGAINCf0L7QtNGW0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ9Ca0L7QvNCw0L3QtNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAn0KDQtdGB0YPRgNGBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAn0J/QvtCy0ZbQtNC+0LzQu9GP0YLQuCDQutC+0YDQuNGB0YLRg9Cy0LDRh9CwINGC0ZbQu9GM0LrQuCDQvtC00LjQvSDRgNCw0Lcg0LIg0LTQtdC90Ywg0L/QviDQvtC00L3RltC5INC/0L7QtNGW0Zcg0Lcg0LLQuNC60L7RgNC40YHRgtCw0L3QvdGP0Lwg0L7QsdGA0LDQvdC+0LPQviDRgdC/0L7RgdC+0LHRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ9Cf0L7QstGW0LTQvtC80LvQtdC90L3Rjywg0YnQviDQvdCw0LTRgdC40LvQsNGO0YLRjNGB0Y8g0LDQs9C10L3RgtGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICfQlNC70Y8g0L7RgtGA0LjQvNCw0L3QvdGPINC/0LXRgNGI0LjRhSAyMC3RgtC4INGB0LjQvNCy0L7Qu9GW0LIg0LfQsNCz0L7Qu9C+0LLQutGDINCf0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICfQlNC70Y8g0L7RgtGA0LjQvNCw0L3QvdGPINCw0YLRgNC40LHRg9GC0YMg0J/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGNhbGVuZGFyIGF0dHJpYnV0ZSd9ID0gJ9CU0LvRjyDQvtGC0YDQuNC80LDQvdC90Y8g0LDQsNGC0YDQuNCx0YPRgtGW0LIg0LrQsNC70LXQvdC00LDRgNGPJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ9Ce0LPQu9GP0LQg0L/QvtGA0Y/QtNC60YMg0LTQtdC90L3QvtCz0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ9C60LXRgNGD0LLQsNGC0Lgg0LrQsNC70LXQvdC00LDRgNGP0LzQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICfQlNC+0LTQsNGC0Lgg0L/QvtC00ZbRjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ9Ca0L7Qu9GW0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICfQmtGW0L3RhtC10LLQsCDQtNCw0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICfQn9C+0LLRgtC+0YDQuNGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAn0JrQsNC70LXQvdC00LDRgNGWINC90LUg0LfQvdCw0LnQtNC10L3Rli4g0JHRg9C00Ywg0LvQsNGB0LrQsCwg0YHQv9C+0YfQsNGC0LrRgyDQtNC+0LTQsNC50YLQtSDQutCw0LvQtdC90LTQsNGAINC30LAg0LTQvtC/0L7QvNC+0LPQvtGOINGB0YLQvtGA0ZbQvdC60Lgg0KPQv9GA0LDQstC70ZbQvdC90Y8g0LrQsNC70LXQvdC00LDRgNGP0LzQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ9Cf0L7QtNGW0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ9Cm0LUg0L/QvtCy0YLQvtGA0Y7QstCw0L3QsCDQv9C+0LTRltGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAn0JLQuCDRhdC+0YfQtdGC0LUg0LfQvNGW0L3QuNGC0Lgg0YLRltC70YzQutC4INGG0LXQuSDQstC40L/QsNC00L7QuiDRh9C4INCy0YHRliDQstC40L/QsNC00LrQuD8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAn0JLRgdGWINCy0LjQv9Cw0LTQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAn0JvQuNGI0LUg0YbQtdC5INCy0LjQv9Cw0LTQvtC6JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICfQmtC10YDRg9Cy0LDQvdC90Y8g0LrQsNC70LXQvdC00LDRgNC10LwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICfQn9C10YDQtdCz0LvRj9C0INC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAn0JTQvtC00LDRgtC4INC90L7QstC40Lkg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICfQlNC+0LTQsNGC0Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAn0IbQvNC/0L7RgNGC0YPQstCw0YLQuCDQn9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ9CG0LzQv9C+0YDRgiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICfQotGD0YIg0LLQuCDQvNC+0LbQtdGC0LUg0LfQsNCy0LDQvdGC0LDQttC40YLQuCDRhNCw0LnQuyDQutC+0L3RhNGW0LPRg9GA0LDRhtGW0ZcsINGJ0L7QsSDRltC80L/QvtGA0YLRg9Cy0LDRgtC4INC60LDQu9C10L3QtNCw0YAg0LTQviDQktCw0YjQvtGXINGB0LjRgdGC0LXQvNC4LtCk0LDQudC7INC/0L7QstC40L3QtdC9INCx0YPRgtC4INCyIC55bWwg0YTQvtGA0LzQsNGC0ZYsINGJ0L4g0LXQutGB0L/QvtGA0YLRg9GO0YLRjNGB0Y8g0LzQvtC00YPQu9C10Lwg0YPQv9GA0LDQstC70ZbQvdC90Y8g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAn0JfQsNCy0LDQvdGC0LDQttC40YLQuCDQutC+0L3RhNGW0LPRg9GA0LDRhtGW0Y4g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ9CG0LzQv9C+0YDRgiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICfQpNGW0LvRjNGC0YAg0LTQu9GPINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICfQl9Cw0LvQtdC20L3QviDQstGW0LQg0L/QvtC70Y8g0LPRgNGD0L/QuCwg0YHQuNGB0YLQtdC80LAg0L3QsNC00LDRgdGC0Ywg0LrQvtGA0LjRgdGC0YPQstCw0YfQsNC8INC00L7RgdGC0YPQvyDQtNC+INC60LDQu9C10L3QtNCw0YDRjyDQstGW0LTQv9C+0LLRltC00L3QviDQtNC+INGX0YUg0YDRltCy0L3RjyDQtNC+0YHRgtGD0L/Rgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ9Ci0ZbQu9GM0LrQuCDQtNC70Y8g0YfQuNGC0LDQvdC90Y86INC60L7RgNC40YHRgtGD0LLQsNGH0ZYg0LfQvNC+0LbRg9GC0Ywg0L/QtdGA0LXQs9C70Y/QtNCw0YLQuCDRgtCwINC10LrRgdC/0L7RgNGC0YPQstCw0YLQuCDQstGB0ZYg0L/QvtC00ZbRlyDQsiDQutCw0LvQtdC90LTQsNGA0ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICfQn9C10YDQtdC80ZbRgdGC0LjRgtC4INCyOiDQutC+0YDQuNGB0YLRg9Cy0LDRh9GWINC80L7QttGD0YLRjCDQt9C80ZbQvdGO0LLQsNGC0Lgg0L/QvtC00ZbRlyDQsiDQutCw0LvQtdC90LTQsNGA0ZYsINCw0LvQtSDQsdC10Lcg0LfQvNGW0L3QuCDQstC40LHQvtGA0YMg0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICfQodGC0LLQvtGA0LjRgtC4OiDQutC+0YDQuNGB0YLRg9Cy0LDRh9GWINC80L7QttGD0YLRjCDRgdGC0LLQvtGA0Y7QstCw0YLQuCDRliDQstC40LTQsNC70Y/RgtC4INC30YPRgdGC0YDRltGH0ZYg0LIg0LrQsNC70LXQvdC00LDRgNGWJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICfQp9C40YLQsNC90L3Rjy/Qt9Cw0L/QuNGBOiDQutC+0YDQuNGB0YLRg9Cy0LDRh9GWINC80L7QttGD0YLRjCDRg9C/0YDQsNCy0LvRj9GC0Lgg0LrQsNC70LXQvdC00LDRgNC10Lwg0YHQsNC80L7RgdGC0ZbQudC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAn0YjQu9GP0YUgVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ9CV0LrRgdC/0L7RgNGC0YPQstCw0YLQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAn0JfQsNCy0LDQvdGC0LDQttC40YLQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ9Ca0L7Qv9GW0Y7QstCw0YLQuCBVUkwg0L/Rg9Cx0LvRltGH0L3QvtCz0L4g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICfQhtC80Y8g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ9Ca0LDQu9C10L3QtNCw0YAg0Lcg0YLQsNC60LjQvCDRltC80Y/QvCDRg9C20LUg0ZbRgdC90YPRlCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAn0JPRgNGD0L/QsCDQtNC+0LfQstC+0LvRltCyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICfQn9C+0LTRltGXINC30LDRj9Cy0LrQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAn0J/RgNCw0LLQuNC70L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAn0JLQuNC60L7RgNC40YHRgtC+0LLRg9C50YLQtSDQvtC/0YbRltGXINC90LjQttGH0LUsINGJ0L7QsSDQt9Cy0YPQt9C40YLQuCwg0LTQu9GPINGP0LrQuNGFINGC0ZbQutC10YLRltCyINC/0L7QtNGW0Zcg0LHRg9C00YPRgtGMINGB0YLQstC+0YDQtdC90ZYg0LDQstGC0L7QvNCw0YLQuNGH0L3Qvi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ9CR0YPQtNGMINC70LDRgdC60LAg0LLQuNCx0LXRgNGW0YLRjCDQtNGW0LnRgdC90YMg0YfQtdGA0LPRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ9Cf0L7RiNGD0Log0LDRgtGA0LjQsdGD0YLRltCyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAn0JLQuNC30L3QsNGH0LXQvdC90Y8g0L/RgNCw0LLQuNC7INC00LvRjyDRgdGC0LLQvtGA0LXQvdC90Y8g0LDQstGC0L7QvNCw0YLQuNGH0L3QuNGFINC/0L7QtNGW0Lkg0LIg0YbRjNC+0LzRgyDQutCw0LvQtdC90LTQsNGA0ZYg0L3QsCDQv9GW0LTRgdGC0LDQstGWINC00LDQvdC40YUg0LfQsNGP0LLQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAn0JTQvtC00LDRgtC4INC/0YDQsNCy0LjQu9C+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICfQkdGW0LvRjNGI0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ9Cc0LXQvdGI0LUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAn0JTQvtC00LDRgtC4INC90L7QstGDINCf0L7QtNGW0Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAn0JrQsNC70LXQvdC00LDRgNGWJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICfQlNGD0LbQtSDQsdCw0LPQsNGC0L4g0LDQutGC0LjQstC90LjRhSDQutCw0LvQtdC90LTQsNGA0ZbQsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICfQkdGD0LTRjCDQu9Cw0YHQutCwINCy0LjQvNC60L3RltGC0Ywg0LTQtdGP0LrRliDQsNCx0L4g0LfQsdGW0LvRjNGI0ZbRgtGMINC70ZbQvNGW0YIg0LIg0LrQvtC90YTRltCz0YPRgNCw0YbRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICfQotC40LbQtNC10L3RjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ9Ce0LPQu9GP0LQg0LzRltGB0Y/RhtGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICfQntCz0LvRj9C0INGC0LjQttC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAn0J7Qs9C70Y/QtCDQtNC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ9Cf0LXRgNC10LnRgtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICfQktGW0LTRhdC40LvQuNGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ9Cf0L7QutCw0LfQsNGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICfQkdCw0LfQvtCy0LAg0ZbQvdGE0L7RgNC80LDRhtGW0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAn0JTQsNGC0LAv0KfQsNGBJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICfQkdGD0LTRjCDQu9Cw0YHQutCwINCy0YHRgtCw0L3QvtCy0ZbRgtGMINGG0LUg0L/QtdGA0LXQtCDQtNCw0YLQvtGOINC30LDQtdGA0YjQtdC90L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICfQkdGD0LTRjCDQu9Cw0YHQutCwINCy0YHRgtCw0L3QvtCy0ZbRgtGMINGG0LUg0L/QtdGA0LXQtCDQtNCw0YLQvtGOINC/0L7Rh9Cw0YLQutGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICfQptC10Lkg0LLQuNC/0LDQtNC+0Log0L/QvtCy0YLQvtGA0Y7QstCw0L3QvtGXINC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfQndCw0YLQuNGB0L3RltGC0Ywg0YHRjtC00LgsINGJ0L7QsSDQv9C+0LHQsNGH0LjRgtC4INCx0LDRgtGM0LrRltCy0YHRjNC60YMg0J/QvtC00ZbRjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfQndCw0YLQuNGB0L3RltGC0Ywg0YLRg9GCINC00LvRjyDRgNC10LTQsNCz0YPQstCw0L3QvdGPINCx0LDRgtGM0LrRltCy0YHRjNC60L7Qs9C+INC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICfQp9Cw0YHRgtC+0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ9Ca0L7QttC90ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ9CS0ZbQtNC90L7RgdC90LAg0YfQsNGB0L7QstCwINGC0L7Rh9C60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAn0JLQuCDQstC/0LXQstC90LXQvdGWLCDRidC+INGF0L7Rh9C10YLQtSDQstC40LTQsNC70LjRgtC4INGG0Y4g0L/QvtC00ZbRjj8g0KbRjyDQvtC/0LXRgNCw0YbRltGPINC90LUg0LzQvtC20LUg0LHRg9GC0Lgg0YHQutCw0YHQvtCy0LDQvdCwJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICfQhtC80L/QvtGA0YLRg9Cy0LDRgtC4INCf0L7QtNGW0Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICfQl9Cw0LLQsNC90YLQsNC20LXQvdC40Lkg0YTQsNC50Lsg0L/QvtCy0LjQvdC10L0g0LHRg9GC0Lgg0LIg0L/RgNCw0LLQuNC70YzQvdC+0LzRgyBpY2FsINGE0L7RgNC80LDRgtGWICguaWNzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICfQr9C60YnQviDQvtCx0YDQsNC90LjQuSDQutCw0LvQtdC90LTQsNGAINC90LUg0LIg0YHQv9C40YHQutGDLCDQv9C10YDQtdC60L7QvdCw0LnRgtC10YHRjyDQsdGD0LTRjCDQu9Cw0YHQutCwLCDRidC+INGDINCy0LDRgSDRlCDQv9C+0LLQvdC+0LLQsNC20LXQvdC90Y8g0L3QsCDRgdGC0LLQvtGA0LXQvdC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICfQntC90L7QstC40YLQuCDRltGB0L3Rg9GO0YfRliDQn9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAn0JLRgdGWINGW0YHQvdGD0Y7Rh9GWINC/0L7QtNGW0Zcg0LIg0LrQsNC70LXQvdC00LDRgNGWINC3INGC0LDQutC40Lwg0LbQtSBVbmlxdWVJRCDQsdGD0LTRg9GC0Ywg0L/QtdGA0LXQt9Cw0L/QuNGB0LDQvdGWJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ9CX0LDQstCw0L3RgtCw0LbQuNGC0Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAn0IbQvNC/0L7RgNGC0YPQstCw0YLQuCDQn9C+0LTRltGXJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudERhc2hib2FyZEFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBcHBvaW50bWVudCd9ID0gJ9Cd0L7QstCwINCf0L7QtNGW0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ9Ch0LrQvtGA0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSDQtNC90ZbQsic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICfQhtC80Y8g0L3QsNCz0LDQtNGD0LLQsNC90L3RjyDQstC20LUg0ZbRgdC90YPRlCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAn0JDQs9C10L3RgiAo0YDQtdGB0YPRgNGB0LgpLCDRj9C60ZYg0LLQuNCx0LjRgNCw0Y7RgtGM0YHRjyDQsiDRgNCw0LzQutCw0YUg0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICfQktGB0ZYg0LDQs9C10L3RgtC4INC3INC00L7Qt9Cy0L7Qu9C+0Lwg0L3QsCDRh9C40YLQsNC90L3RjyDQtNC70Y8g0L/QvtC00ZbRlyAo0LrQsNC70LXQvdC00LDRgCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICfQktGB0ZYg0LDQs9C10L3RgtC4LCDRj9C60ZYg0LzQsNGO0YLRjCDQtNC+0LfQstGW0Lsg0L3QsCDQt9Cw0L/QuNGBINC00LvRjyDQv9C+0LTRltC5ICjQutCw0LvQtdC90LTQsNGAKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAn0KHQuNGB0YLQtdC80LAg0L3QtSDQvNC+0LbQtSDRgdGC0LLQvtGA0LjRgtC4INC60LDQu9C10L3QtNCw0YAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAn0J3QtdC80LDRlCBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ9CS0Lgg0L3QtSDQvNCw0ZTRgtC1INC00L7RgdGC0YPQv9GDINC00L4g0YbRjNC+0LPQviDQutCw0LvQtdC90LTQsNGA0Y8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICfQoNC10LTQsNCz0YPQstCw0YLQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfQn9C+0LzQuNC70LrQsCDQv9GA0Lgg0L7QvdC+0LLQu9C00LXQvdC90ZYg0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICfQndC1INC80L7QttC70LjQstC+INC/0YDQvtGH0LjRgtCw0YLQuCDRhNCw0LnQuyDQutC+0L3RhNGW0LPRg9GA0LDRhtGW0Zcg0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ9CR0YPQtNGMINC70LDRgdC60LAg0L/QtdGA0LXQutC+0L3QsNC50YLQtdGB0YwsINGJ0L4g0YTQsNC5INGE0LDQudC7INC90LUg0L/QvtGI0LrQvtC00LbQtdC90LjQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICfQndC1INC80L7QttC70LjQstC+INGW0LzQv9C+0YDRgtGD0LLQsNGC0Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICfQmtCw0LvQtdC90LTQsNGAINGW0LzQv9C+0YDRgtC+0LLQsNC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ9Cf0L7RgtGA0LXRjNGD0ZTRgtGM0YHRjyBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAn0J3QtSDQvNC+0LbQu9C40LLQviDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWINC00LvRjyBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICfQo9GB0L/RltGI0L3QviDRltC80L/QvtGA0YLQvtCy0LDQvdC+ICVzINC/0L7QtNGW0Lkg0LIg0LrQsNC70LXQvdC00LDRgCAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUg0YXQstC40LvQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1INGF0LLQuNC70LjQvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCDRhdCy0LjQu9C40L0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxINCz0L7QtNC40L3QsCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICfQktGB0ZYg0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICfQn9C+0LTRltGXLCDQv9C+0LLRj9C30LDQvdGWINC30ZYg0LzQvdC+0Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ9Cf0L7QutCw0LfRg9GO0YLRjNGB0Y8g0YLRltC70YzQutC4INC/0L7QstGP0LfQsNC90ZYg0Lcg0LLQsNC80Lgg0L/QvtC00ZbRly4g0JfQvNGW0L3QuNGC0Lgg0L3QsNC70LDRiNGC0YPQstCw0L3QvdC90Y8uJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ9Cf0L7QtNGW0Y8g0L3QtSDQt9C90LDQudC00LXQvdCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ9Cd0ZbQutC+0LvQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICfQqdC+0LTQvdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICfQqdC+0YLQuNC20L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ9Cp0L7QvNGW0YHRj9GG0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ9Cp0L7RgNC+0LrRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICfQmtC+0YDQuNGB0YLRg9Cy0LDRhtGM0LrQuNC5INCy0LjQsdGW0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICfQqdC+0LTQtdC90L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICfQqdC+0YLQuNC20L3QtdCy0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ9Cp0L7QvNGW0YHRj9GH0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfQqdC+0YDRltGH0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ9C60L7QttC90ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICfQtNC70Y8gJXMg0YDQsNC30YMo0ZbQsiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAn0LTQvtC60LguLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAn0LTQviAuLi4g0YDQsNC30YMo0ZbQsiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICfQtNC+0LrQuCAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICfQndC10LzQsNGUINC/0L7QstGW0LTQvtC80LvQtdC90YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzINGF0LLQuNC70LjQvSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMg0LPQvtC00LjQvSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyDQtNC90ZYo0ZbQsikg0LTQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzINGC0LjQttC90ZbQsiDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAn0L/QtdGA0LXQtCDQv9C+0YfQsNGC0LrQvtC8INC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICfQv9GW0YHQu9GPINC/0L7Rh9Cw0YLQutGDINC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAn0L/QtdGA0LXQtCDQt9Cw0LLQtdGA0YjQtdC90L3Rj9C8INC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAn0L/RltGB0LvRjyDQt9Cw0LLQtdGA0YjQtdC90L3RjyDQv9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAn0J3QtdC80LDRlCDQv9C+0LLQvdC+0LLQsNC20LXQvdGMISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICfQndC1INC80L7QttC70LjQstC+INCy0LjQtNCw0LvQuNGC0Lgg0L/QvtC00ZbRjiDQt9Cw0Y/QstC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAn0J3QtdC80LDRlCDQv9C+0LLQvdC+0LLQsNCy0LbQtdC90YwhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ9Cd0LXQvNCw0ZQg0L/QvtCy0L3QvtCy0LDQttC10L3RjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICfQodC40YHRgtC10LzQsCDQvdC1INC80L7QttC1INGW0LzQv9C+0YDRgtGD0LLQsNGC0Lgg0YTQsNC50LsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNoZWNrIHRoZSBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPSAn0JHRg9C00Ywg0LvQsNGB0LrQsCDQv9C10YDQtdCy0ZbRgNGC0LUg0LvQvtCzINC00LvRjyDQtNC+0LTQsNGC0LrQvtCy0L7RlyDRltC90YTQvtGA0LzQsNGG0ZbRlyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkINCx0ZbQu9GM0YjQtSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ9C90LXQvNCw0ZQgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ9CS0ZbQtNGB0YPRgtC90ZbQuSDRgtCw0LrQuNC5INC60L7RgNC40YHRgtGD0LLQsNGHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAn0KXQuNCx0L3QuNC5INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAn0KXQuNCx0L3QtSDQv9C+0YHQuNC70LDQvdC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAn0KHRgtCw0LvQsNGB0Ywg0L/QvtC80LjQu9C60LAg0L/RltC0INGH0LDRgSDQtdC60YHQv9C+0YDRgtGDINC60LDQu9C10L3QtNCw0YDRjyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ9Ce0L3QvtCy0LvQtdC90L3RjyAo0YXQstC40LvQuNC90LgpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICfQodGC0L7RgNGW0L3QutCwINC/0LXRgNC10LPQu9GP0LTRgyDQn9C+0LTRltC5INC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAn0J/QvtCy0ZbQtNC+0LzQu9C10L3QvdGPINC/0L4g0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAn0LzQvtC00YPQu9GMINC/0L7QtNGW0Lkg0LrQsNC70LXQvdC00LDRgNGPLCDRj9C60LjQuSDQs9C+0YLRg9GUINC30LDQv9C40YHQuCDQv9C+0LLRltC00L7QvNC70LXQvdC90Y8g0LTQu9GPINC/0L7QtNGW0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ9C80L7QtNGD0LvRjCDQv9C+0LTRltC5INC60LDQu9C10L3QtNCw0YDRjywg0Y/QutC40Lkg0L7QvdC+0LLQu9GO0ZQg0YLRltC60LXRgiDQtyDQtNCw0L3QuNC80Lgg0LLRltC0INC/0L7QtNGW0Lkg0LfQsNGP0LLQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ9CV0LrRgNCw0L0g0YDQtdC00LDQs9GD0LLQsNC90L3RjyDQv9C+0LTRltC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICfQn9C10YDQtdC70ZbQuiDQv9C+0LTRltC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAn0J/QtdGA0LXQu9GW0Log0L/QvtC00ZbQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAn0J/QvtCy0ZbQtNC+0LzQu9C10L3QvdGPINC/0L4g0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICfQn9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAn0JXQutGA0LDQvSDQutC10YDRg9Cy0LDQvdC90Y8g0LrQsNC70LXQvdC00LDRgNC10LwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAn0JLQuNCx0YDQsNGC0Lgg0Y/QutC40Lkg0LLQuNC0INC/0L7QstGW0LTQvtC80LvQtdC90L3RjyDQv9GA0L4g0LfQvNGW0L3QuCDQv9C+0LTRltGXINCS0Lgg0YXQvtGH0LXRgtC1INC+0YLRgNC40LzRg9Cy0LDRgtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICfQodGC0LLQvtGA0LjRgtC4INC90L7QstC40Lkg0LrQsNC70LXQvdC00LDRgCDQv9C+0LTRltC5INC/0L7QstGP0LfQsNC90LjQuSDQtyDRhtGW0ZTRjiDQt9Cw0Y/QstC60L7Rjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ9Ch0YLQstC+0YDQuNGC0Lgg0ZYg0LrQtdGA0YPQstCw0YLQuCDQv9C+0LLRltC00L7QvNC70LXQvdC90Y/QvNC4INC/0YDQviDQv9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAn0KHRgtCy0L7RgNC40YLQuCDQvdC+0LLRgyDQv9C+0LTRltGOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAn0JfQsNC00LDRlCDRj9C60ZYg0LrQvtC70L7QvdC60Lgg0LHRg9C00YPRgtGMINC/0L7QutCw0LfQsNC90ZYg0LIg0L/QvtCy0Y/Qt9Cw0LDQvdC+0LzRgyDQstGW0LTQttC10YLRliDQv9C+0LTRltC5KExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAn0JLQuNC30L3QsNGH0LDRlCDRltC60L7QvdC60YMg0Lcg0L/QvtGB0LjQu9Cw0L3QvdGP0Lwg0L3QsCDRgdGC0L7RgNGW0L3QutGDINC60LDRgNGCIEdvb2dsZSDQtyDQv9C+0YLQvtGH0L3QuNC8INC80ZbRgdGG0LXQt9C90LDRhdC+0LTQttC10L3QvdGP0Lwg0YMg0LLRltC60L3RliDRgNC10LTQsNCz0YPQstCw0L3QvdGPINC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICfQktC40LfQvdCw0YfQsNGUINGC0LjQv9C4INC+0LHRlNC60YLRltCyINC/0L7QtNGW0LksINGP0LrRliDQsdGD0LTRg9GC0Ywg0L7QsdGA0L7QsdC70Y/RgtC40YHRjyDQt9CwINC00L7Qv9C+0LzQvtCz0L7RjiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICfQktC40LfQvdCz0LDRh9Cw0ZQg0L/QtdGA0LXQu9GW0Log0L/QvtGA0LDQvNC10YLRgNGW0LIg0Y/QutGWINC80L7QttGD0YLRjCDQsdGD0YLQuCDQsiDQvtC/0YbRltGP0YUg0L/QvtGI0YPQutGDINC/0L4g0LfQsNGP0LLRhtGWJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ9Cg0LXQtNCw0LPRg9Cy0LDRgtC4INC/0L7QtNGW0Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ9Cn0LDRgSDQv9C10YDRiNC+0Zcg0LLRltC00L/QvtCy0ZbQtNGWJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ9CG0LzQv9C+0YDRgtGD0LLQsNGC0Lgg0LXRgNC60LDQvSDQv9C+0LTRltC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ9Cf0L7QstGP0LfQsNGC0Lgg0L/QvtC00ZbRlyDRliDQt9Cw0Y/QstC60Lgg0LcgIk5vcm1hbCIg0YLQuNC/0L7QvCDQt9Cy0Y/Qt9C60YMgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICfQn9C10YDQtdC70ZbQuiDQstGB0ZbRhSDQv9C+0LTRltC5INC00LvRjyDQstGW0LTQvtCx0YDQsNC20LDRjtGC0YzRgdGPINCyIEdVSSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAn0J/QtdGA0LXQu9GW0Log0LLRgdGW0YUg0L/QvtC00ZbQuSDQutCw0LvQtdC90LTQsNGA0Y8g0LTQu9GPINCy0ZbQtNC+0LHRgNCw0LbQtdC90L3RjyDQsiBHVUknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAn0JrQtdGA0YPQstCw0YLQuCDRgNGW0LfQvdC40LzQuNC8INC60LDQu9C10L3QtNCw0YDRj9C80LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAn0J/QtdGA0LXQs9C70Y/QvdGD0YLQuCDQstGB0ZYg0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICfRh9Cw0YEsINGJ0L4g0LfQsNC70LjRiNC40LLRgdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICfQn9C+0YjRg9C6INGD0YLQuNC70ZbRgtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAn0KPRgtC40LvRltGC0LAg0L/QvtGI0YPQutGDINC80L7QtNGD0LvRjyDQtNC70Y8g0LDQstGC0L7Qt9Cw0L/QvtCy0L3QtdC90L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICfQn9GD0LHQu9GW0YfQvdC40Lkg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAn0J/Rg9Cx0LvRltGH0L3QuNC5INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICfQn9C10YDQtdCz0LvRj9C0INGA0LXRgdGD0YDRgdGW0LInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAn0J/QtdGA0LXQs9C70Y/QtCDRgNC10YHRg9GA0ZbQsiAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICfQp9Cw0YEg0LLQuNGA0ZbRiNC10L3QvdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAn0JLQuNCx0ZbRgCDRgdC/0L7RgdC+0LHRgyDQtNC70Y8g0LLRltC00L/RgNCw0LLQutC4INC/0L7QstGW0LTQvtC80LvQtdC90Ywg0L/QviDQv9C+0LTRltGP0YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAn0KLRgNC40LPQtdGA0Lgg0LTQu9GPINC00L7QtNCw0LLQsNC90L3RjyDRh9C4INCw0LLRgtC+0LzQsNGC0LjRh9C90L7Qs9C+INC+0L3QvtCy0LvQtdC90L3RjyDQv9C+0LTRltC5INC90LAg0L7RgdC90L7QstGWINC/0LXQstC90LjRhSDRh9Cw0YHRltCyINGC0ZbQutC10YLRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ9Cn0LDRgSDQvtC90L7QstC70LXQvdC90Y8nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX0NOX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICfpooTnuqbmj5DphpLpgJrnn6XjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ+avj+W9k+S9oOeahOS4gOS4qumihOe6puWIsOi+vuaPkOmGkuaXtumXtOaXtu+8jOS9oOWwseS8muaUtuWIsOS4gOS4qumAmuefpeOAgic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ+mihOe6pumAmuefpeeuoeeQhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ+WcqOi/memHjOS9oOWPr+S7peS4iuS8oOS4gOS4qumFjee9ruaWh+S7tuS7peS+v+WvvOWFpemihOe6pumAmuefpe+8jOW/hemhu+aYr+S4jumihOe6pumAmuefpeaooeWdl+WvvOWHuueahOaWh+S7tuS4gOagt+eahC55bWzmoLzlvI/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICflnKjov5nph4zkvaDlj6/ku6XpgInmi6nlk6rkuKrkuovku7blsIbkvJrop6blj5Hov5nkuKrpgJrnn6XvvIzkuIvpnaLnmoTpooTnuqbov4fmu6Tlmajlj6/ku6XpgInmi6nnrKblkIjnibnlrprmnaHku7bnmoTpooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAn6L+H5ruk6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW0nfSA9ICflm6LpmJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICfotYTmupAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICfmr4/kuKrpooTnuqbnmoTpgJrnn6Xkvb/nlKjpgInmi6nnmoTmlrnlvI/kuIDlpKnlj6rlj5HpgIHkuIDmrKHjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICflj5HpgIHnu5nmnI3liqHkurrlkZjnmoTpgJrnn6XjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ+iOt+WPlumihOe6pueahOWJjTIw5Liq5a2X56ym44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAn6I635Y+W6aKE57qm55qE5bGe5oCnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAn6I635Y+W5pel5Y6G55qE5bGe5oCnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ+aXpeeoi+amguiniCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAn566h55CG5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ+a3u+WKoOmihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ+minOiJsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ+e7k+adn+aXpeacnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICfph43lpI0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAn5rKh5pyJ5om+5Yiw5pel5Y6G44CC6K+35YWI6YCa6L+H566h55CG5pel5Y6G55WM6Z2i5re75Yqg5LiA5Liq5pel5Y6G44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAn6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICfov5nmmK/kuIDkuKrph43lpI3nmoTpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICfkvaDmg7Pku4XnvJbovpHmnKzmrKHpooTnuqbnmoTml7bpl7Tov5jmmK/ph43lpI3pooTnuqbmiYDmnInnmoTml7bpl7TvvJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAn5omA5pyJ6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAn5LuF5pys5qyhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICfml6XljobnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICfml6XljobmpoLop4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ+a3u+WKoOaWsOeahOaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICfmt7vliqDml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ+WvvOWFpemihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICfml6Xljoblr7zlhaUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICfkvaDlj6/ku6XlnKjov5nph4zkuIrkvKDkuIDkuKrphY3nva7mlofku7bmnaXlr7zlhaXkuIDkuKrml6XljobliLDns7vnu5/kuK3jgILov5nkuKrmlofku7blv4XpobvmmK/nsbvkvLzpgJrov4fml6XljobnrqHnkIbmqKHlnZflr7zlh7rnmoQueW1s5qC85byP44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAn5LiK5Lyg5pel5Y6G6YWN572uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ+WvvOWFpeaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ+i/h+a7pOaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICfmoLnmja7nu4TlrZfmrrXvvIzns7vnu5/pgJrov4fnlKjmiLfnmoTmnYPpmZDnuqfliKvmnaXlhYHorrjnlKjmiLfog73lpJ/orr/pl67nmoTml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICflj6ror7vvvJrnlKjmiLflj6/ku6XnnIvliLDlkozlr7zlh7rml6XljobkuK3miYDmnInnmoTpooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICfovaznp7vvvJrnlKjmiLflj6/ku6Xkv67mlLnml6XljobkuK3nmoTpooTnuqbvvIzkvYbkuI3og73kv67mlLnpgInmi6nnmoTml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ+WIm+W7uu+8mueUqOaIt+WPr+S7peWIm+W7uuWSjOWIoOmZpOaXpeWOhuS4reeahOmihOe6puOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAn6K+75YaZ77ya55So5oi35Y+v5Lul566h55CG5pel5Y6G44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ+e9keWdgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICflr7zlh7rml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICfkuIvovb3ml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAn5aSN5Yi25YWs5YWx5pel5Y6G572R5Z2AJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICfml6XljoblkI3np7AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAn5bey5pyJ5ZCM5ZCN55qE5pel5Y6G44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Blcm1pc3Npb24gZ3JvdXAnfSA9ICfmnYPpmZDnu4QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ+W3peWNlemihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAn6KeE5YiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ+S9v+eUqOS4i+mdoueahOmAiemhueadpeWHj+WwkeiHquWKqOWIm+W7uueahOW3peWNlemihOe6puOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAn6K+36YCJ5oup5LiA5Liq5pyJ5pWI55qE6Zif5YiX44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAn5pCc57Si5bGe5oCnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAn5a6a5LmJ5Zyo6L+Z5Liq5pel5Y6G5Lit5Z+65LqO5bel5Y2V5pWw5o2u6Ieq5Yqo5Yib5bu66aKE57qm55qE6KeE5YiZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAn5re75Yqg6KeE5YiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICfmm7TlpJonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ+abtOWwkSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQXBwb2ludG1lbnQnfSA9ICfmt7vliqDmlrDnmoTpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAn5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICfmv4DmtLvnmoTml6XljoblpKrlpJonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAn6K+35YWz6Zet5LiA5Lqb5pel5Y6G5oiW6ICF5Zyo6YWN572u5Lit5aKe5Yqg6ZmQ5Yi25pWw44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICflkagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICfmnIjml7bpl7TooagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ+WRqOaXtumXtOihqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICfmr4/ml6Xml7bpl7TooagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ+i3s+i9rCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAn5Y+W5raIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICfmmL7npLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICfln7rmnKzkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAn5pel5pyfIC8g5pe26Ze0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICfor7forr7nva7ov5nkuKrlgLzkuLrnu5PmnZ/ml6XmnJ/kuYvliY3jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAn6K+36K6+572u6L+Z5Liq5YC85Li65byA5aeL5pel5pyf5LmL5ZCO44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICfov5nmmK/kuIDkuKrph43lpI3pooTnuqbnmoTkuIDmrKHml7bpl7TjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfngrnlh7vov5nph4zmn6XnnIvniLbpooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAn54K55Ye76L+Z6YeM57yW6L6R54i26aKE57qm44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ+mikeeOhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ+avjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAn55u45a+555qE5pe26Ze0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJ+S9oOecn+eahOimgeWIoOmZpOi/meS4qumihOe6puWQl++8n+i/meS4quaTjeS9nOaXoOazleWbnumAgOOAgic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAn6aKE57qm5a+85YWlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAn5LiK5Lyg5paH5Lu25b+F6aG75piv5pyJ5pWI55qEaUNhbOagvOW8jyguaWNzKeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICflpoLmnpzmnJ/mnJvnmoTml6XljobmsqHmnInlnKjov5nph4zvvIzor7fnoa7kv53kvaDoh7PlsJHmnInigJzliJvlu7rigJ3mnYPpmZDjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICfmm7TmlrDlt7LmnInnmoTpooTnuqblkJfvvJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICfnm7jlkIxVbmlxdWVJROeahOaXpeWOhuS4reaJgOacieW3suacieeahOmihOe6pumDveS8muiiq+imhuebluOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICfkuIrkvKDml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ+WvvOWFpemihOe6pic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICfmlrDnmoTpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ+W+iOW/qyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc15aSpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ+i/meS4qumAmuefpeeahOWQjeWtl+W3suWtmOWcqCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ+i/meS4qumihOe6pumAieaLqeeahOacjeWKoeS6uuWRmO+8iOi1hOa6kO+8ieOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICfmiYDmnInlr7nov5nkuKrpooTnuqbvvIjml6XljobvvInoh7PlsJHmnInor7vmnYPpmZDnmoTmnI3liqHkurrlkZjjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICfmiYDmnInlr7nov5nkuKrpooTnuqbvvIjml6XljobvvInmnInlhpnmnYPpmZDnmoTmnI3liqHkurrlkZjjgIInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ+ezu+e7n+S4jeiDveWIm+W7uuaXpeWOhu+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ+ayoeacieaXpeWOhklE77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ+S9oOaXoOadg+iuv+mXrui/meS4quaXpeWOhu+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAn57yW6L6R5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfmm7TmlrDml6Xljoblh7rplJnvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ+S4jeiDveivu+WPluaXpeWOhueahOmFjee9ruaWh+S7tuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICfor7fnoa7kv53kvaDnmoTmlofku7bmmK/mnInmlYjnmoTjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAn5peg5rOV5a+85YWl6L+Z5Liq5pel5Y6G77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ+aXpeWOhuW3suWvvOWFpe+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAn6ZyA6KaB5pel5Y6GSUTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICfml6Dms5Xov5Tlm57nu5nlrprnmoTml6XljoZJROeahOaVsOaNric7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAn5oiQ5Yqf5bCG6aKE57qmJXPlr7zlhaXliLDml6XljoYlc+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzXliIbpkp8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTXliIbpkp8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzDliIbpkp8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysx5bCP5pe2JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ+aJgOaciemihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICfliIbphY3nu5nmiJHnmoTpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ+S7heaYvuekuuWIhumFjee7meS9oOeahOmihOe6pu+8geS/ruaUueiuvue9ric7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICfmsqHmnInmib7liLDpooTnuqbvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICfmsLjkuI0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAn5q+P5aSpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICfmr4/lkagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICfmr4/mnIgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ+avj+W5tCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICflrprliLYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICfmr4/lpKnkuIDmrKEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAn5q+P5ZGo5LiA5qyhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICfmr4/mnIjkuIDmrKEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAn5q+P5bm05LiA5qyhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAn5q+PJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAnJXPmrKEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAn55u05YiwLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJy4uLuasoSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ+ebtOWIsCVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ+ayoeaciemAmuefpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXPliIbpkp/liY0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclc+Wwj+aXtuWJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXPlpKnliY0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclc+WRqOWJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ+WcqOmihOe6puW8gOWni+WJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ+WcqOmihOe6puW8gOWni+WQjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICflnKjpooTnuqbnu5PmnZ/liY0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAn5Zyo6aKE57qm57uT5p2f5ZCOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAn5rKh5pyJ5p2D6ZmQ77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ+S4jeiDveWIoOmZpOW3peWNlemihOe6pu+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICfmsqHmnInmnYPpmZDvvIEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAn5rKh5pyJ5p2D6ZmQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ+ezu+e7n+aXoOazleWvvOWFpeaWh+S7tu+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICfmm7TlpJrkv6Hmga/or7fmo4Dmn6Xml6Xlv5fjgIInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJ+WkmuS6jislZCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ+ayoeaciSVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAn5rKh5pyJ6L+Z5Liq55So5oi377yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAn5peg5pWI5pel5Y6G77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ+aXoOaViOe9keWdgO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICflr7zlh7rml6Xljobml7blh7rplJnvvIEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICfliLfmlrDvvIjliIbpkp/vvIknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ+mihOe6puaXpeWOhuamguiniOmhtemdouOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAn6aKE57qm6YCa55+lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfpooTnuqbml6Xljobkuovku7bmqKHlnZfvvIzlh4blpIfpooTnuqbnmoTpgJrnn6Xmtojmga/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ+mihOe6puaXpeWOhuS6i+S7tuaooeWdl++8jOabtOaWsOW3peWNleeahOmihOe6puaVsOaNruOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICfpooTnuqbnvJbovpHnqpflj6PjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ+mihOe6puWIl+ihqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ+mihOe6puWIl+ihqOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAn6aKE57qm6YCa55+lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ+mihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ+aXpeWOhueuoeeQhueql+WPo+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICfpgInmi6nkvaDpnIDopoHmjqXmlLblk6rkupvpooTnuqblj5jliqjpgJrnn6Xmtojmga/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ+WIm+W7uuS4gOS4quaWsOeahOaXpeWOhumihOe6puWIsOi/meS4quW3peWNleOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ+WIm+W7uuWSjOeuoeeQhumihOe6pumAmuefpS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfliJvlu7rmlrDnmoTpooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICflrprkuYnpk77mjqXnmoTpooTnuqblsI/pg6jku7YoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIp6KaB5pi+56S655qE5YiX44CC5Y+v55So55qE6K6+572u5YC85Li677yaMCA9IOemgeeUqO+8jDEgPSDlj6/nlKjvvIwgMiA9IOm7mOiupOWQr+eUqOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICflrprkuYnkuIDkuKrlm77moIfvvIzpk77mjqXpooTnuqbnvJbovpHnqpflj6PkuK3nmoTlvZPliY3kvY3nva7liLDosLfmrYzlnLDlm77pobXpnaLjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICflrprkuYnkuovku7blr7nosaHnsbvlnovvvIzku6Xkvr/pgJrov4dBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnTvvIjnrqHnkIbpooTnuqbpgJrnn6Xkuovku7bvvInlpITnkIbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICflrprkuYnog73kvKDpgJLliLDlt6XljZXmkJzntKLlip/og73nmoTlj4LmlbDmuIXljZXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAn5a6a5LmJ5bel5Y2V6aKE57qm57G75Z6L5ZCO56uv77yM55So5LqO5bel5Y2V5Yqo5oCB5a2X5q615pel5pyf5pe26Ze044CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICflrprkuYnlt6XljZXpooTnuqbnsbvlnovlkI7nq6/vvIznlKjkuo7lt6XljZXljYfnuqfml7bpl7TjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ+WumuS5ieW3peWNlemihOe6puexu+Wei+WQjuerr++8jOeUqOS6juW3peWNleaMgui1t+aXtumXtOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAn5a6a5LmJ5pel5Y6G6aKE57qm55qE5bel5Y2V5o+S5Lu244CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAn57yW6L6R6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICfpppbmrKHlk43lupTml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAn5a+85YWl6aKE57qm56qX5Y+j44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ+WwhumihOe6puWSjOW3peWNlemTvuaOpeS4uuKAnOaZrumAmuKAneexu+Wei+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAn5YiX5Ye66KaB5Zyo5Zu+5b2i55WM6Z2i5pi+56S655qE5omA5pyJ6aKE57qm5LqL5Lu244CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICflm77lvaLnlYzpnaLmmL7npLrnmoTmiYDmnInml6Xljobkuovku7bliJfooajjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICflnKjliJvlu7rml6Xljobml7blj6/nlKjkuo7pgInmi6nnmoQxNui/m+WItlJHQuminOiJsuWIl+ihqOOAguivt+S9v+eUqOi2s+Wkn+a3seiJsueahOminOiJsu+8jOS7peehruS/neiDveWkn+aYvuekuuS4iumdoueZveiJsueahOaWh+acrOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICfnrqHnkIbkuI3lkIznmoTml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICfml6XljobmpoLop4jnqpflj6Pog73mv4DmtLvnmoTml6XljobmnIDlpKfmlbDjgILor7fms6jmhI/vvJrlpKfph4/nmoTmv4DmtLvml6XljobkvJrlr7nmnI3liqHlmajkuqfnlJ/lpKrlpJrnmoTlkIzmraXosIPnlKjvvIzlj6/og73kvJrmnInmgKfog73lvbHlk43jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSU+S4jeaUr+aMgeWvueayoeaciee7k+adn+aXpeacn+aIluayoeaciemHjeWkjeasoeaVsOeahOmihOe6puWBmuW+queOr+WkhOeQhuOAguWcqOWvvOWFpei/h+eoi+S4re+8jOWPr+iDveaciUlDU+aWh+S7tuWMheWQq+S6huatpOexu+mihOe6puOAguS9nOS4uuabv+S7o++8jOezu+e7n+WwhuaJgOacieeahOatpOexu+mihOe6puWIm+W7uuS4uuW3sui/h+WOu+eahOmihOe6pu+8jOeEtuWQjuWKoOS4iuaOpeS4i+adpeeahG7kuKrmnIgo6buY6K6kMTIw5Liq5pyI5oiWMTDlubQp55qE6YeN5aSN6aKE57qm44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAn5omA5pyJ6aKE57qm55qE5qaC6KeI44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ+aMgui1t+aXtumXtCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAn5pCc57Si5o+S5Lu2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAn55So5LqO6Ieq5Yqo5a6M5oiQ55qE5pCc57Si5o+S5Lu25qih5Z2X44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ+WFrOWFseaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAn5YWs5YWx5pel5Y6G44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAn6LWE5rqQ5qaC6KeIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ+i1hOa6kOamguiniO+8iE9UUlPllYbkuJrniYjvvIknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6K+m5oOF56qX5Y+j77yM5Zyo6I+c5Y2V5LiK5pi+56S65LiA5Liq6ZO+5o6l77yM5Lul5Yib5bu65LiA5Liq5pel5Y6G6aKE57qm5bm255u05o6l6ZO+5o6l5Yiw5q2k5bel5Y2V44CC5Y+v6YCa6L+H6ZSu4oCcR3JvdXDigJ3lkozlgLzlpoLigJxydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMuKAnei/m+ihjOmineWklueahOiuv+mXruaOp+WItu+8jOS7peaYvuekuuaIluS4jeaYvuekuui/meS4qumTvuaOpeOAguWmguaenOimgeaUvuWIsOiPnOWNlee7hOS4re+8jOS9v+eUqOmUruKAnENsdXN0ZXJOYW1l4oCd77yM5YC85Y+v5Lul5piv55WM6Z2i5LiK6IO955yL5Yiw55qE5Lu75oSP5ZCN56ew44CC5L2/55So6ZSu4oCcQ2x1c3RlclByaW9yaXR54oCd5p2l6YWN572u6I+c5Y2V57uE5Zyo5bel5YW35qCP5Lit5pi+56S655qE6aG65bqP44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICfop6PlhrPml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICfpooTnuqbpgJrnn6XnmoTkvKDovpPmlrnlvI/pgInmi6njgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAn5Z+65LqO5p+Q5Lqb5bel5Y2V5pe26Ze05re75Yqg5oiW5pu05paw6Ieq5Yqo5pel5Y6G6aKE57qm55qE6Kem5Y+R5Zmo44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAn5pu05paw5pe26Ze0JzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3OwoKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpNaWdyYXRpb25zOjpPVFJTNjo6VGltZVpvbmVPZmZzZXQpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IGRlYnVnCiAgICAkU2VsZi0+e0RlYnVnfSA9IDA7CgogICAgJFNlbGYtPntWaWV3fSA9ICdBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGZpbHRlcnMgc3RvcmVkIGluIHRoZSB1c2VyIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICRMYXN0RmlsdGVyS2V5ID0gJ1VzZXJMYXN0RmlsdGVyLScgLiAkU2VsZi0+e1ZpZXd9OwogICAgbXkgJExhc3RGaWx0ZXIgICAgPSAkUHJlZmVyZW5jZXN7JExhc3RGaWx0ZXJLZXl9IHx8ICdXZWVrJzsKCiAgICBteSAlRmlsdGVycyA9ICgKICAgICAgICBNb250aCA9PiB7CiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdNb250aCcpLAogICAgICAgICAgICBQcmlvID0+IDEwMCwKICAgICAgICB9LAogICAgICAgIFdlZWsgPT4gewogICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnV2VlaycpLAogICAgICAgICAgICBQcmlvID0+IDIwMCwKICAgICAgICB9LAogICAgICAgIERheSA9PiB7CiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdEYXknKSwKICAgICAgICAgICAgUHJpbyA9PiAzMDAsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgY3VycmVudCBmaWx0ZXIKICAgICRQYXJhbXtGaWx0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAkTGFzdEZpbHRlcjsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgaWYgZmlsdGVyIGlzIHZhbGlkCiAgICBpZiAoICEkRmlsdGVyc3sgJFBhcmFte0ZpbHRlcn0gfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0ludmFsaWQgRmlsdGVyOiAlcyEnLCAkUGFyYW17RmlsdGVyfSApLAogICAgICAgICk7CiAgICB9CgogICAgIyBwcmVwYXJlIGZpbHRlcnMKICAgIG15ICVOYXZCYXJGaWx0ZXI7CiAgICBmb3IgbXkgJEZpbHRlckNvbHVtbiAoIHNvcnQga2V5cyAlRmlsdGVycyApIHsKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyQ29sdW1ufS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyQ29sdW1uLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyQ29sdW1ufSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBHZXQgdXNlcidzIHBlcm1pc3Npb25zIHRvIGFzc29jaWF0ZWQgbW9kdWxlcyB3aGljaCBhcmUgZGlzcGxheWVkIGFzIGxpbmtzLgogICAgZm9yIG15ICRNb2R1bGUgKHF3KEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSkpIHsKICAgICAgICBteSAkTW9kdWxlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykKICAgICAgICAgICAgLT57JE1vZHVsZX0tPntHcm91cH0gLy8gW107CgogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRNb2R1bGVHcm91cHMpICkgewogICAgICAgICAgICBNT0RVTEVfR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkTW9kdWxlR3JvdXAgKCBAeyRNb2R1bGVHcm91cHN9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwWyRNb2R1bGVHcm91cF0ifSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TW9kdWxlUGVybWlzc2lvbnN9LT57JE1vZHVsZX0gPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgTU9EVUxFX0dST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEFsd2F5cyBhbGxvdyBsaW5rcyBpZiBubyBncm91cHMgYXJlIHNwZWNpZmllZC4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte01vZHVsZVBlcm1pc3Npb25zfS0+eyRNb2R1bGV9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGN1cnJlbnQgdGltZSBpbiB0aGUgdmlldwogICAgJFBhcmFte1N0YXJ0fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydCcgKQogICAgICAgIHx8ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFRpbWVzdGFtcEdldCgpOwoKICAgICMgaGFuZGxlIGp1bXAKICAgICRQYXJhbXtKdW1wfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdKdW1wJyApIHx8ICcnOwogICAgaWYgKCAkUGFyYW17SnVtcH0gKSB7CiAgICAgICAgbXkgJEp1bXBPZmZzZXQgPSAwOwogICAgICAgIGlmICggJFBhcmFte0ZpbHRlcn0gZXEgJ1dlZWsnICkgewogICAgICAgICAgICAkSnVtcE9mZnNldCA9IDYwICogNjAgKiAyNCAqIDc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0ZpbHRlcn0gZXEgJ0RheScgKSB7CiAgICAgICAgICAgICRKdW1wT2Zmc2V0ID0gNjAgKiA2MCAqIDI0OwogICAgICAgIH0KCiAgICAgICAgIyBjYWxjdWxhdGUgZGVzdGluYXRpb24gdGltZQogICAgICAgIG15ICRTdGFydCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkUGFyYW17RmlsdGVyfSBlcSAnTW9udGgnICkgewogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkUGFyYW17SnVtcH0gZXEgJ1ByZXYnICkgewogICAgICAgICAgICAgICAgJE1vbnRoIC09IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUGFyYW17SnVtcH0gZXEgJ05leHQnICkgewogICAgICAgICAgICAgICAgJE1vbnRoICs9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkTW9udGggPCAxICkgewogICAgICAgICAgICAgICAgJE1vbnRoID0gMTI7CiAgICAgICAgICAgICAgICAkWWVhciAtPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJE1vbnRoID4gMTIgKSB7CiAgICAgICAgICAgICAgICAkTW9udGggPSAxOwogICAgICAgICAgICAgICAgJFllYXIgKz0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU3RhcnQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgRGF5ICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte0p1bXB9IGVxICdQcmV2JyApIHsKICAgICAgICAgICAgICAgICRTdGFydCAtPSAkSnVtcE9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtKdW1wfSBlcSAnTmV4dCcgKSB7CiAgICAgICAgICAgICAgICAkU3RhcnQgKz0gJEp1bXBPZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRQYXJhbXtTdGFydH0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNhbGN1bGF0ZSBkYXRlIGJvdW5kYXJpZXMKICAgIGlmICggJFBhcmFte0ZpbHRlcn0gZXEgJ01vbnRoJyApIHsKCiAgICAgICAgIyBnZXQgZmlyc3QgZGF5IG9mIHRoZSBtb250aAogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnR9LAogICAgICAgICk7CiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17U3RhcnRUaW1lfSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRZZWFyLCAkTW9udGgsIDEgKSAuICcgMDA6MDA6MDAnOwoKICAgICAgICAjIGdldCBsYXN0IGRheSBvZiB0aGUgbW9udGgKICAgICAgICAkTW9udGggKz0gMTsKICAgICAgICBpZiAoICRNb250aCA+IDEyICkgewogICAgICAgICAgICAkTW9udGggPSAxOwogICAgICAgICAgICAkWWVhciArPSAxOwogICAgICAgIH0KICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZTJTeXN0ZW1UaW1lKAogICAgICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgICAgICBEYXkgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFN5c3RlbVRpbWUgLT0gMTsgICAgIyBzdWJ0cmFjdCBvbmUgc2Vjb25kCiAgICAgICAgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte0VuZFRpbWV9ID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFllYXIsICRNb250aCwgJERheSApIC4gJyAyMzo1OTo1OSc7CgogICAgICAgICMgZ2V0IHRyYW5zbGF0ZWQgbmFtZSBvZiB0aGUgbW9udGgKICAgICAgICBteSBATW9udGhBcnJheSA9ICgKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICdKYW51YXJ5JywKICAgICAgICAgICAgJ0ZlYnJ1YXJ5JywKICAgICAgICAgICAgJ01hcmNoJywKICAgICAgICAgICAgJ0FwcmlsJywKICAgICAgICAgICAgJ01heV9sb25nJywKICAgICAgICAgICAgJ0p1bmUnLAogICAgICAgICAgICAnSnVseScsCiAgICAgICAgICAgICdBdWd1c3QnLAogICAgICAgICAgICAnU2VwdGVtYmVyJywKICAgICAgICAgICAgJ09jdG9iZXInLAogICAgICAgICAgICAnTm92ZW1iZXInLAogICAgICAgICAgICAnRGVjZW1iZXInLAogICAgICAgICk7CiAgICAgICAgbXkgJFRyYW5zbGF0ZU1vbnRoID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkTW9udGhBcnJheVskTW9udGhdICk7CgogICAgICAgICRQYXJhbXtIZWFkZXJUaXRsZX0gPSAiJFRyYW5zbGF0ZU1vbnRoICRZZWFyIjsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0ZpbHRlcn0gZXEgJ1dlZWsnICkgewogICAgICAgIG15ICRDYWxlbmRhcldlZWtEYXlTdGFydCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCA3OwogICAgICAgIG15ICRDYWxlbmRhcldlZWtEYXlFbmQgPSAoICRDYWxlbmRhcldlZWtEYXlTdGFydCAtIDEgKSB8fCA3OwoKICAgICAgICAjIGdldCBzdGFydCBvZiB0aGUgd2VlawogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnR9LAogICAgICAgICk7CiAgICAgICAgbXkgKCAkV2Vla0RheSwgJENXICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoICRXZWVrRGF5ICE9ICRDYWxlbmRhcldlZWtEYXlTdGFydCApIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSAtPSA2MCAqIDYwICogMjQ7CiAgICAgICAgICAgICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1N0YXJ0VGltZX0gPQogICAgICAgICAgICBzdWJzdHIoICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KCBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUgKSwgMCwgMTAgKQogICAgICAgICAgICAuICcgMDA6MDA6MDAnOwoKICAgICAgICAjIGdldCBlbmQgb2YgdGhlIHdlZWsKICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgKTsKICAgICAgICAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoICRXZWVrRGF5ICE9ICRDYWxlbmRhcldlZWtEYXlFbmQgKSB7CiAgICAgICAgICAgICRFbmRUaW1lICs9IDYwICogNjAgKiAyNDsKICAgICAgICAgICAgKCAkV2Vla0RheSwgJENXICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte0VuZFRpbWV9ID0KICAgICAgICAgICAgc3Vic3RyKCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCggU3lzdGVtVGltZSA9PiAkRW5kVGltZSApLCAwLCAxMCApCiAgICAgICAgICAgIC4gJyAyMzo1OTo1OSc7CgogICAgICAgICRQYXJhbXtIZWFkZXJUaXRsZX0gPQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKCAkUGFyYW17U3RhcnRUaW1lfSwgJ0RhdGVGb3JtYXRTaG9ydCcgKQogICAgICAgICAgICAuICcgJwogICAgICAgICAgICAuIGNocig4MjExKQogICAgICAgICAgICAuICcgJwogICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoICRQYXJhbXtFbmRUaW1lfSwgJ0RhdGVGb3JtYXRTaG9ydCcgKTsKICAgICAgICAkUGFyYW17SGVhZGVyVGl0bGVDV30gPSAiIyRDVyI7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtGaWx0ZXJ9IGVxICdEYXknICkgewogICAgICAgICRQYXJhbXtTdGFydFRpbWV9ID0gc3Vic3RyKCAkUGFyYW17U3RhcnR9LCAwLCAxMCApIC4gJyAwMDowMDowMCc7CiAgICAgICAgJFBhcmFte0VuZFRpbWV9ICAgPSBzdWJzdHIoICRQYXJhbXtTdGFydH0sIDAsIDEwICkgLiAnIDIzOjU5OjU5JzsKCiAgICAgICAgIyBnZXQgc3RhcnQgb2YgdGhlIHdlZWsKICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0fSwKICAgICAgICApOwogICAgICAgIG15ICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtIZWFkZXJUaXRsZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKCAkUGFyYW17U3RhcnRUaW1lfSwgJ0RhdGVGb3JtYXRTaG9ydCcgKTsKICAgICAgICAkUGFyYW17SGVhZGVyVGl0bGVDV30gPSAiIyRDVyI7CiAgICB9CgogICAgIyBkaXNwbGF5IGZpbHRlciBidXR0b25zCiAgICBteSBATmF2QmFyRmlsdGVyczsKICAgIGZvciBteSAkUHJpbyAoIHNvcnQga2V5cyAlTmF2QmFyRmlsdGVyICkgewogICAgICAgIHB1c2ggQE5hdkJhckZpbHRlcnMsICROYXZCYXJGaWx0ZXJ7JFByaW99OwogICAgfQogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlRmlsdGVycywKICAgICAgICB9LAogICAgKTsKICAgIG15ICRDb3VudCA9IDA7CiAgICBmb3IgbXkgJEZpbHRlciAoQE5hdkJhckZpbHRlcnMpIHsKICAgICAgICAkQ291bnQrKzsKICAgICAgICBpZiAoICRDb3VudCA9PSBzY2FsYXIgQE5hdkJhckZpbHRlcnMgKSB7CiAgICAgICAgICAgICRGaWx0ZXItPntDU1N9ID0gJ0xhc3QnOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkRmlsdGVyLT57RmlsdGVyfSBlcSAkUGFyYW17RmlsdGVyfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXskRmlsdGVyfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICAjIGdldCBhbGwgdXNlcidzIHZhbGlkIGNhbGVuZGFycwogICAgbXkgJFZhbGlkSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMb29rdXAoCiAgICAgICAgVmFsaWQgPT4gJ3ZhbGlkJywKICAgICk7CiAgICBteSBAQ2FsZW5kYXJzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckxpc3QoCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICk7CgogICAgIyBjaGVjayBpZiB3ZSBmb3VuZCBzb21lCiAgICBpZiAoQENhbGVuZGFycykgewoKICAgICAgICBmb3IgbXkgJENhbGVuZGFyIChAQ2FsZW5kYXJzKSB7CiAgICAgICAgICAgICRQYXJhbXtDYWxlbmRhckRhdGF9LT57ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9IH0gPSB7CiAgICAgICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJENhbGVuZGFyLT57Q2FsZW5kYXJOYW1lfSwKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAkQ2FsZW5kYXItPntDb2xvcn0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFwcG9pbnRtZW50IG9iamVjdAogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAgICAgbXkgQFZpZXdhYmxlQXBwb2ludG1lbnRzOwogICAgICAgIGZvciBteSAkQ2FsZW5kYXIgKEBDYWxlbmRhcnMpIHsKICAgICAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAVmlld2FibGVBcHBvaW50bWVudHMsIEBBcHBvaW50bWVudHM7CiAgICAgICAgfQoKICAgICAgICBpZiAoQFZpZXdhYmxlQXBwb2ludG1lbnRzKSB7CgogICAgICAgICAgICAjIHNvcnQgYnkgc3RhcnQgZGF0ZQogICAgICAgICAgICBAVmlld2FibGVBcHBvaW50bWVudHMgPSBzb3J0IHsgJGEtPntTdGFydFRpbWV9IGNtcCAkYi0+e1N0YXJ0VGltZX0gfSBAVmlld2FibGVBcHBvaW50bWVudHM7CgogICAgICAgICAgICBteSAkTGFzdERheSA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAVmlld2FibGVBcHBvaW50bWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIHNhdmUgdGltZSBzdGFtcHMgZm9yIGRpc3BsYXkgYmVmb3JlIGNhbGN1bGF0aW9uCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydERhdGV9ID0gJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfTsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZERhdGV9ICAgPSAkQXBwb2ludG1lbnQtPntFbmRUaW1lfTsKCiAgICAgICAgICAgICAgICAjIGVuZCB0aW1lcyBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgYXJlIGluY2x1c2l2ZSwgc3VidHJhY3Qgd2hvbGUgZGF5CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgLT0gODY0MDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRW5kVGltZSA8ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9ybWF0dGVkIGRhdGUvdGltZSBzdHJpbmdzIHVzZWQgaW4gZGlzcGxheQogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3RhcnREYXRlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3RhcnREYXRlfSwKICAgICAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcgLiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gPyAnU2hvcnQnIDogJycgKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZERhdGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmREYXRlfSwKICAgICAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcgLiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gPyAnU2hvcnQnIDogJycgKQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGZvcm1hdHRlZCBub3RpZmljYXRpb24gZGF0ZSB1c2VkIGluIGRpc3BsYXkKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjdXQgdGhlIHRpbWUgcG9ydGlvbgogICAgICAgICAgICAgICAgJFBhcmFte1N0YXJ0RGF5fSA9IHN1YnN0ciggJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSwgMCwgMTAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRMYXN0RGF5IG5lICRQYXJhbXtTdGFydERheX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FwcG9pbnRtZW50R3JvdXAnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnREYXkgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0U2hvcnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJExhc3REYXkgPyAnJyA6ICdGaXJzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJExhc3REYXkgPSAkUGFyYW17U3RhcnREYXl9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9ID0gJFBhcmFte1N0YXJ0RGF0ZX07CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kVGltZX0gICA9ICRQYXJhbXtFbmREYXRlfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcHBvaW50bWVudEFjdGlvblJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskQXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FwcG9pbnRtZW50Tm9EYXRhUm93JywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJzTm90Rm91bmQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdGFydCBvdXRwdXQKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBnZXQgcGFnZSBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCkgaWYgJFNlbGYtPntTdWJhY3Rpb259IG5lICdBSkFYRmlsdGVyVXBkYXRlJzsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRSaWNoVGV4dCAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpOwoKICAgIGlmICggJFJpY2hUZXh0ICYmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpBZG1pbjo6JFNlbGYtPntBY3Rpb259IiktPntSaWNoVGV4dH0gKSB7CiAgICAgICAgJFJpY2hUZXh0ID0gMDsKICAgIH0KCiAgICAjIHNldCB0eXBlIGZvciBub3RpZmljYXRpb25zCiAgICBteSAkQ29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICBpZiAoJFJpY2hUZXh0KSB7CiAgICAgICAgJENvbnRlbnRUeXBlID0gJ3RleHQvaHRtbCc7CiAgICB9CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50Jyk7CiAgICBteSAkTWFpbk9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgZ2V0IHJlZ2lzdGVyZWQgdHJhbnNwb3J0IGxheWVycwogICAgbXkgJVJlZ2lzdGVyZWRUcmFuc3BvcnRzID0gJXsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBcHBvaW50bWVudE5vdGlmaWNhdGlvbjo6VHJhbnNwb3J0JykgfHwge30gfTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CgogICAgICAgICMgZ2V0IG5vdGlmaWNhdGlvbiBpZAogICAgICAgIG15ICRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBnZXQgbm90aWZpY2F0aW9uIGRhdGEKICAgICAgICBteSAlRGF0YSA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBJRCA9PiAkSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICdDaGFuZ2UnLAogICAgICAgICAgICBSaWNoVGV4dCA9PiAkUmljaFRleHQsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZUFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgICAgIHF3KElEIE5hbWUgQ29tbWVudCBWYWxpZElEIEV2ZW50cyBUcmFuc3BvcnRzKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkgfHwgJyc7CiAgICAgICAgfQogICAgICAgIFBBUkFNRVRFUjoKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgICAgIHF3KFJlY2lwaWVudHMgUmVjaXBpZW50QWdlbnRzIFJlY2lwaWVudEdyb3VwcyBSZWNpcGllbnRSb2xlcwogICAgICAgICAgICBFdmVudHMgQ2FsZW5kYXJJRCBUZWFtSUQgUmVzb3VyY2VJRCBUaXRsZSBMb2NhdGlvbgogICAgICAgICAgICBUcmFuc3BvcnRzIE9uY2VQZXJEYXkgU2VuZE9uT3V0T2ZPZmZpY2UKICAgICAgICAgICAgVmlzaWJsZUZvckFnZW50IFZpc2libGVGb3JBZ2VudFRvb2x0aXAgTGFuZ3VhZ2VJRCBBZ2VudEVuYWJsZWRCeURlZmF1bHQpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBEYXRhID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICBuZXh0IFBBUkFNRVRFUiBpZiAhQERhdGE7CiAgICAgICAgICAgICRHZXRQYXJhbXtEYXRhfS0+eyRQYXJhbWV0ZXJ9ID0gXEBEYXRhOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIHN1YmplY3QgYW5kIGJvZHkgZm9yIGFsbCBsYW5ndWFnZXMKICAgICAgICBmb3IgbXkgJExhbmd1YWdlSUQgKCBAeyAkR2V0UGFyYW17RGF0YX0tPntMYW5ndWFnZUlEfSB9ICkgewoKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTGFuZ3VhZ2VJRCAuICdfU3ViamVjdCcgKSB8fCAnJzsKICAgICAgICAgICAgbXkgJEJvZHkgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTGFuZ3VhZ2VJRCAuICdfQm9keScgKSAgICB8fCAnJzsKCiAgICAgICAgICAgICRHZXRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfSA9IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAjIHNldCBzZXJ2ZXIgZXJyb3IgZmxhZyBpZiBmaWVsZCBpcyBlbXB0eQogICAgICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX1N1YmplY3RTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEJvZHkgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRMYW5ndWFnZUlEIC4gJ19Cb2R5U2VydmVyRXJyb3InIH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0cmFuc3BvcnQgc2V0dGluZ3MgdmFsdWVzCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVSZWdpc3RlcmVkVHJhbnNwb3J0cyApICkgewoKICAgICAgICAgICAgVFJBTlNQT1JUOgogICAgICAgICAgICBmb3IgbXkgJFRyYW5zcG9ydCAoIHNvcnQga2V5cyAlUmVnaXN0ZXJlZFRyYW5zcG9ydHMgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0gKTsKICAgICAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICEkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9OwoKICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9LCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHRyYW5zcG9ydCBzZXR0aW5ncyBzdHJpbmcgZnJvbSB0cmFuc3BvcnQgb2JqZWN0CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9ICktPlRyYW5zcG9ydFBhcmFtU2V0dGluZ3NHZXQoCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlCiAgICAgICAgbXkgJE9rOwogICAgICAgIG15ICREdXBsaWNhdGVkRW50cnkgPSAwOwogICAgICAgIG15ICRFcnJvciAgICAgICAgICAgPSAwOwoKICAgICAgICAjIENoZWNrIGZvciAnQWRkaXRpb25hbCByZWNpcGllbnQnIGZpZWxkIHZhbHVlIGxlbmd0aC4KICAgICAgICBpZiAoICRHZXRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudEVtYWlsfSAmJiBsZW5ndGggJEdldFBhcmFte0RhdGF9LT57UmVjaXBpZW50RW1haWx9ID4gMjAwICkgewogICAgICAgICAgICAkR2V0UGFyYW17UmVjaXBpZW50RW1haWxTZXJ2ZXJFcnJvcn0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVHlwZX0gPSBbJ0FwcG9pbnRtZW50J107CgogICAgICAgICMgR2V0IGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIG5vdGlmaWNhdGlvbnMgYW5kIGNoZWNrIGlmIGEgbm90aWZpY2F0aW9uIHdpdGggdGhlCiAgICAgICAgIyBzYW1lIG5hbWUgYW5kIGFub3RoZXIgdHlwZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UuCiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbkxpc3QgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkxpc3QoCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgRGV0YWlscyA9PiAxLAogICAgICAgICAgICBBbGwgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgTk9USUZJQ0FUSU9OSUQ6CiAgICAgICAgZm9yIG15ICROb3RpZmljYXRpb25JRCAoIHNvcnQga2V5cyAlTm90aWZpY2F0aW9uTGlzdCApIHsKCiAgICAgICAgICAgIG5leHQgTk9USUZJQ0FUSU9OSUQgaWYgISROb3RpZmljYXRpb25JRDsKICAgICAgICAgICAgbmV4dCBOT1RJRklDQVRJT05JRCBpZiAkR2V0UGFyYW17TmFtZX0gbmUgJE5vdGlmaWNhdGlvbkxpc3R7JE5vdGlmaWNhdGlvbklEfS0+e05hbWV9OwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEdldFBhcmFte05hbWV9IGVxICROb3RpZmljYXRpb25MaXN0eyROb3RpZmljYXRpb25JRH0tPntOYW1lfQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte0lEfSBuZSAkTm90aWZpY2F0aW9uSUQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJER1cGxpY2F0ZWRFbnRyeSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISREdXBsaWNhdGVkRW50cnkgJiYgISRFcnJvciApIHsKICAgICAgICAgICAgJE9rID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25VcGRhdGUoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRPaykgewogICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KCk7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnTm90aWZpY2F0aW9uIHVwZGF0ZWQhJykgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yIG15ICROZWVkZWQgKHF3KE5hbWUgRXZlbnRzIFRyYW5zcG9ydHMpKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICROZWVkZWQgLiAiU2VydmVyRXJyb3IiIH0gPSAiIjsKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyROZWVkZWR9IGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJE5lZWRlZCAuICJTZXJ2ZXJFcnJvciIgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICBpZiAoJER1cGxpY2F0ZWRFbnRyeSkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgICAgICBJbmZvICAgICA9PiBUcmFuc2xhdGFibGUoJ05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzIScpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwogICAgICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgICAgIFJpY2hUZXh0ID0+ICRSaWNoVGV4dCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICdBZGQnLAogICAgICAgICAgICBSaWNoVGV4dCA9PiAkUmljaFRleHQsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgICAgIHF3KE5hbWUgQ29tbWVudCBWYWxpZElEIEV2ZW50cyBUcmFuc3BvcnRzKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkgfHwgJyc7CiAgICAgICAgfQogICAgICAgIFBBUkFNRVRFUjoKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgICAgIHF3KFJlY2lwaWVudHMgUmVjaXBpZW50QWdlbnRzIFJlY2lwaWVudFJvbGVzIFJlY2lwaWVudEdyb3VwcyBFdmVudHMKICAgICAgICAgICAgQ3VzdG9tZXJJRCBDdXN0b21lclVzZXJJRCBUcmFuc3BvcnRzIE9uY2VQZXJEYXkgU2VuZE9uT3V0T2ZPZmZpY2UKICAgICAgICAgICAgVmlzaWJsZUZvckFnZW50IFZpc2libGVGb3JBZ2VudFRvb2x0aXAgTGFuZ3VhZ2VJRCBBZ2VudEVuYWJsZWRCeURlZmF1bHQpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBEYXRhID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICBuZXh0IFBBUkFNRVRFUiBpZiAhQERhdGE7CiAgICAgICAgICAgICRHZXRQYXJhbXtEYXRhfS0+eyRQYXJhbWV0ZXJ9ID0gXEBEYXRhOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIHN1YmplY3QgYW5kIGJvZHkgZm9yIGFsbCBsYW5ndWFnZXMKICAgICAgICBmb3IgbXkgJExhbmd1YWdlSUQgKCBAeyAkR2V0UGFyYW17RGF0YX0tPntMYW5ndWFnZUlEfSB9ICkgewoKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTGFuZ3VhZ2VJRCAuICdfU3ViamVjdCcgKSB8fCAnJzsKICAgICAgICAgICAgbXkgJEJvZHkgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTGFuZ3VhZ2VJRCAuICdfQm9keScgKSAgICB8fCAnJzsKCiAgICAgICAgICAgICRHZXRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfSA9IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAjIHNldCBzZXJ2ZXIgZXJyb3IgZmxhZyBpZiBmaWVsZCBpcyBlbXB0eQogICAgICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX1N1YmplY3RTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEJvZHkgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRMYW5ndWFnZUlEIC4gJ19Cb2R5U2VydmVyRXJyb3InIH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0cmFuc3BvcnQgc2V0dGluZ3MgdmFsdWVzCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVSZWdpc3RlcmVkVHJhbnNwb3J0cyApICkgewoKICAgICAgICAgICAgVFJBTlNQT1JUOgogICAgICAgICAgICBmb3IgbXkgJFRyYW5zcG9ydCAoIHNvcnQga2V5cyAlUmVnaXN0ZXJlZFRyYW5zcG9ydHMgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0gKTsKICAgICAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICEkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9OwoKICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9LCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHRyYW5zcG9ydCBzZXR0aW5ncyBzdHJpbmcgZnJvbSB0cmFuc3BvcnQgb2JqZWN0CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9ICktPlRyYW5zcG9ydFBhcmFtU2V0dGluZ3NHZXQoCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkCiAgICAgICAgbXkgJElEOwogICAgICAgIG15ICREdXBsaWNhdGVkRW50cnkgPSAwOwogICAgICAgIG15ICRFcnJvciAgICAgICAgICAgPSAwOwoKICAgICAgICAjIENoZWNrIGZvciAnQWRkaXRpb25hbCByZWNpcGllbnQnIGZpZWxkIHZhbHVlIGxlbmd0aC4KICAgICAgICBpZiAoICRHZXRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudEVtYWlsfSAmJiBsZW5ndGggJEdldFBhcmFte0RhdGF9LT57UmVjaXBpZW50RW1haWx9ID4gMjAwICkgewogICAgICAgICAgICAkR2V0UGFyYW17UmVjaXBpZW50RW1haWxTZXJ2ZXJFcnJvcn0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVHlwZX0gPSBbJ0FwcG9pbnRtZW50J107CgogICAgICAgICMgR2V0IGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIG5vdGlmaWNhdGlvbnMgYW5kIGNoZWNrIGlmIGEgbm90aWZpY2F0aW9uIHdpdGggdGhlCiAgICAgICAgIyBzYW1lIG5hbWUgYW5kIGFub3RoZXIgdHlwZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UuCiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbkxpc3QgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkxpc3QoCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgRGV0YWlscyA9PiAxLAogICAgICAgICAgICBBbGwgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgTk9USUZJQ0FUSU9OSUQ6CiAgICAgICAgZm9yIG15ICROb3RpZmljYXRpb25JRCAoIHNvcnQga2V5cyAlTm90aWZpY2F0aW9uTGlzdCApIHsKCiAgICAgICAgICAgIG5leHQgTk9USUZJQ0FUSU9OSUQgaWYgISROb3RpZmljYXRpb25JRDsKICAgICAgICAgICAgbmV4dCBOT1RJRklDQVRJT05JRCBpZiAkR2V0UGFyYW17TmFtZX0gbmUgJE5vdGlmaWNhdGlvbkxpc3R7JE5vdGlmaWNhdGlvbklEfS0+e05hbWV9OwoKICAgICAgICAgICAgJER1cGxpY2F0ZWRFbnRyeSA9IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkRHVwbGljYXRlZEVudHJ5ICYmICEkRXJyb3IgKSB7CiAgICAgICAgICAgICRJRCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uQWRkKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggISRHZXRQYXJhbXtEYXRhfS0+e1RyYW5zcG9ydHN9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17VHJhbnNwb3J0U2VydmVyRXJyb3J9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICB9CgogICAgICAgIGlmICgkSUQpIHsKICAgICAgICAgICAgJFNlbGYtPl9PdmVydmlldygpOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ05vdGlmaWNhdGlvbiBhZGRlZCEnKSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBFdmVudHMgVHJhbnNwb3J0cykpIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJE5lZWRlZCAuICJTZXJ2ZXJFcnJvciIgfSA9ICIiOwogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JE5lZWRlZH0gZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkTmVlZGVkIC4gIlNlcnZlckVycm9yIiB9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgIGlmICgkRHVwbGljYXRlZEVudHJ5KSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+IFRyYW5zbGF0YWJsZSgnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBQcmlvcml0eSA9PiAnRXJyb3InICk7CiAgICAgICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICdBZGQnLAogICAgICAgICAgICAgICAgUmljaFRleHQgPT4gJFJpY2hUZXh0LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVsZXRlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyhJRCkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgbXkgJERlbGV0ZSA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uRGVsZXRlKAogICAgICAgICAgICBJRCAgICAgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISREZWxldGUgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIE5vdGlmaWNhdGlvbkV4cG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ05vdGlmaWNhdGlvbkV4cG9ydCcgKSB7CgogICAgICAgIG15ICROb3RpZmljYXRpb25JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKICAgICAgICBteSAkTm90aWZpY2F0aW9uRGF0YTsKICAgICAgICBteSAlTm90aWZpY2F0aW9uU2luZ2xlRGF0YTsKICAgICAgICBteSAkRmlsZW5hbWUgPSAnRXhwb3J0X05vdGlmaWNhdGlvbi55bWwnOwoKICAgICAgICBpZiAoJE5vdGlmaWNhdGlvbklEKSB7CgogICAgICAgICAgICAlTm90aWZpY2F0aW9uU2luZ2xlRGF0YSA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgSUQgICAgID0+ICROb3RpZmljYXRpb25JRCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVOb3RpZmljYXRpb25TaW5nbGVEYXRhICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnVGhlcmUgd2FzIGFuIGVycm9yIGdldHRpbmcgZGF0YSBmb3IgTm90aWZpY2F0aW9uIHdpdGggSUQ6JXMhJywgJE5vdGlmaWNhdGlvbklEICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkTm90aWZpY2F0aW9uTmFtZSA9ICROb3RpZmljYXRpb25TaW5nbGVEYXRhe05hbWV9OwogICAgICAgICAgICAkTm90aWZpY2F0aW9uTmFtZSA9fiBze1teYS16QS1aMC05LV9dfXtffXhtc2c7ICAgICMgY2xlYW51cCBuYW1lIGZvciBzYXZpbmcKCiAgICAgICAgICAgICRGaWxlbmFtZSAgICAgICAgID0gJ0V4cG9ydF9Ob3RpZmljYXRpb25fJyAuICROb3RpZmljYXRpb25OYW1lIC4gJy55bWwnOwogICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0YSA9IFsgXCVOb3RpZmljYXRpb25TaW5nbGVEYXRhIF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgbXkgJU5vdGlmaWNhdGlvbmRldGFpbHMgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkxpc3QoCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIERldGFpbHMgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBEYXRhOwogICAgICAgICAgICBmb3IgbXkgJEl0ZW1JRCAoIHNvcnQga2V5cyAlTm90aWZpY2F0aW9uZGV0YWlscyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQERhdGEsICROb3RpZmljYXRpb25kZXRhaWxzeyRJdGVtSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICROb3RpZmljYXRpb25EYXRhID0gXEBEYXRhOwogICAgICAgIH0KCiAgICAgICAgIyBjb252ZXJ0IHRoZSBOb3RpZmljYXRpb24gZGF0YSBoYXNoIHRvIHN0cmluZwogICAgICAgIG15ICROb3RpZmljYXRpb25EYXRhWUFNTCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpZQU1MJyktPkR1bXAoIERhdGEgPT4gJE5vdGlmaWNhdGlvbkRhdGEgKTsKCiAgICAgICAgIyBzZW5kIHRoZSByZXN1bHQgdG8gdGhlIGJyb3dzZXIKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbDsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkTm90aWZpY2F0aW9uRGF0YVlBTUwsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBOb3RpZmljYXRpb25Db3B5CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTm90aWZpY2F0aW9uQ29weScgKSB7CgogICAgICAgIG15ICROb3RpZmljYXRpb25JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgTm90aWZpY2F0aW9uIGRhdGEKICAgICAgICBteSAlTm90aWZpY2F0aW9uRGF0YSA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlTm90aWZpY2F0aW9uRGF0YSApICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1Vua25vd24gTm90aWZpY2F0aW9uICVzIScsICROb3RpZmljYXRpb25JRCApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgbmV3IE5vdGlmaWNhdGlvbiBuYW1lCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbk5hbWUgPQogICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0YXtOYW1lfQogICAgICAgICAgICAuICcgKCcKICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NvcHknKQogICAgICAgICAgICAuICcpJzsKCiAgICAgICAgIyBvdGhlcndpc2Ugc2F2ZSBjb25maWd1cmF0aW9uIGFuZCByZXR1cm4gdG8gb3ZlcnZpZXcgc2NyZWVuCiAgICAgICAgbXkgJE5ld05vdGlmaWNhdGlvbklEID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25BZGQoCiAgICAgICAgICAgICVOb3RpZmljYXRpb25EYXRhLAogICAgICAgICAgICBOYW1lICAgPT4gJE5vdGlmaWNhdGlvbk5hbWUsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVycm9yIGlmIGNhbid0IGNyZWF0ZQogICAgICAgIGlmICggISROZXdOb3RpZmljYXRpb25JRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoIlRoZXJlIHdhcyBhbiBlcnJvciBjcmVhdGluZyB0aGUgTm90aWZpY2F0aW9uIiksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiB0byBvdmVydmlldwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBOb3RpZmljYXRpb25JbXBvcnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdOb3RpZmljYXRpb25JbXBvcnQnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkRm9ybUlEICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApIHx8ICcnOwogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSAgPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE92ZXJ3cml0ZUV4aXN0aW5nTm90aWZpY2F0aW9ucyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPdmVyd3JpdGVFeGlzdGluZ05vdGlmaWNhdGlvbnMnICkgfHwgJyc7CgogICAgICAgIG15ICROb3RpZmljYXRpb25JbXBvcnQgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkltcG9ydCgKICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVcGxvYWRTdHVmZntDb250ZW50fSwKICAgICAgICAgICAgT3ZlcndyaXRlRXhpc3RpbmdOb3RpZmljYXRpb25zID0+ICRPdmVyd3JpdGVFeGlzdGluZ05vdGlmaWNhdGlvbnMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJE5vdGlmaWNhdGlvbkltcG9ydC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICROb3RpZmljYXRpb25JbXBvcnQtPntNZXNzYWdlfQogICAgICAgICAgICAgICAgfHwgVHJhbnNsYXRhYmxlKAogICAgICAgICAgICAgICAgJ05vdGlmaWNhdGlvbnMgY291bGQgbm90IGJlIEltcG9ydGVkIGR1ZSB0byBhIHVua25vd24gZXJyb3IsIHBsZWFzZSBjaGVjayBPVFJTIGxvZ3MgZm9yIG1vcmUgaW5mb3JtYXRpb24nCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uSW1wb3J0LT57QWRkZWROb3RpZmljYXRpb25zfSApIHsKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17Tm90aWZ5RGF0YX0gfSwgewogICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgTm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gYWRkZWQgc3VjY2Vzc2Z1bGx5OiAlcycsCiAgICAgICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkltcG9ydC0+e0FkZGVkTm90aWZpY2F0aW9uc30KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICggJE5vdGlmaWNhdGlvbkltcG9ydC0+e1VwZGF0ZWROb3RpZmljYXRpb25zfSApIHsKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17Tm90aWZ5RGF0YX0gfSwgewogICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgTm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gdXBkYXRlZCBzdWNjZXNzZnVsbHk6ICVzJywKICAgICAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uSW1wb3J0LT57VXBkYXRlZE5vdGlmaWNhdGlvbnN9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAoICROb3RpZmljYXRpb25JbXBvcnQtPntOb3RpZmljYXRpb25FcnJvcnN9ICkgewogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtOb3RpZnlEYXRhfSB9LCB7CiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdUaGVyZSB3aGVyZSBlcnJvcnMgYWRkaW5nL3VwZGF0aW5nIHRoZSBmb2xsb3dpbmcgTm90aWZpY2F0aW9uczogJXMuIFBsZWFzZSBjaGVjayB0aGUgbG9nIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywKICAgICAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uSW1wb3J0LT57Tm90aWZpY2F0aW9uRXJyb3JzfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc2hvdyBub3RpZmljYXRpb25zIGlmIGFueQogICAgICAgIGlmICggJFBhcmFte05vdGlmeURhdGF9ICkgewogICAgICAgICAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbiAoIEB7ICRQYXJhbXtOb3RpZnlEYXRhfSB9ICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgJXskTm90aWZpY2F0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCn0KCnN1YiBfRWRpdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgJFBhcmFte1JlY2lwaWVudHNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudEFnZW50cyA9PiBUcmFuc2xhdGFibGUoJ0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgQXBwb2ludG1lbnRBZ2VudFJlYWRQZXJtaXNzaW9ucyA9PgogICAgICAgICAgICAgICAgVHJhbnNsYXRhYmxlKCdBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJyksCiAgICAgICAgICAgIEFwcG9pbnRtZW50QWdlbnRXcml0ZVBlcm1pc3Npb25zID0+CiAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGUoJ0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKScpLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnUmVjaXBpZW50cycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gOCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudHN9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICApOwoKICAgIG15ICVBbGxBZ2VudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CiAgICAkUGFyYW17UmVjaXBpZW50QWdlbnRzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlQWxsQWdlbnRzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY2lwaWVudEFnZW50cycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudEFnZW50c30sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIFc3NXBjJywKICAgICk7CgogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgJFBhcmFte1JlY2lwaWVudEdyb3Vwc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiB7ICRHcm91cE9iamVjdC0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICkgfSwKICAgICAgICBTaXplICAgICAgID0+IDYsCiAgICAgICAgTmFtZSAgICAgICA9PiAnUmVjaXBpZW50R3JvdXBzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RGF0YX0tPntSZWNpcGllbnRHcm91cHN9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICApOwogICAgJFBhcmFte1JlY2lwaWVudFJvbGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IHsgJEdyb3VwT2JqZWN0LT5Sb2xlTGlzdCggVmFsaWQgPT4gMSApIH0sCiAgICAgICAgU2l6ZSAgICAgICA9PiA2LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY2lwaWVudFJvbGVzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RGF0YX0tPntSZWNpcGllbnRSb2xlc30sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIFc3NXBjJywKICAgICk7CgogICAgIyBTZXQgY2xhc3MgbmFtZSBmb3IgZXZlbnQgc3RyaW5nLi4uCiAgICBteSAkRXZlbnRDbGFzcyA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICBpZiAoICRQYXJhbXtFdmVudHNTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgJEV2ZW50Q2xhc3MgLj0gJyAnIC4gJFBhcmFte0V2ZW50c1NlcnZlckVycm9yfTsKICAgIH0KCiAgICBteSAkTm90aWZpY2F0aW9uQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiByZWdpc3RlcmVkIGV2ZW50cwogICAgbXkgJVJlZ2lzdGVyZWRFdmVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RXZlbnQnKS0+RXZlbnRMaXN0KAogICAgICAgIE9iamVjdFR5cGVzID0+ICROb3RpZmljYXRpb25Db25maWctPntFdmVudE9iamVjdFR5cGVzfSwKICAgICk7CgogICAgbXkgQEV2ZW50czsKICAgIGZvciBteSAkT2JqZWN0VHlwZSAoIHNvcnQga2V5cyAlUmVnaXN0ZXJlZEV2ZW50cyApIHsKICAgICAgICBwdXNoIEBFdmVudHMsIEB7ICRSZWdpc3RlcmVkRXZlbnRzeyRPYmplY3RUeXBlfSB8fCBbXSB9OwogICAgfQoKICAgICMgU3VwcHJlc3MgdGhlc2UgZXZlbnRzIGJlY2F1c2Ugb2YgZGFuZ2VyIG9mIGVuZGxlc3MgbG9vcHMuCiAgICBteSAlRXZlbnRCbGFja2xpc3QgPSAoCiAgICAgICAgQXJ0aWNsZUFnZW50Tm90aWZpY2F0aW9uICAgID0+IDEsCiAgICAgICAgQXJ0aWNsZUN1c3RvbWVyTm90aWZpY2F0aW9uID0+IDEsCiAgICApOwoKICAgIEBFdmVudHMgPSBncmVwIHsgISRFdmVudEJsYWNrbGlzdHskX30gfSBARXZlbnRzOwoKICAgICMgQnVpbGQgdGhlIGxpc3QuLi4KICAgICRQYXJhbXtFdmVudHNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXEBFdmVudHMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnRXZlbnRzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICBDbGFzcyAgICAgID0+ICRFdmVudENsYXNzIC4gJyBNb2Rlcm5pemUgVzc1cGMnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0RhdGF9LT57RXZlbnRzfSwKICAgICk7CgogICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgbXkgQENhbGVuZGFyTGlzdCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICAgICAgVmFsaWRJRCAgICA9PiAwLAogICAgKTsKCiAgICBteSAlQ2FsZW5kYXJMaXN0OwoKICAgIENBTEVOREFSOgogICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFyTGlzdCkgewoKICAgICAgICBuZXh0IENBTEVOREFSIGlmICEkQ2FsZW5kYXI7CiAgICAgICAgbmV4dCBDQUxFTkRBUiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJENhbGVuZGFyKTsKCiAgICAgICAgJENhbGVuZGFyTGlzdHsgJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0gfSA9ICRDYWxlbmRhci0+e0NhbGVuZGFyTmFtZX07CiAgICB9CgogICAgJFBhcmFte0NhbGVuZGFyU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlQ2FsZW5kYXJMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ0NhbGVuZGFySUQnLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVzc1cGMnLAogICAgKTsKCiAgICAkUGFyYW17UmVzb3VyY2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXCVBbGxBZ2VudHMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnUmVzb3VyY2VJRCcsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtEYXRhfS0+e1Jlc291cmNlSUR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICApOwoKICAgICRQYXJhbXtUaXRsZX0gICAgPSAkUGFyYW17RGF0YX0tPntUaXRsZX0tPlswXSAgICB8fCAnJzsKICAgICRQYXJhbXtMb2NhdGlvbn0gPSAkUGFyYW17RGF0YX0tPntMb2NhdGlvbn0tPlswXSB8fCAnJzsKCiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAlVmFsaWRMaXN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICRQYXJhbXtWYWxpZE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ZhbGlkSUR9IHx8ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVzUwcGMnLAogICAgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3VXBkYXRlJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgdHJ5IHRvIGxvYWQgdGhlIHRlYW0gYmFja2VuZAogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKCiAgICAgICAgIyBpbnN0YW5jaWF0ZSBhIG5ldyB0ZWFtIG9iamVjdAogICAgICAgIG15ICRUZWFtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtLT5uZXcoKTsKCiAgICAgICAgIyBnZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSAocmVhZGFibGUpIHRlYW1zCiAgICAgICAgbXkgJVRlYW1MaXN0ID0gJFRlYW1PYmplY3QtPlRlYW1MaXN0KAogICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVRlYW1MaXN0ICkgKSB7CgogICAgICAgICAgICAjIGJ1aWxkIHRlYW0gc2VsZWN0aW9uCiAgICAgICAgICAgIG15ICRUZWFtU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVRlYW1MaXN0LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVGVhbUlEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0RhdGF9LT57VGVhbUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFjdGl2YXRlIHRoZSB0ZWFtIHNlY3Rpb24KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1VwZGF0ZVRlYW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGVhbVN0cmcgPT4gJFRlYW1TdHJnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93cyBoZWFkZXIKICAgIGlmICggJFBhcmFte0FjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0hlYWRlckVkaXQnICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnSGVhZGVyQWRkJyApOwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OkFkbWluOjokU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJENvbmZpZy0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxhbmd1YWdlIGlkcyBmcm9tIG1lc3NhZ2UgcGFyYW1ldGVyLCB1c2UgRW5nbGlzaCBpZiBubyBtZXNzYWdlIGlzIGdpdmVuCiAgICAjIG1ha2Ugc3VyZSBFbmdsaXNoIGlzIHRoZSBmaXJzdCBsYW5ndWFnZQogICAgbXkgQExhbmd1YWdlSURzOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte01lc3NhZ2V9ICkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17TWVzc2FnZX0tPntlbn0gKSB7CiAgICAgICAgICAgIHB1c2ggQExhbmd1YWdlSURzLCAnZW4nOwogICAgICAgIH0KICAgICAgICBMQU5HVUFHRUlEOgogICAgICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoIHNvcnQga2V5cyAleyAkUGFyYW17TWVzc2FnZX0gfSApIHsKICAgICAgICAgICAgbmV4dCBMQU5HVUFHRUlEIGlmICRMYW5ndWFnZUlEIGVxICdlbic7CiAgICAgICAgICAgIHB1c2ggQExhbmd1YWdlSURzLCAkTGFuZ3VhZ2VJRDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBATGFuZ3VhZ2VJRHMgPSAoJ2VuJyk7CiAgICB9CgogICAgIyBnZXQgbmFtZXMgb2YgbGFuZ3VhZ2VzIGluIEVuZ2xpc2gKICAgIG15ICVEZWZhdWx0VXNlZExhbmd1YWdlcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnRGVmYXVsdFVzZWRMYW5ndWFnZXMnKSB8fCB7fSB9OwoKICAgICMgZ2V0IG5hdGl2ZSBuYW1lcyBvZiBsYW5ndWFnZXMKICAgIG15ICVEZWZhdWx0VXNlZExhbmd1YWdlc05hdGl2ZSA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnRGVmYXVsdFVzZWRMYW5ndWFnZXNOYXRpdmUnKSB8fCB7fSB9OwoKICAgIG15ICVMYW5ndWFnZXM7CiAgICBMQU5HVUFHRUlEOgogICAgZm9yIG15ICRMYW5ndWFnZUlEICggc29ydCBrZXlzICVEZWZhdWx0VXNlZExhbmd1YWdlcyApIHsKCiAgICAgICAgIyBuZXh0IGxhbmd1YWdlIGlmIHRoZXJlIGlzIG5vdCBzZXQgYW55IG5hbWUgZm9yIGN1cnJlbnQgbGFuZ3VhZ2UKICAgICAgICBpZiAoICEkRGVmYXVsdFVzZWRMYW5ndWFnZXN7JExhbmd1YWdlSUR9ICYmICEkRGVmYXVsdFVzZWRMYW5ndWFnZXNOYXRpdmV7JExhbmd1YWdlSUR9ICkgewogICAgICAgICAgICBuZXh0IExBTkdVQUdFSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0ZXh0cyBpbiBuYXRpdmUgYW5kIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICBteSAkVGV4dCAgICAgICAgPSAkRGVmYXVsdFVzZWRMYW5ndWFnZXNOYXRpdmV7JExhbmd1YWdlSUR9IHx8ICcnOwogICAgICAgIG15ICRUZXh0RW5nbGlzaCA9ICREZWZhdWx0VXNlZExhbmd1YWdlc3skTGFuZ3VhZ2VJRH0gICAgICAgfHwgJyc7CgogICAgICAgICMgdHJhbnNsYXRlIHRvIGN1cnJlbnQgdXNlcidzIGxhbmd1YWdlCiAgICAgICAgbXkgJFRleHRUcmFuc2xhdGVkID0KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFRleHRFbmdsaXNoKTsKCiAgICAgICAgaWYgKCAkVGV4dFRyYW5zbGF0ZWQgJiYgJFRleHRUcmFuc2xhdGVkIG5lICRUZXh0ICkgewogICAgICAgICAgICAkVGV4dCAuPSAnIC0gJyAuICRUZXh0VHJhbnNsYXRlZDsKICAgICAgICB9CgogICAgICAgICMgbmV4dCBsYW5ndWFnZSBpZiB0aGVyZSBpcyBub3Qgc2V0IEVuZ2xpc2ggbm9yIG5hdGl2ZSBuYW1lIG9mIGxhbmd1YWdlLgogICAgICAgIG5leHQgTEFOR1VBR0VJRCBpZiAhJFRleHQ7CgogICAgICAgICRMYW5ndWFnZXN7JExhbmd1YWdlSUR9ID0gJFRleHQ7CiAgICB9CgogICAgIyBjb3B5IG9yaWdpbmFsIGxpc3Qgb2YgbGFuZ3VhZ2VzIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgcmVidWlsZGluZyBsYW5ndWFnZSBzZWxlY3Rpb24KICAgIG15ICVPcmlnaW5hbERlZmF1bHRVc2VkTGFuZ3VhZ2VzID0gJUxhbmd1YWdlczsKCiAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoQExhbmd1YWdlSURzKSB7CgogICAgICAgICMgZm9ybWF0IHRoZSBjb250ZW50IGFjY29yZGluZyB0byB0aGUgY29udGVudCB0eXBlCiAgICAgICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQgKGlmIGJvZHkgaXMgYmFzZWQgb24gY29uZmlnKQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkUGFyYW17TWVzc2FnZX0tPnskTGFuZ3VhZ2VJRH0tPntDb250ZW50VHlwZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0NvbnRlbnRUeXBlfSA9fiBte3RleHRcL3BsYWlufXhtc2kKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9LT57Qm9keX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgcmVmb3JtYXQgZnJvbSBIVE1MIHRvIHBsYWluCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0NvbnRlbnRUeXBlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9LT57Q29udGVudFR5cGV9ID1+IG17dGV4dFwvaHRtbH14bXNpCiAgICAgICAgICAgICAgICAmJiAkUGFyYW17TWVzc2FnZX0tPnskTGFuZ3VhZ2VJRH0tPntCb2R5fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWVzc2FnZX0tPnskTGFuZ3VhZ2VJRH0tPntCb2R5fSA9ICRIVE1MVXRpbHNPYmplY3QtPlRvQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRoZSBub3RpZmljYXRpb24gZm9yIHRoaXMgbGFuZ3VhZ2UKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90aWZpY2F0aW9uTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9LT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0JvZHl9ICAgIHx8ICcnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCAgICAgICAgID0+ICRMYW5ndWFnZUlELAogICAgICAgICAgICAgICAgTGFuZ3VhZ2UgICAgICAgICAgID0+ICRMYW5ndWFnZXN7JExhbmd1YWdlSUR9LAogICAgICAgICAgICAgICAgU3ViamVjdFNlcnZlckVycm9yID0+ICRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX1N1YmplY3RTZXJ2ZXJFcnJvcicgfSB8fCAnJywKICAgICAgICAgICAgICAgIEJvZHlTZXJ2ZXJFcnJvciAgICA9PiAkUGFyYW17ICRMYW5ndWFnZUlEIC4gJ19Cb2R5U2VydmVyRXJyb3InIH0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRoZSBidXR0b24gdG8gcmVtb3ZlIGEgbm90aWZpY2F0aW9uIG9ubHkgaWYgaXQgaXMgbm90IHRoZSBFbmdsaXNoIG5vdGlmaWNhdGlvbgogICAgICAgIGlmICggJExhbmd1YWdlSUQgbmUgJ2VuJyApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOb3RpZmljYXRpb25MYW5ndWFnZVJlbW92ZUJ1dHRvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCA9PiAkTGFuZ3VhZ2VJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBsYW5ndWFnZSBmcm9tIGRyb3AtZG93biBsaXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzaG93bgogICAgICAgIGRlbGV0ZSAkTGFuZ3VhZ2VzeyRMYW5ndWFnZUlEfTsKICAgIH0KCiAgICAkUGFyYW17TGFuZ3VhZ2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJUxhbmd1YWdlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0xhbmd1YWdlJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBXNTBwYyBMYW5ndWFnZUFkZCcsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgSFRNTFF1b3RlICAgID0+IDAsCiAgICApOwogICAgJFBhcmFte0xhbmd1YWdlT3JpZ1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlT3JpZ2luYWxEZWZhdWx0VXNlZExhbmd1YWdlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0xhbmd1YWdlT3JpZycsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgSFRNTFF1b3RlICAgID0+IDAsCiAgICApOwoKICAgICMgdGFrZSBvdmVyIGRhdGEgZmllbGRzCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoVmlzaWJsZUZvckFnZW50IFZpc2libGVGb3JBZ2VudFRvb2x0aXAgQ3VzdG9tZXJJRCBDdXN0b21lclVzZXJJRCkKICAgICAgICApCiAgICB7CiAgICAgICAgbmV4dCBLRVkgaWYgISRQYXJhbXtEYXRhfS0+eyRLZXl9OwogICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICRQYXJhbXtEYXRhfS0+eyRLZXl9LT5bMF07CiAgICAgICAgJFBhcmFteyRLZXl9ID0gJFBhcmFte0RhdGF9LT57JEtleX0tPlswXTsKICAgIH0KCiAgICAjIHNldCBzZW5kIG9uIG91dCBvZiBvZmZpY2UgY2hlY2tlZCB2YWx1ZQogICAgJFBhcmFte1NlbmRPbk91dE9mT2ZmaWNlQ2hlY2tlZH0gPSAoICRQYXJhbXtEYXRhfS0+e1NlbmRPbk91dE9mT2ZmaWNlfSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwoKICAgICMgc2V0IG9uY2UgcGVyIGRheSBjaGVja2VkIHZhbHVlCiAgICAkUGFyYW17T25jZVBlckRheUNoZWNrZWR9ID0gKCAkUGFyYW17RGF0YX0tPntPbmNlUGVyRGF5fSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwoKICAgIG15ICRPVFJTQnVzaW5lc3NPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpPVFJTQnVzaW5lc3MnKTsKICAgIG15ICRPVFJTQnVzaW5lc3NJc0luc3RhbGxlZCA9ICRPVFJTQnVzaW5lc3NPYmplY3QtPk9UUlNCdXNpbmVzc0lzSW5zdGFsbGVkKCk7CgogICAgIyBUaGlyZCBvcHRpb24gaXMgZW5hYmxlZCBvbmx5IHdoZW4gT1RSU0J1c2luZXNzIGlzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgogICAgJFBhcmFte1Zpc2libGVGb3JBZ2VudFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzEnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdZZXMnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJzInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gVHJhbnNsYXRhYmxlKCdZZXMsIGJ1dCByZXF1aXJlIGF0IGxlYXN0IG9uZSBhY3RpdmUgbm90aWZpY2F0aW9uIG1ldGhvZC4nKSwKICAgICAgICAgICAgICAgIERpc2FibGVkID0+ICRPVFJTQnVzaW5lc3NJc0luc3RhbGxlZCA/IDAgOiAxLAogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBOYW1lICAgICAgID0+ICdWaXNpYmxlRm9yQWdlbnQnLAogICAgICAgIFNvcnQgICAgICAgPT4gJ051bWVyaWNLZXknLAogICAgICAgIFNpemUgICAgICAgPT4gMSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWaXNpYmxlRm9yQWdlbnR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNTBwYycsCiAgICApOwoKICAgICMgaW5jbHVkZSByZWFkLW9ubHkgYXR0cmlidXRlCiAgICBpZiAoICEkUGFyYW17VmlzaWJsZUZvckFnZW50fSApIHsKICAgICAgICAkUGFyYW17VmlzaWJsZUZvckFnZW50VG9vbHRpcFJlYWRvbmx5fSA9ICdyZWFkb25seT0icmVhZG9ubHkiJzsKICAgIH0KCiAgICAjIGdldCByZWdpc3RlcmVkIHRyYW5zcG9ydCBsYXllcnMKICAgIG15ICVSZWdpc3RlcmVkVHJhbnNwb3J0cyA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQXBwb2ludG1lbnROb3RpZmljYXRpb246OlRyYW5zcG9ydCcpIHx8IHt9IH07CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVSZWdpc3RlcmVkVHJhbnNwb3J0cyApICkgewoKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgIFRSQU5TUE9SVDoKICAgICAgICBmb3IgbXkgJFRyYW5zcG9ydCAoCiAgICAgICAgICAgIHNvcnQgeyAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JGF9LT57UHJpb30gPD0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skYn0tPntQcmlvfSB9CiAgICAgICAgICAgIGtleXMgJVJlZ2lzdGVyZWRUcmFuc3BvcnRzCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fSApOwogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TW9kdWxlfTsKCiAgICAgICAgICAgICMgdHJhbnNwb3J0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lID0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e05hbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9LCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICAgICAgICAgICMgYmFja2VuZCBmb3IgdGhpcyB0cmFuc3BvcnQgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93RGlzYWJsZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgICAgID0+ICRUcmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE5hbWUgPT4gJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBpZiBub3Qgc3RhbmRhcmQgdHJhbnNwb3J0CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntJc09UUlNCdXNpbmVzc1RyYW5zcG9ydH0KICAgICAgICAgICAgICAgICAgICAmJiAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntJc09UUlNCdXNpbmVzc1RyYW5zcG9ydH0gZXEgJzEnCiAgICAgICAgICAgICAgICAgICAgJiYgISRPVFJTQnVzaW5lc3NJc0luc3RhbGxlZAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgIyB0cmFuc3BvcnQKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93UmVjb21tZW5kYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE5hbWUgPT4gJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRUcmFuc3BvcnRDaGVja2VkID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0IH0gQHsgJFBhcmFte0RhdGF9LT57VHJhbnNwb3J0c30gfSApIHsKICAgICAgICAgICAgICAgICAgICAkVHJhbnNwb3J0Q2hlY2tlZCA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZXQgRW1haWwgdHJhbnNwb3J0IHNlbGVjdGVkIG9uIGFkZCBzY3JlZW4KICAgICAgICAgICAgICAgIGlmICggJFRyYW5zcG9ydCBlcSAnRW1haWwnICYmICEkUGFyYW17SUR9ICkgewogICAgICAgICAgICAgICAgICAgICRUcmFuc3BvcnRDaGVja2VkID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCB0cmFuc3BvcnQgc2V0dGluZ3Mgc3RyaW5nIGZyb20gdHJhbnNwb3J0IG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFRyYW5zcG9ydFNldHRpbmdzID0KICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9ICktPlRyYW5zcG9ydFNldHRpbmdzRGlzcGxheUdldCgKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGl0IHNob3VsZCBkZWNpZGUgaWYgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQogICAgICAgICAgICAgICAgIyBub3RpZmljYXRpb24gb24gQWdlbnRQcmVmZXJlbmNlcyBpcyBlbmFibGVkIG9yIG5vdAogICAgICAgICAgICAgICAgbXkgJEFnZW50RW5hYmxlZEJ5RGVmYXVsdCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0IH0gQHsgJFBhcmFte0RhdGF9LT57QWdlbnRFbmFibGVkQnlEZWZhdWx0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRBZ2VudEVuYWJsZWRCeURlZmF1bHQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAhJFBhcmFte0lEfSAmJiBkZWZpbmVkICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e0FnZW50RW5hYmxlZEJ5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEFnZW50RW5hYmxlZEJ5RGVmYXVsdCA9ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e0FnZW50RW5hYmxlZEJ5RGVmYXVsdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkQWdlbnRFbmFibGVkQnlEZWZhdWx0Q2hlY2tlZCA9ICggJEFnZW50RW5hYmxlZEJ5RGVmYXVsdCA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwoKICAgICAgICAgICAgICAgICMgdHJhbnNwb3J0CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmFuc3BvcnRSb3dFbmFibGVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0ICAgICAgICAgICAgICAgICAgICA9PiAkVHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lICAgICAgICAgICAgICAgID0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRDaGVja2VkICAgICAgICAgICAgID0+ICRUcmFuc3BvcnRDaGVja2VkLAogICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1N0cmluZyAgICAgICAgICAgICAgID0+ICRUcmFuc3BvcnRTZXR0aW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgQWdlbnRFbmFibGVkQnlEZWZhdWx0Q2hlY2tlZCA9PiAkQWdlbnRFbmFibGVkQnlEZWZhdWx0Q2hlY2tlZCwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0c1NlcnZlckVycm9yICAgICAgICA9PiAkUGFyYW17VHJhbnNwb3J0c1NlcnZlckVycm9yfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgbm8gdHJhbnNwb3J0cwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZ1RyYW5zcG9ydCcsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9PdmVydmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uQWRkJyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkltcG9ydCcgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKCiAgICBteSAlTGlzdCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uTGlzdCggVHlwZSA9PiAnQXBwb2ludG1lbnQnICk7CgogICAgbXkgJE5vdGlmaWNhdGlvbkNvbmZpZwogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiByZWdpc3RlcmVkIGV2ZW50cwogICAgbXkgJVJlZ2lzdGVyZWRFdmVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RXZlbnQnKS0+RXZlbnRMaXN0KAogICAgICAgIE9iamVjdFR5cGVzID0+ICROb3RpZmljYXRpb25Db25maWctPntFdmVudE9iamVjdFR5cGVzfSwKICAgICk7CgogICAgIyBnZXQgYSBsaXN0IG9mIGFsbCBub3RpZmljYXRpb25zIGFmZmVjdGVkIGJ5IHRoZSBzdXBwb3J0ZWQgZXZlbnRzCiAgICBteSAlTm90aWZpY2F0aW9uSURzOwoKICAgICMgaWYgdGhlcmUgYXJlIGFueSBub3RpZmljYXRpb25zLCB0aGV5IGFyZSBzaG93bgogICAgaWYgKCVMaXN0KSB7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgICAgIGZvciAoIHNvcnQgeyAkTGlzdHskYX0gY21wICRMaXN0eyRifSB9IGtleXMgJUxpc3QgKSB7CgogICAgICAgICAgICBteSAlRGF0YSA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJF8sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7ICREYXRhe1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZSBpcyBkaXNwbGF5ZWQKICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OkFzeW5jaHJvbm91c0V4ZWN1dG9yKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBDZXJ0YWluIHNlYXJjaCBwYXJhbWV0ZXJzIGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIHNob3VsZCBiZSBzdG9yZWQgYXMgc2NhbGFycywgbm90IGFycmF5IHJlZnMuCiAgICAkU2VsZi0+e1NlYXJjaFBhcmFtU2NhbGFyfSA9IFsgJ0Zyb20nLCAnVG8nLCAnQ2MnLCAnU3ViamVjdCcsICdCb2R5JywgJ0F0dGFjaG1lbnROYW1lJyBdOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBuYW1lcyBvZiBhbGwgcGFyYW1ldGVycwogICAgbXkgQFBhcmFtTmFtZXMgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIFBBUkFNTkFNRToKICAgIGZvciBteSAkS2V5IChAUGFyYW1OYW1lcykgewoKICAgICAgICAjIFF1ZXVlLCBPd25lcklEcyBhbmQgUmVzcG9uc2libGVJRHMgYXJlIG11bHRpcGxlIHNlbGVjdGlvbiBmaWVsZHMsIGdldCBhcnJheSBpbnN0ZWFkLgogICAgICAgIGlmICgKICAgICAgICAgICAgJEtleSA9fiAvXlF1ZXVlSURfLwogICAgICAgICAgICB8fCAkS2V5ID1+IC9eU2VhcmNoUGFyYW1fWzAtOWEtZl0rX093bmVySURzJC8KICAgICAgICAgICAgfHwgJEtleSA9fiAvXlNlYXJjaFBhcmFtX1swLTlhLWZdK19SZXNwb25zaWJsZUlEcyQvCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBQYXJhbUFycmF5ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSBcQFBhcmFtQXJyYXk7CiAgICAgICAgICAgIG5leHQgUEFSQU1OQU1FOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgIG15ICRMYXlvdXRPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwoKICAgICMgR2V0IHVzZXIncyBwZXJtaXNzaW9ucyB0byBhc3NvY2lhdGVkIG1vZHVsZXMgd2hpY2ggYXJlIGRpc3BsYXllZCBhcyBsaW5rcy4KICAgIGZvciBteSAkTW9kdWxlIChxdyhBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyBBZ2VudEFwcG9pbnRtZW50SW1wb3J0KSkgewogICAgICAgIG15ICRNb2R1bGVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKQogICAgICAgICAgICAtPnskTW9kdWxlfS0+e0dyb3VwfSAvLyBbXTsKCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1vZHVsZUdyb3VwcykgKSB7CiAgICAgICAgICAgIE1PRFVMRV9HUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRNb2R1bGVHcm91cCAoIEB7JE1vZHVsZUdyb3Vwc30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJE1vZHVsZUdyb3VwXSJ9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtNb2R1bGVQZXJtaXNzaW9uc30tPnskTW9kdWxlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBNT0RVTEVfR1JPVVA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQWx3YXlzIGFsbG93IGxpbmtzIGlmIG5vIGdyb3VwcyBhcmUgc3BlY2lmaWVkLgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9kdWxlUGVybWlzc2lvbnN9LT57JE1vZHVsZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTmV3JyApIHsKCiAgICAgICAgbXkgJEdyb3VwU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fR3JvdXBTZWxlY3Rpb25HZXQoKTsKICAgICAgICBteSAkQ29sb3JQYWxldHRlICAgICAgID0gJFNlbGYtPl9Db2xvclBhbGV0dGVHZXQoKTsKICAgICAgICBteSAkVmFsaWRTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9WYWxpZFNlbGVjdGlvbkdldCgpOwogICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHMgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cygpOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJFZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgQ29sb3JQYWxldHRlID0+ICRDb2xvclBhbGV0dGUsCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gJFZhbGlkU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uICAgID0+ICdTdG9yZU5ldycsCiAgICAgICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJENvbG9yUGFsZXR0ZS0+WyBpbnQgcmFuZCggc2NhbGFyIEB7JENvbG9yUGFsZXR0ZX0gKSBdLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQWRkIG5ldyBDYWxlbmRhcicpLAogICAgICAgICAgICAgICAgV2lkZ2V0U3RhdHVzID0+ICdDb2xsYXBzZWQnLAogICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKCiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICAjIGNoZWNrIG5hbWUKICAgICAgICBpZiAoICEkR2V0UGFyYW17Q2FsZW5kYXJOYW1lfSApIHsKICAgICAgICAgICAgJEVycm9yeydDYWxlbmRhck5hbWVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBjYWxlbmRhciB3aXRoIHNhbWUgbmFtZQogICAgICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICRHZXRQYXJhbXtDYWxlbmRhck5hbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCVDYWxlbmRhcikgewogICAgICAgICAgICAgICAgJEVycm9ye0NhbGVuZGFyTmFtZUludmFsaWR9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgICAgICRFcnJvcntDYWxlbmRhck5hbWVFeGlzdHN9ICA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9ID0gJFNlbGYtPl9HZXRUaWNrZXRBcHBvaW50bWVudFBhcmFtcyglR2V0UGFyYW0pOwoKICAgICAgICAjIEdldCBxdWV1ZSBjcmVhdGUgcGVybWlzc2lvbnMgZm9yIHRoZSB1c2VyLgogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFZhbGlkSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CgogICAgICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICAgICAjIFF1ZXVlIGZpZWxkIGluIHRpY2tldCBhcHBvaW50bWVudHMgaXMgbWFuZGF0b3J5LCBjaGVjayBpZiBpdCdzIHByZXNlbnQgYW5kIHZhbGlkLgogICAgICAgIGZvciBteSAkUnVsZSAoIEB7ICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9IH0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUnVsZS0+e1F1ZXVlSUR9ICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJFJ1bGUtPntRdWV1ZUlEfSApICkgewoKICAgICAgICAgICAgICAgIFFVRVVFX0lEOgogICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBAeyAkUnVsZS0+e1F1ZXVlSUR9IHx8IFtdIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgIWdyZXAgeyAkXyBlcSAkUXVldWVEYXRhe1ZhbGlkSUR9IH0gQFZhbGlkSURzCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFJ1bGUtPntSdWxlSUR9IH0tPntRdWV1ZUlESW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFFVRVVFX0lEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJFJ1bGUtPntSdWxlSUR9IH0tPntRdWV1ZUlESW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGdldCBzZWxlY3Rpb25zCiAgICAgICAgICAgIG15ICRHcm91cFNlbGVjdGlvbiAgICAgPSAkU2VsZi0+X0dyb3VwU2VsZWN0aW9uR2V0KCVHZXRQYXJhbSk7CiAgICAgICAgICAgIG15ICRDb2xvclBhbGV0dGUgICAgICAgPSAkU2VsZi0+X0NvbG9yUGFsZXR0ZUdldCgpOwogICAgICAgICAgICBteSAkVmFsaWRTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9WYWxpZFNlbGVjdGlvbkdldCglR2V0UGFyYW0pOwogICAgICAgICAgICBteSAlVGlja2V0QXBwb2ludG1lbnRzID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudHMoKTsKCiAgICAgICAgICAgICMgZ2V0IHJ1bGUgY291bnQKICAgICAgICAgICAgbXkgJFJ1bGVDb3VudCA9IHNjYWxhciBAeyAkR2V0UGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSB8fCBbXSB9OwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhckVkaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIENvbG9yUGFsZXR0ZSA9PiAkQ29sb3JQYWxldHRlLAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uICAgID0+ICdTdG9yZU5ldycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQWRkIG5ldyBDYWxlbmRhcicpLAogICAgICAgICAgICAgICAgICAgIFdpZGdldFN0YXR1cyA9PiAkUnVsZUNvdW50ID8gJ0V4cGFuZGVkJyA6ICdDb2xsYXBzZWQnLAogICAgICAgICAgICAgICAgICAgICVUaWNrZXRBcHBvaW50bWVudHMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTaG93IGFsbCB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZSBibG9ja3MuCiAgICAgICAgICAgIG15ICRSdWxlTnVtYmVyID0gMTsKICAgICAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gfHwgW10gfSApIHsKICAgICAgICAgICAgICAgICRSdWxlLT57RXJyb3J9ID0gJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfTsKICAgICAgICAgICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFJ1bGUgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cyggJXskUnVsZX0gKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50UnVsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJ1bGVOdW1iZXIgPT4gJFJ1bGVOdW1iZXIrKywKICAgICAgICAgICAgICAgICAgICAgICAgJXskUnVsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICVUaWNrZXRBcHBvaW50bWVudFJ1bGUsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBTaG93IGFueSBzZWFyY2ggcGFyYW1ldGVyIGJsb2NrcyB0b28uCiAgICAgICAgICAgICAgICAkU2VsZi0+X1Nob3dUaWNrZXRBcHBvaW50bWVudFBhcmFtcyggJXskUnVsZX0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFzayglUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgY2FsZW5kYXIKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJUNhbGVuZGFyICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBQcm9jZXNzIHRpY2tldCBhcHBvaW50bWVudHMgaW4gYXN5bmMgY2FsbCB0byBjb3JlIG1vZHVsZSBtZXRob2QuCiAgICAgICAgJFNlbGYtPkFzeW5jQ2FsbCgKICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSAgID0+ICdUaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcicsCiAgICAgICAgICAgIEZ1bmN0aW9uUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0VkaXQnICkgewoKICAgICAgICAjIGdldCBkYXRhCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICRHZXRQYXJhbXtDYWxlbmRhcklEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDYWxlbmRhcklEJyApIHx8ICcnOwoKICAgICAgICBpZiAoICEkR2V0UGFyYW17Q2FsZW5kYXJJRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDYWxlbmRhcklEIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2FsZW5kYXIgZGF0YQogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEdldFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICElQ2FsZW5kYXIgKSB7CgogICAgICAgICAgICAjIGZha2UgbWVzc2FnZQogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZWxlY3Rpb25zCiAgICAgICAgbXkgJEdyb3VwU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fR3JvdXBTZWxlY3Rpb25HZXQoJUNhbGVuZGFyKTsKICAgICAgICBteSAkQ29sb3JQYWxldHRlICAgICAgID0gJFNlbGYtPl9Db2xvclBhbGV0dGVHZXQoKTsKICAgICAgICBteSAkVmFsaWRTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9WYWxpZFNlbGVjdGlvbkdldCglQ2FsZW5kYXIpOwogICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHMgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cygpOwoKICAgICAgICBteSAkUnVsZUNvdW50ID0gc2NhbGFyIEB7ICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9IHx8IFtdIH07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhckVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVDYWxlbmRhciwKICAgICAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBDb2xvclBhbGV0dGUgPT4gJENvbG9yUGFsZXR0ZSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gICAgPT4gJ1VwZGF0ZScsCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdFZGl0IENhbGVuZGFyJyksCiAgICAgICAgICAgICAgICBSdWxlQ291bnQgICAgPT4gJFJ1bGVDb3VudCwKICAgICAgICAgICAgICAgIFdpZGdldFN0YXR1cyA9PiAkUnVsZUNvdW50ID8gJ0V4cGFuZGVkJyA6ICdDb2xsYXBzZWQnLAogICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIFNob3cgYWxsIHRpY2tldCBhcHBvaW50bWVudCBydWxlIGJsb2Nrcy4KICAgICAgICBteSAkUnVsZU51bWJlciA9IDE7CiAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gfHwgW10gfSApIHsKICAgICAgICAgICAgbXkgJVRpY2tldEFwcG9pbnRtZW50UnVsZSA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRzKCAleyRSdWxlfSApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50UnVsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBSdWxlTnVtYmVyID0+ICRSdWxlTnVtYmVyKyssCiAgICAgICAgICAgICAgICAgICAgJXskUnVsZX0sCiAgICAgICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50UnVsZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNob3cgYW55IHNlYXJjaCBwYXJhbWV0ZXIgYmxvY2tzIHRvby4KICAgICAgICAgICAgJFNlbGYtPl9TaG93VGlja2V0QXBwb2ludG1lbnRQYXJhbXMoICV7JFJ1bGV9ICk7CgogICAgICAgICAgICAjIGluaXRpYWxpemUgYnV0dG9uIGJlaGF2aW9yCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnRSdWxlSW5pdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRSdWxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZScgKSB7CgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBDYWxlbmRhck5hbWUgQ29sb3IgR3JvdXBJRCkpIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyAkTmVlZGVkIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwoKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2soICVQYXJhbSwgJUdldFBhcmFtLCAlRXJyb3IgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgY2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJEdldFBhcmFte0NhbGVuZGFyTmFtZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWxlbmRhcntDYWxlbmRhcklEfSAmJiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gIT0gJEdldFBhcmFte0NhbGVuZGFySUR9ICkgewogICAgICAgICAgICAkRXJyb3J7Q2FsZW5kYXJOYW1lSW52YWxpZH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICAkRXJyb3J7Q2FsZW5kYXJOYW1lRXhpc3RzfSAgPSAxOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gPSAkU2VsZi0+X0dldFRpY2tldEFwcG9pbnRtZW50UGFyYW1zKCVHZXRQYXJhbSk7CgogICAgICAgICMgR2V0IHF1ZXVlIGNyZWF0ZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHVzZXIuCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICBteSBAVmFsaWRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICMgUXVldWUgZmllbGQgaW4gdGlja2V0IGFwcG9pbnRtZW50cyBpcyBtYW5kYXRvcnksIGNoZWNrIGlmIGl0J3MgcHJlc2VudCBhbmQgdmFsaWQuCiAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRSdWxlLT57UXVldWVJRH0gJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkUnVsZS0+e1F1ZXVlSUR9ICkgKSB7CgogICAgICAgICAgICAgICAgUVVFVUVfSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IEB7ICRSdWxlLT57UXVldWVJRH0gfHwgW10gfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAhZ3JlcCB7ICRfIGVxICRRdWV1ZURhdGF7VmFsaWRJRH0gfSBAVmFsaWRJRHMKICAgICAgICAgICAgICAgICAgICAgICAgfHwgISRVc2VyR3JvdXBzeyAkUXVldWVEYXRhe0dyb3VwSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfS0+e1F1ZXVlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUVVFVUVfSUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfS0+e1F1ZXVlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgZ2V0IHNlbGVjdGlvbnMKICAgICAgICAgICAgbXkgJEdyb3VwU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fR3JvdXBTZWxlY3Rpb25HZXQoJUdldFBhcmFtKTsKICAgICAgICAgICAgbXkgJENvbG9yUGFsZXR0ZSAgICAgICA9ICRTZWxmLT5fQ29sb3JQYWxldHRlR2V0KCk7CiAgICAgICAgICAgIG15ICRWYWxpZFNlbGVjdGlvbiAgICAgPSAkU2VsZi0+X1ZhbGlkU2VsZWN0aW9uR2V0KCVHZXRQYXJhbSk7CiAgICAgICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHMgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cygpOwoKICAgICAgICAgICAgbXkgJFJ1bGVDb3VudCA9IHNjYWxhciBAeyAkR2V0UGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSB8fCBbXSB9OwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhckVkaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIENvbG9yUGFsZXR0ZSA9PiAkQ29sb3JQYWxldHRlLAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uICAgID0+ICdVcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0VkaXQgQ2FsZW5kYXInKSwKICAgICAgICAgICAgICAgICAgICBSdWxlQ291bnQgICAgPT4gJFJ1bGVDb3VudCwKICAgICAgICAgICAgICAgICAgICAlVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2hvdyBhbGwgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgYmxvY2tzLgogICAgICAgICAgICBteSAkUnVsZU51bWJlciA9IDE7CiAgICAgICAgICAgIGZvciBteSAkUnVsZSAoIEB7ICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9IHx8IFtdIH0gKSB7CiAgICAgICAgICAgICAgICAkUnVsZS0+e0Vycm9yfSA9ICRFcnJvcnsgJFJ1bGUtPntSdWxlSUR9IH07CiAgICAgICAgICAgICAgICBteSAlVGlja2V0QXBwb2ludG1lbnRSdWxlID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudHMoICV7JFJ1bGV9ICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudFJ1bGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSdWxlTnVtYmVyID0+ICRSdWxlTnVtYmVyKyssCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFJ1bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAlVGlja2V0QXBwb2ludG1lbnRSdWxlLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgU2hvdyBhbnkgc2VhcmNoIHBhcmFtZXRlciBibG9ja3MgdG9vLgogICAgICAgICAgICAgICAgJFNlbGYtPl9TaG93VGlja2V0QXBwb2ludG1lbnRQYXJhbXMoICV7JFJ1bGV9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2soJVBhcmFtKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIGNhbGVuZGFyCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyVXBkYXRlKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFByb2Nlc3MgdGlja2V0IGFwcG9pbnRtZW50cyBpbiBhc3luYyBjYWxsIHRvIGNvcmUgbW9kdWxlIG1ldGhvZC4KICAgICAgICAkU2VsZi0+QXN5bmNDYWxsKAogICAgICAgICAgICBPYmplY3ROYW1lICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICAgICAgICAgRnVuY3Rpb25OYW1lICAgPT4gJ1RpY2tldEFwcG9pbnRtZW50UHJvY2Vzc0NhbGVuZGFyJywKICAgICAgICAgICAgRnVuY3Rpb25QYXJhbXMgPT4gewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2FsZW5kYXJJbXBvcnQnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCB0aGUgdXBsb2FkZWQgZmlsZSBjb250ZW50CiAgICAgICAgbXkgJEZvcm1JRCAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKSB8fCAnJzsKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICk7CiAgICAgICAgbXkgJENvbnRlbnQgPSAkVXBsb2FkU3R1ZmZ7Q29udGVudH07CgogICAgICAgICMgY2hlY2sgZm9yIG92ZXJ3cml0aW5nIG9wdGlvbgogICAgICAgIG15ICRPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ092ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXMnICkgfHwgMDsKCiAgICAgICAgIyBleHRyYWN0IHRoZSB0ZWFtIGRhdGEgZnJvbSB0aGUgdXBsb2FkZWQgZmlsZQogICAgICAgIG15ICRDYWxlbmRhckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WUFNTCcpLT5Mb2FkKCBEYXRhID0+ICRDb250ZW50ICk7CiAgICAgICAgaWYgKCByZWYgJENhbGVuZGFyRGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCJDb3VsZG4ndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4iKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaW1wb3J0IHRoZSBjYWxlbmRhcgogICAgICAgIG15ICRTdWNjZXNzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckltcG9ydCgKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJEYXRhLAogICAgICAgICAgICBPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzID0+ICRPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJFBhcmFte05vdGlmeU1lc3NhZ2V9ID0gewogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZnlNZXNzYWdlfSA9IHsKICAgICAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDYWxlbmRhciBpbXBvcnRlZCEnKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICVQYXJhbSA9ICRTZWxmLT5fT3ZlcnZpZXcoJVBhcmFtKTsKICAgIH0KCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2FsZW5kYXJFeHBvcnQnICkgewoKICAgICAgICAjIGNoZWNrIGZvciBDYWxlbmRhcklECiAgICAgICAgbXkgJENhbGVuZGFySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2FsZW5kYXJJRCcgKSB8fCAnJzsKICAgICAgICBpZiAoICEkQ2FsZW5kYXJJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05lZWQgQ2FsZW5kYXJJRCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNhbGVuZGFyIGRhdGEKICAgICAgICBteSAlQ2FsZW5kYXJEYXRhID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckV4cG9ydCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlQ2FsZW5kYXJEYXRhICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjb252ZXJ0IHRoZSBjYWxlbmRhciBkYXRhIGhhc2ggdG8gc3RyaW5nCiAgICAgICAgbXkgJENhbGVuZGFyRGF0YVlBTUwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WUFNTCcpLT5EdW1wKCBEYXRhID0+IFwlQ2FsZW5kYXJEYXRhICk7CgogICAgICAgICMgcHJlcGFyZSBjYWxlbmRhciBuYW1lIHRvIGJlIHBhcnQgb2YgdGhlIGZpbGVuYW1lCiAgICAgICAgbXkgJENhbGVuZGFyTmFtZSA9ICRDYWxlbmRhckRhdGF7Q2FsZW5kYXJEYXRhfS0+e0NhbGVuZGFyTmFtZX07CiAgICAgICAgJENhbGVuZGFyTmFtZSA9fiBzL1xzKy9fL2c7CgogICAgICAgICMgc2VuZCB0aGUgcmVzdWx0IHRvIHRoZSBicm93c2VyCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJENhbGVuZGFyRGF0YVlBTUwsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0V4cG9ydF9DYWxlbmRhcl8nIC4gJENhbGVuZGFyTmFtZSAuICcueW1sJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJbXBvcnRBcHBvaW50bWVudHNTdWNjZXNzJyApIHx8ICcnICkgewogICAgICAgICAgICAkUGFyYW17Tm90aWZ5TWVzc2FnZX0gPSB7CiAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLicsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvdW50JyApIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICkgIHx8ICcnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICVQYXJhbSA9ICRTZWxmLT5fT3ZlcnZpZXcoJVBhcmFtKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPl9NYXNrKCVQYXJhbSk7Cn0KCnN1YiBfT3ZlcnZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICAjIGdldCBhbGwgY2FsZW5kYXJzIHVzZXIgaGFzIFJXIGFjY2VzcyB0bwogICAgbXkgQENhbGVuZGFycyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3J3JywKICAgICk7CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDYWxlbmRhckZpbHRlcicsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdDYWxlbmRhcnMnKSwKICAgICAgICB9LAogICAgKTsKCiAgICAkUGFyYW17VmFsaWRDb3VudH0gPSAwOwogICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFycykgewoKICAgICAgICAjIGdyb3VwIG5hbWUKICAgICAgICAkQ2FsZW5kYXItPntHcm91cH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJENhbGVuZGFyLT57R3JvdXBJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyB2YWxpZCB0ZXh0CiAgICAgICAgJENhbGVuZGFyLT57VmFsaWR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgICAgICBWYWxpZElEID0+ICRDYWxlbmRhci0+e1ZhbGlkSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQ2FsZW5kYXItPntWYWxpZElEfSA9PSAxICkgewogICAgICAgICAgICAkUGFyYW17VmFsaWRDb3VudH0rKzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFjY2VzcyB0b2tlbnMKICAgICAgICAkQ2FsZW5kYXItPntBY2Nlc3NUb2tlbn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldEFjY2Vzc1Rva2VuKAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICBVc2VyTG9naW4gID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JENhbGVuZGFyfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggc2NhbGFyIEBDYWxlbmRhcnMgPT0gMCApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJOb0RhdGFSb3cnLAogICAgICAgICk7CiAgICB9CiAgICAkUGFyYW17T3ZlcnZpZXd9ID0gMTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNYWluQWN0aW9ucycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uSW1wb3J0JyApOwoKICAgIHJldHVybiAlUGFyYW07Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgb3V0cHV0IHBhZ2UKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgIGlmICggJFBhcmFte05vdGlmeU1lc3NhZ2V9ICkgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAleyAkUGFyYW17Tm90aWZ5TWVzc2FnZX0gfSwKICAgICAgICApOwogICAgfQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0VkaXQgQ2FsZW5kYXInKSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0dyb3VwU2VsZWN0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGlzdCBvZiBncm91cHMgd2hlcmUgdXNlciBoYXMgUlcgcGVybWlzc2lvbnMKICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICk7CgogICAgbXkgJEdyb3VwU2VsZWN0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlR3JvdXBMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ0dyb3VwSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0dyb3VwSUR9IHx8ICcnLAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICApOwoKICAgIHJldHVybiAkR3JvdXBTZWxlY3Rpb247Cn0KCnN1YiBfQ29sb3JQYWxldHRlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29sb3IgcGFsZXR0ZQogICAgbXkgJENhbGVuZGFyQ29sb3JzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBcHBvaW50bWVudENhbGVuZGFyOjpDYWxlbmRhckNvbG9ycycpIHx8IFsKICAgICAgICAnIzAwMDAwMCcsICcjMUUxRTFFJywgJyMzQTNBM0EnLCAnIzU0NTQ1MycsICcjNkU2RTZFJywgJyM4Nzg2ODcnLCAnIzg4ODc4NycsICcjQTA5RkEwJywKICAgICAgICAnI0I4QjhCOCcsICcjRDBEMEQwJywgJyNFOEU4RTgnLCAnI0ZGRkZGRicsICcjODkxMTAwJywgJyM4OTQ4MDAnLCAnIzg4ODUwMScsICcjNDU4NDAxJywKICAgICAgICAnIzAyODQwMScsICcjMDE4NDQ4JywgJyMwMDg2ODgnLCAnIzAwNEE4OCcsICcjMDAxODg4JywgJyM0OTFBODgnLCAnIzg5MUU4OCcsICcjODkxNjQ4JywKICAgICAgICAnI0ZGMjEwMScsICcjRkY4ODAyJywgJyNGRkZBMDMnLCAnIzgzRjkwMicsICcjMDVGODAyJywgJyMwM0Y5ODcnLCAnIzAwRkRGRicsICcjMDA4Q0ZGJywKICAgICAgICAnIzAwMkVGRicsICcjODkzMUZGJywgJyNGRjM5RkYnLCAnI0ZGMjk4NycsICcjRkY3MjZFJywgJyNGRkNFNkUnLCAnI0ZGRkI2RCcsICcjQ0VGQTZFJywKICAgICAgICAnIzY4Rjk2RScsICcjNjhGREZGJywgJyM2OEZCRDAnLCAnIzZBQ0ZGRicsICcjNkU3NkZGJywgJyNEMjc4RkYnLCAnI0ZGN0FGRicsICcjRkY3RkQzJywKICAgIF07CgogICAgcmV0dXJuICRDYWxlbmRhckNvbG9yczsKfQoKc3ViIF9WYWxpZFNlbGVjdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVWYWxpZCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgIG15ICRWYWxpZFNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIElEICAgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VmFsaWRJRH0gfHwgMSwKICAgICAgICBUaXRsZSAgICAgID0+IFRyYW5zbGF0YWJsZSgiVmFsaWQiKSwKICAgICk7CgogICAgcmV0dXJuICRWYWxpZFNlbGVjdGlvbjsKfQoKc3ViIF9Vc2VyU2VsZWN0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVVzZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoKTsKCiAgICBteSAkVXNlclNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiBcJVVzZXJMaXN0LAogICAgICAgIE5hbWUgPT4gKCAkUGFyYW17UnVsZUlEfSAmJiAkUGFyYW17UGFyYW1OYW1lfSApCiAgICAgICAgPyAnU2VhcmNoUGFyYW1fJyAuICRQYXJhbXtSdWxlSUR9IC4gJ18nIC4gJFBhcmFte1BhcmFtTmFtZX0KICAgICAgICA6ICdTZWFyY2hQYXJhbVVzZXInLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBDbGFzcyAgICAgID0+ICdTZWFyY2hQYXJhbSBNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1BhcmFtVmFsdWV9IHx8IFtdLAogICAgKTsKCiAgICAjIEFkZCBwYXJhbSBuYW1lIGFzIGRhdGEgYXR0cmlidXRlIGZvciBsYXRlciByZWZlcmVuY2UgaW4gSlMuCiAgICBpZiAoICRQYXJhbXtQYXJhbU5hbWV9ICkgewogICAgICAgICRVc2VyU2VsZWN0aW9uID1+IHMvPHNlbGVjdC88c2VsZWN0IGRhdGEtcGFyYW09IiRQYXJhbXtQYXJhbU5hbWV9Ii87CiAgICB9CgogICAgcmV0dXJuICRVc2VyU2VsZWN0aW9uOwp9CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGZpZWxkIGlkIHN1ZmZpeAogICAgbXkgJEZpZWxkSUQgPSAnJzsKICAgIGlmICggJFBhcmFte1J1bGVJRH0gKSB7CiAgICAgICAgJEZpZWxkSUQgPSAnXycgLiAkUGFyYW17UnVsZUlEfTsKICAgIH0KCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRzOwoKICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICApOwoKICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCgpOwogICAgbXkgJUF2YWlsYWJsZVF1ZXVlczsKCiAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgIFFVRVVFSUQ6CiAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJVF1ZXVlcyApIHsKICAgICAgICBteSAlUXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgbmV4dCBRVUVVRUlEIGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAkQXZhaWxhYmxlUXVldWVzeyRRdWV1ZUlEfSA9ICRRdWV1ZURhdGF7TmFtZX07CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkVGlja2V0QXBwb2ludG1lbnRze1F1ZXVlSURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgIENsYXNzICAgICAgICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplICcgLiAoICRQYXJhbXtFcnJvcn0tPntRdWV1ZUlESW52YWxpZH0gLy8gJycgKSwKICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVBdmFpbGFibGVRdWV1ZXMsCiAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdRdWV1ZUlEJyAuICRGaWVsZElELAogICAgICAgIFRyZWVWaWV3ICAgICAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgT25DaGFuZ2VTdWJtaXQgICAgID0+IDAsCiAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICBteSAkVGlja2V0QXBwb2ludG1lbnRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZScpIC8vIHt9OwogICAgbXkgQEFwcG9pbnRtZW50VHlwZXM7CiAgICBteSBARHluYW1pY0ZpZWxkVHlwZXM7CgogICAgVFlQRToKICAgIGZvciBteSAkVHlwZUtleSAoIHNvcnQga2V5cyAleyRUaWNrZXRBcHBvaW50bWVudENvbmZpZ30gKSB7CiAgICAgICAgbmV4dCBUWVBFIGlmICEkVGlja2V0QXBwb2ludG1lbnRDb25maWctPnskVHlwZUtleX0tPntLZXl9OwogICAgICAgIG5leHQgVFlQRSBpZiAhJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57TmFtZX07CgogICAgICAgIGlmICggJFR5cGVLZXkgPX4gL0R5bmFtaWNGaWVsZCQvICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiBhbGwgdmFsaWQgZGF0ZSBhbmQgZGF0ZS90aW1lIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9IG5lICdEYXRlJyAmJiAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSBuZSAnRGF0ZVRpbWUnICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZFR5cGVzLCB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gc3ByaW50ZiggJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fSwgICREeW5hbWljRmllbGQtPntOYW1lfSApLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IHNwcmludGYoICRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fS0+e05hbWV9LCAkRHluYW1pY0ZpZWxkLT57TmFtZX0gKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgVFlQRTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQEFwcG9pbnRtZW50VHlwZXMsIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57TmFtZX0sCiAgICAgICAgfTsKICAgIH0KCiAgICBteSBAU3RhcnREYXRlVHlwZXMgPSAoIEBBcHBvaW50bWVudFR5cGVzLCBARHluYW1pY0ZpZWxkVHlwZXMgKTsKICAgICRUaWNrZXRBcHBvaW50bWVudHN7U3RhcnREYXRlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIERhdGEgICAgICAgPT4gXEBTdGFydERhdGVUeXBlcywKICAgICAgICBNdWx0aXBsZSAgID0+IDAsCiAgICAgICAgU2l6ZSAgICAgICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1N0YXJ0RGF0ZScgLiAkRmllbGRJRCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtTdGFydERhdGV9LAogICAgKTsKCiAgICBteSBARW5kUGx1c1R5cGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnKzUgbWludXRlcycpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnUGx1c18xNScsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnKzE1IG1pbnV0ZXMnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1BsdXNfMzAnLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJyszMCBtaW51dGVzJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdQbHVzXzYwJywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCcrMSBob3VyJyksCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgQEVuZERhdGVUeXBlcyA9ICggQEVuZFBsdXNUeXBlcywgQER5bmFtaWNGaWVsZFR5cGVzICk7CiAgICAkVGlja2V0QXBwb2ludG1lbnRze0VuZERhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgRGF0YSAgICAgICA9PiBcQEVuZERhdGVUeXBlcywKICAgICAgICBNdWx0aXBsZSAgID0+IDAsCiAgICAgICAgU2l6ZSAgICAgICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0VuZERhdGUnIC4gJEZpZWxkSUQsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RW5kRGF0ZX0sCiAgICApOwoKICAgIG15ICRTZWFyY2hQYXJhbXNDb25maWcgPQogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbScpIC8vIHt9OwoKICAgICMgVHJhbnNsYXRlIHNlYXJjaCBwYXJhbWV0ZXIgbGFiZWxzIHByaW9yIHRvIHNvcnRpbmcuCiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoIHNvcnQga2V5cyAleyRTZWFyY2hQYXJhbXNDb25maWd9ICkgewogICAgICAgICRTZWFyY2hQYXJhbXNDb25maWctPnskUGFyYW1OYW1lfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgJFNlYXJjaFBhcmFtc0NvbmZpZy0+eyRQYXJhbU5hbWV9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNvcnQgc2VhcmNoIHBhcmFtZXRlciBsaXN0IGJ5IHRyYW5zbGF0ZWQgbGFiZWxzLgogICAgbXkgQFNlYXJjaFBhcmFtczsKICAgIGZvciBteSAkUGFyYW1OYW1lICggc29ydCB7ICRTZWFyY2hQYXJhbXNDb25maWctPnskYX0gY21wICRTZWFyY2hQYXJhbXNDb25maWctPnskYn0gfSBrZXlzICV7JFNlYXJjaFBhcmFtc0NvbmZpZ30gKSB7CiAgICAgICAgcHVzaCBAU2VhcmNoUGFyYW1zLCB7CiAgICAgICAgICAgIEtleSAgICAgID0+ICRQYXJhbU5hbWUsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWFyY2hQYXJhbXNDb25maWctPnskUGFyYW1OYW1lfSwKICAgICAgICAgICAgRGlzYWJsZWQgPT4gJFBhcmFte1NlYXJjaFBhcmFtfS0+eyRQYXJhbU5hbWV9IHx8IDAsCiAgICAgICAgfTsKICAgIH0KCiAgICAkVGlja2V0QXBwb2ludG1lbnRze1NlYXJjaFBhcmFtc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgQ2xhc3MgICAgPT4gJ1NlYXJjaFBhcmFtcyBNb2Rlcm5pemUnLAogICAgICAgIERhdGEgICAgID0+IFxAU2VhcmNoUGFyYW1zLAogICAgICAgIE11bHRpcGxlID0+IDAsCiAgICAgICAgU2l6ZSAgICAgPT4gMCwKICAgICAgICBOYW1lICAgICA9PiAnU2VhcmNoUGFyYW1zJyAuICRGaWVsZElELAogICAgKTsKCiAgICAkVGlja2V0QXBwb2ludG1lbnRze1NlYXJjaFBhcmFtVXNlcn0gPSAkU2VsZi0+X1VzZXJTZWxlY3Rpb25HZXQoKTsKCiAgICByZXR1cm4gJVRpY2tldEFwcG9pbnRtZW50czsKfQoKc3ViIF9HZXRUaWNrZXRBcHBvaW50bWVudFBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG1haW4gb2JqZWN0CiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBjcmVhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFBhcmFtczsKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVQYXJhbSApIHsKICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydERhdGUgRW5kRGF0ZSBRdWV1ZUlEIFNlYXJjaFBhcmFtKSkgewogICAgICAgICAgICBpZiAoICRLZXkgPX4gL14ke0ZpZWxkfV8oW0EtWmEtejAtOV0rKS8gKSB7CiAgICAgICAgICAgICAgICBteSAkUnVsZUlEID0gJDE7CgogICAgICAgICAgICAgICAgIyBpZiBydWxlIGlkIGlzIGludGVnZXIsIGdlbmVyYXRlIHJhbmRvbSBndWlkCiAgICAgICAgICAgICAgICBpZiAoIElzSW50ZWdlcigkUnVsZUlEKSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRQYXJhbXN7JFJ1bGVJRH0tPntSdWxlSUR9ID0gJE1haW5PYmplY3QtPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGggICAgID0+IDMyLAogICAgICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5ID0+IFsgMCAuLiA5LCAnYScgLi4gJ2YnIF0sICAgICMgaGV4YWRlY2ltYWwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCB1c2UgaXQgYXMtaXMKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudFBhcmFtc3skUnVsZUlEfS0+e1J1bGVJRH0gPSAkUnVsZUlEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQgZXEgJ1NlYXJjaFBhcmFtJyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRLZXkgPX4gL15TZWFyY2hQYXJhbV8ke1J1bGVJRH1fKFtBLVphLXpdKykkLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtID0gJDE7CgogICAgICAgICAgICAgICAgICAgICAgICAjIFN0b3JlIHNlYXJjaCBwYXJhbXM6CiAgICAgICAgICAgICAgICAgICAgICAgICMgICAtIGFzIHNjYWxhciwgcGVyIFRpY2tldFNlYXJjaCgpIGRvY3VtZW50YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgIyAgIC0gYXMgYXJyYXkgcmVmLCBtdWx0aXBsZSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgIyAgIC0gYXMgYXJyYXkgcmVmLCBzaW5nbGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJFNlYXJjaFBhcmFtIGVxICRfIH0gQHsgJFNlbGYtPntTZWFyY2hQYXJhbVNjYWxhcn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudFBhcmFtc3skUnVsZUlEfS0+e1NlYXJjaFBhcmFtfS0+eyRTZWFyY2hQYXJhbX0gPSAkUGFyYW17JEtleX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJFBhcmFteyRLZXl9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRQYXJhbXN7JFJ1bGVJRH0tPntTZWFyY2hQYXJhbX0tPnskU2VhcmNoUGFyYW19ID0gJFBhcmFteyRLZXl9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50UGFyYW1zeyRSdWxlSUR9LT57U2VhcmNoUGFyYW19LT57JFNlYXJjaFBhcmFtfSA9IFsgJFBhcmFteyRLZXl9IF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRQYXJhbXN7JFJ1bGVJRH0tPnskRmllbGR9ID0gJFBhcmFteyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgdHJhbnNmb3JtIHRvIGFycmF5CiAgICBteSBAVGlja2V0QXBwb2ludG1lbnREYXRhOwogICAgZm9yIG15ICRSdWxlSUQgKCBzb3J0IGtleXMgJVRpY2tldEFwcG9pbnRtZW50UGFyYW1zICkgewogICAgICAgIHB1c2ggQFRpY2tldEFwcG9pbnRtZW50RGF0YSwgJFRpY2tldEFwcG9pbnRtZW50UGFyYW1zeyRSdWxlSUR9OwogICAgfQoKICAgIHJldHVybiBcQFRpY2tldEFwcG9pbnRtZW50RGF0YTsKfQoKc3ViIF9TaG93VGlja2V0QXBwb2ludG1lbnRQYXJhbXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkUGFyYW1OYW1lICggc29ydCBrZXlzICV7ICRQYXJhbXtTZWFyY2hQYXJhbX0gfSApIHsKICAgICAgICBteSAkUGFyYW1WYWx1ZTsKICAgICAgICBteSAkUGFyYW1TdHJnOwoKICAgICAgICBpZiAoIGdyZXAgeyAkUGFyYW1OYW1lIGVxICRfIH0gQHsgJFNlbGYtPntTZWFyY2hQYXJhbVNjYWxhcn0gfSApIHsKICAgICAgICAgICAgJFBhcmFtVmFsdWUgPSAkUGFyYW17U2VhcmNoUGFyYW19LT57JFBhcmFtTmFtZX07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggcmVmICRQYXJhbXtTZWFyY2hQYXJhbX0tPnskUGFyYW1OYW1lfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAkUGFyYW1WYWx1ZSA9ICRQYXJhbXtTZWFyY2hQYXJhbX0tPnskUGFyYW1OYW1lfS0+WzBdIC8vICcnOwogICAgICAgIH0KCiAgICAgICAgIyBPd25lcklEcyBhbmQgUmVzcG9uc2libGVJRHMgYXJlIG11bHRpcGxlIHNlbGVjdGlvbiB1c2VyIGZpZWxkcy4KICAgICAgICBpZiAoICRQYXJhbU5hbWUgZXEgJ093bmVySURzJyB8fCAkUGFyYW1OYW1lIGVxICdSZXNwb25zaWJsZUlEcycgKSB7CiAgICAgICAgICAgICRQYXJhbVN0cmcgPSAkU2VsZi0+X1VzZXJTZWxlY3Rpb25HZXQoCiAgICAgICAgICAgICAgICBQYXJhbU5hbWUgID0+ICRQYXJhbU5hbWUsCiAgICAgICAgICAgICAgICBQYXJhbVZhbHVlID0+ICRQYXJhbXtTZWFyY2hQYXJhbX0tPnskUGFyYW1OYW1lfSAvLyBbXSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudFJ1bGVTZWFyY2hQYXJhbScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgUGFyYW1OYW1lICA9PiAkUGFyYW1OYW1lLAogICAgICAgICAgICAgICAgUGFyYW1WYWx1ZSA9PiAkUGFyYW1WYWx1ZSwKICAgICAgICAgICAgICAgIFBhcmFtU3RyZyAgPT4gJFBhcmFtU3RyZywKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57T3ZlcnZpZXdTY3JlZW59ID0gJ0NhbGVuZGFyT3ZlcnZpZXcnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGFsbCB1c2VyJ3MgdmFsaWQgY2FsZW5kYXJzCiAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgKTsKCiAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICBteSBAQ2FsZW5kYXJzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckxpc3QoCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICk7CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIEdldCB1c2VyJ3MgcGVybWlzc2lvbnMgdG8gYXNzb2NpYXRlZCBtb2R1bGVzIHdoaWNoIGFyZSBkaXNwbGF5ZWQgYXMgbGlua3MuCiAgICBmb3IgbXkgJE1vZHVsZSAocXcoQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlKSkgewogICAgICAgIG15ICRNb2R1bGVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKQogICAgICAgICAgICAtPnskTW9kdWxlfS0+e0dyb3VwfSAvLyBbXTsKCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1vZHVsZUdyb3VwcykgKSB7CiAgICAgICAgICAgIE1PRFVMRV9HUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRNb2R1bGVHcm91cCAoIEB7JE1vZHVsZUdyb3Vwc30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJE1vZHVsZUdyb3VwXSJ9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtNb2R1bGVQZXJtaXNzaW9uc30tPnskTW9kdWxlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBNT0RVTEVfR1JPVVA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQWx3YXlzIGFsbG93IGxpbmtzIGlmIG5vIGdyb3VwcyBhcmUgc3BlY2lmaWVkLgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9kdWxlUGVybWlzc2lvbnN9LT57JE1vZHVsZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHdlIGZvdW5kIHNvbWUKICAgIGlmIChAQ2FsZW5kYXJzKSB7CgogICAgICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgICAgICMgbmV3IGFwcG9pbnRtZW50IGRpYWxvZwogICAgICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBcHBvaW50bWVudENyZWF0ZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtBcHBvaW50bWVudENyZWF0ZX0gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydCcgKSAgICAgLy8gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgRW5kICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbmQnICkgICAgICAgLy8gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQbHVnaW5LZXknICkgLy8gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWFyY2gnICkgICAgLy8gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPYmplY3RJRCcgKSAgLy8gdW5kZWYsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHNldHRpbmdzIGRpYWxvZwogICAgICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDYWxlbmRhclNldHRpbmdzU2hvdycgKSB7CiAgICAgICAgICAgICRQYXJhbXtDYWxlbmRhclNldHRpbmdzU2hvd30gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBlZGl0IGFwcG9pbnRtZW50IGRpYWxvZwogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17QXBwb2ludG1lbnRJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXBwb2ludG1lbnRJRCcgKSAvLyB1bmRlZjsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyRGl2JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDYWxlbmRhcldpZHRoID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJXaWRnZXQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHVzZXIgcHJlZmVyZW5jZSBrZXkKICAgICAgICBteSAkU2hvd25BcHBvaW50bWVudHNQcmVmS2V5ID0gJ1VzZXInIC4gJFNlbGYtPntPdmVydmlld1NjcmVlbn0gLiAnU2hvd25BcHBvaW50bWVudHMnOwogICAgICAgIG15ICRTaG93bkFwcG9pbnRtZW50c1ByZWZWYWwgPSAkUHJlZmVyZW5jZXN7JFNob3duQXBwb2ludG1lbnRzUHJlZktleX0gfHwgMTsKCiAgICAgICAgIyBzaG93biBhcHBvaW50bWVudHMgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte1Nob3duQXBwb2ludG1lbnRzU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBbGwgYXBwb2ludG1lbnRzJyksCiAgICAgICAgICAgICAgICAyID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2hvd25BcHBvaW50bWVudHMnLAogICAgICAgICAgICBJRCAgICAgICAgICAgPT4gJ1Nob3duQXBwb2ludG1lbnRzJywKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNob3duQXBwb2ludG1lbnRzUHJlZlZhbCwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IG9ubHkgYXNzaWduZWQgYXBwb2ludG1lbnRzIHRvIGN1cnJlbnQgdXNlcgogICAgICAgIGlmICggJFNob3duQXBwb2ludG1lbnRzUHJlZlZhbCA9PSAyICkgewogICAgICAgICAgICAkUGFyYW17UmVzb3VyY2VJRH0gPSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgICAgICAjIGRpc3BsYXkgbm90aWZ5IGxpbmUKICAgICAgICAgICAgJFBhcmFte05vdGlmeUxpbmV9ID0gewogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCdTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJyksCiAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztTdWJhY3Rpb249Q2FsZW5kYXJTZXR0aW5nc1Nob3cnLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbXkgJENhbGVuZGFyTGltaXQgICAgID0gaW50ICRDb25maWdPYmplY3QtPkdldCgnQXBwb2ludG1lbnRDYWxlbmRhcjo6Q2FsZW5kYXJMaW1pdE92ZXJ2aWV3JykgfHwgMTA7CiAgICAgICAgbXkgJENhbGVuZGFyU2VsZWN0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKAogICAgICAgICAgICBEYXRhID0+ICRQcmVmZXJlbmNlc3sgJ1VzZXInIC4gJFNlbGYtPntPdmVydmlld1NjcmVlbn0gLiAnQ2FsZW5kYXJTZWxlY3Rpb24nIH0gfHwgJ1tdJywKICAgICAgICApOwoKICAgICAgICBteSAkQ3VycmVudENhbGVuZGFyID0gMTsKICAgICAgICBmb3IgbXkgJENhbGVuZGFyIChAQ2FsZW5kYXJzKSB7CgogICAgICAgICAgICAjIGNoZWNrIHRoZSBjYWxlbmRhciBpZiBzdG9yZWQgaW4gcHJlZmVyZW5jZXMKICAgICAgICAgICAgaWYgKCBzY2FsYXIgQHskQ2FsZW5kYXJTZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gPT0gJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0gfSBAeyRDYWxlbmRhclNlbGVjdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJENhbGVuZGFyLT57Q2hlY2tlZH0gPSAnY2hlY2tlZD0iY2hlY2tlZCIgJyBpZiAkQ3VycmVudENhbGVuZGFyIDw9ICRDYWxlbmRhckxpbWl0OwogICAgICAgICAgICAgICAgICAgICRDdXJyZW50Q2FsZW5kYXIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBjYWxlbmRhciBieSBkZWZhdWx0IGlmIGxpbWl0IGlzIG5vdCB5ZXQgcmVhY2hlZAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhci0+e0NoZWNrZWR9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiICcgaWYgJEN1cnJlbnRDYWxlbmRhciA8PSAkQ2FsZW5kYXJMaW1pdDsKICAgICAgICAgICAgICAgICRDdXJyZW50Q2FsZW5kYXIrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYWNjZXNzIHRva2VucwogICAgICAgICAgICAkQ2FsZW5kYXItPntBY2Nlc3NUb2tlbn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldEFjY2Vzc1Rva2VuKAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiAgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjYWxlbmRhciBjaGVja2JveCBpbiB0aGUgd2lkZ2V0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJTd2l0Y2gnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQ2FsZW5kYXJ9LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSBiZXN0IHRleHQgY29sb3IKICAgICAgICAgICAgJFBhcmFte1RleHRDb2xvcn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldFRleHRDb2xvcigKICAgICAgICAgICAgICAgIEJhY2tncm91bmQgPT4gJENhbGVuZGFyLT57Q29sb3J9LAogICAgICAgICAgICApIHx8ICcjRkZGRkZGJzsKCiAgICAgICAgICAgICMgY2FsZW5kYXIgc291cmNlIChKU09OKQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyU291cmNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JENhbGVuZGFyfSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyU291cmNlQ29tbWEnLAogICAgICAgICAgICApIGlmICRDdXJyZW50Q2FsZW5kYXIgPD0gc2NhbGFyIEBDYWxlbmRhcnM7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBpbml0aWFsIHZpZXcKICAgICAgICAkUGFyYW17RGVmYXVsdFZpZXd9ID0gJFByZWZlcmVuY2VzeyAnVXNlcicgLiAkU2VsZi0+e092ZXJ2aWV3U2NyZWVufSAuICdEZWZhdWx0VmlldycgfQogICAgICAgICAgICB8fCAndGltZWxpbmVXZWVrJzsKCiAgICAgICAgIyBjaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKCiAgICAgICAgICAgICMgc2hvdyByZXNvdXJjZSBibG9jayBpbiB0b29sdGlwcwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Rvb2x0aXBUZW1wbGF0ZVJlc291cmNlJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBsdWdpbiBsaXN0CiAgICAgICAgJFBhcmFte1BsdWdpbkxpc3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nKS0+UGx1Z2luTGlzdCgpOwoKICAgICAgICAjIGdldCByZWdpc3RlcmVkIHRpY2tldCBhcHBvaW50bWVudCB0eXBlcwogICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFR5cGVzID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0KCk7CgogICAgICAgIG15ICRDdXJyZW50VHlwZSA9IDE7CiAgICAgICAgZm9yIG15ICRUeXBlICggc29ydCBrZXlzICVUaWNrZXRBcHBvaW50bWVudFR5cGVzICkgewogICAgICAgICAgICBteSAkTm9EcmFnID0gMDsKCiAgICAgICAgICAgICMgcHJldmVudCBkcmFnZ2luZyBvZiB0aWNrZXQgZXNjYWxhdGlvbiBhcHBvaW50bWVudHMKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFR5cGUgZXEgJ0ZpcnN0UmVzcG9uc2VUaW1lJwogICAgICAgICAgICAgICAgfHwgJFR5cGUgZXEgJ1VwZGF0ZVRpbWUnCiAgICAgICAgICAgICAgICB8fCAkVHlwZSBlcSAnU29sdXRpb25UaW1lJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkTm9EcmFnID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgY29uZmlndXJlZCB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBtYXJrCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnRNYXJrJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50VHlwZSA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudE1hcmsgPT4gbGMgc3Vic3RyKCAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3skVHlwZX0tPntNYXJrfSwgMCwgMSApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQ3VycmVudFR5cGUgPCBzY2FsYXIga2V5cyAlVGlja2V0QXBwb2ludG1lbnRUeXBlcyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50TWFya0NvbW1hJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IGNvbmZpZ3VyZWQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgZHJhZ2dhYmlsaXR5CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnROb0RyYWcnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRUeXBlID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgIE5vRHJhZyAgICAgICAgICA9PiAkTm9EcmFnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQ3VycmVudFR5cGUgPCBzY2FsYXIga2V5cyAlVGlja2V0QXBwb2ludG1lbnRUeXBlcyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50Tm9EcmFnQ29tbWEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEN1cnJlbnRUeXBlKys7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB3b3JraW5nIGhvdXIgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgQFdvcmtpbmdIb3VycyA9ICRTZWxmLT5fR2V0V29ya2luZ0hvdXJzKCk7CgogICAgICAgIG15ICRDdXJyZW50QXBwb2ludG1lbnQgPSAxOwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBXb3JraW5nSG91cnMpIHsKCiAgICAgICAgICAgICMgc29ydCBkYXlzIG9mIHRoZSB3ZWVrCiAgICAgICAgICAgIG15IEBEb1cgPSBzb3J0IEB7ICRBcHBvaW50bWVudC0+e0RvV30gfTsKCiAgICAgICAgICAgICMgb3V0cHV0IGJsb2NrCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya2luZ0hvdXJzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JEFwcG9pbnRtZW50fSwKICAgICAgICAgICAgICAgICAgICBEb1cgPT4gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSggRGF0YSA9PiBcQERvVyApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JraW5nSG91cnNDb21tYScsCiAgICAgICAgICAgICkgaWYgJEN1cnJlbnRBcHBvaW50bWVudCA8IHNjYWxhciBAV29ya2luZ0hvdXJzOwoKICAgICAgICAgICAgJEN1cnJlbnRBcHBvaW50bWVudCsrOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgbm8gY2FsZW5kYXIgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vQ2FsZW5kYXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdGV4dCBkaXJlY3Rpb24gZnJvbSBsYW5ndWFnZSBvYmplY3QKICAgIG15ICRUZXh0RGlyZWN0aW9uID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+e1RleHREaXJlY3Rpb259IHx8ICcnOwoKICAgICMgb3V0cHV0IHBhZ2UKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgIGlmICggJFBhcmFte05vdGlmeUxpbmV9ICkgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAleyAkUGFyYW17Tm90aWZ5TGluZX0gfSwKICAgICAgICApOwogICAgfQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEVkaXRBY3Rpb24gICAgICAgID0+ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIEVkaXRNYXNrU3ViYWN0aW9uID0+ICdFZGl0TWFzaycsCiAgICAgICAgICAgIFByZWZTdWJhY3Rpb24gICAgID0+ICdVcGRhdGVQcmVmZXJlbmNlcycsCiAgICAgICAgICAgIExpc3RBY3Rpb24gICAgICAgID0+ICdBZ2VudEFwcG9pbnRtZW50TGlzdCcsCiAgICAgICAgICAgIERheXNTdWJhY3Rpb24gICAgID0+ICdBcHBvaW50bWVudERheXMnLAogICAgICAgICAgICBGaXJzdERheSAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0NhbGVuZGFyV2Vla0RheVN0YXJ0JykgfHwgMCwKICAgICAgICAgICAgSXNSVExMYW5ndWFnZSAgICAgPT4gKCAkVGV4dERpcmVjdGlvbiBlcSAncnRsJyApID8gJ3RydWUnIDogJ2ZhbHNlJywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0dldFdvcmtpbmdIb3VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHdvcmtpbmcgaG91cnMgZnJvbSBzeXNjb25maWcKICAgIG15ICRXb3JraW5nSG91cnNDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpbWVXb3JraW5nSG91cnMnKTsKCiAgICAjIGNyZWF0ZSB3b3JraW5nIGhvdXIgYXBwb2ludG1lbnRzIGZvciBlYWNoIGRheQogICAgbXkgQFdvcmtpbmdIb3VyczsKICAgIGZvciBteSAkRGF5TmFtZSAoIHNvcnQga2V5cyAleyRXb3JraW5nSG91cnNDb25maWd9ICkgewoKICAgICAgICAjIGRheSBvZiB0aGUgd2VlawogICAgICAgIG15ICREb1cgPSAwOyAgICAjIFN1bgogICAgICAgIGlmICggJERheU5hbWUgZXEgJ01vbicgKSB7CiAgICAgICAgICAgICREb1cgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXlOYW1lIGVxICdUdWUnICkgewogICAgICAgICAgICAkRG9XID0gMjsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRGF5TmFtZSBlcSAnV2VkJyApIHsKICAgICAgICAgICAgJERvVyA9IDM7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJERheU5hbWUgZXEgJ1RodScgKSB7CiAgICAgICAgICAgICREb1cgPSA0OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXlOYW1lIGVxICdGcmknICkgewogICAgICAgICAgICAkRG9XID0gNTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRGF5TmFtZSBlcSAnU2F0JyApIHsKICAgICAgICAgICAgJERvVyA9IDY7CiAgICAgICAgfQoKICAgICAgICBteSAkU3RhcnRUaW1lID0gMDsKICAgICAgICBteSAkRW5kVGltZSAgID0gMDsKCiAgICAgICAgU1RBUlRfVElNRToKICAgICAgICBmb3IgKCAkU3RhcnRUaW1lID0gMDsgJFN0YXJ0VGltZSA8IDI0OyAkU3RhcnRUaW1lKysgKSB7CgogICAgICAgICAgICAjIGlzIHRoaXMgd29ya2luZyBob3VyPwogICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkU3RhcnRUaW1lIH0gQHsgJFdvcmtpbmdIb3Vyc0NvbmZpZy0+eyREYXlOYW1lfSB9ICkgewoKICAgICAgICAgICAgICAgICMgZ28gdG8gdGhlIGVuZCBvZiB0aGUgd29ya2luZyBob3VycwogICAgICAgICAgICAgICAgZm9yICggbXkgJEVuZEhvdXIgPSAkU3RhcnRUaW1lOyAkRW5kSG91ciA8IDI0OyAkRW5kSG91cisrICkgewogICAgICAgICAgICAgICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAkRW5kSG91ciB9IEB7ICRXb3JraW5nSG91cnNDb25maWctPnskRGF5TmFtZX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgPSAkRW5kSG91cjsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPiAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAV29ya2luZ0hvdXJzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+IHNwcmludGYoICclMDJkOjAwOjAwJywgJFN0YXJ0VGltZSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiBzcHJpbnRmKCAnJTAyZDowMDowMCcsICRFbmRUaW1lICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9XICAgICAgID0+IFskRG9XXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBzb21lIGhvdXJzCiAgICAgICAgICAgICAgICAgICAgICAgICRTdGFydFRpbWUgPSAkRW5kSG91cjsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgU1RBUlRfVElNRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjb2xsYXBzZSBhcHBvaW50bWVudHMgd2l0aCBzYW1lIHN0YXJ0IGFuZCBlbmQgdGltZXMKICAgIGZvciBteSAkQXBwb2ludG1lbnRBIChAV29ya2luZ0hvdXJzKSB7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudEIgKEBXb3JraW5nSG91cnMpIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50QS0+e1N0YXJ0VGltZX0gJiYgJEFwcG9pbnRtZW50Qi0+e1N0YXJ0VGltZX0KICAgICAgICAgICAgICAgICYmICRBcHBvaW50bWVudEEtPntTdGFydFRpbWV9IGVxICRBcHBvaW50bWVudEItPntTdGFydFRpbWV9CiAgICAgICAgICAgICAgICAmJiAkQXBwb2ludG1lbnRBLT57RW5kVGltZX0gZXEgJEFwcG9pbnRtZW50Qi0+e0VuZFRpbWV9CiAgICAgICAgICAgICAgICAmJiAkQXBwb2ludG1lbnRBLT57RG9XfSBuZSAkQXBwb2ludG1lbnRCLT57RG9XfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRBcHBvaW50bWVudEEtPntEb1d9IH0sIEB7ICRBcHBvaW50bWVudEItPntEb1d9IH07CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRCID0gdW5kZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyByZXR1cm4gb25seSBub24tZW1wdHkgYXBwb2ludG1lbnRzCiAgICByZXR1cm4gZ3JlcCB7IHNjYWxhciBrZXlzICV7JF99IH0gQFdvcmtpbmdIb3VyczsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudEVkaXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57RW1wdHlTdHJpbmd9ID0gJy0nOwoKICAgICMgZ2V0IHRpbWUgem9uZSBvZmZzZXQKICAgICRTZWxmLT57VGltZVpvbmV9ICAgID0gJFNlbGYtPntVc2VyVGltZVpvbmV9IHx8IDA7CiAgICAkU2VsZi0+e1RpbWVTZWNEaWZmfSA9ICRTZWxmLT57VGltZVpvbmV9ICogMzYwMDsgICAgICMgNjAgKiA2MAoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgbmFtZXMgb2YgYWxsIHBhcmFtZXRlcnMKICAgIG15IEBQYXJhbU5hbWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBQQVJBTU5BTUU6CiAgICBmb3IgbXkgJEtleSAoQFBhcmFtTmFtZXMpIHsKCiAgICAgICAgIyBza2lwIHRoZSBBY3Rpb24gcGFyYW1ldGVyLCBpdCdzIGdpdmluZyBCdWlsZERhdGVTZWxlY3Rpb24gcHJvYmxlbXMgZm9yIHNvbWUgcmVhc29uCiAgICAgICAgbmV4dCBQQVJBTU5BTUUgaWYgJEtleSBlcSAnQWN0aW9uJzsKCiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICBteSAkUGx1Z2luT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwoKICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSggRGF0YSA9PiBbXSApOwoKICAgIG15ICVQZXJtaXNzaW9uTGV2ZWwgPSAoCiAgICAgICAgJ3JvJyAgICAgICAgPT4gMSwKICAgICAgICAnbW92ZV9pbnRvJyA9PiAyLAogICAgICAgICdjcmVhdGUnICAgID0+IDMsCiAgICAgICAgJ25vdGUnICAgICAgPT4gNCwKICAgICAgICAnb3duZXInICAgICA9PiA1LAogICAgICAgICdwcmlvcml0eScgID0+IDYsCiAgICAgICAgJ3J3JyAgICAgICAgPT4gNywKICAgICk7CgogICAgbXkgJFBlcm1pc3Npb25zID0gJ3J3JzsKCiAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjawogICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZWRpdCBtYXNrCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdE1hc2snICkgewoKICAgICAgICAjIGdldCBhbGwgdXNlcidzIHZhbGlkIGNhbGVuZGFycwogICAgICAgIG15ICRWYWxpZElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgICAgICk7CiAgICAgICAgbXkgQENhbGVuZGFycyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICAgICApOwoKICAgICAgICAjIHRyYW5zZm9ybSBkYXRhIGZvciBzZWxlY3QgYm94CiAgICAgICAgbXkgQENhbGVuZGFyRGF0YSA9IG1hcCB7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkXy0+e0NhbGVuZGFyTmFtZX0sCiAgICAgICAgICAgIH0KICAgICAgICB9IEBDYWxlbmRhcnM7CgogICAgICAgICMgdHJhbnNmb3JtIGRhdGEgZm9yIElEIGxvb2t1cAogICAgICAgIG15ICVDYWxlbmRhckxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57Q2FsZW5kYXJJRH0gPT4gJF8tPntDYWxlbmRhck5hbWV9CiAgICAgICAgfSBAQ2FsZW5kYXJzOwoKICAgICAgICBmb3IgbXkgJENhbGVuZGFyIChAQ2FsZW5kYXJEYXRhKSB7CgogICAgICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICAgICAgICAgIG15ICRDYWxlbmRhclBlcm1pc3Npb24gPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57S2V5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbkxldmVseyRDYWxlbmRhclBlcm1pc3Npb259IDwgMyApIHsKCiAgICAgICAgICAgICAgICAjIHBlcm1pc3Npb25zIDwgY3JlYXRlCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXItPntEaXNhYmxlZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSB5ZWFyIGJvdW5kYXJpZXMKICAgICAgICBteSAoICVZZWFyUGVyaW9kUGFzdCwgJVllYXJQZXJpb2RGdXR1cmUgKTsKICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyAoU3RhcnQgRW5kIFJlY3VycmVuY2VVbnRpbCkpIHsKICAgICAgICAgICAgJFllYXJQZXJpb2RQYXN0eyRGaWVsZH0gPSAkWWVhclBlcmlvZEZ1dHVyZXskRmllbGR9ID0gNTsKICAgICAgICB9CgogICAgICAgICMgZG8gbm90IHVzZSBkYXRlIHNlbGVjdGlvbiB0aW1lIHpvbmUgY2FsY3VsYXRpb24gYnkgZGVmYXVsdAogICAgICAgIG15ICRPdmVycmlkZVRpbWVab25lID0gMTsKCiAgICAgICAgbXkgJUFwcG9pbnRtZW50OwogICAgICAgIGlmICggJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG5vbi1leGlzdGVudCBhcHBvaW50bWVudAogICAgICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXNlIHRpbWUgem9uZSBjYWxjdWxhdGlvbiBpZiBlZGl0aW5nIGV4aXN0aW5nIGFwcG9pbnRtZW50cwogICAgICAgICAgICAjIGJ1dCBvbmx5IGlmIG5vdCBkZWFsaW5nIHdpdGggYW4gYWxsIGRheSBhcHBvaW50bWVudAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRPdmVycmlkZVRpbWVab25lID0gJEFwcG9pbnRtZW50e0FsbERheX0gfHwgMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgICAgICAkUGVybWlzc2lvbnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBzdGFydCB0aW1lIGNvbXBvbmVudHMKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIG15ICRTdGFydFNlY29uZCwgJEFwcG9pbnRtZW50e1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydEhvdXJ9LCAkQXBwb2ludG1lbnR7U3RhcnREYXl9LCAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSwgJEFwcG9pbnRtZW50e1N0YXJ0V2Vla0RheX0KICAgICAgICAgICAgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCggU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lICk7CgogICAgICAgICAgICAjIGdldCBlbmQgdGltZSBjb21wb25lbnRzCiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtFbmRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZW5kIHRpbWVzIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBhcmUgaW5jbHVzaXZlLCBzdWJ0cmFjdCB3aG9sZSBkYXkKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgICRFbmRUaW1lIC09IDg2NDAwOwogICAgICAgICAgICAgICAgaWYgKCAkRW5kVGltZSA8ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgPSAkU3RhcnRUaW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBteSAkRW5kU2Vjb25kLCAkQXBwb2ludG1lbnR7RW5kTWludXRlfSwgJEFwcG9pbnRtZW50e0VuZEhvdXJ9LCAkQXBwb2ludG1lbnR7RW5kRGF5fSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRNb250aH0sICRBcHBvaW50bWVudHtFbmRZZWFyfQogICAgICAgICAgICApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KCBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lICk7CgogICAgICAgICAgICAjIGdldCByZWN1cnJlbmNlIHVudGlsIGNvbXBvbmVudHMKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWwgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbFNlY29uZCwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbE1pbnV0ZX0sICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxIb3VyfSwKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsRGF5fSwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbE1vbnRofSwKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsWWVhcn0KICAgICAgICAgICAgICAgICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoIFN5c3RlbVRpbWUgPT4gJFJlY3VycmVuY2VVbnRpbCApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlY2FsY3VsYXRlIHllYXIgYm91bmRhcmllcwogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoU3RhcnQgRW5kIFJlY3VycmVuY2VVbnRpbCkpIHsKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50eyIke0ZpZWxkfVllYXIifSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkRGlmZiA9ICRBcHBvaW50bWVudHsiJHtGaWVsZH1ZZWFyIn0gLSAkWWVhcjsKICAgICAgICAgICAgICAgICAgICBpZiAoICREaWZmID4gMCAmJiBhYnMgJERpZmYgPiAkWWVhclBlcmlvZEZ1dHVyZXskRmllbGR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkWWVhclBlcmlvZEZ1dHVyZXskRmllbGR9ID0gYWJzICREaWZmOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREaWZmIDwgMCAmJiBhYnMgJERpZmYgPiAkWWVhclBlcmlvZFBhc3R7JEZpZWxkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFllYXJQZXJpb2RQYXN0eyRGaWVsZH0gPSBhYnMgJERpZmY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICkgewogICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VUeXBlID0gJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSB8fCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9OwoKICAgICAgICAgICAgICAgIGlmICggJFJlY3VycmVuY2VUeXBlIGVxICdDdXN0b21XZWVrbHknICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkRGF5T2Zmc2V0ID0gJFNlbGYtPl9EYXlPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtEYXlzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RGF5c30gPSAkR2V0UGFyYW17RGF5c307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSBARGF5cyA9IEB7ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRnJlcXVlbmN5fSB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXNwbGF5IHNlbGVjdGVkIGRheXMgYWNjb3JkaW5nIHRvIHVzZXIgdGltZXpvbmUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCREYXlPZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGF5IChARGF5cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXkgKz0gJERheU9mZnNldDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF5ID09IDggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0RheXN9ID0gam9pbiggIiwiLCBARGF5cyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFJlY3VycmVuY2VUeXBlIGVxICdDdXN0b21Nb250aGx5JyApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJERheU9mZnNldCA9ICRTZWxmLT5fRGF5T2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRBcHBvaW50bWVudHtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17TW9udGhEYXlzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhEYXlzfSA9ICRHZXRQYXJhbXtNb250aERheXN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQE1vbnRoRGF5cyA9IEB7ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRnJlcXVlbmN5fSB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXNwbGF5IHNlbGVjdGVkIGRheXMgYWNjb3JkaW5nIHRvIHVzZXIgdGltZXpvbmUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCREYXlPZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkTW9udGhEYXkgKEBNb250aERheXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTW9udGhEYXkgKz0gJERheU9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTW9udGhEYXkgPSAxIGlmICREYXkgPT0gMzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoRGF5c30gPSBqb2luKCAiLCIsIEBNb250aERheXMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tWWVhcmx5JyApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJERheU9mZnNldCA9ICRTZWxmLT5fRGF5T2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRBcHBvaW50bWVudHtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17TW9udGhzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhzfSA9ICRHZXRQYXJhbXtNb250aHN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQE1vbnRocyA9IEB7ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRnJlcXVlbmN5fSB9OwogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhzfSA9IGpvaW4oICIsIiwgQE1vbnRocyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBpZiBkZWFsaW5nIHdpdGggdGlja2V0IGFwcG9pbnRtZW50LgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VGlja2V0SUR9ID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFRpY2tldElEKAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkUnVsZSA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRSdWxlR2V0KAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBHZXQgZGF0ZSB0eXBlcyBmcm9tIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZS4KICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFJ1bGUpICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVHlwZSAocXcoU3RhcnREYXRlIEVuZERhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSdWxlLT57JFR5cGV9IGVxICdGaXJzdFJlc3BvbnNlVGltZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRSdWxlLT57JFR5cGV9IGVxICdVcGRhdGVUaW1lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFJ1bGUtPnskVHlwZX0gZXEgJ1NvbHV0aW9uVGltZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlYWRPbmx5U3RhcnR9ICAgID0gMSBpZiAkVHlwZSBlcSAnU3RhcnREYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWFkT25seUR1cmF0aW9ufSA9IDEgaWYgJFR5cGUgZXEgJ0VuZERhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFJ1bGUtPnskVHlwZX0gPX4gL15QbHVzX1swLTldKyQvICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlYWRPbmx5RHVyYXRpb259ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VsZWN0ZWQgdGltZXN0YW1wCiAgICAgICAgbXkgJFNlbGVjdGVkVGltZXN0YW1wID0gc3ByaW50ZigKICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDAwOjAwOjAwIiwKICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0gIC8vICRHZXRQYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0gLy8gJEdldFBhcmFte1N0YXJ0TW9udGh9LAogICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnREYXl9ICAgLy8gJEdldFBhcmFte1N0YXJ0RGF5fQogICAgICAgICk7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgZGF5CiAgICAgICAgbXkgJFNlbGVjdGVkU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRTZWxlY3RlZFRpbWVzdGFtcCwKICAgICAgICApOwoKICAgICAgICBteSBARGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGVjdGVkU3lzdGVtVGltZSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB3ZWVrIGRheSBpZiBub3Qgc2V0CiAgICAgICAgaWYgKCAhJEFwcG9pbnRtZW50e0RheXN9ICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnR7RGF5c30gPSAkRGF0ZUluZm9bNl07CiAgICAgICAgfQoKICAgICAgICAjIHNldCBtb250aCBkYXkgaWYgbm90IHNldAogICAgICAgIGlmICggISRBcHBvaW50bWVudHtNb250aERheXN9ICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhEYXlzfSA9ICREYXRlSW5mb1szXTsKICAgICAgICB9CgogICAgICAgICMgc2V0IG1vbnRoIGlmIG5vdCBzZXQKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7TW9udGhzfSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoc30gPSAkRGF0ZUluZm9bNF07CiAgICAgICAgfQoKICAgICAgICAjIGNhbGVuZGFyIElEIHNlbGVjdGlvbgogICAgICAgIG15ICRDYWxlbmRhcklEID0gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9IC8vICRHZXRQYXJhbXtDYWxlbmRhcklEfTsKCiAgICAgICAgIyBjYWxlbmRhciBuYW1lCiAgICAgICAgaWYgKCRDYWxlbmRhcklEKSB7CiAgICAgICAgICAgICRQYXJhbXtDYWxlbmRhck5hbWV9ID0gJENhbGVuZGFyTG9va3VweyRDYWxlbmRhcklEfTsKICAgICAgICB9CgogICAgICAgICMgY2FsZW5kYXIgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte0NhbGVuZGFySURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBDYWxlbmRhckRhdGEsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDYWxlbmRhcklEJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhbGwgZGF5CiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17QWxsRGF5fSB8fAogICAgICAgICAgICAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSAmJiAkQXBwb2ludG1lbnR7QWxsRGF5fSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlTdHJpbmd9ICA9IFRyYW5zbGF0YWJsZSgnWWVzJyk7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlDaGVja2VkfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CgogICAgICAgICAgICAjIHN0YXJ0IGRhdGUKICAgICAgICAgICAgJFBhcmFte1N0YXJ0RGF0ZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIiwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydFllYXJ9ICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydE1vbnRofSAvLyAkR2V0UGFyYW17U3RhcnRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnREYXl9ICAgLy8gJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZW5kIGRhdGUKICAgICAgICAgICAgJFBhcmFte0VuZERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kWWVhcn0gIC8vICRHZXRQYXJhbXtFbmRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRNb250aH0gLy8gJEdldFBhcmFte0VuZE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmREYXl9ICAgLy8gJEdldFBhcmFte0VuZERheX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17QWxsRGF5U3RyaW5nfSAgPSBUcmFuc2xhdGFibGUoJ05vJyk7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlDaGVja2VkfSA9ICcnOwoKICAgICAgICAgICAgIyBzdGFydCBkYXRlCiAgICAgICAgICAgICRQYXJhbXtTdGFydERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0gICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydE1vbnRofSAgLy8gJEdldFBhcmFte1N0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgICAvLyAkR2V0UGFyYW17U3RhcnREYXl9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0SG91cn0gICAvLyAkR2V0UGFyYW17U3RhcnRIb3VyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0gLy8gJEdldFBhcmFte1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZW5kIGRhdGUKICAgICAgICAgICAgJFBhcmFte0VuZERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZFllYXJ9ICAgLy8gJEdldFBhcmFte0VuZFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZE1vbnRofSAgLy8gJEdldFBhcmFte0VuZE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmREYXl9ICAgIC8vICRHZXRQYXJhbXtFbmREYXl9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZEhvdXJ9ICAgLy8gJEdldFBhcmFte0VuZEhvdXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZE1pbnV0ZX0gLy8gJEdldFBhcmFte0VuZE1pbnV0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IGRhdGUgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXJ0RGF0ZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgU3RhcnRIb3VyICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtTdGFydEhvdXJ9IC8vICRHZXRQYXJhbXtTdGFydEhvdXJ9LAogICAgICAgICAgICBTdGFydE1pbnV0ZSAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0TWludXRlfSAvLyAkR2V0UGFyYW17U3RhcnRNaW51dGV9LAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBWYWxpZGF0ZURhdGVCZWZvcmVQcmVmaXggPT4gJ0VuZCcsCiAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgICAgPT4gJFllYXJQZXJpb2RQYXN0e1N0YXJ0fSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgID0+ICRZZWFyUGVyaW9kRnV0dXJle1N0YXJ0fSwKICAgICAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSAgICAgICAgID0+ICRPdmVycmlkZVRpbWVab25lLAogICAgICAgICk7CgogICAgICAgICMgZW5kIGRhdGUgc3RyaW5nCiAgICAgICAgJFBhcmFte0VuZERhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgPT4gJ0VuZCcsCiAgICAgICAgICAgIEVuZEhvdXIgICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtFbmRIb3VyfSAvLyAkR2V0UGFyYW17RW5kSG91cn0sCiAgICAgICAgICAgIEVuZE1pbnV0ZSAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtFbmRNaW51dGV9IC8vICRHZXRQYXJhbXtFbmRNaW51dGV9LAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyUHJlZml4ID0+ICdTdGFydCcsCiAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtFbmR9LAogICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtFbmR9LAogICAgICAgICAgICBPdmVycmlkZVRpbWVab25lICAgICAgICA9PiAkT3ZlcnJpZGVUaW1lWm9uZSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBtYWluIG9iamVjdAogICAgICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAgICAgIyBjaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkCiAgICAgICAgaWYgKCAkTWFpbk9iamVjdC0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsIFNpbGVudCA9PiAxICkgKSB7CgogICAgICAgICAgICBteSAkVGVhbUlEcyA9ICRBcHBvaW50bWVudHtUZWFtSUR9OwogICAgICAgICAgICBpZiAoICEkVGVhbUlEcyApIHsKICAgICAgICAgICAgICAgIG15IEBUZWFtSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1RlYW1JRFtdJyApOwogICAgICAgICAgICAgICAgJFRlYW1JRHMgPSBcQFRlYW1JRHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRSZXNvdXJjZUlEcyA9ICRBcHBvaW50bWVudHtSZXNvdXJjZUlEfTsKICAgICAgICAgICAgaWYgKCAhJFJlc291cmNlSURzICkgewogICAgICAgICAgICAgICAgbXkgQFJlc291cmNlSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Jlc291cmNlSURbXScgKTsKICAgICAgICAgICAgICAgICRSZXNvdXJjZUlEcyA9IFxAUmVzb3VyY2VJRHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CiAgICAgICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgICAgICMgZ2V0IGFsbG93ZWQgdGVhbSBsaXN0IGZvciBjdXJyZW50IHVzZXIKICAgICAgICAgICAgbXkgJVRlYW1MaXN0ID0gJFRlYW1PYmplY3QtPkFsbG93ZWRUZWFtTGlzdCgKICAgICAgICAgICAgICAgIFByZXZlbnRFbXB0eSA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGVhbSBuYW1lcwogICAgICAgICAgICBteSBAVGVhbU5hbWVzOwogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7JFRlYW1JRHN9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAVGVhbU5hbWVzLCAkVGVhbUxpc3R7JFRlYW1JRH0gaWYgJFRlYW1MaXN0eyRUZWFtSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2NhbGFyIEBUZWFtTmFtZXMgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VGVhbU5hbWVzfSA9IGpvaW4oICc8YnI+JywgQFRlYW1OYW1lcyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1RlYW1OYW1lc30gPSAkU2VsZi0+e0VtcHR5U3RyaW5nfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0ZWFtIGxpc3Qgc3RyaW5nCiAgICAgICAgICAgICRQYXJhbXtUZWFtSURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVGVhbUxpc3QsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlYW1JRHMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RlYW1JRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpdGVyYXRlIHRocm91Z2ggc2VsZWN0ZWQgdGVhbXMKICAgICAgICAgICAgbXkgJVRlYW1Vc2VyTGlzdEFsbDsKICAgICAgICAgICAgVEVBTUlEOgogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7JFRlYW1JRHN9ICkgewogICAgICAgICAgICAgICAgbmV4dCBURUFNSUQgaWYgISRUZWFtSUQ7CgogICAgICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiB0ZWFtIG1lbWJlcnMKICAgICAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3QgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFRlYW1JRCA9PiAkVGVhbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVRlYW1Vc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkVGVhbVVzZXJMaXN0eyRVc2VySUR9ID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlVGVhbVVzZXJMaXN0QWxsID0gKCAlVGVhbVVzZXJMaXN0QWxsLCAlVGVhbVVzZXJMaXN0ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVzb3VyY2UgbmFtZXMKICAgICAgICAgICAgbXkgQFJlc291cmNlTmFtZXM7CiAgICAgICAgICAgIGZvciBteSAkUmVzb3VyY2VJRCAoIEB7JFJlc291cmNlSURzfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFJlc291cmNlTmFtZXMsICRUZWFtVXNlckxpc3RBbGx7JFJlc291cmNlSUR9IGlmICRUZWFtVXNlckxpc3RBbGx7JFJlc291cmNlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2NhbGFyIEBSZXNvdXJjZU5hbWVzICkgewogICAgICAgICAgICAgICAgJFBhcmFte1Jlc291cmNlTmFtZXN9ID0gam9pbiggJzxicj4nLCBAUmVzb3VyY2VOYW1lcyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1Jlc291cmNlTmFtZXN9ID0gJFNlbGYtPntFbXB0eVN0cmluZ307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGVhbSB1c2VyIGxpc3Qgc3RyaW5nCiAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZUlEU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVRlYW1Vc2VyTGlzdEFsbCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUmVzb3VyY2VJRHMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1Jlc291cmNlSUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlICAgICAgID0gMDsKICAgICAgICBteSAkU2VsZWN0ZWRSZWN1cnJlbmNlQ3VzdG9tVHlwZSA9ICdDdXN0b21EYWlseSc7ICAgICMgZGVmYXVsdAoKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICkgewoKICAgICAgICAgICAgIyBmcm9tIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlID0gJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSB8fCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9OwogICAgICAgICAgICBpZiAoICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlID1+IC9DdXN0b20vICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZTsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlICAgICAgID0gJ0N1c3RvbSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVjdXJyZW5jZSB0eXBlCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdOZXZlcicpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnRGFpbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBEYXknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1dlZWtseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0V2ZXJ5IFdlZWsnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ01vbnRobHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBNb250aCcpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnWWVhcmx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRXZlcnkgWWVhcicpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlUmVjdXJyZW5jZVR5cGVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBSZWN1cnJlbmNlVHlwZXM7CiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VWYWx1ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICRSZWN1cnJlbmNlVHlwZUxvb2t1cHskU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIHR5cGUgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBSZWN1cnJlbmNlVHlwZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZWN1cnJlbmNlVHlwZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBjdXN0b20gdHlwZQogICAgICAgIG15IEBSZWN1cnJlbmNlQ3VzdG9tVHlwZXMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21EYWlseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0RhaWx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21XZWVrbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdXZWVrbHknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbU1vbnRobHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdNb250aGx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21ZZWFybHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdZZWFybHknKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVSZWN1cnJlbmNlQ3VzdG9tVHlwZUxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQFJlY3VycmVuY2VDdXN0b21UeXBlczsKICAgICAgICBteSAkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAkUmVjdXJyZW5jZUN1c3RvbVR5cGVMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgIGxjICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSwKICAgICAgICApIGlmICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSAmJiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tJzsKCiAgICAgICAgIyByZWN1cnJlbmNlIGN1c3RvbSB0eXBlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcQFJlY3VycmVuY2VDdXN0b21UeXBlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VsZWN0ZWRSZWN1cnJlbmNlQ3VzdG9tVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnUmVjdXJyZW5jZUN1c3RvbVR5cGUnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBpbnRlcnZhbAogICAgICAgIG15ICRTZWxlY3RlZEludGVydmFsID0gJEdldFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0gfHwgMTsKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9ICkgewogICAgICAgICAgICBteSAlUmVjdXJyZW5jZUludGVydmFsTG9va3VwID0gKAogICAgICAgICAgICAgICAgJ0N1c3RvbURhaWx5JyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ2RheShzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbVdlZWtseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd3ZWVrKHMpJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAnQ3VzdG9tTW9udGhseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdtb250aChzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbVllYXJseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd5ZWFyKHMpJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSAmJiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tJyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZXZlcnknKQogICAgICAgICAgICAgICAgICAgIC4gJyAnIC4gJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0gLiAnICcKICAgICAgICAgICAgICAgICAgICAuICRSZWN1cnJlbmNlSW50ZXJ2YWxMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBpbnRlcnZhbCBzZWxlY3Rpb24gKDEtMzEpCiAgICAgICAgbXkgQFJlY3VycmVuY2VDdXN0b21JbnRlcnZhbDsKICAgICAgICBmb3IgKCBteSAkRGF5TnVtYmVyID0gMTsgJERheU51bWJlciA8IDMyOyAkRGF5TnVtYmVyKysgKSB7CiAgICAgICAgICAgIHB1c2ggQFJlY3VycmVuY2VDdXN0b21JbnRlcnZhbCwgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJERheU51bWJlciwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICREYXlOdW1iZXIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWxTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXEBSZWN1cnJlbmNlQ3VzdG9tSW50ZXJ2YWwsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlbGVjdGVkSW50ZXJ2YWwsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY3VycmVuY2VJbnRlcnZhbCcsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIGxpbWl0CiAgICAgICAgbXkgJFJlY3VycmVuY2VMaW1pdCA9IDE7CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUNvdW50fSApIHsKICAgICAgICAgICAgJFJlY3VycmVuY2VMaW1pdCA9IDI7CgogICAgICAgICAgICBpZiAoJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ2ZvciAlcyB0aW1lKHMpJywgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmVuY2UgbGltaXQgc3RyaW5nCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VMaW1pdFN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ3VudGlsIC4uLicpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnZm9yIC4uLiB0aW1lKHMpJyksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlY3VycmVuY2VMaW1pdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZWN1cnJlbmNlTGltaXQnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsRGlmZlRpbWUgPSAwOwogICAgICAgIGlmICggISRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9ICkgewoKICAgICAgICAgICAgIyBnZXQgY3VycmVudCBhbmQgc3RhcnQgdGltZSBmb3IgZGlmZmVyZW5jZQogICAgICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFllYXIgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSAgIC8vICRHZXRQYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAgICAgTW9udGggID0+ICRBcHBvaW50bWVudHtTdGFydE1vbnRofSAgLy8gJEdldFBhcmFte1N0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgID0+ICRBcHBvaW50bWVudHtTdGFydERheX0gICAgLy8gJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgIEhvdXIgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRIb3VyfSAgIC8vICRHZXRQYXJhbXtTdGFydEhvdXJ9LAogICAgICAgICAgICAgICAgTWludXRlID0+ICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0gLy8gJEdldFBhcmFte1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUmVjdXJyZW5jZVVudGlsRGlmZlRpbWUgPSAkU3RhcnRUaW1lIC0gJFN5c3RlbVRpbWUgKyA2MCAqIDYwICogMjQgKiAzOyAgICAjIHN0YXJ0ICszIGRheXMKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsWWVhcn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsTW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbERheX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ3VudGlsICVzJywgJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmVuY2UgdW50aWwgZGF0ZSBzdHJpbmcKICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgID0+ICdSZWN1cnJlbmNlVW50aWwnLAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICAgICAgRGlmZlRpbWUgICAgICAgICAgICAgICAgPT4gJFJlY3VycmVuY2VVbnRpbERpZmZUaW1lLAogICAgICAgICAgICBWYWxpZGF0ZURhdGVBZnRlclByZWZpeCA9PiAnU3RhcnQnLAogICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgICA9PiAkWWVhclBlcmlvZFBhc3R7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgPT4gJFllYXJQZXJpb2RGdXR1cmV7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSAgICAgICAgPT4gJE92ZXJyaWRlVGltZVpvbmUsCiAgICAgICAgKTsKCiAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUKICAgICAgICBteSBATm90aWZpY2F0aW9uVGVtcGxhdGVzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05vIG5vdGlmaWNhdGlvbicpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnU3RhcnQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDAgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzMwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgNSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnOTAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCAxNSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnMTgwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgMzAgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzM2MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgaG91cihzKSBiZWZvcmUnLCAxICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICc3MjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMiApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnNDMyMDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgaG91cihzKSBiZWZvcmUnLCAxMiApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnODY0MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgZGF5KHMpIGJlZm9yZScsIDEgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzE3MjgwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBkYXkocykgYmVmb3JlJywgMiApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnNjA0ODAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIHdlZWsgYmVmb3JlJywgMSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3VzdG9tJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlTm90aWZpY2F0aW9uVGVtcGxhdGVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBOb3RpZmljYXRpb25UZW1wbGF0ZXM7CiAgICAgICAgbXkgJFNlbGVjdGVkTm90aWZpY2F0aW9uVGVtcGxhdGUgPSAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uVGVtcGxhdGV9IHx8ICcwJzsKICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uVmFsdWV9ID0gJE5vdGlmaWNhdGlvblRlbXBsYXRlTG9va3VweyRTZWxlY3RlZE5vdGlmaWNhdGlvblRlbXBsYXRlfTsKCiAgICAgICAgIyBub3RpZmljYXRpb24gc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQE5vdGlmaWNhdGlvblRlbXBsYXRlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZE5vdGlmaWNhdGlvblRlbXBsYXRlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05vdGlmaWNhdGlvblRlbXBsYXRlJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBub3RpZmljYXRpb24gY3VzdG9tIHVuaXRzCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ21pbnV0ZShzKScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnaG91cnMnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdob3VyKHMpJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdkYXlzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZGF5KHMpJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlTm90aWZpY2F0aW9uQ3VzdG9tVW5pdExvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzOwogICAgICAgIG15ICRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXQgPSAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fSB8fCAnbWludXRlcyc7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cyBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBOb3RpZmljYXRpb25DdXN0b21Vbml0cywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0JywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBub3RpZmljYXRpb24gY3VzdG9tIHVuaXRzIHBvaW50IG9mIHRpbWUKICAgICAgICBteSBATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNQb2ludE9mVGltZSA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCcpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCcpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZUxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWU7CiAgICAgICAgbXkgJFNlbGVjdGVkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lID0gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9CiAgICAgICAgICAgIHx8ICdiZWZvcmVzdGFydCc7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cyBwb2ludCBvZiB0aW1lIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21Vbml0c1BvaW50T2ZUaW1lU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNQb2ludE9mVGltZSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkYXRlIHVuaXRzIGZvciB0aGUgY3VzdG9tIGRhdGUgc2VsZWN0aW9uCiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApOwogICAgICAgIGlmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApIHsKCiAgICAgICAgICAgICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSBkYXRlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXIgICA9PiAkWWVhciwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheSAgICA9PiAkRGF5LAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXIgICA9PiAkSG91ciwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNaW51dGUgPT4gJE1pbnV0ZSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgICAgICAgICAgICA9PiAkWWVhclBlcmlvZFBhc3R7U3RhcnR9LAogICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICAgICAgICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtTdGFydH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIHJhZGlvIGJ1dHRvbiBmb3IgY3VzdG9tIGRhdGUgdGltZSBhbmQgcmVsYXRpdmUgaW5wdXQKICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tfSB8fD0gJyc7CgogICAgICAgIGlmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKICAgICAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXRSYWRpb30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSBzdHJpbmcgdmFsdWUKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdkYXRldGltZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25WYWx1ZX0gLj0gJywgJyAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ3JlbGF0aXZlJyApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0KICAgICAgICAgICAgICAgICYmICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IHx8PSAwOwogICAgICAgICAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblZhbHVlfSAuPSAnLCAnCiAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9CiAgICAgICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgICAgICAuICROb3RpZmljYXRpb25DdXN0b21Vbml0TG9va3VweyRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXR9CiAgICAgICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgICAgICAuICROb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWVMb29rdXB7JFNlbGVjdGVkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGx1Z2luIGxpc3QKICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0gPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaXN0KCk7CgogICAgICAgICMgbmV3IGFwcG9pbnRtZW50IHBsdWdpbiBzZWFyY2gKICAgICAgICBpZiAoICRHZXRQYXJhbXtQbHVnaW5LZXl9ICYmICggJEdldFBhcmFte1NlYXJjaH0gfHwgJEdldFBhcmFte09iamVjdElEfSApICkgewoKICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJEdldFBhcmFte1BsdWdpbktleX0gfSBrZXlzICV7ICRQYXJhbXtQbHVnaW5MaXN0fSB9ICkgewoKICAgICAgICAgICAgICAgICMgc2VhcmNoIHVzaW5nIHBsdWdpbgogICAgICAgICAgICAgICAgbXkgJFJlc3VsdExpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5TZWFyY2goCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJhbXtQbHVnaW5EYXRhfS0+eyAkR2V0UGFyYW17UGx1Z2luS2V5fSB9ID0gW107CiAgICAgICAgICAgICAgICBteSBATGlua0FycmF5ID0gc29ydCBrZXlzICV7JFJlc3VsdExpc3R9OwoKICAgICAgICAgICAgICAgICMgYWRkIHBvc3NpYmxlIGxpbmtzCiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoQExpbmtBcnJheSkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1BsdWdpbkRhdGF9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0gfSwgewogICAgICAgICAgICAgICAgICAgICAgICBMaW5rSUQgICA9PiAkTGlua0lELAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rTmFtZSA9PiAkUmVzdWx0TGlzdC0+eyRMaW5rSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rVVJMICA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkxpc3R9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0tPntQbHVnaW5VUkx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtJRAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkxpc3R9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0tPntMaW5rTGlzdH0gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXEBMaW5rQXJyYXksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYXBwb2ludG1lbnQgcGx1Z2luIGxpbmtzCiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAleyAkUGFyYW17UGx1Z2luTGlzdH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICRMaW5rTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtMaXN0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSBATGlua0FycmF5OwoKICAgICAgICAgICAgICAgICRQYXJhbXtQbHVnaW5EYXRhfS0+eyRQbHVnaW5LZXl9ID0gW107CiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17UGx1Z2luRGF0YX0tPnskUGx1Z2luS2V5fSB9LCAkTGlua0xpc3QtPnskTGlua0lEfTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBMaW5rQXJyYXksICRMaW5rTGlzdC0+eyRMaW5rSUR9LT57TGlua0lEfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0tPnskUGx1Z2luS2V5fS0+e0xpbmtMaXN0fSA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQExpbmtBcnJheSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaHRtbCBtYXNrIG91dHB1dAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFZGl0TWFzaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgUGVybWlzc2lvbkxldmVsID0+ICRQZXJtaXNzaW9uTGV2ZWx7JFBlcm1pc3Npb25zfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCByZWdpc3RlcmVkIGxvY2F0aW9uIGxpbmtzCiAgICAgICAgbXkgJExvY2F0aW9uTGlua0NvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRBcHBvaW50bWVudEVkaXQ6OkxvY2F0aW9uOjpMaW5rJykgLy8ge307CiAgICAgICAgZm9yIG15ICRDb25maWdLZXkgKCBzb3J0IGtleXMgJXskTG9jYXRpb25MaW5rQ29uZmlnfSApIHsKCiAgICAgICAgICAgICMgc2hvdyBsaW5rIGljb24KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb2NhdGlvbkxpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gPT4gJEFwcG9pbnRtZW50e0xvY2F0aW9ufSAvLyAnJywKICAgICAgICAgICAgICAgICAgICAleyAkTG9jYXRpb25MaW5rQ29uZmlnLT57JENvbmZpZ0tleX0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRhdGVwaWNrZXIgaW5pdGlhbGl6YXRpb24KICAgICAgICAjIG9ubHkgaWYgdXNlciBoYXMgcGVybWlzc2lvbnMgbW92ZV9pbnRvIGFuZCBhYm92ZQogICAgICAgIGlmICggJFBlcm1pc3Npb25zICYmICggJFBlcm1pc3Npb25MZXZlbHskUGVybWlzc2lvbnN9IDwgMiApID8gMCA6IDEgKSB7CgogICAgICAgICAgICAjIGdldCB0ZXh0IGRpcmVjdGlvbgogICAgICAgICAgICBteSAkVGV4dERpcmVjdGlvbiA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPntUZXh0RGlyZWN0aW9ufSB8fCAnJzsKCiAgICAgICAgICAgICMgZ2V0IHZhY2F0aW9uIGRheXMKICAgICAgICAgICAgbXkgJFZhY2F0aW9uRGF5c0pTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKCksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBmaXJzdCBkYXkgb2YgdGhlIHdlZWsKICAgICAgICAgICAgbXkgJFdlZWtEYXlTdGFydCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCAxOwoKICAgICAgICAgICAgIyBzb21lIGdlbmVyYWwgZGF0ZXBpY2tlciBjb2RlCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF0ZXBpY2tlckRhdGEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFjYXRpb25EYXlzICA9PiAkVmFjYXRpb25EYXlzSlNPTiwKICAgICAgICAgICAgICAgICAgICBJc1JUTExhbmd1YWdlID0+ICggJFRleHREaXJlY3Rpb24gZXEgJ3J0bCcgKSA/IDEgOiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaW5pdGlhbGl6ZSBkYXRlcGlja2VycyBmb3IgZGlmZmVyZW50IGRhdGUgZmllbGRzCiAgICAgICAgICAgIGZvciBteSAkUHJlZml4IChxdyhTdGFydCBFbmQgUmVjdXJyZW5jZVVudGlsIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lKSkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF0ZXBpY2tlckluaXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmVmaXggICAgICAgPT4gJFByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgV2Vla0RheVN0YXJ0ID0+ICRXZWVrRGF5U3RhcnQsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0LAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkL2VkaXQgYXBwb2ludG1lbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdFZGl0QXBwb2ludG1lbnQnICkgewogICAgICAgIG15ICVBcHBvaW50bWVudDsKICAgICAgICBpZiAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgICAgICAkUGVybWlzc2lvbnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkUmVxdWlyZWRQZXJtaXNzaW9uID0gMjsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gJiYgJEdldFBhcmFte0NhbGVuZGFySUR9ICE9ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSApIHsKCiAgICAgICAgICAgICAgICAjIGluIG9yZGVyIHRvIG1vdmUgYXBwb2ludG1lbnQgdG8gYW5vdGhlciBjYWxlbmRhciwgdXNlciBuZWVkcyAiY3JlYXRlIiBwZXJtaXNzaW9uCiAgICAgICAgICAgICAgICAkUmVxdWlyZWRQZXJtaXNzaW9uID0gMzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbkxldmVseyRQZXJtaXNzaW9uc30gPCAkUmVxdWlyZWRQZXJtaXNzaW9uICkgewoKICAgICAgICAgICAgICAgICMgbm8gcGVybWlzc2lvbgoKICAgICAgICAgICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAgID0+IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QWxsRGF5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0VGltZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDAwOjAwOjAwIiwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFllYXJ9LCAkR2V0UGFyYW17U3RhcnRNb250aH0sICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kWWVhcn0sICRHZXRQYXJhbXtFbmRNb250aH0sICRHZXRQYXJhbXtFbmREYXl9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHByZXZlbnQgc3RvcmluZyBlbmQgdGltZSBiZWZvcmUgc3RhcnQgdGltZQogICAgICAgICAgICBpZiAoICRFbmRUaW1lIDwgJFN0YXJ0VGltZSApIHsKICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBtYWtlIGVuZCB0aW1lIGluY2x1c2l2ZSwgYWRkIHdob2xlIGRheQogICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUgKyA4NjQwMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17UmVjdXJyaW5nfSAmJiAkR2V0UGFyYW17VXBkYXRlVHlwZX0gJiYgJEdldFBhcmFte1VwZGF0ZURlbHRhfSApIHsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtFbmRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIG5ldyBzdGFydC9lbmQgdGltZXMKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VXBkYXRlVHlwZX0gZXEgJ1N0YXJ0VGltZScgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSArICRHZXRQYXJhbXtVcGRhdGVEZWx0YX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1VwZGF0ZVR5cGV9IGVxICdFbmRUaW1lJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUgKyAkR2V0UGFyYW17VXBkYXRlRGVsdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lICsgJEdldFBhcmFte1VwZGF0ZURlbHRhfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lICsgJEdldFBhcmFte1VwZGF0ZURlbHRhfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0WWVhcn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TW9udGh9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0SG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0WWVhcn0sICRHZXRQYXJhbXtTdGFydE1vbnRofSwgJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRIb3VyfSwgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIENvbnZlcnQgc3RhcnQgdGltZSB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0YXJ0VGltZSAtPSAkU2VsZi0+e1RpbWVTZWNEaWZmfTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFte0VuZFllYXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtFbmRNb250aH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZERheX0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZEhvdXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtFbmRNaW51dGV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFllYXJ9LCAkR2V0UGFyYW17RW5kTW9udGh9LCAkR2V0UGFyYW17RW5kRGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kSG91cn0sICRHZXRQYXJhbXtFbmRNaW51dGV9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgQ29udmVydCBlbmQgdGltZSB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRW5kVGltZSAtPSAkU2VsZi0+e1RpbWVTZWNEaWZmfTsKCiAgICAgICAgICAgICAgICAjIFByZXZlbnQgc3RvcmluZyBlbmQgdGltZSBiZWZvcmUgc3RhcnQgdGltZS4KICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPCAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRBcHBvaW50bWVudHtFbmRUaW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwcmV2ZW50IHJlY3VycmVuY2UgdW50aWwgZGF0ZXMgYmVmb3JlIHN0YXJ0IHRpbWUKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICYmICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9ICkgewogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlVW50aWwgPCAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gPSAkR2V0UGFyYW17U3RhcnRUaW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICBpZiAoICRHZXRQYXJhbXtSZWN1cnJpbmd9ICYmICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gKSB7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdEYWlseScKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ1dlZWtseScKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ01vbnRobHknCiAgICAgICAgICAgICAgICB8fCAkR2V0UGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdZZWFybHknCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbScgKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVjdXJyZW5jZUN1c3RvbVR5cGV9IGVxICdDdXN0b21XZWVrbHknICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0RheXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSBARGF5cyA9IHNwbGl0KCAiLCIsICRHZXRQYXJhbXtEYXlzfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQERheXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gWyAkRGF0ZUluZm9bNl0gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte01vbnRoRGF5c30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aERheXMgPSBzcGxpdCggIiwiLCAkR2V0UGFyYW17TW9udGhEYXlzfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQE1vbnRoRGF5czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBteSBARGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBbICREYXRlSW5mb1szXSBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1JlY3VycmVuY2VDdXN0b21UeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtNb250aHN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSBATW9udGhzID0gc3BsaXQoICIsIiwgJEdldFBhcmFte01vbnRoc30gKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gXEBNb250aHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gWyAkRGF0ZUluZm9bNF0gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdW50aWwgLi4uCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlTGltaXR9IGVxICcxJwogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbFllYXJ9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsTW9udGh9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsRGF5fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDAwOjAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsWWVhcn0sICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWxNb250aH0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbERheX0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBwcmV2ZW50IHJlY3VycmVuY2UgdW50aWwgZGF0ZXMgYmVmb3JlIHN0YXJ0IHRpbWUKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWwgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFJlY3VycmVuY2VVbnRpbCA8ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSAkR2V0UGFyYW17U3RhcnRUaW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUNvdW50fSA9IHVuZGVmOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvciAuLi4gdGltZShzKQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlTGltaXR9IGVxICcyJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ID0gdW5kZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgRGV0ZXJtaW5lIG5vdGlmaWNhdGlvbiBjdXN0b20gdHlwZSwgaWYgc3VwcGxpZWQuCiAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05vdGlmaWNhdGlvblRlbXBsYXRlfSBuZSAnQ3VzdG9tJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSA9ICdyZWxhdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGh9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheX0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgQ29udmVydCB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lIC09ICRTZWxmLT57VGltZVNlY0RpZmZ9OwoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdGVhbQogICAgICAgIGlmICggJEdldFBhcmFteydUZWFtSURbXSd9ICkgewogICAgICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1RlYW1JRH0gPSBcQFRlYW1JRHM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17VGVhbUlEfSA9IHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgIyByZXNvdXJjZXMKICAgICAgICBpZiAoICRHZXRQYXJhbXsnUmVzb3VyY2VJRFtdJ30gKSB7CiAgICAgICAgICAgIG15IEBSZXNvdXJjZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Jlc291cmNlSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gXEBSZXNvdXJjZUlEOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gdW5kZWY7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGlmIGRlYWxpbmcgd2l0aCB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICkgewoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgcmVhZG9ubHkgdmFsdWVzIHN0YXkgdW5jaGFuZ2VkLgogICAgICAgICAgICAkR2V0UGFyYW17VGl0bGV9ICAgICAgPSAkQXBwb2ludG1lbnR7VGl0bGV9OwogICAgICAgICAgICAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gPSAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtBbGxEYXl9ICAgICA9IHVuZGVmOwogICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyaW5nfSAgPSB1bmRlZjsKCiAgICAgICAgICAgIG15ICRSdWxlID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFJ1bGVHZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgUmVjYWxjdWxhdGUgZW5kIHRpbWUgYmFzZWQgb24gdGltZSBwcmVzZXQuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFJ1bGUpICkgewogICAgICAgICAgICAgICAgaWYgKCAkUnVsZS0+e0VuZERhdGV9ID1+IC9eUGx1c18oWzAtOV0rKSQvICYmICRHZXRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRQcmVzZXQgPSBpbnQgJDE7CgogICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIENhbGN1bGF0ZSBlbmQgdGltZSB1c2luZyBwcmVzZXQgdmFsdWUuCiAgICAgICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkU3RhcnRUaW1lICsgNjAgKiAkUHJlc2V0OwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRTdWNjZXNzOwoKICAgICAgICAjIHJlc2V0IGVtcHR5IHBhcmFtZXRlcnMKICAgICAgICBmb3IgbXkgJFBhcmFtICggc29ydCBrZXlzICVHZXRQYXJhbSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyRQYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHBhc3MgY3VycmVudCB1c2VyIElECiAgICAgICAgJEdldFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgICMgR2V0IHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVycy4KICAgICAgICBteSBAUGx1Z2luUGFyYW1zID0gZ3JlcCB7ICRfID1+IC9eUGx1Z2luXy8gfSBrZXlzICVHZXRQYXJhbTsKCiAgICAgICAgaWYgKCVBcHBvaW50bWVudCkgewoKICAgICAgICAgICAgIyBDb250aW51ZSBvbmx5IGlmIGNvbWluZyBmcm9tIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICMgICAodGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVyKS4KICAgICAgICAgICAgaWYgKEBQbHVnaW5QYXJhbXMpIHsKCiAgICAgICAgICAgICAgICAjIEdldCBhbGwgcmVsYXRlZCBhcHBvaW50bWVudHMgYmVmb3JlIHRoZSB1cGRhdGUuCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICRfLT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JlcCB7CiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkXy0+e1BhcmVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkXy0+e1BhcmVudElEfSBlcSAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9IEBDYWxlbmRhckFwcG9pbnRtZW50czsKCiAgICAgICAgICAgICAgICAjIFJlbW92ZSBhbGwgZXhpc3RpbmcgbGlua3MuCiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTGlua3MgY291bGQgbm90IGJlIGRlbGV0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gPyAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gOiAkU3VjY2VzczsKCiAgICAgICAgaWYgKCRBcHBvaW50bWVudElEKSB7CgogICAgICAgICAgICAjIENvbnRpbnVlIG9ubHkgaWYgY29taW5nIGZyb20gZWRpdCBzY3JlZW4KICAgICAgICAgICAgIyAgICh0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcGFzc2VkIHBsdWdpbiBwYXJhbWV0ZXIpLgogICAgICAgICAgICBpZiAoQFBsdWdpblBhcmFtcykgewoKICAgICAgICAgICAgICAgICMgR2V0IGZyZXNoIGFwcG9pbnRtZW50IGRhdGEuCiAgICAgICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUHJvY2VzcyBhbGwgcmVsYXRlZCBhcHBvaW50bWVudHMuCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoJEFwcG9pbnRtZW50SUQpOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzIGFzIHdlbGwuCiAgICAgICAgICAgICAgICBwdXNoIEBSZWxhdGVkQXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgJF8tPntBcHBvaW50bWVudElEfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBncmVwIHsKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRfLT57UGFyZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRfLT57UGFyZW50SUR9IGVxICRBcHBvaW50bWVudElECiAgICAgICAgICAgICAgICAgICAgfSBAQ2FsZW5kYXJBcHBvaW50bWVudHM7CgogICAgICAgICAgICAgICAgIyBQcm9jZXNzIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVycy4KICAgICAgICAgICAgICAgIGZvciBteSAkUGx1Z2luUGFyYW0gKEBQbHVnaW5QYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkUGx1Z2luRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkR2V0UGFyYW17JFBsdWdpblBhcmFtfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRQbHVnaW5LZXkgPSAkUGx1Z2luUGFyYW07CiAgICAgICAgICAgICAgICAgICAgJFBsdWdpbktleSA9fiBzL15QbHVnaW5fLy87CgogICAgICAgICAgICAgICAgICAgICMgRXhlY3V0ZSBsaW5rIGFkZCBtZXRob2Qgb2YgdGhlIHBsdWdpbi4KICAgICAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkUGx1Z2luRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggQHskUGx1Z2luRGF0YX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAkTGlua0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkTGluayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzID8gMSA6IDAsCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgbWFzawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZUFwcG9pbnRtZW50JyApIHsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gMDsKICAgICAgICAgICAgbXkgJEVycm9yICAgPSAnJzsKCiAgICAgICAgICAgICMgUHJldmVudCBkZWxldGluZyB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvciA9IFRyYW5zbGF0YWJsZSgnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBHZXQgYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzIGJlZm9yZSB0aGUgZGVsZXRpb24uCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICRfLT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JlcCB7CiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkXy0+e1BhcmVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkXy0+e1BhcmVudElEfSBlcSAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9IEBDYWxlbmRhckFwcG9pbnRtZW50czsKCiAgICAgICAgICAgICAgICAjIFJlbW92ZSBhbGwgZXhpc3RpbmcgbGlua3MuCiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTGlua3MgY291bGQgbm90IGJlIGRlbGV0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvciA9IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbnMhJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgID0+ICRFcnJvciwKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBkYXRlUHJlZmVyZW5jZXMnICkgewoKICAgICAgICBteSAkU3VjY2VzcyA9IDA7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte092ZXJ2aWV3U2NyZWVufSAmJiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RGVmYXVsdFZpZXd9IHx8ICRHZXRQYXJhbXtDYWxlbmRhclNlbGVjdGlvbn0KICAgICAgICAgICAgICAgIHx8ICggJEdldFBhcmFte1Nob3duUmVzb3VyY2VzfSAmJiAkR2V0UGFyYW17VGVhbUlEfSApCiAgICAgICAgICAgICAgICB8fCAkR2V0UGFyYW17U2hvd25BcHBvaW50bWVudHN9CiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VLZXk7CiAgICAgICAgICAgIG15ICRQcmVmZXJlbmNlS2V5U3VmZml4ID0gJyc7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEZWZhdWx0Vmlld30gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdEZWZhdWx0Vmlldyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17Q2FsZW5kYXJTZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXkgPSAnQ2FsZW5kYXJTZWxlY3Rpb24nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1Nob3duUmVzb3VyY2VzfSAmJiAkR2V0UGFyYW17VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ICAgICAgID0gJ1Nob3duUmVzb3VyY2VzJzsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5U3VmZml4ID0gIi0kR2V0UGFyYW17VGVhbUlEfSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17U2hvd25BcHBvaW50bWVudHN9ICkgewogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXkgPSAnU2hvd25BcHBvaW50bWVudHMnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXInIC4gJEdldFBhcmFte092ZXJ2aWV3U2NyZWVufSAuICRQcmVmZXJlbmNlS2V5IC4gJFByZWZlcmVuY2VLZXlTdWZmaXgsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJEdldFBhcmFteyRQcmVmZXJlbmNlS2V5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtPdmVydmlld1NjcmVlbn0gJiYgJEdldFBhcmFte1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3N9ICkgewogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleTsKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3N9IGVxICdTaG93blJlc291cmNlcycgJiYgJEdldFBhcmFte1RlYW1JRH0gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSAgICAgICA9ICdTaG93blJlc291cmNlcyc7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleVN1ZmZpeCA9ICItJEdldFBhcmFte1RlYW1JRH0iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJsYW5rIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlcicgLiAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59IC4gJFByZWZlcmVuY2VLZXkgLiAkUHJlZmVyZW5jZUtleVN1ZmZpeCwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlYW0gbGlzdCBzZWxlY3Rpb24gdXBkYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVhbVVzZXJMaXN0JyApIHsKICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICBteSAlVGVhbVVzZXJMaXN0QWxsOwoKICAgICAgICAjIENoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQuCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAgICAgbXkgJFRlYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nKTsKICAgICAgICAgICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICAgICAgVEVBTUlEOgogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoQFRlYW1JRHMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVBTUlEIGlmICEkVGVhbUlEOwoKICAgICAgICAgICAgICAgICMgZ2V0IGxpc3Qgb2YgdGVhbSBtZW1iZXJzCiAgICAgICAgICAgICAgICBteSAlVGVhbVVzZXJMaXN0ID0gJFRlYW1PYmplY3QtPlRlYW1Vc2VyTGlzdCgKICAgICAgICAgICAgICAgICAgICBUZWFtSUQgPT4gJFRlYW1JRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVUZWFtVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFRlYW1Vc2VyTGlzdHskVXNlcklEfSA9ICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJVRlYW1Vc2VyTGlzdEFsbCA9ICggJVRlYW1Vc2VyTGlzdEFsbCwgJVRlYW1Vc2VyTGlzdCApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlYW1Vc2VyTGlzdCA9PiBcJVRlYW1Vc2VyTGlzdEFsbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKc3ViIF9EYXlPZmZzZXRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGNvbnZlcnQgdGltZXN0YW1wIHRvIHVuaXggdGltZQogICAgbXkgJE9yaWdpbmFsVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1RpbWV9LAogICAgKTsKCiAgICAjIGdldCBvcmlnaW5hbCBkYXRlIGluZm8KICAgIG15IEBPcmlnaW5hbERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgIFN5c3RlbVRpbWUgPT4gJE9yaWdpbmFsVGltZVN5c3RlbSwKICAgICk7CgogICAgIyBjYWxjdWxhdGUgZGVzdGluYXRpb24gdGltZSAoYWNjb3JkaW5nIHRvIHVzZXIgdGltZXpvbmUpCiAgICBteSAkRGVzdGluYXRpb25UaW1lU3lzdGVtID0gJE9yaWdpbmFsVGltZVN5c3RlbSArICRTZWxmLT57VGltZVNlY0RpZmZ9OwoKICAgICMgZ2V0IGRlc3RpbmF0aW9uIGRhdGUgaW5mbwogICAgbXkgQERlc3RpbmF0aW9uRGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkRGVzdGluYXRpb25UaW1lU3lzdGVtLAogICAgKTsKCiAgICAjIGNvbXBhcmUgZGF5cyAtIGFycmF5cyBjb250YWlucyBmb2xsb3dpbmcgdmFsdWVzOiBTZWNvbmQsIE1pbnV0ZSwgSG91ciwgRGF5LCBNb250aCwgWWVhciBhbmQgRGF5T2ZXZWVrCiAgICBpZiAoICRPcmlnaW5hbERhdGVJbmZvWzNdID09ICREZXN0aW5hdGlvbkRhdGVJbmZvWzNdICkgewoKICAgICAgICAjIHNhbWUgZGF5CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBlbHNpZiAoICRPcmlnaW5hbFRpbWVTeXN0ZW0gPiAkRGVzdGluYXRpb25UaW1lU3lzdGVtICkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudEltcG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0ltcG9ydCcgKSB7CgogICAgICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAgICAgbXkgJEZvcm1JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICkgfHwgJyc7CgogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCkgaWYgISRGb3JtSUQ7CgogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSA9PiAiRmlsZVVwbG9hZCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAgICAgbXkgJFVwZGF0ZUV4aXN0aW5nID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VwZGF0ZUV4aXN0aW5nQXBwb2ludG1lbnRzJyApIHx8ICcnOwogICAgICAgIG15ICRDYWxlbmRhcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhbGVuZGFySUQnICkgfHwgJyc7CgogICAgICAgIG15ICVFcnJvcnM7CgogICAgICAgIGlmICggISRDYWxlbmRhcklEICkgewogICAgICAgICAgICAkRXJyb3Jze0NhbGVuZGFySURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgZmlsZSBpbiB1cGxvYWQgY2FjaGUKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIG15ICRBZGRlZCA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkRm9ybUlELAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpZiBmaWxlIGdvdCBub3QgYWRkZWQgdG8gc3RvcmFnZQogICAgICAgICAgICAjIChlLiBnLiBiZWNhdXNlIG9mIDEgTUIgbWF4X2FsbG93ZWRfcGFja2V0IE15U1FMIHByb2JsZW0pCiAgICAgICAgICAgIGlmICggISRBZGRlZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGNvbnRlbnQgZnJvbSB1cGxvYWQgY2FjaGUKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRGb3JtSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggIUBBdHRhY2htZW50RGF0YSB8fCAoICRBdHRhY2htZW50RGF0YVswXSAmJiAhJXsgJEF0dGFjaG1lbnREYXRhWzBdIH0gKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnN7RmlsZVVwbG9hZEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiA9ICV7ICRBdHRhY2htZW50RGF0YVswXSB9OwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBlbXB0eQogICAgICAgIGlmICggISRVcGxvYWRTdHVmZntDb250ZW50fSApIHsKICAgICAgICAgICAgJEVycm9yc3tGaWxlVXBsb2FkSW52YWxpZH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcnMpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgICAgICAlRXJyb3JzLAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVDYWxlbmRhcjsKCiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgICAgIGlmICgkQ2FsZW5kYXJJRCkgewogICAgICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBjYWxlbmRhciBwZXJtaXNzaW9ucwogICAgICAgIGlmICggISVDYWxlbmRhciApIHsKCiAgICAgICAgICAgICMgbm8gcGVybWlzc2lvbnMKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBwZXJtaXNzaW9ucycpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwZXJtaXNzaW9ucyBjaGVjawogICAgICAgIG15ICRQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQZXJtaXNzaW9uIG5lICdjcmVhdGUnICYmICRQZXJtaXNzaW9uIG5lICdydycgKSB7CgogICAgICAgICAgICAjIG5vIHBlcm1pc3Npb25zIHRvIGltcG9ydCB0byB0aGUgZXhpc3RpbmcgY2FsZW5kYXIKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBwZXJtaXNzaW9ucycpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJENvdW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWwnKS0+SW1wb3J0KAogICAgICAgICAgICBDYWxlbmRhcklEICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIElDYWwgICAgICAgICAgID0+ICRVcGxvYWRTdHVmZntDb250ZW50fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBVcGRhdGVFeGlzdGluZyA9PiAkVXBkYXRlRXhpc3RpbmcsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJENvdW50ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgSW1wb3J0IG9rCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZTtJbXBvcnRBcHBvaW50bWVudHNTdWNjZXNzPTE7Q291bnQ9JHtDb3VudH07TmFtZT0iCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRDYWxlbmRhcntDYWxlbmRhck5hbWV9ICksCiAgICAgICAgKTsKCiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9PdmVydmlldygpOwogICAgfQoKICAgIHJldHVybiAkU2VsZi0+X01hc2soJVBhcmFtKTsKfQoKc3ViIF9PdmVydmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBHZXQgdXNlcidzIHBlcm1pc3Npb25zIHRvIGFzc29jaWF0ZWQgbW9kdWxlcyB3aGljaCBhcmUgZGlzcGxheWVkIGFzIGxpbmtzLgogICAgZm9yIG15ICRNb2R1bGUgKHF3KEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSkpIHsKICAgICAgICBteSAkTW9kdWxlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykKICAgICAgICAgICAgLT57JE1vZHVsZX0tPntHcm91cH0gLy8gW107CgogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRNb2R1bGVHcm91cHMpICkgewogICAgICAgICAgICBNT0RVTEVfR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkTW9kdWxlR3JvdXAgKCBAeyRNb2R1bGVHcm91cHN9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwWyRNb2R1bGVHcm91cF0ifSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TW9kdWxlUGVybWlzc2lvbnN9LT57JE1vZHVsZX0gPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgTU9EVUxFX0dST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEFsd2F5cyBhbGxvdyBsaW5rcyBpZiBubyBncm91cHMgYXJlIHNwZWNpZmllZC4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte01vZHVsZVBlcm1pc3Npb25zfS0+eyRNb2R1bGV9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1RpdGxlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiSW1wb3J0IEFwcG9pbnRtZW50cyIpOwogICAgJFBhcmFte0NhbGVuZGFySURJbnZhbGlkfSAvLz0gJyc7CgogICAgbXkgQENhbGVuZGFyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpLT5DYWxlbmRhckxpc3QoCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgUGVybWlzc2lvbiA9PiAnY3JlYXRlJywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICApOwoKICAgIG15IEBDYWxlbmRhckRhdGEgPSBtYXAgewogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJF8tPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVmFsdWUgPT4gJF8tPntDYWxlbmRhck5hbWV9LAogICAgICAgIH0KICAgIH0gc29ydCB7ICRhLT57Q2FsZW5kYXJOYW1lfSBjbXAgJGItPntDYWxlbmRhck5hbWV9IH0gQENhbGVuZGFyTGlzdDsKCiAgICAkUGFyYW17Q2FsZW5kYXJ9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFxAQ2FsZW5kYXJEYXRhLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2FsZW5kYXJJRCcsCiAgICAgICAgSUQgICAgICAgICAgID0+ICdDYWxlbmRhcklEJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gJFBhcmFte0NhbGVuZGFySURJbnZhbGlkfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBUaXRsZSAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJDYWxlbmRhciIpLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0gfHwgJycsCiAgICApOwoKICAgICMgZ2V0IEZvcm1JRCBmcm9tIHBhcmFtcwogICAgJFBhcmFte0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApIHx8ICcnOwoKICAgICMgZ2VuZXJhdGUgRm9ybUlEIGlmIGVtcHR5CiAgICAkUGFyYW17Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpIGlmICEkUGFyYW17Rm9ybUlEfTsKCiAgICByZXR1cm4gJFNlbGYtPl9NYXNrKCVQYXJhbSk7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBvdXRwdXQgcGFnZQogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50QXBwb2ludG1lbnRJbXBvcnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudExpc3Q7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IHRpbWUgem9uZSBvZmZzZXQKICAgICRTZWxmLT57VGltZVpvbmV9ICAgID0gJFNlbGYtPntVc2VyVGltZVpvbmV9IHx8IDA7CiAgICAkU2VsZi0+e1RpbWVTZWNEaWZmfSA9ICRTZWxmLT57VGltZVpvbmV9ICogMzYwMDsgICAgICMgNjAgKiA2MAoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgbmFtZXMgb2YgYWxsIHBhcmFtZXRlcnMKICAgIG15IEBQYXJhbU5hbWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CgogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKEBQYXJhbU5hbWVzKSB7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXBwb2ludG1lbnRJRHMnOwogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgbXkgJFBsdWdpbk9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nKTsKCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gW10gKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgIyBjaGVjayByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTGlzdEFwcG9pbnRtZW50cycgKSB7CgogICAgICAgIGlmICggJEdldFBhcmFte0NhbGVuZGFySUR9ICkgewoKICAgICAgICAgICAgIyBhcHBlbmQgbWlkbmlnaHQgdG8gdGhlIHRpbWVzdGFtcHMKICAgICAgICAgICAgZm9yIG15ICRUaW1lc3RhbXAgKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JFRpbWVzdGFtcH0gJiYgISggJEdldFBhcmFteyRUaW1lc3RhbXB9ID1+IC9cc1xkezJ9OlxkezJ9OlxkezJ9JC8gKSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFRpbWVzdGFtcH0gPSAkR2V0UGFyYW17JFRpbWVzdGFtcH0gLiAnIDAwOjAwOjAwJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0VuZFRpbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb252ZXJ0IHRvIGxvY2FsIHRpbWUKICAgICAgICAgICAgJFN0YXJ0VGltZSAtPSAkU2VsZi0+e1RpbWVTZWNEaWZmfTsKICAgICAgICAgICAgJEVuZFRpbWUgICAtPSAkU2VsZi0+e1RpbWVTZWNEaWZmfTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVzZXQgZW1wdHkgcGFyYW1ldGVycwogICAgICAgICAgICBmb3IgbXkgJFBhcmFtICggc29ydCBrZXlzICVHZXRQYXJhbSApIHsKICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXskUGFyYW19ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gdW5kZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ28gdGhyb3VnaCBhbGwgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBub3RpZmljYXRpb24gZGF0ZQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICEkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfQogICAgICAgICAgICAgICAgICAgIHx8ICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9IGVxICcwMDAwLTAwLTAwIDAwOjAwOjAwJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHN5c3RlbSB0aW1lcwogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2F2ZSB0aW1lIHN0YW1wcyBmb3IgZGlzcGxheSBiZWZvcmUgY2FsY3VsYXRpb24KICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0RGF0ZX0gPSAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9OwogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0gICA9ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9OwoKICAgICAgICAgICAgICAgICMgZW5kIHRpbWVzIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBhcmUgaW5jbHVzaXZlLCBzdWJ0cmFjdCB3aG9sZSBkYXkKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZSAtPSA4NjQwMDsKICAgICAgICAgICAgICAgICAgICBpZiAoICRFbmRUaW1lIDwgJFN0YXJ0VGltZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgPSAkU3RhcnRUaW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmREYXRlfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjYWxjdWxhdGUgbG9jYWwgdGltZXMgZm9yIGNvbnRyb2wKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTdGFydFRpbWUgKz0gJFNlbGYtPntUaW1lU2VjRGlmZn07CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgKz0gJFNlbGYtPntUaW1lU2VjRGlmZn07CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9ybWF0dGVkIGRhdGUvdGltZSBzdHJpbmdzIHVzZWQgaW4gZGlzcGxheQogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3RhcnREYXRlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3RhcnREYXRlfSwKICAgICAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcgLiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gPyAnU2hvcnQnIDogJycgKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZERhdGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmREYXRlfSwKICAgICAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcgLiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gPyAnU2hvcnQnIDogJycgKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGluY2x1ZGUgcmVzb3VyY2UgZGF0YQogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57VGVhbU5hbWV9ICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1Jlc291cmNlTmFtZXN9ID0gJyc7CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLAogICAgICAgICAgICAgICAgICAgICAgICBTaWxlbnQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRlYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQFRlYW1OYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgVEVBTUlEOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7ICRBcHBvaW50bWVudC0+e1RlYW1JRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgVEVBTUlEIGlmICEkVGVhbUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVRlYW0gPSAkVGVhbU9iamVjdC0+VGVhbUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtSUQgPT4gJFRlYW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1OYW1lcywgJFRlYW17TmFtZX0gaWYgJVRlYW07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ1bmNhdGUgbW9yZSB0aGFuIHRocmVlIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUZWFtQ291bnQgPSBzY2FsYXIgQFRlYW1OYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVGVhbUNvdW50ID4gNCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZSBAVGVhbU5hbWVzLCAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAVGVhbU5hbWVzLCAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICcrJWQgbW9yZScsICRUZWFtQ291bnQgLSAzICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1RlYW1OYW1lc30gPSBqb2luKCAnXG4nLCBAVGVhbU5hbWVzICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57UmVzb3VyY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQFJlc291cmNlTmFtZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIFJFU09VUkNFSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUmVzb3VyY2VJRCAoIEB7ICRBcHBvaW50bWVudC0+e1Jlc291cmNlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFJFU09VUkNFSUQgaWYgISRSZXNvdXJjZUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRSZXNvdXJjZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFJlc291cmNlTmFtZXMsICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ1bmNhdGUgbW9yZSB0aGFuIHRocmVlIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRSZXNvdXJjZUNvdW50ID0gc2NhbGFyIEBSZXNvdXJjZU5hbWVzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXNvdXJjZUNvdW50ID4gNCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZSBAUmVzb3VyY2VOYW1lcywgMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFJlc291cmNlTmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnKyVkIG1vcmUnLCAkUmVzb3VyY2VDb3VudCAtIDMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57UmVzb3VyY2VOYW1lc30gPSBqb2luKCAnXG4nLCBAUmVzb3VyY2VOYW1lcyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGluY2x1ZGUgcGx1Z2luIChsaW5rKSBkYXRhCiAgICAgICAgICAgICAgICBteSAkUGx1Z2luTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKICAgICAgICAgICAgICAgIGZvciBteSAkUGx1Z2luS2V5ICggc29ydCBrZXlzICV7JFBsdWdpbkxpc3R9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMaW5rTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgQExpbmtBcnJheTsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQExpbmtBcnJheSwgJExpbmtMaXN0LT57JExpbmtJRH0tPntMaW5rTmFtZX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHRydW5jYXRlIG1vcmUgdGhhbiB0aHJlZSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgIG15ICRMaW5rQ291bnQgPSBzY2FsYXIgQExpbmtBcnJheTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRMaW5rQ291bnQgPiA0ICkgewogICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2UgQExpbmtBcnJheSwgMzsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBATGlua0FycmF5LCAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICcrJWQgbW9yZScsICRMaW5rQ291bnQgLSAzICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntQbHVnaW5EYXRhfS0+eyRQbHVnaW5LZXl9ID0gam9pbiggJ1xuJywgQExpbmtBcnJheSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZGVhbGluZyB3aXRoIHRpY2tldCBhcHBvaW50bWVudAogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnQtPntUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFJ1bGUgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnQtPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUnVsZUlEICAgICA9PiAkQXBwb2ludG1lbnQtPntUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdHlwZXMgZnJvbSB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUKICAgICAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRSdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57VGlja2V0QXBwb2ludG1lbnRTdGFydERhdGV9ID0gJFJ1bGUtPntTdGFydERhdGV9OwogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntUaWNrZXRBcHBvaW50bWVudEVuZERhdGV9ICAgPSAkUnVsZS0+e0VuZERhdGV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICgKICAgICAgICAgICAgICAgICAgICBcQEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBcHBvaW50bWVudERheXMnICkgewoKICAgICAgICAjIGFwcGVuZCBtaWRuaWdodCB0byB0aGUgdGltZXN0YW1wcwogICAgICAgIGZvciBteSAkVGltZXN0YW1wIChxdyhTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JFRpbWVzdGFtcH0gJiYgISggJEdldFBhcmFteyRUaW1lc3RhbXB9ID1+IC9cc1xkezJ9OlxkezJ9OlxkezJ9JC8gKSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskVGltZXN0YW1wfSA9ICRHZXRQYXJhbXskVGltZXN0YW1wfSAuICcgMDA6MDA6MDAnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlc2V0IGVtcHR5IHBhcmFtZXRlcnMKICAgICAgICBmb3IgbXkgJFBhcmFtICggc29ydCBrZXlzICVHZXRQYXJhbSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyRQYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlQXBwb2ludG1lbnREYXlzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERheXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+ICgKICAgICAgICAgICAgICAgIFwlQXBwb2ludG1lbnREYXlzLAogICAgICAgICAgICApLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZW5kIEpTT04gcmVzcG9uc2UKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudFBsdWdpblNlYXJjaDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IG5lZWRlZCBwYXJhbXMKICAgIG15ICRTZWFyY2ggICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVybScgKSB8fCAnJzsKICAgIG15ICRQbHVnaW5LZXkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUGx1Z2luS2V5JyApOwogICAgbXkgJE1heFJlc3VsdHMgPSBpbnQoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdNYXhSZXN1bHRzJyApIHx8IDIwICk7CgogICAgIyB3b3JrYXJvdW5kLCBhbGwgYXV0byBjb21wbGV0aW9uIHJlcXVlc3RzIGdldCBwb3N0ZWQgYnkgdXRmOCBhbnl3YXkKICAgICMgY29udmVydCBhbnkgdG8gOGJpdCBzdHJpbmcgaWYgYXBwbGljYXRpb24gaXMgbm90IHJ1bm5pbmcgaW4gdXRmOAogICAgJFNlYXJjaCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+Q29udmVydDJDaGFyc2V0SW50ZXJuYWwoCiAgICAgICAgVGV4dCA9PiAkU2VhcmNoLAogICAgICAgIEZyb20gPT4gJ3V0Zi04JywKICAgICk7CgogICAgbXkgJFJlc3VsdExpc3Q7CgogICAgaWYgKCRQbHVnaW5LZXkpIHsKCiAgICAgICAgIyBnZXQgcGx1Z2luIG9iamVjdAogICAgICAgIG15ICRQbHVnaW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwoKICAgICAgICAkUmVzdWx0TGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpblNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoICAgID0+ICRTZWFyY2gsCiAgICAgICAgICAgIFBsdWdpbktleSA9PiAkUGx1Z2luS2V5LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBkYXRhCiAgICBteSBARGF0YTsKICAgIG15ICRNYXhSZXN1bHRDb3VudCA9ICRNYXhSZXN1bHRzOwoKICAgIE9CSkVDVElEOgogICAgZm9yIG15ICRPYmplY3RJRCAoCiAgICAgICAgc29ydCB7ICRSZXN1bHRMaXN0LT57JGF9IGNtcCAkUmVzdWx0TGlzdC0+eyRifSB9CiAgICAgICAga2V5cyAleyRSZXN1bHRMaXN0fQogICAgICAgICkKICAgIHsKICAgICAgICBwdXNoIEBEYXRhLCB7CiAgICAgICAgICAgIEtleSAgID0+ICRPYmplY3RJRCwKICAgICAgICAgICAgVmFsdWUgPT4gJFJlc3VsdExpc3QtPnskT2JqZWN0SUR9LAogICAgICAgIH07CgogICAgICAgICRNYXhSZXN1bHRDb3VudC0tOwogICAgICAgIGxhc3QgT0JKRUNUSUQgaWYgJE1heFJlc3VsdENvdW50IDw9IDA7CiAgICB9CgogICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgIERhdGEgPT4gXEBEYXRhIHx8IHt9LAogICAgKTsKCiAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiB8fCAnJywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6UHVibGljQ2FsZW5kYXI7CgojdXNlIENHSTo6QXV0aDo6QmFzaWM7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNSU1FOjpCYXNlNjQgcXcoKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUdldFBhcmFtOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFVzZXIgVG9rZW4pKSB7CiAgICAgICAgJEdldFBhcmFteyROZWVkZWR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJE5lZWRlZCApOwogICAgICAgIGlmICggISRHZXRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ05vICVzIScsICROZWVkZWQgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdXNlcgogICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VyICA9PiAkR2V0UGFyYW17VXNlcn0sCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHN1Y2ggdXNlciEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgIyBnZXQgY2FsZW5kYXIKICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICElQ2FsZW5kYXIgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRDYWxlbmRhcntWYWxpZElEfSAhPSAxICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnSW52YWxpZCBjYWxlbmRhciEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBhY2Nlc3MgdG9rZW4KICAgIG15ICRBY2Nlc3NUb2tlbiA9ICRDYWxlbmRhck9iamVjdC0+R2V0QWNjZXNzVG9rZW4oCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgVXNlckxvZ2luICA9PiAkR2V0UGFyYW17VXNlcn0sCiAgICApOwoKICAgIGlmICggJEFjY2Vzc1Rva2VuIG5lICRHZXRQYXJhbXtUb2tlbn0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdJbnZhbGlkIFVSTCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaUNhbGVuZGFyIHN0cmluZwogICAgbXkgJElDYWxTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV4cG9ydDo6SUNhbCcpLT5FeHBvcnQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkSUNhbFN0cmluZyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgdGhlIGZpbGUgbmFtZQogICAgbXkgJEZpbGVuYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RmlsZW5hbWVDbGVhblVwKAogICAgICAgIEZpbGVuYW1lID0+ICIkQ2FsZW5kYXJ7Q2FsZW5kYXJOYW1lfS5pY3MiLAogICAgICAgIFR5cGUgICAgID0+ICdBdHRhY2htZW50JywKICAgICk7CgogICAgIyBzZW5kIGlDYWwgcmVzcG9uc2UKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2NhbGVuZGFyJywKICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJElDYWxTdHJpbmcsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SlNPTicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBsaW5rIG9iamVjdCAoYXBwb2ludG1lbnQpLgoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudC0+bmV3KAogICAgICAgIFVzZXJMYW5ndWFnZSA9PiAnZW4nLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJMYW5ndWFnZSBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskTmVlZGVkfSA9ICRQYXJhbXskTmVlZGVkfSB8fCBkaWUgIkdvdCBubyAkTmVlZGVkISI7CiAgICB9CgogICAgIyBjcmVhdGUgb3VyIG93biBMYXlvdXRPYmplY3QgaW5zdGFuY2UgdG8gYXZvaWQgYmxvY2sgZGF0YSBjb2xsaXNpb25zIHdpdGggdGhlIG1haW4gcGFnZQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZXMKICAgICRTZWxmLT57T2JqZWN0RGF0YX0gPSB7CiAgICAgICAgT2JqZWN0ICAgICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFJlYWxuYW1lICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBPYmplY3ROYW1lID0+ICdTb3VyY2VPYmplY3RJRCcsCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVGFibGVDcmVhdGVDb21wbGV4KCkKCnJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBibG9jayBkYXRhCgpSZXR1cm4KCiAgICAlQmxvY2tEYXRhID0gKAogICAgICAgIHsKICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiAnU291cmNlT2JqZWN0SUQnLAogICAgICAgICAgICBPYmplY3RJRCAgID0+IDEsCiAgICAgICAgICAgIE9iamVjdCAgICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgQmxvY2tuYW1lICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgICAgICBIZWFkbGluZSAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdUaXRsZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnU3RhcnQgVGltZScsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxNTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0VuZCBUaW1lJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDE1MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEl0ZW1MaXN0ID0+IFsKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdBcHBvaW50bWVudCB0aXRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdBcHBvaW50bWVudCBkZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAxNi0wMS0wMSAxMjowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAxNi0wMS0wMSAxMzowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgQEJsb2NrRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5UYWJsZUNyZWF0ZUNvbXBsZXgoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlQ29tcGxleCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfHwgcmVmICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE9iamVjdExpbmtMaXN0V2l0aERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjb252ZXJ0IHRoZSBsaXN0CiAgICBteSAlTGlua0xpc3Q7CiAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoIHNvcnQga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgICAgICAkTGlua0xpc3R7JEFwcG9pbnRtZW50SUR9LT57RGF0YX0gPSAkRGlyZWN0aW9uTGlzdC0+eyRBcHBvaW50bWVudElEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29tcGxleFRhYmxlRGF0YSA9ICRDb25maWdPYmplY3QtPkdldCgiTGlua09iamVjdDo6Q29tcGxleFRhYmxlIik7CiAgICBteSAkRGVmYXVsdENvbHVtbnM7CiAgICBpZiAoCiAgICAgICAgJENvbXBsZXhUYWJsZURhdGEKICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSgkQ29tcGxleFRhYmxlRGF0YSkKICAgICAgICAmJiAkQ29tcGxleFRhYmxlRGF0YS0+e0FwcG9pbnRtZW50fQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQ29tcGxleFRhYmxlRGF0YS0+e0FwcG9pbnRtZW50fSApCiAgICAgICAgKQogICAgewogICAgICAgICREZWZhdWx0Q29sdW1ucyA9ICRDb21wbGV4VGFibGVEYXRhLT57IkFwcG9pbnRtZW50In0tPnsiRGVmYXVsdENvbHVtbnMifTsKICAgIH0KCiAgICBteSBAVGltZUxvbmdUeXBlcyA9ICgKICAgICAgICAiQ3JlYXRlZCIsCiAgICAgICAgIkNoYW5nZWQiLAogICAgICAgICJTdGFydFRpbWUiLAogICAgICAgICJFbmRUaW1lIiwKICAgICAgICAiTm90aWZpY2F0aW9uVGltZSIsCiAgICApOwoKICAgICMgZGVmaW5lIHRoZSBibG9jayBkYXRhCiAgICBteSBASGVhZGxpbmUgPSAoCiAgICAgICAgewogICAgICAgICAgICBDb250ZW50ID0+ICdUaXRsZScsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICMgbG9hZCB1c2VyIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkVXNlck9iamVjdC0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJERlZmF1bHRDb2x1bW5zIHx8ICFJc0hhc2hSZWZXaXRoRGF0YSgkRGVmYXVsdENvbHVtbnMpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWlzc2luZyBjb25maWd1cmF0aW9uIGZvciBMaW5rT2JqZWN0OjpDb21wbGV4VGFibGUjIyNBcHBvaW50bWVudCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgR2V0IGRlZmF1bHQgY29sdW1uIHByaW9yaXR5IGZyb20gU3lzQ29uZmlnCiAgICAjIEVhY2ggY29sdW1uIGluIHRhYmxlIChUaXRsZSwgU3RhcnRUaW1lLCBFbmRUaW1lLC4uLikgaGFzIGRlZmluZWQgUHJpb3JpdHkgaW4gU3lzQ29uZmlnLgogICAgIyBTeXN0ZW0gdXNlIHRoaXMgcHJpb3JpdHkgdG8gc29ydCBjb2x1bW5zLCBpZiB1c2VyIGRvZXNuJ3QgaGF2ZSBvd24gc2V0dGluZ3MuCiAgICBteSAlU29ydE9yZGVyOwoKICAgIGlmICgKICAgICAgICAkQ29tcGxleFRhYmxlRGF0YS0+eyJBcHBvaW50bWVudCJ9LT57IlByaW9yaXR5In0KICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJENvbXBsZXhUYWJsZURhdGEtPnsiQXBwb2ludG1lbnQifS0+eyJQcmlvcml0eSJ9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJVNvcnRPcmRlciA9ICV7ICRDb21wbGV4VGFibGVEYXRhLT57IkFwcG9pbnRtZW50In0tPnsiUHJpb3JpdHkifSB9OwogICAgfQoKICAgIG15ICVVc2VyQ29sdW1ucyA9ICV7JERlZmF1bHRDb2x1bW5zfTsKCiAgICBpZiAoICRQcmVmZXJlbmNlc3snTGlua09iamVjdDo6Q29tcGxleFRhYmxlLUFwcG9pbnRtZW50J30gKSB7CiAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwoKICAgICAgICBteSAkQ29sdW1uc0VuYWJsZWQgPSAkSlNPTk9iamVjdC0+RGVjb2RlKAogICAgICAgICAgICBEYXRhID0+ICRQcmVmZXJlbmNlc3snTGlua09iamVjdDo6Q29tcGxleFRhYmxlLUFwcG9pbnRtZW50J30sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29sdW1uc0VuYWJsZWQKICAgICAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoJENvbHVtbnNFbmFibGVkKQogICAgICAgICAgICAmJiAkQ29sdW1uc0VuYWJsZWQtPntPcmRlcn0KICAgICAgICAgICAgJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkQ29sdW1uc0VuYWJsZWQtPntPcmRlcn0gKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIENsZWFyIHNvcnQgb3JkZXIKICAgICAgICAgICAgJVNvcnRPcmRlciA9ICgpOwoKICAgICAgICAgICAgREVGQVVMVENPTFVNTjoKICAgICAgICAgICAgZm9yIG15ICREZWZhdWx0Q29sdW1uICggc29ydCBrZXlzICVVc2VyQ29sdW1ucyApIHsKICAgICAgICAgICAgICAgIG15ICRJbmRleCA9IDA7CgogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VyU2V0dGluZyAoIEB7ICRDb2x1bW5zRW5hYmxlZC0+e09yZGVyfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIGlmICggJERlZmF1bHRDb2x1bW4gZXEgJFVzZXJTZXR0aW5nICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckNvbHVtbnN7JERlZmF1bHRDb2x1bW59ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgJFNvcnRPcmRlcnskRGVmYXVsdENvbHVtbn0gICA9ICRJbmRleDsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgREVGQVVMVENPTFVNTjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBub3QgZm91bmQsIG1lYW5zIHVzZXIgY2hvc2UgdG8gaGlkZSB0aGlzIGl0ZW0KICAgICAgICAgICAgICAgIGlmICggJFVzZXJDb2x1bW5zeyREZWZhdWx0Q29sdW1ufSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRVc2VyQ29sdW1uc3skRGVmYXVsdENvbHVtbn0gPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISRTb3J0T3JkZXJ7JERlZmF1bHRDb2x1bW59ICkgewogICAgICAgICAgICAgICAgICAgICRTb3J0T3JkZXJ7JERlZmF1bHRDb2x1bW59ID0gMDsgICAgIyBTZXQgMCwgaXQgc3lzdGVtIHdpbGwgaGlkZSB0aGlzIGl0ZW0gYW55d2F5cwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgIyB1c2VyIGhhcyBubyBvd24gc2V0dGluZ3MKICAgICAgICBmb3IgbXkgJENvbHVtbiAoIHNvcnQga2V5cyAlVXNlckNvbHVtbnMgKSB7CiAgICAgICAgICAgIGlmICggISRTb3J0T3JkZXJ7JENvbHVtbn0gKSB7CiAgICAgICAgICAgICAgICAkU29ydE9yZGVyeyRDb2x1bW59ID0gMDsgICAgICAgICAgICAgICAjIFNldCAwLCBpdCBzeXN0ZW0gd2lsbCBoaWRlIHRoaXMgaXRlbSBhbnl3YXlzCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBEZWZpbmUgSGVhZGxpbmUgY29sdW1ucwoKICAgICMgU29ydAogICAgbXkgQEFsbENvbHVtbnM7CiAgICBDT0xVTU46CiAgICBmb3IgbXkgJENvbHVtbiAoIHNvcnQgeyAkU29ydE9yZGVyeyRhfSA8PT4gJFNvcnRPcmRlcnskYn0gfSBrZXlzICVVc2VyQ29sdW1ucyApIHsKCiAgICAgICAgbXkgJENvbHVtblRyYW5zbGF0ZSA9ICRDb2x1bW47CiAgICAgICAgaWYgKCAkQ29sdW1uIGVxICdDYWxlbmRhck5hbWUnICkgewogICAgICAgICAgICAkQ29sdW1uVHJhbnNsYXRlID0gVHJhbnNsYXRhYmxlKCdDYWxlbmRhciBuYW1lJyk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnU3RhcnRUaW1lJyApIHsKICAgICAgICAgICAgJENvbHVtblRyYW5zbGF0ZSA9IFRyYW5zbGF0YWJsZSgnU3RhcnQgZGF0ZScpOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ0VuZFRpbWUnICkgewogICAgICAgICAgICAkQ29sdW1uVHJhbnNsYXRlID0gVHJhbnNsYXRhYmxlKCdFbmQgZGF0ZScpOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ05vdGlmaWNhdGlvblRpbWUnICkgewogICAgICAgICAgICAkQ29sdW1uVHJhbnNsYXRlID0gVHJhbnNsYXRhYmxlKCdOb3RpZmljYXRpb24nKTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQEFsbENvbHVtbnMsIHsKICAgICAgICAgICAgQ29sdW1uTmFtZSAgICAgID0+ICRDb2x1bW4sCiAgICAgICAgICAgIENvbHVtblRyYW5zbGF0ZSA9PiAkQ29sdW1uVHJhbnNsYXRlLAogICAgICAgIH07CgogICAgICAgIG5leHQgQ09MVU1OIGlmICRDb2x1bW4gZXEgJ1RpdGxlJzsgICAgIyBBbHdheXMgcHJlc2VudCwgYWxyZWFkeSBhZGRlZC4KCiAgICAgICAgIyBpZiBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICBpZiAoICRVc2VyQ29sdW1uc3skQ29sdW1ufSA9PSAyICkgewoKICAgICAgICAgICAgIyBhcHBvaW50bWVudCBmaWVsZHMKICAgICAgICAgICAgbXkgJENvbHVtbk5hbWUgPSAkQ29sdW1uVHJhbnNsYXRlOwoKICAgICAgICAgICAgcHVzaCBASGVhZGxpbmUsIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENvbHVtbk5hbWUsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHRoZSBpdGVtIGxpc3QgKHRhYmxlIGNvbnRlbnQpCiAgICBteSBASXRlbUxpc3Q7CgogICAgQVBQT0lOVE1FTlRJRDoKICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoCiAgICAgICAgc29ydCB7ICRMaW5rTGlzdHskYX17RGF0YX0tPntBcHBvaW50bWVudElEfSA8PT4gJExpbmtMaXN0eyRifXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9IH0KICAgICAgICBrZXlzICVMaW5rTGlzdAogICAgICAgICkKICAgIHsKICAgICAgICBuZXh0IEFQUE9JTlRNRU5USUQgaWYgISRBcHBvaW50bWVudElEOwoKICAgICAgICAjIGV4dHJhY3QgYXBwb2ludG1lbnQgYW5kIGNhbGVuZGFyIGRhdGEKICAgICAgICBteSAkQXBwb2ludG1lbnQgPSAkTGlua0xpc3R7JEFwcG9pbnRtZW50SUR9e0RhdGF9OwogICAgICAgIG15ICVDYWxlbmRhciAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpLT5DYWxlbmRhckdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnQtPntDYWxlbmRhcklEfSwKICAgICAgICApOwoKICAgICAgICAjIFRpdGxlIGJlIHByZXNlbnQgKHNpbmNlIGl0IGNvbnRhaW5zIG1hc3RlciBsaW5rIHRvIHRoZSBhcHBvaW50bWVudCkKICAgICAgICBteSBASXRlbUNvbHVtbnMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgS2V5ICAgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJEFwcG9pbnRtZW50LT57VGl0bGV9LAogICAgICAgICAgICAgICAgTGluayAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0nCiAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIFNvcnQKICAgICAgICBDT0xVTU46CiAgICAgICAgZm9yIG15ICRDb2x1bW4gKCBzb3J0IHsgJFNvcnRPcmRlcnskYX0gPD0+ICRTb3J0T3JkZXJ7JGJ9IH0ga2V5cyAlVXNlckNvbHVtbnMgKSB7CgogICAgICAgICAgICBuZXh0IENPTFVNTiBpZiAkQ29sdW1uIGVxICdUaXRsZSc7ICAgICMgQWx3YXlzIHByZXNlbnQsIGFscmVhZHkgYWRkZWQuCgogICAgICAgICAgICAjIGlmIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoICRVc2VyQ29sdW1uc3skQ29sdW1ufSA9PSAyICkgewoKICAgICAgICAgICAgICAgIG15ICVIYXNoOwogICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJENvbHVtbiB9IEBUaW1lTG9uZ1R5cGVzICkgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydUeXBlJ30gPSAnVGltZUxvbmcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J1R5cGUnfSA9ICdUZXh0JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRDb2x1bW4gZXEgJ05vdGlmaWNhdGlvblRpbWUnICkgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydDb250ZW50J30gPSAkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnQ3JlYXRlZCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J0NvbnRlbnQnfSA9ICRBcHBvaW50bWVudC0+e0NyZWF0ZVRpbWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkQ29sdW1uIGVxICdDaGFuZ2VkJyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnQ29udGVudCd9ID0gJEFwcG9pbnRtZW50LT57Q2hhbmdlVGltZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ0NhbGVuZGFyTmFtZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J0NvbnRlbnQnfSA9ICRDYWxlbmRhcntDYWxlbmRhck5hbWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J0NvbnRlbnQnfSA9ICRBcHBvaW50bWVudC0+eyRDb2x1bW59OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW1Db2x1bW5zLCBcJUhhc2g7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcQEl0ZW1Db2x1bW5zOwogICAgfQoKICAgIHJldHVybiBpZiAhQEl0ZW1MaXN0OwoKICAgIG15ICVCbG9jayA9ICgKICAgICAgICBPYmplY3QgICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9LAogICAgICAgIEJsb2NrbmFtZSAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e1JlYWxuYW1lfSwKICAgICAgICBPYmplY3ROYW1lID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3ROYW1lfSwKICAgICAgICBPYmplY3RJRCAgID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgSGVhZGxpbmUgICA9PiBcQEhlYWRsaW5lLAogICAgICAgIEl0ZW1MaXN0ICAgPT4gXEBJdGVtTGlzdCwKICAgICAgICBBbGxDb2x1bW5zID0+IFxAQWxsQ29sdW1ucywKICAgICk7CgogICAgcmV0dXJuICggXCVCbG9jayApOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZVNpbXBsZSgpCgpyZXR1cm4gYSBoYXNoIHdpdGggdGhlIGxpbmsgb3V0cHV0IGRhdGEKClJldHVybgoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICgKICAgICAgICBOb3JtYWw6OlNvdXJjZSA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50ID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdBOjEnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ1RpdGxlIG9mIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgJUxpbmtPdXRwdXREYXRhID0gJEJhY2tlbmRPYmplY3QtPlRhYmxlQ3JlYXRlU2ltcGxlKAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZVNpbXBsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfHwgcmVmICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE9iamVjdExpbmtMaXN0V2l0aERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlTGlua091dHB1dERhdGE7CiAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgIG15IEBJdGVtTGlzdDsKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEICgKICAgICAgICAgICAgICAgIHNvcnQgewogICAgICAgICAgICAgICAgICAgIGxjICREaXJlY3Rpb25MaXN0LT57JGF9LT57TmFtZVNob3J0fSBjbXAgbGMgJERpcmVjdGlvbkxpc3QtPnskYn0tPntOYW1lU2hvcnR9CiAgICAgICAgICAgICAgICB9IGtleXMgJXskRGlyZWN0aW9uTGlzdH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBhcHBvaW50bWVudCBkYXRhCiAgICAgICAgICAgICAgICBteSAkQXBwb2ludG1lbnQgPSAkRGlyZWN0aW9uTGlzdC0+eyRBcHBvaW50bWVudElEfTsKCiAgICAgICAgICAgICAgICAjIGRlZmluZSBpdGVtIGRhdGEKICAgICAgICAgICAgICAgIG15ICVJdGVtID0gKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gIkE6JEFwcG9pbnRtZW50SUQiLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gVHJhbnNsYXRhYmxlKCdBcHBvaW50bWVudCcpLAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcJUl0ZW07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIGl0ZW0gbGlzdCB0byBsaW5rIG91dHB1dCBkYXRhCiAgICAgICAgICAgICRMaW5rT3V0cHV0RGF0YXsgJExpbmtUeXBlIC4gJzo6JyAuICREaXJlY3Rpb24gfS0+e0FwcG9pbnRtZW50fSA9IFxASXRlbUxpc3Q7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlTGlua091dHB1dERhdGE7Cn0KCj1pdGVtIENvbnRlbnRTdHJpbmdDcmVhdGUoKQoKcmV0dXJuIGEgb3V0cHV0IHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5Db250ZW50U3RyaW5nQ3JlYXRlKAogICAgICAgIENvbnRlbnREYXRhID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDb250ZW50U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb250ZW50RGF0YX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbnRlbnREYXRhIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIFNlbGVjdGFibGVPYmplY3RMaXN0KCkKCnJldHVybiBhbiBhcnJheSBoYXNoIHdpdGggc2VsZWN0YWJsZSBvYmplY3RzCgpSZXR1cm4KCiAgICBAU2VsZWN0YWJsZU9iamVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgICAgICBWYWx1ZSA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIH0sCiAgICApOwoKICAgIEBTZWxlY3RhYmxlT2JqZWN0TGlzdCA9ICRCYWNrZW5kT2JqZWN0LT5TZWxlY3RhYmxlT2JqZWN0TGlzdCgKICAgICAgICBTZWxlY3RlZCA9PiAkSWRlbnRpZmllciwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBTZWxlY3RhYmxlT2JqZWN0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxlY3RlZDsKICAgIGlmICggJFBhcmFte1NlbGVjdGVkfSAmJiAkUGFyYW17U2VsZWN0ZWR9IGVxICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9ICkgewogICAgICAgICRTZWxlY3RlZCA9IDE7CiAgICB9CgogICAgIyBvYmplY3Qgc2VsZWN0IGxpc3QKICAgIG15IEBPYmplY3RTZWxlY3RMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0sCiAgICAgICAgICAgIFNlbGVjdGVkID0+ICRTZWxlY3RlZCwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQE9iamVjdFNlbGVjdExpc3Q7Cn0KCj1pdGVtIFNlYXJjaE9wdGlvbkxpc3QoKQoKcmV0dXJuIGFuIGFycmF5IGhhc2ggd2l0aCBzZWFyY2ggb3B0aW9ucwoKUmV0dXJuCgogICAgQFNlYXJjaE9wdGlvbkxpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0FwcG9pbnRtZW50VGl0bGUnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ1RpdGxlJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJzEyMzQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0FwcG9pbnRtZW50RGVzY3JpcHRpb24nLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJ0JsYUJsYScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQXBwb2ludG1lbnRDYWxlbmRhcklEJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDYWxlbmRhcicsCiAgICAgICAgICAgIElucHV0U3RyZyA9PiAkRm9ybVN0cmluZywKICAgICAgICAgICAgRm9ybURhdGEgID0+ICdDYWxlbmRhcjEnLAogICAgICAgIH0sCiAgICApOwoKICAgIEBTZWFyY2hPcHRpb25MaXN0ID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaE9wdGlvbkxpc3QoCiAgICAgICAgU3ViT2JqZWN0ID0+ICdCbGEnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaE9wdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1Ib29rID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6Okhvb2snKSB8fCAnVGlja2V0Iyc7CgogICAgIyBzZWFyY2ggb3B0aW9uIGxpc3QKICAgIG15IEBTZWFyY2hPcHRpb25MaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnQXBwb2ludG1lbnRUaXRsZScsCiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdUaXRsZScpLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnQXBwb2ludG1lbnREZXNjcmlwdGlvbicsCiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdEZXNjcmlwdGlvbicpLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnQXBwb2ludG1lbnRDYWxlbmRhcklEJywKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0NhbGVuZGFyJyksCiAgICAgICAgICAgIFR5cGUgPT4gJ0xpc3QnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvcm1rZXkKICAgIGZvciBteSAkUm93IChAU2VhcmNoT3B0aW9uTGlzdCkgewogICAgICAgICRSb3ctPntGb3JtS2V5fSA9ICdTRUFSQ0g6OicgLiAkUm93LT57S2V5fTsKICAgIH0KCiAgICAjIGFkZCBmb3JtIGRhdGEgYW5kIGlucHV0IHN0cmluZwogICAgUk9XOgogICAgZm9yIG15ICRSb3cgKEBTZWFyY2hPcHRpb25MaXN0KSB7CgogICAgICAgIG5leHQgUk9XIGlmICRSb3ctPntUeXBlfSBlcSAnSGlkZGVuJzsKCiAgICAgICAgIyBQcmVwYXJlIHRleHQgaW5wdXQgZmllbGRzLgogICAgICAgIGlmICggJFJvdy0+e1R5cGV9IGVxICdUZXh0JyApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkUm93LT57Rm9ybURhdGF9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJFJvdy0+e0Zvcm1LZXl9ICk7CgogICAgICAgICAgICAjIHBhcnNlIHRoZSBpbnB1dCB0ZXh0IGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnB1dFRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFJvdy0+e0Zvcm1LZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRSb3ctPntGb3JtRGF0YX0gfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIGlucHV0IHN0cmluZwogICAgICAgICAgICAkUm93LT57SW5wdXRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdMaW5rT2JqZWN0JywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUHJlcGFyZSBkcm9wIGRvd24gbGlzdHMuCiAgICAgICAgZWxzaWYgKCAkUm93LT57VHlwZX0gZXEgJ0xpc3QnICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgIG15IEBGb3JtRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0QXJyYXkoIFBhcmFtID0+ICRSb3ctPntGb3JtS2V5fSApOwogICAgICAgICAgICAkUm93LT57Rm9ybURhdGF9ID0gXEBGb3JtRGF0YTsKCiAgICAgICAgICAgIGlmICggJFJvdy0+e0tleX0gZXEgJ0FwcG9pbnRtZW50Q2FsZW5kYXJJRCcgKSB7CiAgICAgICAgICAgICAgICBteSBAQ2FsZW5kYXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyTGlzdCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+ICdydycsCiAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSBAQ2FsZW5kYXJEYXRhID0gbWFwIHsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRfLT57Q2FsZW5kYXJOYW1lfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IHNvcnQgeyAkYS0+e0NhbGVuZGFyTmFtZX0gY21wICRiLT57Q2FsZW5kYXJOYW1lfSB9IEBDYWxlbmRhckxpc3Q7CgogICAgICAgICAgICAgICAgJFJvdy0+e0lucHV0U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXEBDYWxlbmRhckRhdGEsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkUm93LT57Rm9ybUtleX0sCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUm93LT57Rm9ybURhdGF9LAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEBTZWFyY2hPcHRpb25MaXN0Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpQcmVmZXJlbmNlczo6QXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgYWxsIG5vdGlmaWNhdGlvbiB0cmFuc3BvcnRzCiAgICBteSAkVHJhbnNwb3J0Q29uZmlnUmF3ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBcHBvaW50bWVudE5vdGlmaWNhdGlvbjo6VHJhbnNwb3J0JykgfHwge307CgogICAgIyBnZXQgbWFpbiBvYmplY3QKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIHNraXAgYWxsIG5vbiBleGVjdXRhYmxlIHRyYW5zcG9ydHMKICAgIFRSQU5TUE9SVDoKICAgIGZvciBteSAkVHJhbnNwb3J0TmFtZSAoIHNvcnQga2V5cyAleyRUcmFuc3BvcnRDb25maWdSYXd9ICkgewoKICAgICAgICAjIGRpc2NhcmQgbm9uIGF2YWlsYWJsZSB0cmFuc3BvcnRzCiAgICAgICAgbXkgJFRyYW5zcG9ydExvYWRlZCA9ICRNYWluT2JqZWN0LT5SZXF1aXJlKAogICAgICAgICAgICAkVHJhbnNwb3J0Q29uZmlnUmF3LT57JFRyYW5zcG9ydE5hbWV9LT57TW9kdWxlfSwKICAgICAgICAgICAgU2lsZW50ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBza2lwIHRyYW5zcG9ydAogICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICEkVHJhbnNwb3J0TG9hZGVkOwoKICAgICAgICAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30tPnskVHJhbnNwb3J0TmFtZX0gPSAkVHJhbnNwb3J0Q29uZmlnUmF3LT57JFRyYW5zcG9ydE5hbWV9OwogICAgfQoKICAgICMgZ2V0IE5vdGlmaWNhdGlvbkV2ZW50IG9iamVjdAogICAgbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50Jyk7CgogICAgbXkgJU5vdGlmaWNhdGlvbkxpc3QgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkxpc3QoIFR5cGUgPT4gJ0FwcG9pbnRtZW50JyApOwoKICAgIG15ICROb3RpZmljYXRpb25Db25maWcKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6OkFkbWluOjpBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnKTsKCiAgICAjIGdldCB2YWxpZCBvYmplY3QKICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgIE5PVElGSUNBVElPTjoKICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKCBzb3J0IGtleXMgJU5vdGlmaWNhdGlvbkxpc3QgKSB7CgogICAgICAgICMgZ2V0IG5vdGlmaWNhdGlvbiBkZXRhaWxzCiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbiA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBJRCA9PiAkTm90aWZpY2F0aW9uSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNjYXJkIGludmFsaWQgbm90aWZpY2F0aW9ucwogICAgICAgIG15IEBWYWxpZElEcyA9ICRWYWxpZE9iamVjdC0+VmFsaWRJRHNHZXQoKTsKICAgICAgICBuZXh0IE5PVElGSUNBVElPTiBpZiAhZ3JlcCB7ICROb3RpZmljYXRpb257VmFsaWRJRH0gPT0gJF8gfSBAVmFsaWRJRHM7CgogICAgICAgICMgZGlzY2FyZCBhbGwgbm9uIGN1c3RvbWl6YWJsZSBub3RpZmljYXRpb25zCiAgICAgICAgbmV4dCBOT1RJRklDQVRJT04gaWYgISROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9OwogICAgICAgIG5leHQgTk9USUZJQ0FUSU9OIGlmICEkTm90aWZpY2F0aW9ue0RhdGF9LT57VmlzaWJsZUZvckFnZW50fS0+WzBdOwoKICAgICAgICAjIHJlbWVtYmVyIG5vdGlmaWNhdGlvbiBkYXRhCiAgICAgICAgJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyROb3RpZmljYXRpb25JRH0gPSBcJU5vdGlmaWNhdGlvbjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBQYXJhbSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBQYXJhbXM7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIHByaW50IHRhYmxlIGhlYWRlcgogICAgZm9yIG15ICROYW1lICgKICAgICAgICBzb3J0IHsgJFNlbGYtPntUcmFuc3BvcnRDb25maWd9LT57JGF9LT57UHJpb30gPD0+ICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfS0+eyRifS0+e1ByaW99IH0KICAgICAgICBrZXlzICV7ICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfSB9CiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkVHJhbnNwb3J0Q29uZmlnID0gJFNlbGYtPntUcmFuc3BvcnRDb25maWd9LT57JE5hbWV9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lID0+ICRUcmFuc3BvcnRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIFRyYW5zcG9ydEljb24gPT4gJFRyYW5zcG9ydENvbmZpZy0+e0ljb259LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgdGFibGUgYm9keQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0gKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbFNwYW4gPT4gKCBzY2FsYXIga2V5cyAleyAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30gfSApICsgMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IHRoZSB1c2VyIHByZWZlcmVuY2VzICh0aGlzIG5lZWRzIHRvIGJlIGRvbmUgb25seSBvbmNlKQogICAgICAgIG15ICRVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtVc2VyRGF0YX0tPntBcHBvaW50bWVudE5vdGlmaWNhdGlvblRyYW5zcG9ydH0sCiAgICAgICAgKTsKCiAgICAgICAgTk9USUZJQ0FUSU9OOgogICAgICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKAogICAgICAgICAgICBzb3J0IHsgJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyRhfS0+e05hbWV9IGNtcCAkU2VsZi0+e05vdGlmaWNhdGlvbkxpc3R9LT57JGJ9LT57TmFtZX0gfQogICAgICAgICAgICBrZXlzICV7ICRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0gfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgbmV4dCBOT1RJRklDQVRJT04gaWYgISRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0tPnskTm90aWZpY2F0aW9uSUR9OwoKICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0tPnskTm90aWZpY2F0aW9uSUR9OwoKICAgICAgICAgICAgIyBmaWxsIG5vdGlmaWNhdGlvbiBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCb2R5Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk5hbWUgID0+ICROb3RpZmljYXRpb24tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UaXRsZSA9PiAkTm90aWZpY2F0aW9uLT57RGF0YX0tPntWaXNpYmxlRm9yQWdlbnRUb29sdGlwfS0+WzBdIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFZpc2libGVGb3JBZ2VudCAgID0+ICROb3RpZmljYXRpb24tPntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0tPlswXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBUUkFOU1BPUlQ6CiAgICAgICAgICAgIGZvciBteSAkVHJhbnNwb3J0TmFtZSAoCiAgICAgICAgICAgICAgICBzb3J0IHsgJFNlbGYtPntUcmFuc3BvcnRDb25maWd9LT57JGF9LT57UHJpb30gPD0+ICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfS0+eyRifS0+e1ByaW99IH0KICAgICAgICAgICAgICAgIGtleXMgJXsgJFNlbGYtPntUcmFuc3BvcnRDb25maWd9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIG15ICRJZGVudGlmaWVyID0gIk5vdGlmaWNhdGlvbi0kTm90aWZpY2F0aW9uSUQtJFRyYW5zcG9ydE5hbWUiOwoKICAgICAgICAgICAgICAgIG15ICRUcmFuc3BvcnRFbmFibGVkID0gZ3JlcCB7ICRfIGVxICRUcmFuc3BvcnROYW1lIH0gQHsgJE5vdGlmaWNhdGlvbi0+e0RhdGF9LT57VHJhbnNwb3J0c30gfTsKCiAgICAgICAgICAgICAgICBteSAkQWdlbnRFbmFibGVkQnlEZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgPSBncmVwIHsgJF8gZXEgJFRyYW5zcG9ydE5hbWUgfSBAeyAkTm90aWZpY2F0aW9uLT57RGF0YX0tPntBZ2VudEVuYWJsZWRCeURlZmF1bHR9IH07CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlciBwcmVmZXJlbmNlIGZvciB0aGlzIHRyYW5zcG9ydCBhbmQgbm90aWZpY2F0aW9uIG9yIGZhbGwgYmFjayB0bwogICAgICAgICAgICAgICAgIyAgIG5vdGlmaWNhdGlvbiBkZWZhdWx0IGlmIHRoZXJlIGlzIG5vIHVzZXIgcHJlZmVyZW5jZQogICAgICAgICAgICAgICAgbXkgJFVzZSA9ICRVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0LT57JElkZW50aWZpZXJ9IC8vICRBZ2VudEVuYWJsZWRCeURlZmF1bHQ7CgogICAgICAgICAgICAgICAgbXkgJENoZWNrZWQgICAgID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICAgICAgICAgIG15ICRIaWRkZW5WYWx1ZSA9IDE7CiAgICAgICAgICAgICAgICBpZiAoICEkVXNlICkgewogICAgICAgICAgICAgICAgICAgICRDaGVja2VkICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICRIaWRkZW5WYWx1ZSA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmaWxsIGVhY2ggdHJhbnNwb3J0IGNvbHVtbgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQm9keVRyYW5zcG9ydENvbHVtbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJFRyYW5zcG9ydEVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQm9keVRyYW5zcG9ydENvbHVtbkVuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk5hbWUgPT4gJE5vdGlmaWNhdGlvbi0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0TmFtZSAgICA9PiAkVHJhbnNwb3J0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgICAgICAgPT4gJElkZW50aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VkICAgICAgICAgID0+ICRDaGVja2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkZGVuVmFsdWUgICAgICA9PiAkSGlkZGVuVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdlbmVyYXRlIEhUTUwKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdQcmVmZXJlbmNlc05vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSByZXR1cm4gc3RydWN0dXJlIGZvciBnZW5lcmljICJPcHRpb24iIGJsb2NrIGluIEFnZW50UHJlZmVyZW5jZXMKICAgIHB1c2goCiAgICAgICAgQFBhcmFtcywKICAgICAgICB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQmxvY2sgPT4gJ1Jhd0hUTUwnLAogICAgICAgICAgICBIVE1MICA9PiAkT3V0cHV0LAogICAgICAgICAgICBOYW1lICA9PiAnTm90aWZpY2F0aW9uRXZlbnRUcmFuc3BvcnQnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAUGFyYW1zOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQElkZW50aWZpZXJMaXN0OwogICAgbXkgQE1hbmRhdG9yeU5vdGlmaWNhdGlvbklEczsKCiAgICBOT1RJRklDQVRJT046CiAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbklEICggc29ydCBrZXlzICV7ICRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0gfSApIHsKCiAgICAgICAgbmV4dCBOT1RJRklDQVRJT04gaWYgISRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0tPnskTm90aWZpY2F0aW9uSUR9OwoKICAgICAgICBteSAkTm90aWZpY2F0aW9uICAgICAgICAgID0gJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyROb3RpZmljYXRpb25JRH07CiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbk1hbmRhdG9yeSA9IDA7CiAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uLT57RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9ICYmICROb3RpZmljYXRpb24tPntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0tPlswXSA9PSAyICkgewogICAgICAgICAgICAkTm90aWZpY2F0aW9uTWFuZGF0b3J5ID0gMTsKICAgICAgICAgICAgcHVzaCBATWFuZGF0b3J5Tm90aWZpY2F0aW9uSURzLCAkTm90aWZpY2F0aW9uSUQ7CiAgICAgICAgfQoKICAgICAgICBUUkFOU1BPUlQ6CiAgICAgICAgZm9yIG15ICRUcmFuc3BvcnROYW1lICggc29ydCBrZXlzICV7ICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfSB9ICkgewogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhZ3JlcCB7ICRfIGVxICRUcmFuc3BvcnROYW1lIH0gQHsgJE5vdGlmaWNhdGlvbi0+e0RhdGF9LT57VHJhbnNwb3J0c30gfTsKICAgICAgICAgICAgcHVzaCBASWRlbnRpZmllckxpc3QsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICJOb3RpZmljYXRpb24tJE5vdGlmaWNhdGlvbklELSRUcmFuc3BvcnROYW1lIiwKICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbklEID0+ICROb3RpZmljYXRpb25JRCwKICAgICAgICAgICAgICAgIElzTWFuZGF0b3J5ICAgID0+ICROb3RpZmljYXRpb25NYW5kYXRvcnksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFVzZXJPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAlVXNlck5vdGlmaWNhdGlvblRyYW5zcG9ydDsKICAgIG15ICVNYW5kYXRvcnlGdWxmaWxsZWQ7CiAgICBmb3IgbXkgJElkZW50aWZpZXIgKEBJZGVudGlmaWVyTGlzdCkgewogICAgICAgICRVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0eyAkSWRlbnRpZmllci0+e05hbWV9IH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkSWRlbnRpZmllci0+e05hbWV9ICkgfHwgMDsKCiAgICAgICAgIyBjaGVjayBpZiB0aGlzIGlzIGEgbWFuZGF0b3J5IG5vdGlmaWNhdGlvbiBhbmQgdGhpcyB0cmFuc3BvcnQgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoICRVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0eyAkSWRlbnRpZmllci0+e05hbWV9IH0gPT0gMSApIHsKICAgICAgICAgICAgJE1hbmRhdG9yeUZ1bGZpbGxlZHsgJElkZW50aWZpZXItPntOb3RpZmljYXRpb25JRH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBub3cgY2hlY2sgaWYgdGhlcmUgYXJlIG5vdGlmaWNhdGlvbnMgZm9yIHdoaWNoIG5vIHRyYW5zcG9ydCBoYXMgYmVlbiBzZWxlY3RlZAogICAgZm9yIG15ICROb3RpZmljYXRpb25JRCAoQE1hbmRhdG9yeU5vdGlmaWNhdGlvbklEcykgewogICAgICAgIGlmICggJE1hbmRhdG9yeUZ1bGZpbGxlZHskTm90aWZpY2F0aW9uSUR9ICE9IDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57RXJyb3J9ID0gVHJhbnNsYXRhYmxlKAogICAgICAgICAgICAgICAgIlBsZWFzZSBtYWtlIHN1cmUgeW91J3ZlIGNob3NlbiBhdCBsZWFzdCBvbmUgdHJhbnNwb3J0IG1ldGhvZCBmb3IgbWFuZGF0b3J5IG5vdGlmaWNhdGlvbnMuIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWYWx1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkVuY29kZSgKICAgICAgICBEYXRhID0+IFwlVXNlck5vdGlmaWNhdGlvblRyYW5zcG9ydCwKICAgICk7CgogICAgIyB1cGRhdGUgdXNlciBwcmVmZXJlbmNlcwogICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdEZW1vU3lzdGVtJykgKSB7CiAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJEYXRhfS0+e1VzZXJJRH0sCiAgICAgICAgICAgIEtleSAgICA9PiAnQXBwb2ludG1lbnROb3RpZmljYXRpb25UcmFuc3BvcnQnLAogICAgICAgICAgICBWYWx1ZSAgPT4gJFZhbHVlIC8vICcnLAogICAgICAgICk7CiAgICB9CgogICAgJFNlbGYtPntNZXNzYWdlfSA9IFRyYW5zbGF0YWJsZSgnUHJlZmVyZW5jZXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkhJyk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e0Vycm9yfSB8fCAnJzsKfQoKc3ViIE1lc3NhZ2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntNZXNzYWdlfSB8fCAnJzsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIFRoaXMgaXMgYSBkdW1teSB0ZW1wbGF0ZSBmaWxlIGZvciB3b3JrYXJvdW5kIG9mIGJ1ZyMxMjM4NzoKIyBTZWUgaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjM4NyBmb3IgZGV0YWlscy4KClslIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQgcmVtaW5kZXIgbm90aWZpY2F0aW9uIikgfCBodG1sICVdClslIFRyYW5zbGF0ZSgiWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4iKSB8IGh0bWwgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8bGFiZWwgZm9yPSJSZWNpcGllbnRFbWFpbCI+WyUgVHJhbnNsYXRlKCJBZGRpdGlvbmFsIHJlY2lwaWVudCBlbWFpbCBhZGRyZXNzZXMiKSB8IGh0bWwgJV06IDwvbGFiZWw+CjxkaXYgY2xhc3M9IkZpZWxkIj4KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJSZWNpcGllbnRFbWFpbCIgaWQ9IlJlY2lwaWVudEVtYWlsIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfTWF4TGVuZ3RoIFslIERhdGEuUmVjaXBpZW50RW1haWxTZXJ2ZXJFcnJvciB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlJlY2lwaWVudEVtYWlsIHwgaHRtbCAlXSIgZGF0YS1tYXhsZW5ndGg9IjIwMCIvPgogICAgPGRpdiBpZD0iUmVjaXBpZW50RW1haWxFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBtdXN0IGhhdmUgbGVzcyB0aGVuIDIwMCBjaGFyYWN0ZXJzLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgIDxkaXYgaWQ9IlJlY2lwaWVudEVtYWlsU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgbXVzdCBoYXZlIGxlc3MgdGhlbiAyMDAgY2hhcmFjdGVycy4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8bGFiZWwgZm9yPSJUcmFuc3BvcnRFbWFpbFRlbXBsYXRlIj5bJSBUcmFuc2xhdGUoIkVtYWlsIHRlbXBsYXRlIikgfCBodG1sICVdOiA8L2xhYmVsPgo8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICBbJSBEYXRhLlRyYW5zcG9ydEVtYWlsVGVtcGxhdGVTdHJnICVdCiAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJVc2UgdGhpcyB0ZW1wbGF0ZSB0byBnZW5lcmF0ZSB0aGUgY29tcGxldGUgZW1haWwgKG9ubHkgZm9yIEhUTUwgZW1haWxzKS4iKSB8IGh0bWwgJV08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBTRVQgT1RSU0J1c2luZXNzTGFiZWwgPSAnPHN0cm9uZz5PVFJTIEJ1c2luZXNzIFNvbHV0aW9uPC9zdHJvbmc+4oSiJyAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXciKSAlXQo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50IikgfCBodG1sICVdPC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uTGlzdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkFkZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249QWRkIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPlslIFRyYW5zbGF0ZSgiQWRkIG5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1Ob3RpZmljYXRpb25FeHBvcnQiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWRvd25sb2FkIj48L2k+WyUgVHJhbnNsYXRlKCJFeHBvcnQgTm90aWZpY2F0aW9ucyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkFkZCIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkxpc3QiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25JbXBvcnQiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDb25maWd1cmF0aW9uIEltcG9ydCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkhlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0IFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ik5vdGlmaWNhdGlvbkltcG9ydCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iRmlsZVVwbG9hZCIgaWQ9IkZpbGVVcGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjE4IiBjbGFzcz0iRml4ZWQgVzEwMHBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuRmlsZVVwbG9hZEludmFsaWQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGaWxlVXBsb2FkRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRmlsZVVwbG9hZFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iU2VwYXJhdGVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJPdmVyd3JpdGVFeGlzdGluZ05vdGlmaWNhdGlvbnMiIG5hbWU9Ik92ZXJ3cml0ZUV4aXN0aW5nTm90aWZpY2F0aW9ucyIgdmFsdWU9IjEiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iT3ZlcndyaXRlRXhpc3RpbmdOb3RpZmljYXRpb25zIj5bJSBUcmFuc2xhdGUoIk92ZXJ3cml0ZSBleGlzdGluZyBub3RpZmljYXRpb25zPyIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlVwbG9hZCBOb3RpZmljYXRpb24gY29uZmlndXJhdGlvbiIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXVwbG9hZCI+PC9pPlslIFRyYW5zbGF0ZSgiSW1wb3J0IE5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25JbXBvcnQiKSAlXQogICAgPC9kaXY+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkxpc3QiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcyMHBjIj5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiRXhwb3J0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIFcxMHBjIj5bJSBUcmFuc2xhdGUoIkNvcHkiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdSZXN1bHRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgWyUgSUYgRGF0YS5WYWxpZElEICE9IDElXWNsYXNzPSJJbnZhbGlkIlslIEVORCAlXT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249Q2hhbmdlO0lEPVslIERhdGEuSUQgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHRpdGxlPSJbJSBEYXRhLkNvbW1lbnQgfCBodG1sICVdIj5bJSBEYXRhLkNvbW1lbnQgfCB0cnVuY2F0ZSgyNikgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5WYWxpZCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLkNoYW5nZVRpbWUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+PGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPU5vdGlmaWNhdGlvbkV4cG9ydDtJRD1bJSBEYXRhLklEIHwgdXJpICVdO1slIEVudigiQ2hhbGxlbmdlVG9rZW5QYXJhbSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWRvd25sb2FkIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiRXhwb3J0IikgfCBodG1sICVdPC9zcGFuPjwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1Ob3RpZmljYXRpb25Db3B5O0lEPVslIERhdGEuSUQgfCB1cmkgJV07WyUgRW52KCJDaGFsbGVuZ2VUb2tlblBhcmFtIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY29weSI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkNvcHkiKSB8IGh0bWwgJV08L3NwYW4+PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IlRyYXNoQ2FuIE5vdGlmaWNhdGlvbkRlbGV0ZSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPURlbGV0ZTtJRD1bJSBEYXRhLklEIHwgdXJpICVdO1slIEVudigiQ2hhbGxlbmdlVG9rZW5QYXJhbSIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIHRoaXMgbm90aWZpY2F0aW9uIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSZXN1bHRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcuTm90aWZpY2F0aW9uRGVsZXRlJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKCiAgICBpZiAod2luZG93LmNvbmZpcm0oWyUgVHJhbnNsYXRlKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgbm90aWZpY2F0aW9uPyIpIHwgSlNPTiAlXSkpIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkKHRoaXMpLmF0dHIoJ2hyZWYnKTsKICAgIH0KCiAgICAvLyBkb24ndCBpbnRlcmZlcmUgd2l0aCBNYXN0ZXJBY3Rpb24KICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIHJldHVybiBmYWxzZTsKfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1Jlc3VsdCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1VwZGF0ZSIpICVdCgogICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUiIG5hbWU9ImNvbXBvc2UiIGlkPSJOb3RpZmljYXRpb25FdmVudCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFkZCBOb3RpZmljYXRpb24iKSB8IGh0bWwgJV08L2gyPgpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyQWRkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRWRpdCBOb3RpZmljYXRpb24iKSB8IGh0bWwgJV08L2gyPgpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iWyUgRGF0YS5BY3Rpb24gfCB1cmkgJV1BY3Rpb24iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJRCIgdmFsdWU9IlslIERhdGEuSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmFtZSIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgaWQ9Ik5hbWUiIHZhbHVlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5OYW1lU2VydmVyRXJyb3IgJV0iIG1heGxlbmd0aD0iMjAwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDb21tZW50Ij5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDb21tZW50IiBpZD0iQ29tbWVudCIgdmFsdWU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIyNTAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWaXNpYmxlRm9yQWdlbnQiPlslIFRyYW5zbGF0ZSgiU2hvdyBpbiBhZ2VudCBwcmVmZXJlbmNlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WaXNpYmxlRm9yQWdlbnRTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWaXNpYmxlRm9yQWdlbnRUb29sdGlwIj5bJSBUcmFuc2xhdGUoIkFnZW50IHByZWZlcmVuY2VzIHRvb2x0aXAiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJWaXNpYmxlRm9yQWdlbnRUb29sdGlwIiBpZD0iVmlzaWJsZUZvckFnZW50VG9vbHRpcCIgY2xhc3M9Ilc1MHBjIiB2YWx1ZT0iWyUgRGF0YS5WaXNpYmxlRm9yQWdlbnRUb29sdGlwIHwgaHRtbCAlXSIgWyUgRGF0YS5WaXNpYmxlRm9yQWdlbnRUb29sdGlwUmVhZG9ubHkgJV0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiVGhpcyBtZXNzYWdlIHdpbGwgYmUgc2hvd24gb24gdGhlIGFnZW50IHByZWZlcmVuY2VzIHNjcmVlbiBhcyBhIHRvb2x0aXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPlslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIHRoaXMgd2lkZ2V0IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFdmVudHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRXZlbnRzIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkV2ZW50IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkV2ZW50c1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkV2ZW50c0Vycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRXZlbnRzU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCBDb2xsYXBzZWQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIHRoaXMgd2lkZ2V0IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBcHBvaW50bWVudCBGaWx0ZXIiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdVcGRhdGVUeXBlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVHlwZUlEIj5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZXNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1VwZGF0ZVR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhcklEIj5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFyU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGl0bGUiPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgaWQ9IlRpdGxlIiBjbGFzcz0iVzc1cGMiIHZhbHVlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTG9jYXRpb24iPlslIFRyYW5zbGF0ZSgiTG9jYXRpb24iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJMb2NhdGlvbiIgaWQ9IkxvY2F0aW9uIiBjbGFzcz0iVzc1cGMiIHZhbHVlPSJbJSBEYXRhLkxvY2F0aW9uIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdVcGRhdGVUZWFtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGVhbUlEIj5bJSBUcmFuc2xhdGUoIlRlYW0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVGVhbVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3VXBkYXRlVGVhbSIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZXNvdXJjZUlEIj5bJSBUcmFuc2xhdGUoIlJlc291cmNlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc291cmNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIHRoaXMgd2lkZ2V0IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJSZWNpcGllbnRzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlY2lwaWVudHMiPlslIFRyYW5zbGF0ZSgiU2VuZCB0byIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZWNpcGllbnRzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjaXBpZW50QWdlbnRzIj5bJSBUcmFuc2xhdGUoIlNlbmQgdG8gdGhlc2UgYWdlbnRzIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY2lwaWVudEFnZW50c1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlY2lwaWVudEdyb3VwcyI+WyUgVHJhbnNsYXRlKCJTZW5kIHRvIGFsbCBncm91cCBtZW1iZXJzIChhZ2VudHMgb25seSkiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjaXBpZW50R3JvdXBzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjaXBpZW50Um9sZXMiPlslIFRyYW5zbGF0ZSgiU2VuZCB0byBhbGwgcm9sZSBtZW1iZXJzIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY2lwaWVudFJvbGVzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VuZE9uT3V0T2ZPZmZpY2UiPlslIFRyYW5zbGF0ZSgiU2VuZCBvbiBvdXQgb2Ygb2ZmaWNlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IlNlbmRPbk91dE9mT2ZmaWNlIiBpZD0iU2VuZE9uT3V0T2ZPZmZpY2UiIHZhbHVlPSIxIiBbJSBEYXRhLlNlbmRPbk91dE9mT2ZmaWNlQ2hlY2tlZCAlXSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBbHNvIHNlbmQgaWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IG91dCBvZiBvZmZpY2UuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPbmNlUGVyRGF5Ij5bJSBUcmFuc2xhdGUoIk9uY2UgcGVyIGRheSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJPbmNlUGVyRGF5IiBpZD0iT25jZVBlckRheSIgdmFsdWU9IjEiIFslIERhdGEuT25jZVBlckRheUNoZWNrZWQgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiBNZXRob2RzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgVHJhbnNwb3J0c0NvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZW5kIHRoaXMgbm90aWZpY2F0aW9uIHRvIGVhY2ggb2YgdGhlIHJlY2lwaWVudHMuIFBsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIG1ldGhvZCBiZWxvdy4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRyYW5zcG9ydFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBEYXRhLlRyYW5zcG9ydE5hbWUgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmFuc3BvcnRSb3dFbmFibGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVHJhbnNwb3J0WyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRW5hYmxlIHRoaXMgbm90aWZpY2F0aW9uIG1ldGhvZCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJUcmFuc3BvcnRzIiBpZD0iVHJhbnNwb3J0WyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdIiBjbGFzcz0iVmFsaWRhdGVfT25lQ2hlY2tlZCBbJSBEYXRhLlRyYW5zcG9ydHNTZXJ2ZXJFcnJvciAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVHJhbnNwb3J0IikgJV06IFslIFRyYW5zbGF0ZShEYXRhLlRyYW5zcG9ydCkgJV0iIFslIERhdGEuVHJhbnNwb3J0Q2hlY2tlZCAlXSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHJhbnNwb3J0WyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkF0IGxlYXN0IG9uZSBtZXRob2QgaXMgbmVlZGVkIHBlciBub3RpZmljYXRpb24uIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUcmFuc3BvcnRbJSBEYXRhLlRyYW5zcG9ydCB8IGh0bWwgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiQXQgbGVhc3Qgb25lIG1ldGhvZCBpcyBuZWVkZWQgcGVyIG5vdGlmaWNhdGlvbi4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdFslIERhdGEuVHJhbnNwb3J0IHwgaHRtbCAlXSIgY2xhc3M9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFjdGl2ZSBieSBkZWZhdWx0IGluIGFnZW50IHByZWZlcmVuY2VzIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBBZ2VudEVuYWJsZWRCeURlZmF1bHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJBZ2VudEVuYWJsZWRCeURlZmF1bHQiIGlkPSJBZ2VudEVuYWJsZWRCeURlZmF1bHRbJSBEYXRhLlRyYW5zcG9ydCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlRyYW5zcG9ydCB8IGh0bWwgJV0iICB0aXRsZT0iIiBbJSBEYXRhLkFnZW50RW5hYmxlZEJ5RGVmYXVsdENoZWNrZWQgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGFzc2lnbmVkIHJlY2lwaWVudCBhZ2VudHMgd2hvIGRpZG4ndCBtYWtlIGEgY2hvaWNlIGZvciB0aGlzIG5vdGlmaWNhdGlvbiBpbiB0aGVpciBwcmVmZXJlbmNlcyB5ZXQuIElmIHRoZSBib3ggaXMgZW5hYmxlZCwgdGhlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHNlbnQgdG8gc3VjaCBhZ2VudHMuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXR0aW5nc1N0cmluZyAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiVHJhbnNwb3J0Um93RW5hYmxlZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRyYW5zcG9ydFJvd0Rpc2FibGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyYW5zcG9ydFJvd0Rpc2FibGVkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJhbnNwb3J0Um93UmVjb21tZW5kYXRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBJbmZvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pbk9UUlNCdXNpbmVzcyIgY2xhc3M9IkJ1dHRvbiI+PGkgY2xhc3M9ImZhIGZhLWFuZ2xlLWRvdWJsZS11cCI+PC9pPiBbJSBUcmFuc2xhdGUoIlVwZ3JhZGUgdG8gJXMiLCBPVFJTQnVzaW5lc3NMYWJlbCkgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHJhbnNwb3J0Um93UmVjb21tZW5kYXRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyYW5zcG9ydFJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk5vRGF0YUZvdW5kTXNnVHJhbnNwb3J0IikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gbm90aWZpY2F0aW9uIG1ldGhvZCBmb3VuZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+ClslIFJlbmRlckJsb2NrRW5kKCJOb0RhdGFGb3VuZE1zZ1RyYW5zcG9ydCIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkFkZE1ldGhvZCgiVmFsaWRhdGVfT25lQ2hlY2tlZCIsIGZ1bmN0aW9uKFZhbHVlLCBFbGVtZW50KSB7CiAgICAgICAgaWYoJCgiLlZhbGlkYXRlX09uZUNoZWNrZWQ6Y2hlY2tib3g6Y2hlY2tlZCIpLmxlbmd0aCA+IDApewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkUnVsZSgiVmFsaWRhdGVfT25lQ2hlY2tlZCIsIHsKICAgICAgICBWYWxpZGF0ZV9PbmVDaGVja2VkOiB0cnVlCiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiBUZXh0IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MgPSJOb3RpZmljYXRpb25MYW5ndWFnZUNvbnRhaW5lciI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSaWNoVGV4dCIpICVdClslIEluc2VydFRlbXBsYXRlKCJSaWNoVGV4dEVkaXRvci50dCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJSaWNoVGV4dCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb3RpZmljYXRpb25MYW5ndWFnZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik5vdGlmaWNhdGlvbkxhbmd1YWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBTcGFjaW5nVG9wIFslIElGICFEYXRhLkxhbmd1YWdlICVdIENvbGxhcHNlZCBbJSBFTkQgJV0gIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IlRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuTGFuZ3VhZ2UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iV2FybmluZyI+J1slIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV0nICZtZGFzaDsgWyUgVHJhbnNsYXRlKCJUaGlzIGxhbmd1YWdlIGlzIG5vdCBwcmVzZW50IG9yIGVuYWJsZWQgb24gdGhlIHN5c3RlbS4gVGhpcyBub3RpZmljYXRpb24gdGV4dCBjb3VsZCBiZSBkZWxldGVkIGlmIGl0IGlzIG5vdCBuZWVkZWQgYW55bW9yZS4iKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm90aWZpY2F0aW9uTGFuZ3VhZ2VSZW1vdmVCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBZGRpdGlvbmFsSW5mb3JtYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdmFsdWU9IlJlbW92ZSBMYW5ndWFnZSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBMYW5ndWFnZVJlbW92ZSIgaWQ9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fTGFuZ3VhZ2VfUmVtb3ZlIiBocmVmPSIiIG5hbWU9IkRhdGEuTGFuZ3VhZ2VJRF9MYW5ndWFnZV9SZW1vdmUiPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBOb3RpZmljYXRpb24gTGFuZ3VhZ2UiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vdGlmaWNhdGlvbkxhbmd1YWdlUmVtb3ZlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTGFuZ3VhZ2VJRCIgY2xhc3M9Ikxhbmd1YWdlSUQiIHZhbHVlPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdIi8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9TdWJqZWN0IiBpZD0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9MYWJlbF9TdWJqZWN0IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9TdWJqZWN0IiBpZD0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9TdWJqZWN0IiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuU3ViamVjdFNlcnZlckVycm9yIHwgaHRtbCAlXSIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX1N1YmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fU3ViamVjdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0JvZHkiIGlkPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0xhYmVsX0JvZHkiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fQm9keSIgaWQ9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fQm9keSIgY2xhc3M9IlJpY2hUZXh0IFZhbGlkYXRlX1JlcXVpcmVkUmljaFRleHQgWyUgRGF0YS5Cb2R5U2VydmVyRXJyb3IgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNZXNzYWdlIGJvZHkiKSB8IGh0bWwgJV0iIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpICVdIj5bJSBEYXRhLkJvZHkgfCBodG1sICVdPC90ZXh0YXJlYT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9Cb2R5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0JvZHlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTm90aWZpY2F0aW9uTGFuZ3VhZ2UiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuIFRlbXBsYXRlIE5vdGlmaWNhdGlvbkxhbmd1YWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IlRpdGxlIj48L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBZGRpdGlvbmFsSW5mb3JtYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdmFsdWU9IlJlbW92ZSBMYW5ndWFnZSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBMYW5ndWFnZVJlbW92ZSIgaWQ9IlRlbXBsYXRlX0xhbmd1YWdlX1JlbW92ZSIgaHJlZj0iIiBuYW1lPSJUZW1wbGF0ZV9MYW5ndWFnZV9SZW1vdmUiPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBOb3RpZmljYXRpb24gTGFuZ3VhZ2UiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iIiBjbGFzcz0iTGFuZ3VhZ2VJRCIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGVtcGxhdGVfU3ViamVjdCIgaWQ9IlRlbXBsYXRlX0xhYmVsX1N1YmplY3QiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGVtcGxhdGVfU3ViamVjdCIgaWQ9IlRlbXBsYXRlX1N1YmplY3QiIHZhbHVlPSIiIGNsYXNzPSJXNzVwYyIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUZW1wbGF0ZV9TdWJqZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRlbXBsYXRlX0JvZHkiIGlkPSJUZW1wbGF0ZV9MYWJlbF9Cb2R5IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlRlbXBsYXRlX0JvZHkiIGNsYXNzPSIiIG5hbWU9IlRlbXBsYXRlX0JvZHkiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1lc3NhZ2UgYm9keSIpIHwgaHRtbCAlXSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgJV0iPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGVtcGxhdGVfQm9keUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJMYW5ndWFnZSI+WyUgVHJhbnNsYXRlKCJBZGQgbmV3IG5vdGlmaWNhdGlvbiBsYW5ndWFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhbmd1YWdlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYW5ndWFnZU9yaWdTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwpDb3JlLkFnZW50LkFkbWluLk5vdGlmaWNhdGlvbkV2ZW50LkluaXQoewogICAgTG9jYWxpemF0aW9uOiB7CiAgICAgICAgRGVsZXRlTm90aWZpY2F0aW9uTGFuZ3VhZ2VNc2c6IFslIFRyYW5zbGF0ZSgiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIG5vdGlmaWNhdGlvbiBsYW5ndWFnZT8iKSB8IEpTT04gJV0KICAgIH0KfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTYXZlIENoYW5nZXMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgIDwvZm9ybT4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AgQ29sbGFwc2VkIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlRhZyBSZWZlcmVuY2UiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4iKSB8IGh0bWwgJV08L3A+CgogICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJZb3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIHRhZ3MiKSB8IGh0bWwgJV06PC9wPgoKICAgICAgICAgICAgICAgIDxkbD4KICAgICAgICAgICAgICAgICAgICA8ZHQ+PGNvZGU+Jmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEVbMjBdJmd0OzwvY29kZT48L2R0PgogICAgICAgICAgICAgICAgICAgIDxkZD4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTX0FQUE9JTlRNRU5UXyomZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgICAgICAgICAgICAgICAgPGRkPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIChbJSBUcmFuc2xhdGUoIiBlLiBnLiIpIHwgaHRtbCAlXSA8Y29kZT4mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OywgJmx0O09UUlNfQVBQT0lOVE1FTlRfU1RBUlRUSU1FJmd0OywgJmx0O09UUlNfQVBQT0lOVE1FTlRfREVTQ1JJUFRJT04mZ3Q7PC9jb2RlPikuCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTX0NBTEVOREFSXyomZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgICAgICAgICAgICAgICAgPGRkPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIChbJSBUcmFuc2xhdGUoIiBlLiBnLiIpIHwgaHRtbCAlXSA8Y29kZT4mbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUklEJmd0OywgJmx0O09UUlNfQ0FMRU5EQVJfQ0FMRU5EQVJOQU1FJmd0OywgJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7PC9jb2RlPikuCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTXyomZ3Q7PC9jb2RlPiBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdIDxjb2RlPiZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfKiZndDs8L2NvZGU+PC9kdD4KICAgICAgICAgICAgICAgICAgICA8ZGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXR0cmlidXRlcyBvZiB0aGUgcmVjaXBpZW50IHVzZXIgZm9yIHRoZSBub3RpZmljYXRpb24iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgKFslIFRyYW5zbGF0ZSgiIGUuIGcuIikgfCBodG1sICVdIDxjb2RlPiZsdDtPVFJTX1VzZXJGdWxsbmFtZSZndDs8L2NvZGU+IFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0gPGNvZGU+Jmx0O09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF9Vc2VyRnVsbG5hbWUmZ3Q7PC9jb2RlPikuCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTX0NPTkZJR18qJmd0OzwvY29kZT48L2R0PgogICAgICAgICAgICAgICAgICAgIDxkZD4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDb25maWcgb3B0aW9ucyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAoWyUgVHJhbnNsYXRlKCIgZS4gZy4iKSB8IGh0bWwgJV0gPGNvZGU+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzwvY29kZT4pLgogICAgICAgICAgICAgICAgICAgIDwvZGQ+CiAgICAgICAgICAgICAgICA8L2RsPgoKICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkV4YW1wbGUgbm90aWZpY2F0aW9uIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3ViamVjdEV4YW1wbGUiPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTwvbGFiZWw+OgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3RFeGFtcGxlIiBpZD0iU3ViamVjdEV4YW1wbGUiIHZhbHVlPSJSZW1pbmRlcjogJmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEUmZ3Q7IiBzaXplPSI4MCIgbWF4bGVuZ3RoPSI4MCIgcmVhZG9ubHkgLz4KICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZXNwb25zZUV4YW1wbGUiPlslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXTwvbGFiZWw+OgogICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSByb3dzPSIxMiIgY29scz0iNzAiIG5hbWU9IlJlc3BvbnNlRXhhbXBsZSIgaWQ9IlJlc3BvbnNlRXhhbXBsZSIgcmVhZG9ubHk+CkhpICZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfVXNlckZpcnN0bmFtZSZndDssCgphcHBvaW50bWVudCAmcXVvdDsmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDsmcXVvdDsgaGFzIHJlYWNoZWQgaXRzIG5vdGlmaWNhdGlvbiB0aW1lLgoKRGVzY3JpcHRpb246ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0RFU0NSSVBUSU9OJmd0OwpMb2NhdGlvbjogJmx0O09UUlNfQVBQT0lOVE1FTlRfTE9DQVRJT04mZ3Q7CkNhbGVuZGFyOiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7ClN0YXJ0IGRhdGU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1NUQVJUVElNRSZndDsKRW5kIGRhdGU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0VORFRJTUUmZ3Q7CkFsbC1kYXk6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0FMTERBWSZndDsKUmVwZWF0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9SRUNVUlJJTkcmZ3Q7CgombHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OwoKLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7CiAgICAgICAgICAgICAgICA8L3RleHRhcmVhPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3VXBkYXRlIikgJV0KCiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCjxkaXYgY2xhc3M9Ik92ZXJ2aWV3Qm94IEFSSUFSb2xlTWFpbiBbJSBEYXRhLlZpZXcgfCBodG1sICVdIj4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkFnZW5kYSBPdmVydmlldyIpIHwgaHRtbCAlXTwvaDE+CgogICAgPGRpdiBjbGFzcz0iT3ZlcnZpZXdDb250cm9sIiBpZD0iT3ZlcnZpZXdDb250cm9sIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250cm9sUm93Ij4KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVyIikgJV0KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iVGFicyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkFjdGl2ZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXTtTdGFydD1bJSBEYXRhLlN0YXJ0IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtGaWx0ZXI9WyUgRGF0YS5GaWx0ZXIgfCB1cmkgJV07U3RhcnQ9WyUgRGF0YS5TdGFydCB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlckl0ZW0iKSAlXQogICAgICAgICAgICAgICAgPC91bD4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVyIikgJV0KCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQnV0dG9ucyBIZWFkZXJMZWZ0Ij4KWyUgSUYgRGF0YS5Nb2R1bGVQZXJtaXNzaW9ucy5BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UgJV0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlO1N1YmFjdGlvbj1PdmVydmlldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhbGVuZGFyLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJNYW5hZ2UgQ2FsZW5kYXJzIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFwcG9pbnRtZW50Q3JlYXRlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICA8YSBpZD0iQXBwb2ludG1lbnRDcmVhdGVCdXR0b24iIGhyZWY9IiMiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPiBbJSBUcmFuc2xhdGUoIkFkZCBBcHBvaW50bWVudCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJBcHBvaW50bWVudENyZWF0ZUJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkJ1dHRvbnMgSGVhZGVyUmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJUb2RheSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07RmlsdGVyPVslIERhdGEuRmlsdGVyIHwgdXJpICVdO1N0YXJ0PVslIERhdGEuU3RhcnQgfCB1cmkgJV07SnVtcD1QcmV2IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmEgZmEtY2hldnJvbi1sZWZ0Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXTtTdGFydD1bJSBEYXRhLlN0YXJ0IHwgdXJpICVdO0p1bXA9TmV4dCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZhIGZhLWNoZXZyb24tcmlnaHQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlckNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIERhdGEuSGVhZGVyVGl0bGUgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJXZWVrTnVtYmVyIj5bJSBEYXRhLkhlYWRlclRpdGxlQ1cgfCBodG1sICVdPC9zcGFuPjwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGlkPSJPdmVydmlld0JvZHkiIGNsYXNzPSJPdmVydmlldyBUaWNrZXRMaXN0Ij4KICAgIDx0YWJsZSBjbGFzcz0iVGFibGVTbWFsbCBOb0NlbGxzcGFjaW5nIj4KICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNvbG9yIikgfCBodG1sICVdIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGE+WyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIlRpdGxlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxhPlslIFRyYW5zbGF0ZSgiU3RhcnQgZGF0ZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIkVuZCBkYXRlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIgVzEwcGMiPgogICAgICAgICAgICAgICAgICAgIDxhPlslIFRyYW5zbGF0ZSgiQWxsLWRheSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIFcxMHBjIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIlJlcGVhdCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXBwb2ludG1lbnRHcm91cCIpICVdCiAgICAgICAgPHRib2R5PgogICAgICAgICAgICA8dHIgY2xhc3M9IkRhdGVEaXZpZGVyIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI4Ij5bJSBEYXRhLkN1cnJlbnREYXkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICA8L3Rib2R5PgogICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXBwb2ludG1lbnRBY3Rpb25Sb3ciKSAlXQogICAgICAgICAgICA8dHIgaWQ9IkFwcG9pbnRtZW50SURfWyUgRGF0YS5BcHBvaW50bWVudElEIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkZsYWdzIENlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCIgdGl0bGU9IlslIERhdGEuQ2FsZW5kYXJEYXRhLiR7RGF0YS5DYWxlbmRhcklEfS5DYWxlbmRhck5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNhbGVuZGFyQ29sb3IiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiBbJSBEYXRhLkNhbGVuZGFyRGF0YS4ke0RhdGEuQ2FsZW5kYXJJRH0uQ29sb3IgfCBodG1sICVdOyI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkNhbGVuZGFyRGF0YS4ke0RhdGEuQ2FsZW5kYXJJRH0uQ2FsZW5kYXJOYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJEYXRhLiR7RGF0YS5DYWxlbmRhcklEfS5DYWxlbmRhck5hbWUgfCB0cnVuY2F0ZSgyMSkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIiBkYXRhLWFwcG9pbnRtZW50LWlkPSJbJSBEYXRhLkFwcG9pbnRtZW50SUQgfCBodG1sICVdIiBocmVmPSIjIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpdGxlIHwgdHJ1bmNhdGUoMzYpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFydERhdGUgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuRW5kRGF0ZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5BbGxEYXkgPT0gMSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlllcyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlJlY3VycmluZyA9PSAxICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiWWVzIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuTm90aWZpY2F0aW9uRGF0ZSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5vdGlmaWNhdGlvbkRhdGUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXBwb2ludG1lbnRBY3Rpb25Sb3ciKSAlXQogICAgICAgIDwvdGJvZHk+ClslIFJlbmRlckJsb2NrRW5kKCJBcHBvaW50bWVudEdyb3VwIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXBwb2ludG1lbnROb0RhdGFSb3ciKSAlXQogICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjciPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gZGF0YSBmb3VuZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90Ym9keT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFwcG9pbnRtZW50Tm9EYXRhUm93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2FsZW5kYXJzTm90Rm91bmQiKSAlXQogICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjciPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICA8L3Rib2R5PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJzTm90Rm91bmQiKSAlXQogICAgPC90YWJsZT4KPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNMb2FkaW5nJywgWyUgVHJhbnNsYXRlKCJMb2FkaW5nLi4uIikgfCBKU09OICVdKTsKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyQWdlbmRhT3ZlcnZpZXcnLCB0cnVlKTsKCnZhciBQYXJhbXMgPSB7CiAgICBEaWFsb2dUZXh0OiB7CiAgICAgICAgRWRpdFRpdGxlOiBbJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VUaXRsZTogWyUgVHJhbnNsYXRlKCJUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VUZXh0OiBbJSBUcmFuc2xhdGUoIldvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyIpIHwgSlNPTiAlXSwKICAgICAgICBPY2N1cnJlbmNlQWxsOiBbJSBUcmFuc2xhdGUoIkFsbCBvY2N1cnJlbmNlcyIpIHwgSlNPTiAlXSwKICAgICAgICBPY2N1cnJlbmNlSnVzdFRoaXM6IFslIFRyYW5zbGF0ZSgiSnVzdCB0aGlzIG9jY3VycmVuY2UiKSB8IEpTT04gJV0KICAgIH0sCiAgICBDYWxsYmFja3M6IHsKICAgICAgICBFZGl0QWN0aW9uOiBbJSBEYXRhLkVkaXRBY3Rpb24gfCBKU09OICVdLAogICAgICAgIEVkaXRNYXNrU3ViYWN0aW9uOiBbJSBEYXRhLkVkaXRNYXNrU3ViYWN0aW9uIHwgSlNPTiAlXQogICAgfQp9OwoKJCgnI0FwcG9pbnRtZW50Q3JlYXRlQnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5PcGVuRWRpdERpYWxvZyhQYXJhbXMsIHsKICAgICAgICBTdGFydDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KFslIERhdGEuU3RhcnQgfCBKU09OICVdKS5hZGQoMSwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpLAogICAgICAgIEVuZDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KFslIERhdGEuU3RhcnQgfCBKU09OICVdKS5hZGQoMiwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpLAogICAgfSk7CgogICAgcmV0dXJuIGZhbHNlOwp9KTsKJCgnLk1hc3RlckFjdGlvbicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICB2YXIgJE1hc3RlckFjdGlvbkxpbmsgPSAkKHRoaXMpLmZpbmQoJy5NYXN0ZXJBY3Rpb25MaW5rJyksCiAgICAgICAgQXBwb2ludG1lbnRJRCA9ICRNYXN0ZXJBY3Rpb25MaW5rLmRhdGEoJ2FwcG9pbnRtZW50SWQnKTsKCiAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuT3BlbkVkaXREaWFsb2coUGFyYW1zLCB7CiAgICAgICAgQ2FsRXZlbnQ6IHsKICAgICAgICAgICAgaWQ6IEFwcG9pbnRtZW50SUQKICAgICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gZmFsc2U7Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KCiAgICA8aDEgY2xhc3M9IkhlYWRlciI+WyUgVHJhbnNsYXRlKCJBcHBvaW50bWVudCBJbXBvcnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBY3Rpb25zIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBJRiBEYXRhLk1vZHVsZVBlcm1pc3Npb25zLkFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSAlXQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJCYWNrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkdvIGJhY2siKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWxlZnQiPjwvaT5bJSBUcmFuc2xhdGUoIkdvIGJhY2siKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlVwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0ICdjcmVhdGUnIHBlcm1pc3Npb25zLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJJbXBvcnQgQXBwb2ludG1lbnRzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkltcG9ydCIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRmlsZVVwbG9hZCIgY2xhc3M9Ik1hbmRhdG9yeSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlVwbG9hZCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iRmlsZVVwbG9hZCIgaWQ9IkZpbGVVcGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjE4IiBjbGFzcz0iRml4ZWQgVzEwMHBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuRmlsZVVwbG9hZEludmFsaWQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGaWxlVXBsb2FkRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRmlsZVVwbG9hZFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhcklEIiBjbGFzcz0iTWFuZGF0b3J5Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DYWxlbmRhciAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVXBkYXRlRXhpc3RpbmdBcHBvaW50bWVudHMiPlslIFRyYW5zbGF0ZSgiVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8iKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJVcGRhdGVFeGlzdGluZ0FwcG9pbnRtZW50cyIgaWQ9IlVwZGF0ZUV4aXN0aW5nQXBwb2ludG1lbnRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiVXBsb2FkIGNhbGVuZGFyIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkltcG9ydCBhcHBvaW50bWVudHMiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KCiAgICA8aDEgY2xhc3M9IkhlYWRlciI+WyUgVHJhbnNsYXRlKCJDYWxlbmRhciBNYW5hZ2VtZW50IikgfCBodG1sICVdPC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KWyUgSUYgRW52KCJTdWJhY3Rpb24iKSA9PSAiT3ZlcnZpZXciICVdClslIElGIERhdGEuTW9kdWxlUGVybWlzc2lvbnMuQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJCYWNrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiR28gYmFjayIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gYmFjayIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIEVORCAlXQpbJSBFTFNJRiBFbnYoIlN1YmFjdGlvbiIpICE9ICIiICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iQmFjayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJHbyBiYWNrIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1sZWZ0Ij48L2k+WyUgVHJhbnNsYXRlKCJHbyBiYWNrIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgRUxTRSAlXQpbJSBJRiBEYXRhLk1vZHVsZVBlcm1pc3Npb25zLkFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3ICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iT3ZlcnZpZXciIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDYWxlbmRhciBPdmVydmlldyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FsZW5kYXIiPjwvaT5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIE92ZXJ2aWV3IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgRU5EICVdClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNYWluQWN0aW9ucyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iQWRkIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlO1N1YmFjdGlvbj1OZXciIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQWRkIG5ldyBDYWxlbmRhciIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT5bJSBUcmFuc2xhdGUoIkFkZCBDYWxlbmRhciIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIElGIERhdGEuTW9kdWxlUGVybWlzc2lvbnMuQWdlbnRBcHBvaW50bWVudEltcG9ydCAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KWyUgSUYgRGF0YS5WYWxpZENvdW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJJbXBvcnRBcHBvaW50bWVudHMiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50SW1wb3J0IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkltcG9ydCBBcHBvaW50bWVudHMiKSB8IGh0bWwgJV0iPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJJbXBvcnRBcHBvaW50bWVudHMiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciBEaXNhYmxlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSW1wb3J0IEFwcG9pbnRtZW50cyIpIHwgaHRtbCAlXSI+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXVwbG9hZCI+PC9pPlslIFRyYW5zbGF0ZSgiSW1wb3J0IEFwcG9pbnRtZW50cyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiTWFpbkFjdGlvbnMiKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkltcG9ydCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIEltcG9ydCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkhlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0IFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkNhbGVuZGFySW1wb3J0Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJGaWxlVXBsb2FkIiBpZD0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iMTgiIGNsYXNzPSJGaXhlZCBXMTAwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5GaWxlVXBsb2FkSW52YWxpZCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpbGVVcGxvYWRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGaWxlVXBsb2FkU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzSW1wb3J0IiBuYW1lPSJPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzIiB2YWx1ZT0iMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzSW1wb3J0Ij5bJSBUcmFuc2xhdGUoIk92ZXJ3cml0ZSBleGlzdGluZyBlbnRpdGllcyIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIgU3BhY2luZ1RvcCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXVwbG9hZCI+PC9pPlslIFRyYW5zbGF0ZSgiSW1wb3J0IENhbGVuZGFyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25JbXBvcnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhckZpbHRlciIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj48bGFiZWwgZm9yPSJGaWx0ZXJDYWxlbmRhcnMiPlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBjYWxlbmRhcnMiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyQ2FsZW5kYXJzIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlckNhbGVuZGFycyIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBjYWxlbmRhcnMiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyRmlsdGVyIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRGVzY3JpcHRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk1vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlJlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSIgaWQ9IlVzZXIiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkdyb3VwIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNoYW5nZWQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJFeHBvcnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiRG93bmxvYWQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiVVJMIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2FsZW5kYXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHJbJSBJRiBEYXRhLlZhbGlkSUQgIT0gMSAlXSBjbGFzcz0iSW52YWxpZCJbJSBFTkQgJV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkZsYWdzIENlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCIgdGl0bGU9IlslIERhdGEuQ2FsZW5kYXJOYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDYWxlbmRhckNvbG9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogWyUgRGF0YS5Db2xvciB8IGh0bWwgJV07Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U7U3ViYWN0aW9uPUVkaXQ7Q2FsZW5kYXJJRD1bJSBEYXRhLkNhbGVuZGFySUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuR3JvdXAgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5WYWxpZCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLkNoYW5nZVRpbWUgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLkNyZWF0ZVRpbWUgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iRXhwb3J0TGluayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZTtTdWJhY3Rpb249Q2FsZW5kYXJFeHBvcnQ7Q2FsZW5kYXJJRD1bJSBEYXRhLkNhbGVuZGFySUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkV4cG9ydCBjYWxlbmRhciIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1kb3dubG9hZCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJFeHBvcnQgY2FsZW5kYXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KIyBVc2UgYW1wZXJzYW5kcyAoJikgaW5zdGVhZCBvZiBzZW1pY29sb25zICg7KSBmb3IgVVJMIHBhcmFtZXRlciBkZWxpbWl0ZXIuIFRoaXMgaGFzIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggZGlmZmVyZW50CiMgICBjYWxlbmRhciBpbXBsZW1lbnRhdGlvbnMgYW5kIHdpbGwgcHJldmVudCB0aGVtIGZyb20gcmUtZW5jb2RpbmcgdGhlIHF1ZXJ5IHN0cmluZyBhbmQgZXNzZW50aWFsbHkgc3RyaXAgdGhlIGRhdGEuCiMgICBQbGVhc2Ugc2VlIGJ1ZyMxMjY2NyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iRG93bmxvYWRMaW5rIiBocmVmPSJbJSBDb25maWcoIkh0dHBUeXBlIikgJV06Ly9bJSBDb25maWcoIkZRRE4iKSAlXS9bJSBDb25maWcoIlNjcmlwdEFsaWFzIikgJV1wdWJsaWMucGw/QWN0aW9uPVB1YmxpY0NhbGVuZGFyJkNhbGVuZGFySUQ9WyUgRGF0YS5DYWxlbmRhcklEIHwgdXJpICVdJlVzZXI9WyUgRW52KCJVc2VyTG9naW4iKSB8IHVyaSAlXSZUb2tlbj1bJSBEYXRhLkFjY2Vzc1Rva2VuIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEb3dubG9hZCBjYWxlbmRhciIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jbG91ZC1kb3dubG9hZCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJEb3dubG9hZCBjYWxlbmRhciIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IklubGluZUJ1dHRvbiBDb3B5VG9DbGlwYm9hcmQiIGRhdGEtY2xpcGJvYXJkLXRleHQ9IlslIENvbmZpZygiSHR0cFR5cGUiKSAlXTovL1slIENvbmZpZygiRlFETiIpICVdL1slIENvbmZpZygiU2NyaXB0QWxpYXMiKSAlXXB1YmxpYy5wbD9BY3Rpb249UHVibGljQ2FsZW5kYXImQ2FsZW5kYXJJRD1bJSBEYXRhLkNhbGVuZGFySUQgfCB1cmkgJV0mVXNlcj1bJSBFbnYoIlVzZXJMb2dpbiIpIHwgdXJpICVdJlRva2VuPVslIERhdGEuQWNjZXNzVG9rZW4gfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNvcHkgcHVibGljIGNhbGVuZGFyIFVSTCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jbGlwYm9hcmQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2FsZW5kYXJOb0RhdGFSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyTm9EYXRhUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJGaWx0ZXJNZXNzYWdlIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iOSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDsiPlslIFRyYW5zbGF0ZSgiTm8gbWF0Y2hlcyBmb3VuZC4iKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNGaWx0ZXJDYWxlbmRhcnMnKSwgJCgnI1VzZXInKSk7CgogICAgdmFyIENsaXBib2FyZEpTID0gbmV3IENsaXBib2FyZCgnLkNvcHlUb0NsaXBib2FyZCcpOwogICAgQ2xpcGJvYXJkSlMub24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKEV2ZW50LnRyaWdnZXIpLmhpZGUoKQogICAgICAgICAgICAuZmFkZUluKCk7CiAgICAgICAgRXZlbnQuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH0pOwoKICAgIENsaXBib2FyZEpTLm9uKCdlcnJvcicsIGZ1bmN0aW9uKEV2ZW50KSB7CiAgICAgICAgQ29yZS5Gb3JtLkVycm9yVG9vbHRpcHMuSW5pdFRvb2x0aXAoJChFdmVudC50cmlnZ2VyKSwgJ1ByZXNzIEN0cmwrQyAoQ21kK0MpIHRvIGNvcHkgdG8gY2xpcGJvYXJkJyk7CiAgICAgICAgJChFdmVudC50cmlnZ2VyKS5mb2N1cygpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhckVkaXQiKSAlXQogICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJDYWxlbmRhckZyb20iIGlkPSJDYWxlbmRhckZyb20iIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iWyUgRGF0YS5TdWJhY3Rpb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhbGVuZGFySUQiIHZhbHVlPSJbJSBEYXRhLkNhbGVuZGFySUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoRGF0YS5UaXRsZSkgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhbGVuZGFyTmFtZSIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDYWxlbmRhciBuYW1lIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkNhbGVuZGFyTmFtZSIgbmFtZT0iQ2FsZW5kYXJOYW1lIiB2YWx1ZT0iWyUgRGF0YS5DYWxlbmRhck5hbWUgfCBodG1sICVdIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJWYWxpZGF0ZV9SZXF1aXJlZCBXNTBwYyBbJSBEYXRhLkNhbGVuZGFyTmFtZUludmFsaWQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJOYW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBJRiBEYXRhLkNhbGVuZGFyTmFtZUV4aXN0cyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvbG9yIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkNvbG9yIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkNvbG9yIiBuYW1lPSJDb2xvciIgdmFsdWU9IlslIERhdGEuQ29sb3IgfCBodG1sICVdIiBjbGFzcz0iVmFsaWRhdGVfUmVxdWlyZWQgVzUwcGMiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDb2xvckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikdyb3VwSUQiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUGVybWlzc2lvbiBncm91cCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Hcm91cElEICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWxpZElEIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZhbGlkSUQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgWyUgRGF0YS5XaWRnZXRTdGF0dXMgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiVGlja2V0IEFwcG9pbnRtZW50cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRBcHBvaW50bWVudFJ1bGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBpZD0iUnVsZV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV0iIGNsYXNzPSJUYWJsZUxpa2UgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlJ1bGUiKSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9IlJ1bGVOdW1iZXIiPlslIERhdGEuUnVsZU51bWJlciB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIHRoaXMgZW50cnkiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXJ0RGF0ZV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdGFydCBkYXRlIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXJ0RGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkVuZERhdGVfWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRW5kIGRhdGUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRW5kRGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUXVldWVJRF9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV0iIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUXVldWVzIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlF1ZXVlSURTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJRdWV1ZUlEX1slIERhdGEuUnVsZUlEIHwgaHRtbCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlF1ZXVlSURfWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlYXJjaFBhcmFtc19bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTZWFyY2ggYXR0cmlidXRlcyIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU2VhcmNoUGFyYW1zQ29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU2VhcmNoUGFyYW1zU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFkZEJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQWRkIGVudHJ5IikgfCBodG1sICVdIiBocmVmPSIjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkFkZCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnRSdWxlU2VhcmNoUGFyYW0iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZWFyY2hQYXJhbV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV1fWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKENvbmZpZygiQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbSIpLiR7RGF0YS5QYXJhbU5hbWV9KSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlBhcmFtU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUGFyYW1TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iU2VhcmNoUGFyYW1fWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdX1slIERhdGEuUGFyYW1OYW1lIHwgaHRtbCAlXSIgbmFtZT0iU2VhcmNoUGFyYW1fWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdX1slIERhdGEuUGFyYW1OYW1lIHwgaHRtbCAlXSIgZGF0YS1wYXJhbT0iWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdIiB0eXBlPSJ0ZXh0IiBjbGFzcz0iU2VhcmNoUGFyYW0gVmFsaWRhdGVfUmVxdWlyZWQgVzI1cGMiIHZhbHVlPSJbJSBEYXRhLlBhcmFtVmFsdWUgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VhcmNoUGFyYW1fWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdX1slIERhdGEuUGFyYW1OYW1lIHwgaHRtbCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRBcHBvaW50bWVudFJ1bGVTZWFyY2hQYXJhbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50UnVsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkRlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IkFkZFJ1bGVCdXR0b24iIGNsYXNzPSJDYWxsRm9yQWN0aW9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBZGQgZW50cnkiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBZGQgUnVsZSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSAiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHZhbHVlPSJTYXZlIiB0eXBlPSJzdWJtaXQiIGlkPSJTdWJtaXQiIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGlkPSJUaWNrZXRBcHBvaW50bWVudFJ1bGVzVGVtcGxhdGUiIGNsYXNzPSJIaWRkZW4iPgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgIDxsZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUnVsZSIpIHwgaHRtbCAlXSA8c3BhbiBjbGFzcz0iUnVsZU51bWJlciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvbGVnZW5kPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhcnREYXRlIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlN0YXJ0IGRhdGUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhcnREYXRlU3RyZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJFbmREYXRlIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkVuZCBkYXRlIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkVuZERhdGVTdHJnICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJRdWV1ZUlEIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUXVldWVzIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlF1ZXVlSURTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUXVldWVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VhcmNoUGFyYW1zIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNlYXJjaCBhdHRyaWJ1dGVzIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNlYXJjaFBhcmFtc0NvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZWFyY2hQYXJhbXNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFkZEJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQWRkIGVudHJ5IikgfCBodG1sICVdIiBocmVmPSIjIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQWRkIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IlRpY2tldEFwcG9pbnRtZW50U2VhcmNoUGFyYW1UZW1wbGF0ZSIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZWFyY2hQYXJhbSIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlNlYXJjaFBhcmFtVXNlciAlXQogICAgICAgICAgICAgICAgPGlucHV0IGlkPSJTZWFyY2hQYXJhbSIgbmFtZT0iU2VhcmNoUGFyYW0iIHR5cGU9InRleHQiIGNsYXNzPSJWYWxpZGF0ZV9SZXF1aXJlZCIgLz4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlYXJjaFBhcmFtRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIHRoaXMgZW50cnkiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZS5Jbml0VGlja2V0QXBwb2ludG1lbnRzKFslIERhdGEuUnVsZUNvdW50IHwgSlNPTiAlXSk7ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEFwcG9pbnRtZW50UnVsZUluaXQiKSAlXQpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlLkluaXRUaWNrZXRBcHBvaW50bWVudFJ1bGUoWyUgRGF0YS5SdWxlSUQgfCBKU09OICVdLCAkKCcjUnVsZV8nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoWyUgRGF0YS5SdWxlSUQgfCBKU09OICVdKSkpOwpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QXBwb2ludG1lbnRSdWxlSW5pdCIpICVdCiQoJ2lucHV0I0NvbG9yJykuc3BlY3RydW0oewogICAgY29sb3I6IFslIERhdGEuQ29sb3IgfCBKU09OICVdLAogICAgY29udGFpbmVyQ2xhc3NOYW1lOiAnQ29sb3JQYWxldHRlQ29udGFpbmVyJywKICAgIGhpZGVBZnRlclBhbGV0dGVTZWxlY3Q6IHRydWUsCiAgICBwcmVmZXJyZWRGb3JtYXQ6ICdoZXgnLAogICAgcmVwbGFjZXJDbGFzc05hbWU6ICdDb2xvclBhbGV0dGVCdXR0b24nLAogICAgc2hvd0lucHV0OiB0cnVlLAogICAgc2hvd1BhbGV0dGU6IHRydWUsCiAgICBzaG93UGFsZXR0ZU9ubHk6IHRydWUsCiAgICBzaG93U2VsZWN0aW9uUGFsZXR0ZTogZmFsc2UsCiAgICB0b2dnbGVQYWxldHRlT25seTogdHJ1ZSwKICAgIHRvZ2dsZVBhbGV0dGVNb3JlVGV4dDogWyUgVHJhbnNsYXRlKCJNb3JlIikgfCBKU09OICVdLAogICAgdG9nZ2xlUGFsZXR0ZUxlc3NUZXh0OiBbJSBUcmFuc2xhdGUoIkxlc3MiKSB8IEpTT04gJV0sCiAgICBjaG9vc2VUZXh0OiBbJSBUcmFuc2xhdGUoIkNvbmZpcm0iKSB8IEpTT04gJV0sCiAgICBjYW5jZWxUZXh0OiBbJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgSlNPTiAlXSwKICAgIHBhbGV0dGU6IFsKICAgICAgICAnWyUgRGF0YS5Db2xvclBhbGV0dGUuam9pbigiJywnIikgJV0nCiAgICBdCn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyRWRpdCIpICVdCiAgICA8L2Rpdj4KPC9kaXY+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIE92ZXJ2aWV3IikgfCBodG1sICVdPC9oMT4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBFbnYoIlVzZXJDaGFsbGVuZ2VUb2tlbiIpICVdIiBuYW1lPSJDaGFsbGVuZ2VUb2tlbiIgaWQ9IkNoYWxsZW5nZVRva2VuIiAvPgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBJRiBEYXRhLk1vZHVsZVBlcm1pc3Npb25zLkFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXT9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlO1N1YmFjdGlvbj1PdmVydmlldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jYWxlbmRhci1vIj48L2k+WyUgVHJhbnNsYXRlKCJNYW5hZ2UgQ2FsZW5kYXJzIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFwcG9pbnRtZW50Q3JlYXRlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJBcHBvaW50bWVudENyZWF0ZUJ1dHRvbiIgaHJlZj0iIyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBZGQgbmV3IEFwcG9pbnRtZW50IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPlslIFRyYW5zbGF0ZSgiQWRkIEFwcG9pbnRtZW50IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFwcG9pbnRtZW50Q3JlYXRlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhcldpZGdldCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNhbGVuZGFycyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyQ2FsZW5kYXJzIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlckNhbGVuZGFycyIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBjYWxlbmRhcnMiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUgU3BhY2luZ1RvcFNtYWxsIiBpZD0iQ2FsZW5kYXJzIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzEwcGMiPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcxMHBjIj48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJVUkwiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhclN3aXRjaCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iQ2FsZW5kYXJTd2l0Y2giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IkNhbGVuZGFyWyUgRGF0YS5DYWxlbmRhcklEIHwgaHRtbCAlXSIgbmFtZT0iQ2FsZW5kYXJbJSBEYXRhLkNhbGVuZGFySUQgfCBodG1sICVdIiBkYXRhLWlkPSJbJSBEYXRhLkNhbGVuZGFySUQgfCBodG1sICVdIiBbJSBEYXRhLkNoZWNrZWQgJV0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iRmxhZ3MgQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhclslIERhdGEuQ2FsZW5kYXJJRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIiB0aXRsZT0iWyUgRGF0YS5DYWxlbmRhck5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDYWxlbmRhckNvbG9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogWyUgRGF0YS5Db2xvciB8IGh0bWwgJV07Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhbGVuZGFyWyUgRGF0YS5DYWxlbmRhcklEIHwgaHRtbCAlXSIgdGl0bGU9IlslIERhdGEuQ2FsZW5kYXJOYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJOYW1lIHwgdHJ1bmNhdGUoMjEpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgojIFVzZSBhbXBlcnNhbmRzICgmKSBpbnN0ZWFkIG9mIHNlbWljb2xvbnMgKDspIGZvciBVUkwgcGFyYW1ldGVyIGRlbGltaXRlci4gVGhpcyBoYXMgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBkaWZmZXJlbnQKIyAgIGNhbGVuZGFyIGltcGxlbWVudGF0aW9ucyBhbmQgd2lsbCBwcmV2ZW50IHRoZW0gZnJvbSByZS1lbmNvZGluZyB0aGUgcXVlcnkgc3RyaW5nIGFuZCBlc3NlbnRpYWxseSBzdHJpcCB0aGUgZGF0YS4KIyAgIFBsZWFzZSBzZWUgYnVnIzEyNjY3IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDb3B5VG9DbGlwYm9hcmQgSW5saW5lQnV0dG9uIiBkYXRhLWNsaXBib2FyZC10ZXh0PSJbJSBDb25maWcoIkh0dHBUeXBlIikgJV06Ly9bJSBDb25maWcoIkZRRE4iKSAlXS9bJSBDb25maWcoIlNjcmlwdEFsaWFzIikgJV1wdWJsaWMucGw/QWN0aW9uPVB1YmxpY0NhbGVuZGFyJkNhbGVuZGFySUQ9WyUgRGF0YS5DYWxlbmRhcklEIHwgdXJpICVdJlVzZXI9WyUgRW52KCJVc2VyTG9naW4iKSB8IHVyaSAlXSZUb2tlbj1bJSBEYXRhLkFjY2Vzc1Rva2VuIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2xpcGJvYXJkIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkNvcHkgcHVibGljIGNhbGVuZGFyIFVSTCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJTd2l0Y2giKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkZpbHRlck1lc3NhZ2UgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij5bJSBUcmFuc2xhdGUoIk5vIG1hdGNoZXMgZm91bmQuIikgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLlVJLlRhYmxlLkluaXRUYWJsZUZpbHRlcigkKCcjRmlsdGVyQ2FsZW5kYXJzJyksICQoJyNDYWxlbmRhcnMnKSk7CgogICAgdmFyIENsaXBib2FyZEpTID0gbmV3IENsaXBib2FyZCgnLkNvcHlUb0NsaXBib2FyZCcpOwogICAgQ2xpcGJvYXJkSlMub24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKEV2ZW50LnRyaWdnZXIpLmhpZGUoKQogICAgICAgICAgICAuZmFkZUluKCk7CiAgICAgICAgRXZlbnQuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH0pOwoKICAgIENsaXBib2FyZEpTLm9uKCdlcnJvcicsIGZ1bmN0aW9uKEV2ZW50KSB7CiAgICAgICAgQ29yZS5Gb3JtLkVycm9yVG9vbHRpcHMuSW5pdFRvb2x0aXAoJChFdmVudC50cmlnZ2VyKSwgJ1ByZXNzIEN0cmwrQyAoQ21kK0MpIHRvIGNvcHkgdG8gY2xpcGJvYXJkJyk7CiAgICAgICAgJChFdmVudC50cmlnZ2VyKS5mb2N1cygpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJXaWRnZXQiKSAlXQogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIENhbGVuZGFyV2lkZ2V0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvbk1lbnUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBTZXR0aW5ncyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJDYWxlbmRhclNldHRpbmdzQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXR0aW5ncyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY29nIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vQ2FsZW5kYXIiKSAlXQogICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9DYWxlbmRhciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhckRpdiIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogWyUgRGF0YS5DYWxlbmRhcldpZHRoIHwgaHRtbCAlXSU7IG1hcmdpbjogMCBhdXRvOyB6LWluZGV4OiAxMDsiIGlkPSJjYWxlbmRhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDYWxlbmRhckRpdiIpICVdCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zTG9hZGluZycsIFslIFRyYW5zbGF0ZSgiTG9hZGluZy4uLiIpIHwgSlNPTiAlXSk7CkNvcmUuQ29uZmlnLlNldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1Rvb01hbnlDYWxlbmRhcnNIZWFkbGluZScsIFslIFRyYW5zbGF0ZSgiVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyIpIHwgSlNPTiAlXSk7CkNvcmUuQ29uZmlnLlNldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1Rvb01hbnlDYWxlbmRhcnNUZXh0JywgWyUgVHJhbnNsYXRlKCJQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uIikgfCBKU09OICVdKTsKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zWWVzJywgWyUgVHJhbnNsYXRlKCJZZXMiKSB8IEpTT04gJV0pOwpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNTZXR0aW5ncycsIFslIFRyYW5zbGF0ZSgiU2V0dGluZ3MiKSB8IEpTT04gJV0pOwpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNTYXZlJywgWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBKU09OICVdKTsKCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5Jbml0KHsKICAgIENoYWxsZW5nZVRva2VuOiAkKCIjQ2hhbGxlbmdlVG9rZW4iKS52YWwoKSwKICAgIEFsbERheVRleHQ6IFslIFRyYW5zbGF0ZSgiQWxsLWRheSIpIHwgSlNPTiAlXSwKICAgIElzUlRMOiBbJSBEYXRhLklzUlRMTGFuZ3VhZ2UgJV0sCiAgICBFdmVudExpbWl0VGV4dDogWyUgVHJhbnNsYXRlKCJtb3JlIikgfCBKU09OICVdLAogICAgTW9udGhOYW1lczogWwogICAgICAgIFslIFRyYW5zbGF0ZSgiSmFudWFyeSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkZlYnJ1YXJ5IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTWFyY2giKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJBcHJpbCIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1heV9sb25nIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiSnVuZSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkp1bHkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJBdWd1c3QiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJTZXB0ZW1iZXIiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJPY3RvYmVyIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTm92ZW1iZXIiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJEZWNlbWJlciIpIHwgSlNPTiAlXQogICAgXSwKICAgIE1vbnRoTmFtZXNTaG9ydDogWwogICAgICAgIFslIFRyYW5zbGF0ZSgiSmFuIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiRmViIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTWFyIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiQXByIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTWF5IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiSnVuIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiSnVsIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiQXVnIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiU2VwIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiT2N0IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTm92IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiRGVjIikgfCBKU09OICVdCiAgICBdLAogICAgRGF5TmFtZXM6IFsKICAgICAgICBbJSBUcmFuc2xhdGUoIlN1bmRheSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1vbmRheSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlR1ZXNkYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJXZWRuZXNkYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJUaHVyc2RheSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkZyaWRheSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlNhdHVyZGF5IikgfCBKU09OICVdCiAgICBdLAogICAgRGF5TmFtZXNTaG9ydDogWwogICAgICAgIFslIFRyYW5zbGF0ZSgiU3VuIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTW9uIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiVHVlIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiV2VkIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiVGh1IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiRnJpIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiU2F0IikgfCBKU09OICVdCiAgICBdLAogICAgRGF5TmFtZXNNaW46IFsKICAgICAgICBbJSBUcmFuc2xhdGUoIlN1IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTW8iKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJUdSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIldlIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiVGgiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJGciIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlNhIikgfCBKU09OICVdCiAgICBdLAogICAgQnV0dG9uVGV4dDogewogICAgICAgIHRvZGF5OiBbJSBUcmFuc2xhdGUoIlRvZGF5IikgfCBKU09OICVdLAogICAgICAgIG1vbnRoOiBbJSBUcmFuc2xhdGUoIk1vbnRoIikgfCBKU09OICVdLAogICAgICAgIHdlZWs6IFslIFRyYW5zbGF0ZSgiV2VlayIpIHwgSlNPTiAlXSwKICAgICAgICBkYXk6IFslIFRyYW5zbGF0ZSgiRGF5IikgfCBKU09OICVdLAogICAgICAgIHRpbWVsaW5lTW9udGg6IFslIFRyYW5zbGF0ZSgiVGltZWxpbmUgTW9udGgiKSB8IEpTT04gJV0sCiAgICAgICAgdGltZWxpbmVXZWVrOiBbJSBUcmFuc2xhdGUoIlRpbWVsaW5lIFdlZWsiKSB8IEpTT04gJV0sCiAgICAgICAgdGltZWxpbmVEYXk6IFslIFRyYW5zbGF0ZSgiVGltZWxpbmUgRGF5IikgfCBKU09OICVdLAogICAgICAgIGp1bXA6WyUgVHJhbnNsYXRlKCJKdW1wIikgfCBKU09OICVdLAogICAgICAgIHByZXZEYXRlcGlja2VyOiBbJSBUcmFuc2xhdGUoIlByZXZpb3VzIikgfCBKU09OICVdLAogICAgICAgIG5leHREYXRlcGlja2VyOiBbJSBUcmFuc2xhdGUoIk5leHQiKSB8IEpTT04gJV0KICAgIH0sCiAgICBGaXJzdERheTogWyUgRGF0YS5GaXJzdERheSB8IGh0bWwgJV0sCiAgICBEZWZhdWx0VmlldzogWyUgRGF0YS5EZWZhdWx0VmlldyB8IEpTT04gJV0sCiAgICBIZWFkZXI6IHsKICAgICAgICBsZWZ0OiAnbW9udGgsYWdlbmRhV2VlayxhZ2VuZGFEYXkgdGltZWxpbmVNb250aCx0aW1lbGluZVdlZWssdGltZWxpbmVEYXknLAogICAgICAgIGNlbnRlcjogJ3RpdGxlJywKICAgICAgICByaWdodDogJ2p1bXAsdG9kYXkgcHJldixuZXh0JwogICAgfSwKICAgIERpYWxvZ1RleHQ6IHsKICAgICAgICBFZGl0VGl0bGU6IFslIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQiKSB8IEpTT04gJV0sCiAgICAgICAgT2NjdXJyZW5jZVRpdGxlOiBbJSBUcmFuc2xhdGUoIlRoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQiKSB8IEpTT04gJV0sCiAgICAgICAgT2NjdXJyZW5jZVRleHQ6IFslIFRyYW5zbGF0ZSgiV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VBbGw6IFslIFRyYW5zbGF0ZSgiQWxsIG9jY3VycmVuY2VzIikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VKdXN0VGhpczogWyUgVHJhbnNsYXRlKCJKdXN0IHRoaXMgb2NjdXJyZW5jZSIpIHwgSlNPTiAlXSwKICAgICAgICBDbG9zZTogWyUgVHJhbnNsYXRlKCJDbG9zZSIpIHwgSlNPTiAlXSwKICAgICAgICBEaXNtaXNzOiBbJSBUcmFuc2xhdGUoIkRpc21pc3MiKSB8IEpTT04gJV0KICAgIH0sCiAgICBPdmVydmlld1NjcmVlbjogJ0NhbGVuZGFyT3ZlcnZpZXcnLAogICAgQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbjogJ0NhbGVuZGFyU2V0dGluZ3NCdXR0b24nLAogICAgQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lcjogJ0NhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXInLAogICAgQ2FsZW5kYXJTZXR0aW5nc1Nob3c6IFslIERhdGEuQ2FsZW5kYXJTZXR0aW5nc1Nob3cgfCBKU09OICVdLAogICAgVGlja2V0QXBwb2ludG1lbnRNYXJrczogewpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRBcHBvaW50bWVudE1hcmsiKSAlXQogICAgICAgIFslIERhdGEuQXBwb2ludG1lbnRUeXBlICVdOiBbJSBEYXRhLkFwcG9pbnRtZW50TWFyayB8IEpTT04gJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnRNYXJrQ29tbWEiKSAlXQogICAgICAgICwKWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50TWFya0NvbW1hIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50TWFyayIpICVdCiAgICB9LAogICAgQ2FsbGJhY2tzOiB7CiAgICAgICAgRWRpdEFjdGlvbjogWyUgRGF0YS5FZGl0QWN0aW9uIHwgSlNPTiAlXSwKICAgICAgICBFZGl0TWFza1N1YmFjdGlvbjogWyUgRGF0YS5FZGl0TWFza1N1YmFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgRWRpdFN1YmFjdGlvbjogWyUgRGF0YS5FZGl0U3ViYWN0aW9uIHwgSlNPTiAlXSwKICAgICAgICBBZGRTdWJhY3Rpb246IFslIERhdGEuQWRkU3ViYWN0aW9uIHwgSlNPTiAlXSwKICAgICAgICBQcmVmU3ViYWN0aW9uOiBbJSBEYXRhLlByZWZTdWJhY3Rpb24gfCBKU09OICVdLAogICAgICAgIExpc3RBY3Rpb246IFslIERhdGEuTGlzdEFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgRGF5c1N1YmFjdG9uOiBbJSBEYXRhLkRheXNTdWJhY3Rpb24gfCBKU09OICVdCiAgICB9LAogICAgQXBwb2ludG1lbnQ6IHsKICAgICAgICBBcHBvaW50bWVudENyZWF0ZTogWyUgRGF0YS5BcHBvaW50bWVudENyZWF0ZSB8fCAibnVsbCIgJV0sCiAgICAgICAgQXBwb2ludG1lbnRJRDogWyUgRGF0YS5BcHBvaW50bWVudElEIHwgSlNPTiAlXSwKICAgICAgICBBcHBvaW50bWVudENyZWF0ZUJ1dHRvbjogJ0FwcG9pbnRtZW50Q3JlYXRlQnV0dG9uJwogICAgfSwKICAgIENhbGVuZGFyczogewogICAgICAgIFNvdXJjZXM6IHsKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2FsZW5kYXJTb3VyY2UiKSAlXQogICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFySUQgfCBKU09OICVdOiB7CiAgICAgICAgICAgICAgICB1cmw6IENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoIiNDaGFsbGVuZ2VUb2tlbiIpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRMaXN0JywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdMaXN0QXBwb2ludG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEOiBbJSBEYXRhLkNhbGVuZGFySUQgfCBKU09OICVdLAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlSUQ6IFslIERhdGEuUmVzb3VyY2VJRCB8IEpTT04gJV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjb2xvcjogWyUgRGF0YS5Db2xvciB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IFslIERhdGEuVGV4dENvbG9yIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjIpJywKICAgICAgICAgICAgICAgIHN0YXJ0UGFyYW06ICdTdGFydFRpbWUnLAogICAgICAgICAgICAgICAgZW5kUGFyYW06ICdFbmRUaW1lJywKCiAgICAgICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciByZW1vdmVFdmVudFNvdXJjZQogICAgICAgICAgICAgICAgZ29vZ2xlQ2FsZW5kYXJJZDogWyUgRGF0YS5DYWxlbmRhcklEIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgIGV2ZW50RGF0YVRyYW5zZm9ybTogZnVuY3Rpb24oQXBwb2ludG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFRpY2tldEFwcG9pbnRtZW50Tm9EcmFnID0gewpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRBcHBvaW50bWVudE5vRHJhZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQXBwb2ludG1lbnRUeXBlICVdOiBwYXJzZUludChbJSBEYXRhLk5vRHJhZyB8IEpTT04gJV0sIDEwKSA/IHRydWUgOiBmYWxzZQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRBcHBvaW50bWVudE5vRHJhZ0NvbW1hIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgLApbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QXBwb2ludG1lbnROb0RyYWdDb21tYSIpICVdClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRBcHBvaW50bWVudE5vRHJhZyIpICVdCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IEFwcG9pbnRtZW50RGF0YS5BcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZDogQXBwb2ludG1lbnREYXRhLlBhcmVudElELAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogQXBwb2ludG1lbnREYXRhLlN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlOiBBcHBvaW50bWVudERhdGEuU3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IEFwcG9pbnRtZW50RGF0YS5FbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlOiBBcHBvaW50bWVudERhdGEuRW5kRGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEFwcG9pbnRtZW50RGF0YS5UaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IEFwcG9pbnRtZW50RGF0YS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IEFwcG9pbnRtZW50RGF0YS5Mb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJJZDogQXBwb2ludG1lbnREYXRhLkNhbGVuZGFySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbERheTogcGFyc2VJbnQoQXBwb2ludG1lbnREYXRhLkFsbERheSwgMTApID8gdHJ1ZSA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJpbmc6IHBhcnNlSW50KEFwcG9pbnRtZW50RGF0YS5SZWN1cnJpbmcsIDEwKSA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbUlkczogQXBwb2ludG1lbnREYXRhLlRlYW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbU5hbWVzOiBBcHBvaW50bWVudERhdGEuVGVhbU5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUlkczogQXBwb2ludG1lbnREYXRhLlJlc291cmNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZXM6IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZU5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5EYXRhOiBBcHBvaW50bWVudERhdGEuUGx1Z2luRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJOYW1lOiBbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyQ29sb3I6IFslIERhdGEuQ29sb3IgfCBKU09OICVdLAogICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb246IEFwcG9pbnRtZW50RGF0YS5Ob3RpZmljYXRpb25EYXRlLmxlbmd0aCA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRGF0ZTogQXBwb2ludG1lbnREYXRhLk5vdGlmaWNhdGlvbkRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tldEFwcG9pbnRtZW50VHlwZTogQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydEVkaXRhYmxlOiBUaWNrZXRBcHBvaW50bWVudE5vRHJhZ1tBcHBvaW50bWVudERhdGEuVGlja2V0QXBwb2ludG1lbnRTdGFydERhdGVdID8gZmFsc2UgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbkVkaXRhYmxlOiB0eXBlb2YgQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50RW5kRGF0ZSA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBUaWNrZXRBcHBvaW50bWVudE5vRHJhZ1tBcHBvaW50bWVudERhdGEuVGlja2V0QXBwb2ludG1lbnRFbmREYXRlXSAhPT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyU291cmNlQ29tbWEiKSAlXQogICAgICAgICAgICAsClslIFJlbmRlckJsb2NrRW5kKCJDYWxlbmRhclNvdXJjZUNvbW1hIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyU291cmNlIikgJV0KICAgICAgICB9LAogICAgICAgIFN3aXRjaGVzOiAkKCcuQ2FsZW5kYXJTd2l0Y2ggaW5wdXRbdHlwZT0iY2hlY2tib3giXScpLAogICAgICAgIExpbWl0OiBbJSBDb25maWcoIkFwcG9pbnRtZW50Q2FsZW5kYXI6OkNhbGVuZGFyTGltaXRPdmVydmlldyIpIHx8IDEwICVdCiAgICB9LAogICAgV29ya2luZ0hvdXJzOiBbClslIFJlbmRlckJsb2NrU3RhcnQoIldvcmtpbmdIb3VycyIpICVdCiAgICAgICAgewogICAgICAgICAgICBpZDogJ3dvcmtpbmdIb3VycycsCiAgICAgICAgICAgIHN0YXJ0OiBbJSBEYXRhLlN0YXJ0VGltZSB8IEpTT04gJV0sCiAgICAgICAgICAgIGVuZDogWyUgRGF0YS5FbmRUaW1lIHwgSlNPTiAlXSwKICAgICAgICAgICAgY29sb3I6ICcjRDdEN0Q3JywKICAgICAgICAgICAgcmVuZGVyaW5nOiAnaW52ZXJzZS1iYWNrZ3JvdW5kJywKICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlLAogICAgICAgICAgICBkb3c6IFslIERhdGEuRG9XICVdCiAgICAgICAgfQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JraW5nSG91cnNDb21tYSIpICVdCiAgICAgICAgLApbJSBSZW5kZXJCbG9ja0VuZCgiV29ya2luZ0hvdXJzQ29tbWEiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiV29ya2luZ0hvdXJzIikgJV0KICAgIF0KfSk7CgovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgPGRpdiBpZD0iQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lciIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgPGZvcm0gaWQ9IkNvbnRleHRTZXR0aW5nc0RpYWxvZ0NhbGVuZGFyT3ZlcnZpZXciIGNsYXNzPSIiPgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2hvd25BcHBvaW50bWVudHMiPlslIFRyYW5zbGF0ZSgiU2hvdyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuU2hvd25BcHBvaW50bWVudHNTdHJpbmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9IkFwcG9pbnRtZW50VG9vbHRpcFRlbXBsYXRlIiBjbGFzcz0iSGlkZGVuIj4KICAgICAgICA8ZGl2IGNsYXNzPSJJY29ucyI+PC9kaXY+CiAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiQmFzaWMgaW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JXRpdGxlJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiVkZXNjcmlwdGlvbiU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lbG9jYXRpb24lPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMb2NhdGlvbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNhbGVuZGFyQ29sb3IiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAlY2FsZW5kYXJDb2xvciU7Ij48L3NwYW4+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAlY2FsZW5kYXJOYW1lJQogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sdGlwVGVtcGxhdGVSZXNvdXJjZSIpICVdCiAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiUmVzb3VyY2UiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JXRlYW1OYW1lcyU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRlYW0iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiVyZXNvdXJjZU5hbWVzJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWdlbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+ClslIFJlbmRlckJsb2NrRW5kKCJUb29sdGlwVGVtcGxhdGVSZXNvdXJjZSIpICVdCiAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiRGF0ZS9UaW1lIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiVzdGFydERhdGUlPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTdGFydCBkYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lZW5kRGF0ZSU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkVuZCBkYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lYWxsRGF5JTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWxsLWRheSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JXJlY3VycmluZyU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlJlcGVhdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KWyUgSUYgRGF0YS5QbHVnaW5MaXN0ICVdCiAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTGluayIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KWyUgRk9SRUFDSCBQbHVnaW5LZXkgSU4gRGF0YS5QbHVnaW5MaXN0LmtleXMgJV0KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lWyUgUGx1Z2luS2V5ICVdJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLlBsdWdpbkxpc3QuJFBsdWdpbktleS5QbHVnaW5OYW1lKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBFTkQgJV0KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBFTkQgJV0KICAgICAgICA8ZmllbGRzZXQ+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJOb3RpZmljYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JW5vdGlmaWNhdGlvbkRhdGUlPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJOb3RpZmljYXRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+CiAgICA8L2Rpdj4KCjwvZGl2Pgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBTRVQgT1RSU0J1c2luZXNzTGFiZWwgPSAnPHN0cm9uZz5PVFJTIEJ1c2luZXNzIFNvbHV0aW9uPC9zdHJvbmc+4oSiJyAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRWRpdE1hc2siKSAlXQo8ZGl2IGNsYXNzPSJJbm5lckNvbnRlbnQiPgogICAgPGZvcm0gaWQ9IkVkaXRBcHBvaW50bWVudEZvcm0iIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkNoYWxsZW5nZVRva2VuIiBuYW1lPSJDaGFsbGVuZ2VUb2tlbiIgdmFsdWU9IlslIEVudigiVXNlckNoYWxsZW5nZVRva2VuIikgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkFjdGlvbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iU3ViYWN0aW9uIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJFZGl0QXBwb2ludG1lbnQiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQXBwb2ludG1lbnRJRCIgbmFtZT0iQXBwb2ludG1lbnRJRCIgdmFsdWU9IlslIERhdGEuQXBwb2ludG1lbnRJRCB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUmVjdXJyaW5nIiBuYW1lPSJSZWN1cnJpbmciIHZhbHVlPSJbJSBEYXRhLlJlY3VycmluZyB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUmVjdXJyZW5jZURheXMiIG5hbWU9IlJlY3VycmVuY2VEYXlzIiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJlbmNlRGF5cyB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUmVjdXJyZW5jZU1vbnRocyIgbmFtZT0iUmVjdXJyZW5jZU1vbnRocyIgdmFsdWU9IlslIERhdGEuUmVjdXJyZW5jZU1vbnRocyB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUmVjdXJyZW5jZU1vbnRoRGF5cyIgbmFtZT0iUmVjdXJyZW5jZU1vbnRoRGF5cyIgdmFsdWU9IlslIERhdGEuUmVjdXJyZW5jZU1vbnRoRGF5cyB8IGh0bWwgJV0iLz4KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJCYXNpYyBpbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGl0bGUiWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXSBjbGFzcz0iTWFuZGF0b3J5IlslIEVORCAlXT5bJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgRU5EICVdWyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJUaXRsZSIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC9wPgpbJSBFTFNFICVdClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRpdGxlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVGl0bGUiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCIgLz4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaXRsZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRlc2NyaXB0aW9uIj5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iRGVzY3JpcHRpb24iIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkRlc2NyaXB0aW9uIHx8ICItIiB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iRGVzY3JpcHRpb24iIG5hbWU9IkRlc2NyaXB0aW9uIiBjbGFzcz0iVzc1cGMiIHJvd3M9IjQiPlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdPC90ZXh0YXJlYT4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkxvY2F0aW9uIj5bJSBUcmFuc2xhdGUoIkxvY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iTG9jYXRpb24iIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkxvY2F0aW9uIHx8ICItIiB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iTG9jYXRpb24iIG5hbWU9IkxvY2F0aW9uIiB2YWx1ZT0iWyUgRGF0YS5Mb2NhdGlvbiB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgLz4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxvY2F0aW9uTGluayIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iTG9jYXRpb25MaW5rIEhpZGRlbiBbJSBEYXRhLkNTU0NsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5VUkwgfCBodG1sICVdWyUgRGF0YS5Mb2NhdGlvbiB8IHVyaSAlXSIgZGF0YS1iYXNlLXVybD0iWyUgRGF0YS5VUkwgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuVGV4dCkgfCBodG1sICVdIiB0YXJnZXQ9IlslIERhdGEuVGFyZ2V0IHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIFslIERhdGEuSWNvbk5hbWUgfCBodG1sICVdIj48L2k+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJMb2NhdGlvbkxpbmsiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhcklEIlslIElGICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID49IDMgJV0gY2xhc3M9Ik1hbmRhdG9yeSJbJSBFTkQgJV0+ClslIElGICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID49IDMgJV0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ClslIEVORCAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXToKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEIHx8IERhdGEuUGVybWlzc2lvbkxldmVsIDwgMyAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IkNhbGVuZGFySUQiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJJRFN0cmcgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiUmVzb3VyY2UiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+ClslIElGIERhdGEuVGVhbUlEU3RyZyAlXQogICAgICAgICAgICA8bGFiZWwgZm9yPSJUZWFtSUQiPlslIFRyYW5zbGF0ZSgiVGVhbSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRlYW1JRCIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuVGVhbU5hbWVzICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLlRlYW1JRFN0cmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlc291cmNlSUQiPlslIFRyYW5zbGF0ZSgiQWdlbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJSZXNvdXJjZUlEIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5SZXNvdXJjZU5hbWVzICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc291cmNlSURTdHJnICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgRUxTRSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGZlYXR1cmUgaXMgY3VycmVudGx5IG5vdCBhdmFpbGFibGUuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBJbmZvIj4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pbk9UUlNCdXNpbmVzcyIgY2xhc3M9IkJ1dHRvbiI+PGkgY2xhc3M9ImZhIGZhLWFuZ2xlLWRvdWJsZS11cCI+PC9pPiBbJSBUcmFuc2xhdGUoIlVwZ3JhZGUgdG8gJXMiLCBPVFJTQnVzaW5lc3NMYWJlbCkgJV08L2E+CiAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkRhdGUvVGltZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhcnREYXkiPlslIFRyYW5zbGF0ZSgiU3RhcnQgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGICggRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAmJiBEYXRhLlJlYWRPbmx5U3RhcnQgKSB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJTdGFydERheSIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuU3RhcnREYXRlIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN0YXJ0RGF5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFydERhdGVTdHJpbmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkVuZERheSI+WyUgVHJhbnNsYXRlKCJFbmQgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGICggRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAmJiBEYXRhLlJlYWRPbmx5RHVyYXRpb24gKSB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJFbmREYXkiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkVuZERhdGUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGRpdiBpZD0iRW5kRGF5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIFslIERhdGEuRW5kRGF0ZVN0cmluZyAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iQWxsRGF5Ij5bJSBUcmFuc2xhdGUoIkFsbC1kYXkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEIHx8IERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IkFsbERheSIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLkFsbERheVN0cmluZykgfCBodG1sICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJBbGxEYXkiIG5hbWU9IkFsbERheSIgWyUgRGF0YS5BbGxEYXlDaGVja2VkICVdIC8+ClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJSZWN1cnJlbmNlVHlwZSI+WyUgVHJhbnNsYXRlKCJSZXBlYXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgSUYgRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBhcmVudElEICVdCiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV08YnI+CiAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iRWRpdFBhcmVudCI+WyUgVHJhbnNsYXRlKCJDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50LiIpIHwgaHRtbCAlXTwvYT4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlJlY3VycmVuY2VUeXBlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5SZWN1cnJlbmNlVmFsdWUgfCBodG1sICVdPC9wPgpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+ClslIEVMU0UgJV0KWyUgSUYgRGF0YS5QYXJlbnRJRCAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV08YnI+CiAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iRWRpdFBhcmVudCI+WyUgVHJhbnNsYXRlKCJDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvZGl2PgpbJSBFTFNFICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuUmVjdXJyZW5jZVR5cGVTdHJpbmcgJV0KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRnJlcXVlbmN5IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkV2ZXJ5IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZWN1cnJlbmNlSW50ZXJ2YWxTdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iUmVjdXJyZW5jZUludGVydmFsVGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJUZXh0RGF5IEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJkYXkocykiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJUZXh0V2VlayBIaWRkZW4iPlslIFRyYW5zbGF0ZSgid2VlayhzKSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlRleHRNb250aCBIaWRkZW4iPlslIFRyYW5zbGF0ZSgibW9udGgocykiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJUZXh0WWVhciBIaWRkZW4iPlslIFRyYW5zbGF0ZSgieWVhcihzKSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJPbiIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iRGF5cyIgbmFtZT0iRGF5cyIgdmFsdWU9IlslIERhdGEuRGF5cyAlXSIgLz4KCiMgV2Vla2x5IHRhYmxlIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJCdXR0b25UYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1vbmRheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk1vbiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iMiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVHVlc2RheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlR1ZSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iMyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiV2VkbmVzZGF5IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiV2VkIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSI0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUaHVyc2RheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRodSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iNSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRnJpZGF5IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRnJpIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSI2IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTYXR1cmRheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNhdCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iNyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU3VuZGF5IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU3VuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiMgV2Vla2x5IHRhYmxlIGVuZAoKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0iUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJPbiIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iTW9udGhEYXlzIiBuYW1lPSJNb250aERheXMiIHZhbHVlPSJbJSBEYXRhLk1vbnRoRGF5cyAlXSIgLz4KCiMgTW9udGhseSB0YWJsZSBzdGFydAogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iQnV0dG9uVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIENvdW50ID0gMSAlXQpbJSBXSElMRSBDb3VudCA8IDMyICVdClslIElGIENvdW50ICUgNyA9PSAxICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+ClslIEVORCAlXQoKIyBqb2luIHN0cmluZ3MgKE1vbnRobHkxLCBNb250aGx5MiwuLi4pClslIE1vbnRobHlDb3VudCA9ICJNb250aGx5IiBfIENvdW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSJbJSBDb3VudCAlXSIgdGl0bGU9IlslIENvdW50ICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIENvdW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIElGIENvdW50ICUgNyA9PSAwICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBFTkQgJV0KClslIENvdW50ID0gQ291bnQgKyAxICVdClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiMgTW9udGhseSB0YWJsZSBlbmQKCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJPbiIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iTW9udGhzIiBuYW1lPSJNb250aHMiIHZhbHVlPSJbJSBEYXRhLk1vbnRocyAlXSIgLz4KCiMgWWVhcmx5IHRhYmxlIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJCdXR0b25UYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSmFudWFyeSIpIHwgaHRtbCAlXSIgdmFsdWU9IjEiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSmFuIil8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmVicnVhcnkiKSB8IGh0bWwgJV0iIHZhbHVlPSIyIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkZlYiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNYXJjaCIpIHwgaHRtbCAlXSIgdmFsdWU9IjMiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTWFyIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkFwcmlsIikgfCBodG1sICVdIiB2YWx1ZT0iNCIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBcHIiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1heV9sb25nIikgfCBodG1sICVdIiB2YWx1ZT0iNSIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJNYXkiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSnVuZSIpIHwgaHRtbCAlXSIgdmFsdWU9IjYiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSnVuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkp1bHkiKSB8IGh0bWwgJV0iIHZhbHVlPSI3IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkp1bCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBdWd1c3QiKSB8IGh0bWwgJV0iIHZhbHVlPSI4IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkF1ZyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VwdGVtYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iOSIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTZXAiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiT2N0b2JlciIpIHwgaHRtbCAlXSIgdmFsdWU9IjEwIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk9jdCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJOb3ZlbWJlciIpIHwgaHRtbCAlXSIgdmFsdWU9IjExIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vdiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZWNlbWJlciIpIHwgaHRtbCAlXSIgdmFsdWU9IjEyIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkRlYyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgojIFllYXJseSB0YWJsZSBlbmQKCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGlkPSJSZWN1cnJlbmNlTGltaXREaXYiIGNsYXNzPSJGaWVsZCBIaWRkZW4iPgogICAgICAgICAgICAgICAgWyUgRGF0YS5SZWN1cnJlbmNlTGltaXRTdHJpbmcgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VVbnRpbERpdiIgY2xhc3M9IkZpZWxkIEhpZGRlbiI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSZWN1cnJlbmNlVW50aWxEYXlFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgWyUgRGF0YS5SZWN1cnJlbmNlVW50aWxTdHJpbmcgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VDb3VudERpdiIgY2xhc3M9IkZpZWxkIEhpZGRlbiI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlJlY3VycmVuY2VDb3VudCIgbmFtZT0iUmVjdXJyZW5jZUNvdW50IiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJlbmNlQ291bnQgfCBodG1sICVdIiBzaXplPSIxIiBtYXhsZW5ndGg9IjIiIC8+CiAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KWyUgRU5EICVdCiAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KCiAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5vdGlmaWNhdGlvblRlbXBsYXRlIj5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9Ik5vdGlmaWNhdGlvblRlbXBsYXRlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5Ob3RpZmljYXRpb25WYWx1ZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuTm90aWZpY2F0aW9uU3RyZyAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0iTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2Ij4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0Ij5bJSBUcmFuc2xhdGUoIlJlbGF0aXZlIHBvaW50IG9mIHRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0IiB2YWx1ZT0iIiBpZD0iTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCIgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0UmFkaW8gJV0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCIgbmFtZT0iTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQiIHZhbHVlPSJbJSBEYXRhLk5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50IHwgaHRtbCAlXSIgc2l6ZT0iMSIgbWF4bGVuZ3RoPSIyIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21Vbml0c1BvaW50T2ZUaW1lU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0Ij5bJSBUcmFuc2xhdGUoIkRhdGUvVGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCIgdmFsdWU9IiIgaWQ9Ik5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQiIFslIERhdGEuTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dFJhZGlvICVdPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTdHJnICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgPC9maWVsZHNldD4KClslIElGIERhdGEuUGx1Z2luTGlzdCAlXQogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkxpbmsiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+ClslIEZPUkVBQ0ggS2V5IElOIERhdGEuUGx1Z2luTGlzdC5rZXlzICVdCiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5QbHVnaW5MaXN0LiRLZXkuUGx1Z2luTmFtZSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGRhdGEtcGx1Z2luLWtleT0iWyUgS2V5IHwgaHRtbCAlXSIgZGF0YS1wbHVnaW4tdXJsPSJbJSBEYXRhLlBsdWdpbkxpc3QuJEtleS5QbHVnaW5VUkwgfCBodG1sICVdIiBjbGFzcz0iUGx1Z2luRmllbGQgVzc1cGMiIC8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUGx1Z2luX1slIEtleSB8IGh0bWwgJV0iIG5hbWU9IlBsdWdpbl9bJSBLZXkgfCBodG1sICVdIiB2YWx1ZT0nWyUgRGF0YS5QbHVnaW5MaXN0LiRLZXkuTGlua0xpc3QgfHwgIltdIiAlXScgLz4KWyUgRUxTRSAlXQpbJSBJRiBEYXRhLlBsdWdpbkRhdGEuJEtleS5zaXplID09IDAgJV0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJSZWFkT25seVZhbHVlIj4tPC9wPgpbJSBFTkQgJV0KWyUgRU5EICVdCiMga2VlcCBmb2xsb3dpbmcgYmxvY2sgb24gYSBzaW5nbGUgbGluZSwgc28gOmVtcHR5IENTUyBzZWxlY3RvciB3b3VsZCB3b3JrIQogICAgICAgICAgICAgICAgPGRpdiBpZD0iUGx1Z2luQ29udGFpbmVyX1slIEtleSB8IGh0bWwgJV0iWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXSBjbGFzcz0iUGx1Z2luQ29udGFpbmVyIlslIEVORCAlXT5bJSBGT1JFQUNIIExpbmsgSU4gRGF0YS5QbHVnaW5EYXRhLiRLZXkgJV08ZGl2IGNsYXNzPSJMaW5rX1slIExpbmsuTGlua0lEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IlslIExpbmsuTGlua1VSTCAlXSI+WyUgTGluay5MaW5rTmFtZSB8IGh0bWwgJV08L2E+WyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXTxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIGRhdGEtcGx1Z2luLWtleT0iWyUgS2V5IHwgaHRtbCAlXSIgZGF0YS1saW5rLWlkPSJbJSBMaW5rLkxpbmtJRCB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT5bJSBFTkQgJV0KICAgICAgICAgICAgICAgIDwvZGl2PlslIEVORCAlXTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBFTkQgJV0KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBFTkQgJV0KICAgIDwvZm9ybT4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJDb250ZW50Rm9vdGVyIENlbnRlciI+ClslIElGICFEYXRhLlBlcm1pc3Npb25MZXZlbCB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA+IDEgJV0KICAgIDxidXR0b24gaWQ9IkVkaXRGb3JtU3VibWl0IiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgpbJSBFTkQgJV0KWyUgSUYgRGF0YS5BcHBvaW50bWVudElEICYmICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID4gMiAlXQogICAgPGJ1dHRvbiBpZD0iRWRpdEZvcm1Db3B5IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiQ29weSIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWZpbGVzLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJDb3B5IikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgpbJSBFTkQgJV0KWyUgSUYgRGF0YS5BcHBvaW50bWVudElEICYmICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID4gMiAlXQogICAgPGJ1dHRvbiBpZD0iRWRpdEZvcm1EZWxldGUiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KWyUgRU5EICVdCiAgICA8YnV0dG9uIGlkPSJFZGl0Rm9ybUNhbmNlbCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKQ29yZS5Gb3JtLlZhbGlkYXRlLkluaXQoKTsKQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLkxvY2F0aW9uTGlua0luaXQoJCgnI0xvY2F0aW9uJyksICQoJy5Mb2NhdGlvbkxpbmsnKSk7CkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5BbGxEYXlJbml0KCQoJyNBbGxEYXknKSk7CkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5SZWN1cnJpbmdJbml0KHsKICAgICRSZWN1cnJpbmc6ICQoJyNSZWN1cnJpbmcnKSwKICAgICRSZWN1cnJlbmNlVHlwZTogJCgnI1JlY3VycmVuY2VUeXBlJyksCiAgICAkUmVjdXJyZW5jZUN1c3RvbVR5cGU6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLAogICAgJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2OiAkKCcjUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYnKSwKICAgICRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0OiAkKCcjUmVjdXJyZW5jZUludGVydmFsVGV4dCcpLAogICAgJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2JyksCiAgICAkUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdicpLAogICAgJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2JyksCiAgICAkUmVjdXJyZW5jZUxpbWl0RGl2OiAkKCcjUmVjdXJyZW5jZUxpbWl0RGl2JyksCiAgICAkUmVjdXJyZW5jZUxpbWl0OiAkKCcjUmVjdXJyZW5jZUxpbWl0JyksCiAgICAkUmVjdXJyZW5jZVVudGlsRGl2OiAkKCcjUmVjdXJyZW5jZVVudGlsRGl2JyksCiAgICAkUmVjdXJyZW5jZVVudGlsRGF5OiAkKCcjUmVjdXJyZW5jZVVudGlsRGF5JyksCiAgICAkUmVjdXJyZW5jZUNvdW50RGl2OiAkKCcjUmVjdXJyZW5jZUNvdW50RGl2JykKfSk7CgpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTm90aWZpY2F0aW9uSW5pdCh7CiAgICAkTm90aWZpY2F0aW9uVGVtcGxhdGU6ICQoJyNOb3RpZmljYXRpb25UZW1wbGF0ZScpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdjogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdicpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0JyksCiAgICAkTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCcpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCcpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWU6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJyksCiAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQnKSwKICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheTogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5JyksCiAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgnKSwKICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXI6ICQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXInKSwKICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXI6ICQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXInKSwKICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZTogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlJykKfSk7CgpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuVGVhbUluaXQoJCgnI1RlYW1JRCcpLCAkKCcjUmVzb3VyY2VJRCcpLCAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwgJCgnbGFiZWxbZm9yPSJUZWFtSUQiXSArIGRpdi5GaWVsZCBwLlJlYWRPbmx5VmFsdWUnKSwgJCgnbGFiZWxbZm9yPSJSZXNvdXJjZUlEIl0gKyBkaXYuRmllbGQgcC5SZWFkT25seVZhbHVlJykpOwpbJSBJRiAhRGF0YS5QZXJtaXNzaW9uTGV2ZWwgT1IgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPiAxICVdCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5QbHVnaW5Jbml0KCQoJy5QbHVnaW5GaWVsZCcpLCAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSk7ClslIEVORCAlXQoKQ29yZS5Gb3JtLlZhbGlkYXRlLlNldFN1Ym1pdEZ1bmN0aW9uKCQoJyNFZGl0QXBwb2ludG1lbnRGb3JtJyksIGZ1bmN0aW9uIChGb3JtKSB7CiAgICB2YXIgRGF0YSA9IG5ldyBPYmplY3QoKSwKICAgICAgICBEYXlzID0gbmV3IEFycmF5KCksCiAgICAgICAgTW9udGhEYXlzID0gbmV3IEFycmF5KCksCiAgICAgICAgTW9udGhzID0gbmV3IEFycmF5KCk7CgogICAgLy8gc2VyaWFsaXplIGRheXMKICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgRGF5cy5wdXNoKCQodGhpcykudmFsKCkpOwogICAgfSk7CiAgICAkKCJpbnB1dCNEYXlzIikudmFsKERheXMuam9pbigpKTsKCiAgICAvLyBzZXJpYWxpemUgbW9udGggZGF5cwogICAgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgTW9udGhEYXlzLnB1c2goJCh0aGlzKS52YWwoKSk7CiAgICB9KTsKICAgICQoImlucHV0I01vbnRoRGF5cyIpLnZhbChNb250aERheXMuam9pbigpKTsKCiAgICAvLyBzZXJpYWxpemUgbW9udGhzCiAgICAkKCIjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikuZWFjaChmdW5jdGlvbigpewogICAgICAgIE1vbnRocy5wdXNoKCQodGhpcykudmFsKCkpOwogICAgfSk7CiAgICAkKCJpbnB1dCNNb250aHMiKS52YWwoTW9udGhzLmpvaW4oKSk7CgogICAgJChGb3JtKS5maW5kKCdpbnB1dCx0ZXh0YXJlYSxzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgIGlmIChFbGVtZW50LnR5cGUgPT0gJ2NoZWNrYm94JykgewogICAgICAgICAgICBEYXRhW0VsZW1lbnQuaWRdID0gJChFbGVtZW50KS5wcm9wKCdjaGVja2VkJykgPyAnMScgOiAnMCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRGF0YVtFbGVtZW50LmlkXSA9ICQoRWxlbWVudCkudmFsKCk7CiAgICAgICAgfQogICAgfSk7CgogICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuRWRpdEFwcG9pbnRtZW50KERhdGEpOwp9KTsKCgokKCIuQnV0dG9uVGFibGUgYnV0dG9uIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CiAgICAkKHRoaXMpLnRvZ2dsZUNsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsKfSk7CgovLyBEdXBsaWNhdGUgYXBwb2ludG1lbnQKJCgnI0VkaXRGb3JtQ29weScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgLy8gUmVzZXQgQXBwb2ludG1lbnRJRCwgcmVtb3ZlIENvcHkgJiBEZWxldGUgYnV0dG9ucwogICAgJCgiI0VkaXRBcHBvaW50bWVudEZvcm0gaW5wdXQjQXBwb2ludG1lbnRJRCIpLnZhbCgiIik7CiAgICAkKCcjRWRpdEFwcG9pbnRtZW50Rm9ybScpLnN1Ym1pdCgpOwp9KTsKCi8vIFNhdmUgdGhlIGFwcG9pbnRtZW50CiQoJyNFZGl0Rm9ybVN1Ym1pdCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgJCgnI0VkaXRBcHBvaW50bWVudEZvcm0nKS5zdWJtaXQoKTsKfSk7CgpbJSBJRiBEYXRhLkFwcG9pbnRtZW50SUQgJV0KCi8vIERlbGV0ZSB0aGUgYXBwb2ludG1lbnQKJCgnI0VkaXRGb3JtRGVsZXRlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICBpZiAod2luZG93LmNvbmZpcm0oWyUgVHJhbnNsYXRlKCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuIikgfCBKU09OICVdKSkgewogICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5FZGl0QXBwb2ludG1lbnQoewogICAgICAgICAgICBDYWxlbmRhcklEOiBbJSBEYXRhLkNhbGVuZGFySUQgfCBKU09OICVdLAogICAgICAgICAgICBBcHBvaW50bWVudElEOiBbJSBEYXRhLkFwcG9pbnRtZW50SUQgfCBKU09OICVdLAogICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIFN1YmFjdGlvbjogJ0RlbGV0ZUFwcG9pbnRtZW50JwogICAgICAgIH0pOwogICAgfQp9KTsKClslIEVORCAlXQoKWyUgSUYgRGF0YS5QYXJlbnRJRCAlXQoKLy8gRWRpdCBwYXJlbnQgYXBwb2ludG1lbnQKJCgnI0VkaXRQYXJlbnQnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgIHZhciBEYXRhID0gewogICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCIjQ2hhbGxlbmdlVG9rZW4iKS52YWwoKSwKICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgU3ViYWN0aW9uOiAnRWRpdE1hc2snLAogICAgICAgIEFwcG9pbnRtZW50SUQ6IFslIERhdGEuUGFyZW50SUQgfCBKU09OICVdCiAgICB9OwoKICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgIERhdGEsCiAgICAgICAgZnVuY3Rpb24gKEhUTUwpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coSFRNTCwgWyUgVHJhbnNsYXRlKCJBcHBvaW50bWVudCIpIHwgSlNPTiAlXSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTsKICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgfSwgJ2h0bWwnCiAgICApOwp9KTsKClslIEVORCAlXQoKLy8gQ2xvc2UgdGhlIGRpYWxvZwokKCcjRWRpdEZvcm1DYW5jZWwnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKfSk7CgpbJSBJbnNlcnRUZW1wbGF0ZSgiRGF0ZXBpY2tlci50dCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEYXRlcGlja2VySW5pdCIpICVdCkNvcmUuVUkuRGF0ZXBpY2tlci5Jbml0KHsKICAgIERheTogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihbJSBEYXRhLlByZWZpeCB8IEpTT04gJV0pICsgIkRheSIpLAogICAgTW9udGg6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoWyUgRGF0YS5QcmVmaXggfCBKU09OICVdKSArICJNb250aCIpLAogICAgWWVhcjogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihbJSBEYXRhLlByZWZpeCB8IEpTT04gJV0pICsgIlllYXIiKSwKICAgIEhvdXI6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoWyUgRGF0YS5QcmVmaXggfCBKU09OICVdKSArICJIb3VyIiksCiAgICBNaW51dGU6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoWyUgRGF0YS5QcmVmaXggfCBKU09OICVdKSArICJNaW51dGUiKSwKICAgIFdlZWtEYXlTdGFydDogWyUgRGF0YS5XZWVrRGF5U3RhcnQgfCBKU09OICVdCn0pOwpbJSBSZW5kZXJCbG9ja0VuZCgiRGF0ZXBpY2tlckluaXQiKSAlXQoKLy9dXT48L3NjcmlwdD4KWyUgUmVuZGVyQmxvY2tFbmQoIkVkaXRNYXNrIikgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFZGl0TWFzayIpICVdCgpbJSBSZW5kZXJCbG9ja0VuZCgiRWRpdE1hc2siKSAlXQo8cD5UZXN0PC9wPgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpEYXNoYm9hcmQ6OkFwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBwYXJhbWV0ZXJzCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnIE5hbWUgVXNlcklEKSkgewogICAgICAgIGRpZSAiR290IG5vICROZWVkZWQhIiBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgY3VycmVudCBmaWx0ZXIKICAgIG15ICROYW1lICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOYW1lJyApIHx8ICcnOwogICAgbXkgJFByZWZlcmVuY2VzS2V5ID0gJ0Rhc2hib2FyZENhbGVuZGFyQXBwb2ludG1lbnRGaWx0ZXInIC4gJFNlbGYtPntOYW1lfTsKICAgIGlmICggJFNlbGYtPntOYW1lfSBlcSAkTmFtZSApIHsKICAgICAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICcnOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgcmVtZW1iZXIgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57RmlsdGVyfSApIHsKCiAgICAgICAgIyB1cGRhdGUgc2Vzc2lvbgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAkUHJlZmVyZW5jZXNLZXksCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgcHJlZmVyZW5jZXMKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlbW9TeXN0ZW0nKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICRQcmVmZXJlbmNlc0tleSwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgZmlsdGVyIGlmIG5vdCBzZXQgeWV0CiAgICBpZiAoICEkU2VsZi0+e0ZpbHRlcn0gKSB7CiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJFNlbGYtPnskUHJlZmVyZW5jZXNLZXl9IHx8ICRTZWxmLT57Q29uZmlnfS0+e0ZpbHRlcn0gfHwgJ1RvZGF5JzsKICAgIH0KCiAgICAjIHNldHVwIHRoZSBwcmVmcmVuY2VzIGtleXMKICAgICRTZWxmLT57UHJlZktleVNob3dufSAgID0gJ0FwcG9pbnRtZW50RGFzaGJvYXJkUHJlZicgLiAkU2VsZi0+e05hbWV9IC4gJy1TaG93bic7CiAgICAkU2VsZi0+e1ByZWZLZXlSZWZyZXNofSA9ICdBcHBvaW50bWVudERhc2hib2FyZFByZWYnIC4gJFNlbGYtPntOYW1lfSAuICctUmVmcmVzaCc7CgogICAgJFNlbGYtPntQYWdlU2hvd259ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT57ICRTZWxmLT57UHJlZktleVNob3dufSB9CiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57TGltaXR9IHx8IDEwOwoKICAgICRTZWxmLT57UGFnZVJlZnJlc2h9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT57ICRTZWxmLT57UHJlZktleVJlZnJlc2h9IH0KICAgICAgICB8fCAxOwoKICAgICRTZWxmLT57U3RhcnRIaXR9ID0gaW50KCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhcnRIaXQnICkgfHwgMSApOwoKICAgICRTZWxmLT57Q2FjaGVLZXl9ID0gJFNlbGYtPntOYW1lfSAuICc6Oic7CgogICAgIyBnZXQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZ1bGwgbmFtZSBvcmRlciBmb3IgdXNlciBuYW1lcwogICAgIyBhbmQgYXBwZW5kIGl0IHRvIHRoZSBjYWNoZSBrZXkgdG8gbWFrZSBzdXJlLCB0aGF0IHRoZQogICAgIyBjb3JyZWN0IGRhdGEgd2lsbCBiZSBkaXNwbGF5ZWQgZXZlcnkgdGltZQogICAgbXkgJEZpcnN0bmFtZUxhc3ROYW1lT3JkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZpcnN0bmFtZUxhc3RuYW1lT3JkZXInKSB8fCAwOwogICAgJFNlbGYtPntDYWNoZUtleX0gLj0gJzo6JyAuICRGaXJzdG5hbWVMYXN0TmFtZU9yZGVyOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFBhcmFtcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIERlc2MgID0+IFRyYW5zbGF0YWJsZSgnU2hvd24nKSwKICAgICAgICAgICAgTmFtZSAgPT4gJFNlbGYtPntQcmVmS2V5U2hvd259LAogICAgICAgICAgICBCbG9jayA9PiAnT3B0aW9uJywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgNSAgPT4gJyA1JywKICAgICAgICAgICAgICAgIDEwID0+ICcxMCcsCiAgICAgICAgICAgICAgICAxNSA9PiAnMTUnLAogICAgICAgICAgICAgICAgMjAgPT4gJzIwJywKICAgICAgICAgICAgICAgIDI1ID0+ICcyNScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRTZWxmLT57UGFnZVNob3dufSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzYyAgPT4gVHJhbnNsYXRhYmxlKCdSZWZyZXNoIChtaW51dGVzKScpLAogICAgICAgICAgICBOYW1lICA9PiAkU2VsZi0+e1ByZWZLZXlSZWZyZXNofSwKICAgICAgICAgICAgQmxvY2sgPT4gJ09wdGlvbicsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIDAgID0+IFRyYW5zbGF0YWJsZSgnb2ZmJyksCiAgICAgICAgICAgICAgICAxICA9PiAnMScsCiAgICAgICAgICAgICAgICAyICA9PiAnMicsCiAgICAgICAgICAgICAgICA1ICA9PiAnNScsCiAgICAgICAgICAgICAgICA3ICA9PiAnNycsCiAgICAgICAgICAgICAgICAxMCA9PiAnMTAnLAogICAgICAgICAgICAgICAgMTUgPT4gJzE1JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNlbGYtPntQYWdlUmVmcmVzaH0sCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBQYXJhbXM7Cn0KCnN1YiBDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gKAogICAgICAgICV7ICRTZWxmLT57Q29uZmlnfSB9LAoKICAgICAgICBDYW5SZWZyZXNoID0+IDEsCgogICAgICAgICMgcmVtZW1iZXIsIGRvIG5vdCBhbGxvdyB0byB1c2UgcGFnZSBjYWNoZQogICAgICAgICMgKGl0J3Mgbm90IHdvcmtpbmcgYmVjYXVzZSBvZiBpbnRlcm5hbCBmaWx0ZXIpCiAgICAgICAgQ2FjaGVLZXkgPT4gdW5kZWYsCiAgICAgICAgQ2FjaGVUVEwgPT4gdW5kZWYsCiAgICApOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIHNldHRpbmdzCiAgICBteSAkSWRsZU1pbnV0ZXMgPSAkU2VsZi0+e0NvbmZpZ30tPntJZGxlTWludXRlc30gfHwgNjA7CiAgICBteSAkU29ydEJ5ICAgICAgPSAkU2VsZi0+e0NvbmZpZ30tPntTb3J0Qnl9ICAgICAgfHwgJ1VzZXJGdWxsbmFtZSc7CgogICAgIyBnZXQgYSBsaXN0IG9mIGF0IGxlYXN0IHJlYWRhYmxlIGNhbGVuZGFycwogICAgbXkgQENhbGVuZGFyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpLT5DYWxlbmRhckxpc3QoCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgKTsKCiAgICAjIGNvbGxlY3QgY2FsZW5kYXIgYW5kIGFwcG9pbnRtZW50IGRhdGEKICAgICMgc2VwYXJhdGUgYXBwb2ludG1lbnRzIHRvIHRvZGF5LCB0b21vcnJvdwogICAgIyBhbmQgdGhlIG5leHQgZml2ZSBkYXlzIChzb29uKQogICAgbXkgJUNhbGVuZGFyczsKICAgIG15ICVBcHBvaW50bWVudHM7CiAgICBteSAlQXBwb2ludG1lbnRzQ291bnQ7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5Q2FsZW5kYXJzICAgICAgICAgPSAkU2VsZi0+e0NhY2hlS2V5fSAuICRTZWxmLT57VXNlcklEfSAuICc6OkNhbGVuZGFycyc7CiAgICBteSAkQ2FjaGVLZXlBcHBvaW50bWVudHMgICAgICA9ICRTZWxmLT57Q2FjaGVLZXl9IC4gJFNlbGYtPntVc2VySUR9IC4gJzo6QXBwb2ludG1lbnRzOjonIC4gJFNlbGYtPntGaWx0ZXJ9OwogICAgbXkgJENhY2hlS2V5QXBwb2ludG1lbnRzQ291bnQgPSAkU2VsZi0+e0NhY2hlS2V5fSAuICRTZWxmLT57VXNlcklEfSAuICc6OkFwcG9pbnRtZW50c0NvdW50JzsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGdldCBjYWNoZWQgZGF0YQogICAgbXkgJERhdGFDYWxlbmRhcnMgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICdEYXNoYm9hcmQnLAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5Q2FsZW5kYXJzLAogICAgKTsKICAgIG15ICREYXRhQXBwb2ludG1lbnRzID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAnRGFzaGJvYXJkJywKICAgICAgICBLZXkgID0+ICRDYWNoZUtleUFwcG9pbnRtZW50cywKICAgICk7CiAgICBteSAkRGF0YUFwcG9pbnRtZW50c0NvdW50ID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAnRGFzaGJvYXJkJywKICAgICAgICBLZXkgID0+ICRDYWNoZUtleUFwcG9pbnRtZW50c0NvdW50LAogICAgKTsKCiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgaWYgY2FjaGUgaXMgdXAtdG8tZGF0ZSwgdXNlIHRoZSBnaXZlbiBkYXRhCiAgICBpZiAoCiAgICAgICAgcmVmICREYXRhQ2FsZW5kYXJzIGVxICdIQVNIJwogICAgICAgICYmIHJlZiAkRGF0YUFwcG9pbnRtZW50cyBlcSAnSEFTSCcKICAgICAgICAmJiByZWYgJERhdGFBcHBvaW50bWVudHNDb3VudCBlcSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJUNhbGVuZGFycyAgICAgICAgID0gJXskRGF0YUNhbGVuZGFyc307CiAgICAgICAgJUFwcG9pbnRtZW50cyAgICAgID0gJXskRGF0YUFwcG9pbnRtZW50c307CiAgICAgICAgJUFwcG9pbnRtZW50c0NvdW50ID0gJXskRGF0YUFwcG9pbnRtZW50c0NvdW50fTsKICAgIH0KCiAgICAjIGNvbGxlY3QgdGhlIGRhdGEgYWdhaW4gaWYgbmVjZXNzYXJ5CiAgICBlbHNlIHsKCiAgICAgICAgQ0FMRU5EQVI6CiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFyTGlzdCkgewoKICAgICAgICAgICAgbmV4dCBDQUxFTkRBUiBpZiAhJENhbGVuZGFyOwogICAgICAgICAgICBuZXh0IENBTEVOREFSIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkQ2FsZW5kYXIpOwogICAgICAgICAgICBuZXh0IENBTEVOREFSIGlmICRDYWxlbmRhcnN7ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9IH07CgogICAgICAgICAgICAkQ2FsZW5kYXJzeyAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSB9ID0gJENhbGVuZGFyOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUgZm9yIGNhbGVuZGFycwogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnRGFzaGJvYXJkJywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5Q2FsZW5kYXJzLAogICAgICAgICAgICBWYWx1ZSA9PiBcJUNhbGVuZGFycywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDb25maWd9LT57Q2FjaGVUVExMb2NhbH0gKiA2MCwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgY2FsZW5kYXIgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgJUFwcG9pbnRtZW50c1Vuc29ydGVkOwoKICAgICAgICAjIGdldCBhIGxvY2FsIGFwcG9pbnRtZW50IG9iamVjdAogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAgICAgQ0FMRU5EQVJJRDoKICAgICAgICBmb3IgbXkgJENhbGVuZGFySUQgKCBzb3J0IGtleXMgJUNhbGVuZGFycyApIHsKCiAgICAgICAgICAgIG5leHQgQ0FMRU5EQVJJRCBpZiAhJENhbGVuZGFySUQ7CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRUaW1lc3RhbXBHZXQoKSwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDQUxFTkRBUklEIGlmICFJc0FycmF5UmVmV2l0aERhdGEoIFxAQXBwb2ludG1lbnRzICk7CgogICAgICAgICAgICBBUFBPSU5UTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewoKICAgICAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlQgaWYgISRBcHBvaW50bWVudDsKICAgICAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcHBvaW50bWVudCk7CgogICAgICAgICAgICAgICAgIyBzYXZlIHN5c3RlbSB0aW1lIG9mIFN0YXJ0VGltZQogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3lzdGVtVGltZVN0YXJ0fSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzYXZlIGFwcG9pbnRtZW50IGluIG5ldyBoYXNoIGZvciBsYXRlciBzb3J0aW5nCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzVW5zb3J0ZWR7ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9IH0gPSAkQXBwb2ludG1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGRhdGV0aW1lIHN0cmluZ3MgZm9yIHRoZSBkYXRlcyB3aXRoIHJlbGF0ZWQgb2Zmc2V0cwogICAgICAgICMgKHRvZGF5LCB0b21vcnJvdyBhbmQgc29vbiAtIHdoaWNoIG1lYW5zIHRoZSBuZXh0IDUgZGF5cwogICAgICAgICMgZXhjZXB0IHRvZGF5IGFuZCB0b21vcnJvdyBjb3VudGVkIGZyb20gY3VycmVudCB0aW1lc3RhbXApCiAgICAgICAgbXkgJURhdGVPZmZzZXQgPSAoCiAgICAgICAgICAgIFRvZGF5ICAgICA9PiAwLAogICAgICAgICAgICBUb21vcnJvdyAgPT4gODY0MDAsCiAgICAgICAgICAgIFBsdXNUd28gICA9PiAxNzI4MDAsCiAgICAgICAgICAgIFBsdXNUaHJlZSA9PiAyNTkyMDAsCiAgICAgICAgICAgIFBsdXNGb3VyICA9PiAzNDU2MDAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJURhdGVzOwoKICAgICAgICAjIGdldCBjdXJyZW50IHRpbWVzdGFtcAogICAgICAgIG15ICRDdXJyZW50U3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKTsKCiAgICAgICAgZm9yIG15ICREYXRlT2Zmc2V0S2V5ICggc29ydCBrZXlzICVEYXRlT2Zmc2V0ICkgewoKICAgICAgICAgICAgIyBnZXQgZGF0ZSB1bml0cyB3aXRoIGN1cnJlbnQgb2Zmc2V0CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEN1cnJlbnRTeXN0ZW1UaW1lICsgJERhdGVPZmZzZXR7JERhdGVPZmZzZXRLZXl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJERhdGVzeyREYXRlT2Zmc2V0S2V5fQogICAgICAgICAgICAgICAgPSBzcHJpbnRmKCAiJTAyZCIsICRZZWFyICkgLiAnLScgLiBzcHJpbnRmKCAiJTAyZCIsICRNb250aCApIC4gJy0nIC4gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgfQoKICAgICAgICAkQXBwb2ludG1lbnRzQ291bnR7VG9kYXl9ICAgID0gMDsKICAgICAgICAkQXBwb2ludG1lbnRzQ291bnR7VG9tb3Jyb3d9ID0gMDsKICAgICAgICAkQXBwb2ludG1lbnRzQ291bnR7U29vbn0gICAgID0gMDsKCiAgICAgICAgQVBQT0lOVE1FTlRJRDoKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKCBzb3J0IGtleXMgJUFwcG9pbnRtZW50c1Vuc29ydGVkICkgewoKICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEIGlmICEkQXBwb2ludG1lbnRJRDsKICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJEFwcG9pbnRtZW50c1Vuc29ydGVkeyRBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICBuZXh0IEFQUE9JTlRNRU5USUQgaWYgISRBcHBvaW50bWVudHNVbnNvcnRlZHskQXBwb2ludG1lbnRJRH0tPntTdGFydFRpbWV9OwoKICAgICAgICAgICAgIyBleHRyYWN0IGN1cnJlbnQgZGF0ZSAod2l0aG91dCB0aW1lKQogICAgICAgICAgICBteSAkU3RhcnREYXRlU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRzVW5zb3J0ZWR7JEFwcG9pbnRtZW50SUR9LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlRJRCBpZiAhJFN0YXJ0RGF0ZVN5c3RlbVRpbWU7CgogICAgICAgICAgICBteSAoICRDU2Vjb25kLCAkQ01pbnV0ZSwgJENIb3VyLCAkQ0RheSwgJENNb250aCwgJENZZWFyLCAkQ0RheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnREYXRlU3lzdGVtVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdGFydERhdGUKICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwMmQiLCAkQ1llYXIgKSAuICctJyAuIHNwcmludGYoICIlMDJkIiwgJENNb250aCApIC4gJy0nIC4gc3ByaW50ZiggIiUwMmQiLCAkQ0RheSApOwoKICAgICAgICAgICAgIyB0b2RheQogICAgICAgICAgICBpZiAoICRTdGFydERhdGUgZXEgJERhdGVze1RvZGF5fSApIHsKCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzQ291bnR7VG9kYXl9Kys7CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0ZpbHRlcn0gZXEgJ1RvZGF5JyApIHsKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfSA9ICRBcHBvaW50bWVudHNVbnNvcnRlZHskQXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdG9tb3Jyb3cKICAgICAgICAgICAgZWxzaWYgKCAkU3RhcnREYXRlIGVxICREYXRlc3tUb21vcnJvd30gKSB7CgogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1RvbW9ycm93fSsrOwoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntGaWx0ZXJ9IGVxICdUb21vcnJvdycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c3skQXBwb2ludG1lbnRJRH0gPSAkQXBwb2ludG1lbnRzVW5zb3J0ZWR7JEFwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNvb24KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgJFN0YXJ0RGF0ZSBlcSAkRGF0ZXN7UGx1c1R3b30KICAgICAgICAgICAgICAgIHx8ICRTdGFydERhdGUgZXEgJERhdGVze1BsdXNUaHJlZX0KICAgICAgICAgICAgICAgIHx8ICRTdGFydERhdGUgZXEgJERhdGVze1BsdXNGb3VyfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzQ291bnR7U29vbn0rKzsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RmlsdGVyfSBlcSAnU29vbicgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c3skQXBwb2ludG1lbnRJRH0gPSAkQXBwb2ludG1lbnRzVW5zb3J0ZWR7JEFwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBjYWNoZSBmb3IgYXBwb2ludG1lbnRzCiAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICdEYXNoYm9hcmQnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXlBcHBvaW50bWVudHMsCiAgICAgICAgICAgIFZhbHVlID0+IFwlQXBwb2ludG1lbnRzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntDYWNoZVRUTExvY2FsfSAqIDYwLAogICAgICAgICk7CgogICAgICAgICMgc2V0IGNhY2hlIGZvciBhcHBvaW50bWVudHMgY291bnQKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0Rhc2hib2FyZCcsCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleUFwcG9pbnRtZW50c0NvdW50LAogICAgICAgICAgICBWYWx1ZSA9PiBcJUFwcG9pbnRtZW50c0NvdW50LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntDYWNoZVRUTExvY2FsfSAqIDYwLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBteSAkQXBwb2ludG1lbnRUYWJsZUJsb2NrID0gJ0NvbnRlbnRTbWFsbFRhYmxlJzsKCiAgICAjIHByZXBhcmUgYXBwb2ludG1lbnRzIHRhYmxlCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDb250ZW50U21hbGxUYWJsZScsCiAgICApOwoKICAgICMgZ2V0IHRpbWV6b25lIG9mZnNldCBmb3IgY3VycmVudCB1c2VyCiAgICBteSAkVGltZXpvbmVPZmZzZXRSYXcgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJFRpbWV6b25lT2Zmc2V0ID0gJFRpbWV6b25lT2Zmc2V0UmF3ICogNjAgKiA2MDsKCiAgICBteSAkQ291bnQgPSAwOwogICAgbXkgJFNob3duID0gMDsKCiAgICBBUFBPSU5UTUVOVElEOgogICAgZm9yIG15ICRBcHBvaW50bWVudElEICgKICAgICAgICBzb3J0IHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50c3skYX0tPntTeXN0ZW1UaW1lU3RhcnR9IDw9PiAkQXBwb2ludG1lbnRzeyRifS0+e1N5c3RlbVRpbWVTdGFydH0KICAgICAgICAgICAgICAgIHx8ICRBcHBvaW50bWVudHN7JGF9LT57QXBwb2ludG1lbnRJRH0gPD0+ICRBcHBvaW50bWVudHN7JGJ9LT57QXBwb2ludG1lbnRJRH0KICAgICAgICB9IGtleXMgJUFwcG9pbnRtZW50cwogICAgICAgICkKICAgIHsKICAgICAgICAjIHBhZ2luYXRpb24gaGFuZGxpbmcKICAgICAgICBsYXN0IEFQUE9JTlRNRU5USUQgaWYgJFNob3duID49ICRTZWxmLT57UGFnZVNob3dufTsKCiAgICAgICAgaWYgKCAoICRTZWxmLT57U3RhcnRIaXR9IC0gMSApID4gJENvdW50ICkgewogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN0YXJ0U3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9LT57U3RhcnRUaW1lfSwKICAgICAgICApOwoKICAgICAgICBteSAoICRBU2Vjb25kLCAkQU1pbnV0ZSwgJEFIb3VyLCAkQURheSwgJEFNb250aCwgJEFZZWFyLCAkQURheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFN5c3RlbVRpbWUgKyAkVGltZXpvbmVPZmZzZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIGRhdGVzIGFuZCB0aW1lcwogICAgICAgIG15ICRTdGFydFRpbWUgICAgID0gc3ByaW50ZiggIiUwMmQiLCAkQUhvdXIgKSAuICc6JyAuIHNwcmludGYoICIlMDJkIiwgJEFNaW51dGUgKTsKICAgICAgICBteSAkU3RhcnRUaW1lTG9uZyA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgLT5Gb3JtYXRUaW1lU3RyaW5nKCAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfS0+e1N0YXJ0VGltZX0sICdEYXRlRm9ybWF0TG9uZycgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9LT57VGl0bGV9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lTG9uZyA9PiAkU3RhcnRUaW1lTG9uZywKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICAgPT4gJENhbGVuZGFyc3sgJEFwcG9pbnRtZW50c3skQXBwb2ludG1lbnRJRH0tPntDYWxlbmRhcklEfSB9LT57Q29sb3J9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJOYW1lICA9PiAkQ2FsZW5kYXJzeyAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfS0+e0NhbGVuZGFySUR9IH0tPntDYWxlbmRhck5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgaW5jcmVhc2Ugc2hvd24gaXRlbSBjb3VudAogICAgICAgICRTaG93bisrOwogICAgfQoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJUFwcG9pbnRtZW50cyApICkgewoKICAgICAgICAjIHNob3cgdXAgbWVzc2FnZSBmb3Igbm8gYXBwb2ludG1lbnRzCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50Tm9uZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBjc3MgY2xhc3MKICAgIG15ICVTdW1tYXJ5OwogICAgJFN1bW1hcnl7ICRTZWxmLT57RmlsdGVyfSAuICc6OlNlbGVjdGVkJyB9ID0gJ1NlbGVjdGVkJzsKCiAgICAjIGZpbHRlciBiYXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50RmlsdGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJXsgJFNlbGYtPntDb25maWd9IH0sCiAgICAgICAgICAgICVTdW1tYXJ5LAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICRTZWxmLT57TmFtZX0sCiAgICAgICAgICAgIFRvZGF5Q291bnQgICAgPT4gJEFwcG9pbnRtZW50c0NvdW50e1RvZGF5fSwKICAgICAgICAgICAgVG9tb3Jyb3dDb3VudCA9PiAkQXBwb2ludG1lbnRzQ291bnR7VG9tb3Jyb3d9LAogICAgICAgICAgICBTb29uQ291bnQgICAgID0+ICRBcHBvaW50bWVudHNDb3VudHtTb29ufSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBwYWdlIG5hdiBiYXIKICAgIG15ICRUb3RhbCAgICA9ICRBcHBvaW50bWVudHNDb3VudHsgJFNlbGYtPntGaWx0ZXJ9IH0gfHwgMDsKICAgIG15ICRMaW5rUGFnZSA9ICdTdWJhY3Rpb249RWxlbWVudDtOYW1lPScgLiAkU2VsZi0+e05hbWV9IC4gJztGaWx0ZXI9JyAuICRTZWxmLT57RmlsdGVyfSAuICc7JzsKICAgIG15ICVQYWdlTmF2ICA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgU3RhcnRIaXQgICAgICAgPT4gJFNlbGYtPntTdGFydEhpdH0sCiAgICAgICAgUGFnZVNob3duICAgICAgPT4gJFNlbGYtPntQYWdlU2hvd259LAogICAgICAgIEFsbEhpdHMgICAgICAgID0+ICRUb3RhbCB8fCAxLAogICAgICAgIEFjdGlvbiAgICAgICAgID0+ICdBY3Rpb249JyAuICRMYXlvdXRPYmplY3QtPntBY3Rpb259LAogICAgICAgIExpbmsgICAgICAgICAgID0+ICRMaW5rUGFnZSwKICAgICAgICBXaW5kb3dTaXplICAgICA9PiA1LAogICAgICAgIEFKQVhSZXBsYWNlICAgID0+ICdEYXNoYm9hcmQnIC4gJFNlbGYtPntOYW1lfSwKICAgICAgICBJRFByZWZpeCAgICAgICA9PiAnRGFzaGJvYXJkJyAuICRTZWxmLT57TmFtZX0sCiAgICAgICAgS2VlcFNjcmlwdFRhZ3MgPT4gJFBhcmFte0FKQVh9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDb250ZW50U21hbGxBcHBvaW50bWVudEZpbHRlck5hdkJhcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICV7ICRTZWxmLT57Q29uZmlnfSB9LAogICAgICAgICAgICBOYW1lID0+ICRTZWxmLT57TmFtZX0sCiAgICAgICAgICAgICVQYWdlTmF2LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIHJlZnJlc2ggdGltZQogICAgbXkgJFJlZnJlc2ggPSAkTGF5b3V0T2JqZWN0LT57ICRTZWxmLT57UHJlZktleVJlZnJlc2h9IH0gLy8gMTsKCiAgICBteSAkTmFtZUhUTUwgPSAkU2VsZi0+e05hbWV9OwogICAgJE5hbWVIVE1MID1+IHN7LX17X314bXNnOwoKICAgIG15ICRDb250ZW50ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAleyAkU2VsZi0+e0NvbmZpZ30gfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntOYW1lfSwKICAgICAgICAgICAgTmFtZUhUTUwgICAgPT4gJE5hbWVIVE1MLAogICAgICAgICAgICBSZWZyZXNoVGltZSA9PiAkUmVmcmVzaCAqIDYwLAogICAgICAgIH0sCiAgICAgICAgS2VlcFNjcmlwdFRhZ3MgPT4gJFBhcmFte0FKQVh9LAogICAgKTsKCiAgICByZXR1cm4gJENvbnRlbnQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7U3ViYWN0aW9uPUFwcG9pbnRtZW50Q3JlYXRlIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPgogICAgPHNwYW4+CiAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlIj48L2k+CiAgICAgICAgWyUgVHJhbnNsYXRlKCJOZXcgQXBwb2ludG1lbnQiKSB8IGh0bWwgJV0KICAgIDwvc3Bhbj4KPC9hPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnRGaWx0ZXIiKSAlXQo8ZGl2IGNsYXNzPSJEYXNoYm9hcmRBY3Rpb25zIj4KICAgIDx1bCBjbGFzcz0iQXBwb2ludG1lbnRGaWx0ZXIgVGFiIEFjdGlvbnMiPgogICAgICAgIDxsaSBjbGFzcz0iWyUgRGF0YS5pdGVtKCJUb2RheTo6U2VsZWN0ZWQiKSB8IGh0bWwgJV0iPjxhIGhyZWY9IiMiIGlkPSJEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdVG9kYXkiIGNsYXNzPSJbJSBEYXRhLml0ZW0oIlRvZGF5OjpTZWxlY3RlZCIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9kYXkiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiVG9kYXkiKSB8IGh0bWwgJV0gKFslIERhdGEuVG9kYXlDb3VudCB8IGh0bWwgJV0pPC9hPjwvbGk+CiAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLml0ZW0oIlRvbW9ycm93OjpTZWxlY3RlZCIpIHwgaHRtbCAlXSI+PGEgaHJlZj0iIyIgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1Ub21vcnJvdyIgY2xhc3M9IlslIERhdGEuaXRlbSgiVG9tb3Jyb3c6OlNlbGVjdGVkIikgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb21vcnJvdyIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJUb21vcnJvdyIpIHwgaHRtbCAlXSAoWyUgRGF0YS5Ub21vcnJvd0NvdW50IHwgaHRtbCAlXSk8L2E+PC9saT4KICAgICAgICA8bGkgY2xhc3M9IlslIERhdGEuaXRlbSgiU29vbjo6U2VsZWN0ZWQiKSB8IGh0bWwgJV0iPjxhIGhyZWY9IiMiIGlkPSJEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdU29vbiIgY2xhc3M9IlslIERhdGEuaXRlbSgiU29vbjo6U2VsZWN0ZWQiKSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNvb24iKSB8IGh0bWwgJV0gKFslIFRyYW5zbGF0ZSgiNSBkYXlzIikgfCBodG1sICVdKSI+WyUgVHJhbnNsYXRlKCJTb29uIikgfCBodG1sICVdIChbJSBEYXRhLlNvb25Db3VudCB8IGh0bWwgJV0pPC9hPjwvbGk+CiAgICA8L3VsPgo8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKCiAgICAvLyBsb2FkIGZpbHRlciBmb3IgdG9kYXkKICAgICQoJyNEYXNoYm9hcmQnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ1slIERhdGEuTmFtZSB8IGh0bWwgJV0nKSArICdUb2RheScpLnVuYmluZCgnY2xpY2snKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICAgICAgQ29yZS5BSkFYLkNvbnRlbnRVcGRhdGUoJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpKSwgJ1slIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1FbGVtZW50O05hbWU9WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTtGaWx0ZXI9VG9kYXknLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgLy8gbG9hZCBmaWx0ZXIgZm9yIHRvbW9ycm93CiAgICAkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykgKyAnVG9tb3Jyb3cnKS51bmJpbmQoJ2NsaWNrJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpewogICAgICAgIENvcmUuQUpBWC5Db250ZW50VXBkYXRlKCQoJyNEYXNoYm9hcmQnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ1slIERhdGEuTmFtZSB8IGh0bWwgJV0nKSksICdbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RWxlbWVudDtOYW1lPVslIERhdGEuTmFtZSB8IGh0bWwgJV07RmlsdGVyPVRvbW9ycm93JywgZnVuY3Rpb24gKCkgewogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwoKICAgIC8vIGxvYWQgZmlsdGVyIGZvciBzb29uCiAgICAkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykgKyAnU29vbicpLnVuYmluZCgnY2xpY2snKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICAgICAgQ29yZS5BSkFYLkNvbnRlbnRVcGRhdGUoJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpKSwgJ1slIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1FbGVtZW50O05hbWU9WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTtGaWx0ZXI9U29vbicsIGZ1bmN0aW9uICgpIHsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRTbWFsbEFwcG9pbnRtZW50RmlsdGVyTmF2QmFyIikgJV0KPHNwYW4gY2xhc3M9IlNwYWNpbmdUb3AgUGFnaW5hdGlvbiI+CiAgICBbJSBEYXRhLlNpdGVOYXZCYXIgJV0KPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnRGaWx0ZXJOYXZCYXIiKSAlXQoKWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRTbWFsbEFwcG9pbnRtZW50RmlsdGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRTbWFsbFRhYmxlIikgJV0KPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgPHRoZWFkPgogICAgICAgIDx0cj4KICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMTRweDsiPjwvdGg+CiAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDE0cHg7Ij5bJSBUcmFuc2xhdGUoIlN0YXJ0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgIDwvdHI+CiAgICA8L3RoZWFkPgogICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50U21hbGxBcHBvaW50bWVudFJvdyIpICVdCiAgICAgICAgPHRyIGNsYXNzPSJNYXN0ZXJBY3Rpb24iPgogICAgICAgICAgICA8dGQgY2xhc3M9IkZsYWdzIENlbnRlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIiB0aXRsZT0iWyUgRGF0YS5DYWxlbmRhck5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogWyUgRGF0YS5Db2xvciB8IGh0bWwgJV07IGJvcmRlcjogMXB4IHNvbGlkICNCQkI7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yNSk7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7Ij48L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIHRpdGxlPSJbJSBEYXRhLlN0YXJ0VGltZUxvbmcgfCBodG1sICVdIj5bJSBEYXRhLlN0YXJ0VGltZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICA8dGQ+PGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9WyUgRGF0YS5BcHBvaW50bWVudElEIHwgdXJsICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGxBcHBvaW50bWVudFJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRTbWFsbEFwcG9pbnRtZW50Tm9uZSIpICVdCiAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm5vbmUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnROb25lIikgJV0KICAgIDwvdGJvZHk+CjwvdGFibGU+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGxUYWJsZSIpICVdCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKJCgnLk1hc3RlckFjdGlvbicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICB2YXIgJE1hc3RlckFjdGlvbkxpbmsgPSAkKHRoaXMpLmZpbmQoJy5NYXN0ZXJBY3Rpb25MaW5rJyk7CiAgICAvLyBwcmV2ZW50IE1hc3RlckFjdGlvbiBvbiBEeW5hbWljIEZpZWxkcyBsaW5rcwogICAgaWYgKCQoRXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnRHluYW1pY0ZpZWxkTGluaycpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyBvbmx5IGFjdCBpZiB0aGUgbGluayB3YXMgbm90IGNsaWNrZWQgZGlyZWN0bHkKICAgIGlmIChFdmVudC50YXJnZXQgIT09ICRNYXN0ZXJBY3Rpb25MaW5rLmdldCgwKSkgewogICAgICAgIGlmIChFdmVudC5jdHJsS2V5IHx8IEV2ZW50Lm1ldGFLZXkpIHsKICAgICAgICAgICAgd2luZG93Lm9wZW4oJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICRNYXN0ZXJBY3Rpb25MaW5rLmF0dHIoJ2hyZWYnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9KTsKCkNvcmUuQ29uZmlnLlNldCgnUmVmcmVzaFNlY29uZHNfWyUgRGF0YS5OYW1lSFRNTCB8IGh0bWwgJV0nLCBwYXJzZUludCgiWyUgRGF0YS5SZWZyZXNoVGltZSB8IGh0bWwgJV0iLCAxMCkgfHwgMCk7CmlmIChDb3JlLkNvbmZpZy5HZXQoJ1JlZnJlc2hTZWNvbmRzX1slIERhdGEuTmFtZUhUTUwgfCBodG1sICVdJykpIHsKICAgIENvcmUuQ29uZmlnLlNldCgnVGltZXJfWyUgRGF0YS5OYW1lSFRNTCB8IGh0bWwgJV0nLCB3aW5kb3cuc2V0VGltZW91dCgKICAgICAgICBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpICsgJy1ib3gnKS5hZGRDbGFzcygnTG9hZGluZycpOwogICAgICAgICAgICBDb3JlLkFKQVguQ29udGVudFVwZGF0ZSgkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykpLCAnWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPUVsZW1lbnQ7TmFtZT1bJSBEYXRhLk5hbWUgfCBodG1sICVdJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpICsgJy1ib3gnKS5yZW1vdmVDbGFzcygnTG9hZGluZycpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KENvcmUuQ29uZmlnLkdldCgnVGltZXJfWyUgRGF0YS5OYW1lSFRNTCB8IGh0bWwgJV0nKSk7CiAgICAgICAgfSwKICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ1JlZnJlc2hTZWNvbmRzX1slIERhdGEuTmFtZUhUTUwgfCBodG1sICVdJykgKiAxMDAwKQogICAgKTsKfQoKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBEaWdlc3Q6Ok1ENTsKdXNlIE1JTUU6OkJhc2U2NCAoKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSB2YXJzIHF3KEBJU0EpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyIC0gY2FsZW5kYXIgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBjYWxlbmRhciBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIEBJU0EgPSBxdygKICAgICAgICBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyCiAgICApOwoKICAgICMgaW5pdCBvZiBldmVudCBoYW5kbGVyCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgPT4gJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdDYWxlbmRhcic7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMjQgKiAyMDsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENhbGVuZGFyQ3JlYXRlKCkKCmNyZWF0ZXMgYSBuZXcgY2FsZW5kYXIgZm9yIGdpdmVuIHVzZXIuCgogICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICBDYWxlbmRhck5hbWUgICAgPT4gJ01lZXRpbmdzJywgICAgICAgICAgIyAocmVxdWlyZWQpIFBlcnNvbmFsIGNhbGVuZGFyIG5hbWUKICAgICAgICBHcm91cElEICAgICAgICAgPT4gMywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIEdyb3VwSUQKICAgICAgICBDb2xvciAgICAgICAgICAgPT4gJyNGRjc3MDAnLCAgICAgICAgICAgIyAocmVxdWlyZWQpIENvbG9yIGluIGhleGFkZWNpbWFsIFJHQiBub3RhdGlvbgogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiA0LCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVXNlcklECgogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGFwcG9pbnRtZW50cywgYXJyYXkgcmVmIG9mIGhhc2hlcwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdGFydERhdGUgPT4gJ0ZpcnN0UmVzcG9uc2UnLAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgID0+ICdQbHVzXzUnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgID0+IFsgMiBdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAnVGhpcyBpcyBhIHRpdGxlJywKICAgICAgICAgICAgICAgICAgICBUeXBlcyA9PiAnVGhpcyBpcyBhIHR5cGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAoKICAgICAgICBWYWxpZElEID0+IDEsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBEZWZhdWx0IGlzIDEuCiAgICApOwoKcmV0dXJucyBDYWxlbmRhciBoYXNoIGlmIHN1Y2Nlc3NmdWw6CiAgICAlQ2FsZW5kYXIgPSAoCiAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDIsCiAgICAgICAgR3JvdXBJRCAgICAgID0+IDMsCiAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICdNZWV0aW5ncycsCiAgICAgICAgQ3JlYXRlVGltZSAgID0+ICcyMDE2LTAxLTAxIDA4OjAwOjAwJywKICAgICAgICBDcmVhdGVCeSAgICAgPT4gNCwKICAgICAgICBDaGFuZ2VUaW1lICAgPT4gJzIwMTYtMDEtMDEgMDg6MDA6MDAnLAogICAgICAgIENoYW5nZUJ5ICAgICA9PiA0LAogICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgKTsKCkV2ZW50czoKICAgIENhbGVuZGFyQ3JlYXRlCgo9Y3V0CgpzdWIgQ2FsZW5kYXJDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFyTmFtZSBHcm91cElEIENvbG9yIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGNvbG9yCiAgICBpZiAoICEoICRQYXJhbXtDb2xvcn0gPX4gLyNbQS1GMC05XXszLDZ9L2kgKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvbG9yIG11c3QgYmUgaW4gaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uLCBlZy4gI0ZGRkZGRi4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgdGlja2V0IGFwcG9pbnRtZW50cwogICAgaWYgKCAhKCBzY2FsYXIgQHsgJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gLy8gW10gfSApICkgewogICAgICAgICRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9ID0gdW5kZWY7CiAgICB9CgogICAgIyBtYWtlIGl0IHVwcGVyY2FzZSBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kKICAgICRQYXJhbXtDb2xvcn0gPSB1YyAkUGFyYW17Q29sb3J9OwoKICAgIG15ICRWYWxpZElEID0gZGVmaW5lZCAkUGFyYW17VmFsaWRJRH0gPyAkUGFyYW17VmFsaWRJRH0gOiAxOwoKICAgIG15ICVDYWxlbmRhciA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhck5hbWUgPT4gJFBhcmFte0NhbGVuZGFyTmFtZX0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIGNhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICByZXR1cm4gaWYgJUNhbGVuZGFyOwoKICAgICMgY3JlYXRlIHNhbHQgc3RyaW5nCiAgICBteSAkU2FsdFN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgIExlbmd0aCA9PiA2NCwKICAgICk7CgogICAgIyBzZXJpYWxpemUgYW5kIGVuY29kZSB0aWNrZXQgYXBwb2ludG1lbnQgZGF0YQogICAgbXkgJFRpY2tldEFwcG9pbnRtZW50czsKICAgIGlmICggJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gKSB7CiAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5TZXJpYWxpemUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30sCiAgICAgICAgKTsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZU91dHB1dCgkVGlja2V0QXBwb2ludG1lbnRzKTsKICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRzID0gTUlNRTo6QmFzZTY0OjplbmNvZGVfYmFzZTY0KCRUaWNrZXRBcHBvaW50bWVudHMpOwogICAgfQoKICAgIG15ICRTUUwgPSAnCiAgICAgICAgSU5TRVJUIElOVE8gY2FsZW5kYXIKICAgICAgICAgICAgKGdyb3VwX2lkLCBuYW1lLCBzYWx0X3N0cmluZywgY29sb3IsIHRpY2tldF9hcHBvaW50bWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksCiAgICAgICAgICAgIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksIHZhbGlkX2lkKQogICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCA/KQogICAgJzsKCiAgICAjIGNyZWF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtHcm91cElEfSwgXCRQYXJhbXtDYWxlbmRhck5hbWV9LCBcJFNhbHRTdHJpbmcsIFwkUGFyYW17Q29sb3J9LAogICAgICAgICAgICBcJFRpY2tldEFwcG9pbnRtZW50cywgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkVmFsaWRJRAogICAgICAgIF0sCiAgICApOwoKICAgICVDYWxlbmRhciA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhck5hbWUgPT4gJFBhcmFte0NhbGVuZGFyTmFtZX0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJUNhbGVuZGFyOwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgY2FjaGUgdmFsdWUKICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgVmFsdWUgPT4gXCVDYWxlbmRhciwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgIyByZXNldCBDYWxlbmRhckxpc3QKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICdDYWxlbmRhckxpc3QnLAogICAgKTsKCiAgICAjIGZpcmUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NhbGVuZGFyQ3JlYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVDYWxlbmRhciwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICVDYWxlbmRhcjsKfQoKPWl0ZW0gQ2FsZW5kYXJHZXQoKQoKZ2V0IGNhbGVuZGFyIGJ5IG5hbWUgb2QgaWQuCgogICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ01lZXRpbmdzJywgICAgICAgICAgIyAocmVxdWlyZWQpIENhbGVuZGFyIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIENhbGVuZGFySUQgICA9PiA0LCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgQ2FsZW5kYXJJRAoKICAgICAgICBVc2VySUQgICAgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFVzZXJJRCAtIFN5c3RlbSB3aWxsIGNoZWNrIGlmIHVzZXIgaGFzIGFjY2VzcyB0byBjYWxlbmRhciBpZiBwcm92aWRlZAogICAgKTsKCnJldHVybnMgQ2FsZW5kYXIgZGF0YToKICAgICVDYWxlbmRhciA9ICgKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gMiwKICAgICAgICBHcm91cElEICAgICAgICAgICAgPT4gMywKICAgICAgICBDYWxlbmRhck5hbWUgICAgICAgPT4gJ01lZXRpbmdzJywKICAgICAgICBDb2xvciAgICAgICAgICAgICAgPT4gJyNGRjc3MDAnLAogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSA9PiAnRmlyc3RSZXNwb25zZScsCiAgICAgICAgICAgICAgICBFbmREYXRlICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgPT4gWyAyIF0sCiAgICAgICAgICAgICAgICBTZWFyY2hQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICdUaGlzIGlzIGEgdGl0bGUnLAogICAgICAgICAgICAgICAgICAgIFR5cGVzID0+ICdUaGlzIGlzIGEgdHlwZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgQ3JlYXRlVGltZSA9PiAnMjAxNi0wMS0wMSAwODowMDowMCcsCiAgICAgICAgQ3JlYXRlQnkgICA9PiAxLAogICAgICAgIENoYW5nZVRpbWUgPT4gJzIwMTYtMDEtMDEgMDg6MDA6MDAnLAogICAgICAgIENoYW5nZUJ5ICAgPT4gMSwKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENhbGVuZGFyR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDYWxlbmRhcklEfSAmJiAhJFBhcmFte0NhbGVuZGFyTmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIENhbGVuZGFySUQgb3IgQ2FsZW5kYXJOYW1lISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJUNhbGVuZGFyOwoKICAgIGlmICggJFBhcmFte0NhbGVuZGFySUR9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIHZhbHVlIGlzIGNhY2hlZAogICAgICAgIG15ICREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJERhdGEpICkgewogICAgICAgICAgICAlQ2FsZW5kYXIgPSAleyREYXRhfTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJUNhbGVuZGFyICkgewoKICAgICAgICAjIGNyZWF0ZSBkYiBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgbXkgJFNRTCA9ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBncm91cF9pZCwgbmFtZSwgY29sb3IsIHRpY2tldF9hcHBvaW50bWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksCiAgICAgICAgICAgIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksIHZhbGlkX2lkCiAgICAgICAgICAgIEZST00gY2FsZW5kYXIKICAgICAgICAgICAgV0hFUkUKICAgICAgICAnOwoKICAgICAgICBteSBAQmluZDsKICAgICAgICBpZiAoICRQYXJhbXtDYWxlbmRhcklEfSApIHsKICAgICAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgICAgICBpZD0/CiAgICAgICAgICAgICc7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgICAgIG5hbWU9PwogICAgICAgICAgICAnOwogICAgICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NhbGVuZGFyTmFtZX07CiAgICAgICAgfQoKICAgICAgICAjIGRiIHF1ZXJ5CiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgICAgICMgZGVjb2RlIGFuZCBkZXNlcmlhbGl6ZSB0aWNrZXQgYXBwb2ludG1lbnQgZGF0YQogICAgICAgICAgICBteSAkVGlja2V0QXBwb2ludG1lbnRzOwogICAgICAgICAgICBpZiAoICRSb3dbNF0gKSB7CiAgICAgICAgICAgICAgICBteSAkRGVjb2RlZERhdGEgPSBNSU1FOjpCYXNlNjQ6OmRlY29kZV9iYXNlNjQoICRSb3dbNF0gKTsKICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKS0+RGVzZXJpYWxpemUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkRGVjb2RlZERhdGEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50cyA9IHVuZGVmIGlmIHJlZiAkVGlja2V0QXBwb2ludG1lbnRzIG5lICdBUlJBWSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRDYWxlbmRhcntDYWxlbmRhcklEfSAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAgICAgJENhbGVuZGFye0dyb3VwSUR9ICAgICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJOYW1lfSAgICAgICA9ICRSb3dbMl07CiAgICAgICAgICAgICRDYWxlbmRhcntDb2xvcn0gICAgICAgICAgICAgID0gJFJvd1szXTsKICAgICAgICAgICAgJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gPSAkVGlja2V0QXBwb2ludG1lbnRzOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q3JlYXRlVGltZX0gICAgICAgICA9ICRSb3dbNV07CiAgICAgICAgICAgICRDYWxlbmRhcntDcmVhdGVCeX0gICAgICAgICAgID0gJFJvd1s2XTsKICAgICAgICAgICAgJENhbGVuZGFye0NoYW5nZVRpbWV9ICAgICAgICAgPSAkUm93WzddOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2hhbmdlQnl9ICAgICAgICAgICA9ICRSb3dbOF07CiAgICAgICAgICAgICRDYWxlbmRhcntWYWxpZElEfSAgICAgICAgICAgID0gJFJvd1s5XTsKICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte0NhbGVuZGFySUR9ICkgewoKICAgICAgICAgICAgIyBjYWNoZQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gXCVDYWxlbmRhciwKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17VXNlcklEfSAmJiAkQ2FsZW5kYXJ7R3JvdXBJRH0gKSB7CgogICAgICAgICAgICAjIGdldCB1c2VyIGdyb3VwcwogICAgICAgICAgICBteSAlR3JvdXBMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFncmVwIHsgJENhbGVuZGFye0dyb3VwSUR9ID09ICRfIH0ga2V5cyAlR3JvdXBMaXN0ICkgewogICAgICAgICAgICAgICAgJUNhbGVuZGFyID0gKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVDYWxlbmRhcjsKfQoKPWl0ZW0gQ2FsZW5kYXJMaXN0KCkKCmdldCBjYWxlbmRhciBsaXN0LgoKICAgIG15IEBSZXN1bHQgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICBVc2VySUQgICAgID0+IDQsICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZvciBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgUGVybWlzc2lvbiA9PiAncncnLCAgICAgICAgICMgKG9wdGlvbmFsKSBSZXF1aXJlZCBwZXJtaXNzaW9uIChkZWZhdWx0IHJvKQogICAgICAgIFZhbGlkSUQgICAgPT4gMSwgICAgICAgICAgICAjIChvcHRpb25hbCkgRGVmYXVsdCAwLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDAgLSBBbGwgc3RhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMSAtIEFsbCB2YWxpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDIgLSBBbGwgaW52YWxpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgLSBBbGwgdGVtcG9yYXJ5IGludmFsaWQKICAgICk7CgpyZXR1cm5zOgogICAgQFJlc3VsdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICA9PiAyLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gMywKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICdNZWV0aW5ncycsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGNzcwMCcsCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICA9PiAnMjAxNi0wMS0wMSAwODowMDowMCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICA9PiAzLAogICAgICAgICAgICBDaGFuZ2VUaW1lICAgPT4gJzIwMTYtMDEtMDEgMDg6MDA6MDAnLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgPT4gMywKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICA9PiAzLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gMywKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICdDdXN0b21lciBwcmVzZW50YXRpb25zJywKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjQkIwMEJCJywKICAgICAgICAgICAgQ3JlYXRlVGltZSAgID0+ICcyMDE2LTAxLTAxIDA4OjAwOjAwJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgID0+IDMsCiAgICAgICAgICAgIENoYW5nZVRpbWUgICA9PiAnMjAxNi0wMS0wMSAwODowMDowMCcsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICA9PiAzLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMCwKICAgICAgICB9LAogICAgICAgIC4uLgogICAgXTsKCj1jdXQKCnN1YiBDYWxlbmRhckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIE1ha2UgZGlmZmVyZW50IGNhY2hlIHR5cGUgZm9yIGxpc3QgKHNvIHdlIGNhbiBjbGVhciBjYWNoZSBieSB0aGlzIHZhbHVlKQogICAgbXkgJENhY2hlVHlwZSAgICAgPSAnQ2FsZW5kYXJMaXN0JzsKICAgIG15ICRDYWNoZUtleVVzZXIgID0gJFBhcmFte1VzZXJJRH0gfHwgJ2FsbC11c2VyLWlkcyc7CiAgICBteSAkQ2FjaGVLZXlWYWxpZCA9ICRQYXJhbXtWYWxpZElEfSB8fCAnYWxsLXZhbGlkLWlkcyc7CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBnZXQgY2FjaGVkIHZhbHVlIGlmIGV4aXN0cwogICAgbXkgJERhdGEgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICA9PiAiJENhY2hlS2V5VXNlci0kQ2FjaGVLZXlWYWxpZCIsCiAgICApOwoKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkRGF0YSkgKSB7CgogICAgICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAgICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgICAgIG15ICRTUUwgPSAnCiAgICAgICAgICAgIFNFTEVDVCBpZCwgZ3JvdXBfaWQsIG5hbWUsIGNvbG9yLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5LAogICAgICAgICAgICB2YWxpZF9pZAogICAgICAgICAgICBGUk9NIGNhbGVuZGFyCiAgICAgICAgICAgIFdIRVJFIDE9MQogICAgICAgICc7CiAgICAgICAgbXkgQEJpbmQ7CgogICAgICAgIGlmICggJFBhcmFte1ZhbGlkSUR9ICkgewogICAgICAgICAgICAkU1FMIC49ICcgQU5EIHZhbGlkX2lkPT8gJzsKICAgICAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtWYWxpZElEfTsKICAgICAgICB9CiAgICAgICAgJFNRTCAuPSAnT1JERVIgQlkgaWQgQVNDJzsKCiAgICAgICAgIyBkYiBxdWVyeQogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgICAgICk7CgogICAgICAgIG15IEBSZXN1bHQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIG15ICVDYWxlbmRhcjsKICAgICAgICAgICAgJENhbGVuZGFye0NhbGVuZGFySUR9ICAgPSAkUm93WzBdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7R3JvdXBJRH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgICAgICRDYWxlbmRhcntDYWxlbmRhck5hbWV9ID0gJFJvd1syXTsKICAgICAgICAgICAgJENhbGVuZGFye0NvbG9yfSAgICAgICAgPSAkUm93WzNdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q3JlYXRlVGltZX0gICA9ICRSb3dbNF07CiAgICAgICAgICAgICRDYWxlbmRhcntDcmVhdGVCeX0gICAgID0gJFJvd1s1XTsKICAgICAgICAgICAgJENhbGVuZGFye0NoYW5nZVRpbWV9ICAgPSAkUm93WzZdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2hhbmdlQnl9ICAgICA9ICRSb3dbN107CiAgICAgICAgICAgICRDYWxlbmRhcntWYWxpZElEfSAgICAgID0gJFJvd1s4XTsKICAgICAgICAgICAgcHVzaCBAUmVzdWx0LCBcJUNhbGVuZGFyOwogICAgICAgIH0KCiAgICAgICAgIyBjYWNoZSBkYXRhCiAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgICAgIEtleSAgID0+ICIkQ2FjaGVLZXlVc2VyLSRDYWNoZUtleVZhbGlkIiwKICAgICAgICAgICAgVmFsdWUgPT4gXEBSZXN1bHQsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CgogICAgICAgICREYXRhID0gXEBSZXN1bHQ7CiAgICB9CgogICAgaWYgKCAkUGFyYW17VXNlcklEfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBncm91cHMKICAgICAgICBteSAlR3JvdXBMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAkUGFyYW17UGVybWlzc2lvbn0gfHwgJ3JvJywKICAgICAgICApOwoKICAgICAgICBteSBAUmVzdWx0OwoKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyREYXRhfSApIHsKICAgICAgICAgICAgaWYgKCBncmVwIHsgJEl0ZW0tPntHcm91cElEfSA9PSAkXyB9IGtleXMgJUdyb3VwTGlzdCApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFJlc3VsdCwgJEl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICREYXRhID0gXEBSZXN1bHQ7CiAgICB9CgogICAgcmV0dXJuIEB7JERhdGF9Owp9Cgo9aXRlbSBDYWxlbmRhclVwZGF0ZSgpCgp1cGRhdGVzIGFuIGV4aXN0aW5nIGNhbGVuZGFyLgoKICAgIG15ICRTdWNjZXNzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclVwZGF0ZSgKICAgICAgICBDYWxlbmRhcklEICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBDYWxlbmRhcklECiAgICAgICAgR3JvdXBJRCAgICAgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgQ2FsZW5kYXIgZ3JvdXAKICAgICAgICBDYWxlbmRhck5hbWUgICAgID0+ICdNZWV0aW5ncycsICAgICAgICAgICMgKHJlcXVpcmVkKSBQZXJzb25hbCBjYWxlbmRhciBuYW1lCiAgICAgICAgQ29sb3IgICAgICAgICAgICA9PiAnI0ZGOTkwMCcsICAgICAgICAgICAjIChyZXF1aXJlZCkgQ29sb3IgaW4gaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiA0LCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVXNlcklEICh3aG8gbWFkZSB1cGRhdGUpCiAgICAgICAgVmFsaWRJRCAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWRJRAoKICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWyAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBhcHBvaW50bWVudHMsIGFycmF5IHJlZiBvZiBoYXNoZXMKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3RhcnREYXRlID0+ICdGaXJzdFJlc3BvbnNlJywKICAgICAgICAgICAgICAgIEVuZERhdGUgICA9PiAnUGx1c181JywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICA9PiBbIDIgXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJ1RoaXMgaXMgYSB0aXRsZScsCiAgICAgICAgICAgICAgICAgICAgVHlwZXMgPT4gJ1RoaXMgaXMgYSB0eXBlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bAoKRXZlbnRzOgogICAgQ2FsZW5kYXJVcGRhdGUKCj1jdXQKCnN1YiBDYWxlbmRhclVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBHcm91cElEIENhbGVuZGFyTmFtZSBDb2xvciBVc2VySUQgVmFsaWRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGNvbG9yCiAgICBpZiAoICEoICRQYXJhbXtDb2xvcn0gPX4gLyNbQS1GMC05XXszLDZ9L2kgKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvbG9yIG11c3QgYmUgaW4gaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uLCBlZy4gI0ZGRkZGRi4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgdGlja2V0IGFwcG9pbnRtZW50cwogICAgaWYgKCAhKCBzY2FsYXIgQHsgJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gLy8gW10gfSApICkgewogICAgICAgICRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9ID0gdW5kZWY7CiAgICB9CgogICAgIyBtYWtlIGl0IHVwcGVyY2FzZSBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kKICAgICRQYXJhbXtDb2xvcn0gPSB1YyAkUGFyYW17Q29sb3J9OwoKICAgICMgc2VyaWFsaXplIGFuZCBlbmNvZGUgdGlja2V0IGFwcG9pbnRtZW50IGRhdGEKICAgIG15ICRUaWNrZXRBcHBvaW50bWVudHM7CiAgICBpZiAoICRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9ICkgewogICAgICAgICRUaWNrZXRBcHBvaW50bWVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKS0+U2VyaWFsaXplKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9LAogICAgICAgICk7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVPdXRwdXQoJFRpY2tldEFwcG9pbnRtZW50cyk7CiAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50cyA9IE1JTUU6OkJhc2U2NDo6ZW5jb2RlX2Jhc2U2NCgkVGlja2V0QXBwb2ludG1lbnRzKTsKICAgIH0KCiAgICBteSAkU1FMID0gJwogICAgICAgIFVQREFURSBjYWxlbmRhcgogICAgICAgIFNFVCBncm91cF9pZD0/LCBuYW1lPT8sIGNvbG9yPT8sIHRpY2tldF9hcHBvaW50bWVudHM9PywgY2hhbmdlX3RpbWU9Y3VycmVudF90aW1lc3RhbXAsCiAgICAgICAgY2hhbmdlX2J5PT8sIHZhbGlkX2lkPT8KICAgICc7CgogICAgbXkgQEJpbmQ7CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0dyb3VwSUR9LCBcJFBhcmFte0NhbGVuZGFyTmFtZX0sIFwkUGFyYW17Q29sb3J9LCBcJFRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VmFsaWRJRH07CgogICAgJFNRTCAuPSAnCiAgICAgICAgV0hFUkUgaWQ9PwogICAgJzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH07CgogICAgIyBjcmVhdGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgZ2V0IGNhY2hlIG9iamVjdAogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjbGVhciBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyTGlzdCcsCiAgICApOwoKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKCiAgICAjIGZpcmUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NhbGVuZGFyVXBkYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ2FsZW5kYXJJbXBvcnQoKQoKaW1wb3J0IGEgY2FsZW5kYXIKCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJJbXBvcnQoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgPT4gMiwKICAgICAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAzLAogICAgICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICdNZWV0aW5ncycsCiAgICAgICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjc3MDAnLAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YSA9PiB7CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIFBhcmVudElEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT3ZlcndyaXRlRXhpc3RpbmdFbnRpdGllcyA9PiAwLCAgICAgIyAob3B0aW9uYWwpIE92ZXJ3cml0ZSBleGlzdGluZyBjYWxlbmRhciBhbmQgYXBwb2ludG1lbnRzLCBkZWZhdWx0OiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSB3aWxsIGJlIG92ZXJ3cml0dGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBcHBvaW50bWVudHMgd2l0aCBzYW1lIFVuaXF1ZUlEIGluIGV4aXN0aW5nIGNhbGVuZGFyIHdpbGwgYmUgb3ZlcndyaXR0ZW4KICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bAoKPWN1dAoKc3ViIENhbGVuZGFySW1wb3J0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RGF0YX0gKTsKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFyRGF0YX0gKTsKCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RGF0YX0tPntDYWxlbmRhckRhdGF9LT57VGlja2V0QXBwb2ludG1lbnRzfQogICAgICAgICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Q2FsZW5kYXJEYXRhfS0+e1RpY2tldEFwcG9pbnRtZW50c30gKQogICAgICAgICkKICAgIHsKICAgICAgICAjIEdldCBxdWV1ZSBjcmVhdGUgcGVybWlzc2lvbnMgZm9yIHRoZSB1c2VyLgogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICBteSBAVmFsaWRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICMgUXVldWUgZmllbGQgaW4gdGlja2V0IGFwcG9pbnRtZW50cyBpcyBtYW5kYXRvcnksIGNoZWNrIGlmIGl0J3MgcHJlc2VudCBhbmQgdmFsaWQuCiAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJFBhcmFte0RhdGF9LT57Q2FsZW5kYXJEYXRhfS0+e1RpY2tldEFwcG9pbnRtZW50c30gfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRSdWxlLT57UXVldWVJRH0gJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkUnVsZS0+e1F1ZXVlSUR9ICkgKSB7CgogICAgICAgICAgICAgICAgUVVFVUVfSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IEB7ICRSdWxlLT57UXVldWVJRH0gfHwgW10gfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAhZ3JlcCB7ICRfIGVxICRRdWV1ZURhdGF7VmFsaWRJRH0gfSBAVmFsaWRJRHMKICAgICAgICAgICAgICAgICAgICAgICAgfHwgISRVc2VyR3JvdXBzeyAkUXVldWVEYXRhe0dyb3VwSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgcXVldWUgSUQgJFF1ZXVlSUQgaW4gdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgb3Igbm8gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgcXVldWUgSUQgaW4gdGlja2V0IGFwcG9pbnRtZW50IHJ1bGVzIScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGNhbGVuZGFyCiAgICBteSAlRXhpc3RpbmdDYWxlbmRhciA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhck5hbWUgPT4gJFBhcmFte0RhdGF9LT57Q2FsZW5kYXJEYXRhfS0+e0NhbGVuZGFyTmFtZX0sCiAgICApOwoKICAgIG15ICRDYWxlbmRhcklEOwoKICAgICMgY3JlYXRlIG5ldyBjYWxlbmRhcgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlRXhpc3RpbmdDYWxlbmRhciApICkgewogICAgICAgIG15ICVDYWxlbmRhciA9ICRTZWxmLT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgJXsgJFBhcmFte0RhdGF9LT57Q2FsZW5kYXJEYXRhfSB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gaWYgISRDYWxlbmRhcntDYWxlbmRhcklEfTsKCiAgICAgICAgJENhbGVuZGFySUQgPSAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH07CiAgICB9CgogICAgIyB1cGRhdGUgZXhpc3RpbmcgY2FsZW5kYXIKICAgIGVsc2UgewogICAgICAgIGlmICggJFBhcmFte092ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXN9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5DYWxlbmRhclVwZGF0ZSgKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFyRGF0YX0gfSwKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEV4aXN0aW5nQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gaWYgISRTdWNjZXNzOwogICAgICAgIH0KCiAgICAgICAgJENhbGVuZGFySUQgPSAkRXhpc3RpbmdDYWxlbmRhcntDYWxlbmRhcklEfTsKICAgIH0KCiAgICAjIGltcG9ydCBhcHBvaW50bWVudHMKICAgIGlmICggJENhbGVuZGFySUQgJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudERhdGF9ICkgKSB7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRBcHBvaW50bWVudElEOwoKICAgICAgICBBUFBPSU5UTUVOVDoKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50ICggQHsgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnREYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgdG8gZXhpc3RpbmcgY2FsZW5kYXIKICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57Q2FsZW5kYXJJRH0gPSAkQ2FsZW5kYXJJRDsKCiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBhcHBvaW50bWVudCBpZiBOT1Qgb3ZlcndyaXRpbmcgZXhpc3RpbmcgZW50aXRpZXMKICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57VW5pcXVlSUR9ID0gdW5kZWYgaWYgISRQYXJhbXtPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzfTsKCiAgICAgICAgICAgICMgc2tpcCBhZGRpbmcgYXV0b21hdGljIHJlY3VycmluZyBvY2N1cnJlbmNlcwogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e1JlY3VycmluZ30gKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntSZWN1cnJpbmdSYXd9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcGFyZW50IGlkIHRvIGxhc3QgYXBwb2ludG1lbnQgaWQKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnQtPntQYXJlbnRJRH0gKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntQYXJlbnRJRH0gPSAkQXBwb2ludG1lbnRJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJXskQXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gaWYgISRBcHBvaW50bWVudElEOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ2FsZW5kYXJFeHBvcnQoKQoKZXhwb3J0IGEgY2FsZW5kYXIKCiAgICBteSAlRGF0YSA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJFeHBvcnQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAyLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIH0KCnJldHVybnMgY2FsZW5kYXIgaGFzaCB3aXRoIGRhdGE6CgogICAgJURhdGEgPSAoCiAgICAgICAgQ2FsZW5kYXJEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDIsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAzLAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ01lZXRpbmdzJywKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjRkY3NzAwJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBcHBvaW50bWVudERhdGEgPT4gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEICAgICAgID0+IDIsCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLi4uCiAgICAgICAgKSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2FsZW5kYXJFeHBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNhbGVuZGFyIGRhdGEKICAgIG15ICVDYWxlbmRhckRhdGEgPSAkU2VsZi0+Q2FsZW5kYXJHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCBcJUNhbGVuZGFyRGF0YSApOwoKICAgICMgZ2V0IGFwcG9pbnRtZW50IG9iamVjdAogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgICMgZ2V0IGxpc3Qgb2YgYXBwb2ludG1lbnRzCiAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgKTsKCiAgICBteSBAQXBwb2ludG1lbnREYXRhOwoKICAgIEFQUE9JTlRNRU5USUQ6CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICk7CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEIGlmICElQXBwb2ludG1lbnQ7CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEIGlmICRBcHBvaW50bWVudHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH07CgogICAgICAgIHB1c2ggQEFwcG9pbnRtZW50RGF0YSwgXCVBcHBvaW50bWVudDsKICAgIH0KCiAgICBteSAlUmVzdWx0ID0gKAogICAgICAgIENhbGVuZGFyRGF0YSAgICA9PiBcJUNhbGVuZGFyRGF0YSwKICAgICAgICBBcHBvaW50bWVudERhdGEgPT4gXEBBcHBvaW50bWVudERhdGEsCiAgICApOwoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aXRlbSBDYWxlbmRhclBlcm1pc3Npb25HZXQoKQoKZ2V0IHBlcm1pc3Npb24gbGV2ZWwgZm9yIGdpdmVuIENhbGVuZGFySUQgYW5kIFVzZXJJRC4KCiAgICBteSAkUGVybWlzc2lvbiA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJQZXJtaXNzaW9uR2V0KAogICAgICAgIENhbGVuZGFySUQgID0+IDEsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBDYWxlbmRhcklECiAgICAgICAgVXNlcklEICAgICAgPT4gNCwgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFVzZXJJRAogICAgKTsKCnJldHVybnM6CiAgICAkUGVybWlzc2lvbiA9ICdydyc7ICAgICMgJ3JvJywgJ3J3JywuLi4KCj1jdXQKCnN1YiBDYWxlbmRhclBlcm1pc3Npb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbWFrZSBzdXJlIHN1cGVyIHVzZXIgaGFzIHJlYWQvd3JpdGUgcGVybWlzc2lvbgogICAgcmV0dXJuICdydycgaWYgJFBhcmFte1VzZXJJRH0gZXEgMTsKCiAgICBteSAlQ2FsZW5kYXIgPSAkU2VsZi0+Q2FsZW5kYXJHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICApOwoKICAgIG15ICRSZXN1bHQgPSAnJzsKCiAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICBUWVBFOgogICAgZm9yIG15ICRUeXBlIChxdyhybyBtb3ZlX2ludG8gY3JlYXRlIHJ3KSkgewoKICAgICAgICBteSAlR3JvdXBEYXRhID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJFR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkR3JvdXBEYXRheyAkQ2FsZW5kYXJ7R3JvdXBJRH0gfSApIHsKICAgICAgICAgICAgJFJlc3VsdCA9ICRUeXBlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGFzdCBUWVBFOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzVGlja2V0KCkKCkhhbmRsZSB0aGUgYXV0b21hdGljIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIHRoZSB0aWNrZXQuCgogICAgJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NUaWNrZXQoCiAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICk7CgpUaGlzIG1ldGhvZCBkb2VzIG5vdCBoYXZlIHJldHVybiB2YWx1ZS4KCj1jdXQKCnN1YiBUaWNrZXRBcHBvaW50bWVudFByb2Nlc3NUaWNrZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVGlja2V0SUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBhbGwgdmFsaWQgY2FsZW5kYXJzCiAgICBteSBAQ2FsZW5kYXJzID0gJFNlbGYtPkNhbGVuZGFyTGlzdCgKICAgICAgICBWYWxpZElEID0+IDEsCiAgICApOwogICAgcmV0dXJuIGlmICFAQ2FsZW5kYXJzOwoKICAgICMgZ2V0IHRpY2tldCBhcHBvaW50bWVudCB0eXBlcwogICAgbXkgJVRpY2tldEFwcG9pbnRtZW50VHlwZXMgPSAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnRUeXBlc0dldCgpOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnbyB0aHJvdWdoIGFsbCBjYWxlbmRhcnMgd2l0aCBkZWZpbmVkIHRpY2tldCBhcHBvaW50bWVudHMKICAgIENBTEVOREFSOgogICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFycykgewogICAgICAgIG15ICVDYWxlbmRhckRhdGEgPSAkU2VsZi0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKICAgICAgICBuZXh0IENBTEVOREFSIGlmICEkQ2FsZW5kYXJEYXRhe1RpY2tldEFwcG9pbnRtZW50c307CgogICAgICAgIFRJQ0tFVF9BUFBPSU5UTUVOVFM6CiAgICAgICAgZm9yIG15ICRUaWNrZXRBcHBvaW50bWVudHMgKCBAeyAkQ2FsZW5kYXJEYXRhe1RpY2tldEFwcG9pbnRtZW50c30gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgYXBwb2ludG1lbnQgdHlwZXMKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoU3RhcnREYXRlIEVuZERhdGUpKSB7CgogICAgICAgICAgICAgICAgIyBhbGxvdyBzcGVjaWFsIHRpbWUgcHJlc2V0cyBmb3IgRW5kRGF0ZQogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQgbmUgJ0VuZERhdGUnICYmICEoICRUaWNrZXRBcHBvaW50bWVudHMtPnskRmllbGR9ID1+IC9eUGx1c18vICkgKSB7CgogICAgICAgICAgICAgICAgICAgICMgc2tpcCBpZiB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBpcyBpbnZhbGlkCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFRpY2tldEFwcG9pbnRtZW50VHlwZXN7ICRUaWNrZXRBcHBvaW50bWVudHMtPnskRmllbGR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgVElDS0VUX0FQUE9JTlRNRU5UUzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgdGlja2V0IHNhdGlzZmllcyB0aGUgc2VhcmNoIGZpbHRlciBmcm9tIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZQogICAgICAgICAgICAjIHBhc3MgYWxsIGNvbmZpZ3VyZWQgcGFyYW1ldGVycyB0byB0aWNrZXQgc2VhcmNoLCBpbmNsdWRpbmcgdGlja2V0IGlkCiAgICAgICAgICAgIG15ICRGaWx0ZXJlZCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgICAgIFJlc3VsdCAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUXVldWVJRHMgPT4gJFRpY2tldEFwcG9pbnRtZW50cy0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgICV7ICRUaWNrZXRBcHBvaW50bWVudHMtPntTZWFyY2hQYXJhbX0gLy8ge30gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGlja2V0IHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoJEZpbHRlcmVkKSB7CgogICAgICAgICAgICAgICAgIyBwcm9jZXNzIHRpY2tldCBhcHBvaW50bWVudCBydWxlCiAgICAgICAgICAgICAgICAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnRQcm9jZXNzUnVsZSgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgICAgPT4gXCVUaWNrZXRBcHBvaW50bWVudFR5cGVzLAogICAgICAgICAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJFRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpY2tldCB3YXMgbm90IGZvdW5kCiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFueSBleGlzdGluZyB0aWNrZXQgYXBwb2ludG1lbnQKICAgICAgICAgICAgICAgICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICAgID0+ICRUaWNrZXRBcHBvaW50bWVudHMtPntSdWxlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGVidWcnKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlByb2Nlc3NlZCB0aWNrZXQgYXBwb2ludG1lbnRzIGZvciB0aWNrZXQgJFBhcmFte1RpY2tldElEfS4iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcigpCgpIYW5kbGUgdGhlIGF1dG9tYXRpYyB0aWNrZXQgYXBwb2ludG1lbnRzIGZvciB0aGUgY2FsZW5kYXIuCgogICAgbXkgJVJlc3VsdCA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRQcm9jZXNzQ2FsZW5kYXIoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAxLAogICAgKTsKClJldHVybnMgbG9nIG9mIHByb2Nlc3NlZCB0aWNrZXRzIGFuZCBydWxlczoKCiVSZXN1bHQgPSAoCiAgICBQcm9jZXNzID0+IFsKICAgICAgICB7CiAgICAgICAgICAgIFRpY2tldElEID0+IDEsCiAgICAgICAgICAgIFJ1bGVJRCAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsCiAgICAgICAgICAgIFN1Y2Nlc3MgID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIFRpY2tldElEID0+IDIsCiAgICAgICAgICAgIFJ1bGVJRCAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsCiAgICAgICAgICAgIFN1Y2Nlc3MgID0+IDEsCiAgICAgICAgfSwKICAgIF0sCiAgICBDbGVhbnVwID0+IFsKICAgICAgICB7CiAgICAgICAgICAgIFJ1bGVJRCAgPT4gJ2IyNzJhMDM1ZWQ4MmQ2NWE5MjdhOTkzMDBlMDBjOWI1JywKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICBdLAopOwoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc0NhbGVuZGFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDYWxlbmRhcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2FsZW5kYXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBHZXQgY2FsZW5kYXIgY29uZmlndXJhdGlvbi4KICAgIG15ICVDYWxlbmRhciA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICk7CiAgICBpZiAoICElQ2FsZW5kYXIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZmluZCBjYWxlbmRhciAkUGFyYW17Q2FsZW5kYXJJRH0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEdldCB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZXMKICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFR5cGVzID0gJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50VHlwZXNHZXQoKTsKCiAgICBteSBAUHJvY2VzczsKICAgIG15IEBDbGVhbnVwOwogICAgbXkgJVJ1bGVJRExvb2t1cDsKCiAgICAjIENoZWNrIHRpY2tldCBhcHBvaW50bWVudHMgY29uZmlnLgogICAgaWYgKCAkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfSAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9ICkgKSB7CgogICAgICAgICMgR2V0IGFjdGl2ZSBydWxlIElEcyBmcm9tIHRoZSBjYWxlbmRhciBjb25maWd1cmF0aW9uLgogICAgICAgICVSdWxlSURMb29rdXAgPSBtYXAgeyAkXy0+e1J1bGVJRH0gPT4gMSB9IEB7ICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9IH07CgogICAgICAgIFRJQ0tFVF9BUFBPSU5UTUVOVFM6CiAgICAgICAgZm9yIG15ICRUaWNrZXRBcHBvaW50bWVudHMgKCBAeyAkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfSB9ICkgewoKICAgICAgICAgICAgIyBDaGVjayBhcHBvaW50bWVudCB0eXBlcy4KICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoU3RhcnREYXRlIEVuZERhdGUpKSB7CgogICAgICAgICAgICAgICAgIyBBbGxvdyBzcGVjaWFsIHRpbWUgcHJlc2V0cyBmb3IgRW5kRGF0ZS4KICAgICAgICAgICAgICAgIGlmICggJEZpZWxkIG5lICdFbmREYXRlJyAmJiAhKCAkVGlja2V0QXBwb2ludG1lbnRzLT57JEZpZWxkfSA9fiAvXlBsdXNfLyApICkgewoKICAgICAgICAgICAgICAgICAgICAjIFNraXAgaWYgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgaXMgaW52YWxpZC4KICAgICAgICAgICAgICAgICAgICBpZiAoICEkVGlja2V0QXBwb2ludG1lbnRUeXBlc3sgJFRpY2tldEFwcG9pbnRtZW50cy0+eyRGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUSUNLRVRfQVBQT0lOVE1FTlRTOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBHZXQgcHJldmlvdXNseSBjcmVhdGVkIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIHRoaXMgcnVsZS4KICAgICAgICAgICAgbXkgJU9sZEFwcG9pbnRtZW50cyA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSdWxlSUQgICAgID0+ICRUaWNrZXRBcHBvaW50bWVudHMtPntSdWxlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBGaW5kIHRpY2tldHMgdGhhdCBtYXRjaCBzZWFyY2ggZmlsdGVyCiAgICAgICAgICAgIG15IEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICAgICBSZXN1bHQgICA9PiAnQVJSQVknLAogICAgICAgICAgICAgICAgUXVldWVJRHMgPT4gJFRpY2tldEFwcG9pbnRtZW50cy0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgICV7ICRUaWNrZXRBcHBvaW50bWVudHMtPntTZWFyY2hQYXJhbX0gLy8ge30gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgUHJvY2VzcyBlYWNoIHRpY2tldCBiYXNlZCBvbiB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZS4KICAgICAgICAgICAgVElDS0VUSUQ6CiAgICAgICAgICAgIGZvciBteSAkVGlja2V0SUQgKCBzb3J0IEBUaWNrZXRJRHMgKSB7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NSdWxlKAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgICAgPT4gXCVUaWNrZXRBcHBvaW50bWVudFR5cGVzLAogICAgICAgICAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJFRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAUHJvY2VzcywgewogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICA9PiAkVGlja2V0QXBwb2ludG1lbnRzLT57UnVsZUlEfSwKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUmVtb3ZlIHByZXZpb3VzbHkgY3JlYXRlZCB0aWNrZXQgYXBwb2ludG1lbnRzIGlmIHRoZXkgZG9uJ3QgbWF0Y2ggdGhlIHJ1bGUgYW55bW9yZS4KICAgICAgICAgICAgT0xEVElDS0VUSUQ6CiAgICAgICAgICAgIGZvciBteSAkT2xkVGlja2V0SUQgKCBzb3J0IGtleXMgJU9sZEFwcG9pbnRtZW50cyApIHsKICAgICAgICAgICAgICAgIG5leHQgT0xEVElDS0VUSUQgaWYgZ3JlcCB7ICRPbGRUaWNrZXRJRCA9PSAkXyB9IEBUaWNrZXRJRHM7CgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkT2xkQXBwb2ludG1lbnRzeyRPbGRUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkT2xkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgUnVsZUlEICAgICAgICA9PiAkVGlja2V0QXBwb2ludG1lbnRzLT57UnVsZUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAQ2xlYW51cCwgewogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJE9sZEFwcG9pbnRtZW50c3skT2xkVGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJE9sZFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgICAgPT4gJFRpY2tldEFwcG9pbnRtZW50cy0+e1J1bGVJRH0sCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQFJ1bGVJRHMgPSAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnRSdWxlSURzR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKCiAgICAjIFJlbW92ZSB0aWNrZXQgYXBwb2ludG1lbnRzIGZvciBtaXNzaW5nIHJ1bGVzLgogICAgZm9yIG15ICRSdWxlSUQgKEBSdWxlSURzKSB7CiAgICAgICAgaWYgKCAhJFJ1bGVJRExvb2t1cHskUnVsZUlEfSApIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJFJ1bGVJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQENsZWFudXAsIHsKICAgICAgICAgICAgICAgIFJ1bGVJRCAgPT4gJFJ1bGVJRCwKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEZWJ1ZycpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiUHJvY2Vzc2VkIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIGNhbGVuZGFyICRQYXJhbXtDYWxlbmRhcklEfS4iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgICBQcm9jZXNzID0+IFxAUHJvY2VzcywKICAgICAgICBDbGVhbnVwID0+IFxAQ2xlYW51cCwKICAgICk7Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1J1bGUoKQoKUHJvY2VzcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgYW5kIGNyZWF0ZSwgdXBkYXRlIG9yIGRlbGV0ZSBhcHBvaW50bWVudCBpZiBuZWNlc3NhcnkuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1J1bGUoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAxLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIER5bmFtaWNGaWVsZF9UZXN0RGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpEeW5hbWljRmllbGQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICAuLi4KICAgICAgICB9LAogICAgICAgIFJ1bGUgPT4gewogICAgICAgICAgICBTdGFydERhdGUgPT4gJ0R5bmFtaWNGaWVsZF9UZXN0RGF0ZScsCiAgICAgICAgICAgIEVuZERhdGUgICA9PiAnUGx1c181JywKICAgICAgICAgICAgUXVldWVJRCAgID0+IFsgMiBdLAogICAgICAgICAgICBSdWxlSUQgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlID0+ICdXZWxjb21lKicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsLgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1J1bGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgQ29uZmlnIFJ1bGUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0NvbmZpZ30gKTsKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtSdWxlfSApOwoKICAgIG15ICRFcnJvcjsKICAgIG15ICRBcHBvaW50bWVudFR5cGU7CiAgICBteSAlQXBwb2ludG1lbnREYXRhOwoKICAgIG15ICRNYWluT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgZ2V0IHN0YXJ0IGFuZCBlbmQgdGltZSB2YWx1ZXMKICAgIGZvciBteSAkRmllbGQgKHF3KFN0YXJ0RGF0ZSBFbmREYXRlKSkgewogICAgICAgIG15ICRUeXBlID0gJFBhcmFte1J1bGV9LT57JEZpZWxkfTsKCiAgICAgICAgIyBhcHBvaW50bWVudCBmaWVsZHMgYXJlIG5hbWVkIGRpZmZlcmVudGx5CiAgICAgICAgbXkgJEFwcG9pbnRtZW50RmllbGQgPSAkRmllbGQ7CiAgICAgICAgJEFwcG9pbnRtZW50RmllbGQgPX4gcy9EYXRlJC9UaW1lLzsKCiAgICAgICAgIyBjaGVjayBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmVnaXN0ZXJlZCB0eXBlCiAgICAgICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+eyRUeXBlfSAmJiAkUGFyYW17Q29uZmlnfS0+eyRUeXBlfS0+e01vZHVsZX0gKSB7CiAgICAgICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJFBhcmFte0NvbmZpZ30tPnskVHlwZX0tPntNb2R1bGV9OwoKICAgICAgICAgICAgIyBnZXQgdGhlIHRpbWUgdmFsdWUgdmlhIHRoZSBtb2R1bGUgbWV0aG9kCiAgICAgICAgICAgIGlmICggJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50RGF0YXskQXBwb2ludG1lbnRGaWVsZH0gPSAkR2VuZXJpY01vZHVsZS0+bmV3KCAleyRTZWxmfSApLT5HZXRUaW1lKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEVycm9yID0gMSBpZiAhJEFwcG9pbnRtZW50RGF0YXskQXBwb2ludG1lbnRGaWVsZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdGltZSBwcmVzZXRzIGFyZSB2YWxpZCBvbmx5IGZvciBlbmQgdGltZSBhbmQgZXhpc3Rpbmcgc3RhcnQgdGltZQogICAgICAgIGVsc2lmICggJEZpZWxkIGVxICdFbmREYXRlJyAmJiAkQXBwb2ludG1lbnREYXRhe1N0YXJ0VGltZX0gKSB7CiAgICAgICAgICAgIGlmICggJFR5cGUgPX4gL15QbHVzXyhbMC05XSspJC8gKSB7CiAgICAgICAgICAgICAgICBteSAkUHJlc2V0ID0gaW50ICQxOwoKICAgICAgICAgICAgICAgICMgZ2V0IHN0YXJ0IHRpbWUKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudERhdGF7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjYWxjdWxhdGUgZW5kIHRpbWUgdXNpbmcgcHJlc2V0IHZhbHVlCiAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICRTdGFydFRpbWUgKyA2MCAqICRQcmVzZXQ7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnREYXRhe0VuZFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCB0aW1lIHByZXNldDogJFR5cGUiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1bmtub3duIHR5cGUKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEVycm9yID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmV2ZW50IGVuZCB0aW1lIGJlZm9yZSBzdGFydCB0aW1lCiAgICBpZiAoICRBcHBvaW50bWVudERhdGF7U3RhcnRUaW1lfSAmJiAkQXBwb2ludG1lbnREYXRhe0VuZFRpbWV9ICkgewogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnREYXRhe1N0YXJ0VGltZX0sCiAgICAgICAgKTsKICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudERhdGF7RW5kVGltZX0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRFbmRUaW1lIDwgJFN0YXJ0VGltZSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50RGF0YXtFbmRUaW1lfSA9ICRBcHBvaW50bWVudERhdGF7U3RhcnRUaW1lfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnQgdGl0bGUKICAgIGlmICggISRFcnJvciApIHsKCiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgIG15ICRUaWNrZXRIb29rICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJyk7CiAgICAgICAgbXkgJFRpY2tldEhvb2tEaXZpZGVyID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJyk7CiAgICAgICAgbXkgJVRpY2tldCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkQXBwb2ludG1lbnREYXRhe1RpdGxlfSA9ICJbJFRpY2tldEhvb2skVGlja2V0SG9va0RpdmlkZXIkVGlja2V0e1RpY2tldE51bWJlcn1dICRUaWNrZXR7VGl0bGV9IjsKICAgIH0KCiAgICBteSAkU3VjY2VzczsKCiAgICAjIGNoZWNrIGlmIHRpY2tldCBhcHBvaW50bWVudCBhbHJlYWR5IGV4aXN0cwogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50R2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBSdWxlSUQgICAgID0+ICRQYXJhbXtSdWxlfS0+e1J1bGVJRH0sCiAgICApOwoKICAgICMgdGlja2V0IGFwcG9pbnRtZW50IHdhcyBmb3VuZAogICAgaWYgKCRBcHBvaW50bWVudElEKSB7CgogICAgICAgICMgZGVsZXRlIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQsIGlmIGVycm9yIHdhcyByYWlzZWQKICAgICAgICBpZiAoJEVycm9yKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgID0+ICRQYXJhbXtSdWxlfS0+e1J1bGVJRH0sCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIHRpY2tldCBhcHBvaW50bWVudCwgb3RoZXJ3aXNlCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgICAgPT4gJFBhcmFte1J1bGV9LT57UnVsZUlEfSwKICAgICAgICAgICAgICAgICVBcHBvaW50bWVudERhdGEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHRpY2tldCBhcHBvaW50bWVudCBpZiBub3QgZm91bmQKICAgIGVsc2lmICggISRFcnJvciApIHsKICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJFBhcmFte1J1bGV9LT57UnVsZUlEfSwKICAgICAgICAgICAgJUFwcG9pbnRtZW50RGF0YSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRVcGRhdGVUaWNrZXQoKQoKVXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4KCiAgICAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50VXBkYXRlVGlja2V0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+IDEsCiAgICApOwoKVGhpcyBtZXRob2QgZG9lcyBub3QgaGF2ZSByZXR1cm4gdmFsdWUuCgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRVcGRhdGVUaWNrZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnQgZGF0YQogICAgbXkgJUFwcG9pbnRtZW50RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgc3RvcCBpZiBub3QgdGlja2V0IGFwcG9pbnRtZW50CiAgICByZXR1cm4gaWYgISRBcHBvaW50bWVudERhdGF7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9OwoKICAgICMgZ2V0IHRpY2tldCBhcHBvaW50bWVudCBydWxlCiAgICBteSAkUnVsZSA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFJ1bGVHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnREYXRhe0NhbGVuZGFySUR9LAogICAgICAgIFJ1bGVJRCAgICAgPT4gJEFwcG9pbnRtZW50RGF0YXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkUnVsZSk7CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRUeXBlcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0KCk7CgogICAgbXkgJE1haW5PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgcHJvY2VzcyBzdGFydCBhbmQgZW5kIHRpbWUgdmFsdWVzCiAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydERhdGUgRW5kRGF0ZSkpIHsKICAgICAgICBteSAkVHlwZSA9ICRSdWxlLT57JEZpZWxkfTsKCiAgICAgICAgIyBhcHBvaW50bWVudCBmaWVsZHMgYXJlIG5hbWVkIGRpZmZlcmVudGx5CiAgICAgICAgbXkgJEFwcG9pbnRtZW50RmllbGQgPSAkRmllbGQ7CiAgICAgICAgJEFwcG9pbnRtZW50RmllbGQgPX4gcy9EYXRlJC9UaW1lLzsKCiAgICAgICAgIyBjaGVjayBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmVnaXN0ZXJlZCB0eXBlCiAgICAgICAgaWYgKCAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3skVHlwZX0gJiYgJFRpY2tldEFwcG9pbnRtZW50VHlwZXN7JFR5cGV9LT57TW9kdWxlfSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3skVHlwZX0tPntNb2R1bGV9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHRpbWUgdmFsdWUgdmlhIHRoZSBtb2R1bGUgbWV0aG9kCiAgICAgICAgICAgIGlmICggJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewoKICAgICAgICAgICAgICAgICMgbG9vcCBwcm90ZWN0aW9uOiBwcmV2ZW50IHRpY2tldCBldmVudCBtb2R1bGUgZnJvbSBydW5uaW5nCiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT57J19UaWNrZXRBcHBvaW50bWVudHM6OkFscmVhZHlQcm9jZXNzZWQnfS0+eyAkUGFyYW17VGlja2V0SUR9IH0rKzsKCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICktPlNldFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEFwcG9pbnRtZW50RGF0YXskQXBwb2ludG1lbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVycm9yIHNldHRpbmcgJFR5cGUgZm9yIHRpY2tldCAkUGFyYW17VGlja2V0SUR9ISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGVidWcnKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVwZGF0ZWQgdGlja2V0ICRQYXJhbXtUaWNrZXRJRH0gZnJvbSBhcHBvaW50bWVudCAkUGFyYW17QXBwb2ludG1lbnRJRH0uIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybjsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCgpCgpnZXQgdGlja2V0IGlkIG9mIGEgdGlja2V0IGFwcG9pbnRtZW50LgoKICAgIG15ICRUaWNrZXRJRCA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICApOwoKcmV0dXJucyBhcHBvaW50bWVudCBJRCBpZiBzdWNjZXNzZnVsLgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50VGlja2V0SUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBBcHBvaW50bWVudElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgdGlja2V0X2lkCiAgICAgICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnRfdGlja2V0CiAgICAgICAgICAgIFdIRVJFIGFwcG9pbnRtZW50X2lkID0gPwogICAgICAgICcsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0FwcG9pbnRtZW50SUR9LCBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRUaWNrZXRJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUaWNrZXRJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRUaWNrZXRJRDsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRSdWxlSURzR2V0KCkKCmdldCB1c2VkIHRpY2tldCBhcHBvaW50bWVudCBydWxlcyBmb3Igc3BlY2lmaWMgY2FsZW5kYXIuCgogICAgbXkgQFJ1bGVJRHMgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UnVsZUlEc0dldCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgVGlja2V0SUQgICA9PiAxLCAgICAjIChvcHRpb25hbCkgUmV0dXJuIHJ1bGVzIHVzZWQgb25seSBmb3Igc3BlY2lmaWMgdGlja2V0CiAgICApOwoKcmV0dXJucyBhcnJheSBvZiBydWxlIElEcyBpZiBmb3VuZC4KCj1jdXQKCnN1YiBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFNRTCA9ICcKICAgICAgICBTRUxFQ1QgcnVsZV9pZAogICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnRfdGlja2V0CiAgICAgICAgV0hFUkUgY2FsZW5kYXJfaWQgPSA/CiAgICAnOwogICAgbXkgQEJpbmQ7CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NhbGVuZGFySUR9OwoKICAgICMgc3BlY2lmaWMgdGlja2V0IHF1ZXJ5IGNvbmRpdGlvbgogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRTUUwgLj0gJwogICAgICAgICAgICBBTkQgdGlja2V0X2lkID0gPwogICAgICAgICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtUaWNrZXRJRH07CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSAlUnVsZUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRSdWxlSURzeyAkUm93WzBdIH0gPSAxOwogICAgfQoKICAgICMgcmV0dXJuIHVuaXF1ZSBydWxlIGlkcwogICAgcmV0dXJuIGtleXMgJVJ1bGVJRHM7Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgpCgpnZXQgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUuCgogICAgbXkgJFJ1bGUgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgUnVsZUlEICAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLAogICAgKTsKCnJldHVybnMgcnVsZSBoYXNoOgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50UnVsZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBSdWxlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c307CgogICAgbXkgJFJlc3VsdDsKCiAgICBSVUxFOgogICAgZm9yIG15ICRSdWxlICggQHsgJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gfHwgW10gfSApIHsKICAgICAgICBpZiAoICRSdWxlLT57UnVsZUlEfSBlcSAkUGFyYW17UnVsZUlEfSApIHsKICAgICAgICAgICAgJFJlc3VsdCA9ICRSdWxlOwogICAgICAgICAgICBsYXN0IFJVTEU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGlmICEkUmVzdWx0OwoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0KCkKCmdldCBkZWZpbmVkIHRpY2tldCBhcHBvaW50bWVudCB0eXBlcyBmcm9tIGNvbmZpZy4KCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRUeXBlcyA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRUeXBlc0dldCgpOwoKcmV0dXJucyBoYXNoIG9mIGFwcG9pbnRtZW50IHR5cGVzOgoKICAgICVUaWNrZXRBcHBvaW50bWVudFR5cGVzID0gKCk7Cgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRUeXBlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRpY2tldCBhcHBvaW50bWVudCB0eXBlcwogICAgbXkgJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFR5cGUnKQogICAgICAgIC8vIHt9OwogICAgcmV0dXJuIGlmICEkVGlja2V0QXBwb2ludG1lbnRDb25maWc7CgogICAgbXkgJVRpY2tldEFwcG9pbnRtZW50VHlwZXM7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICBUWVBFOgogICAgZm9yIG15ICRUeXBlS2V5ICggc29ydCBrZXlzICV7JFRpY2tldEFwcG9pbnRtZW50Q29uZmlnfSApIHsKICAgICAgICBuZXh0IFRZUEUgaWYgISRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fS0+e0tleX07CgogICAgICAgIGlmICggJFR5cGVLZXkgPX4gL0R5bmFtaWNGaWVsZCQvICkgewoKICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiBhbGwgdmFsaWQgZGF0ZSBhbmQgZGF0ZS90aW1lIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSBuZSAnRGF0ZScgJiYgJER5bmFtaWNGaWVsZC0+e0ZpZWxkVHlwZX0gbmUgJ0RhdGVUaW1lJzsKCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gc3ByaW50ZiggJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fSwgJER5bmFtaWNGaWVsZC0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3skS2V5fSA9ICRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50VHlwZXN7ICRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fS0+e0tleX0gfSA9CiAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fTsKICAgIH0KCiAgICByZXR1cm4gJVRpY2tldEFwcG9pbnRtZW50VHlwZXM7Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50RGVsZXRlKCkKCmRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQocykuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgIENhbGVuZGFySUQgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIENhbGVuZGFySUQKICAgICAgICBSdWxlSUQgICAgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICAgICMgKHJlcXVpcmVkKSBSdWxlSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKICAgICAgICBUaWNrZXRJRCAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBUaWNrZXQgSUQKCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgQXBwb2ludG1lbnQgSUQgaXMga25vd24KICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bC4KCj1jdXQKCnN1YiBUaWNrZXRBcHBvaW50bWVudERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggKCAhJFBhcmFte0NhbGVuZGFySUR9IHx8ICEkUGFyYW17UnVsZUlEfSApICYmICEkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDYWxlbmRhcklEIGFuZCBSdWxlSUQsIG9yIFRpY2tldElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQEFwcG9pbnRtZW50SURzOwogICAgcHVzaCBAQXBwb2ludG1lbnRJRHMsICRQYXJhbXtBcHBvaW50bWVudElEfSBpZiAkUGFyYW17QXBwb2ludG1lbnRJRH07CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBBcHBvaW50bWVudCBJRCBpcyB1bmtub3duLgogICAgaWYgKCAhQEFwcG9pbnRtZW50SURzICkgewogICAgICAgIG15ICRTUUwgPSAnCiAgICAgICAgICAgIFNFTEVDVCBhcHBvaW50bWVudF9pZAogICAgICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgICAgICBXSEVSRSAxPTEKICAgICAgICAnOwogICAgICAgIG15IEBCaW5kOwoKICAgICAgICBpZiAoICRQYXJhbXtDYWxlbmRhcklEfSAmJiAkUGFyYW17UnVsZUlEfSApIHsKICAgICAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgICAgICBBTkQgY2FsZW5kYXJfaWQgPSA/IEFORCBydWxlX2lkID0gPwogICAgICAgICAgICAnOwogICAgICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NhbGVuZGFySUR9LCBcJFBhcmFte1J1bGVJRH07CiAgICAgICAgfQoKICAgICAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gJwogICAgICAgICAgICAgICAgQU5EIHRpY2tldF9pZCA9ID8KICAgICAgICAgICAgJzsKICAgICAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtUaWNrZXRJRH07CiAgICAgICAgfQoKICAgICAgICAjIGRiIHF1ZXJ5CiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICAgICAgKTsKCiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50SURzLCAkUm93WzBdOwogICAgICAgIH0KICAgIH0KCiAgICAjIFJlbW92ZSB0aGUgcmVsYXRpb24ocykgZnJvbSBkYXRhYmFzZS4KICAgIG15ICRTUUwgPSAnCiAgICAgICAgREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnRfdGlja2V0CiAgICAgICAgV0hFUkUgMT0xCiAgICAnOwogICAgbXkgQEJpbmQ7CgogICAgaWYgKCAkUGFyYW17Q2FsZW5kYXJJRH0gJiYgJFBhcmFte1J1bGVJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgIEFORCBjYWxlbmRhcl9pZCA9ID8gQU5EIHJ1bGVfaWQgPSA/CiAgICAgICAgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NhbGVuZGFySUR9LCBcJFBhcmFte1J1bGVJRH07CiAgICB9CgogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRTUUwgLj0gJwogICAgICAgICAgICBBTkQgdGlja2V0X2lkID0gPwogICAgICAgICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtUaWNrZXRJRH07CiAgICB9CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyBnZXQgYXBwb2ludG1lbnQgb2JqZWN0CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgIyBjbGVhbnVwIHRpY2tldCBhcHBvaW50bWVudHMKICAgIEFQUE9JTlRNRU5UX0lEOgogICAgZm9yIG15ICRBcHBvaW50bWVudElEIChAQXBwb2ludG1lbnRJRHMpIHsKCiAgICAgICAgIyBjaGVjayBpZiBhcHBvaW50bWVudCBleGlzdHMKICAgICAgICBuZXh0IEFQUE9JTlRNRU5UX0lEIGlmICEkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRoZSBhcHBvaW50bWVudAogICAgICAgIHJldHVybiBpZiAhJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEdldEFjY2Vzc1Rva2VuKCkKCmdldCBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBjYWxlbmRhci4KCiAgICBteSAkVG9rZW4gPSAkQ2FsZW5kYXJPYmplY3QtPkdldEFjY2Vzc1Rva2VuKAogICAgICAgIENhbGVuZGFySUQgPT4gMSwgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBDYWxlbmRhcklECiAgICAgICAgVXNlckxvZ2luICA9PiAnYWdlbnQtMScsICAgICAgIyAocmVxdWlyZWQpIFVzZXIgbG9naW4KICAgICk7CgpyZXR1cm5zOgogICAgJFRva2VuID0gJ3J3JzsKCj1jdXQKCnN1YiBHZXRBY2Nlc3NUb2tlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBVc2VyTG9naW4pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgZGIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIHNhbHRfc3RyaW5nIEZST00gY2FsZW5kYXIgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2FsZW5kYXJJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRTYWx0U3RyaW5nOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNhbHRTdHJpbmcgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBpZiAhJFNhbHRTdHJpbmc7CgogICAgIyBFbmNvZGUgdXNlciBsb2dpbiB0byBVVEY4IHJlcHJlc2VudGF0aW9uLCBzaW5jZSBNRDUgaXMgZGVmaW5lZCBvbmx5IGZvciBzdHJpbmdzIG9mIGJ5dGVzLgogICAgIyAgIElmIGxvZ2luIGNvbnRhaW5zIGEgVW5pY29kZSBjaGFyYWN0ZXIsIE1ENSBtaWdodCBmYWlsIG90aGVyd2lzZS4gUGxlYXNlIHNlZSBidWcjMTI1OTMgZm9yCiAgICAjICAgbW9yZSBpbmZvcm1hdGlvbi4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCBcJFBhcmFte1VzZXJMb2dpbn0gKTsKCiAgICAjIGNhbGN1bGF0ZSBtZDUgc3VtCiAgICBteSAkU3RyaW5nID0gIiRQYXJhbXtVc2VyTG9naW59LSRTYWx0U3RyaW5nIjsKICAgIG15ICRNRDUgICAgPSBEaWdlc3Q6Ok1ENS0+bmV3KCktPmFkZCgkU3RyaW5nKS0+aGV4ZGlnZXN0KCk7CgogICAgcmV0dXJuICRNRDU7Cn0KCj1pdGVtIEdldFRleHRDb2xvcigpCgpyZXR1cm5zIGJlc3QgdGV4dCBjb2xvciBmb3Igc3VwcGxpZWQgYmFja2dyb3VuZCwgYmFzZWQgb24gbHVtaW5vc2l0eSBkaWZmZXJlbmNlIGFsZ29yaXRobS4KCiAgICBteSAkQmVzdFRleHRDb2xvciA9ICRDYWxlbmRhck9iamVjdC0+R2V0VGV4dENvbG9yKAogICAgICAgIEJhY2tncm91bmQgPT4gJyNGRkYnLCAgICAjIChyZXF1aXJlZCkgbXVzdCBiZSBpbiB2YWxpZCBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24KICAgICk7CgpyZXR1cm5zOgogICAgJEJlc3RUZXh0Q29sb3IgPSAnIzAwMCc7Cgo9Y3V0CgpzdWIgR2V0VGV4dENvbG9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhCYWNrZ3JvdW5kKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY29sb3IKICAgIGlmICggISggJFBhcmFte0JhY2tncm91bmR9ID1+IC8jW0EtRjAtOV17Myw2fS9pICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdCYWNrZ3JvdW5kIG11c3QgYmUgaW4gaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uLCBlZy4gI0ZGRkZGRi4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgdmFsdWUgaXMgY2FjaGVkCiAgICBteSAkRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnR2V0VGV4dENvbG9yJywKICAgICAgICBLZXkgID0+ICRQYXJhbXtCYWNrZ3JvdW5kfSwKICAgICk7CiAgICByZXR1cm4gJERhdGEgaWYgJERhdGE7CgogICAgIyBnZXQgUkdCIHZhbHVlcwogICAgbXkgQEJhY2tncm91bmRDb2xvcjsKICAgIG15ICRSR0JIZXggPSBzdWJzdHIoICRQYXJhbXtCYWNrZ3JvdW5kfSwgMSApOwoKICAgICMgc2l4IGNoYXJhY3RlciBoZXhhZGVjaW1hbCBzdHJpbmcgKGVnLiAjRkZGRkZGKQogICAgaWYgKCBsZW5ndGggJFJHQkhleCA9PSA2ICkgewogICAgICAgICRCYWNrZ3JvdW5kQ29sb3JbMF0gPSBoZXggc3Vic3RyKCAkUkdCSGV4LCAwLCAyICk7CiAgICAgICAgJEJhY2tncm91bmRDb2xvclsxXSA9IGhleCBzdWJzdHIoICRSR0JIZXgsIDIsIDIgKTsKICAgICAgICAkQmFja2dyb3VuZENvbG9yWzJdID0gaGV4IHN1YnN0ciggJFJHQkhleCwgNCwgMiApOwogICAgfQoKICAgICMgdGhyZWUgY2hhcmFjdGVyIGhleGFkZWNpbWFsIHN0cmluZyAoZWcuICNGRkYpCiAgICBlbHNpZiAoIGxlbmd0aCAkUkdCSGV4ID09IDMgKSB7CiAgICAgICAgJEJhY2tncm91bmRDb2xvclswXSA9IGhleCggc3Vic3RyKCAkUkdCSGV4LCAwLCAxICkgLiBzdWJzdHIoICRSR0JIZXgsIDAsIDEgKSApOwogICAgICAgICRCYWNrZ3JvdW5kQ29sb3JbMV0gPSBoZXgoIHN1YnN0ciggJFJHQkhleCwgMSwgMSApIC4gc3Vic3RyKCAkUkdCSGV4LCAxLCAxICkgKTsKICAgICAgICAkQmFja2dyb3VuZENvbG9yWzJdID0gaGV4KCBzdWJzdHIoICRSR0JIZXgsIDIsIDEgKSAuIHN1YnN0ciggJFJHQkhleCwgMSwgMSApICk7CiAgICB9CgogICAgIyBpbnZhbGlkIGhleGFkZWNpbWFsIHN0cmluZwogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdCYWNrZ3JvdW5kIG11c3QgYmUgaW4gdmFsaWQgMyBvciA2IGNoYXJhY3RlciBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24sIGVnLiAjRkZGIG9yICNGRkZGRkYuJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHByZWRlZmluZWQgdGV4dCBjb2xvcnMKICAgIG15ICVUZXh0Q29sb3JzID0gKAogICAgICAgIFdoaXRlID0+IFsgJzI1NScsICcyNTUnLCAnMjU1JyBdLAogICAgICAgIEdyYXkgID0+IFsgJzEyOCcsICcxMjgnLCAnMTI4JyBdLAogICAgICAgIEJsYWNrID0+IFsgJzAnLCAgICcwJywgICAnMCcgXSwKICAgICk7CgogICAgIyBjYWxjdWxhdGUgYmFja2dyb3VuZCBsdW1pbm9zaXR5CiAgICBteSAkQmFja2dyb3VuZEx1bSA9CiAgICAgICAgMC4yMTI2ICogKCAkQmFja2dyb3VuZENvbG9yWzBdIC8gMjU1KioyLjIgKSArCiAgICAgICAgMC43MTUyICogKCAkQmFja2dyb3VuZENvbG9yWzFdIC8gMjU1KioyLjIgKSArCiAgICAgICAgMC4wNzIyICogKCAkQmFja2dyb3VuZENvbG9yWzJdIC8gMjU1KioyLjIgKTsKCiAgICAjIGNhbGN1bGF0ZSBsdW1pbm9zaXR5IGRpZmZlcmVuY2UKICAgIG15ICVMdW1EaWZmOwogICAgZm9yIG15ICRUZXh0Q29sb3IgKCBzb3J0IGtleXMgJVRleHRDb2xvcnMgKSB7CiAgICAgICAgbXkgJFRleHRMdW0gPQogICAgICAgICAgICAwLjIxMjYgKiAoICRUZXh0Q29sb3JzeyRUZXh0Q29sb3J9LT5bMF0gLyAyNTUqKjIuMiApICsKICAgICAgICAgICAgMC43MTUyICogKCAkVGV4dENvbG9yc3skVGV4dENvbG9yfS0+WzFdIC8gMjU1KioyLjIgKSArCiAgICAgICAgICAgIDAuMDcyMiAqICggJFRleHRDb2xvcnN7JFRleHRDb2xvcn0tPlsyXSAvIDI1NSoqMi4yICk7CgogICAgICAgIGlmICggJEJhY2tncm91bmRMdW0gPiAkVGV4dEx1bSApIHsKICAgICAgICAgICAgJEx1bURpZmZ7JFRleHRDb2xvcn0gPSAoICRCYWNrZ3JvdW5kTHVtICsgMC4wNSApIC8gKCAkVGV4dEx1bSArIDAuMDUgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMdW1EaWZmeyRUZXh0Q29sb3J9ID0gKCAkVGV4dEx1bSArIDAuMDUgKSAvICggJEJhY2tncm91bmRMdW0gKyAwLjA1ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1heGltdW0gbHVtaW5vc2l0eSBkaWZmZXJlbmNlCiAgICBteSAoJE1heEx1bURpZmYpID0gc29ydCB7ICRiIDw9PiAkYSB9IHZhbHVlcyAlTHVtRGlmZjsKICAgIHJldHVybiBpZiAhJE1heEx1bURpZmY7CgogICAgIyBpZGVudGlmeSBiZXN0IHN1aXRlZCBjb2xvcgogICAgbXkgKCRCZXN0VGV4dENvbG9yKSA9IGdyZXAgeyAkTHVtRGlmZnskX30gZXEgJE1heEx1bURpZmYgfSBrZXlzICVMdW1EaWZmOwogICAgcmV0dXJuIGlmICEkQmVzdFRleHRDb2xvcjsKCiAgICAjIGNvbnZlcnQgdG8gaGV4IHN0cmluZwogICAgbXkgJFRleHRDb2xvciA9IHNwcmludGYoCiAgICAgICAgJyMlWCVYJVgnLAogICAgICAgICRUZXh0Q29sb3JzeyRCZXN0VGV4dENvbG9yfS0+WzBdLAogICAgICAgICRUZXh0Q29sb3JzeyRCZXN0VGV4dENvbG9yfS0+WzFdLAogICAgICAgICRUZXh0Q29sb3JzeyRCZXN0VGV4dENvbG9yfS0+WzJdLAogICAgKTsKCiAgICAjIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdHZXRUZXh0Q29sb3InLAogICAgICAgIEtleSAgID0+ICRQYXJhbXtCYWNrZ3JvdW5kfSwKICAgICAgICBWYWx1ZSA9PiAkVGV4dENvbG9yLAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gJFRleHRDb2xvcjsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX1RpY2tldEFwcG9pbnRtZW50R2V0KCkKCmdldCB0aWNrZXQgYXBwb2ludG1lbnQgaWQgaWYgZXhpc3RzLgoKICAgIG15ICRBcHBvaW50bWVudElEID0gJENhbGVuZGFyT2JqZWN0LT5fVGlja2V0QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAxLAogICAgICAgIFRpY2tldElEICAgPT4gMSwKICAgICAgICBSdWxlSUQgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsCiAgICApOwoKcmV0dXJucyBhcHBvaW50bWVudCBJRCBpZiBzdWNjZXNzZnVsLgoKPWN1dAoKc3ViIF9UaWNrZXRBcHBvaW50bWVudEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBUaWNrZXRJRCBSdWxlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgYXBwb2ludG1lbnRfaWQKICAgICAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudF90aWNrZXQKICAgICAgICAgICAgV0hFUkUgY2FsZW5kYXJfaWQgPSA/IEFORCB0aWNrZXRfaWQgPSA/IEFORCBydWxlX2lkID0gPwogICAgICAgICcsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NhbGVuZGFySUR9LCBcJFBhcmFte1RpY2tldElEfSwgXCRQYXJhbXtSdWxlSUR9LCBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRBcHBvaW50bWVudElEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEFwcG9pbnRtZW50SUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkQXBwb2ludG1lbnRJRDsKfQoKPWl0ZW0gX1RpY2tldEFwcG9pbnRtZW50TGlzdCgpCgpHZXQgbGlzdCBvZiB0aWNrZXQgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGEgcnVsZS4KCiAgICBteSAlQXBwb2ludG1lbnRzID0gJENhbGVuZGFyT2JqZWN0LT5fVGlja2V0QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgPT4gMSwKICAgICAgICBSdWxlSUQgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsCiAgICAgICAgS2V5ICAgICAgICA9PiAnVGlja2V0SUQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBSZXR1cm4gcmVzdWx0IHdpbGwgYmUgYmFzZWQgb24gdGhpcyBrZXkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiBUaWNrZXRJRCwgUG9zc2libGU6IFRpY2tldElEfEFwcG9pbnRtZW50SUQKICAgICk7CgpSZXR1cm5zIGxpc3Qgb2YgdGlja2V0IGFwcG9pbnRtZW50cywgd2hlcmUga2V5IHdpbGwgYmUgZWl0aGVyIFRpY2tldElEIChkZWZhdWx0KSBvciBBcHBvaW50bWVudElEOgoKJUFwcG9pbnRtZW50cyA9ICgKICAgIDEgPT4gMSwKICAgIDIgPT4gMiwKICAgIC4uLgopOwoKPWN1dAoKc3ViIF9UaWNrZXRBcHBvaW50bWVudExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBSdWxlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte0tleX0gfHw9ICdUaWNrZXRJRCc7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGFwcG9pbnRtZW50X2lkLCB0aWNrZXRfaWQKICAgICAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudF90aWNrZXQKICAgICAgICAgICAgV0hFUkUgY2FsZW5kYXJfaWQgPSA/IEFORCBydWxlX2lkID0gPwogICAgICAgICcsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17UnVsZUlEfSwgXSwKICAgICk7CgogICAgbXkgJVJlc3VsdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRSZXN1bHR7ICRSb3dbMV0gfSA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCAkUGFyYW17S2V5fSBlcSAnQXBwb2ludG1lbnRJRCcgKSB7CiAgICAgICAgJVJlc3VsdCA9IHJldmVyc2UgJVJlc3VsdDsKICAgIH0KCiAgICByZXR1cm4gJVJlc3VsdDsKfQoKPWl0ZW0gX1RpY2tldEFwcG9pbnRtZW50Q3JlYXRlKCkKCmNyZWF0ZSB0aWNrZXQgYXBwb2ludG1lbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPl9UaWNrZXRBcHBvaW50bWVudENyZWF0ZSgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgVGlja2V0SUQgICA9PiAxLAogICAgICAgIFJ1bGVJRCAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICBUaXRsZSAgICAgID0+ICdbVGlja2V0IzIwMTYwODIzODEwMDAwMDEwXSBTb21lIFRpY2tldCBUaXRsZScsCiAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wOC0yMyAwMDowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wOC0yNCAwMDowMDowMCcsCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFRpY2tldElEIFJ1bGVJRCBUaXRsZSBTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhcHBvaW50bWVudAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGl0bGV9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCA9PiAkUGFyYW17UnVsZUlEfSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKICAgIHJldHVybiBpZiAhJEFwcG9pbnRtZW50SUQ7CgogICAgIyBzYXZlIHRoZSByZWxhdGlvbiBpbiBkYXRhYmFzZQogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBJTlNFUlQgSU5UTyBjYWxlbmRhcl9hcHBvaW50bWVudF90aWNrZXQKICAgICAgICAgICAgICAgIChjYWxlbmRhcl9pZCwgdGlja2V0X2lkLCBhcHBvaW50bWVudF9pZCwgcnVsZV9pZCkKICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/KQogICAgICAgICcsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17VGlja2V0SUR9LCBcJEFwcG9pbnRtZW50SUQsIFwkUGFyYW17UnVsZUlEfSwgXSwKICAgICk7Cn0KCj1pdGVtIF9UaWNrZXRBcHBvaW50bWVudFVwZGF0ZSgpCgp1cGRhdGUgdGlja2V0IGFwcG9pbnRtZW50LgoKICAgIG15ICRTdWNjZXNzID0gJENhbGVuZGFyT2JqZWN0LT5fVGlja2V0QXBwb2ludG1lbnRVcGRhdGUoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLAogICAgICAgIFRpY2tldElEICAgICAgPT4gMSwKICAgICAgICBSdWxlSUQgICAgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsCiAgICAgICAgVGl0bGUgICAgICAgICA9PiAnW1RpY2tldCMyMDE2MDgyMzgxMDAwMDAxMF0gU29tZSBUaWNrZXQgVGl0bGUnLAogICAgICAgIFN0YXJ0VGltZSAgICAgPT4gJzIwMTYtMDgtMjMgMDA6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgPT4gJzIwMTYtMDgtMjQgMDA6MDA6MDAnLAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsLgoKPWN1dAoKc3ViIF9UaWNrZXRBcHBvaW50bWVudFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBUaWNrZXRJRCBSdWxlSUQgVGl0bGUgU3RhcnRUaW1lIEVuZFRpbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnQgb2JqZWN0CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgIyBnZXQgY3VycmVudCB0aWNrZXQgYXBwb2ludG1lbnQgZGF0YQogICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyB0aWNrZXQgYXBwb2ludG1lbnQgZG9lcyBub3QgZXhpc3QKICAgIGlmICggISRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgIyByZW1vdmUgdGhlIHJlbGF0aW9uIGFzIHdlbGwKICAgICAgICAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgdGlja2V0IGFwcG9pbnRtZW50CiAgICAgICAgcmV0dXJuICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgbG9vcCBwcm90ZWN0aW9uOiBwcmV2ZW50IGFwcG9pbnRtZW50IGV2ZW50IG1vZHVsZSBmcm9tIHJ1bm5pbmcKICAgICRTZWxmLT57J19UaWNrZXRBcHBvaW50bWVudHM6OlRpY2tldFVwZGF0ZSd9LT57ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSB9Kys7CgogICAgIyB1cGRhdGUgdGlja2V0IGFwcG9pbnRtZW50CiAgICByZXR1cm4gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1RpdGxlfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgPT4gJFBhcmFte1J1bGVJRH0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICk7Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhclRlbXBsYXRlR2VuZXJhdG9yOwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OlRpbWUpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yIC0gc2lnbmF0dXJlIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgc2lnbmF0dXJlIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntSaWNoVGV4dH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTm90aWZpY2F0aW9uRXZlbnQoKQoKcmVwbGFjZSBhbGwgT1RSUyBzbWFydCB0YWdzIGluIHRoZSBub3RpZmljYXRpb24gYm9keSBhbmQgc3ViamVjdAoKICAgIG15ICVOb3RpZmljYXRpb25FdmVudCA9ICRDYWxlbmRhclRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5Ob3RpZmljYXRpb25FdmVudCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEyMywKICAgICAgICBSZWNpcGllbnQgICAgID0+ICRVc2VyRGF0YUhhc2hSZWYsICAgICAgICAgICMgQWdlbnQgZGF0YSBnZXQgcmVzdWx0CiAgICAgICAgTm90aWZpY2F0aW9uICA9PiAkTm90aWZpY2F0aW9uRGF0YUhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIE5vdGlmaWNhdGlvbkV2ZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhOb3RpZmljYXRpb24gUmVjaXBpZW50IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte05vdGlmaWNhdGlvbn0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vdGlmaWNhdGlvbiBpcyBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJU5vdGlmaWNhdGlvbiA9ICV7ICRQYXJhbXtOb3RpZmljYXRpb259IH07CgogICAgIyBnZXQgc3lzdGVtIGRlZmF1bHQgbGFuZ3VhZ2UKICAgIG15ICREZWZhdWx0TGFuZ3VhZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RlZmF1bHRMYW5ndWFnZScpIHx8ICdlbic7CgogICAgbXkgJExhbmd1YWdlcyA9IFsgJFBhcmFte1JlY2lwaWVudH0tPntVc2VyTGFuZ3VhZ2V9LCAkRGVmYXVsdExhbmd1YWdlLCAnZW4nIF07CgogICAgbXkgJExhbmd1YWdlOwogICAgTEFOR1VBR0U6CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyRMYW5ndWFnZXN9ICkgewogICAgICAgIG5leHQgTEFOR1VBR0UgaWYgISRJdGVtOwogICAgICAgIG5leHQgTEFOR1VBR0UgaWYgISROb3RpZmljYXRpb257TWVzc2FnZX0tPnskSXRlbX07CgogICAgICAgICMgc2V0IGxhbmd1YWdlCiAgICAgICAgJExhbmd1YWdlID0gJEl0ZW07CiAgICAgICAgbGFzdCBMQU5HVUFHRTsKICAgIH0KCiAgICAjIGlmIG5vIGxhbmd1YWdlLCB0aGVuIHRha2UgdGhlIGZpcnN0IG9uZSBhdmFpbGFibGUKICAgIGlmICggISRMYW5ndWFnZSApIHsKICAgICAgICBteSBATm90aWZpY2F0aW9uTGFuZ3VhZ2VzID0gc29ydCBrZXlzICV7ICROb3RpZmljYXRpb257TWVzc2FnZX0gfTsKICAgICAgICAkTGFuZ3VhZ2UgPSAkTm90aWZpY2F0aW9uTGFuZ3VhZ2VzWzBdOwogICAgfQoKICAgICMgY29weSB0aGUgY29ycmVjdCBsYW5ndWFnZSBtZXNzYWdlIGF0dHJpYnV0ZXMgdG8gYSBmbGF0IHN0cnVjdHVyZQogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFN1YmplY3QgQm9keSBDb250ZW50VHlwZSkpIHsKICAgICAgICAkTm90aWZpY2F0aW9ueyRBdHRyaWJ1dGV9ID0gJE5vdGlmaWNhdGlvbntNZXNzYWdlfS0+eyRMYW5ndWFnZX0tPnskQXR0cmlidXRlfTsKICAgIH0KCiAgICBteSAkU3RhcnQgPSAnPCc7CiAgICBteSAkRW5kICAgPSAnPic7CiAgICBpZiAoICROb3RpZmljYXRpb257Q29udGVudFR5cGV9ID1+IG17dGV4dFwvaHRtbH0gKSB7CiAgICAgICAgJFN0YXJ0ID0gJyZsdDsnOwogICAgICAgICRFbmQgICA9ICcmZ3Q7JzsKICAgIH0KCiAgICAjIGdldCBodG1sIHV0aWxzIG9iamVjdAogICAgbXkgJEhUTUxVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKTsKCiAgICAjIGRvIHRleHQvcGxhaW4gdG8gdGV4dC9odG1sIGNvbnZlcnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gJiYgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPX4gL3RleHRcL3BsYWluL2kgKSB7CiAgICAgICAgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ICAgICAgICA9ICRIVE1MVXRpbHNPYmplY3QtPlRvSFRNTCgKICAgICAgICAgICAgU3RyaW5nID0+ICROb3RpZmljYXRpb257Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHRleHQvaHRtbCB0byB0ZXh0L3BsYWluIGNvbnZlcnQKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9ICYmICROb3RpZmljYXRpb257Q29udGVudFR5cGV9ID1+IC90ZXh0XC9odG1sL2kgKSB7CiAgICAgICAgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgJE5vdGlmaWNhdGlvbntCb2R5fSAgICAgICAgPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5vdGlmeSB0ZXh0cwogICAgZm9yIG15ICRUZXh0IChxdyhTdWJqZWN0IEJvZHkpKSB7CiAgICAgICAgaWYgKCAhJE5vdGlmaWNhdGlvbnskVGV4dH0gKSB7CiAgICAgICAgICAgICROb3RpZmljYXRpb257JFRleHR9ID0gIk5vIE5vdGlmaWNhdGlvbiAkVGV4dCBmb3IgJFBhcmFte1R5cGV9IGZvdW5kISI7CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBwbGFjZSBob2xkZXIgc3R1ZmYKICAgICROb3RpZmljYXRpb257Qm9keX0gPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICAgICA9PiAkU2VsZi0+e1JpY2hUZXh0fSwKICAgICAgICBUZXh0ICAgICAgICAgID0+ICROb3RpZmljYXRpb257Qm9keX0sCiAgICAgICAgUmVjaXBpZW50ICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgICAgPT4gJExhbmd1YWdlLAogICAgKTsKCiAgICAkTm90aWZpY2F0aW9ue1N1YmplY3R9ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ICAgICAgPT4gMCwKICAgICAgICBUZXh0ICAgICAgICAgID0+ICROb3RpZmljYXRpb257U3ViamVjdH0sCiAgICAgICAgUmVjaXBpZW50ICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgICAgPT4gJExhbmd1YWdlLAogICAgKTsKCiAgICAjIGFkZCBVUkxzIGFuZCB2ZXJpZnkgdG8gYmUgZnVsbCBIVE1MIGRvY3VtZW50CiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICkgewoKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlTm90aWZpY2F0aW9uOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9Y3V0CgpzdWIgX1JlcGxhY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhUZXh0IFJpY2hUZXh0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGZvciBtYWlsdG8gbGlua3MKICAgICMgc2luY2UgdGhlIHN1YmplY3QgYW5kIGJvZHkgb2YgdGhvc2UgbWFpbHRvIGxpbmtzIGFyZQogICAgIyB1cmkgZXNjYXBlZCB3ZSBoYXZlIHRvIHVyaSB1bmVzY2FwZSB0aGVtLCByZXBsYWNlCiAgICAjIHBvc3NpYmxlIHBsYWNlaG9sZGVycyBhbmQgdGhlbiByZS11cmkgZXNjYXBlIHRoZW0KICAgICRQYXJhbXtUZXh0fSA9fiBzewogICAgICAgIChocmVmPSJtYWlsdG86W15cP10rXD8pKFteIl0rIikKICAgIH0KICAgIHsKICAgICAgICBteSAkTWFpbFRvSHJlZiAgICAgICAgPSAkMTsKICAgICAgICBteSAkTWFpbFRvSHJlZkNvbnRlbnQgPSAkMjsKCiAgICAgICAgJE1haWxUb0hyZWZDb250ZW50ID1+IHN7CiAgICAgICAgICAgICgoPzpzdWJqZWN0fGJvZHkpPSkoLis/KSgifCYpCiAgICAgICAgfQogICAgICAgIHsKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlQcmVmaXggID0gJDE7CiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5Q29udGVudCA9ICQyOwogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keVN1ZmZpeCAgPSAkMzsKCiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5Q29udGVudFVuZXNjYXBlZCA9IFVSSTo6RXNjYXBlOjp1cmlfdW5lc2NhcGUgJFN1YmplY3RPckJvZHlDb250ZW50OwoKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50UmVwbGFjZWQgPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUZXh0ICAgICA9PiAkU3ViamVjdE9yQm9keUNvbnRlbnRVbmVzY2FwZWQsCiAgICAgICAgICAgICAgICBSaWNoVGV4dCA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50RXNjYXBlZCA9IFVSSTo6RXNjYXBlOjp1cmlfZXNjYXBlX3V0ZjggJFN1YmplY3RPckJvZHlDb250ZW50UmVwbGFjZWQ7CgogICAgICAgICAgICAkU3ViamVjdE9yQm9keVByZWZpeCAuICRTdWJqZWN0T3JCb2R5Q29udGVudEVzY2FwZWQgLiAkU3ViamVjdE9yQm9keVN1ZmZpeDsKICAgICAgICB9ZWd4OwoKICAgICAgICAkTWFpbFRvSHJlZiAuICRNYWlsVG9IcmVmQ29udGVudDsKICAgIH1lZ3g7CgogICAgbXkgJFN0YXJ0ID0gJzwnOwogICAgbXkgJEVuZCAgID0gJz4nOwogICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgICRTdGFydCA9ICcmbHQ7JzsKICAgICAgICAkRW5kICAgPSAnJmd0Oyc7CiAgICAgICAgJFBhcmFte1RleHR9ID1+IHMvKFxufFxyKS8vZzsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgbXkgJUNhbGVuZGFyOwogICAgbXkgJUFwcG9pbnRtZW50OwoKICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICk7CiAgICAgICAgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gfHwgJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtDYWxlbmRhcklEfSApIHsKICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgc3BlY2lhbCByZXBsYWNlIGZyb20gc2VjcmV0IGNvbmZpZyBvcHRpb25zCiAgICBteSBAU2VjcmV0Q29uZmlnT3B0aW9ucyA9IHF3KAogICAgICAgIERhdGFiYXNlUHcKICAgICAgICBTZWFyY2hVc2VyUHcKICAgICAgICBVc2VyUHcKICAgICAgICBTZW5kbWFpbE1vZHVsZTo6QXV0aFBhc3N3b3JkCiAgICAgICAgQXV0aE1vZHVsZTo6UmFkaXVzOjpQYXNzd29yZAogICAgICAgIFBHUDo6S2V5OjpQYXNzd29yZAogICAgICAgIEN1c3RvbWVyOjpBdXRoTW9kdWxlOjpEQjo6Q3VzdG9tZXJQYXNzd29yZAogICAgICAgIEN1c3RvbWVyOjpBdXRoTW9kdWxlOjpSYWRpdXM6OlBhc3N3b3JkCiAgICAgICAgUHVibGljRnJvbnRlbmQ6OkF1dGhQYXNzd29yZAogICAgKTsKCiAgICAjIHJlcGxhY2UgdGhlIHNlY3JldCBjb25maWcgb3B0aW9ucyBiZWZvcmUgdGhlIG5vcm1hbCBjb25maWcgb3B0aW9ucwogICAgZm9yIG15ICRTZWNyZXRDb25maWdPcHRpb24gKEBTZWNyZXRDb25maWdPcHRpb25zKSB7CgogICAgICAgIG15ICRUYWcgPSAkU3RhcnQgLiAnT1RSU19DT05GSUdfJyAuICRTZWNyZXRDb25maWdPcHRpb24gLiAkRW5kOwogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzeyRUYWd9e3h4eH1neDsKICAgIH0KCiAgICAjIHJlcGxhY2UgY29uZmlnIG9wdGlvbnMKICAgIG15ICRUYWcgPSAkU3RhcnQgLiAnT1RSU19DT05GSUdfJzsKICAgICRQYXJhbXtUZXh0fSA9fiBzeyRUYWcoLis/KSRFbmR9eyRDb25maWdPYmplY3QtPkdldCgkMSkgLy8gJyd9ZWd4OwoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZy4rPyRFbmQvLS9naTsKCiAgICBteSAlUmVjaXBpZW50ID0gJXsgJFBhcmFte1JlY2lwaWVudH0gfHwge30gfTsKCiAgICAjIGdldCB1c2VyIG9iamVjdAogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgIGlmICggISVSZWNpcGllbnQgJiYgJFBhcmFte1JlY2lwaWVudElEfSApIHsKCiAgICAgICAgJVJlY2lwaWVudCA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17UmVjaXBpZW50SUR9LAogICAgICAgICAgICBOb091dE9mT2ZmaWNlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhIGxvY2FsIGhlbHBlciBvYmplY3QKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBnZXQgdGltZXpvbmUgb2Zmc2V0IGZvciBjdXJyZW50IHJlY2lwaWVudAogICAgbXkgJFRpbWV6b25lT2Zmc2V0UmF3ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lem9uZU9mZnNldEdldCgKICAgICAgICBVc2VySUQgPT4gJFJlY2lwaWVudHtVc2VySUR9LAogICAgKSB8fCAwOwoKICAgIG15ICRUaW1lem9uZU9mZnNldCA9ICRUaW1lem9uZU9mZnNldFJhdyAqIDYwICogNjA7CgogICAgIyBpbnN0YW5jaWF0ZSBhIG5ldyBsYW5ndWFnZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKICAgIG15ICRMYW5ndWFnZU9iamVjdCA9IEtlcm5lbDo6TGFuZ3VhZ2UtPm5ldygKICAgICAgICBVc2VyTGFuZ3VhZ2UgPT4gJFBhcmFte0xhbmd1YWdlfSB8fCAnZW4nLAogICAgKTsKCiAgICAjIHN1cHBvcnRlZCBhcHBvaW50bWVudCBmaWVsZHMKICAgIG15ICVBcHBvaW50bWVudFRhZ3NTa2lwID0gKAogICAgICAgIFBhcmVudElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlRXhjbHVkZSAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21Vbml0Q291bnQgICAgICAgICAgID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdCAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZSAgICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGEgbG9jYWwgdGltZSBvYmplY3QKICAgIG15ICRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHByb2Nlc3MgYXBwb2ludG1lbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHJlcGxhY2UgY29uZmlnIG9wdGlvbnMKICAgICRUYWcgPSAkU3RhcnQgLiAnT1RSU19BUFBPSU5UTUVOVF8nOwoKICAgICMgcmVwbGFjZSBhcHBvaW50bWVudCB0YWdzCiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlQXBwb2ludG1lbnQgKSB7CgogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkQXR0cmlidXRlOwogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICRBcHBvaW50bWVudFRhZ3NTa2lweyRBdHRyaWJ1dGV9OwoKICAgICAgICAjIHNldHVwIGEgbmV3IHRhZyBmb3IgdGhlIGN1cnJlbnQgYXR0cmlidXRlCiAgICAgICAgbXkgJE1hdGNoVGFnID0gJFRhZyAuIHVjICRBdHRyaWJ1dGU7CgogICAgICAgICMgbWFwIE5vdGlmaWNhdGlvblRpbWUgYXR0cmlidXRlCiAgICAgICAgaWYgKCAkQXR0cmlidXRlIGVxICdOb3RpZmljYXRpb25EYXRlJyApIHsKICAgICAgICAgICAgJE1hdGNoVGFnID0gJFRhZyAuICdOT1RJRklDQVRJT05USU1FJzsKICAgICAgICB9CgogICAgICAgIG15ICRSZXBsYWNlbWVudCA9ICcnOwoKICAgICAgICAjIHByb2Nlc3MgZGF0ZXRpbWUgc3RyaW5ncyAodGltZXN0YW1wcykKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRyaWJ1dGUgZXEgJ1N0YXJ0VGltZScKICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnRW5kVGltZScKICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnTm90aWZpY2F0aW9uRGF0ZScKICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnQ3JlYXRlVGltZScKICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnQ2hhbmdlVGltZScKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAhJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJy0nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzeXN0ZW0gdGltZSBvZiB0aGUgZ2l2ZW4gdGltZXN0YW1wCiAgICAgICAgICAgICAgICBteSAkVGFnU3lzdGVtVGltZSA9ICRUaW1lT2JqZWN0LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIG5ldyB0aW1lc3RhbXAgd2l0aCB0aGUgcmVsYXRlZCB0aW1lem9uZSBvZmZzZXQKICAgICAgICAgICAgICAgIG15ICROZXdUaW1lU3RhbXAgPSAkVGltZU9iamVjdC0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkVGFnU3lzdGVtVGltZSArICRUaW1lem9uZU9mZnNldCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJERhdGVGb3JtYXQgPSAnRGF0ZUZvcm1hdCc7CgogICAgICAgICAgICAgICAgIyBEbyBub3QgaW5jbHVkZSB0aW1lIGNvbXBvbmVudCBmb3IgYWxsLWRheSBhcHBvaW50bWVudHMsCiAgICAgICAgICAgICAgICAjICAgYnV0IG9ubHkgZm9yIHN0YXJ0IGFuZCBlbmQgZGF0ZXMuCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0FsbERheX0KICAgICAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRBdHRyaWJ1dGUgZXEgJ1N0YXJ0VGltZScKICAgICAgICAgICAgICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnRW5kVGltZScKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICREYXRlRm9ybWF0IC49ICdTaG9ydCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBwcmVwYXJlIGRhdGVzIGFuZCB0aW1lcwogICAgICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJExhbmd1YWdlT2JqZWN0LT5Gb3JtYXRUaW1lU3RyaW5nKCAkTmV3VGltZVN0YW1wLCAkRGF0ZUZvcm1hdCApIHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgY3JlYXRlYnkgYW5kIGNoYW5nZWJ5CiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdDcmVhdGVCeScgfHwgJEF0dHJpYnV0ZSBlcSAnQ2hhbmdlQnknICkgewoKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRBcHBvaW50bWVudHskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyB0ZWFtIGlkcwogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnVGVhbUlEJyApIHsKCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFJc0FycmF5UmVmV2l0aERhdGEoICRBcHBvaW50bWVudHskQXR0cmlidXRlfSApOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGluc3RhbmNpYXRlIGEgbmV3IHRlYW0gb2JqZWN0CiAgICAgICAgICAgIG15ICRUZWFtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtLT5uZXcoKTsKCiAgICAgICAgICAgICMgZ2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgKHJlYWRhYmxlKSB0ZWFtcwogICAgICAgICAgICBteSAlVGVhbUxpc3QgPSAkVGVhbU9iamVjdC0+VGVhbUxpc3QoCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoIFwlVGVhbUxpc3QgKTsKCiAgICAgICAgICAgIG15IEBUZWFtTmFtZXM7CgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVRlYW1MaXN0ICkgKSB7CgogICAgICAgICAgICAgICAgVEVBTUtFWToKICAgICAgICAgICAgICAgIGZvciBteSAkVGVhbUtleSAoIEB7ICRBcHBvaW50bWVudHskQXR0cmlidXRlfSB9ICkgewoKICAgICAgICAgICAgICAgICAgICBuZXh0IFRFQU1LRVkgaWYgISRUZWFtTGlzdHskVGVhbUtleX07CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1OYW1lcywgJFRlYW1MaXN0eyRUZWFtS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggXEBUZWFtTmFtZXMgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSB0ZWFtIGlkcyB3aXRoIGEgY29tbWEgc2VwZXJhdGVkIGxpc3Qgb2YgdGVhbSBuYW1lcwogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSBqb2luICcsICcsIEBUZWFtTmFtZXM7CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgcmVzb3VyY2UgaWRzCiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdSZXNvdXJjZUlEJyApIHsKCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFJc0FycmF5UmVmV2l0aERhdGEoICRBcHBvaW50bWVudHskQXR0cmlidXRlfSApOwoKICAgICAgICAgICAgbXkgQFVzZXJOYW1lczsKCiAgICAgICAgICAgIFVTRVJJRDoKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBAeyAkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0gfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJJRDsKCiAgICAgICAgICAgICAgICBteSAkVXNlck5hbWUgPSAkVXNlck9iamVjdC0+VXNlck5hbWUoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgVVNFUklEIGlmICEkVXNlck5hbWU7CgogICAgICAgICAgICAgICAgcHVzaCBAVXNlck5hbWVzLCAkVXNlck5hbWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFJc0FycmF5UmVmV2l0aERhdGEoIFxAVXNlck5hbWVzICk7CgogICAgICAgICAgICAjIHJlcGxhY2UgcmVzb3VyY2UgaWRzIHdpdGggYSBjb21tYSBzZXBlcmF0ZWQgbGlzdCBvZiB0ZWFtIG5hbWVzCiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9IGpvaW4gJywgJywgQFVzZXJOYW1lczsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyBhbGwgZGF5IGFuZCByZWN1cnJpbmcgdGFncwogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJEF0dHJpYnV0ZSBlcSAnQWxsRGF5JwogICAgICAgICAgICB8fCAkQXR0cmlidXRlIGVxICdSZWN1cnJpbmcnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRUcmFuc2xhdGVkU3RyaW5nID0gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ05vJyk7CgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRUcmFuc2xhdGVkU3RyaW5nID0gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ1llcycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkVHJhbnNsYXRlZFN0cmluZzsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyBhbGwgb3RoZXIgc2luZ2xlIHZhbHVlcwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAnLSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRSZXBsYWNlbWVudCB8fD0gJyc7CgogICAgICAgICMgcmVwbGFjZSB0aGUgdGFncwogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzeyRNYXRjaFRhZyRFbmR9eyRSZXBsYWNlbWVudH1lZ3g7CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnLis/JEVuZC8tL2dpOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgcHJvY2VzcyBjYWxlbmRhcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgcmVwbGFjZSBjb25maWcgb3B0aW9ucwogICAgJFRhZyA9ICRTdGFydCAuICdPVFJTX0NBTEVOREFSXyc7CgogICAgIyByZXBsYWNlIGFwcG9pbnRtZW50IHRhZ3MKICAgIEFUVFJJQlVURToKICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVDYWxlbmRhciApIHsKCiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRBdHRyaWJ1dGU7CgogICAgICAgICMgc2V0dXAgYSBuZXcgdGFnIGZvciB0aGUgY3VycmVudCBhdHRyaWJ1dGUKICAgICAgICBteSAkTWF0Y2hUYWcgPSAkVGFnIC4gdWMgJEF0dHJpYnV0ZTsKCiAgICAgICAgbXkgJFJlcGxhY2VtZW50ID0gJyc7CgogICAgICAgICMgcHJvY2VzcyBkYXRldGltZSBzdHJpbmdzICh0aW1lc3RhbXBzKQogICAgICAgIGlmICggJEF0dHJpYnV0ZSBlcSAnQ3JlYXRlVGltZScgfHwgJEF0dHJpYnV0ZSBlcSAnQ2hhbmdlVGltZScgKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgc3lzdGVtIHRpbWUgb2YgdGhlIGdpdmVuIHRpbWVzdGFtcAogICAgICAgICAgICBteSAkVGFnU3lzdGVtVGltZSA9ICRUaW1lT2JqZWN0LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ2FsZW5kYXJ7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdlbmVyYXRlIG5ldyB0aW1lc3RhbXAgd2l0aCB0aGUgcmVsYXRlZCB0aW1lem9uZSBvZmZzZXQKICAgICAgICAgICAgbXkgJE5ld1RpbWVTdGFtcCA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFRhZ1N5c3RlbVRpbWUgKyAkVGltZXpvbmVPZmZzZXQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHByZXBhcmUgZGF0ZXMgYW5kIHRpbWVzCiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRMYW5ndWFnZU9iamVjdC0+Rm9ybWF0VGltZVN0cmluZyggJE5ld1RpbWVTdGFtcCwgJ0RhdGVGb3JtYXQnICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgY3JlYXRlYnkgYW5kIGNoYW5nZWJ5CiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdDcmVhdGVCeScgfHwgJEF0dHJpYnV0ZSBlcSAnQ2hhbmdlQnknICkgewoKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRDYWxlbmRhcnskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyBncm91cCBpZAogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnR3JvdXBJRCcgKSB7CiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJENhbGVuZGFyeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIHZhbGlkIGlkCiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdWYWxpZElEJyApIHsKCiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gJENhbGVuZGFyeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgkUmVwbGFjZW1lbnQpOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIGFsbCBvdGhlciBzaW5nbGUgdmFsdWVzCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggISRDYWxlbmRhcnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICctJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRDYWxlbmRhcnskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIHRoZSB0YWdzCiAgICAgICAgJFBhcmFte1RleHR9ID1+IHN7JE1hdGNoVGFnJEVuZH17JFJlcGxhY2VtZW50fWVneDsKICAgIH0KCiAgICAjIGNsZWFudXAKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWcuKz8kRW5kLy0vZ2k7CgogICAgbXkgJEhhc2hHbG9iYWxSZXBsYWNlID0gc3ViIHsKICAgICAgICBteSAoICRUYWcsICVIICkgPSBAXzsKCiAgICAgICAgIyBHZW5lcmF0ZSBvbmUgc2luZ2xlIG1hdGNoaW5nIHN0cmluZyBmb3IgYWxsIGtleXMgdG8gc2F2ZSBwZXJmb3JtYW5jZS4KICAgICAgICBteSAkS2V5cyA9IGpvaW4gJ3wnLCBtYXAge3F1b3RlbWV0YX0gZ3JlcCB7IGRlZmluZWQgJEh7JF99IH0ga2V5cyAlSDsKCiAgICAgICAgIyBBZGQgYWxsIGtleXMgYWxzbyBhcyBsb3dlcmNhc2UgdG8gYmUgYWJsZSB0byBtYXRjaCBjYXNlIGluc2Vuc2l0aXZlLAogICAgICAgICMgICBlLiBnLiA8T1RSU19DVVNUT01FUl9Gcm9tPiBhbmQgPE9UUlNfQ1VTVE9NRVJfRlJPTT4uCiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUggKSB7CiAgICAgICAgICAgICRIeyBsYyAkS2V5IH0gPSAkSHskS2V5fTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzLyg/OiRUYWcpKCRLZXlzKSRFbmQvJEh7IGxjICQxIH0vaWVnOwogICAgfTsKCiAgICAjIGdldCByZWNpcGllbnQgZGF0YSBhbmQgcmVwbGFjZSBpdCB3aXRoIDxPVFJTXy4uLgogICAgJFRhZyA9ICRTdGFydCAuICdPVFJTXyc7CgogICAgIyBpbmNsdWRlIG1vcmUgcmVhZGFibGUgdGFnIDxPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlQKICAgIG15ICRSZWNpcGllbnRUYWcgPSAkU3RhcnQgLiAnT1RSU19OT1RJRklDQVRJT05fUkVDSVBJRU5UXyc7CgogICAgaWYgKCVSZWNpcGllbnQpIHsKCiAgICAgICAgIyBIVE1MIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKICAgICAgICAgICAgQVRUUklCVVRFOgogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlUmVjaXBpZW50ICkgewogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRSZWNpcGllbnR7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgICAgICAkUmVjaXBpZW50eyRBdHRyaWJ1dGV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZWNpcGllbnR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkSGFzaEdsb2JhbFJlcGxhY2UtPiggIiRUYWd8JFJlY2lwaWVudFRhZyIsICVSZWNpcGllbnQgKTsKICAgIH0KCiAgICAjIGNsZWFudXAKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRSZWNpcGllbnRUYWcuKz8kRW5kLy0vZ2k7CgogICAgcmV0dXJuICRQYXJhbXtUZXh0fTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6OlRyYW5zcG9ydDo6RW1haWw7CiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6TGF5b3V0T2JqZWN0KQojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OlBhcmFtT2JqZWN0KQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpCYXNlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWwnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpFbWFpbCAtIGVtYWlsIHRyYW5zcG9ydCBsYXllciBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpOb3RpZmljYXRpb24gZXZlbnQgdHJhbnNwb3J0IGxheWVyLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBub3RpZmljYXRpb24gdHJhbnNwb3J0IG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCcnKTsKICAgIG15ICRUcmFuc3BvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpUcmFuc3BvcnQ6OkVtYWlsJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFNlbmROb3RpZmljYXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJJRCBOb3RpZmljYXRpb24gUmVjaXBpZW50KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgJE5lZWRlZCEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2xlYW51cCBldmVudCBkYXRhCiAgICAkU2VsZi0+e0V2ZW50RGF0YX0gPSB1bmRlZjsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFN5c3RlbUFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBnZXQgcmVjaXBpZW50IGRhdGEKICAgIG15ICVSZWNpcGllbnQgPSAleyAkUGFyYW17UmVjaXBpZW50fSB9OwoKICAgIHJldHVybiBpZiAhJFJlY2lwaWVudHtVc2VyRW1haWx9OwogICAgcmV0dXJuIGlmICRSZWNpcGllbnR7VXNlckVtYWlsfSAhfiAvQC87CgogICAgbXkgJElzTG9jYWxBZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgIEFkZHJlc3MgPT4gJFJlY2lwaWVudHtVc2VyRW1haWx9LAogICAgKTsKCiAgICByZXR1cm4gaWYgJElzTG9jYWxBZGRyZXNzOwoKICAgICMgY3JlYXRlIG5ldyBhcnJheSB0byBwcmV2ZW50IGF0dGFjaG1lbnQgZ3Jvd3RoIChzZWUgYnVnIzUxMTQpCiAgICBteSBAQXR0YWNobWVudHM7CgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtBdHRhY2htZW50c30gKSApIHsKICAgICAgICBAQXR0YWNobWVudHMgPSBAeyAkUGFyYW17QXR0YWNobWVudHN9IH07CiAgICB9CgogICAgbXkgJU5vdGlmaWNhdGlvbiA9ICV7ICRQYXJhbXtOb3RpZmljYXRpb259IH07CgogICAgIyBzZW5kIG5vdGlmaWNhdGlvbgogICAgbXkgJEZyb20gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ05vdGlmaWNhdGlvblNlbmRlck5hbWUnKSAuICcgPCcKICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnTm90aWZpY2F0aW9uU2VuZGVyRW1haWwnKSAuICc+JzsKCiAgICBpZiAoICRQYXJhbXtOb3RpZmljYXRpb259LT57Q29udGVudFR5cGV9ICYmICRQYXJhbXtOb3RpZmljYXRpb259LT57Q29udGVudFR5cGV9IGVxICd0ZXh0L2h0bWwnICkgewoKICAgICAgICAjIEdldCBjb25maWd1cmVkIHRlbXBsYXRlIHdpdGggZmFsbGJhY2sgdG8gRGVmYXVsdC4KICAgICAgICBteSAkRW1haWxUZW1wbGF0ZSA9ICRQYXJhbXtOb3RpZmljYXRpb259LT57RGF0YX0tPntUcmFuc3BvcnRFbWFpbFRlbXBsYXRlfS0+WzBdIHx8ICdEZWZhdWx0JzsKCiAgICAgICAgbXkgJEhvbWUgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdIb21lJyk7CiAgICAgICAgbXkgJFRlbXBsYXRlRGlyICAgICAgID0gIiRIb21lL0tlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvTm90aWZpY2F0aW9uRXZlbnQvRW1haWwiOwogICAgICAgIG15ICRDdXN0b21UZW1wbGF0ZURpciA9ICIkSG9tZS9DdXN0b20vS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9Ob3RpZmljYXRpb25FdmVudC9FbWFpbCI7CgogICAgICAgIGlmICggIS1yICIkVGVtcGxhdGVEaXIvJEVtYWlsVGVtcGxhdGUudHQiICYmICEtciAiJEN1c3RvbVRlbXBsYXRlRGlyLyRFbWFpbFRlbXBsYXRlLnR0IiApIHsKICAgICAgICAgICAgJEVtYWlsVGVtcGxhdGUgPSAnRGVmYXVsdCc7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIEhUTUwKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gIk5vdGlmaWNhdGlvbkV2ZW50L0VtYWlsLyRFbWFpbFRlbXBsYXRlIiwKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEJvZHkgICAgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJE5vdGlmaWNhdGlvbntTdWJqZWN0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkRW1haWxPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWwnKTsKCiAgICAjIHNlbmQgbm90aWZpY2F0aW9uCiAgICBteSAkU2VudCA9ICRFbWFpbE9iamVjdC0+U2VuZCgKICAgICAgICBGcm9tICAgICAgID0+ICRGcm9tLAogICAgICAgIFRvICAgICAgICAgPT4gJFJlY2lwaWVudHtVc2VyRW1haWx9LAogICAgICAgIFN1YmplY3QgICAgPT4gJE5vdGlmaWNhdGlvbntTdWJqZWN0fSwKICAgICAgICBNaW1lVHlwZSAgID0+ICROb3RpZmljYXRpb257Q29udGVudFR5cGV9LAogICAgICAgIFR5cGUgICAgICAgPT4gJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0sCiAgICAgICAgQ2hhcnNldCAgICA9PiAndXRmLTgnLAogICAgICAgIEJvZHkgICAgICAgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICBMb29wICAgICAgID0+IDEsCiAgICAgICAgQXR0YWNobWVudCA9PiAkUGFyYW17QXR0YWNobWVudHN9IHx8IFtdLAogICAgKTsKCiAgICBpZiAoICEkU2VudCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIickTm90aWZpY2F0aW9ue05hbWV9JyBub3RpZmljYXRpb24gY291bGQgbm90IGJlIHNlbnQgdG8gYWdlbnQgJyRSZWNpcGllbnR7VXNlckVtYWlsfSAiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvZyBldmVudAogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgIE1lc3NhZ2UgID0+ICJTZW50IGFnZW50ICckTm90aWZpY2F0aW9ue05hbWV9JyBub3RpZmljYXRpb24gdG8gJyRSZWNpcGllbnR7VXNlckVtYWlsfScuIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBHZXRUcmFuc3BvcnRSZWNpcGllbnRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KE5vdGlmaWNhdGlvbikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSBAUmVjaXBpZW50czsKCiAgICAjIGdldCByZWNpcGllbnRzIGJ5IFJlY2lwaWVudEVtYWlsCiAgICBpZiAoICRQYXJhbXtOb3RpZmljYXRpb259LT57RGF0YX0tPntSZWNpcGllbnRFbWFpbH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17Tm90aWZpY2F0aW9ufS0+e0RhdGF9LT57UmVjaXBpZW50RW1haWx9LT5bMF0gKSB7CiAgICAgICAgICAgIG15ICVSZWNpcGllbnQ7CiAgICAgICAgICAgICRSZWNpcGllbnR7UmVhbG5hbWV9ICA9ICcnOwogICAgICAgICAgICAkUmVjaXBpZW50e1R5cGV9ICAgICAgPSAnQ3VzdG9tZXInOwogICAgICAgICAgICAkUmVjaXBpZW50e1VzZXJFbWFpbH0gPSAkUGFyYW17Tm90aWZpY2F0aW9ufS0+e0RhdGF9LT57UmVjaXBpZW50RW1haWx9LT5bMF07CgogICAgICAgICAgICAjIGNoZWNrIHJlY2lwaWVudHMKICAgICAgICAgICAgaWYgKCAkUmVjaXBpZW50e1VzZXJFbWFpbH0gJiYgJFJlY2lwaWVudHtVc2VyRW1haWx9ID1+IC9ALyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFJlY2lwaWVudHMsIFwlUmVjaXBpZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAUmVjaXBpZW50czsKfQoKc3ViIFRyYW5zcG9ydFNldHRpbmdzRGlzcGxheUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChxdyhSZWNpcGllbnRFbWFpbCkpIHsKICAgICAgICBuZXh0IEtFWSBpZiAhJFBhcmFte0RhdGF9LT57JEtleX07CiAgICAgICAgbmV4dCBLRVkgaWYgIWRlZmluZWQgJFBhcmFte0RhdGF9LT57JEtleX0tPlswXTsKICAgICAgICAkUGFyYW17JEtleX0gPSAkUGFyYW17RGF0YX0tPnskS2V5fS0+WzBdOwogICAgfQoKICAgIG15ICRIb21lICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSG9tZScpOwogICAgbXkgJFRlbXBsYXRlRGlyICAgICAgID0gIiRIb21lL0tlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvTm90aWZpY2F0aW9uRXZlbnQvRW1haWwiOwogICAgbXkgJEN1c3RvbVRlbXBsYXRlRGlyID0gIiRIb21lL0N1c3RvbS9LZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL05vdGlmaWNhdGlvbkV2ZW50L0VtYWlsIjsKCiAgICBteSBARmlsZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5EaXJlY3RvcnlSZWFkKAogICAgICAgIERpcmVjdG9yeSA9PiAkVGVtcGxhdGVEaXIsCiAgICAgICAgRmlsdGVyICAgID0+ICcqLnR0JywKICAgICk7CiAgICBpZiAoIC1kICRDdXN0b21UZW1wbGF0ZURpciApIHsKICAgICAgICBwdXNoIEBGaWxlcywgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RGlyZWN0b3J5UmVhZCgKICAgICAgICAgICAgRGlyZWN0b3J5ID0+ICRDdXN0b21UZW1wbGF0ZURpciwKICAgICAgICAgICAgRmlsdGVyICAgID0+ICcqLnR0JywKICAgICAgICApOwogICAgfQoKICAgICMgZm9yIGRlZHVwbGljYXRpb24KICAgIG15ICVUZW1wbGF0ZXM7CgogICAgZm9yIG15ICRGaWxlIChARmlsZXMpIHsKICAgICAgICAkRmlsZSA9fiBze14uKi8oW14vXSspXC50dH17JDF9c214ZzsKICAgICAgICAkVGVtcGxhdGVzeyRGaWxlfSA9ICRGaWxlOwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJFBhcmFte1RyYW5zcG9ydEVtYWlsVGVtcGxhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgID0+IFwlVGVtcGxhdGVzLAogICAgICAgIE5hbWUgICAgICAgID0+ICdUcmFuc3BvcnRFbWFpbFRlbXBsYXRlJywKICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbXtEYXRhfS0+e1RyYW5zcG9ydEVtYWlsVGVtcGxhdGV9LAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIEhUTUwKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnRUcmFuc3BvcnRFbWFpbFNldHRpbmdzJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBUcmFuc3BvcnRQYXJhbVNldHRpbmdzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEdldFBhcmFtKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIFBBUkFNRVRFUjoKICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyhSZWNpcGllbnRFbWFpbCBOb3RpZmljYXRpb25BcnRpY2xlVHlwZUlEIFRyYW5zcG9ydEVtYWlsVGVtcGxhdGUpKSB7CiAgICAgICAgbXkgQERhdGEgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgbmV4dCBQQVJBTUVURVIgaWYgIUBEYXRhOwogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPntEYXRhfS0+eyRQYXJhbWV0ZXJ9ID0gXEBEYXRhOwogICAgfQoKICAgICMgTm90ZTogRXhhbXBsZSBob3cgdG8gc2V0IGVycm9ycyBhbmQgdXNlIHRoZW0KICAgICMgb24gdGhlIG5vcm1hbCBBZG1pbk5vdGlmaWNhdGlvbkV2ZW50IHNjcmVlbgogICAgIyAjIHNldCBlcnJvcgogICAgIyAkUGFyYW17R2V0UGFyYW19LT57JFBhcmFtZXRlci4nU2VydmVyRXJyb3InfSA9ICdTZXJ2ZXJFcnJvcic7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBJc1VzYWJsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVmaW5lIGlmIHRoaXMgdHJhbnNwb3J0IGlzIHVzYWJsZSBvbgogICAgIyB0aGlzIHNwZWNpZmljIG1vbWVudAogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6OlRyYW5zcG9ydDo6QmFzZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpOb3RpZmljYXRpb25FdmVudDo6VHJhbnNwb3J0OjpCYXNlIC0gY29tbW9uIG5vdGlmaWNhdGlvbiBldmVudCB0cmFuc3BvcnQgZnVuY3Rpb25zCgo9aGVhZDEgU1lOT1BTSVMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBTZW5kTm90aWZpY2F0aW9uKCkKCnNlbmQgYSBub3RpZmljYXRpb24gdXNpbmcgYW4gc3BlY2lmaWVkIHRyYW5zcG9ydAoKICAgIG15ICRTdWNjZXNzID0gJFRyYW5zcG9ydE9iamVjdC0+U2VuZE5vdGlmaWNhdGlvbigKICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBOb3RpZmljYXRpb24gPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgUmVjaXBpZW50ICAgID0+IHsKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ3NvbWUgbG9naW4nLAogICAgICAgICAgICBVc2VyVGl0bGUgICAgID0+ICdzb21lIHRpdGxlJywKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnc29tZSBmaXJzdCBuYW1lJywKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnc29tZSBsYXN0IG5hbWUnLgogICAgICAgICAgICAjIC4uLgogICAgICAgIH0sCiAgICAgICAgRXZlbnQgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFdmVudH0sCiAgICAgICAgQXR0YWNobWVudHMgICAgICAgICAgID0+IFxAQXR0YWNobWVudHMsICAgICAgICAgIyBvcHRpb25hbAogICAgKTsKCnJldHVybnMKCiAgICAkU3VjY2VzcyA9IDE7ICAgICAgICMgb3IgZmFsc2UgaW4gY2FzZSBvZiBhbiBlcnJvcgoKPWN1dAoKPWl0ZW0gR2V0VHJhbnNwb3J0UmVjaXBpZW50cygpCgpnZW5lcmF0ZXMgYSBsaXN0IG9mIHJlY2lwaWVudHMgZXhjbHVzaXZlIGZvciBhIGRldGVybWluZWQgdHJhbnNwb3J0LCB0aGUgY29udGVudCBvZiB0aGUgbGlzdCBpcwp1c3VhbGx5IGFuIGF0dHJpYnV0ZSBvZiBhbiBBZ2VudCBvciBDdXN0b21lciBhbmQgaXQgZGVwZW5kcyBvbiBlYWNoIHRyYW5zcG9ydAoKICAgIG15IEBUcmFuc3BvcnRSZWNpcGllbnRzID0gJFRyYW5zcG9ydE9iamVjdC0+R2V0VHJhbnNwb3J0UmVjaXBpZW50cygKICAgICAgICBOb3RpZmljYXRpb24gPT4gXCVOb3RpZmljYXRpb24sCiAgICApOwoKcmV0dXJuczoKCiAgICBAVHJhbnNwb3J0UmVjaXBlbnRzID0gKAogICAgICAgIHsKICAgICAgICAgICAgVXNlckVtYWlsICAgID0+ICdzb21lIGVtYWlsJywgICAgICAgIyBvcHRpb25hbAogICAgICAgICAgICBVc2VyRmlzcm5hbWUgPT4gJ3NvbWUgbmFtZScsICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgICAgICMgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICB9CiAgICApOwoKb3IKICAgIEBUcmFuc3BvcnRSZWNpcGllbnRzID0gdW5kZWY7ICAgaW4gY2FzZSBvZiBhbiBlcnJvcgoKPWN1dAoKPWl0ZW0gVHJhbnNwb3J0U2V0dGluZ3NEaXNwbGF5R2V0KCkKCmdlbmVyYXRlcyBhbmQgcmV0dXJucyB0aGUgSFRNTCBjb2RlIHRvIGRpc3BsYXkgZXhjbHVzaXZlIHNldHRpbmdzIGZvciBlYWNoIHRyYW5zcG9ydC4KCiAgICBteSAkSFRNTE91dHB1dCA9ICRUcmFuc3BvcnRPYmplY3QtPlRyYW5zcG9ydFNldHRpbmdzRGlzcGxheUdldCgKICAgICAgICBEYXRhID0+ICROb3RpZmljYXRpb25EYXRhQXR0cmlidXRlLCAgICAgICAgICAgIyBhcyByZXRyaWV2ZWQgZnJvbSBLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQ6Ok5vdGlmaWNhdGlvbkdldCgpCiAgICApOwoKcmV0dXJucwoKICAgICRIVE1MT3VwdXQgPSAnc29tZSBIVE1MIGNvZGUnOwoKPWN1dAoKPWl0ZW0gVHJhbnNwb3J0UGFyYW1TZXR0aW5nc0dldCgpCgpnZXRzIHNwZWNpZmljIHBhcmFtZXRlcnMgZnJvbSB0aGUgd2ViIHJlcXVlc3QgYW5kIHB1dCB0aGVtIGJhY2sgaW4gdGhlIEdldFBhcmFtIGF0dHJpYnV0ZSB0byBiZQpzYXZlZCBpbiB0aGUgbm90aWZpY2F0aW9uIGFzIHRoZSBzdGFuZGFyZCBwYXJhbWV0ZXJzCgogICAgbXkgJFN1Y2Nlc3MgPSAkVHJhbnNwb3J0T2JqZWN0LT5UcmFuc3BvcnRQYXJhbVNldHRpbmdzR2V0KAogICAgICAgIEdldFBhcmFtID0+ICRQYXJtSGFzaFJlZiwKICAgICk7CgpyZXR1cm5zCgogICAgJFN1Y2Nlc3MgPSAxOyAgICAgICAjIG9yIGZhbHNlIGluIGNhc2Ugb2YgYSBmYWlsdXJlCgo9Y3V0Cgo9aXRlbSBJc1VzYWJsZSgpOwoKcmV0dXJucyBpZiB0aGUgdHJhbnNwb3J0IGNhbiBiZSB1c2VkIGluIHRoZSBzeXN0ZW0gZW52aXJvbm1lbnQsCgogICAgbXkgJFN1Y2Nlc3MgPSAkVHJhbnNwb3J0T2JqZWN0LT5Jc1VzYWJsZSgpOwoKcmV0dXJucwoKICAgICRTdWNjZXNzID0gMTsgICAgICAgIyBvciBmYWxzZQoKPWN1dAoKPWl0ZW0gR2V0VHJhbnNwb3J0RXZlbnREYXRhKCkKCnJldHVybnMgdGhlIG5lZWRlZCBldmVudCBpbmZvcm1hdGlvbiBhZnRlciBhIG5vdGlmaWNhdGlvbiBoYXMgYmVlbiBzZW50CgogICAgbXkgJEV2ZW50RGF0YSA9ICRUcmFuc3BvcnRPYmplY3QtPiBHZXRUcmFuc3BvcnRFdmVudERhdGEoKTsKCnJldHVybnM6CgogICAgJEV2ZW50RGF0YSA9IHsKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZUFnZW50Tm90aWZpY2F0aW9uJywgICAgIyBvciAnQXJ0aWNsZUN1c3RvbWVyTm90aWZpY2F0aW9uJwogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgID0+IDEyMywKICAgICAgICAgICAgQXJ0aWNsZUlEID0+IDEyMywgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0VHJhbnNwb3J0RXZlbnREYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRTZWxmLT57RXZlbnREYXRhfSAvLyB7fTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRGlnZXN0OjpNRDU7Cgp1c2UgdmFycyBxdyhASVNBKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXI7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50IC0gY2FsZW5kYXIgYXBwb2ludG1lbnQgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBhcHBvaW50bWVudCBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBASVNBID0gcXcoCiAgICAgICAgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcgogICAgKTsKCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdBcHBvaW50bWVudENhbGVuZGFyOjpFdmVudE1vZHVsZVBvc3QnLAogICAgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQXBwb2ludG1lbnQnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogMjA7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBBcHBvaW50bWVudENyZWF0ZSgpCgpjcmVhdGVzIGEgbmV3IGFwcG9pbnRtZW50LgoKICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgdmFsaWQgUGFyZW50SUQgZm9yIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgdmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgICA9PiAnandpb2ppLWZ3amlvJywgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBwcm92aWRlIGRlc2lyZWQgVW5pcXVlSUQ7IGlmIHRoZXJlIGlzIGFscmVhZHkgZXhpc3RpbmcgQXBwb2ludG1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgd2l0aCBzYW1lIFVuaXF1ZUlELCBzeXN0ZW0gd2lsbCBkZWxldGUgaXQKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgPT4gJ1dlYmluYXInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVGl0bGUKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywgICAgICAgICAjIChvcHRpb25hbCkgRGVzY3JpcHRpb24KICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgPT4gJ1N0cmF1YmluZycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgTG9jYXRpb24KICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwCiAgICAgICAgVGVhbUlEICAgICAgICAgICAgICAgID0+IFsgMSBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIGlmIHN1cHBsaWVkCiAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICAgID0+IFsgMSwgMyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIGlmIHN1cHBsaWVkCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGZsYWcgdGhlIGFwcG9pbnRtZW50IGFzIHJlY3VycmluZyAocGFyZW50IG9ubHkhKQogICAgICAgIFJlY3VycmluZ1JhdyAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBza2lwIGxvb3AgZm9yIHJlY3VycmluZyBhcHBvaW50bWVudHMgKGRvIG5vdCBjcmVhdGUgb2NjdXJyZW5jZXMhKQogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgICA9PiAnRGFpbHknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIFJlY3VycmluZykgUG9zc2libGUgIkRhaWx5IiwgIldlZWtseSIsICJNb250aGx5IiwgIlllYXJseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIkN1c3RvbVdlZWtseSIsICJDdXN0b21Nb250aGx5IiwgIkN1c3RvbVllYXJseSIKCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSAgID0+IFsxLCAzLCA1XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQgaWYgQ3VzdG9tIFJlY3VycmluZykgUmVjdXJyZW5jZSBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbVdlZWtseTogMS1Nb24sIDItVHVlLC4uLiwgNy1TdW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tTW9udGhseTogMS0xc3QsIDItMm5kLC4uLCAzMXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbVllYXJseTogMS1KYW4sIDItRmViLC4uLiwgMTItRGVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuLi4KICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgSG93IG1hbnkgQXBwb2ludG1lbnRzIHRvIGNyZWF0ZQogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBSZXBlYXRpbmcgaW50ZXJ2YWwgKGRlZmF1bHQgMSkKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVW50aWwgZGF0ZQogICAgICAgIFJlY3VycmVuY2VJRCAgICAgICAgICA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBFeHBlY3RlZCBzdGFydCB0aW1lIGZvciB0aGlzIG9jY3VycmVuY2UKICAgICAgICBSZWN1cnJlbmNlRXhjbHVkZSAgICAgPT4gWyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgV2hpY2ggc3BlY2lmaWMgb2NjdXJyZW5jZXMgdG8gZXhjbHVkZQogICAgICAgICAgICAnMjAxNi0wMS0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDE2LTAxLTExIDAwOjAwOjAwJywKICAgICAgICBdLAogICAgICAgIE5vdGlmaWNhdGlvblRpbWUgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciBub3RpZmljYXRpb24gcG9pbnQgb2YgdGltZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICA9PiAncmVsYXRpdmUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJzEyJywgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5vdGlmaWNhdGlvbiBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICMgKG9wdGlvbmFsKSBUaWNrZXQgYXBwb2ludG1lbnQgcnVsZSBJRCAoZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFVzZXJJRAogICAgKTsKCnJldHVybnMgcGFyZW50IEFwcG9pbnRtZW50SUQgaWYgc3VjY2Vzc2Z1bAoKRXZlbnRzOgogICAgQXBwb2ludG1lbnRDcmVhdGUKCj1jdXQKCnN1YiBBcHBvaW50bWVudENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBUaXRsZSBTdGFydFRpbWUgRW5kVGltZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIHBvc3NpYmxlIG5vdGlmaWNhdGlvbiBwYXJhbXMKICAgICRTZWxmLT5fQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlKAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGlmIFJlY3VycmluZyBpcyBwcm92aWRlZCwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG11c3QgYmUgcHJlc2VudAogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgIkRhaWx5IiwgICAgICAgIldlZWtseSIsICAgICAgICJNb250aGx5IiwgICAgICAgIlllYXJseSIsCiAgICAgICAgICAgICJDdXN0b21EYWlseSIsICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte1JlY3VycmVuY2VUeXBlfQogICAgICAgICAgICB8fCAhZ3JlcCB7ICRfIGVxICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfSBAUmVjdXJyZW5jZVR5cGVzCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVHlwZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScKICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAhJFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlRnJlcXVlbmN5IG5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8PSAxOwoKICAgIGlmICggJFBhcmFte1VuaXF1ZUlEfSAmJiAhJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIFVuaXF1ZUlEICAgPT4gJFBhcmFte1VuaXF1ZUlEfSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgYXBwb2ludG1lbnQgd2l0aCBzYW1lIFVuaXF1ZUlECiAgICAgICAgaWYgKCAlQXBwb2ludG1lbnQgJiYgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgUGFyZW50SUQKICAgIGlmICggJFBhcmFte1BhcmVudElEfSAmJiAhSXNJbnRlZ2VyKCAkUGFyYW17UGFyZW50SUR9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQYXJlbnRJRCBtdXN0IGJlIGEgbnVtYmVyISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBTdGFydFRpbWUKICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgKTsKICAgIGlmICggISRTdGFydFRpbWVTeXN0ZW0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIFN0YXJ0VGltZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgVW5pcXVlSUQKICAgIGlmICggISRQYXJhbXtVbmlxdWVJRH0gKSB7CiAgICAgICAgJFBhcmFte1VuaXF1ZUlEfSA9ICRTZWxmLT5HZXRVbmlxdWVJRCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJFN0YXJ0VGltZVN5c3RlbSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgRW5kVGltZQogICAgbXkgJEVuZFRpbWVWYWxpZCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgKTsKICAgIGlmICggISRFbmRUaW1lVmFsaWQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIEVuZFRpbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGFycmF5IHJlZnMKICAgIG15ICVBcnJheXM7CiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoVGVhbUlEIFJlc291cmNlSUQgUmVjdXJyZW5jZUZyZXF1ZW5jeSBSZWN1cnJlbmNlRXhjbHVkZSkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IC8vIFtdIH0gKSB7CiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG5vdCBBUlJBWVJFRiEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQEFycmF5ID0gQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IH07CgogICAgICAgICAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICAgICAgICAgIEBBcnJheSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQEFycmF5OwoKICAgICAgICAgICAgJEFycmF5c3skUGFyYW1ldGVyfSA9IGpvaW4oICcsJywgQEFycmF5ICkgaWYgQEFycmF5OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIG51bWJlcnMKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhSZWN1cnJpbmcgUmVjdXJyZW5jZUNvdW50IFJlY3VycmVuY2VJbnRlcnZhbCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgIUlzSW50ZWdlciggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIFJlY3VycmVuY2VVbnRpbAogICAgaWYgKCAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgIyB1c3VhbGx5IGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kID0gMC4gSW4gdGhpcyBjYXNlLCB0YWtlIHRpbWUgZnJvbSBTdGFydFRpbWUKICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsU3lzdGVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKS0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRSZWN1cnJlbmNlVW50aWxTeXN0ZW0KICAgICAgICAgICAgfHwgJFN0YXJ0VGltZVN5c3RlbSA+ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgUmVjdXJyZW5jZVVudGlsISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15IEBCaW5kOwoKICAgICMgcGFyZW50IElEIHN1cHBsaWVkCiAgICBteSAkUGFyZW50SURDb2wgPSBteSAkUGFyZW50SURWYWwgPSAnJzsKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICAkUGFyZW50SURDb2wgPSAncGFyZW50X2lkLCc7CiAgICAgICAgJFBhcmVudElEVmFsID0gJz8sJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1BhcmVudElEfTsKCiAgICAgICAgIyB0dXJuIG9mZiBhbGwgcmVjdXJyaW5nIGZpZWxkcwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyaW5nfTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VUeXBlfTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZUNvdW50fTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH07CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9OwogICAgfQoKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17VW5pcXVlSUR9LCBcJFBhcmFte1RpdGxlfSwgXCRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgXCRQYXJhbXtMb2NhdGlvbn0sIFwkUGFyYW17U3RhcnRUaW1lfSwgICBcJFBhcmFte0VuZFRpbWV9LCAgIFwkUGFyYW17QWxsRGF5fSwKICAgICAgICBcJEFycmF5c3tUZWFtSUR9LCAgXCRBcnJheXN7UmVzb3VyY2VJRH0sIFwkUGFyYW17UmVjdXJyaW5nfSwgXCRQYXJhbXtSZWN1cnJlbmNlVHlwZX0sCiAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0sIFwkUGFyYW17UmVjdXJyZW5jZUNvdW50fSwgICAgICBcJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0sCiAgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LCAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUlEfSwgICAgICAgICBcJEFycmF5c3tSZWN1cnJlbmNlRXhjbHVkZX0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25EYXRlfSwgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9LCBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbX0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgIFwkUGFyYW17VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9LCAgICAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9OwoKICAgIG15ICRTUUwgPSAiCiAgICAgICAgSU5TRVJUIElOVE8gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICAgICAgKCRQYXJlbnRJRENvbCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAogICAgICAgICAgICBlbmRfdGltZSwgYWxsX2RheSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIHJlY3VycmluZywgcmVjdXJfdHlwZSwgcmVjdXJfZnJlcSwgcmVjdXJfY291bnQsCiAgICAgICAgICAgIHJlY3VyX2ludGVydmFsLCByZWN1cl91bnRpbCwgcmVjdXJfaWQsIHJlY3VyX2V4Y2x1ZGUsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLAogICAgICAgICAgICBjaGFuZ2VfYnkpCiAgICAgICAgVkFMVUVTICgkUGFyZW50SURWYWwgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywKICAgICAgICAgICAgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KQogICAgIjsKCiAgICAjIGNyZWF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICRBcHBvaW50bWVudElEOwoKICAgICMgcmV0dXJuIHBhcmVudCBpZCBmb3IgYXBwb2ludG1lbnQgb2NjdXJyZW5jZXMKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRQYXJhbXtQYXJlbnRJRH07CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnQgaWQgZm9yIHBhcmVudCBhcHBvaW50bWVudAogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBTRUxFQ1QgaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICAgICAgV0hFUkUgdW5pcXVlX2lkPT8gQU5EIHBhcmVudF9pZCBJUyBOVUxMCiAgICAgICAgICAgICcsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtVbmlxdWVJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQgPSAkUm93WzBdIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyByZXR1cm4gaWYgdGhlcmUgaXMgbm90IGFwcG9pbnRtZW50IGNyZWF0ZWQKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnRJRCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NhblwndCBnZXQgQXBwb2ludG1lbnRJRCBmcm9tIElOU0VSVCEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgIGlmICggJFBhcmFte1JlY3VycmluZ30gJiYgISRQYXJhbXtSZWN1cnJpbmdSYXd9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgIEFwcG9pbnRtZW50ID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNsZWFuIHVwIGxpc3QgbWV0aG9kcyBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGZpcmUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXBwb2ludG1lbnRJRDsKfQoKPWl0ZW0gQXBwb2ludG1lbnRMaXN0KCkKCmdldCBhIGhhc2ggb2YgQXBwb2ludG1lbnRzLgoKICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFZhbGlkIENhbGVuZGFySUQKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICcqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSB0aXRsZSwgd2lsZGNhcmQgc3VwcG9ydGVkCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgZGVzY3JpcHRpb24sIHdpbGRjYXJkIHN1cHBvcnRlZAogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgPT4gJyonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IGxvY2F0aW9uLCB3aWxkY2FyZCBzdXBwb3J0ZWQKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBzdGFydCBkYXRlCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMi0wMSAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgZW5kIGRhdGUKICAgICAgICBUZWFtSUQgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSB0ZWFtCiAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgcmVzb3VyY2UKICAgICAgICBSZXN1bHQgICAgICAgICAgICAgID0+ICdIQVNIJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpLCBIQVNIfEFSUkFZCiAgICApOwoKcmV0dXJucyBhbiBhcnJheSBvZiBoYXNoZXMgd2l0aCBzZWxlY3QgQXBwb2ludG1lbnQgZGF0YSBvciBzaW1wbGUgYXJyYXkgb2YgQXBwb2ludG1lbnRJRHM6CgpSZXN1bHQgPT4gJ0hBU0gnOgoKICAgIEBBcHBvaW50bWVudHMgPSBbCiAgICAgICAgewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gMSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgPT4gMCwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciByZWN1cnJpbmcgKHBhcmVudCkgYXBwb2ludG1lbnRzIG9ubHkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAyLAogICAgICAgICAgICBQYXJlbnRJRCAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIHJlY3VycmVkIChjaGlsZCkgYXBwb2ludG1lbnRzIG9ubHkKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLAogICAgICAgICAgICBVbmlxdWVJRCAgICAgID0+ICcyMDE2MDEwMVQxODAwMDAtQTc4QjU3QGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgID0+ICcyMDE2LTAxLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgVGVhbUlEICAgICAgICA9PiBbIDEgXSwKICAgICAgICAgICAgUmVzb3VyY2VJRCAgICA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgQWxsRGF5ICAgICAgICA9PiAwLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBcHBvaW50bWVudElEICAgICAgICAgICAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNjAxMDFUMTgwMDAwLUE3OEI1N0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGVhbUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEgXSwKICAgICAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNjoxMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAnMTAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICAgICAgICAgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICAgICMgZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEKICAgICAgICB9LAogICAgICAgIC4uLgogICAgXTsKClJlc3VsdCA9PiAnQVJSQVknOgoKICAgIEBBcHBvaW50bWVudHMgPSBbIDEsIDIsIC4uLiBdCgo9Y3V0CgpzdWIgQXBwb2ludG1lbnRMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IGFycmF5IG9mIGhhc2hlcyBieSBkZWZhdWx0CiAgICAkUGFyYW17UmVzdWx0fSA9ICRQYXJhbXtSZXN1bHR9IHx8ICdIQVNIJzsKCiAgICAjIGNhY2hlIGtleXMKICAgIG15ICRDYWNoZVR5cGUgICAgICAgID0gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9OwogICAgbXkgJENhY2hlS2V5VGl0bGUgICAgPSAkUGFyYW17VGl0bGV9IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5RGVzYyAgICAgPSAkUGFyYW17RGVzY3JpcHRpb259IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5TG9jYXRpb24gPSAkUGFyYW17TG9jYXRpb259IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5U3RhcnQgICAgPSAkUGFyYW17U3RhcnRUaW1lfSB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleUVuZCAgICAgID0gJFBhcmFte0VuZFRpbWV9IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5VGVhbSAgICAgPSAkUGFyYW17VGVhbUlEfSB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleVJlc291cmNlID0gJFBhcmFte1Jlc291cmNlSUR9IHx8ICdhbnknOwoKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VGl0bGV9ICYmICRQYXJhbXtUaXRsZX0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleVRpdGxlID0gJ2FueSc7CiAgICB9CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Rlc2NyaXB0aW9ufSAmJiAkUGFyYW17RGVzY3JpcHRpb259ID1+IC9eW1wqXSskLyApIHsKICAgICAgICAkQ2FjaGVLZXlEZXNjID0gJ2FueSc7CiAgICB9CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0xvY2F0aW9ufSAmJiAkUGFyYW17TG9jYXRpb259ID1+IC9eW1wqXSskLyApIHsKICAgICAgICAkQ2FjaGVLZXlMb2NhdGlvbiA9ICdhbnknOwogICAgfQoKICAgIG15ICRDYWNoZUtleQogICAgICAgID0gIiRDYWNoZUtleVRpdGxlLSRDYWNoZUtleURlc2MtJENhY2hlS2V5TG9jYXRpb24tJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kLSRDYWNoZUtleVRlYW0tJENhY2hlS2V5UmVzb3VyY2UtJFBhcmFte1Jlc3VsdH0iOwoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIGlmICggcmVmICREYXRhIGVxICdBUlJBWScgKSB7CiAgICAgICAgcmV0dXJuIEB7JERhdGF9OwogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBjaGVjayB0aW1lCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdGFydFRpbWVTeXN0ZW0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGFydFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZVN5c3RlbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RW5kVGltZX0gKSB7CiAgICAgICAgbXkgJEVuZFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkRW5kVGltZVN5c3RlbSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVuZFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRQYXJhbXtFbmRUaW1lfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyktPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZVN5c3RlbSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkLCBwYXJlbnRfaWQsIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsCiAgICAgICAgICAgIGVuZF90aW1lLCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgYWxsX2RheSwgcmVjdXJyaW5nLCBub3RpZnlfdGltZSwgbm90aWZ5X3RlbXBsYXRlLAogICAgICAgICAgICBub3RpZnlfY3VzdG9tLCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQsIG5vdGlmeV9jdXN0b21fdW5pdCwgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tX2RhdGUsIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkCiAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFdIRVJFIGNhbGVuZGFyX2lkPT8KICAgICc7CgogICAgbXkgQEJpbmQ7CgogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfTsKCiAgICAjIEZpbHRlciB0aXRsZSwgZGVzY3JpcHRpb24gYW5kIGxvY2F0aW9uIGZpZWxkcyBieSB1c2luZyBRdWVyeUNvbmRpdGlvbiBtZXRob2QsIHdoaWNoIHdpbGwKICAgICMgICByZXR1cm4gYmFja2VuZCBzcGVjaWZpYyBTUUwgc3RhdGVtZW50cyBpbiBvcmRlciB0byBwcm92aWRlIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2ggYW5kCiAgICAjICAgd2lsZGNhcmQgc3VwcG9ydC4KICAgIEZJTFRFUjoKICAgIGZvciBteSAkRmlsdGVyIChxdyhUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbikpIHsKICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJFBhcmFteyRGaWx0ZXJ9OwogICAgICAgICRTUUwgLj0gJyBBTkQgJyAuICREQk9iamVjdC0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICAgICA9PiBsYyAkRmlsdGVyLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJFBhcmFteyRGaWx0ZXJ9LAogICAgICAgICAgICBTZWFyY2hQcmVmaXggPT4gJyonLAogICAgICAgICAgICBTZWFyY2hTdWZmaXggPT4gJyonLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJyBBTkQgKAogICAgICAgICAgICAoc3RhcnRfdGltZSA+PSA/IEFORCBzdGFydF90aW1lIDwgPykgT1IKICAgICAgICAgICAgKGVuZF90aW1lID4gPyBBTkQgZW5kX3RpbWUgPD0gPykgT1IKICAgICAgICAgICAgKHN0YXJ0X3RpbWUgPD0gPyBBTkQgZW5kX3RpbWUgPj0gPykKICAgICAgICApICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgISRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnIEFORCBlbmRfdGltZSA+PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9OwogICAgfQogICAgZWxzaWYgKCAhJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICcgQU5EIHN0YXJ0X3RpbWUgPD0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17RW5kVGltZX07CiAgICB9CgogICAgJFNRTCAuPSAnIE9SREVSIEJZIGlkIEFTQyc7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSBAUmVzdWx0OwoKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIHRlYW0gaWQKICAgICAgICBteSBAVGVhbUlEID0gc3BsaXQoICcsJywgJFJvd1s5XSAvLyAnJyApOwogICAgICAgIGlmICggJFBhcmFte1RlYW1JRH0gKSB7CiAgICAgICAgICAgIG5leHQgUk9XIGlmICFncmVwIHsgJF8gPT0gJFBhcmFte1RlYW1JRH0gfSBAVGVhbUlEOwogICAgICAgIH0KCiAgICAgICAgIyByZXNvdXJjZSBpZAogICAgICAgICRSb3dbMTBdID0gJFJvd1sxMF0gPyAkUm93WzEwXSA6IDA7CiAgICAgICAgbXkgQFJlc291cmNlSUQgPSAkUm93WzEwXSA9fiAvLC8gPyBzcGxpdCggJywnLCAkUm93WzEwXSApIDogKCAkUm93WzEwXSApOwogICAgICAgIGlmICggJFBhcmFte1Jlc291cmNlSUR9ICkgewogICAgICAgICAgICBuZXh0IFJPVyBpZiAhZ3JlcCB7ICRfID09ICRQYXJhbXtSZXNvdXJjZUlEfSB9IEBSZXNvdXJjZUlEOwogICAgICAgIH0KCiAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gKAogICAgICAgICAgICBBcHBvaW50bWVudElEICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIFBhcmVudElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzJdLAogICAgICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbM10sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s0XSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbNl0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s3XSwKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzhdLAogICAgICAgICAgICBUZWFtSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFxAVGVhbUlELAogICAgICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFxAUmVzb3VyY2VJRCwKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzExXSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzEyXSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzEzXSB8fCAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkUm93WzE0XSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzE1XSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUm93WzE2XSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkUm93WzE3XSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkUm93WzE4XSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUm93WzE5XSB8fCAnJywKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgICAgICAgICAgICAgICA9PiAkUm93WzIwXSwKICAgICAgICApOwogICAgICAgIHB1c2ggQFJlc3VsdCwgXCVBcHBvaW50bWVudDsKICAgIH0KCiAgICAjIGlmIFJlc3VsdCB3YXMgQVJSQVksIG91dHB1dCBvbmx5IElEcwogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnQVJSQVknICkgewogICAgICAgIG15IEBSZXN1bHRMaXN0OwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBSZXN1bHQpIHsKICAgICAgICAgICAgcHVzaCBAUmVzdWx0TGlzdCwgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgfQogICAgICAgIEBSZXN1bHQgPSBAUmVzdWx0TGlzdDsKICAgIH0KCiAgICAjIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxAUmVzdWx0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gQFJlc3VsdDsKfQoKPWl0ZW0gQXBwb2ludG1lbnREYXlzKCkKCmdldCBhIGhhc2ggb2YgZGF5cyB3aXRoIEFwcG9pbnRtZW50cyBpbiBhbGwgdXNlciBjYWxlbmRhcnMuCgogICAgbXkgJUFwcG9pbnRtZW50RGF5cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREYXlzKAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHN0YXJ0IGRhdGUKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAyLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBlbmQgZGF0ZQogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWQgVXNlcklECiAgICApOwoKcmV0dXJucyBhIGhhc2ggd2l0aCBkYXlzIGFzIGtleXMgYW5kIG51bWJlciBvZiBBcHBvaW50bWVudHMgYXMgdmFsdWVzOgoKICAgICVBcHBvaW50bWVudERheXMgPSB7CiAgICAgICAgJzIwMTYtMDEtMDEnID0+IDEsCiAgICAgICAgJzIwMTYtMDEtMTMnID0+IDIsCiAgICAgICAgJzIwMTYtMDEtMzAnID0+IDEsCiAgICB9OwoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RGF5cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUga2V5cwogICAgbXkgJENhY2hlVHlwZSAgICAgPSAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfTsKICAgIG15ICRDYWNoZUtleVN0YXJ0ID0gJFBhcmFte1N0YXJ0VGltZX0gfHwgJ2FueSc7CiAgICBteSAkQ2FjaGVLZXlFbmQgICA9ICRQYXJhbXtFbmRUaW1lfSB8fCAnYW55JzsKCiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgY2hlY2sgdGltZQogICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSApIHsKICAgICAgICBteSAkU3RhcnRUaW1lVmFsaWQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3RhcnRUaW1lVmFsaWQgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGFydFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17RW5kVGltZX0gKSB7CiAgICAgICAgbXkgJEVuZFRpbWVWYWxpZCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkRW5kVGltZVZhbGlkICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJERhdGEgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICA9PiAiJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kIiwKICAgICk7CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAleyREYXRhfTsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCB1c2VyIGdyb3VwcwogICAgbXkgJUdyb3VwTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICApOwogICAgbXkgQEdyb3VwSURzID0gc29ydCBrZXlzICVHcm91cExpc3Q7CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBTRUxFQ1QgY2Euc3RhcnRfdGltZSwgY2EuZW5kX3RpbWUKICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IGNhCiAgICAgICAgSk9JTiBjYWxlbmRhciBjIE9OIGNhLmNhbGVuZGFyX2lkID0gYy5pZAogICAgICAgIFdIRVJFIGMuZ3JvdXBfaWQgSU4gKCAke1woam9pbiAnLCAnLCBAR3JvdXBJRHMpfSApCiAgICAiOwoKICAgIG15IEBCaW5kOwoKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICdBTkQgKAogICAgICAgICAgICAoY2Euc3RhcnRfdGltZSA+PSA/IEFORCBjYS5zdGFydF90aW1lIDwgPykgT1IKICAgICAgICAgICAgKGNhLmVuZF90aW1lID4gPyBBTkQgY2EuZW5kX3RpbWUgPD0gPykgT1IKICAgICAgICAgICAgKGNhLnN0YXJ0X3RpbWUgPD0gPyBBTkQgY2EuZW5kX3RpbWUgPj0gPykKICAgICAgICApICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgISRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnQU5EIGNhLmVuZF90aW1lID49ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1N0YXJ0VGltZX07CiAgICB9CiAgICBlbHNpZiAoICEkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJ0FORCBjYS5zdGFydF90aW1lIDw9ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0VuZFRpbWV9OwogICAgfQoKICAgICRTUUwgLj0gJ09SREVSIEJZIGNhLmlkIEFTQyc7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSAlUmVzdWx0OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAoICRTdGFydFRpbWUsICRFbmRUaW1lLCAkU3RhcnRUaW1lU3lzdGVtLCAkRW5kVGltZVN5c3RlbSApOwoKICAgICAgICAjIFN0YXJ0VGltZQogICAgICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gKSB7CiAgICAgICAgICAgICRTdGFydFRpbWUgPSAkUm93WzBdIGx0ICRQYXJhbXtTdGFydFRpbWV9ID8gJFBhcmFte1N0YXJ0VGltZX0gOiAkUm93WzBdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIEVuZFRpbWUKICAgICAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkUm93WzFdIGd0ICRQYXJhbXtFbmRUaW1lfSA/ICRQYXJhbXtFbmRUaW1lfSA6ICRSb3dbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRW5kVGltZSA9ICRSb3dbMV07CiAgICAgICAgfQoKICAgICAgICAjIEdldCBzeXN0ZW0gdGltZXMKICAgICAgICAkU3RhcnRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFN0YXJ0VGltZSwKICAgICAgICApOwoKICAgICAgICAkRW5kVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRFbmRUaW1lLAogICAgICAgICk7CgogICAgICAgIGZvciAoCiAgICAgICAgICAgIG15ICRMb29wU3lzdGVtVGltZSA9ICRTdGFydFRpbWVTeXN0ZW07CiAgICAgICAgICAgICRMb29wU3lzdGVtVGltZSA8ICRFbmRUaW1lU3lzdGVtOwogICAgICAgICAgICAkTG9vcFN5c3RlbVRpbWUgKz0gNjAgKiA2MCAqIDI0CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRMb29wVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkTG9vcFN5c3RlbVRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTG9vcFRpbWUgPX4gcy9ccy4qPyQvL2dzbTsKCiAgICAgICAgICAgIGlmICggJFJlc3VsdHskTG9vcFRpbWV9ICkgewogICAgICAgICAgICAgICAgJFJlc3VsdHskTG9vcFRpbWV9Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmVzdWx0eyRMb29wVGltZX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICAgPT4gIiRDYWNoZUtleVN0YXJ0LSRDYWNoZUtleUVuZCIsCiAgICAgICAgVmFsdWUgPT4gXCVSZXN1bHQsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aXRlbSBBcHBvaW50bWVudEdldCgpCgpnZXQgQXBwb2ludG1lbnQuCgogICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIFVuaXF1ZUlEICAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywgIyAocmVxdWlyZWQpIHdpbGwgcmV0dXJuIG9ubHkgcGFyZW50IGZvciByZWN1cnJpbmcgYXBwb2ludG1lbnRzCiAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpyZXR1cm5zIGEgaGFzaDoKICAgICVBcHBvaW50bWVudCA9ICgKICAgICAgICBBcHBvaW50bWVudElEICAgICAgID0+IDIsCiAgICAgICAgUGFyZW50SUQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgZm9yIHJlY3VycmVkIChjaGlsZCkgYXBwb2ludG1lbnRzCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAxLAogICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICA9PiAnU3RyYXViaW5nJywKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICBBbGxEYXkgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgVGVhbUlEICAgICAgICAgICAgICA9PiBbIDEgXSwKICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgID0+IFsgMSwgMyBdLAogICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgID0+ICdEYWlseScsCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiAxLAogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgID0+IDIsCiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsCiAgICAgICAgUmVjdXJyZW5jZUlEICAgICAgICA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsCiAgICAgICAgUmVjdXJyZW5jZUV4Y2x1ZGUgICA9PiBbCiAgICAgICAgICAgICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMTYtMDEtMTEgMDA6MDA6MDAnLAogICAgICAgIF0sCiAgICAgICAgTm90aWZpY2F0aW9uVGltZSAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjA6MDAnLAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21Vbml0Q291bnQgICAgICAgPT4gJzEyJywKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21Vbml0ICAgICAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAoKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLCAgIyBmb3IgdGlja2V0IGFwcG9pbnRtZW50cyBvbmx5IQogICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgICAgICA9PiAyLAogICAgICAgIENoYW5nZVRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgICAgICA9PiAyLAogICAgKTsKCj1jdXQKCnN1YiBBcHBvaW50bWVudEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcHBvaW50bWVudElEfQogICAgICAgICYmICEoICRQYXJhbXtVbmlxdWVJRH0gJiYgJFBhcmFte0NhbGVuZGFySUR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEFwcG9pbnRtZW50SUQgb3IgVW5pcXVlSUQgYW5kIENhbGVuZGFySUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkRGF0YTsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgICREYXRhID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggcmVmICREYXRhIGVxICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gJXskRGF0YX07CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgQEJpbmQ7CiAgICBteSAkU1FMID0gJwogICAgICAgIFNFTEVDVCBpZCwgcGFyZW50X2lkLCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAogICAgICAgICAgICBlbmRfdGltZSwgYWxsX2RheSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIHJlY3VycmluZywgcmVjdXJfdHlwZSwgcmVjdXJfZnJlcSwgcmVjdXJfY291bnQsCiAgICAgICAgICAgIHJlY3VyX2ludGVydmFsLCByZWN1cl91bnRpbCwgcmVjdXJfaWQsIHJlY3VyX2V4Y2x1ZGUsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLAogICAgICAgICAgICBjaGFuZ2VfYnkKICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgV0hFUkUKICAgICc7CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAnaWQ9PyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17QXBwb2ludG1lbnRJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICd1bmlxdWVfaWQ9PyBBTkQgY2FsZW5kYXJfaWQ9PyBBTkQgcGFyZW50X2lkIElTIE5VTEwgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VuaXF1ZUlEfSwgXCRQYXJhbXtDYWxlbmRhcklEfTsKICAgIH0KCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAlUmVzdWx0OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIHRlYW0gaWQKICAgICAgICBteSBAVGVhbUlEID0gc3BsaXQoICcsJywgJFJvd1sxMF0gLy8gJycgKTsKCiAgICAgICAgIyByZXNvdXJjZSBpZAogICAgICAgIG15IEBSZXNvdXJjZUlEID0gc3BsaXQoICcsJywgJFJvd1sxMV0gLy8gJzAnICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBmcmVxdWVuY3kKICAgICAgICBteSBAUmVjdXJyZW5jZUZyZXF1ZW5jeSA9ICRSb3dbMTRdID8gc3BsaXQoICcsJywgJFJvd1sxNF0gKSA6IHVuZGVmOwoKICAgICAgICAjIHJlY3VycmVuY2UgZXhjbHVkZQogICAgICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZSA9ICRSb3dbMTldID8gc3BsaXQoICcsJywgJFJvd1sxOV0gKSA6IHVuZGVmOwoKICAgICAgICAkUmVzdWx0e0FwcG9pbnRtZW50SUR9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAkUmVzdWx0e1BhcmVudElEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkUmVzdWx0e0NhbGVuZGFySUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syXTsKICAgICAgICAkUmVzdWx0e1VuaXF1ZUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1szXTsKICAgICAgICAkUmVzdWx0e1RpdGxlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s0XTsKICAgICAgICAkUmVzdWx0e0Rlc2NyaXB0aW9ufSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s1XTsKICAgICAgICAkUmVzdWx0e0xvY2F0aW9ufSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s2XTsKICAgICAgICAkUmVzdWx0e1N0YXJ0VGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s3XTsKICAgICAgICAkUmVzdWx0e0VuZFRpbWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s4XTsKICAgICAgICAkUmVzdWx0e0FsbERheX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s5XTsKICAgICAgICAkUmVzdWx0e1RlYW1JRH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXEBUZWFtSUQ7CiAgICAgICAgJFJlc3VsdHtSZXNvdXJjZUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFxAUmVzb3VyY2VJRDsKICAgICAgICAkUmVzdWx0e1JlY3VycmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxMl07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlVHlwZX0gICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTNdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gICAgICAgICAgICAgICAgICAgPSBcQFJlY3VycmVuY2VGcmVxdWVuY3k7CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlQ291bnR9ICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTVdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUludGVydmFsfSAgICAgICAgICAgICAgICAgICAgPSAkUm93WzE2XTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VVbnRpbH0gICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxN107CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMThdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUV4Y2x1ZGV9ICAgICAgICAgICAgICAgICAgICAgPSBcQFJlY3VycmVuY2VFeGNsdWRlOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uRGF0ZX0gICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzIwXSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvblRlbXBsYXRlfSAgICAgICAgICAgICAgICAgID0gJFJvd1syMV0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b219ICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjJdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ICAgPSAkUm93WzIzXSB8fCAwOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fSAgICAgICAgPSAkUm93WzI0XSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9ID0gJFJvd1syNV0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gICAgICAgICAgICA9ICRSb3dbMjZdIHx8ICcnOwogICAgICAgICRSZXN1bHR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICAgICAgICAgICAgICAgPSAkUm93WzI3XTsKICAgICAgICAkUmVzdWx0e0NyZWF0ZVRpbWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syOF07CiAgICAgICAgJFJlc3VsdHtDcmVhdGVCeX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjldOwogICAgICAgICRSZXN1bHR7Q2hhbmdlVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzMwXTsKICAgICAgICAkUmVzdWx0e0NoYW5nZUJ5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1szMV07CiAgICB9CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CgogICAgICAgICMgY2FjaGUKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFZhbHVlID0+IFwlUmVzdWx0LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aXRlbSBBcHBvaW50bWVudFVwZGF0ZSgpCgp1cGRhdGVzIGFuIGV4aXN0aW5nIGFwcG9pbnRtZW50LgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICBBcHBvaW50bWVudElEICAgICAgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICA9PiAnV2ViaW5hcicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBUaXRsZQogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLCAgICAgICAgICMgKG9wdGlvbmFsKSBEZXNjcmlwdGlvbgogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICA9PiAnU3RyYXViaW5nJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBMb2NhdGlvbgogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEFsbERheSAgICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBEZWZhdWx0IDAKICAgICAgICBUZWFtICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgICAgPT4gWyAxLCAzIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgaWYgc3VwcGxpZWQKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZmxhZyB0aGUgYXBwb2ludG1lbnQgYXMgcmVjdXJyaW5nIChwYXJlbnQgb25seSEpCgogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgICA9PiAnRGFpbHknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIFJlY3VycmluZykgUG9zc2libGUgIkRhaWx5IiwgIldlZWtseSIsICJNb250aGx5IiwgIlllYXJseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIkN1c3RvbVdlZWtseSIsICJDdXN0b21Nb250aGx5IiwgIkN1c3RvbVllYXJseSIKCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQgaWYgQ3VzdG9tIFJlY3VycmluZykgUmVjdXJyZW5jZSBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbVdlZWtseTogMS1Nb24sIDItVHVlLC4uLiwgNy1TdW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tTW9udGhseTogMS1KYW4sIDItRmViLC4uLiwgMTItRGVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuLi4KICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgSG93IG1hbnkgQXBwb2ludG1lbnRzIHRvIGNyZWF0ZQogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBSZXBlYXRpbmcgaW50ZXJ2YWwgKGRlZmF1bHQgMSkKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVW50aWwgZGF0ZQogICAgICAgIE5vdGlmaWNhdGlvblRpbWUgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciBub3RpZmljYXRpb24gcG9pbnQgb2YgdGltZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICA9PiAncmVsYXRpdmUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJzEyJywgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5vdGlmaWNhdGlvbiBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICMgKG9wdGlvbmFsKSBUaWNrZXQgYXBwb2ludG1lbnQgcnVsZSBJRCAoZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFVzZXJJRAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsOgogICAgJFN1Y2Nlc3MgPSAxOwoKRXZlbnRzOgogICAgQXBwb2ludG1lbnRVcGRhdGUKCj1jdXQKCnN1YiBBcHBvaW50bWVudFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBDYWxlbmRhcklEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSgKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBpZiBSZWN1cnJpbmcgaXMgcHJvdmlkZWQsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBtdXN0IGJlIHByZXNlbnQKICAgIGlmICggJFBhcmFte1JlY3VycmluZ30gKSB7CgogICAgICAgIG15IEBSZWN1cnJlbmNlVHlwZXMgPSAoCiAgICAgICAgICAgICJEYWlseSIsICAgICAgICJXZWVrbHkiLCAgICAgICAiTW9udGhseSIsICAgICAgICJZZWFybHkiLAogICAgICAgICAgICAiQ3VzdG9tRGFpbHkiLCAiQ3VzdG9tV2Vla2x5IiwgIkN1c3RvbU1vbnRobHkiLCAiQ3VzdG9tWWVhcmx5IgogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRQYXJhbXtSZWN1cnJlbmNlVHlwZX0KICAgICAgICAgICAgfHwgIWdyZXAgeyAkXyBlcSAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IH0gQFJlY3VycmVuY2VUeXBlcwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjdXJyZW5jZVR5cGUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVdlZWtseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknCiAgICAgICAgICAgICAgICB8fCAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21ZZWFybHknCiAgICAgICAgICAgICkKICAgICAgICAgICAgJiYgISRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjdXJyZW5jZUZyZXF1ZW5jeSBuZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfSB8fD0gMTsKCiAgICAjIGNoZWNrIFN0YXJ0VGltZQogICAgbXkgJFN0YXJ0VGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICApOwogICAgaWYgKCAhJFN0YXJ0VGltZVN5c3RlbSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXJ0VGltZSBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBFbmRUaW1lCiAgICBteSAkRW5kVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgKTsKICAgIGlmICggISRFbmRUaW1lU3lzdGVtICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjaGVjayBpZiBhcnJheSByZWZzCiAgICBteSAlQXJyYXlzOwogICAgZm9yIG15ICRQYXJhbWV0ZXIgKAogICAgICAgIHF3KFRlYW1JRCBSZXNvdXJjZUlEIFJlY3VycmVuY2VGcmVxdWVuY3kpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFBhcmFteyRQYXJhbWV0ZXJ9ICYmIEB7ICRQYXJhbXskUGFyYW1ldGVyfSAvLyBbXSB9ICkgewogICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXskUGFyYW1ldGVyfSApICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJFBhcmFtZXRlciBub3QgQVJSQVlSRUYhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBBcnJheSA9IEB7ICRQYXJhbXskUGFyYW1ldGVyfSB9OwoKICAgICAgICAgICAgIyByZW1vdmUgdW5kZWZpbmVkIHZhbHVlcwogICAgICAgICAgICBAQXJyYXkgPSBncmVwIHsgZGVmaW5lZCAkXyB9IEBBcnJheTsKCiAgICAgICAgICAgICRBcnJheXN7JFBhcmFtZXRlcn0gPSBqb2luKCAnLCcsIEBBcnJheSApIGlmIEBBcnJheTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBudW1iZXJzCiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoUmVjdXJyaW5nIFJlY3VycmVuY2VDb3VudCBSZWN1cnJlbmNlSW50ZXJ2YWwpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFBhcmFteyRQYXJhbWV0ZXJ9ICYmICFJc0ludGVnZXIoICRQYXJhbXskUGFyYW1ldGVyfSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJFBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBSZWN1cnJlbmNlVW50aWwKICAgIGlmICggJFBhcmFte1JlY3VycmVuY2VVbnRpbH0gKSB7CgogICAgICAgICMgdXN1YWxseSBob3VyLCBtaW51dGUgYW5kIHNlY29uZCA9IDAuIEluIHRoaXMgY2FzZSwgdGFrZSB0aW1lIGZyb20gU3RhcnRUaW1lCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVDaGVjaygKICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbFN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICk7CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFJlY3VycmVuY2VVbnRpbFN5c3RlbQogICAgICAgICAgICB8fCAkU3RhcnRUaW1lU3lzdGVtID4gJFJlY3VycmVuY2VVbnRpbFN5c3RlbQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjdXJyZW5jZVVudGlsIGludmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmV2aW91cyBDYWxlbmRhcklECiAgICBteSAkUHJldmlvdXNDYWxlbmRhcklEID0gJFNlbGYtPl9BcHBvaW50bWVudEdldENhbGVuZGFySUQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgc2V0IHJlY3VycmVuY2UgZXhjbHVkZSBsaXN0CiAgICBteSBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBAeyAkUGFyYW17UmVjdXJyZW5jZUV4Y2x1ZGV9IC8vIFtdIH07CgogICAgIyBnZXQgUmVjdXJyZW5jZUlECiAgICBteSAkUmVjdXJyZW5jZUlEID0gJFNlbGYtPl9BcHBvaW50bWVudEdldFJlY3VycmVuY2VJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyB1c2UgZXhjbHVkZSBsaXN0IHRvIGZsYWcgdGhlIHJlY3VycmluZyBvY2N1cnJlbmNlIGFzIHVwZGF0ZWQKICAgIGlmICgkUmVjdXJyZW5jZUlEKSB7CiAgICAgICAgQFJlY3VycmVuY2VFeGNsdWRlID0gKCRSZWN1cnJlbmNlSUQpOwogICAgfQoKICAgICMgcmVzZXQgZXhjbHVkZSBsaXN0IGlmIHJlY3VycmVuY2UgaXMgdHVybmVkIG9mZgogICAgZWxzaWYgKCAhJFBhcmFte1JlY3VycmluZ30gKSB7CiAgICAgICAgQFJlY3VycmVuY2VFeGNsdWRlID0gKCk7CiAgICB9CgogICAgIyByZW1vdmUgdW5kZWZpbmVkIHZhbHVlcwogICAgQFJlY3VycmVuY2VFeGNsdWRlID0gZ3JlcCB7IGRlZmluZWQgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgIyBzZXJpYWxpemUgZGF0YQogICAgbXkgJFJlY3VycmVuY2VFeGNsdWRlID0gam9pbiggJywnLCBAUmVjdXJyZW5jZUV4Y2x1ZGUgKSB8fCB1bmRlZjsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyByZWN1cnJlZCBhcHBvaW50bWVudHMKICAgIG15ICREZWxldGVTdWNjZXNzID0gJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0RlbGV0ZSgKICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgIGlmICggISREZWxldGVTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVW5hYmxlIHRvIGRlbGV0ZSByZWN1cnJpbmcgQXBwb2ludG1lbnQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudAogICAgbXkgJFNRTCA9ICcKICAgICAgICBVUERBVEUgY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBTRVQKICAgICAgICAgICAgY2FsZW5kYXJfaWQ9PywgdGl0bGU9PywgZGVzY3JpcHRpb249PywgbG9jYXRpb249Pywgc3RhcnRfdGltZT0/LCBlbmRfdGltZT0/LCBhbGxfZGF5PT8sCiAgICAgICAgICAgIHRlYW1faWQ9PywgcmVzb3VyY2VfaWQ9PywgcmVjdXJyaW5nPT8sIHJlY3VyX3R5cGU9PywgcmVjdXJfZnJlcT0/LCByZWN1cl9jb3VudD0/LAogICAgICAgICAgICByZWN1cl9pbnRlcnZhbD0/LCByZWN1cl91bnRpbD0/LCByZWN1cl9leGNsdWRlPT8sIG5vdGlmeV90aW1lPT8sIG5vdGlmeV90ZW1wbGF0ZT0/LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tPT8sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudD0/LCBub3RpZnlfY3VzdG9tX3VuaXQ9PywKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50PT8sIG5vdGlmeV9jdXN0b21fZGF0ZT0/LCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZD0/LAogICAgICAgICAgICBjaGFuZ2VfdGltZT1jdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5PT8KICAgICAgICBXSEVSRSBpZD0/CiAgICAnOwoKICAgICMgdXBkYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NhbGVuZGFySUR9LCBcJFBhcmFte1RpdGxlfSwgICBcJFBhcmFte0Rlc2NyaXB0aW9ufSwgXCRQYXJhbXtMb2NhdGlvbn0sCiAgICAgICAgICAgIFwkUGFyYW17U3RhcnRUaW1lfSwgIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17QWxsRGF5fSwgICAgICBcJEFycmF5c3tUZWFtSUR9LAogICAgICAgICAgICBcJEFycmF5c3tSZXNvdXJjZUlEfSwgICAgICAgICAgXCRQYXJhbXtSZWN1cnJpbmd9LCAgICAgICBcJFBhcmFte1JlY3VycmVuY2VUeXBlfSwKICAgICAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0sIFwkUGFyYW17UmVjdXJyZW5jZUNvdW50fSwgXCRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9LAogICAgICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sIFwkUmVjdXJyZW5jZUV4Y2x1ZGUsIFwkUGFyYW17Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9LCAgICAgICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSwKICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LCBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgYWRkIHJlY3VycmVkIGFwcG9pbnRtZW50cyBhZ2FpbgogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fQXBwb2ludG1lbnRSZWN1cnJpbmdDcmVhdGUoCiAgICAgICAgICAgIFBhcmVudElEICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgQXBwb2ludG1lbnQgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgIG15IEBDYWxlbmRhcklEcyA9ICggJFBhcmFte0NhbGVuZGFySUR9ICk7CiAgICBwdXNoIEBDYWxlbmRhcklEcywgJFByZXZpb3VzQ2FsZW5kYXJJRCBpZiAkUHJldmlvdXNDYWxlbmRhcklEIG5lICRQYXJhbXtDYWxlbmRhcklEfTsKICAgIGZvciBteSAkQ2FsZW5kYXJJRCAoQENhbGVuZGFySURzKSB7CiAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRDYWxlbmRhcklELAogICAgICAgICk7CiAgICB9CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBmaXJlIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudFVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFwcG9pbnRtZW50RGVsZXRlKCkKCmRlbGV0ZXMgYW4gZXhpc3RpbmcgYXBwb2ludG1lbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgIEFwcG9pbnRtZW50SUQgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsOgogICAgJFN1Y2Nlc3MgPSAxOwoKRXZlbnRzOgogICAgQXBwb2ludG1lbnREZWxldGUKCj1jdXQKCnN1YiBBcHBvaW50bWVudERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBnZXQgQ2FsZW5kYXJJRAogICAgbXkgJENhbGVuZGFySUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0Q2FsZW5kYXJJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjaGVjayB1c2VyJ3MgcGVybWlzc2lvbnMgZm9yIHRoaXMgY2FsZW5kYXIKICAgIG15ICRQZXJtaXNzaW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15IEBSZXF1aXJlZFBlcm1pc3Npb25zID0gKCAnY3JlYXRlJywgJ3J3JyApOwoKICAgIGlmICggIWdyZXAgeyAkUGVybWlzc2lvbiBlcSAkXyB9IEBSZXF1aXJlZFBlcm1pc3Npb25zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVXNlcigkUGFyYW17VXNlcklEfSkgaGFzIG5vIHBlcm1pc3Npb24gdG8gZGVsZXRlIEFwcG9pbnRtZW50KCRQYXJhbXtBcHBvaW50bWVudElEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgc2F2ZSBleGNsdXNpb24gaW5mbyB0byBwYXJlbnQgYXBwb2ludG1lbnQKICAgIGlmICggJEFwcG9pbnRtZW50e1BhcmVudElEfSAmJiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUlEfSApIHsKICAgICAgICAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRXhjbHVkZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0sCiAgICAgICAgICAgIFJlY3VycmVuY2VJRCA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUlEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgIG15ICREZWxldGVSZWN1cnJpbmdTdWNjZXNzID0gJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0RlbGV0ZSgKICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgIGlmICggISREZWxldGVSZWN1cnJpbmdTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50cyBjb3VsZG5cJ3QgYmUgZGVsZXRlZCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGFwcG9pbnRtZW50CiAgICBteSAkU1FMID0gJwogICAgICAgIERFTEVURSBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgV0hFUkUgaWQ9PwogICAgJzsKCiAgICAjIGRlbGV0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgY2xlYW4gdXAgbGlzdCBtZXRob2RzIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnTGlzdCcgLiAkQ2FsZW5kYXJJRCwKICAgICk7CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBmaXJlIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudERlbGV0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFwcG9pbnRtZW50RGVsZXRlT2NjdXJyZW5jZSgpCgpkZWxldGVzIGEgc2luZ2xlIHJlY3VycmluZyBhcHBvaW50bWVudCBvY2N1cnJlbmNlLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZU9jY3VycmVuY2UoCiAgICAgICAgVW5pcXVlSUQgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsICAgICMgKHJlcXVpcmVkKQogICAgICAgIFJlY3VycmVuY2VJRCA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7Cgo9Y3V0CgpzdWIgQXBwb2ludG1lbnREZWxldGVPY2N1cnJlbmNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVbmlxdWVJRCBDYWxlbmRhcklEIFJlY3VycmVuY2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICBXSEVSRSB1bmlxdWVfaWQ9PyBBTkQgY2FsZW5kYXJfaWQ9PyBBTkQgcmVjdXJfaWQ9PycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1VuaXF1ZUlEfSwgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtSZWN1cnJlbmNlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJUFwcG9pbnRtZW50OwoKICAgICMgZ2V0IGFkZGl0aW9uYWwgaW5mbwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiBpZiAhJUFwcG9pbnRtZW50OwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgID0+ICdERUxFVEUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBXSEVSRSBpZD0/JywKICAgICAgICBCaW5kICA9PiBbIFwkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBjYWNoZSBvYmplY3QKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICk7CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEdldFVuaXF1ZUlEKCkKCnJldHVybnMgVW5pcXVlSUQgY29udGFpbmluZyBhcHBvaW50bWVudCBzdGFydCB0aW1lLCByYW5kb20gaGFzaCBhbmQgc3lzdGVtIEZRRE4uCgogICAgbXkgJFVuaXF1ZUlEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5HZXRVbmlxdWVJRCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgU3RhcnRUaW1lICA9PiAxNDUxNjA2NDAwLCAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgogICAgJFVuaXF1ZUlEID0gJyc7Cgo9Y3V0CgpzdWIgR2V0VW5pcXVlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgU3RhcnRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNhbGN1bGF0ZSBhIGhhc2gKICAgIG15ICRSYW5kb21TdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZyggTGVuZ3RoID0+IDMyICk7CiAgICBteSAkU3RyaW5nICAgICAgID0gIiRQYXJhbXtDYWxlbmRhcklEfS0kUmFuZG9tU3RyaW5nLSRQYXJhbXtVc2VySUR9IjsKICAgIG15ICREaWdlc3QgICAgICAgPSB1bnBhY2soICdOJywgRGlnZXN0OjpNRDUtPm5ldygpLT5hZGQoJFN0cmluZyktPmRpZ2VzdCgpICk7CiAgICBteSAkRGlnZXN0SGV4ICAgID0gc3ByaW50ZiggJyV4JywgJERpZ2VzdCApOwogICAgbXkgJEhhc2ggICAgICAgICA9IHVjKCBzcHJpbnRmKCAiJS42cyIsICREaWdlc3RIZXggKSApOwoKICAgICMgcHJlcGFyZSBzdGFydCB0aW1lc3RhbXAgZm9yIFVuaXF1ZUlECiAgICBteSAkU3RhcnRUaW1lU3RyZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyktPlRpbWVzdGFtcEdldCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgKTsKICAgICRTdGFydFRpbWVTdHJnID1+IHMvWy06XS8vZzsKICAgICRTdGFydFRpbWVTdHJnID1+IHMvXHMvVC87CgogICAgIyBnZXQgc3lzdGVtIEZRRE4KICAgIG15ICRGUUROID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGUUROJyk7CgogICAgIyByZXR1cm4gVW5pcXVlSUQKICAgIHJldHVybiAiJFN0YXJ0VGltZVN0cmctJEhhc2hcQCRGUUROIjsKfQoKPWl0ZW0gQXBwb2ludG1lbnRVcGNvbWluZ0dldCgpCgpHZXQgYXBwb2ludG1lbnQgZGF0YSBmb3IgdXBjb21pbmcgYXBwb2ludG1lbnQgc3RhcnQgb3IgZW5kLgoKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRVcGNvbWluZ0dldCgKICAgICAgICBUaW1lc3RhbXAgPT4gJzIwMTYtMDgtMDIgMDM6NTk6MDAnLCAjIGdldCBhcHBvaW50bWVudHMgZm9yIHRoZSByZWxhdGVkIG5vdGlmaWNhdGlvbiB0aW1lc3RhbXAKICAgICk7CgpyZXR1cm5zOgoKICAgIEFwcG9pbnRtZW50IGRhdGEgb2YgQXBwb2ludG1lbnRHZXQoKS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudFVwY29taW5nR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3VycmVudCB0aW1lc3RhbXAKICAgIG15ICRDdXJyZW50VGltZXN0YW1wOwoKICAgICMgY3JlYXRlIG5lZWRlZCBzcWwgcXVlcnkgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3IgYSBnaXZlbiB0aW1lc3RhbXAKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBwYXJlbnRfaWQsIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCAnOwoKICAgIGlmICggJFBhcmFte1RpbWVzdGFtcH0gKSB7CgogICAgICAgICRDdXJyZW50VGltZXN0YW1wID0gJFBhcmFte1RpbWVzdGFtcH07CiAgICAgICAgJFNRTCAuPSAiV0hFUkUgbm90aWZ5X3RpbWUgPSA/ICI7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgJEN1cnJlbnRUaW1lc3RhbXAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpLT5DdXJyZW50VGltZXN0YW1wR2V0KCk7CiAgICAgICAgJFNRTCAuPSAiV0hFUkUgbm90aWZ5X3RpbWUgPj0gPyAiOwogICAgfQoKICAgICRTUUwgLj0gJ09SREVSIEJZIG5vdGlmeV90aW1lIEFTQyc7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWyBcJEN1cnJlbnRUaW1lc3RhbXAgXSwKICAgICk7CgogICAgbXkgQFJlc3VsdFJhdzsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJVVwY29taW5nQXBwb2ludG1lbnQ7CgogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ID0gJFJvd1swXTsKICAgICAgICAkVXBjb21pbmdBcHBvaW50bWVudHtQYXJlbnRJRH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gICAgPSAkUm93WzJdOwogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e1VuaXF1ZUlEfSAgICAgID0gJFJvd1szXTsKCiAgICAgICAgcHVzaCBAUmVzdWx0UmF3LCBcJVVwY29taW5nQXBwb2ludG1lbnQ7CiAgICB9CgogICAgbXkgQFJlc3VsdHM7CgogICAgQVBQT0lOVE1FTlREQVRBOgogICAgZm9yIG15ICRBcHBvaW50bWVudERhdGEgKEBSZXN1bHRSYXcpIHsKCiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcHBvaW50bWVudERhdGEpOwogICAgICAgIG5leHQgQVBQT0lOVE1FTlREQVRBIGlmICEkQXBwb2ludG1lbnREYXRhLT57Q2FsZW5kYXJJRH07CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgISRBcHBvaW50bWVudERhdGEtPntBcHBvaW50bWVudElEfTsKCiAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gJFNlbGYtPkFwcG9pbnRtZW50R2V0KCAleyRBcHBvaW50bWVudERhdGF9ICk7CgogICAgICAgIHB1c2ggQFJlc3VsdHMsIFwlQXBwb2ludG1lbnQ7CiAgICB9CgogICAgcmV0dXJuIEBSZXN1bHRzOwp9Cgo9aXRlbSBBcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCkKCkRlbGV0ZSBhbGwgY2FsZW5kYXIgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgpyZXR1cm5zOgoKICAgIFRydWUgaWYgZnV0dXJlIHRhc2sgZGVsZXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYSBsb2NhbCBzY2hlZHVsZXIgZGIgb2JqZWN0CiAgICBteSAkU2NoZWR1bGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbHJlYWR5IHN0b3JlZCBmdXR1cmUgdGFza3MKICAgIG15IEBGdXR1cmVUYXNrTGlzdCA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyQXBwb2ludG1lbnQnLAogICAgKTsKCiAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoIFxARnV0dXJlVGFza0xpc3QgKSApIHsKCiAgICAgICAgRlVUVVJFVEFTSzoKICAgICAgICBmb3IgbXkgJEZ1dHVyZVRhc2sgKEBGdXR1cmVUYXNrTGlzdCkgewoKICAgICAgICAgICAgbmV4dCBGVVRVUkVUQVNLIGlmICEkRnV0dXJlVGFzazsKICAgICAgICAgICAgbmV4dCBGVVRVUkVUQVNLIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRnV0dXJlVGFzayk7CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2stPntUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZGVsZXRlIGZ1dHVyZSB0YXNrIHdpdGggaWQgJEZ1dHVyZVRhc2stPntUYXNrSUR9ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlKCkKClVwZGF0ZSBPVFJTIGRhZW1vbiBmdXR1cmUgdGFzayBsaXN0IGZvciB1cGNvbWluZyBhcHBvaW50bWVudHMuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCnJldHVybnM6CgogICAgVHJ1ZSBpZiBmdXR1cmUgdGFzayB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYXBwb2ludG1lbnQgZGF0YSBmb3IgdXBjb21pbmcgYXBwb2ludG1lbnRzCiAgICBteSBAVXBjb21pbmdBcHBvaW50bWVudHMgPSAkU2VsZi0+QXBwb2ludG1lbnRVcGNvbWluZ0dldCgpOwoKICAgICMgY2hlY2sgZm9yIG5vIHVwY29taW5nIGFwcG9pbnRtZW50cwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCBcQFVwY29taW5nQXBwb2ludG1lbnRzICkgKSB7CgogICAgICAgICMgZmx1c2ggb2Jzb2xldGUgZnV0dXJlIHRhc2tzCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBkZWxldGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IGEgbG9jYWwgc2NoZWR1bGVyIGRiIG9iamVjdAogICAgbXkgJFNjaGVkdWxlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTY2hlZHVsZXInKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxyZWFkeSBzdG9yZWQgZnV0dXJlIHRhc2tzCiAgICBteSBARnV0dXJlVGFza0xpc3QgPSAkU2NoZWR1bGVyT2JqZWN0LT5GdXR1cmVUYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdDYWxlbmRhckFwcG9pbnRtZW50JywKICAgICk7CgogICAgIyBjaGVjayBmb3IgaW52YWxpZCB0YXNrIGNvdW50IChqdXN0IG9uZSB0YXNrIG1heCBhbGxvd2VkKQogICAgaWYgKCBzY2FsYXIgQEZ1dHVyZVRhc2tMaXN0ID4gMSApIHsKCiAgICAgICAgIyBmbHVzaCBvYnNvbGV0ZSBmdXR1cmUgdGFza3MKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGl0IGlzIG5lZWRlZCB0byB1cGRhdGUgdGhlIGZ1dHVyZSB0YXNrIGxpc3QKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCBcQEZ1dHVyZVRhc2tMaXN0ICkgKSB7CgogICAgICAgICMgZ2V0IGEgbG9jYWwgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgICAgIG15ICRVcGRhdGVOZWVkZWQgPSAwOwoKICAgICAgICBGVVRVUkVUQVNLOgogICAgICAgIGZvciBteSAkRnV0dXJlVGFzayAoQEZ1dHVyZVRhc2tMaXN0KSB7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhSXNIYXNoUmVmV2l0aERhdGEoJEZ1dHVyZVRhc2spCiAgICAgICAgICAgICAgICB8fCAhJEZ1dHVyZVRhc2stPntUYXNrSUR9CiAgICAgICAgICAgICAgICB8fCAhJEZ1dHVyZVRhc2stPntFeGVjdXRpb25UaW1lfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVXBkYXRlTmVlZGVkID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgRlVUVVJFVEFTSzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIHN0b3JlZCBmdXR1cmUgdGFzawogICAgICAgICAgICBteSAlRnV0dXJlVGFza0RhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrR2V0KAogICAgICAgICAgICAgICAgVGFza0lEID0+ICRGdXR1cmVUYXNrLT57VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJUZ1dHVyZVRhc2tEYXRhICkgKSB7CiAgICAgICAgICAgICAgICAkVXBkYXRlTmVlZGVkID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgRlVUVVJFVEFTSzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdW5peCB0aW1lc3RhbXBzIG9mIHN0b3JlZCBhbmQgdXBjb21pbmcgdGltZXMgdG8gY29tcGFyZQogICAgICAgICAgICBteSAkRnV0dXJlVGFza1RpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57Tm90aWZ5VGltZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRVcGNvbWluZ0FwcG9pbnRtZW50VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG8gbm90aGluZyBpZiB0aGUgdXBjb21pbmcgbm90aWZpY2F0aW9uIHRpbWUgZXF1YWxzIHRoZSBzdG9yZWQgdmFsdWUKICAgICAgICAgICAgaWYgKCAkVXBjb21pbmdBcHBvaW50bWVudFRpbWUgIT0gJEZ1dHVyZVRhc2tUaW1lICkgewogICAgICAgICAgICAgICAgJFVwZGF0ZU5lZWRlZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEZVVFVSRVRBU0s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkVXBkYXRlTmVlZGVkKSB7CgogICAgICAgICAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBkZWxldGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzY2hlZHVsZSBuZXcgZnV0dXJlIHRhc2tzIGZvciBub3RpZmljYXRpb24gYWN0aW9ucwogICAgbXkgJFRhc2tJRCA9ICRTY2hlZHVsZXJPYmplY3QtPlRhc2tBZGQoCiAgICAgICAgRXhlY3V0aW9uVGltZSA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdBcHBvaW50bWVudE5vdGlmaWNhdGlvbicsCiAgICAgICAgVHlwZSAgICAgICAgICA9PiAnQ2FsZW5kYXJBcHBvaW50bWVudCcsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiB7CiAgICAgICAgICAgIE5vdGlmeVRpbWUgPT4gJFVwY29taW5nQXBwb2ludG1lbnRzWzBdLT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAhJFRhc2tJRCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzY2hlZHVsZSBmdXR1cmUgdGFzayBmb3IgQXBwb2ludG1lbnRJRCAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntBcHBvaW50bWVudElEfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlKCkKClByZXBhcmUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIGRhdGEuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPl9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoKTsKCnJldHVybnM6CgogICAgVHJ1ZSBpZiBwcmVwYXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIF9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZXNldCBub3RpZmljYXRpb24gZGF0YSBpZiBuZWVkZWQKICAgIGlmICggISRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSApIHsKCiAgICAgICAgZm9yIG15ICRQb3NzaWJsZVBhcmFtICgKICAgICAgICAgICAgcXcoCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgTm90aWZpY2F0aW9uVGVtcGxhdGUgTm90aWZpY2F0aW9uQ3VzdG9tIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19ID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBwb3NzaWJsZSBub3RpZmljYXRpb24gcGFyYW1zCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgIHF3KAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlIE5vdGlmaWNhdGlvbkN1c3RvbSBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17RGF0YX0tPnskUG9zc2libGVQYXJhbX0gfHw9ICcnOwogICAgfQoKICAgICMgc3BlY2lhbCBjaGVjayBmb3IgcmVsYXRpdmUgdW5pdCBjb3VudCBhcyBpdCBjYW4gYmUgemVybwogICAgIyAoZW1wdHkgYW5kIG5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgemVybyB0byBhdm9pZCBlcnJvcnMpCiAgICBpZiAoCiAgICAgICAgIUlzTnVtYmVyKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gKQogICAgICAgIHx8ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSA8PSAwCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSA9IDA7CiAgICB9CgogICAgIyBzZXQgZW1wdHkgZGF0ZXRpbWUgc3RyaW5ncyB0byB1bmRlZgogICAgZm9yIG15ICRQb3NzaWJsZVBhcmFtIChxdyhOb3RpZmljYXRpb25EYXRlIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lKSkgewogICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSB8fD0gdW5kZWY7CiAgICB9CgogICAgcmV0dXJuIGlmICEkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX07CgogICAgIyBnZXQgYSBsb2NhbCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMKICAgICMgdGVtcGxhdGUgU3RhcnQKICAgICMKICAgIGlmICggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9IGVxICdTdGFydCcgKSB7CgogICAgICAgICMgc2V0dXAgdGhlIGFwcG9pbnRtZW50IHN0YXJ0IGRhdGUgYXMgbm90aWZpY2F0aW9uIGRhdGUKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRQYXJhbXtEYXRhfS0+e1N0YXJ0VGltZX07CiAgICB9CgogICAgIwogICAgIyB0ZW1wbGF0ZSB0aW1lIGJlZm9yZSBzdGFydAogICAgIwogICAgZWxzaWYgKAogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSBuZSAnQ3VzdG9tJwogICAgICAgICYmIElzTnVtYmVyKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gKQogICAgICAgICYmICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSA+IDAKICAgICAgICApCiAgICB7CgogICAgICAgIHJldHVybiBpZiAhSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSApOwoKICAgICAgICAjIG9mZnNldCB0ZW1wbGF0ZSAoYmVmb3JlIHN0YXJ0IGRhdGV0aW1lKSB1c2VkCiAgICAgICAgbXkgJE9mZnNldCA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfTsKCiAgICAgICAgIyBnZXQgYSB1bml4IHRpbWVzdGFtcCBvZiBhcHBvaW50bWVudCBzdGFydCB0aW1lCiAgICAgICAgbXkgJFN0YXJ0TG9jYWxUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0RhdGF9LT57U3RhcnRUaW1lfSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgdGhlIHN0YXJ0IHRpbWUgLSBvZmZzZXQgYXMgbmV3IG5vdGlmaWNhdGlvbiBkYXRldGltZSBzdHJpbmcKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJFN0YXJ0TG9jYWxUaW1lIC0gJE9mZnNldCApLAogICAgICAgICk7CiAgICB9CgogICAgIwogICAgIyB0ZW1wbGF0ZSBDdXN0b20KICAgICMKICAgIGVsc2UgewoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gcmVsYXRpdmUgaW5wdXQuCiAgICAgICAgaWYgKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CgogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdENvdW50ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdCAgICAgID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fTsKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRQb2ludCA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9OwoKICAgICAgICAgICAgIyBzZXR1cCB0aGUgY291bnQgdG8gY29tcHV0ZSBmb3IgdGhlIG9mZnNldAogICAgICAgICAgICBteSAlVW5pdE9mZnNldENvbXB1dGUgPSAoCiAgICAgICAgICAgICAgICBtaW51dGVzID0+IDYwLAogICAgICAgICAgICAgICAgaG91cnMgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgZGF5cyAgICA9PiA4NjQwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25Mb2NhbFRpbWU7CgogICAgICAgICAgICAjIGNvbXB1dGUgZnJvbSBzdGFydCB0aW1lCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3Jlc3RhcnQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyc3RhcnQnICkgewoKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvbXB1dGUgZnJvbSBlbmQgdGltZQogICAgICAgICAgICBlbHNpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJlbmQnICkgewoKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBub3Qgc3VwcG9ydGVkIHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29tcHV0ZSB0aGUgb2Zmc2V0IHRvIGJlIHVzZWQKICAgICAgICAgICAgbXkgJE9mZnNldCA9ICggJEN1c3RvbVVuaXRDb3VudCAqICRVbml0T2Zmc2V0Q29tcHV0ZXskQ3VzdG9tVW5pdH0gKTsKCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbmV3bHkgY29tcHV0ZWQgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHN0cmluZwogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnICkgewogICAgICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJE5vdGlmaWNhdGlvbkxvY2FsVGltZSAtICRPZmZzZXQgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkTm90aWZpY2F0aW9uTG9jYWxUaW1lICsgJE9mZnNldCApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDb21wdXRlIGRhdGUgb2YgY3VzdG9tIGRhdGUvdGltZSBpbnB1dC4KICAgICAgICBlbHNpZiAoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gPSAnZGF0ZXRpbWUnOwoKICAgICAgICAgICAgIyB2YWxpZGF0aW9uCiAgICAgICAgICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgdGhlIGdpdmVuIGRhdGUgdGltZSB2YWx1ZXMgYXMgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHN0cmluZyAoaS5lLiAyMDE2LTA2LTI4IDAyOjAwOjAwKQogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gKSApIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9IHVuZGVmOwogICAgfQoKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSA9IHVuZGVmOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBcHBvaW50bWVudE5vdGlmaWNhdGlvbigpCgpXaWxsIGJlIHRyaWdnZXJlZCBieSB0aGUgT1RSUyBkYWVtb24gdG8gZmlyZSBldmVudHMgZm9yIGFwcG9pbnRtZW50cywKdGhhdCByZWFjaGVzIGl0J3MgcmVtaW5kZXIgKG5vdGlmaWNhdGlvbikgdGltZS4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnROb3RpZmljYXRpb24oKTsKCnJldHVybnM6CgogICAgVHJ1ZSBpZiBub3RpZnkgYWN0aW9uIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCgo9Y3V0CgpzdWIgQXBwb2ludG1lbnROb3RpZmljYXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KE5vdGlmeVRpbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnRzIGZvciB0aGUgcmVsYXRlZCBub3RpZmljYXRpb24gdGltZXN0YW1wCiAgICBteSBAVXBjb21pbmdBcHBvaW50bWVudHMgPSAkU2VsZi0+QXBwb2ludG1lbnRVcGNvbWluZ0dldCgKICAgICAgICBUaW1lc3RhbXAgPT4gJFBhcmFte05vdGlmeVRpbWV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggXEBVcGNvbWluZ0FwcG9pbnRtZW50cyApOwoKICAgICMgc2xlZXAgYXQgbGVhc3QgMSBzZWNvbmQgdG8gbWFrZSBzdXJlIHRoZSB0aW1lc3RhbXAgZG9lc24ndAogICAgIyBlcXVhbHMgdGhlIGxhc3Qgb25lIGZvciB1cGRhdGUgdXBjb21pbmcgZnV0dXJlIHRhc2tzCiAgICBzbGVlcCAxOwoKICAgIFVQQ09NSU5HQVBQT0lOVE1FTlQ6CiAgICBmb3IgbXkgJFVwY29taW5nQXBwb2ludG1lbnQgKEBVcGNvbWluZ0FwcG9pbnRtZW50cykgewoKICAgICAgICBuZXh0IFVQQ09NSU5HQVBQT0lOVE1FTlQgaWYgISRVcGNvbWluZ0FwcG9pbnRtZW50OwogICAgICAgIG5leHQgVVBDT01JTkdBUFBPSU5UTUVOVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFVwY29taW5nQXBwb2ludG1lbnQpOwogICAgICAgIG5leHQgVVBDT01JTkdBUFBPSU5UTUVOVCBpZiAhJFVwY29taW5nQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfTsKCiAgICAgICAgIyBmaXJlIGV2ZW50CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uJywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkVXBjb21pbmdBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYXJlbnRJRCBBcHBvaW50bWVudCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgKTsKICAgIG15ICRFbmRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICApOwoKICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZSA9IEB7ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRXhjbHVkZX0gLy8gW10gfTsKCiAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBncmVwIHsgZGVmaW5lZCAkXyB9IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAjIHJlc2V0IHRoZSBwYXJhbWV0ZXIgZm9yIG9jY3VycmVuY2VzCiAgICAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUV4Y2x1ZGV9ID0gdW5kZWY7CgogICAgbXkgJE9yaWdpbmFsU3RhcnRUaW1lID0gJFN0YXJ0VGltZVN5c3RlbTsKICAgIG15ICRPcmlnaW5hbEVuZFRpbWUgICA9ICRFbmRUaW1lU3lzdGVtOwogICAgbXkgJFN0ZXAgICAgICAgICAgICAgID0gMDsKCiAgICAjIHVudGlsIC4uLgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbFN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICk7CgogICAgICAgIFVOVElMX1RJTUU6CiAgICAgICAgd2hpbGUgKCAkU3RhcnRUaW1lU3lzdGVtIDw9ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW0gKSB7CiAgICAgICAgICAgICRTdGVwICs9ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBjYWxjdWxhdGUgcmVjdXJyaW5nIHRpbWVzCiAgICAgICAgICAgICRTdGFydFRpbWVTeXN0ZW0gPSAkU2VsZi0+X0NhbGN1bGF0ZVJlY3VycmVuY2VUaW1lKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnQgID0+ICRQYXJhbXtBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICBTdGVwICAgICAgICAgPT4gJFN0ZXAsCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJE9yaWdpbmFsU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgQ3VycmVudFRpbWUgID0+ICRTdGFydFRpbWVTeXN0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkRW5kVGltZVN5c3RlbSA9ICRTdGFydFRpbWVTeXN0ZW0gKyAkT3JpZ2luYWxFbmRUaW1lIC0gJE9yaWdpbmFsU3RhcnRUaW1lOwoKICAgICAgICAgICAgbGFzdCBVTlRJTF9USU1FIGlmICEkU3RhcnRUaW1lU3lzdGVtOwogICAgICAgICAgICBsYXN0IFVOVElMX1RJTUUgaWYgJFN0YXJ0VGltZVN5c3RlbSA+ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW07CgogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWVTeXN0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lU3lzdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWdmaXg6IE9uIHNvbWUgc3lzdGVtcyB3aXRoIG9sZGVyIHBlcmwgdmVyc2lvbiBzeXN0ZW0gbWlnaHQgY2FsY3VsYXRlIHRpbWV6b25lIGRpZmZlcmVuY2UKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBza2lwIGV4Y2x1ZGVkIGFwcG9pbnRtZW50cwogICAgICAgICAgICBuZXh0IFVOVElMX1RJTUUgaWYgZ3JlcCB7ICRTdGFydFRpbWUgZXEgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17QXBwb2ludG1lbnR9IH0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgRW5kVGltZSAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZm9yIC4uLiB0aW1lKHMpCiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9ICkgewoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgKCAxIC4uICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9IC0gMSApIHsKICAgICAgICAgICAgJFN0ZXAgKz0gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSByZWN1cnJpbmcgdGltZXMKICAgICAgICAgICAgJFN0YXJ0VGltZVN5c3RlbSA9ICRTZWxmLT5fQ2FsY3VsYXRlUmVjdXJyZW5jZVRpbWUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudCAgPT4gJFBhcmFte0FwcG9pbnRtZW50fSwKICAgICAgICAgICAgICAgIFN0ZXAgICAgICAgICA9PiAkU3RlcCwKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkT3JpZ2luYWxTdGFydFRpbWUsCiAgICAgICAgICAgICAgICBDdXJyZW50VGltZSAgPT4gJFN0YXJ0VGltZVN5c3RlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRFbmRUaW1lU3lzdGVtID0gJFN0YXJ0VGltZVN5c3RlbSArICRPcmlnaW5hbEVuZFRpbWUgLSAkT3JpZ2luYWxTdGFydFRpbWU7CgogICAgICAgICAgICBsYXN0IENPVU5UIGlmICEkU3RhcnRUaW1lU3lzdGVtOwoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lU3lzdGVtCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1Z2ZpeDogT24gc29tZSBzeXN0ZW1zIHdpdGggb2xkZXIgcGVybCB2ZXJzaW9uIHN5c3RlbSBtaWdodCBjYWxjdWxhdGUgdGltZXpvbmUgZGlmZmVyZW5jZQogICAgICAgICAgICAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVDaGVjaygKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgZXhjbHVkZWQgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIG5leHQgQ09VTlQgaWYgZ3JlcCB7ICRTdGFydFRpbWUgZXEgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17QXBwb2ludG1lbnR9IH0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgRW5kVGltZSAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYXJlbnRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSByZWN1cnJpbmcgYXBwb2ludG1lbnRzCiAgICBteSAkU1FMID0gJwogICAgICAgIERFTEVURSBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgV0hFUkUgcGFyZW50X2lkPT8KICAgICc7CgogICAgIyBkZWxldGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17UGFyZW50SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nRXhjbHVkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyZW50SUQgUmVjdXJyZW5jZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgbXkgJERCT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIHJlY3VyX2V4Y2x1ZGUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBXSEVSRSBpZD0/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtQYXJlbnRJRH0gXSwKICAgICk7CgogICAgIyBnZXQgZXhpc3RpbmcgZXhjbHVzaW9ucwogICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgQFJlY3VycmVuY2VFeGNsdWRlID0gc3BsaXQoICcsJywgJFJvd1swXSApIGlmICRSb3dbMF07CiAgICB9CiAgICBwdXNoIEBSZWN1cnJlbmNlRXhjbHVkZSwgJFBhcmFte1JlY3VycmVuY2VJRH07CiAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBzb3J0IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAjIGpvaW4gaW50byBzdHJpbmcKICAgIG15ICRSZWN1cnJlbmNlRXhjbHVkZTsKICAgIGlmIChAUmVjdXJyZW5jZUV4Y2x1ZGUpIHsKICAgICAgICAkUmVjdXJyZW5jZUV4Y2x1ZGUgPSBqb2luKCAnLCcsIEBSZWN1cnJlbmNlRXhjbHVkZSApOwogICAgfQoKICAgICMgdXBkYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ1VQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudCBTRVQgcmVjdXJfZXhjbHVkZT0/IFdIRVJFIGlkPT8nLAogICAgICAgIEJpbmQgPT4gWyBcJFJlY3VycmVuY2VFeGNsdWRlLCBcJFBhcmFte1BhcmVudElEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcHBvaW50bWVudEdldENhbGVuZGFySUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNxbCBxdWVyeQogICAgbXkgJFNRTCAgPSAnU0VMRUNUIGNhbGVuZGFyX2lkIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQ9Pyc7CiAgICBteSBAQmluZCA9ICggXCRQYXJhbXtBcHBvaW50bWVudElEfSApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBzdGFydCBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJENhbGVuZGFySUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ2FsZW5kYXJJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRDYWxlbmRhcklEOwp9CgpzdWIgX0FwcG9pbnRtZW50R2V0UmVjdXJyZW5jZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzcWwgcXVlcnkKICAgIG15ICRTUUwgID0gJ1NFTEVDVCByZWN1cl9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IFdIRVJFIGlkPT8nOwogICAgbXkgQEJpbmQgPSAoIFwkUGFyYW17QXBwb2ludG1lbnRJRH0gKTsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgc3RhcnQgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRSZWN1cnJlbmNlSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUmVjdXJyZW5jZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJFJlY3VycmVuY2VJRDsKfQoKc3ViIF9DYWxjdWxhdGVSZWN1cnJlbmNlVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnQgU3RlcCBPcmlnaW5hbFRpbWUgQ3VycmVudFRpbWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgIG15ICRTeXN0ZW1UaW1lID0gJFBhcmFte0N1cnJlbnRUaW1lfTsKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0RhaWx5JyApIHsKCiAgICAgICAgIyBhZGQgb25lIGRheQogICAgICAgICRTeXN0ZW1UaW1lICs9IDYwICogNjAgKiAyNDsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnV2Vla2x5JyApIHsKCiAgICAgICAgIyBhZGQgNyBkYXlzCiAgICAgICAgJFN5c3RlbVRpbWUgKz0gNjAgKiA2MCAqIDI0ICogNzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnTW9udGhseScgKSB7CgogICAgICAgICMgYWRkIG9uZSBtb250aAogICAgICAgICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgIFRpbWUgICA9PiAkUGFyYW17T3JpZ2luYWxUaW1lfSwKICAgICAgICAgICAgTW9udGhzID0+ICRQYXJhbXtTdGVwfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdZZWFybHknICkgewoKICAgICAgICAjIGFkZCBvbmUgeWVhcgogICAgICAgICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgIFRpbWUgID0+ICRQYXJhbXtPcmlnaW5hbFRpbWV9LAogICAgICAgICAgICBZZWFycyA9PiAkUGFyYW17U3RlcH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tRGFpbHknICkgewogICAgICAgICRTeXN0ZW1UaW1lICs9ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9ICogNjAgKiA2MCAqIDI0OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21XZWVrbHknICkgewoKICAgICAgICAjIHRoaXMgYmxvY2sgY292ZXJzIGZvbGxvd2luZyB1c2UgY2FzZToKICAgICAgICAjIGVhY2ggbi10aCBNb25kYXkgYW5kIEZyaWRheQoKICAgICAgICBteSAkRm91bmQ7CgogICAgICAgIG15ICggJE9yaWdpbmFsV2Vla0RheSwgJE9yaWdpbmFsQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsb29wIHVwIHRvIDcqbiB0aW1lcyAoNyBkYXlzIGluIHdlZWsgKiBmcmVxdWVuY3kpCiAgICAgICAgTE9PUDoKICAgICAgICBmb3IgKCBteSAkQ291bnRlciA9IDA7ICRDb3VudGVyIDwgNyAqICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OyAkQ291bnRlcisrICkgewoKICAgICAgICAgICAgIyBBZGQgMSBkYXkKICAgICAgICAgICAgJFN5c3RlbVRpbWUgKz0gNjAgKiA2MCAqIDI0OwoKICAgICAgICAgICAgbXkgKCAkV2Vla0RheSwgJENXICk7CgogICAgICAgICAgICBteSAlRGlmZlBhcmFtZXRlcnMgPSAoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lICAgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJENXRGlmZiA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q1dEaWZmKAogICAgICAgICAgICAgICAgJURpZmZQYXJhbWV0ZXJzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBMT09QIGlmICRDV0RpZmYgJSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgU3lzdGVtVGltZSBtYXRjaCByZXF1aXJlbWVudHMKICAgICAgICAgICAgaWYgKCBncmVwIHsgJFdlZWtEYXkgPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfSApIHsKICAgICAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IExPT1A7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpZiAhJEZvdW5kOwogICAgfQoKICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScgKSB7CgogICAgICAgICMgT2NjdXJzIGV2ZXJ5IDJuZCBtb250aCBvbiA1dGgsIDEwdGggYW5kIDE1dGggZGF5CiAgICAgICAgbXkgJEZvdW5kOwoKICAgICAgICBteSAoICRPcmlnaW5hbFNlYywgJE9yaWdpbmFsTWluLCAkT3JpZ2luYWxIb3VyLCAkT3JpZ2luYWxEYXksICRPcmlnaW5hbE1vbnRoLCAkT3JpZ2luYWxZZWFyLCAkT3JpZ2luYWxXZWVrRGF5ICkKICAgICAgICAgICAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICMgbG9vcCB0aHJvdWdoIGVhY2ggZGF5IChtYXggb25lIHllYXIpLCBhbmQgY2hlY2sgaWYgZGF5IG1hdGNoZXMuCiAgICAgICAgREFZOgogICAgICAgIGZvciAoIG15ICRDb3VudGVyID0gMDsgJENvdW50ZXIgPCAzMSAqIDM2NjsgJENvdW50ZXIrKyApIHsKCiAgICAgICAgICAgICMgQWRkIG9uZSBkYXkKICAgICAgICAgICAgJFN5c3RlbVRpbWUgKz0gMjQgKiA2MCAqIDYwOwoKICAgICAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJFdlZWtEYXkgKTsKCiAgICAgICAgICAgICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICRXZWVrRGF5ICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTa2lwIG1vbnRoIGlmIG5lZWRlZAogICAgICAgICAgICBuZXh0IERBWSBpZiAoICRNb250aCAtICRPcmlnaW5hbE1vbnRoICkgJSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgbmV4dCBkYXkgaWYgdGhpcyBkYXkgc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgICAgbmV4dCBEQVkgaWYgIWdyZXAgeyAkRGF5ID09ICRfIH0gQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VGcmVxdWVuY3l9IH07CgogICAgICAgICAgICAkRm91bmQgPSAxOwogICAgICAgICAgICBsYXN0IERBWTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlmICEkRm91bmQ7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScgKSB7CgogICAgICAgICMgdGhpcyBibG9jayBjb3ZlcnMgZm9sbG93aW5nIHVzZSBjYXNlOgogICAgICAgICMgT2NjdXJzIGVhY2ggM3RoIHllYXIsIEphbnVhcnkgMTh0aCBhbmQgTWFyY2ggMTh0aAogICAgICAgIG15ICRGb3VuZDsKCiAgICAgICAgbXkgKCAkT3JpZ2luYWxTZWMsICRPcmlnaW5hbE1pbiwgJE9yaWdpbmFsSG91ciwgJE9yaWdpbmFsRGF5LCAkT3JpZ2luYWxNb250aCwgJE9yaWdpbmFsWWVhciwgJE9yaWdpbmFsV2Vla0RheSApCiAgICAgICAgICAgID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRQYXJhbXtPcmlnaW5hbFRpbWV9LAogICAgICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsU3lzdGVtOwogICAgICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgICRSZWN1cnJlbmNlVW50aWxTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBNT05USDoKICAgICAgICBmb3IgKCBteSAkQ291bnRlciA9IDE7OyAkQ291bnRlcisrICkgewoKICAgICAgICAgICAgIyBBZGQgb25lIG1vbnRoCiAgICAgICAgICAgICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgICAgICBUaW1lICAgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgICAgICAgICBNb250aHMgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgdGhpcyB0aW1lLCBzaW5jZSBpdCB3YXMgYWxyZWFkeSBjaGVja2VkCiAgICAgICAgICAgIG5leHQgTU9OVEggaWYgJFN5c3RlbVRpbWUgPCAkUGFyYW17Q3VycmVudFRpbWV9ICsgMjQgKiA2MCAqIDYwOwoKICAgICAgICAgICAgIyBjaGVjayBsb29wIGNvbmRpdGlvbnMgKGFjY29yZGluZyB0byBVbnRpbCAvICkKICAgICAgICAgICAgaWYgKCRSZWN1cnJlbmNlVW50aWxTeXN0ZW0pIHsKICAgICAgICAgICAgICAgIGxhc3QgTU9OVEggaWYgJFN5c3RlbVRpbWUgPiAkUmVjdXJyZW5jZVVudGlsU3lzdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGFzdCBNT05USAogICAgICAgICAgICAgICAgICAgIGlmICRDb3VudGVyCiAgICAgICAgICAgICAgICAgICAgPiAxMiAqICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9ICogJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VDb3VudH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICRXZWVrRGF5ICk7CgogICAgICAgICAgICAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkV2Vla0RheSApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgeWVhciBpcyBPSwogICAgICAgICAgICBuZXh0IE1PTlRIIGlmICggJFllYXIgLSAkT3JpZ2luYWxZZWFyICkgJSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgbmV4dCBtb250aCBpZiB0aGlzIG1vbnRoIHNob3VsZCBiZSBza2lwcGVkCiAgICAgICAgICAgIG5leHQgTU9OVEggaWYgIWdyZXAgeyAkTW9udGggPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgIGxhc3QgTU9OVEg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZiAhJEZvdW5kOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkU3lzdGVtVGltZTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OlRpbWUpCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIERhdGVUaW1lOwp1c2UgVGltZTo6UGllY2U7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXIgLSBjYWxlbmRhciBoZWxwZXIgbWV0aG9kcwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgaGVscGVyIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFRpbWVDaGVjaygpCgpjaGVjayBpZiBUaW1lIGFuZCBPcmlnaW5hbFRpbWUgaGF2ZSBzYW1lIGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kIHZhbHVlLCBhbmQgcmV0dXJuIHRpbWVzdGFtcCB3aXRoIHZhbHVlcyAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGFzIGluIFRpbWUuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgIE9yaWdpbmFsVGltZSAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAyLTAxIDAwOjAyOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMjAxNi0wMi0wMSAwMDowMTowMCc7Cj1jdXQKCnN1YiBUaW1lQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KE9yaWdpbmFsVGltZSBUaW1lKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFJlc3VsdCA9ICcnOwoKICAgICRQYXJhbXtPcmlnaW5hbFRpbWV9ID1+IC8oLio/KVxzKC4qPykkLzsKICAgIG15ICRPcmlnaW5hbERhdGUgPSAkMTsKICAgIG15ICRPcmlnaW5hbFRpbWUgPSAkMjsKCiAgICAkUGFyYW17VGltZX0gPX4gLyguKj8pXHMoLio/KSQvOwogICAgbXkgJERhdGUgPSAkMTsKCiAgICAkUmVzdWx0ID0gIiREYXRlICRPcmlnaW5hbFRpbWUiOwogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1pdGVtIFN5c3RlbVRpbWVHZXQoKQoKcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbi1sZWFwIHNlY29uZHMgc2luY2Ugd2hhdCBldmVyIHRpbWUgdGhlIHN5c3RlbSBjb25zaWRlcnMgdG8gYmUgdGhlIGVwb2NoCih0aGF0J3MgMDA6MDA6MDAsIEphbnVhcnkgMSwgMTkwNCBmb3IgTWFjIE9TLCBhbmQgMDA6MDA6MDAgVVRDLCBKYW51YXJ5IDEsIDE5NzAgZm9yIG1vc3Qgb3RoZXIgc3lzdGVtcykuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMTQ1MTYwNjQ2MCc7Cj1jdXQKCnN1YiBTeXN0ZW1UaW1lR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyggU3RyaW5nICkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHN5c3RlbSB0aW1lCiAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RyaW5nfSwKICAgICk7CgogICAgcmV0dXJuICRTeXN0ZW1UaW1lOwp9Cgo9aXRlbSBUaW1lc3RhbXBHZXQoKQoKcmV0dXJucyBhIHRpbWUgc3RhbXAgZm9yIGEgZ2l2ZW4gc3lzdGVtIHRpbWUgaW4gInl5eXktbW0tZGQgMjM6NTk6NTkiIGZvcm1hdC4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgU3lzdGVtVGltZSAgICAgPT4gJzE0NTE2MDY0NjAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9ICcyMDE2LTAxLTAxIDAwOjAxOjAwJzsKPWN1dAoKc3ViIFRpbWVzdGFtcEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIFN5c3RlbVRpbWUgKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGltZXN0YW1wCiAgICBteSAkVGltZXN0YW1wID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkUGFyYW17U3lzdGVtVGltZX0sCiAgICApOwoKICAgIHJldHVybiAkVGltZXN0YW1wOwp9Cgo9aXRlbSBDdXJyZW50VGltZXN0YW1wR2V0KCkKCnJldHVybnMgYSBjdXJyZW50IHRpbWUgc3RhbXAgZm9yIGEgZ2l2ZW4gc3lzdGVtIHRpbWUgaW4gInl5eXktbW0tZGQgMjM6NTk6NTkiIGZvcm1hdC4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50VGltZXN0YW1wR2V0KCk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9ICcyMDE2LTAxLTAxIDAwOjAxOjAwJzsKPWN1dAoKc3ViIEN1cnJlbnRUaW1lc3RhbXBHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjdXJyZW50IHRpbWVzdGFtcAogICAgbXkgJEN1cnJlbnRUaW1lc3RhbXAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5DdXJyZW50VGltZXN0YW1wKCk7CgogICAgcmV0dXJuICRDdXJyZW50VGltZXN0YW1wOwp9Cgo9aXRlbSBDdXJyZW50U3lzdGVtVGltZSgpCgpyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uLWxlYXAgc2Vjb25kcyBzaW5jZSB3aGF0IGV2ZXIgdGltZSB0aGUgc3lzdGVtIGNvbnNpZGVycyB0byBiZSB0aGUgZXBvY2ggdW50aWxsIG5vdy4KKHRoYXQncyAwMDowMDowMCwgSmFudWFyeSAxLCAxOTA0IGZvciBNYWMgT1MsIGFuZCAwMDowMDowMCBVVEMsIEphbnVhcnkgMSwgMTk3MCBmb3IgbW9zdCBvdGhlciBzeXN0ZW1zKS4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMTQ2Mjg3MTE2Mic7Cj1jdXQKCnN1YiBDdXJyZW50U3lzdGVtVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIHRpbWUKICAgIG15ICRDdXJyZW50U3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlN5c3RlbVRpbWUoKTsKCiAgICByZXR1cm4gJEN1cnJlbnRTeXN0ZW1UaW1lOwp9Cgo9aXRlbSBEYXRlR2V0KCkKCnJldHVybnMgZGF0ZS90aW1lIGluZm9ybWF0aW9uIGluIGEgaGFzaCBmb3IgZ2l2ZW4gdW5peCB0aW1lLgoKICAgIG15ICgkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlaykgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ2Mjg3MTE2MicsCiAgICApOwoKcmV0dXJuczoKICAgICRTZWNvbmQgICAgPSAnMCc7CiAgICAkTWludXRlICAgID0gJzAnOwogICAgJEhvdXIgICAgICA9ICcxJzsKICAgICREYXkgICAgICAgPSAnMSc7CiAgICAkTW9udGggICAgID0gJzEnOwogICAgJFllYXIgICAgICA9ICcyMDE2JzsKICAgICREYXlPZldlZWsgPSAnMic7ICAgIyAxLW1vbmRheSwuLi4sIDctc3VuZGF5Cgo9Y3V0CgpzdWIgRGF0ZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIFN5c3RlbVRpbWUgKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkUGFyYW17U3lzdGVtVGltZX0sCiAgICAgICAgKTsKICAgICRTZWNvbmQgICAgPSBpbnQgJFNlY29uZDsKICAgICRNaW51dGUgICAgPSBpbnQgJE1pbnV0ZTsKICAgICRIb3VyICAgICAgPSBpbnQgJEhvdXI7CiAgICAkRGF5ICAgICAgID0gaW50ICREYXk7CiAgICAkTW9udGggICAgID0gaW50ICRNb250aDsKICAgICRZZWFyICAgICAgPSBpbnQgJFllYXI7CiAgICAkRGF5T2ZXZWVrID0gaW50ICREYXlPZldlZWs7CgogICAgIyBLZXJuZWw6OlN5c3RlbTo6VGltZSBvYmplY3QgcmV0dXJucyAwIGZvciBTdW5kYXkgLSB3ZSBuZWVkIHRvIGNoYW5nZSB0aGlzIHRvIDcgKGxpa2Ugb24gb3RoZXIgcGxhY2VzKQogICAgaWYgKCAhJERheU9mV2VlayApIHsKICAgICAgICAkRGF5T2ZXZWVrID0gNzsKICAgIH0KCiAgICByZXR1cm4gKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApOwp9Cgo9aXRlbSBEYXRlMlN5c3RlbVRpbWUoKQoKcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbi1sZWFwIHNlY29uZHMgc2luY2Ugd2hhdCBldmVyIHRpbWUgdGhlIHN5c3RlbSBjb25zaWRlcnMgdG8gYmUgdGhlIGVwb2NoIGZvciBnaXZlbiBwYXJhbWV0ZXJzLgoodGhhdCdzIDAwOjAwOjAwLCBKYW51YXJ5IDEsIDE5MDQgZm9yIE1hYyBPUywgYW5kIDAwOjAwOjAwIFVUQywgSmFudWFyeSAxLCAxOTcwIGZvciBtb3N0IG90aGVyIHN5c3RlbXMpLgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICBZZWFyICAgICAgPT4gJzIwMTYnLAogICAgICAgIE1vbnRoICAgICA9PiAnMScsCiAgICAgICAgRGF5ICAgICAgID0+ICcxJywKICAgICAgICBIb3VyICAgICAgPT4gJzEnLAogICAgICAgIE1pbnV0ZSAgICA9PiAnMCcsCiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMTQ1MTYxMDAwMCc7Cj1jdXQKCnN1YiBEYXRlMlN5c3RlbVRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KCBZZWFyIE1vbnRoIERheSApKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICRQYXJhbXtIb3VyfSAgIC8vPSAwOwogICAgJFBhcmFte01pbnV0ZX0gLy89IDA7CiAgICAkUGFyYW17U2Vjb25kfSAvLz0gMDsKCiAgICAjIGdldCBzeXN0ZW0gdGltZQogICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5EYXRlMlN5c3RlbVRpbWUoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJFN5c3RlbVRpbWU7Cn0KCj1pdGVtIEFkZFBlcmlvZCgpCgphZGRzIHRpbWUgcGVyaW9kICh5ZWFycyBhbmQgbW9udGhzKSB0byB0aGUgdGltZSBnaXZlbiBpbiBVbml4IGZvcm1hdC4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgVGltZSAgICAgICA9PiAnMTQ2Mjg3MTE2MicsICAgICAjIChyZXF1aXJlZCkgdGltZSBpbiBVbml4IGZvcm1hdAogICAgICAgIFllYXJzICAgICAgPT4gJzEnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHllYXJzIHRvIGFkZAogICAgICAgIE1vbnRocyAgICAgPT4gJzEnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1vbnRocyB0byBhZGQKICAgICk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9ICcxNDk3MDg1NTYyJzsKPWN1dAoKc3ViIEFkZFBlcmlvZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGltZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtNb250aHN9IC8vPSAwOwogICAgJFBhcmFte1llYXJzfSAgLy89IDA7CgogICAgbXkgJFRpbWVQaWVjZSA9IGxvY2FsdGltZSggJFBhcmFte1RpbWV9ICk7CiAgICBteSAkU3RhcnREYXkgID0gJFRpbWVQaWVjZS0+ZGF5X29mX21vbnRoKCk7CgogICAgbXkgJE5leHRUaW1lUGllY2UgPSAkVGltZVBpZWNlLT5hZGRfbW9udGhzKCAkUGFyYW17TW9udGhzfSApOwogICAgJE5leHRUaW1lUGllY2UgPSAkTmV4dFRpbWVQaWVjZS0+YWRkX3llYXJzKCAkUGFyYW17WWVhcnN9ICk7CiAgICBteSAkRW5kRGF5ID0gJE5leHRUaW1lUGllY2UtPmRheV9vZl9tb250aCgpOwoKICAgICMgY2hlY2sgaWYgbW9udGggZG9lc24ndCBoYXZlIGVub3VnaCBkYXlzIChmb3IgZXhhbXBsZTogSmFudWFyeSAzMSArIDEgbW9udGggPSBNYXJjaCAwMSkKICAgIGlmICggJFN0YXJ0RGF5ICE9ICRFbmREYXkgKSB7CgogICAgICAgICMgU3VidHJhY3QgbmVlZGVkIGRheXMKICAgICAgICBteSAkRGF5cyA9ICROZXh0VGltZVBpZWNlLT5kYXlfb2ZfbW9udGgoKTsKICAgICAgICAkTmV4dFRpbWVQaWVjZSAtPSAkRGF5cyAqIDI0ICogNjAgKiA2MDsKICAgIH0KCiAgICByZXR1cm4gJE5leHRUaW1lUGllY2UtPmVwb2NoKCk7Cn0KCj1pdGVtIFRpbWV6b25lT2Zmc2V0R2V0KCkKCnJldHVybnMgb2Zmc2V0IG9mIHNwZWNpZmllZCB0aW1lIHpvbmUgb3IgdXNlcidzIHRpbWUgem9uZS4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lem9uZU9mZnNldEdldCgKICAgICAgICBVc2VySUQgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yCiAgICAgICAgVGltZXpvbmVJRCAgPT4gJ0V1cm9wZS9CZXJsaW4nICAgICAgIyAob3B0aW9uYWwpIFRpbWV6b25lIG5hbWUKICAgICAgICBUaW1lICAgICAgICA9PiAnMTQ2Mjg3MTE2MicsICAgICAgICAjIChvcHRpb25hbCkgVGltZSBpbiBVbml4IGZvcm1hdCB5b3Ugd2FudCBvZmZzZXQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIG90aGVyd2lzZSwgY3VycmVudCB0aW1lIHdpbGwgYmUgdXNlZAogICAgKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gMjsKCj1jdXQKCnN1YiBUaW1lem9uZU9mZnNldEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICYmICEkUGFyYW17VGltZXpvbmVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCBvciBUaW1lem9uZUlEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17VXNlcklEfSApIHsKICAgICAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRVc2Vye1VzZXJUaW1lWm9uZX0gPyBpbnQgJFVzZXJ7VXNlclRpbWVab25lfSA6IDA7CiAgICB9CgogICAgIyBPZmZzZXQgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiBzcGVjaWZpYyB0aW1lLCBiZWNhdXNlIG9mIGRheWxpZ2h0IHNhdmluZ3MuCiAgICAjICAgSWYgbm90IHN1cHBsaWVkLCB1c2UgY3VycmVudCB0aW1lLgogICAgbXkgJERhdGVUaW1lID0gZXZhbCB7IERhdGVUaW1lLT5mcm9tX2Vwb2NoKCBlcG9jaCA9PiAkUGFyYW17VGltZX0gPyAkUGFyYW17VGltZX0gOiB0aW1lKCkgKSB9OwogICAgcmV0dXJuIDAgaWYgISREYXRlVGltZTsKCiAgICAjIERhdGVUaW1lOjpUaW1lWm9uZSBtaWdodCBub3QgcmVjb2duaXplIHRpbWV6b25lIGJ5IGl0cyBuYW1lIGFuZCBkaWUsCiAgICAjICAgbWFrZSB0aGUgY2FsbCBpbiBhbiBldmFsIGJsb2NrLgogICAgbXkgJFRpbWV6b25lID0gZXZhbCB7IERhdGVUaW1lOjpUaW1lWm9uZS0+bmV3KCBuYW1lID0+ICRQYXJhbXtUaW1lem9uZUlEfSApIH07CgogICAgaWYgKCRUaW1lem9uZSkgewogICAgICAgIHJldHVybiAkVGltZXpvbmUtPm9mZnNldF9mb3JfZGF0ZXRpbWUoJERhdGVUaW1lKSAvIDM2MDAuMDA7ICAgICMgaW4gaG91cnMKICAgIH0KCiAgICAjIExhc3QgcmVzb3J0IGRldGVjdGlvbiBvZiB0aW1lem9uZSBvZmZzZXQgZnJvbSB0aGUgc3VwcGxpZWQgVGltZXpvbmVJRCwKICAgICMgICBpLmUuIChVVEMrMDE6MDApIEJlbGdyw6FkLCBCdWRhcGVzdCwgTGp1YmxqYW5hLCBQb3pzb255LCBQcsOhZ2EKICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMjQ4NSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgIGlmICggJFBhcmFte1RpbWV6b25lSUR9ID1+IC8oWystXT8pKFswLTldKyk6KFswLTldKykvICkgewogICAgICAgIG15ICRTaWduICA9IGludCAiJHsxfTEiOwogICAgICAgIG15ICRIb3VycyA9ICQyICsgJDMgLyA2MC4wMDsKICAgICAgICByZXR1cm4gJFNpZ24gKiAkSG91cnM7CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGZpbmQgb2Zmc2V0IGZvciAnJFBhcmFte1RpbWV6b25lSUR9JywgYXNzdW1pbmcgVVRDISIsCiAgICApOwoKICAgIHJldHVybiAwOwp9Cgo9aXRlbSBMb2NhbFRpbWV6b25lT2Zmc2V0R2V0KCkKCnJldHVybnMgb2Zmc2V0IG9mIGxvY2FsIHRpbWUgem9uZSBmb3IgYSBzcGVjaWZpZWQgVVRDIHN5c3RlbSB0aW1lLgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkxvY2FsVGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgVGltZSA9PiAnMTQ2Mjg3MTE2MicsICAgICAjIChyZXF1aXJlZCkgdGltZSBpbiBVbml4IGZvcm1hdAogICAgKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gMjsKCj1jdXQKCnN1YiBMb2NhbFRpbWV6b25lT2Zmc2V0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1RpbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFRpbWUgICA9IGxvY2FsdGltZSggJFBhcmFte1RpbWV9ICk7CiAgICBteSAkT2Zmc2V0ID0gJFRpbWUtPnR6b2Zmc2V0KCkgLyAzNjAwLjAwOyAgICAjIGluIGhvdXJzCgogICAgcmV0dXJuICRPZmZzZXQ7Cn0KCj1pdGVtIFdlZWtEZXRhaWxzR2V0KCkKCmdldCB3ZWVrIGRldGFpbHMgZm9yIGEgZ2l2ZW4gdW5peCB0aW1lLgoKICAgIG15ICgkV2Vla0RheSwgJENXKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ2Mjg4MDc3OCcsCiAgICApOwoKcmV0dXJuczoKICAgICRXZWVrRGF5ID0gNDsgIyA3LXN1biwgMS1tb24KICAgICRDVyA9IDE5Owo9Y3V0CgpzdWIgV2Vla0RldGFpbHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIFN5c3RlbVRpbWUgKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgVGltZTo6UGllY2Ugb2JqZWN0CiAgICBteSAkVGltZSA9IGxvY2FsdGltZSggJFBhcmFte1N5c3RlbVRpbWV9ICk7CgogICAgIyBUaW1lOjpQaWVjZSBvYmplY3QgcmV0dXJucyAwIGZvciBTdW5kYXkgLSB3ZSBuZWVkIHRvIGNoYW5nZSB0aGlzIHRvIDcgKGxpa2Ugb24gb3RoZXIgcGxhY2VzKQogICAgbXkgJERheU9mV2VlayA9ICRUaW1lLT5kYXlfb2Zfd2VlaygpOwogICAgaWYgKCAhJERheU9mV2VlayApIHsKICAgICAgICAkRGF5T2ZXZWVrID0gNzsKICAgIH0KCiAgICByZXR1cm4gKCAkRGF5T2ZXZWVrLCAkVGltZS0+d2VlaygpICk7Cn0KCj1pdGVtIENXRGlmZigpCgpyZXR1cm5zIGhvdyBtYW55IGNhbGVuZGFyIHdlZWtzIGhhcyBiZWVuIHBhc3NlZCBiZXR3ZWVuIHR3byB1bml4IHRpbWVzLgoKICAgIG15ICRDV0RpZmYgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkNXRGlmZigKICAgICAgICBTeXN0ZW1UaW1lICAgPT4gJzE0NjI4ODA3NzgnLAogICAgICAgIE9yaWdpbmFsVGltZSA9PiAnMTQ2Mjk4MDc3OCcsCiAgICApOwoKcmV0dXJuczoKICAgICRDV0RpZmYgPSA1Owo9Y3V0CgpzdWIgQ1dEaWZmIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KCBTeXN0ZW1UaW1lIE9yaWdpbmFsVGltZSApKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3RhcnRUaW1lID0gbG9jYWx0aW1lKCAkUGFyYW17T3JpZ2luYWxUaW1lfSApOwogICAgbXkgJEVuZFRpbWUgICA9IGxvY2FsdGltZSggJFBhcmFte1N5c3RlbVRpbWV9ICk7CgogICAgbXkgJFN0YXJ0WWVhciA9ICRTdGFydFRpbWUtPnllYXIoKTsKICAgIG15ICRFbmRZZWFyICAgPSAkRW5kVGltZS0+eWVhcigpOwoKICAgIG15ICRSZXN1bHQgPSAkRW5kVGltZS0+d2VlaygpIC0gJFN0YXJ0VGltZS0+d2VlaygpOwogICAgaWYgKCAkUmVzdWx0IDwgMCAmJiAkRW5kVGltZS0+bWRheSgpID09IDMxICYmICRFbmRUaW1lLT5tb24oKSA9PSAxMiApIHsKCiAgICAgICAgIyBJZiBkYXRlIGlzIGVuZCBvZiB0aGUgeWVhciBhbmQgZGF0ZSBDVyBzdGFydHMgd2l0aCAxLCB3ZSBuZWVkIHRvIGluY2x1ZGUgYWRkaXRpb25hbCB5ZWFyLgogICAgICAgICRFbmRZZWFyKys7CiAgICB9CgogICAgZm9yIG15ICRZZWFyICggJFN0YXJ0WWVhciAuLiAkRW5kWWVhciAtIDEgKSB7CgogICAgICAgIG15ICRDVyAgPSAwOwogICAgICAgIG15ICREYXkgPSAzMTsKCiAgICAgICAgd2hpbGUgKCAkQ1cgPCA1MCApIHsKCiAgICAgICAgICAgICMgVG8gZ2V0IGhvdyBtYW55IENXJ3MgYXJlIGluIHRoaXMgeWVhciwgd2Ugc2V0IHRlbXBvcmFyeSBkYXRlIHRvIDMxLWRlYy4KICAgICAgICAgICAgbXkgJFRpbWVzdGFtcCAgPSAiJFllYXItMTItJERheSAyMzo1OTowMCI7CiAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFRpbWVzdGFtcCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRUaW1lID0gbG9jYWx0aW1lKCRTeXN0ZW1UaW1lKTsKCiAgICAgICAgICAgICRDVyA9ICRUaW1lLT53ZWVrKCk7CiAgICAgICAgICAgICREYXktLTsKICAgICAgICB9CgogICAgICAgICRSZXN1bHQgKz0gJENXOwoKICAgIH0KCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4gLSBQbHVnaW4gbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFic3RyYWN0aW9uIGxheWVyIGZvciBhcHBvaW50bWVudCBwbHVnaW5zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgcmVnaXN0ZXJlZCBwbHVnaW4gbW9kdWxlcwogICAgbXkgJFBsdWdpbkNvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiQXBwb2ludG1lbnRDYWxlbmRhcjo6UGx1Z2luIik7CgogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgbG9hZCBwbHVnaW4gbW9kdWxlcwogICAgUExVR0lOOgogICAgZm9yIG15ICRQbHVnaW5LZXkgKCBzb3J0IGtleXMgJXskUGx1Z2luQ29uZmlnfSApIHsKCiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAkUGx1Z2luQ29uZmlnLT57JFBsdWdpbktleX0tPntNb2R1bGV9OwogICAgICAgIG5leHQgUExVR0lOIGlmICEkR2VuZXJpY01vZHVsZTsKCiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAkTWFpbk9iamVjdC0+RGllKCJDYW4ndCBsb2FkIHBsdWdpbiBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1BsdWdpbnN9LT57JFBsdWdpbktleX0tPntQbHVnaW5OYW1lfSAgID0gJFBsdWdpbkNvbmZpZy0+eyRQbHVnaW5LZXl9LT57TmFtZX0gLy8gJEdlbmVyaWNNb2R1bGU7CiAgICAgICAgJFNlbGYtPntQbHVnaW5zfS0+eyRQbHVnaW5LZXl9LT57UGx1Z2luTW9kdWxlfSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgIG15ICRQbHVnaW5VUkwgPSAkUGx1Z2luQ29uZmlnLT57JFBsdWdpbktleX0tPntVUkx9OwogICAgICAgICRQbHVnaW5VUkwgPX4gc3s8T1RSU19DT05GSUdfKC4rPyk+fXskS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJDEpfWVneDsKICAgICAgICAkU2VsZi0+e1BsdWdpbnN9LT57JFBsdWdpbktleX0tPntQbHVnaW5VUkx9ID0gJFBsdWdpblVSTDsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFBsdWdpbkxpc3QoKQoKcmV0dXJucyB0aGUgaGFzaCBvZiByZWdpc3RlcmVkIHBsdWdpbnMKCiAgICBteSAkUGx1Z2luTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKCj1jdXQKCnN1YiBQbHVnaW5MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVBsdWdpbkxpc3QgPSBtYXAgewogICAgICAgICRfID0+IHsKICAgICAgICAgICAgUGx1Z2luTmFtZSA9PiAkU2VsZi0+e1BsdWdpbnN9LT57JF99LT57UGx1Z2luTmFtZX0sCiAgICAgICAgICAgIFBsdWdpblVSTCAgPT4gJFNlbGYtPntQbHVnaW5zfS0+eyRffS0+e1BsdWdpblVSTH0sCiAgICAgICAgfQogICAgfSBrZXlzICV7ICRTZWxmLT57UGx1Z2luc30gfTsKCiAgICByZXR1cm4gXCVQbHVnaW5MaXN0Owp9Cgo9aXRlbSBQbHVnaW5LZXlzKCkKCnJldHVybnMgdGhlIGhhc2ggb2YgcHJvcGVyIHBsdWdpbiBrZXlzIGZvciBsb3dlcmNhc2UgbWF0Y2hpbmcKCiAgICBteSAkUGx1Z2luS2V5cyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbktleXMoKTsKCj1jdXQKCnN1YiBQbHVnaW5LZXlzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVBsdWdpbktleXMgPSBtYXAgewogICAgICAgIGxjICRfID0+ICRfCiAgICB9IGtleXMgJXsgJFNlbGYtPntQbHVnaW5zfSB9OwoKICAgIHJldHVybiBcJVBsdWdpbktleXM7Cn0KCj1pdGVtIFBsdWdpbkxpbmtBZGQoKQoKbGluayBhcHBvaW50bWVudCBieSBwbHVnaW4KCiAgICBteSAkU3VjY2VzcyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtBZGQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLAogICAgICAgIFBsdWdpbktleSAgICAgPT4gJzAxMDAtVGlja2V0JywKICAgICAgICBQbHVnaW5EYXRhICAgID0+ICc0MicsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBQbHVnaW5MaW5rQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFBsdWdpbktleSBQbHVnaW5EYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntQbHVnaW5zfS0+eyAkUGFyYW17UGx1Z2luS2V5fSB9LT57UGx1Z2luTW9kdWxlfS0+TGlua0FkZCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWl0ZW0gUGx1Z2luTGlua0xpc3QoKQoKcmV0dXJucyBsaXN0IG9mIGxpbmtzIGZvciBzdXBwbGllZCBhcHBvaW50bWVudAoKICAgIG15ICRMaW5rTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtMaXN0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICBQbHVnaW5LZXkgICAgID0+ICcwMTAwLVRpY2tldCcsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBQbHVnaW5MaW5rTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBQbHVnaW5LZXkgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtQbHVnaW5VUkx9ID0gJFNlbGYtPntQbHVnaW5zfS0+eyAkUGFyYW17UGx1Z2luS2V5fSB9LT57UGx1Z2luVVJMfTsKCiAgICBteSAkTGlua0xpc3QgPSAkU2VsZi0+e1BsdWdpbnN9LT57ICRQYXJhbXtQbHVnaW5LZXl9IH0tPntQbHVnaW5Nb2R1bGV9LT5MaW5rTGlzdCglUGFyYW0pOwoKICAgIHJldHVybiAkTGlua0xpc3Q7Cn0KCj1pdGVtIFBsdWdpbkxpbmtEZWxldGUoKQoKcmVtb3ZlcyBhbGwgbGlua3MgZm9yIGFuIGFwcG9pbnRtZW50CgogICAgbXkgJFN1Y2Nlc3MgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rRGVsZXRlKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFBsdWdpbkxpbmtEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZUFsbCgKICAgICAgICBPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBLZXkgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmFibGUgdG8gZGVsZXRlIHBsdWdpbiBsaW5rcyEiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBQbHVnaW5TZWFyY2goKQoKc2VhcmNoIGZvciBwbHVnaW4gb2JqZWN0cwoKICAgIG15ICRSZXN1bHRMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luU2VhcmNoKAogICAgICAgIFBsdWdpbktleSA9PiAkUGx1Z2luS2V5LCAgICAgICAgIyAocmVxdWlyZWQpCgogICAgICAgIFNlYXJjaCAgICA9PiAkU2VhcmNoLCAgICAgICAgICAgIyAocmVxdWlyZWQpIFNlYXJjaCBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKICAgICAgICBPYmplY3RJRCAgPT4gJE9iamVjdElEICAgICAgICAgICMgKHJlcXVpcmVkKSBPYmplY3QgSUQKCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwgICAjIChyZXF1aXJlZCkKICAgICk7Cgo9Y3V0CgpzdWIgUGx1Z2luU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQbHVnaW5LZXkgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhJFBhcmFte1NlYXJjaH0gJiYgISRQYXJhbXtPYmplY3RJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBTZWFyY2ggb3IgT2JqZWN0SUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkUmVzdWx0TGlzdCA9ICRTZWxmLT57UGx1Z2luc30tPnsgJFBhcmFte1BsdWdpbktleX0gfS0+e1BsdWdpbk1vZHVsZX0tPlNlYXJjaCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0TGlzdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luOjpUaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW46OlRpY2tldCAtIFRpY2tldCBwbHVnaW4KCj1oZWFkMSBTWU5PUFNJUwoKVGlja2V0IGFwcG9pbnRtZW50IHBsdWdpbi4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGlja2V0UGx1Z2luT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW46OlRpY2tldCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIExpbmtBZGQoKQoKYWRkcyBhIGxpbmsgZnJvbSBhbiBhcHBvaW50bWVudCB0byB0aGUgdGlja2V0CgogICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UGx1Z2luT2JqZWN0LT5MaW5rQWRkKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMTIzLAogICAgICAgIFBsdWdpbkRhdGEgICAgPT4gJFRpY2tldElELAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBQbHVnaW5EYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRpY2tldCBpZAogICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtQbHVnaW5EYXRhfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CiAgICByZXR1cm4gaWYgISVUaWNrZXQ7CgogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rQWRkKAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAkUGFyYW17UGx1Z2luRGF0YX0sCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBMaW5rTGlzdCgpCgpyZXR1cm5zIGEgaGFzaCBvZiBsaW5rZWQgdGlja2V0cyB0byBhbiBhcHBvaW50bWVudAoKICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFBsdWdpbk9iamVjdC0+TGlua0xpc3QoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBVc2VySUQgUGx1Z2luVVJMKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVMaW5rS2V5TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtLZXlMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0MSA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIEtleTEgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIE9iamVjdDIgPT4gJ1RpY2tldCcsCiAgICAgICAgU3RhdGUgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVSZXN1bHQgPSBtYXAgewogICAgICAgICRfID0+IHsKICAgICAgICAgICAgTGlua0lEICAgPT4gJExpbmtLZXlMaXN0eyRffS0+e1RpY2tldElEfSwKICAgICAgICAgICAgTGlua05hbWUgPT4gJExpbmtLZXlMaXN0eyRffS0+e1RpY2tldE51bWJlcn0gLiAnICcgLiAkTGlua0tleUxpc3R7JF99LT57VGl0bGV9LAogICAgICAgICAgICBMaW5rVVJMICA9PiBzcHJpbnRmKCAkUGFyYW17UGx1Z2luVVJMfSwgJExpbmtLZXlMaXN0eyRffS0+e1RpY2tldElEfSApLAogICAgICAgIH0KICAgIH0ga2V5cyAlTGlua0tleUxpc3Q7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBTZWFyY2goKQoKc2VhcmNoIGZvciB0aWNrZXQgYW5kIHJldHVybiBhIGhhc2ggb2YgZm91bmQgdGlja2V0cwoKICAgIG15ICRSZXN1bHRMaXN0ID0gJFRpY2tldFBsdWdpbk9iamVjdC0+U2VhcmNoKAogICAgICAgIFNlYXJjaCAgID0+ICcqKicsICAgIyBzZWFyY2ggYnkgdGlja2V0IG51bWJlciBvciB0aXRsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIE9iamVjdElEID0+IDEsICAgICAgIyBzZWFyY2ggYnkgdGlja2V0IElEIChzaW5nbGUgcmVzdWx0KQoKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17U2VhcmNofSAmJiAhJFBhcmFte09iamVjdElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIFNlYXJjaCBvciBPYmplY3RJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgbXkgQFRpY2tldElEczsKICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgc2VhcmNoIHRoZSB0aWNrZXRzIGJ5IHRpY2tldCBudW1iZXIKICAgICAgICBAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIExpbWl0ICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICBBcmNoaXZlRmxhZ3MgPT4gWyduJ10sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHRyeSB0aGUgdGl0bGUgc2VhcmNoIGlmIG5vIHJlc3VsdHMgd2VyZSBmb3VuZAogICAgICAgIGlmICggIUBUaWNrZXRJRHMgKSB7CiAgICAgICAgICAgIEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJyUnIC4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICAgID0+ICdBUlJBWScsCiAgICAgICAgICAgICAgICBBcmNoaXZlRmxhZ3MgPT4gWyduJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17T2JqZWN0SUR9ICkgewogICAgICAgIEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgICAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgICAgICAgICBSZXN1bHQgICAgICAgPT4gJ0FSUkFZJywKICAgICAgICAgICAgQXJjaGl2ZUZsYWdzID0+IFsnbiddLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlUmVzdWx0TGlzdDsKCiAgICAjIGNsZWFuIHRoZSByZXN1bHRzCiAgICBUSUNLRVQ6CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzKSB7CgogICAgICAgIG5leHQgVElDS0VUIGlmICEkVGlja2V0SUQ7CgogICAgICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUSUNLRVQgaWYgISVUaWNrZXQ7CgogICAgICAgICMgZ2VuZXJhdGUgdGhlIHRpY2tldCBpbmZvcm1hdGlvbiBzdHJpbmcKICAgICAgICAkUmVzdWx0TGlzdHsgJFRpY2tldHtUaWNrZXRJRH0gfSA9ICRUaWNrZXR7VGlja2V0TnVtYmVyfSAuICcgJyAuICRUaWNrZXR7VGl0bGV9OwogICAgfQoKICAgIHJldHVybiBcJVJlc3VsdExpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6Ok5vdGlmaWNhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkpTT04nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb25FdmVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyVGVtcGxhdGVHZW5lcmF0b3InLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRXZlbnQgRGF0YSBDb25maWcgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ICYmICEkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIENhbGVuZGFySUQgb3IgQXBwb2ludG1lbnRJRCBpbiBEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgbm90aWZpY2F0aW9uIGV2ZW50IG9iamVjdAogICAgbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50Jyk7CgogICAgIyBjaGVjayBpZiBldmVudCBpcyBhZmZlY3RlZAogICAgbXkgQElEcyA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uRXZlbnRDaGVjaygKICAgICAgICBFdmVudCA9PiAkUGFyYW17RXZlbnR9LAogICAgKTsKCiAgICAjIHJldHVybiBpZiBubyBub3RpZmljYXRpb24gZm9yIGV2ZW50IGV4aXN0cwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCBcQElEcyApICkgewoKICAgICAgICAjIHVwZGF0ZSB0aGUgZnV0dXJlIHRhc2tzCiAgICAgICAgJFNlbGYtPl9GdXR1cmVUYXNrVXBkYXRlKCk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwoKICAgIG15ICVDYWxlbmRhcjsKICAgIG15ICVBcHBvaW50bWVudDsKCiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgKTsKICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSB8fCAkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSApIHsKICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFySUR9LAogICAgICAgICk7CiAgICB9CgogICAgTk9USUZJQ0FUSU9OSUQ6CiAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbklEIChASURzKSB7CgogICAgICAgIG15ICVOb3RpZmljYXRpb24gPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkdldCgKICAgICAgICAgICAgSUQgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IGFwcG9pbnRtZW50IGNvbmRpdGlvbnMKICAgICAgICBteSAkUGFzc0ZpbHRlciA9ICRTZWxmLT5fTm90aWZpY2F0aW9uRmlsdGVyKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFwcG9pbnRtZW50ICA9PiBcJUFwcG9pbnRtZW50LAogICAgICAgICAgICBDYWxlbmRhciAgICAgPT4gXCVDYWxlbmRhciwKICAgICAgICAgICAgTm90aWZpY2F0aW9uID0+IFwlTm90aWZpY2F0aW9uLAogICAgICAgICk7CgogICAgICAgIG5leHQgTk9USUZJQ0FUSU9OSUQgaWYgISRQYXNzRmlsdGVyOwoKICAgICAgICAjIGdldCByZWNpcGllbnRzCiAgICAgICAgbXkgQFJlY2lwaWVudFVzZXJzID0gJFNlbGYtPl9SZWNpcGllbnRzR2V0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFwcG9pbnRtZW50ICA9PiBcJUFwcG9pbnRtZW50LAogICAgICAgICAgICBDYWxlbmRhciAgICAgPT4gXCVDYWxlbmRhciwKICAgICAgICAgICAgTm90aWZpY2F0aW9uID0+IFwlTm90aWZpY2F0aW9uLAogICAgICAgICk7CgogICAgICAgIG15IEBOb3RpZmljYXRpb25CdW5kbGU7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGdlbmVyYXRvciBvYmplY3Q7CiAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyVGVtcGxhdGVHZW5lcmF0b3InKTsKCiAgICAgICAgIyBwYXJzZSBhbGwgbm90aWZpY2F0aW9uIHRhZ3MgZm9yIGVhY2ggdXNlcgogICAgICAgIGZvciBteSAkUmVjaXBpZW50IChAUmVjaXBpZW50VXNlcnMpIHsKCiAgICAgICAgICAgIG15ICVSZXBsYWNlZE5vdGlmaWNhdGlvbiA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+Tm90aWZpY2F0aW9uRXZlbnQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJlY2lwaWVudCAgICAgPT4gJFJlY2lwaWVudCwKICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiAgPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRSZWNpcGllbnQtPntBcHBvaW50bWVudE5vdGlmaWNhdGlvblRyYW5zcG9ydH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBOb3RpZmljYXRpb25CdW5kbGUsIHsKICAgICAgICAgICAgICAgIFJlY2lwaWVudCAgICAgICAgICAgICAgICAgICAgICA9PiAkUmVjaXBpZW50LAogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uICAgICAgICAgICAgICAgICAgID0+IFwlUmVwbGFjZWROb3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICBSZWNpcGllbnROb3RpZmljYXRpb25UcmFuc3BvcnQgPT4gJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnQsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICMgZ2V0IG5vdGlmaWNhdGlvbiB0cmFuc3BvcnQgY29uZmlnCiAgICAgICAgbXkgJVRyYW5zcG9ydENvbmZpZyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQXBwb2ludG1lbnROb3RpZmljYXRpb246OlRyYW5zcG9ydCcpIHx8IHt9IH07CgogICAgICAgICMgcmVtZW1iZXIgYWxyZWFkeSBzZW50IGFnZW50IG5vdGlmaWNhdGlvbnMKICAgICAgICBteSAlQWxyZWFkeVNlbnQ7CgogICAgICAgICMgbG9vcCBvdmVyIHRyYW5zcG9ydHMgZm9yIGVhY2ggbm90aWZpY2F0aW9uCiAgICAgICAgVFJBTlNQT1JUOgogICAgICAgIGZvciBteSAkVHJhbnNwb3J0ICggc29ydCBrZXlzICVUcmFuc3BvcnRDb25maWcgKSB7CgogICAgICAgICAgICAjIG9ubHkgY29uZmlndXJlZCB0cmFuc3BvcnRzIGZvciB0aGlzIG5vdGlmaWNhdGlvbgogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJFRyYW5zcG9ydCB9IEB7ICROb3RpZmljYXRpb257RGF0YX0tPntUcmFuc3BvcnRzfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFRyYW5zcG9ydENvbmZpZ3skVHJhbnNwb3J0fSApOwogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhJFRyYW5zcG9ydENvbmZpZ3skVHJhbnNwb3J0fS0+e01vZHVsZX07CgogICAgICAgICAgICAjIGdldCB0cmFuc3BvcnQgb2JqZWN0CiAgICAgICAgICAgIG15ICRUcmFuc3BvcnRPYmplY3Q7CiAgICAgICAgICAgIGV2YWwgewogICAgICAgICAgICAgICAgJFRyYW5zcG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoICRUcmFuc3BvcnRDb25maWd7JFRyYW5zcG9ydH0tPntNb2R1bGV9ICk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoICEkVHJhbnNwb3J0T2JqZWN0ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGNyZWF0ZSBhIG5ldyAkVHJhbnNwb3J0Q29uZmlneyRUcmFuc3BvcnR9LT57TW9kdWxlfSBvYmplY3QhIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggcmVmICRUcmFuc3BvcnRPYmplY3QgbmUgJFRyYW5zcG9ydENvbmZpZ3skVHJhbnNwb3J0fS0+e01vZHVsZX0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkVHJhbnNwb3J0Q29uZmlneyRUcmFuc3BvcnR9LT57TW9kdWxlfSBvYmplY3QgaXMgaW52YWxpZCIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIHRyYW5zcG9ydCBpcyB1c2FibGUKICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgISRUcmFuc3BvcnRPYmplY3QtPklzVXNhYmxlKCk7CgogICAgICAgICAgICBCVU5ETEU6CiAgICAgICAgICAgIGZvciBteSAkQnVuZGxlIChATm90aWZpY2F0aW9uQnVuZGxlKSB7CgogICAgICAgICAgICAgICAgbXkgJFVzZXJQcmVmZXJlbmNlID0gIk5vdGlmaWNhdGlvbi0kTm90aWZpY2F0aW9ue0lEfS0kVHJhbnNwb3J0IjsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGFnZW50IHNob3VsZCBnZXQgdGhlIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgbXkgJEFnZW50U2VuZE5vdGlmaWNhdGlvbiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEJ1bmRsZS0+e1JlY2lwaWVudE5vdGlmaWNhdGlvblRyYW5zcG9ydH0tPnskVXNlclByZWZlcmVuY2V9ICkgewogICAgICAgICAgICAgICAgICAgICRBZ2VudFNlbmROb3RpZmljYXRpb24gPSAkQnVuZGxlLT57UmVjaXBpZW50Tm90aWZpY2F0aW9uVHJhbnNwb3J0fS0+eyRVc2VyUHJlZmVyZW5jZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoIGdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0IH0gQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e0FnZW50RW5hYmxlZEJ5RGVmYXVsdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkQWdlbnRTZW5kTm90aWZpY2F0aW9uID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAhSXNBcnJheVJlZldpdGhEYXRhKCAkTm90aWZpY2F0aW9ue0RhdGF9LT57VmlzaWJsZUZvckFnZW50fSApCiAgICAgICAgICAgICAgICAgICAgfHwgKAogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9LT5bMF0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgISROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9LT5bMF0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRBZ2VudFNlbmROb3RpZmljYXRpb24gPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2tpcCBzZW5kaW5nIHRoZSBub3RpZmljYXRpb24gaWYgdGhlIGFnZW50IGhhcyBkaXNhYmxlIGl0IGluIGl0cyBwcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJE5vdGlmaWNhdGlvbntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0gKQogICAgICAgICAgICAgICAgICAgICYmICROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9LT5bMF0KICAgICAgICAgICAgICAgICAgICAmJiAkQnVuZGxlLT57UmVjaXBpZW50fS0+e1R5cGV9IGVxICdBZ2VudCcKICAgICAgICAgICAgICAgICAgICAmJiAhJEFnZW50U2VuZE5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEJVTkRMRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5fU2VuZFJlY2lwaWVudE5vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSAgICAgICB8fCAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uICAgICAgICAgID0+ICRCdW5kbGUtPntOb3RpZmljYXRpb259LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyTWVzc2FnZVBhcmFtcyA9PiAkUGFyYW17RGF0YX0tPntDdXN0b21lck1lc3NhZ2VQYXJhbXN9IHx8IHt9LAogICAgICAgICAgICAgICAgICAgIFJlY2lwaWVudCAgICAgICAgICAgICA9PiAkQnVuZGxlLT57UmVjaXBpZW50fSwKICAgICAgICAgICAgICAgICAgICBFdmVudCAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0V2ZW50fSwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgICAgICAgICAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRPYmplY3QgICAgICAgPT4gJFRyYW5zcG9ydE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gaGF2ZSBzZW50CiAgICAgICAgICAgICAgICAkQWxyZWFkeVNlbnR7ICRCdW5kbGUtPntSZWNpcGllbnR9LT57VXNlcklEfSB9ID0gMTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHNwZWNpYWwgcmVjaXBpZW50cyBzcGVjaWZpYyBmb3IgZWFjaCB0cmFuc3BvcnQKICAgICAgICAgICAgbXkgQFRyYW5zcG9ydFJlY2lwaWVudHMgPSAkVHJhbnNwb3J0T2JqZWN0LT5HZXRUcmFuc3BvcnRSZWNpcGllbnRzKAogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uID0+IFwlTm90aWZpY2F0aW9uLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgIUBUcmFuc3BvcnRSZWNpcGllbnRzOwoKICAgICAgICAgICAgUkVDSVBJRU5UOgogICAgICAgICAgICBmb3IgbXkgJFJlY2lwaWVudCAoQFRyYW5zcG9ydFJlY2lwaWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgYWxsIG5vdGlmaWNhdGlvbiB0YWdzIGZvciBlYWNoIHNwZWNpYWwgcmVjaXBpZW50CiAgICAgICAgICAgICAgICBteSAlUmVwbGFjZWROb3RpZmljYXRpb24gPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPk5vdGlmaWNhdGlvbkV2ZW50KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgICAgICBSZWNpcGllbnQgICAgICAgICAgICAgPT4gJFJlY2lwaWVudCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0+ICRQYXJhbXtEYXRhfS0+e0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfHwge30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5fU2VuZFJlY2lwaWVudE5vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSAgICAgICB8fCAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uICAgICAgICAgID0+IFwlUmVwbGFjZWROb3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0+ICRQYXJhbXtEYXRhfS0+e0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfHwge30sCiAgICAgICAgICAgICAgICAgICAgUmVjaXBpZW50ICAgICAgICAgICAgID0+ICRSZWNpcGllbnQsCiAgICAgICAgICAgICAgICAgICAgRXZlbnQgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFdmVudH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0ICAgICAgICAgICAgID0+ICRUcmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0T2JqZWN0ICAgICAgID0+ICRUcmFuc3BvcnRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAlQWxyZWFkeVNlbnQgJiYgJFBhcmFte0RhdGF9LT57QXJ0aWNsZUlEfSAmJiAkUGFyYW17RGF0YX0tPntBcnRpY2xlVHlwZX0gKSB7CgogICAgICAgICAgICAjIHVwZGF0ZSB0byBmaWVsZAogICAgICAgICAgICBteSAkVXBkYXRlVG9TdWNjZXNzID0gJFNlbGYtPl9BcnRpY2xlVG9VcGRhdGUoCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICA9PiAkUGFyYW17RGF0YX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZVR5cGUgPT4gJFBhcmFte0RhdGF9LT57QXJ0aWNsZVR5cGV9LAogICAgICAgICAgICAgICAgVXNlcklEcyAgICAgPT4gXCVBbHJlYWR5U2VudCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZXJyb3JzCiAgICAgICAgICAgIGlmICggISRVcGRhdGVUb1N1Y2Nlc3MgKSB7CgogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHVwZGF0ZSBUbyBmaWVsZCBmb3IgQXJ0aWNsZTogJFBhcmFte0RhdGF9LT57QXJ0aWNsZUlEfS4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MKICAgICRTZWxmLT5fRnV0dXJlVGFza1VwZGF0ZSgpOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX05vdGlmaWNhdGlvbkZpbHRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50IENhbGVuZGFyIE5vdGlmaWNhdGlvbikpIHsKICAgICAgICByZXR1cm4gaWYgISRQYXJhbXskTmVlZGVkfTsKICAgIH0KCiAgICAjIHNldCBsb2NhbCB2YWx1ZXMKICAgIG15ICVOb3RpZmljYXRpb24gPSAleyAkUGFyYW17Tm90aWZpY2F0aW9ufSB9OwoKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICROb3RpZmljYXRpb257RGF0YX0gKTsKCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkTm90aWZpY2F0aW9ue0RhdGF9IH0gKSB7CgogICAgICAgICMgaWdub3JlIG5vdCBhcHBvaW50bWVudCByZWxhdGVkIGF0dHJpYnV0ZXMKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdSZWNpcGllbnRzJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdTa2lwUmVjaXBpZW50cyc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnUmVjaXBpZW50QWdlbnRzJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdSZWNpcGllbnRHcm91cHMnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1JlY2lwaWVudFJvbGVzJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdUcmFuc3BvcnRFbWFpbFRlbXBsYXRlJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdFdmVudHMnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FydGljbGVUeXBlSUQnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FydGljbGVTZW5kZXJUeXBlSUQnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FydGljbGVTdWJqZWN0TWF0Y2gnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FydGljbGVCb2R5TWF0Y2gnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FydGljbGVBdHRhY2htZW50SW5jbHVkZSc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnTm90aWZpY2F0aW9uQXJ0aWNsZVR5cGVJRCc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnVHJhbnNwb3J0cyc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnT25jZVBlckRheSc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnVmlzaWJsZUZvckFnZW50JzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdWaXNpYmxlRm9yQWdlbnRUb29sdGlwJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdMYW5ndWFnZUlEJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdTZW5kT25PdXRPZk9mZmljZSc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQWdlbnRFbmFibGVkQnlEZWZhdWx0JzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdOb3RpZmljYXRpb25UeXBlJzsKCiAgICAgICAgIyBjaGVjayByZWNpcGllbnQgZmllbGRzIGZyb20gdHJhbnNwb3J0IG1ldGhvZHMKICAgICAgICBpZiAoICRLZXkgPX4gbXtcQSBSZWNpcGllbnR9eG1zICkgewogICAgICAgICAgICBuZXh0IEtFWTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgYXBwb2ludG1lbnQgYXR0cmlidXRlcwogICAgICAgIG5leHQgS0VZIGlmICEkTm90aWZpY2F0aW9ue0RhdGF9LT57JEtleX07CiAgICAgICAgbmV4dCBLRVkgaWYgIUB7ICROb3RpZmljYXRpb257RGF0YX0tPnskS2V5fSB9OwogICAgICAgIG5leHQgS0VZIGlmICEkTm90aWZpY2F0aW9ue0RhdGF9LT57JEtleX0tPlswXTsKCiAgICAgICAgbXkgJE1hdGNoID0gMDsKCiAgICAgICAgVkFMVUU6CiAgICAgICAgZm9yIG15ICRWYWx1ZSAoIEB7ICROb3RpZmljYXRpb257RGF0YX0tPnskS2V5fSB9ICkgewoKICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhJFZhbHVlOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEtleSBlcSAnVGVhbUlEJwogICAgICAgICAgICAgICAgfHwgJEtleSBlcSAnUmVzb3VyY2VJRCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZXhpc3Rpbmcgb2JqZWN0IGlkcyBpbiBhcHBvaW50bWVudAogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0FwcG9pbnRtZW50fS0+eyRLZXl9ICk7CgogICAgICAgICAgICAgICAgT0JKRUNUSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJE9iamVjdElEICggQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+eyRLZXl9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgIG5leHQgT0JKRUNUSUQgaWYgISRPYmplY3RJRDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVmFsdWUgZXEgJE9iamVjdElEICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTWF0Y2ggPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFZBTFVFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte0FwcG9pbnRtZW50fS0+eyRLZXl9ICYmICRWYWx1ZSBlcSAkUGFyYW17QXBwb2ludG1lbnR9LT57JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE1hdGNoID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IFZBTFVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWYgISRNYXRjaDsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9SZWNpcGllbnRzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnQgQ2FsZW5kYXIgTm90aWZpY2F0aW9uKSkgewogICAgICAgIHJldHVybiBpZiAhJFBhcmFteyROZWVkZWR9OwogICAgfQoKICAgICMgc2V0IGxvY2FsIHZhbHVlcwogICAgbXkgJU5vdGlmaWNhdGlvbiA9ICV7ICRQYXJhbXtOb3RpZmljYXRpb259IH07CiAgICBteSAlQXBwb2ludG1lbnQgID0gJXsgJFBhcmFte0FwcG9pbnRtZW50fSB9OwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgIG15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSBAUmVjaXBpZW50VXNlcklEczsKICAgIG15IEBSZWNpcGllbnRVc2VyczsKCiAgICAjIGFkZCBwcmUtY2FsY3VsYXRlZCByZWNpcGllbnQKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntSZWNpcGllbnRzfSApICkgewogICAgICAgIHB1c2ggQFJlY2lwaWVudFVzZXJJRHMsIEB7ICRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudHN9IH07CiAgICB9CgogICAgIyByZW1lbWJlciBwcmUtY2FsY3VsYXRlZCB1c2VyIHJlY2lwaWVudHMgZm9yIGxhdGVyIGNvbXBhcmlzb25zCiAgICBteSAlUHJlY2FsY3VsYXRlZFVzZXJJRHMgPSBtYXAgeyAkXyA9PiAxIH0gQFJlY2lwaWVudFVzZXJJRHM7CgogICAgIyBnZXQgcmVjaXBpZW50cyBieSBSZWNpcGllbnRzCiAgICBpZiAoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRzfSApIHsKCiAgICAgICAgUkVDSVBJRU5UOgogICAgICAgIGZvciBteSAkUmVjaXBpZW50ICggQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudHN9IH0gKSB7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkUmVjaXBpZW50CiAgICAgICAgICAgICAgICA9fiAvXkFwcG9pbnRtZW50KEFnZW50c3xBZ2VudFJlYWRQZXJtaXNzaW9uc3xBZ2VudFdyaXRlUGVybWlzc2lvbnMpJC8KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAkUmVjaXBpZW50IGVxICdBcHBvaW50bWVudEFnZW50cycgKSB7CgogICAgICAgICAgICAgICAgICAgIFJFU09VUkNFSUQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRSZXNvdXJjZUlEICggQHsgJEFwcG9pbnRtZW50e1Jlc291cmNlSUR9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFJFU09VUkNFSUQgaWYgISRSZXNvdXJjZUlEOwoKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkTm90aWZpY2F0aW9ue0RhdGF9LT57UmVjaXBpZW50QWdlbnRzfSB9LCAkUmVzb3VyY2VJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSZWNpcGllbnQgZXEgJ0FwcG9pbnRtZW50QWdlbnRSZWFkUGVybWlzc2lvbnMnICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBjYWxlbmRhciBpbmZvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9IHx8ICRQYXJhbXtDYWxlbmRhcn0tPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGEgbGlzdCBvZiByZWFkIGFjY2VzcyB1c2VycyBmb3IgdGhlIHJlbGF0ZWQgY2FsZW5kYXIKICAgICAgICAgICAgICAgICAgICBteSAlVXNlcnMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkQ2FsZW5kYXJ7R3JvdXBJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBVU0VSSUQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVVzZXJzICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgISRVc2VySUQ7CgogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRBZ2VudHN9IH0sICRVc2VySUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVjaXBpZW50IGVxICdBcHBvaW50bWVudEFnZW50V3JpdGVQZXJtaXNzaW9ucycgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGNhbGVuZGFyIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gfHwgJFBhcmFte0NhbGVuZGFyfS0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgYSBsaXN0IG9mIHJlYWQgYWNjZXNzIHVzZXJzIGZvciB0aGUgcmVsYXRlZCBjYWxlbmRhcgogICAgICAgICAgICAgICAgICAgIG15ICVVc2VycyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRDYWxlbmRhcntHcm91cElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncncnLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIFVTRVJJRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlVXNlcnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudEFnZW50c30gfSwgJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgcmVjaXBpZW50IGFnZW50cwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRBZ2VudHN9ICkgKSB7CiAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcklEcywgQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudEFnZW50c30gfTsKICAgIH0KCiAgICAjIGhhc2ggdG8ga2VlcCB0cmFjayB3aGljaCBhZ2VudHMgYXJlIGFscmVhZHkgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uCiAgICBteSAlQWdlbnRVc2VkID0gbWFwIHsgJF8gPT4gMSB9IEBSZWNpcGllbnRVc2VySURzOwoKICAgICMgZ2V0IHJlY2lwaWVudHMgYnkgUmVjaXBpZW50R3JvdXBzCiAgICBpZiAoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRHcm91cHN9ICkgewoKICAgICAgICBSRUNJUElFTlQ6CiAgICAgICAgZm9yIG15ICRHcm91cElEICggQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudEdyb3Vwc30gfSApIHsKCiAgICAgICAgICAgIG15ICVHcm91cE1lbWJlckxpc3QgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cFVzZXJHZXQoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgR1JPVVBNRU1CRVI6CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVHcm91cE1lbWJlckxpc3QgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBHUk9VUE1FTUJFUiBpZiAkVXNlcklEID09IDE7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQTUVNQkVSIGlmICRBZ2VudFVzZWR7JFVzZXJJRH07CgogICAgICAgICAgICAgICAgJEFnZW50VXNlZHskVXNlcklEfSA9IDE7CgogICAgICAgICAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcklEcywgJFVzZXJJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCByZWNpcGllbnRzIGJ5IFJlY2lwaWVudFJvbGVzCiAgICBpZiAoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRSb2xlc30gKSB7CgogICAgICAgIFJFQ0lQSUVOVDoKICAgICAgICBmb3IgbXkgJFJvbGVJRCAoIEB7ICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRSb2xlc30gfSApIHsKCiAgICAgICAgICAgIG15ICVSb2xlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblJvbGVVc2VyR2V0KAogICAgICAgICAgICAgICAgUm9sZUlEID0+ICRSb2xlSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBST0xFTUVNQkVSOgogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlUm9sZU1lbWJlckxpc3QgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBST0xFTUVNQkVSIGlmICRVc2VySUQgPT0gMTsKICAgICAgICAgICAgICAgIG5leHQgUk9MRU1FTUJFUiBpZiAkQWdlbnRVc2VkeyRVc2VySUR9OwoKICAgICAgICAgICAgICAgICRBZ2VudFVzZWR7JFVzZXJJRH0gPSAxOwoKICAgICAgICAgICAgICAgIHB1c2ggQFJlY2lwaWVudFVzZXJJRHMsICRVc2VySUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICBteSAlU2tpcFJlY2lwaWVudHM7CiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57U2tpcFJlY2lwaWVudHN9ICkgKSB7CiAgICAgICAgJVNraXBSZWNpcGllbnRzID0gbWFwIHsgJF8gPT4gMSB9IEB7ICRQYXJhbXtEYXRhfS0+e1NraXBSZWNpcGllbnRzfSB9OwogICAgfQoKICAgICMgYWdlbnQgMSBzaG91bGQgbm90IHJlY2VpdmUgbm90aWZpY2F0aW9ucwogICAgJFNraXBSZWNpcGllbnRzeycxJ30gPSAxOwoKICAgICMgcmVtb3ZlIHJlY2lwaWVudHMgc2hvdWxkIG5vdCByZWNlaXZlIGEgbm90aWZpY2F0aW9uCiAgICBAUmVjaXBpZW50VXNlcklEcyA9IGdyZXAgeyAhJFNraXBSZWNpcGllbnRzeyRffSB9IEBSZWNpcGllbnRVc2VySURzOwoKICAgICMgZ2V0IHZhbGlkIHVzZXJzIGxpc3QKICAgIG15ICVWYWxpZFVzZXJzTGlzdCA9ICRVc2VyT2JqZWN0LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICAgICAgICAgID0+ICdTaG9ydCcsCiAgICAgICAgVmFsaWQgICAgICAgICA9PiAxLAogICAgICAgIE5vT3V0T2ZPZmZpY2UgPT4gMCwKICAgICk7CgogICAgIyByZW1vdmUgaW52YWxpZCB1c2VycwogICAgQFJlY2lwaWVudFVzZXJJRHMgPSBncmVwIHsgJFZhbGlkVXNlcnNMaXN0eyRffSB9IEBSZWNpcGllbnRVc2VySURzOwoKICAgICMgcmVtb3ZlIGR1cGxpY2F0ZWQKICAgIG15ICVUZW1wUmVjaXBpZW50VXNlcklEcyA9IG1hcCB7ICRfID0+IDEgfSBAUmVjaXBpZW50VXNlcklEczsKICAgIEBSZWNpcGllbnRVc2VySURzID0gc29ydCBrZXlzICVUZW1wUmVjaXBpZW50VXNlcklEczsKCiAgICAjIGdldCB0aW1lIG9iamVjdAogICAgbXkgJFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZS1zdGFtcAogICAgbXkgJFRpbWUgPSAkVGltZU9iamVjdC0+U3lzdGVtVGltZSgpOwoKICAgICMgZ2V0IGFsbCBkYXRhIGZvciByZWNpcGllbnRzIGFzIHRoZXkgc2hvdWxkIGJlIG5lZWRlZCBieSBhbGwgbm90aWZpY2F0aW9uIHRyYW5zcG9ydHMKICAgIFJFQ0lQSUVOVDoKICAgIGZvciBteSAkVXNlcklEIChAUmVjaXBpZW50VXNlcklEcykgewoKICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbmV4dCBSRUNJUElFTlQgaWYgISVVc2VyOwoKICAgICAgICAjIHNraXAgdXNlciB0aGF0IHRyaWdnZXJzIHRoZSBldmVudCAoaXQgc2hvdWxkIG5vdCBiZSBub3RpZmllZCkgYnV0IG9ubHkgaWYgaXQgaXMgbm90CiAgICAgICAgIyAgIGEgcHJlLWNhbGN1bGF0ZWQgcmVjaXBpZW50CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudFNlbGZOb3RpZnlPbkFjdGlvbicpCiAgICAgICAgICAgICYmICRVc2Vye1VzZXJJRH0gPT0gJFBhcmFte1VzZXJJRH0KICAgICAgICAgICAgJiYgISRQcmVjYWxjdWxhdGVkVXNlcklEc3sgJFBhcmFte1VzZXJJRH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IFJFQ0lQSUVOVDsKICAgICAgICB9CgogICAgICAgICMgc2tpcCB1c2VycyBvdXQgb2YgdGhlIG9mZmljZSBpZiBjb25maWd1cmVkCiAgICAgICAgaWYgKCAhJE5vdGlmaWNhdGlvbntEYXRhfS0+e1NlbmRPbk91dE9mT2ZmaWNlfSAmJiAkVXNlcntPdXRPZk9mZmljZX0gKSB7CiAgICAgICAgICAgIG15ICRTdGFydCA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgMDA6MDA6MDAiLAogICAgICAgICAgICAgICAgJFVzZXJ7T3V0T2ZPZmZpY2VTdGFydFllYXJ9LCAkVXNlcntPdXRPZk9mZmljZVN0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgJFVzZXJ7T3V0T2ZPZmZpY2VTdGFydERheX0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFRpbWVTdGFydCA9ICRUaW1lT2JqZWN0LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmQgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDIzOjU5OjU5IiwKICAgICAgICAgICAgICAgICRVc2Vye091dE9mT2ZmaWNlRW5kWWVhcn0sICRVc2Vye091dE9mT2ZmaWNlRW5kTW9udGh9LAogICAgICAgICAgICAgICAgJFVzZXJ7T3V0T2ZPZmZpY2VFbmREYXl9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRUaW1lRW5kID0gJFRpbWVPYmplY3QtPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFbmQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFJFQ0lQSUVOVCBpZiAkVGltZVN0YXJ0IDwgJFRpbWUgJiYgJFRpbWVFbmQgPiAkVGltZTsKICAgICAgICB9CgogICAgICAgICMgc2tpcCBQb3N0TWFzdGVyVXNlcklECiAgICAgICAgbXkgJFBvc3RtYXN0ZXJVc2VySUQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Bvc3RtYXN0ZXJVc2VySUQnKSB8fCAxOwogICAgICAgIG5leHQgUkVDSVBJRU5UIGlmICRVc2Vye1VzZXJJRH0gPT0gJFBvc3RtYXN0ZXJVc2VySUQ7CgogICAgICAgICRVc2Vye1R5cGV9ID0gJ0FnZW50JzsKCiAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcnMsIFwlVXNlcjsKICAgIH0KCiAgICByZXR1cm4gQFJlY2lwaWVudFVzZXJzOwp9CgpzdWIgX1NlbmRSZWNpcGllbnROb3RpZmljYXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJJRCBOb3RpZmljYXRpb24gUmVjaXBpZW50IEV2ZW50IFRyYW5zcG9ydCBUcmFuc3BvcnRPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUcmFuc3BvcnRPYmplY3QgPSAkUGFyYW17VHJhbnNwb3J0T2JqZWN0fTsKCiAgICAjIHNlbmQgbm90aWZpY2F0aW9uIHRvIGVhY2ggcmVjaXBpZW50CiAgICBteSAkU3VjY2VzcyA9ICRUcmFuc3BvcnRPYmplY3QtPlNlbmROb3RpZmljYXRpb24oCiAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgPT4gJFBhcmFte05vdGlmaWNhdGlvbn0sCiAgICAgICAgQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0+ICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LAogICAgICAgIFJlY2lwaWVudCAgICAgICAgICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBFdmVudCAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0V2ZW50fSwKICAgICAgICBBdHRhY2htZW50cyAgICAgICAgICAgPT4gJFBhcmFte0F0dGFjaG1lbnRzfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkU3VjY2VzczsKCiAgICBteSAlRXZlbnREYXRhID0gJXsgJFRyYW5zcG9ydE9iamVjdC0+R2V0VHJhbnNwb3J0RXZlbnREYXRhKCkgfTsKCiAgICByZXR1cm4gMSBpZiAhJUV2ZW50RGF0YTsKCiAgICBpZiAoICEkRXZlbnREYXRhe0V2ZW50fSB8fCAhJEV2ZW50RGF0YXtEYXRhfSB8fCAhJEV2ZW50RGF0YXtVc2VySUR9ICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCB0cmlnZ2VyIG5vdGlmaWNhdGlvbiBwb3N0IHNlbmQgZXZlbnQiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9GdXR1cmVUYXNrVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYSBsb2NhbCBhcHBvaW50bWVudCBvYmplY3QKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAjIGdldCB0aGUgbmV4dCB1cGNvbWluZyBhcHBvaW50bWVudAogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCB1cGRhdGUgdXBjb21pbmcgYXBwb2ludG1lbnQgZGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6OlRpY2tldEFwcG9pbnRtZW50czsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpBc3luY2hyb25vdXNFeGVjdXRvcik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEV2ZW50IERhdGEgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQXBwb2ludG1lbnRJRCBpbiBEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29wIHByb3RlY3Rpb246IHByZXZlbnQgZnJvbSBydW5uaW5nIGlmIHVwZGF0ZSB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB0aWNrZXQgdXBkYXRlCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJykKICAgICAgICAtPnsnX1RpY2tldEFwcG9pbnRtZW50czo6VGlja2V0VXBkYXRlJ30KICAgICAgICAtPnsgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0gfSsrCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJ1biBvbmx5IG9uIHRpY2tldCBhcHBvaW50bWVudHMgKGdldCB0aWNrZXQgaWQpCiAgICBteSAkVGlja2V0SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+VGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJFRpY2tldElEOwoKICAgICMgdXBkYXRlIHRpY2tldCBpbiBhbiBhc3luY2hyb25vdXMgY2FsbAogICAgcmV0dXJuICRTZWxmLT5Bc3luY0NhbGwoCiAgICAgICAgT2JqZWN0TmFtZSAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAgICAgRnVuY3Rpb25OYW1lICAgPT4gJ1RpY2tldEFwcG9pbnRtZW50VXBkYXRlVGlja2V0JywKICAgICAgICBGdW5jdGlvblBhcmFtcyA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgIH0sCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXhwb3J0OjpJQ2FsOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIERhdGE6OklDYWw7CnVzZSBEYXRhOjpJQ2FsOjpFbnRyeTo6RXZlbnQ7CnVzZSBEYXRlOjpJQ2FsOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGNvbnN0YW50IFBBQ0tBR0VfTkFNRSA9PiAnT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXInOwoKb3VyICRQYWNrYWdlVmVyc2lvbjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpQYWNrYWdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFeHBvcnQ6OklDYWwgLSBpQ2FsZW5kYXIgZXhwb3J0IGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpFeHBvcnQgZnVuY3Rpb25zIGZvciBpQ2FsZW5kYXIgZm9ybWF0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV4cG9ydDo6SUNhbCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBteSAkUGFja2FnZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQYWNrYWdlJyk7CgogICAgbXkgJFBhY2thZ2VJbnN0YWxsZWQgPSAkUGFja2FnZU9iamVjdC0+UGFja2FnZUlzSW5zdGFsbGVkKAogICAgICAgIE5hbWUgPT4gUEFDS0FHRV9OQU1FLAogICAgKTsKCiAgICAjIElmIHBhY2thZ2UgaXMgaW5zdGFsbGVkLCBnZXQgdmVyc2lvbiBmcm9tIHRoZSBwYWNrYWdlIG1hbmFnZXIuCiAgICBpZiAoJFBhY2thZ2VJbnN0YWxsZWQpIHsKICAgICAgICBteSBATGlzdCA9ICRQYWNrYWdlT2JqZWN0LT5SZXBvc2l0b3J5TGlzdCgKICAgICAgICAgICAgUmVzdWx0ID0+ICdzaG9ydCcsCiAgICAgICAgKTsKCiAgICAgICAgUEFDS0FHRToKICAgICAgICBmb3IgbXkgJFBhY2thZ2UgKEBMaXN0KSB7CiAgICAgICAgICAgIGlmICggJFBhY2thZ2UtPntOYW1lfSBlcSBQQUNLQUdFX05BTUUgKSB7CiAgICAgICAgICAgICAgICAkUGFja2FnZVZlcnNpb24gPSAkUGFja2FnZS0+e1ZlcnNpb259OwogICAgICAgICAgICAgICAgbGFzdCBQQUNLQUdFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgT3RoZXJ3aXNlLCBpbmNsdWRlIGZyYW1ld29yayB2ZXJzaW9uIG9ubHkuCiAgICBlbHNlIHsKICAgICAgICAkUGFja2FnZVZlcnNpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1ZlcnNpb24nKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEV4cG9ydCgpCgpleHBvcnQgY2FsZW5kYXIgdG8gaUNhbGVuZGFyIGZvcm1hdAoKICAgIG15ICRJQ2FsU3RyaW5nID0gJEV4cG9ydE9iamVjdC0+RXhwb3J0KAogICAgICAgIENhbGVuZGFySUQgICA9PiAxLCAgICAjIChyZXF1aXJlZCkgVmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLCAgICAjIChyZXF1aXJlZCkgVXNlcklECiAgICApOwoKcmV0dXJucyBpQ2FsZW5kYXIgc3RyaW5nIGlmIHN1Y2Nlc3NmdWwKCj1jdXQKCnN1YiBFeHBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVDYWxlbmRhciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJENhbGVuZGFye0NhbGVuZGFySUR9OwoKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICBteSBAQXBwb2ludG1lbnRJRHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICApOwoKICAgIG15ICRJQ2FsQ2FsZW5kYXIgPSBEYXRhOjpJQ2FsLT5uZXcoCiAgICAgICAgY2FsbmFtZSA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJOYW1lfSwKICAgICk7CgogICAgIyBleHBvcnQgY29sb3IgZm9yIGFwcGxlIGNhbGVuZGFyCiAgICAkSUNhbENhbGVuZGFyLT5hZGRfcHJvcGVydHkoCiAgICAgICAgJ3gtYXBwbGUtY2FsZW5kYXItY29sb3InID0+ICRDYWxlbmRhcntDb2xvcn0sCiAgICApOwoKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CiAgICBteSAkUGx1Z2luT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwoKICAgIG15ICRUZWFtT2JqZWN0OwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwogICAgfQoKICAgIEFQUE9JTlRNRU5UX0lEOgogICAgZm9yIG15ICRBcHBvaW50bWVudElEIChAQXBwb2ludG1lbnRJRHMpIHsKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGlmICEkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH07CgogICAgICAgICMgY2FsY3VsYXRlIHN0YXJ0IHRpbWUKICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgKTsKICAgICAgICBteSAkSUNhbFN0YXJ0VGltZSA9IERhdGU6OklDYWwtPm5ldygKICAgICAgICAgICAgZXBvY2ggPT4gJFN0YXJ0VGltZSwKICAgICAgICApOwoKICAgICAgICAjIGNhbGN1bGF0ZSBlbmQgdGltZQogICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e0VuZFRpbWV9LAogICAgICAgICk7CiAgICAgICAgbXkgJElDYWxFbmRUaW1lID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICBlcG9jaCA9PiAkRW5kVGltZSwKICAgICAgICApOwoKICAgICAgICAjIHJlY2FsY3VsYXRlIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50LCBkaXNjYXJkIHRpbWUgZGF0YQogICAgICAgIGlmICggJEFwcG9pbnRtZW50e0FsbERheX0gKSB7CiAgICAgICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElDYWxTdGFydFRpbWUgPSBEYXRlOjpJQ2FsLT5uZXcoCiAgICAgICAgICAgICAgICB5ZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICBtb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgZGF5ICAgID0+ICREYXksCiAgICAgICAgICAgICAgICBvZmZzZXQgPT4gJyswMDAwJywgICAgIyBVVEMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElDYWxFbmRUaW1lID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICAgICAgeWVhciAgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgbW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgICAgIGRheSAgICA9PiAkRGF5LAogICAgICAgICAgICAgICAgb2Zmc2V0ID0+ICcrMDAwMCcsICAgICMgVVRDCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBpQ2FsZW5kYXIgZXZlbnQgZW50cnkKICAgICAgICBteSAkSUNhbEV2ZW50ID0gRGF0YTo6SUNhbDo6RW50cnk6OkV2ZW50LT5uZXcoKTsKCiAgICAgICAgIyBvcHRpb25hbCBwcm9wZXJ0aWVzCiAgICAgICAgbXkgJUlDYWxFdmVudFByb3BlcnRpZXM7CgogICAgICAgICMgcmVwZWF0YWJsZSBwcm9wZXJ0aWVzCiAgICAgICAgbXkgQElDYWxSZXBlYXRhYmxlUHJvcGVydGllczsKCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7RGVzY3JpcHRpb259ICkgewogICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tkZXNjcmlwdGlvbn0gPSAkQXBwb2ludG1lbnR7RGVzY3JpcHRpb259OwogICAgICAgIH0KICAgICAgICBpZiAoICRBcHBvaW50bWVudHtMb2NhdGlvbn0gKSB7CiAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze2xvY2F0aW9ufSA9ICRBcHBvaW50bWVudHtMb2NhdGlvbn07CiAgICAgICAgfQogICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmluZ30gKSB7CiAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSA9ICcnOwoKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdEYWlseScgKSB7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gJ0ZSRVE9REFJTFknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfSBlcSAnV2Vla2x5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAnRlJFUT1XRUVLTFknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfSBlcSAnTW9udGhseScgKSB7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gJ0ZSRVE9TU9OVEhMWSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdZZWFybHknICkgewogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICdGUkVRPVlFQVJMWSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21EYWlseScgKSB7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gIkZSRVE9REFJTFk7SU5URVJWQUw9JEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiRlJFUT1XRUVLTFk7SU5URVJWQUw9JEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0iOwoKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBARGF5TmFtZXM7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGF5ICggQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VGcmVxdWVuY3l9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERheSA9PSAxICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5TmFtZXMsICdNTyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF5ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlOYW1lcywgJ1RVJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREYXkgPT0gMyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheU5hbWVzLCAnV0UnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJERheSA9PSA0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5TmFtZXMsICdUSCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF5ID09IDUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlOYW1lcywgJ0ZSJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREYXkgPT0gNiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheU5hbWVzLCAnU0EnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJERheSA9PSA3ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5TmFtZXMsICdTVSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiO0JZREFZPSIgLiBqb2luKCAiLCIsIEBEYXlOYW1lcyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScgKSB7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gIkZSRVE9TU9OVEhMWTtJTlRFUlZBTD0kQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfSI7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gIjtCWU1PTlRIREFZPSIgLiBqb2luKCAiLCIsIEB7ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRnJlcXVlbmN5fSB9ICk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JyApIHsKICAgICAgICAgICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiRlJFUT1ZRUFSTFk7SU5URVJWQUw9JEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH07QllNT05USERBWT0kRGF5IjsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiO0JZTU9OVEg9IiAuIGpvaW4oICIsIiwgQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VGcmVxdWVuY3l9IH0gKTsKCiAgICAgICAgICAgICAgICAjIFJSVUxFOkZSRVE9WUVBUkxZO1VOVElMPTIwMjAwNjAyVDA4MDAwMFo7SU5URVJWQUw9MjtCWU1PTlRIREFZPTE7QllNT05USD00CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkSUNhbFJlY3VycmVuY2VVbnRpbCA9IERhdGU6OklDYWwtPm5ldygKICAgICAgICAgICAgICAgICAgICBlcG9jaCA9PiAkUmVjdXJyZW5jZVVudGlsLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAnO1VOVElMPScgLiBzdWJzdHIoICRJQ2FsUmVjdXJyZW5jZVVudGlsLT5pY2FsKCksIDAsIC0xICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUNvdW50fSApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAnO0NPVU5UPScgLiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUNvdW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRXhjbHVkZX0gKSB7CiAgICAgICAgICAgICAgICBSRUNVUlJFTkNFX0VYQ0xVREU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFJlY3VycmVuY2VFeGNsdWRlICggQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VFeGNsdWRlfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgUkVDVVJSRU5DRV9FWENMVURFIGlmICEkUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICAgICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VJRCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZWN1cnJlbmNlRXhjbHVkZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRJQ2FsUmVjdXJyZW5jZUlEID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICAgICAgICAgICAgICBlcG9jaCA9PiAkUmVjdXJyZW5jZUlELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQElDYWxSZXBlYXRhYmxlUHJvcGVydGllcywgewogICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSA9PiAnZXhkYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEFwcG9pbnRtZW50e0FsbERheX0KICAgICAgICAgICAgICAgICAgICAgICAgPyBzdWJzdHIoICRJQ2FsUmVjdXJyZW5jZUlELT5pY2FsKCksIDAsIC0xICkKICAgICAgICAgICAgICAgICAgICAgICAgOiAkSUNhbFJlY3VycmVuY2VJRC0+aWNhbCgpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb2NjdXJyZW5jZSBhcHBvaW50bWVudAogICAgICAgIGlmICggJEFwcG9pbnRtZW50e1BhcmVudElEfSApIHsKCiAgICAgICAgICAgICMgb3ZlcnJpZGRlbiBvY2N1cnJlbmNlcyBvbmx5CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9CiAgICAgICAgICAgICAgICAmJiBncmVwIHsgKCAkXyAvLyAnJyApIGVxICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9IH0gQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VFeGNsdWRlfSB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGNhbGN1bGF0ZSByZWN1cnJlbmNlIGlkCiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZUlEID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkSUNhbFJlY3VycmVuY2VJRCA9IERhdGU6OklDYWwtPm5ldygKICAgICAgICAgICAgICAgICAgICBlcG9jaCA9PiAkUmVjdXJyZW5jZUlELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3sncmVjdXJyZW5jZS1pZCd9CiAgICAgICAgICAgICAgICAgICAgPSAkQXBwb2ludG1lbnR7QWxsRGF5fSA/IHN1YnN0ciggJElDYWxSZWN1cnJlbmNlSUQtPmljYWwoKSwgMCwgLTEgKSA6ICRJQ2FsUmVjdXJyZW5jZUlELT5pY2FsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2tpcCBpZiBub3Qgb3ZlcnJpZGRlbgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlRfSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2FsY3VsYXRlIGxhc3QgbW9kaWZpZWQgdGltZQogICAgICAgIG15ICRDaGFuZ2VUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e0NoYW5nZVRpbWV9LAogICAgICAgICk7CiAgICAgICAgbXkgJElDYWxDaGFuZ2VUaW1lID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICBlcG9jaCA9PiAkQ2hhbmdlVGltZSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQKICAgICAgICBpZiAoJFRlYW1PYmplY3QpIHsKCiAgICAgICAgICAgICMgaW5jbHVkZSB0ZWFtIG5hbWVzCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1RlYW1JRH0gKSB7CiAgICAgICAgICAgICAgICBteSBAVGVhbXM7CgogICAgICAgICAgICAgICAgIyBnZXQgdGVhbSBuYW1lcwogICAgICAgICAgICAgICAgZm9yIG15ICRUZWFtSUQgKCBAeyAkQXBwb2ludG1lbnR7VGVhbUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICgkVGVhbUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVUZWFtID0gJFRlYW1PYmplY3QtPlRlYW1HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtSUQgPT4gJFRlYW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVGVhbXtOYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1zLCAkVGVhbXtOYW1lfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChAVGVhbXMpIHsKICAgICAgICAgICAgICAgICAgICAkSUNhbEV2ZW50LT5hZGRfcHJvcGVydGllcygKICAgICAgICAgICAgICAgICAgICAgICAgIngtb3Rycy10ZWFtIiA9PiBqb2luKCAnLCcsIEBUZWFtcyApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaW5jbHVkZSByZXNvdXJjZSBuYW1lcwogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZXNvdXJjZUlEfSApIHsKICAgICAgICAgICAgICAgIG15IEBVc2VyczsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBAeyAkQXBwb2ludG1lbnR7UmVzb3VyY2VJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJFVzZXJJRCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRVc2Vye1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBVc2VycywgJFVzZXJ7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChAVXNlcnMpIHsKICAgICAgICAgICAgICAgICAgICAkSUNhbEV2ZW50LT5hZGRfcHJvcGVydGllcygKICAgICAgICAgICAgICAgICAgICAgICAgIngtb3Rycy1yZXNvdXJjZSIgPT4gam9pbiggJywnLCBAVXNlcnMgKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGluY2x1ZGUgcGx1Z2luIChsaW5rKSBkYXRhCiAgICAgICAgbXkgJFBsdWdpbkxpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaXN0KCk7CiAgICAgICAgZm9yIG15ICRQbHVnaW5LZXkgKCBzb3J0IGtleXMgJXskUGx1Z2luTGlzdH0gKSB7CiAgICAgICAgICAgIG15ICRMaW5rTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtMaXN0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXksCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBATGlua0FycmF5OwogICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBMaW5rQXJyYXksICRMaW5rTGlzdC0+eyRMaW5rSUR9LT57TGlua0lEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEBMaW5rQXJyYXkpIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnQtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgICAgICAgICAgICAgICJ4LW90cnMtcGx1Z2luLSRQbHVnaW5LZXkiID0+IGpvaW4oICcsJywgQExpbmtBcnJheSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgYm90aCByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcHJvcGVydGllcwogICAgICAgICMgcmVtb3ZlIHRpbWUgem9uZSBmbGFnIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cwogICAgICAgICRJQ2FsRXZlbnQtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgICAgICBzdW1tYXJ5ICAgICAgICAgPT4gJEFwcG9pbnRtZW50e1RpdGxlfSwKICAgICAgICAgICAgZHRzdGFydCAgICAgICAgID0+ICRBcHBvaW50bWVudHtBbGxEYXl9ID8gc3Vic3RyKCAkSUNhbFN0YXJ0VGltZS0+aWNhbCgpLCAwLCAtMSApIDogJElDYWxTdGFydFRpbWUtPmljYWwoKSwKICAgICAgICAgICAgZHRlbmQgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtBbGxEYXl9ID8gc3Vic3RyKCAkSUNhbEVuZFRpbWUtPmljYWwoKSwgMCwgLTEgKSA6ICRJQ2FsRW5kVGltZS0+aWNhbCgpLAogICAgICAgICAgICB1aWQgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e1VuaXF1ZUlEfSwKICAgICAgICAgICAgJ2xhc3QtbW9kaWZpZWQnID0+ICRJQ2FsQ2hhbmdlVGltZS0+aWNhbCgpLAogICAgICAgICAgICAlSUNhbEV2ZW50UHJvcGVydGllcywKICAgICAgICApOwoKICAgICAgICAjIGFkZCByZXBlYXRhYmxlIHByb3BlcnRpZXMKICAgICAgICBmb3IgbXkgJFJlcGVhdGFibGUgKEBJQ2FsUmVwZWF0YWJsZVByb3BlcnRpZXMpIHsKICAgICAgICAgICAgJElDYWxFdmVudC0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgICAgICAgICAkUmVwZWF0YWJsZS0+e1Byb3BlcnR5fSA9PiAkUmVwZWF0YWJsZS0+e1ZhbHVlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRJQ2FsQ2FsZW5kYXItPmFkZF9lbnRyeSgkSUNhbEV2ZW50KTsKICAgIH0KCiAgICByZXR1cm4gJElDYWxDYWxlbmRhci0+YXNfc3RyaW5nKCk7Cn0KCnsKICAgIG5vIHdhcm5pbmdzICdyZWRlZmluZSc7ICAgICMjIG5vIGNyaXRpYwoKICAgICMgSW5jbHVkZSBwYWNrYWdlIG5hbWUgYW5kIHZlcnNpb24gaW4gcHJvZHVjdCBJRCBwcm9wZXJ0eSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBieSByZWRlZmluaW5nCiAgICAjICAgZXh0ZXJuYWwgbGlicmFyeSBtZXRob2QuCiAgICBzdWIgRGF0YTo6SUNhbDo6cHJvZHVjdF9pZCB7ICAgICMjIG5vIGNyaXRpYwogICAgICAgIHJldHVybiBQQUNLQUdFX05BTUUgLiAnICcgLiAkUGFja2FnZVZlcnNpb247CiAgICB9Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SW1wb3J0OjpJQ2FsOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIERhdGE6OklDYWw7CnVzZSBEYXRhOjpJQ2FsOjpFbnRyeTo6RXZlbnQ7CnVzZSBEYXRlOjpJQ2FsOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SW1wb3J0OjpJQ2FsIC0gaUNhbGVuZGFyIGltcG9ydCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKSW1wb3J0IGZ1bmN0aW9ucyBmb3IgaUNhbGVuZGFyIGZvcm1hdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkSW1wb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFeHBvcnQ6OklDYWwnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBJbXBvcnQoKQoKaW1wb3J0IGNhbGVuZGFyIGluIGlDYWxlbmRhciBmb3JtYXQKICAgIG15ICRTdWNjZXNzID0gJEltcG9ydE9iamVjdC0+SW1wb3J0KAogICAgICAgIENhbGVuZGFySUQgICAgID0+IDEyMywKICAgICAgICBJQ2FsICAgICAgICAgICA9PiAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgaUNhbCBzdHJpbmcKICAgICAgICAgICAgJwogICAgICAgICAgICAgICAgQkVHSU46VkNBTEVOREFSCiAgICAgICAgICAgICAgICBQUk9ESUQ6WmltYnJhLUNhbGVuZGFyLVByb3ZpZGVyCiAgICAgICAgICAgICAgICBWRVJTSU9OOjIuMAogICAgICAgICAgICAgICAgTUVUSE9EOlJFUVVFU1QKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAnLAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQKICAgICAgICBVcGRhdGVFeGlzdGluZyA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRGVsZXRlIGV4aXN0aW5nIEFwcG9pbnRtZW50cyB3aXRoaW4gc2FtZSBDYWxlbmRhciBpZiBVbmlxdWVJRCBtYXRjaGVzCiAgICAgICAgVW50aWxMaW1pdCAgICAgPT4gJzIwMTctMDEtMDEgMDA6MDA6MDAnLCAgIyAob3B0aW9uYWwpIElmIHByb3ZpZGVkLCBzeXN0ZW0gd2lsbCB1c2UgdGhpcyB2YWx1ZSBmb3IgbGltaXRpbmcgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGRlZmluZWQgZW5kIGRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluc3RlYWQgb2YgQXBwb2ludG1lbnRDYWxlbmRhcjo6SW1wb3J0OjpSZWN1cnJpbmdNb250aHNMaW1pdCB0byBkbyB0aGUgY2FsY3VsYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5PVEU6IFBMRUFTRSBVU0UgVEhJUyBQQVJBTUVURVIgRk9SIFVOSVQgVEVTVFMgT05MWQogICAgKTsKCnJldHVybnMgbnVtYmVyIG9mIGltcG9ydGVkIGFwcG9pbnRtZW50cyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgMAoKPWN1dAoKc3ViIEltcG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBJQ2FsIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVW50aWxMaW1pdGVkVGltZXN0YW1wID0gJFBhcmFte1VudGlsTGltaXR9IHx8ICcnOwoKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgaWYgKCAhJFVudGlsTGltaXRlZFRpbWVzdGFtcCApIHsKCiAgICAgICAgIyBjYWxjdWxhdGUgdW50aWwgdGltZSB3aGljaCB3aWxsIGJlIHVzZWQgaWYgdGhlcmUgaXMgYW55IHJlY3VycmluZyBBcHBvaW50bWVudCB3aXRob3V0IGVuZCB0aW1lIGRlZmluZWQuCiAgICAgICAgbXkgJEN1cnJlbnRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwogICAgICAgIG15ICRSZWN1cnJpbmdNb250aHNMaW1pdAogICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiQXBwb2ludG1lbnRDYWxlbmRhcjo6SW1wb3J0OjpSZWN1cnJpbmdNb250aHNMaW1pdCIpCiAgICAgICAgICAgIHx8ICcxMic7ICAgICMgZGVmYXVsdCAxMiBtb250aHMKCiAgICAgICAgbXkgJFVudGlsTGltaXRlZFN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgICAgICBUaW1lICAgPT4gJEN1cnJlbnRTeXN0ZW1UaW1lLAogICAgICAgICAgICBNb250aHMgPT4gJFJlY3VycmluZ01vbnRoc0xpbWl0LAogICAgICAgICk7CiAgICAgICAgJFVudGlsTGltaXRlZFRpbWVzdGFtcCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRVbnRpbExpbWl0ZWRTeXN0ZW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFR1cm4gb24gVVRGOCBmbGFnIG9uIHN1cHBsaWVkIHN0cmluZyBmb3IgY29ycmVjdCBlbmNvZGluZyBpbiBQb3N0Z3JlU1FMIGJhY2tlbmQuCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZUlucHV0KCBcJFBhcmFte0lDYWx9ICk7CgogICAgbXkgJENhbGVuZGFyID0gRGF0YTo6SUNhbC0+bmV3KCBkYXRhID0+ICRQYXJhbXtJQ2FsfSApOwoKICAgICMgSWYgZXh0ZXJuYWwgbGlicmFyeSBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBJQ1MgZmlsZSwgbG9nIHRoZSByZWNlaXZlZCBtZXNzYWdlCiAgICAjICAgYXQgdGhpcyB0aW1lIGFuZCByZXR1cm4uCiAgICBpZiAoICRDYWxlbmRhci0+e2Vycm5vfSApIHsKICAgICAgICBteSAkRXJyb3JNZXNzYWdlID0gJENhbGVuZGFyLT57ZXJyb3JfbWVzc2FnZX0gLy8gJyc7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJbRGF0YTo6SUNhbF0gJEVycm9yTWVzc2FnZSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQEVudHJpZXMgICAgICAgICAgICAgID0gQHsgJENhbGVuZGFyLT5lbnRyaWVzKCkgfTsKICAgIG15ICRBcHBvaW50bWVudHNJbXBvcnRlZCA9IDA7CiAgICBteSAlSUNhbFRpbWVab25lczsKCiAgICBteSAkUGx1Z2luT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoQEVudHJpZXMpIHsKICAgICAgICBteSAkUHJvcGVydGllcyA9ICRFbnRyeS0+cHJvcGVydGllcygpOwoKICAgICAgICBteSAlUGFyYW1ldGVyczsKICAgICAgICBteSAlTGlua2VkT2JqZWN0czsKCiAgICAgICAgIyBQcm9jZXNzIHRpbWV6b25lIGRlZmluaXRpb25zIGZyb20gdGhlIElDYWwgZmlsZS4KICAgICAgICBpZiAoIHJlZiAkRW50cnkgZXEgJ0RhdGE6OklDYWw6OkVudHJ5OjpUaW1lWm9uZScgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsndHppZCd9ICkKICAgICAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eyd0emlkJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eyd0emlkJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRUaW1lem9uZUlEID0gJFByb3BlcnRpZXMtPnsndHppZCd9LT5bMF0tPnsndmFsdWUnfTsKICAgICAgICAgICAgICAgIG15ICRUaW1lem9uZU9mZnNldDsKCiAgICAgICAgICAgICAgICBteSBAVGltZXpvbmVFbnRyaWVzID0gQHsgJEVudHJ5LT5lbnRyaWVzKCkgfTsKICAgICAgICAgICAgICAgIGZvciBteSAkVGltZXpvbmVFbnRyeSAoQFRpbWV6b25lRW50cmllcykgewogICAgICAgICAgICAgICAgICAgIG15ICRUaW1lem9uZVByb3BlcnRpZXMgPSAkVGltZXpvbmVFbnRyeS0+cHJvcGVydGllcygpOwoKICAgICAgICAgICAgICAgICAgICAjIFNhdmUgb25seSBzaW1wbGUgdGltZSB6b25lcywgd2l0aG91dCBkYXlsaWdodCBzYXZpbmdzIHJ1bGVzLgogICAgICAgICAgICAgICAgICAgICMgVE9ETzogRXh0ZW5kIHRvIGluY2x1ZGUgYWxsIG90aGVyIGRlZmluaXRpb25zLCBlc3BlY2lhbGx5IHdpdGggY29tcGxpY2F0ZWQKICAgICAgICAgICAgICAgICAgICAjICAgICAgIHJ1bGVzIGZvciBkYXlsaWdodCBzYXZpbmdzIChzZWUgRWd5cHQpLgogICAgICAgICAgICAgICAgICAgIGlmICggcmVmICRUaW1lem9uZUVudHJ5IGVxICdEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU6OlN0YW5kYXJkJyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhbmRhcmQgdGltZSB6b25lcyBzaG91bGQgaGF2ZSBUWk9GRlNFVFRPIGFuZCBUWk9GRlNFVEZST00gc2V0IHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAjICAgc2FtZSB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkVGltZXpvbmVQcm9wZXJ0aWVzLT57J3R6b2Zmc2V0dG8nfSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWYgJFRpbWV6b25lUHJvcGVydGllcy0+eyd0em9mZnNldHRvJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAkVGltZXpvbmVQcm9wZXJ0aWVzLT57J3R6b2Zmc2V0dG8nfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJFRpbWV6b25lUHJvcGVydGllcy0+eyd0em9mZnNldGZyb20nfSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWYgJFRpbWV6b25lUHJvcGVydGllcy0+eyd0em9mZnNldGZyb20nfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICRUaW1lem9uZVByb3BlcnRpZXMtPnsndHpvZmZzZXRmcm9tJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAkVGltZXpvbmVQcm9wZXJ0aWVzLT57J3R6b2Zmc2V0dG8nfS0+WzBdLT57J3ZhbHVlJ30gZXEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lem9uZVByb3BlcnRpZXMtPnsndHpvZmZzZXRmcm9tJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lem9uZU9mZnNldCA9ICRUaW1lem9uZVByb3BlcnRpZXMtPnsndHpvZmZzZXR0byd9LT5bMF0tPnsndmFsdWUnfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBTa2lwIGRheWxpZ2h0IHNhdmluZ3MgdGltZSB6b25lcywgdGhpcyB3aWxsIGJlIG9mZmxvYWRlZCB0byBEYXRlVGltZTo6VGltZVpvbmUKICAgICAgICAgICAgICAgICAgICAjICAgb2JqZWN0IGZvciBjb21wbGV4aXR5LgogICAgICAgICAgICAgICAgICAgIGVsc2lmICggcmVmICRUaW1lem9uZUVudHJ5IGVxICdEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU6OkRheWxpZ2h0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWV6b25lT2Zmc2V0ID0gdW5kZWY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkVGltZXpvbmVPZmZzZXQgKSB7CgogICAgICAgICAgICAgICAgICAgICMgT2Zmc2V0cyBhcmUgZGVmaW5lZCBhcyBob3VycyBhbmQgbWludXRlcywgaS5lLiAiKzAyMDAiLCB3ZSBuZWVkIGRlY2ltYWwgaG91cnMuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVGltZXpvbmVPZmZzZXQgPX4gLyAoLXxcKyk/IChbMC05XXsyLH0pIChbMC05XXsyLH0pIC94ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU2lnbiAgID0gJDE7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRPZmZzZXQgPSAkMiArICQzIC8gNjA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFNpZ24gZXEgJy0nICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE9mZnNldCAqPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkSUNhbFRpbWVab25lc3skVGltZXpvbmVJRH0gPSAkT2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdWlkCiAgICAgICAgaWYgKAogICAgICAgICAgICBJc0FycmF5UmVmV2l0aERhdGEoICRQcm9wZXJ0aWVzLT57J3VpZCd9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J3VpZCd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eyd1aWQnfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFtZXRlcnN7VW5pcXVlSUR9ID0gJFByb3BlcnRpZXMtPnsndWlkJ30tPlswXS0+eyd2YWx1ZSd9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGl0bGUKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsnc3VtbWFyeSd9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J3N1bW1hcnknfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnsnc3VtbWFyeSd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW1ldGVyc3tUaXRsZX0gPSAkUHJvcGVydGllcy0+eydzdW1tYXJ5J30tPlswXS0+eyd2YWx1ZSd9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZGVzY3JpcHRpb24KICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsnZGVzY3JpcHRpb24nfSApCiAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eydkZXNjcmlwdGlvbid9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eydkZXNjcmlwdGlvbid9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW1ldGVyc3tEZXNjcmlwdGlvbn0gPSAkUHJvcGVydGllcy0+eydkZXNjcmlwdGlvbid9LT5bMF0tPnsndmFsdWUnfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHN0YXJ0IHRpbWUKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J2R0c3RhcnQnfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgbXkgJFRpbWV6b25lSUQ7CgogICAgICAgICAgICBpZiAoIHJlZiAkUHJvcGVydGllcy0+eydkdHN0YXJ0J30tPlswXS0+eydfcGFyYW1ldGVycyd9IGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGl0J3MgYW4gYWxsIGRheSBldmVudAogICAgICAgICAgICAgICAgIyAxKSB0aGVyZSBpcyBubyB0aW1lIGNvbXBvbmVudCBmb3IgdGhlIGRhdGUgdmFsdWUKICAgICAgICAgICAgICAgICMgMikgdGhlcmUgaXMgYW4gZXhwbGljaXQgdmFsdWUgcGFyYW1ldGVyIHNldCB0byBEQVRFCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICRQcm9wZXJ0aWVzLT57J2R0c3RhcnQnfS0+WzBdLT57J3ZhbHVlJ30gPT0gOAogICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAkUHJvcGVydGllcy0+eydkdHN0YXJ0J30tPlswXS0+eydfcGFyYW1ldGVycyd9LT57J1ZBTFVFJ30KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9LT5bMF0tPnsnX3BhcmFtZXRlcnMnfS0+eydWQUxVRSd9IGVxICdEQVRFJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7QWxsRGF5fSA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayB0aW1lem9uZQogICAgICAgICAgICAgICAgaWYgKCAkUHJvcGVydGllcy0+eydkdHN0YXJ0J30tPlswXS0+eydfcGFyYW1ldGVycyd9LT57J1RaSUQnfSApIHsKICAgICAgICAgICAgICAgICAgICAkVGltZXpvbmVJRCA9ICRQcm9wZXJ0aWVzLT57J2R0c3RhcnQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30tPnsnVFpJRCd9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU3RhcnRUaW1lSUNhbCA9ICRTZWxmLT5fRm9ybWF0VGltZSgKICAgICAgICAgICAgICAgIFRpbWUgPT4gJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9LT5bMF0tPnsndmFsdWUnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRUaW1lSUNhbCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkVGltZXpvbmVJRCkgewogICAgICAgICAgICAgICAgbXkgJE9mZnNldCA9ICRJQ2FsVGltZVpvbmVzeyRUaW1lem9uZUlEfSAvLyAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJFRpbWV6b25lSUQsCiAgICAgICAgICAgICAgICAgICAgVGltZSAgICAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdGFydFRpbWUgLT0gJE9mZnNldCAqIDM2MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRQYXJhbWV0ZXJze0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICBteSAkTG9jYWxPZmZzZXQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkxvY2FsVGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdGFydFRpbWUgKz0gJExvY2FsT2Zmc2V0ICogMzYwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnN7U3RhcnRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZW5kIHRpbWUKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsnZHRlbmQnfSApCiAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eydkdGVuZCd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eydkdGVuZCd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkVGltZXpvbmVJRDsKCiAgICAgICAgICAgIGlmICggcmVmICRQcm9wZXJ0aWVzLT57J2R0ZW5kJ30tPlswXS0+eydfcGFyYW1ldGVycyd9IGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHRpbWV6b25lCiAgICAgICAgICAgICAgICBpZiAoICRQcm9wZXJ0aWVzLT57J2R0ZW5kJ30tPlswXS0+eydfcGFyYW1ldGVycyd9LT57J1RaSUQnfSApIHsKICAgICAgICAgICAgICAgICAgICAkVGltZXpvbmVJRCA9ICRQcm9wZXJ0aWVzLT57J2R0ZW5kJ30tPlswXS0+eydfcGFyYW1ldGVycyd9LT57J1RaSUQnfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEVuZFRpbWVJQ2FsID0gJFNlbGYtPl9Gb3JtYXRUaW1lKAogICAgICAgICAgICAgICAgVGltZSA9PiAkUHJvcGVydGllcy0+eydkdGVuZCd9LT5bMF0tPnsndmFsdWUnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEVuZFRpbWVJQ2FsLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRUaW1lem9uZUlEKSB7CiAgICAgICAgICAgICAgICBteSAkT2Zmc2V0ID0gJElDYWxUaW1lWm9uZXN7JFRpbWV6b25lSUR9IC8vICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAkVGltZXpvbmVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRFbmRUaW1lIC09ICRPZmZzZXQgKiAzNjAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkUGFyYW1ldGVyc3tBbGxEYXl9ICkgewogICAgICAgICAgICAgICAgbXkgJExvY2FsT2Zmc2V0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5Mb2NhbFRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEVuZFRpbWUgKz0gJExvY2FsT2Zmc2V0ICogMzYwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnN7RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFNvbWUgaUNhbGVuZGFyIGltcGxlbWVudGF0aW9ucyAobG9va2luZyBhdCB5b3UgaWNhbGVuZGFyLXJ1YnkpIGRvIG5vdCByZXF1aXJlIG5vciBpbmNsdWRlCiAgICAgICAgIyAgIGVuZCB0aW1lIGZvciBhcHBvaW50bWVudHMuIEluIHRoaXMgY2FzZSwgcHJldmVudCBmYWlsaW5nIGFuZCB1c2Ugc3RhcnQgdGltZSBpbnN0ZWFkLgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW1ldGVyc3tFbmRUaW1lfSA9ICRQYXJhbWV0ZXJze1N0YXJ0VGltZX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsb2NhdGlvbgogICAgICAgIGlmICgKICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eydsb2NhdGlvbid9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J2xvY2F0aW9uJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICYmICRQcm9wZXJ0aWVzLT57J2xvY2F0aW9uJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbWV0ZXJze0xvY2F0aW9ufSA9ICRQcm9wZXJ0aWVzLT57J2xvY2F0aW9uJ30tPlswXS0+eyd2YWx1ZSd9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcnJ1bGUKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsncnJ1bGUnfSApCiAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eydycnVsZSd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eydycnVsZSd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAoICRGcmVxdWVuY3ksICRVbnRpbCwgJEludGVydmFsLCAkQ291bnQsICREYXlOYW1lcywgJE1vbnRoRGF5LCAkTW9udGhzICk7CgogICAgICAgICAgICBteSBAUnVsZXMgPSBzcGxpdCAnOycsICRQcm9wZXJ0aWVzLT57J3JydWxlJ30tPlswXS0+eyd2YWx1ZSd9OwoKICAgICAgICAgICAgUlVMRToKICAgICAgICAgICAgZm9yIG15ICRSdWxlIChAUnVsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoICRSdWxlID1+IC9GUkVRPSguKj8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRGcmVxdWVuY3kgPSAkMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFJ1bGUgPX4gL1VOVElMPSguKj8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRVbnRpbCA9ICQxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUnVsZSA9fiAvSU5URVJWQUw9KFxkKz8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRJbnRlcnZhbCA9ICQxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUnVsZSA9fiAvQ09VTlQ9KFxkKz8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRDb3VudCA9ICQxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUnVsZSA9fiAvQllEQVk9KC4qPykkL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJERheU5hbWVzID0gJDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSdWxlID1+IC9CWU1PTlRIREFZPSguKj8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRNb250aERheSA9ICQxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUnVsZSA9fiAvQllNT05USD0oLio/KSQvaSApIHsKICAgICAgICAgICAgICAgICAgICAkTW9udGhzID0gJDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRJbnRlcnZhbCB8fD0gMTsgICAgIyBkZWZhdWx0IHZhbHVlCgogICAgICAgICAgICAjIHRoaXMgYXBwb2ludG1lbnQgaXMgcmVwZWF0aW5nCiAgICAgICAgICAgIGlmICggJEZyZXF1ZW5jeSBlcSAiREFJTFkiICkgewogICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyaW5nfSAgICAgICAgICA9IDE7CiAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgID0gJEludGVydmFsID09IDEgPyAiRGFpbHkiIDogIkN1c3RvbURhaWx5IjsKICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VJbnRlcnZhbH0gPSAkSW50ZXJ2YWw7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEZyZXF1ZW5jeSBlcSAiV0VFS0xZIiApIHsKICAgICAgICAgICAgICAgIGlmICgkRGF5TmFtZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjdXN0b20KCiAgICAgICAgICAgICAgICAgICAgbXkgQERheXM7CgogICAgICAgICAgICAgICAgICAgICMgU1UsTU8sVFUsV0UsVEgsRlIsU0EKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERheU5hbWUgKCBzcGxpdCggJywnLCAkRGF5TmFtZXMgKSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdWMgJERheU5hbWUgZXEgJ01PJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheXMsIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCB1YyAkRGF5TmFtZSBlcSAnVFUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5cywgMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoIHVjICREYXlOYW1lIGVxICdXRScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlzLCAzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggdWMgJERheU5hbWUgZXEgJ1RIJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheXMsIDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCB1YyAkRGF5TmFtZSBlcSAnRlInICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5cywgNTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoIHVjICREYXlOYW1lIGVxICdTQScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlzLCA2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggdWMgJERheU5hbWUgZXEgJ1NVJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheXMsIDc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggc2NhbGFyIEBEYXlzID4gMCApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmluZ30gICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZVR5cGV9ICAgICAgPSAiQ3VzdG9tV2Vla2x5IjsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSAgPSAkSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gXEBEYXlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICMgZWFjaCBuIGRheXMKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJpbmd9ICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgID0gIldlZWtseSI7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSA9ICRJbnRlcnZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRGcmVxdWVuY3kgZXEgIk1PTlRITFkiICkgewoKICAgICAgICAgICAgICAgICMgU2tpcCB1bnN1cHBvcnRlZCBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgcnVsZXM6CiAgICAgICAgICAgICAgICAjICAgLSBGUkVRPU1PTlRITFk7QllEQVk9MlNBCiAgICAgICAgICAgICAgICBpZiAoJERheU5hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTa2lwIGltcG9ydCBvZiB1bnN1cHBvcnRlZCByZWN1cnJpbmcgcnVsZTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkUHJvcGVydGllcy0+eydycnVsZSd9LT5bMF0tPnsndmFsdWUnfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRNb250aERheSkgewoKICAgICAgICAgICAgICAgICAgICAjIEN1c3RvbQogICAgICAgICAgICAgICAgICAgICMgRlJFUT1NT05USExZO1VOVElMPTIwMTcwMTAxVDA4MDAwMFo7QllNT05USERBWT0xNiwzMScKICAgICAgICAgICAgICAgICAgICBteSBARGF5cyA9IHNwbGl0KCAnLCcsICRNb250aERheSApOwoKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJpbmd9ICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZVR5cGV9ICAgICAgPSAiQ3VzdG9tTW9udGhseSI7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQERheXM7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSAgPSAkSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJpbmd9ICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgID0gIk1vbnRobHkiOwogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VJbnRlcnZhbH0gPSAkSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRnJlcXVlbmN5IGVxICJZRUFSTFkiICkgewoKICAgICAgICAgICAgICAgICMgU2tpcCB1bnN1cHBvcnRlZCBjdXN0b20geWVhcmx5IHJlY3VycmluZyBydWxlczoKICAgICAgICAgICAgICAgICMgICAtIEZSRVE9WUVBUkxZO0JZTU9OVEg9MztCWURBWT0tMVNVCiAgICAgICAgICAgICAgICAjICAgLSBGUkVRPVlFQVJMWTtCWU1PTlRIPTEwO0JZREFZPS0xU1UKICAgICAgICAgICAgICAgIGlmICgkRGF5TmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNraXAgaW1wb3J0IG9mIHVuc3VwcG9ydGVkIHJlY3VycmluZyBydWxlOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRQcm9wZXJ0aWVzLT57J3JydWxlJ30tPlswXS0+eyd2YWx1ZSd9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBATW9udGhzID0gc3BsaXQoICcsJywgJE1vbnRocyB8fCAnJyApOwoKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbWV0ZXJze1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgQERhdGUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgc2NhbGFyIEBNb250aHMgPiAxCiAgICAgICAgICAgICAgICAgICAgfHwgKAogICAgICAgICAgICAgICAgICAgICAgICBzY2FsYXIgQE1vbnRocyA9PSAxCiAgICAgICAgICAgICAgICAgICAgICAgICYmICREYXRlWzNdICE9ICRNb250aHNbMF0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmluZ30gICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgICA9ICJDdXN0b21ZZWFybHkiOwogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gXEBNb250aHM7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSAgPSAkSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJpbmd9ICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgID0gIlllYXJseSI7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSA9ICRJbnRlcnZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBGUkVRPVlFQVJMWTtJTlRFUlZBTD0yO0JZTU9OVEg9MSwyLDEyCiAgICAgICAgICAgICMgRlJFUT1NT05USExZO1VOVElMPTIwMTcwMzAyVDEyMTUwMFonCiAgICAgICAgICAgICMgRlJFUT1NT05USExZO1VOVElMPTIwMTcwMjAyVDA5MDAwMFo7SU5URVJWQUw9MjtCWU1PTlRIREFZPTMxJywKICAgICAgICAgICAgIyBGUkVRPVdFRUtMWTtJTlRFUlZBTD0yO0JZREFZPVRVCiAgICAgICAgICAgICMgRlJFUT1ZRUFSTFk7VU5USUw9MjAyMDA2MDJUMDgwMDAwWjtJTlRFUlZBTD0yO0JZTU9OVEhEQVk9MTtCWU1PTlRIPTQnOwoKICAgICAgICAgICAgIyBGUkVRPURBSUxZO0NPVU5UPTMKCiAgICAgICAgICAgIGlmICgkVW50aWwpIHsKICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VVbnRpbH0gPSAkU2VsZi0+X0Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkVW50aWwsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkQ291bnQpIHsKICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VDb3VudH0gPSAkQ291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAjIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VVbnRpbH0gPSAkVW50aWxMaW1pdGVkVGltZXN0YW1wOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGV4Y2x1ZGVkIGRhdGVzCiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eydleGRhdGUnfSApICkgewogICAgICAgICAgICAgICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlOwogICAgICAgICAgICAgICAgZm9yIG15ICRFeGNsdWRlICggQHsgJFByb3BlcnRpZXMtPnsnZXhkYXRlJ30gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAkRXhjbHVkZSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRFeGNsdWRlLT57J3ZhbHVlJ30KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRpbWV6b25lSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVmICRFeGNsdWRlLT57J19wYXJhbWV0ZXJzJ30gZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdGltZXpvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEV4Y2x1ZGUtPnsnX3BhcmFtZXRlcnMnfS0+eydUWklEJ30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWV6b25lSUQgPSAkRXhjbHVkZS0+eydfcGFyYW1ldGVycyd9LT57J1RaSUQnfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEV4Y2x1ZGVUaW1lSUNhbCA9ICRTZWxmLT5fRm9ybWF0VGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgPT4gJEV4Y2x1ZGUtPnsndmFsdWUnfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFeGNsdWRlVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRXhjbHVkZVRpbWVJQ2FsLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRUaW1lem9uZUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkT2Zmc2V0ID0gJElDYWxUaW1lWm9uZXN7JFRpbWV6b25lSUR9IC8vICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAkVGltZXpvbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgID0+ICRFeGNsdWRlVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjbHVkZVRpbWUgLT0gJE9mZnNldCAqIDM2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRQYXJhbWV0ZXJze0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkTG9jYWxPZmZzZXQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkxvY2FsVGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkRXhjbHVkZVRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEV4Y2x1ZGVUaW1lICs9ICRMb2NhbE9mZnNldCAqIDM2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFJlY3VycmVuY2VFeGNsdWRlLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEV4Y2x1ZGVUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VFeGNsdWRlfSA9IFxAUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAogICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsIFNpbGVudCA9PiAxICkgKSB7CgogICAgICAgICAgICAjIGdldCB0ZWFtCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsneC1vdHJzLXRlYW0nfSApCiAgICAgICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnsneC1vdHJzLXRlYW0nfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgICAgICYmICRQcm9wZXJ0aWVzLT57J3gtb3Rycy10ZWFtJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15IEBUZWFtcyA9IHNwbGl0KCAiLCIsICRQcm9wZXJ0aWVzLT57J3gtb3Rycy10ZWFtJ30tPlswXS0+eyd2YWx1ZSd9ICk7CgogICAgICAgICAgICAgICAgaWYgKEBUZWFtcykgewogICAgICAgICAgICAgICAgICAgIG15IEBUZWFtSURzOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB0ZWFtIGlkcwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVGVhbU5hbWUgKEBUZWFtcykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlVGVhbSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpLT5UZWFtR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICRUZWFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAVGVhbUlEcywgJFRlYW17SUR9IGlmICRUZWFte0lEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7VGVhbUlEfSA9IFxAVGVhbUlEcyBpZiBAVGVhbUlEczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcmVzb3VyY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eyd4LW90cnMtcmVzb3VyY2UnfSApCiAgICAgICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnsneC1vdHJzLXJlc291cmNlJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eyd4LW90cnMtcmVzb3VyY2UnfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgQFJlc291cmNlcyA9IHNwbGl0KCAiLCIsICRQcm9wZXJ0aWVzLT57J3gtb3Rycy1yZXNvdXJjZSd9LT5bMF0tPnsndmFsdWUnfSApOwoKICAgICAgICAgICAgICAgIGlmIChAUmVzb3VyY2VzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQFVzZXJzOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGlkcwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVXNlckxvZ2luIChAUmVzb3VyY2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFVzZXJzLCAkVXNlcklEIGlmICRVc2VySUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1Jlc291cmNlSUR9ID0gXEBVc2VycyBpZiBAVXNlcnM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGF2YWlsYWJsZSBwbHVnaW4ga2V5cyBzdWl0YWJsZSBmb3IgbG93ZXJjYXNlIHNlYXJjaAogICAgICAgIG15ICRQbHVnaW5LZXlzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luS2V5cygpOwoKICAgICAgICAjIHBsdWdpbiBmaWVsZHMgKHN0YXJ0IHdpdGggJ3gtb3Rycy1wbHVnaW4tJykKICAgICAgICBteSBAUGx1Z2luRmllbGRzID0gZ3JlcCB7ICRfID1+IC94LW90cnMtcGx1Z2luLS9pIH0ga2V5cyAleyRQcm9wZXJ0aWVzfTsKCiAgICAgICAgUExVR0lORklFTEQ6CiAgICAgICAgZm9yIG15ICRQbHVnaW5GaWVsZCAoQFBsdWdpbkZpZWxkcykgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBJc0FycmF5UmVmV2l0aERhdGEoICRQcm9wZXJ0aWVzLT57JFBsdWdpbkZpZWxkfSApCiAgICAgICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnskUGx1Z2luRmllbGR9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnskUGx1Z2luRmllbGR9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgbG93ZXJjYXNlIHBsdWdpbiBrZXkKICAgICAgICAgICAgICAgICRQbHVnaW5GaWVsZCA9fiAveC1vdHJzLXBsdWdpbi0oLiopJC87CiAgICAgICAgICAgICAgICBteSAkUGx1Z2luS2V5TEMgPSAkMTsKCiAgICAgICAgICAgICAgICAjIGdldCBwcm9wZXIgcGx1Z2luIGtleQogICAgICAgICAgICAgICAgbXkgJFBsdWdpbktleSA9ICRQbHVnaW5LZXlzLT57JFBsdWdpbktleUxDfTsKICAgICAgICAgICAgICAgIG5leHQgUExVR0lORklFTEQgaWYgISRQbHVnaW5LZXk7CgogICAgICAgICAgICAgICAgbXkgQFBsdWdpbkRhdGEgPSBzcGxpdCggIiwiLCAkUHJvcGVydGllcy0+eyRQbHVnaW5GaWVsZH0tPlswXS0+eyd2YWx1ZSd9ICk7CiAgICAgICAgICAgICAgICAkTGlua2VkT2JqZWN0c3skUGx1Z2luS2V5fSA9IFxAUGx1Z2luRGF0YTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbmV4dCBFTlRSWSBpZiAhJFBhcmFtZXRlcnN7VGl0bGV9OwoKICAgICAgICBteSAlQXBwb2ludG1lbnQ7CgogICAgICAgICMgZ2V0IHJlY3VycmVuY2UgaWQKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsncmVjdXJyZW5jZS1pZCd9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J3JlY3VycmVuY2UtaWQnfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnsncmVjdXJyZW5jZS1pZCd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIGdldCBwYXJlbnQgaWQKICAgICAgICAgICAgbXkgJVBhcmVudEFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIFVuaXF1ZUlEICAgPT4gJFBhcmFtZXRlcnN7VW5pcXVlSUR9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISVQYXJlbnRBcHBvaW50bWVudDsKCiAgICAgICAgICAgICRQYXJhbWV0ZXJze1BhcmVudElEfSA9ICRQYXJlbnRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfTsKCiAgICAgICAgICAgIG15ICRUaW1lem9uZUlEOwogICAgICAgICAgICBpZiAoIHJlZiAkUHJvcGVydGllcy0+eydyZWN1cnJlbmNlLWlkJ30tPlswXS0+eydfcGFyYW1ldGVycyd9IGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHRpbWV6b25lCiAgICAgICAgICAgICAgICBpZiAoICRQcm9wZXJ0aWVzLT57J3JlY3VycmVuY2UtaWQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30tPnsnVFpJRCd9ICkgewogICAgICAgICAgICAgICAgICAgICRUaW1lem9uZUlEID0gJFByb3BlcnRpZXMtPnsncmVjdXJyZW5jZS1pZCd9LT5bMF0tPnsnX3BhcmFtZXRlcnMnfS0+eydUWklEJ307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlSURJQ2FsID0gJFNlbGYtPl9Gb3JtYXRUaW1lKAogICAgICAgICAgICAgICAgVGltZSA9PiAkUHJvcGVydGllcy0+eydyZWN1cnJlbmNlLWlkJ30tPlswXS0+eyd2YWx1ZSd9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkUmVjdXJyZW5jZUlEID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZWN1cnJlbmNlSURJQ2FsLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRUaW1lem9uZUlEKSB7CiAgICAgICAgICAgICAgICBteSAkT2Zmc2V0ID0gJElDYWxUaW1lWm9uZXN7JFRpbWV6b25lSUR9IC8vICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAkVGltZXpvbmVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgID0+ICRSZWN1cnJlbmNlSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFJlY3VycmVuY2VJRCAtPSAkT2Zmc2V0ICogMzYwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhJFBhcmFtZXRlcnN7QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgIG15ICRMb2NhbE9mZnNldCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+TG9jYWxUaW1lem9uZU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRSZWN1cnJlbmNlSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFJlY3VycmVuY2VJRCArPSAkTG9jYWxPZmZzZXQgKiAzNjAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZUlEfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkUmVjdXJyZW5jZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgZXhpc3Rpbmcgb3ZlcnJpZGRlbiBvY2N1cnJlbmNlCiAgICAgICAgICAgICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGVPY2N1cnJlbmNlKAogICAgICAgICAgICAgICAgVW5pcXVlSUQgICAgID0+ICRQYXJhbWV0ZXJze1VuaXF1ZUlEfSwKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSZWN1cnJlbmNlSUQgPT4gJFBhcmFte1JlY3VycmVuY2VJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGlmIGFwcG9pbnRtZW50IHdpdGggc2FtZSBVbmlxdWVJRCBpbiB0aGUgc2FtZSBjYWxlbmRhciBhbHJlYWR5IGV4aXN0cy4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIFVuaXF1ZUlEICAgPT4gJFBhcmFtZXRlcnN7VW5pcXVlSUR9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgICYmICggISRQYXJhbXtVcGRhdGVFeGlzdGluZ30gfHwgJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9ICE9ICRQYXJhbXtDYWxlbmRhcklEfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgSWYgb3ZlcndyaXRlIG9wdGlvbiBpc24ndCBhY3RpdmF0ZWQsIGNyZWF0ZSBuZXcgYXBwb2ludG1lbnQgYnkgY2xlYXJpbmcgdGhlIFVuaXF1ZUlELgogICAgICAgICAgICAgICAgaWYgKCVBcHBvaW50bWVudCkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW1ldGVyc3tVbmlxdWVJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Y2Nlc3M7CgogICAgICAgICMgYXBwb2ludG1lbnQgZXhpc3RzIGluIHNhbWUgQ2FsZW5kYXIsIHVwZGF0ZSBpdAogICAgICAgIGlmICgKICAgICAgICAgICAgJUFwcG9pbnRtZW50CiAgICAgICAgICAgICYmICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfQogICAgICAgICAgICAmJiAkUGFyYW17Q2FsZW5kYXJJRH0gPT0gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgJVBhcmFtZXRlcnMsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHRoZXJlIGlzIG5vIGFwcG9pbnRtZW50LCBjcmVhdGUgbmV3IG9uZQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAlUGFyYW1ldGVycywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkU3VjY2VzcykgewoKICAgICAgICAgICAgUExVR0lOS0VZOgogICAgICAgICAgICBmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAlTGlua2VkT2JqZWN0cyApIHsKICAgICAgICAgICAgICAgIG5leHQgUExVR0lOS0VZIGlmICFJc0FycmF5UmVmV2l0aERhdGEoICRMaW5rZWRPYmplY3RzeyRQbHVnaW5LZXl9ICk7CgogICAgICAgICAgICAgICAgIyBhZGQgbGlua3MKICAgICAgICAgICAgICAgIGZvciBteSAkUGx1Z2luRGF0YSAoIEB7ICRMaW5rZWRPYmplY3RzeyRQbHVnaW5LZXl9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExpbmtTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkU3VjY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ICAgICA9PiAkUGx1Z2luS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5EYXRhICAgID0+ICRQbHVnaW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRMaW5rU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIG9iamVjdCBsaW5rIChBcHBvaW50bWVudElEPSRTdWNjZXNzIC0gJFBsdWdpbktleT0kUGx1Z2luRGF0YSkgZHVyaW5nIGNhbGVuZGFyIGltcG9ydCEiCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXBwb2ludG1lbnRzSW1wb3J0ZWQrKzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRBcHBvaW50bWVudHNJbXBvcnRlZDsKfQoKc3ViIF9Gb3JtYXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUaW1lU3RhbXA7CgogICAgaWYgKCAkUGFyYW17VGltZX0gPX4gLyhcZHs0fSkoXGR7Mn0pKFxkezJ9KVQoXGR7Mn0pKFxkezJ9KShcZHsyfSkvaSApIHsKCiAgICAgICAgIyBmb3JtYXQgc3RyaW5nCiAgICAgICAgJFRpbWVTdGFtcCA9ICIkMS0kMi0kMyAkNDokNTokNiI7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtUaW1lfSA9fiAvKFxkezR9KShcZHsyfSkoXGR7Mn0pLyApIHsKCiAgICAgICAgIyBvbmx5IGRhdGUgaXMgZ2l2ZW4gKHdpdGhvdXQgdGltZSkKICAgICAgICAkVGltZVN0YW1wID0gIiQxLSQyLSQzIDAwOjAwOjAwIjsKICAgIH0KCiAgICByZXR1cm4gJFRpbWVTdGFtcDsKfQoKewogICAgbm8gd2FybmluZ3MgJ3JlZGVmaW5lJzsgICAgIyMgbm8gY3JpdGljCgogICAgIyBJbmNsdWRlIGFkZGl0aW9uYWwgb3B0aW9uYWwgcmVwZWF0YWJsZSBwcm9wZXJ0aWVzIHVzZWQgYnkgc29tZSBpQ2FsZW5kYXIgaW1wbGVtZW50YXRpb25zLCBpbiBvcmRlcgogICAgIyAgIHRvIHByZXZlbnQgUGVybCB3YXJuaW5ncy4KICAgIHN1YiBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06Om9wdGlvbmFsX3JlcGVhdGFibGVfcHJvcGVydGllcyB7ICAgICMjIG5vIGNyaXRpYwogICAgICAgIHF3KAogICAgICAgICAgICB1aWQgYWNrbm93bGVkZ2VkIHJlbGF0ZWQtdG8gZGVzY3JpcHRpb24KICAgICAgICApOwogICAgfQp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpEeW5hbWljRmllbGQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpEeW5hbWljRmllbGQgLSBEeW5hbWljRmllbGQgYXBwb2ludG1lbnQgdHlwZQoKPWhlYWQxIFNZTk9QU0lTCgpEeW5hbWljRmllbGQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRpY2tldER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpEeW5hbWljRmllbGQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBHZXRUaW1lKCkKCnJldHVybnMgdGltZSB2YWx1ZSBmb3IgZHluYW1pYyBmaWVsZCBhcHBvaW50bWVudCB0eXBlLgoKICAgIG15ICRTdGFydFRpbWUgPSAkVGlja2V0RHluYW1pY0ZpZWxkT2JqZWN0LT5HZXRUaW1lKAogICAgICAgIFR5cGUgICAgID0+ICdEeW5hbWljRmllbGRfVGVzdERhdGUnLAogICAgICAgIFRpY2tldElEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEdldFRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFR5cGUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGRhdGEgaW5jbC4gZHluYW1pYyBmaWVsZHMKICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKICAgIHJldHVybiBpZiAhJFRpY2tldHsgJFBhcmFte1R5cGV9IH07CgogICAgIyBjaGVjayBpZiB3ZSBmb3VuZCBhIHZhbGlkIHRpbWUgdmFsdWUgYW5kIHJldHVybiBpdAogICAgaWYgKCAkVGlja2V0eyAkUGFyYW17VHlwZX0gfSA9fiAnXGR7NH0tXGR7Mn0tXGR7Mn0gXGR7Mn06XGR7Mn06XGR7Mn0nICkgewogICAgICAgIHJldHVybiAkVGlja2V0eyAkUGFyYW17VHlwZX0gfTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIFNldFRpbWUoKQoKc2V0IHRpY2tldCBkeW5hbWljIGZpZWxkIHZhbHVlIHRvIHN1cHBsaWVkIHRpbWUgdmFsdWUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0RHluYW1pY0ZpZWxkT2JqZWN0LT5TZXRUaW1lKAogICAgICAgIFR5cGUgICAgID0+ICdEeW5hbWljRmllbGRfVGVzdERhdGUnLAogICAgICAgIFZhbHVlICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJwogICAgICAgIFRpY2tldElEID0+IDEsCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgU2V0VGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVHlwZSBWYWx1ZSBUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGRhdGEKICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJFBhcmFte1R5cGV9OwogICAgJER5bmFtaWNGaWVsZE5hbWUgPX4gcy9eRHluYW1pY0ZpZWxkXy8vOwogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICApOwogICAgcmV0dXJuIGlmICEkRHluYW1pY0ZpZWxkOwoKICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWUKICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZFZhbHVlJyktPlZhbHVlU2V0KAogICAgICAgIEZpZWxkSUQgID0+ICREeW5hbWljRmllbGQtPntJRH0sCiAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBWYWx1ZSAgICA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlRGF0ZVRpbWUgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpFc2NhbGF0aW9uVGltZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpFc2NhbGF0aW9uVGltZSAtIEVzY2FsYXRpb25UaW1lIGFwcG9pbnRtZW50IHR5cGUKCj1oZWFkMSBTWU5PUFNJUwoKRXNjYWxhdGlvblRpbWUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRpY2tldEVzY2FsYXRpb25UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkVzY2FsYXRpb25UaW1lJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gR2V0VGltZSgpCgpyZXR1cm5zIHRpbWUgdmFsdWUgZm9yIGVzY2FsYXRpb24gdGltZSBhcHBvaW50bWVudCB0eXBlLgoKICAgIG15ICRTb2x1dGlvblRpbWUgPSAkVGlja2V0RXNjYWxhdGlvblRpbWVPYmplY3QtPkdldFRpbWUoCiAgICAgICAgVHlwZSAgICAgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgR2V0VGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVHlwZSBUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICEkVGlja2V0eyAkUGFyYW17VHlwZX0gLiAnRGVzdGluYXRpb25EYXRlJyB9OwoKICAgICMgcmV0dXJuIGVzY2FsYXRpb24gZGVzdGluYXRpb24gZGF0ZQogICAgcmV0dXJuICRUaWNrZXR7ICRQYXJhbXtUeXBlfSAuICdEZXN0aW5hdGlvbkRhdGUnIH07Cn0KCj1pdGVtIFNldFRpbWUoKQoKZG9lcyBub3RoaW5nLCBhcyB5b3UgY2Fubm90IGV4cGxpY2l0bHkgc2V0IHRpY2tldCBlc2NhbGF0aW9uIHRpbWVzLgpyZXR1cm5zIDEgdG8gcHJldmVudCBlcnJvcnMgaW4gbG9nLgoKPWN1dAoKc3ViIFNldFRpbWUgewogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpQZW5kaW5nVGltZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RXNjYWxhdGlvblRpbWUgLSBQZW5kaW5nVGltZSBhcHBvaW50bWVudCB0eXBlCgo9aGVhZDEgU1lOT1BTSVMKClBlbmRpbmdUaW1lIHRpY2tldCBhcHBvaW50bWVudCB0eXBlLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRUaWNrZXRQZW5kaW5nVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpQZW5kaW5nVGltZScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEdldFRpbWUoKQoKcmV0dXJucyB0aW1lIHZhbHVlIGZvciBwZW5kaW5nIHRpbWUgYXBwb2ludG1lbnQgdHlwZS4KCiAgICBteSAkUGVuZGluZ1RpbWUgPSAkVGlja2V0UGVuZGluZ1RpbWVPYmplY3QtPkdldFRpbWUoCiAgICAgICAgVHlwZSAgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBHZXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUeXBlIFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICk7CiAgICByZXR1cm4gaWYgISRUaWNrZXR7VW50aWxUaW1lfTsKCiAgICAjIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgcmV0dXJuIHBlbmRpbmcgdGltZQogICAgcmV0dXJuICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpICsgJFRpY2tldHtVbnRpbFRpbWV9LAogICAgKTsKfQoKPWl0ZW0gU2V0VGltZSgpCgpzZXQgdGlja2V0IHBlbmRpbmcgdGltZSB0byBzdXBwbGllZCB0aW1lIHZhbHVlLgoKICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFBlbmRpbmdUaW1lT2JqZWN0LT5TZXRUaW1lKAogICAgICAgIFR5cGUgICAgID0+ICdQZW5kaW5nVGltZScsCiAgICAgICAgVmFsdWUgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnCiAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bC4KCj1jdXQKCnN1YiBTZXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUeXBlIFZhbHVlIFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNhbGVuZGFyIGhlbHBlciBvYmplY3QKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBnZXQgZGF0ZSBjb21wb25lbnRzCiAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoIFN0cmluZyA9PiAkUGFyYW17VmFsdWV9ICksCiAgICApOwoKICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgIFllYXIgICAgID0+ICRZZWFyLAogICAgICAgIE1vbnRoICAgID0+ICRNb250aCwKICAgICAgICBEYXkgICAgICA9PiAkRGF5LAogICAgICAgIEhvdXIgICAgID0+ICRIb3VyLAogICAgICAgIE1pbnV0ZSAgID0+ICRNaW51dGUsCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkNhbGVuZGFyQXBwb2ludG1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpEYWVtb25Nb2R1bGVzOjpCYXNlVGFza1dvcmtlcik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpEYWVtb25Nb2R1bGVzOjpTY2hlZHVsZXJUYXNrV29ya2VyOjpDYWxlbmRhckFwcG9pbnRtZW50IC0gU2NoZWR1bGVyIGRhZW1vbiB0YXNrIGhhbmRsZXIgbW9kdWxlIGZvciBDYWxlbmRhckFwcG9pbnRtZW50Cgo9aGVhZDEgU1lOT1BTSVMKClRoaXMgdGFzayBoYW5kbGVyIGV4ZWN1dGVzIGNhbGVuZGFyIGFwcG9pbnRtZW50IGpvYnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRhc2tIYW5kbGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tR2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpEYWVtb25Nb2R1bGVzOjpTY2hlZHVsZXJUYXNrV29ya2VyOjpDYWxlbmRhckFwcG9pbnRtZW50Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0RlYnVnfSAgICAgID0gJFBhcmFte0RlYnVnfTsKICAgICRTZWxmLT57V29ya2VyTmFtZX0gPSAnV29ya2VyOiBDYWxlbmRhckFwcG9pbnRtZW50JzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJ1bigpCgpwZXJmb3JtcyB0aGUgc2VsZWN0ZWQgdGFzay4KCiAgICBteSAkUmVzdWx0ID0gJFRhc2tIYW5kbGVyT2JqZWN0LT5SdW4oCiAgICAgICAgVGFza0lEICAgPT4gMTIzLAogICAgICAgIFRhc2tOYW1lID0+ICdzb21lIG5hbWUnLCAgICAjIG9wdGlvbmFsCiAgICAgICAgRGF0YSAgICAgPT4geyAgICAgICAgICAgICAgICMgYXBwb2ludG1lbnQgaWQgYXMgZ290IGZyb20gS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudDo6QXBwb2ludG1lbnRHZXQoKQogICAgICAgICAgICBOb3RpZnlUaW1lID0+ICcyMDE2LTA4LTAyIDAzOjU5OjAwJywKICAgICAgICB9LAogICAgKTsKClJldHVybnM6CgogICAgJFJlc3VsdCA9IDE7ICMgb3IgZmFpbCBpbiBjYXNlIG9mIGFuIGVycm9yCgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB0YXNrIHBhcmFtcwogICAgbXkgJENoZWNrUmVzdWx0ID0gJFNlbGYtPl9DaGVja1Rhc2tQYXJhbXMoCiAgICAgICAgJVBhcmFtLAogICAgICAgIE5lZWRlZERhdGFBdHRyaWJ1dGVzID0+IFsnTm90aWZ5VGltZSddLAogICAgKTsKCiAgICAjIHN0b3AgZXhlY3V0aW9uIGlmIGFuIGVycm9yIGluIHBhcmFtcyBpcyBkZXRlY3RlZAogICAgcmV0dXJuIGlmICEkQ2hlY2tSZXN1bHQ7CgogICAgIyB0cmlnZ2VyIHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24KICAgIG15ICRTdWNjZXNzCiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uKCAleyAkUGFyYW17RGF0YX0gfSApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHRyaWdnZXIgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIGZvciBBcHBvaW50bWVudElEICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ISIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudAoKPWhlYWQxIFNZTk9QU0lTCgpBcHBvaW50bWVudCBiYWNrZW5kIGZvciB0aGUgYXBwb2ludG1lbnQgbGluayBvYmplY3QuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJExpbmtPYmplY3RBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIExpbmtMaXN0V2l0aERhdGEoKQoKZmlsbCB1cCB0aGUgbGluayBsaXN0IHdpdGggZGF0YQoKICAgICRTdWNjZXNzID0gJExpbmtPYmplY3RCYWNrZW5kLT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIExpbmtMaXN0ICAgICAgICAgICAgICAgICAgICAgPT4gJEhhc2hSZWYsCiAgICAgICAgSWdub3JlTGlua2VkVGlja2V0U3RhdGVUeXBlcyA9PiAwfDEsICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rTGlzdFdpdGhEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KExpbmtMaXN0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgICMgY2hlY2sgbGluayBsaXN0CiAgICBpZiAoIHJlZiAkUGFyYW17TGlua0xpc3R9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0xpbmtMaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fSB9ICkgewoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfSB9ICkgewoKICAgICAgICAgICAgQVBQT0lOVE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgYXBwb2ludG1lbnQgZGF0YQogICAgICAgICAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBpZCBmcm9tIGhhc2ggaWYgbm8gc2VydmljZSBkYXRhIHdhcyBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJUFwcG9pbnRtZW50ICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JEFwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgYXBwb2ludG1lbnQgZGF0YQogICAgICAgICAgICAgICAgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufS0+eyRBcHBvaW50bWVudElEfSA9IFwlQXBwb2ludG1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9iamVjdFBlcm1pc3Npb24oKQoKY2hlY2tzIHJlYWQgcGVybWlzc2lvbiBmb3IgYSBnaXZlbiBvYmplY3QgYW5kIFVzZXJJRC4KCiAgICAkUGVybWlzc2lvbiA9ICRMaW5rT2JqZWN0LT5PYmplY3RQZXJtaXNzaW9uKAogICAgICAgIE9iamVjdCAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBLZXkgICAgID0+IDEyMywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdFBlcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgVE9ETzogUGVybWlzc2lvbiBoYW5kbGluZwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBPYmplY3REZXNjcmlwdGlvbkdldCgpCgpyZXR1cm4gYSBoYXNoIG9mIG9iamVjdCBkZXNjcmlwdGlvbnMKClJldHVybgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAxMjMsCiAgICAgICAgTG9uZyAgID0+ICJUaGUgQXBwb2ludG1lbnQgVGl0bGUiLAogICAgKTsKCiAgICAlRGVzY3JpcHRpb24gPSAkTGlua09iamVjdC0+T2JqZWN0RGVzY3JpcHRpb25HZXQoCiAgICAgICAgS2V5ICAgICA9PiAxMjMsCiAgICAgICAgTW9kZSAgICA9PiAnVGVtcG9yYXJ5JywgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGVzY3JpcHRpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGRlc2NyaXB0aW9uCiAgICBteSAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgTG9uZyAgID0+ICdBcHBvaW50bWVudCcsCiAgICApOwoKICAgIHJldHVybiAlRGVzY3JpcHRpb24gaWYgJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCB0aWNrZXQKICAgIG15ICVBcHBvaW50bWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17S2V5fSwKICAgICk7CgogICAgcmV0dXJuIGlmICElQXBwb2ludG1lbnQ7CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgIExvbmcgICA9PiAkQXBwb2ludG1lbnR7VGl0bGV9LAogICAgKTsKCiAgICByZXR1cm4gJURlc2NyaXB0aW9uOwp9Cgo9aXRlbSBPYmplY3RTZWFyY2goKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHRoZSBzZWFyY2ggcmVzdWx0cwoKUmV0dXJuCiAgICAkU2VhcmNoTGlzdCA9IHsKICAgICAgICBOT1RMSU5LRUQgPT4gewogICAgICAgICAgICBTb3VyY2UgPT4gewogICAgICAgICAgICAgICAgMTIgID0+ICREYXRhT2ZJdGVtMTIsCiAgICAgICAgICAgICAgICAyMTIgPT4gJERhdGFPZkl0ZW0yMTIsCiAgICAgICAgICAgICAgICAzMzIgPT4gJERhdGFPZkl0ZW0zMzIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH07CgogICAgJFNlYXJjaExpc3QgPSAkTGlua09iamVjdEJhY2tlbmQtPk9iamVjdFNlYXJjaCgKICAgICAgICBTdWJPYmplY3QgICAgPT4gJ0JsYScsICAgICAjIChvcHRpb25hbCkKICAgICAgICBTZWFyY2hQYXJhbXMgPT4gJEhhc2hSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHBhcmFtcwogICAgJFBhcmFte1NlYXJjaFBhcmFtc30gfHw9IHt9OwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICBteSAlU2VhcmNoOwogICAgbXkgQENhbGVuZGFySURzOwogICAgbXkgQEFwcG9pbnRtZW50czsKCiAgICAjIFNlYXJjaCBieSBhcHBvaW50bWVudCB0aXRsZSBhbmQgZGVzY3JpcHRpb24sIGlmIHN1cHBsaWVkLiBUaGUgY29udmVyc2lvbiBvZiBwYXJhbWV0ZXIgbmFtZXMgaXMKICAgICMgICBuZWNlc3NhcnksIHNpbmNlIGxpbmsgb2JqZWN0IHNlYXJjaCBwYXJhbWV0ZXJzIHNob3VsZCBoYXZlIHVuaXF1ZSBuYW1lcy4KICAgIGlmICggJFBhcmFte1NlYXJjaFBhcmFtc30tPntBcHBvaW50bWVudFRpdGxlfSApIHsKICAgICAgICAkU2VhcmNoe1RpdGxlfSA9ICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnRUaXRsZX07CiAgICB9CiAgICBpZiAoICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnREZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgJFNlYXJjaHtEZXNjcmlwdGlvbn0gPSAkUGFyYW17U2VhcmNoUGFyYW1zfS0+e0FwcG9pbnRtZW50RGVzY3JpcHRpb259OwogICAgfQoKICAgICMgU2VhcmNoIGJ5IHNwZWNpZmljIGNhbGVuZGFyIElEcy4KICAgIGlmICgKICAgICAgICAkUGFyYW17U2VhcmNoUGFyYW1zfS0+e0FwcG9pbnRtZW50Q2FsZW5kYXJJRH0KICAgICAgICAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnRDYWxlbmRhcklEfSApCiAgICAgICAgKQogICAgewogICAgICAgIEBDYWxlbmRhcklEcyA9IEB7ICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnRDYWxlbmRhcklEfSB9OwogICAgfQoKICAgICMgU2VhcmNoIGluIGFsbCBhdmFpbGFibGUgY2FsZW5kYXJzIGZvciB0aGUgdXNlci4KICAgIGVsc2UgewogICAgICAgIG15IEBDYWxlbmRhckxpc3QgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAncncnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgQENhbGVuZGFySURzID0gbWFwIHsgJF8tPntDYWxlbmRhcklEfSB9IEBDYWxlbmRhckxpc3Q7CiAgICB9CgogICAgZm9yIG15ICRDYWxlbmRhcklEIChAQ2FsZW5kYXJJRHMpIHsKICAgICAgICBteSBAQ2FsZW5kYXJBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgJVNlYXJjaCwKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBBcHBvaW50bWVudHMsIEBDYWxlbmRhckFwcG9pbnRtZW50czsKICAgIH0KCiAgICAjIGFkZCBhcHBvaW50bWVudCBkYXRhCiAgICBteSAlU2VhcmNoTGlzdDsKICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAkU2VhcmNoTGlzdHtOT1RMSU5LRUR9LT57U291cmNlfS0+eyAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSB9ID0gJEFwcG9pbnRtZW50OwogICAgfQoKICAgIHJldHVybiBcJVNlYXJjaExpc3Q7Cn0KCj1pdGVtIExpbmtBZGRQcmUoKQoKbGluayBhZGQgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rQWRkUG9zdCgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rQWRkUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rRGVsZXRlUHJlKCkKCmxpbmsgZGVsZXRlIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUHJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQb3N0KCkKCmxpbmsgZGVsZXRlIHBvc3QgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpUaWNrZXRBcHBvaW50bWVudHM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6QXN5bmNocm9ub3VzRXhlY3V0b3IpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXtEYXRhfS0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIGluIERhdGEhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb3AgcHJvdGVjdGlvbjogb25seSBleGVjdXRlIHRoaXMgaGFuZGxlciBvbmNlIGZvciBlYWNoIHRpY2tldAogICAgaWYgKAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKQogICAgICAgIC0+eydfVGlja2V0QXBwb2ludG1lbnRzOjpBbHJlYWR5UHJvY2Vzc2VkJ30KICAgICAgICAtPnsgJFBhcmFte0RhdGF9LT57VGlja2V0SUR9IH0rKwogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBoYW5kbGUgdGlja2V0IGFwcG9pbnRtZW50cyBpbiBhbiBhc3luY2hyb25vdXMgY2FsbAogICAgcmV0dXJuICRTZWxmLT5Bc3luY0NhbGwoCiAgICAgICAgT2JqZWN0TmFtZSAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAgICAgRnVuY3Rpb25OYW1lICAgPT4gJ1RpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1RpY2tldCcsCiAgICAgICAgRnVuY3Rpb25QYXJhbXMgPT4gewogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgfSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpUaWNrZXRBcHBvaW50bWVudERlbGV0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpBc3luY2hyb25vdXNFeGVjdXRvcik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0RhdGF9LT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQgaW4gRGF0YSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgSGFuZGxlIHRpY2tldCBhcHBvaW50bWVudCBkZWxldGUgaW4gYW4gYXN5bmNocm9ub3VzIGNhbGwuCiAgICByZXR1cm4gJFNlbGYtPkFzeW5jQ2FsbCgKICAgICAgICBPYmplY3ROYW1lICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICAgICBGdW5jdGlvbk5hbWUgICA9PiAnVGlja2V0QXBwb2ludG1lbnREZWxldGUnLAogICAgICAgIEZ1bmN0aW9uUGFyYW1zID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgIH0sCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCgogICAgfSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBuZWVkZWQgb2JqZWN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSGVscGVyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7Cm15ICRHcm91cE9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJFRlc3RFbWFpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbDo6VGVzdCcpOwpteSAkQ2FsZW5kYXJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY29uZmlnIGNoYW5nZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkaXNhYmxlIHJpY2ggdGV4dCBlZGl0b3IKbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnRnJvbnRlbmQ6OlJpY2hUZXh0JywKICAgIFZhbHVlID0+IDAsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIkRpc2FibGUgUmljaFRleHQgd2l0aCB0cnVlIiwKKTsKCiMgdXNlIFRlc3QgZW1haWwgYmFja2VuZAokU3VjY2VzcyA9ICRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdTZW5kbWFpbE1vZHVsZScsCiAgICBWYWx1ZSA9PiAnS2VybmVsOjpTeXN0ZW06OkVtYWlsOjpUZXN0JywKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiU2V0IEVtYWlsIFRlc3QgYmFja2VuZCB3aXRoIHRydWUiLAopOwoKIyBzZXQgbm90IHNlbGYgbm90aWZ5CiRTdWNjZXNzID0gJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0FnZW50U2VsZk5vdGlmeU9uQWN0aW9uJywKICAgIFZhbHVlID0+IDAsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIkRpc2FibGUgQWdlbnQgU2VsZiBOb3RpZnkgT24gQWN0aW9uIiwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBlbWFpbCB0ZXN0IGJhY2tlbmQKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKJFN1Y2Nlc3MgPSAkVGVzdEVtYWlsT2JqZWN0LT5DbGVhblVwKCk7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAnSW5pdGlhbCBjbGVhbnVwJywKKTsKCiRTZWxmLT5Jc0RlZXBseSgKICAgICRUZXN0RW1haWxPYmplY3QtPkVtYWlsc0dldCgpLAogICAgW10sCiAgICAnVGVzdCBiYWNrZW5kIGVtcHR5IGFmdGVyIGluaXRpYWwgY2xlYW51cCcsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdXNlciBjcmVhdGUKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgYSBuZXcgdXNlciBmb3IgY3VycmVudCB0ZXN0Cm15ICRVc2VyTG9naW4gPSAkSGVscGVyT2JqZWN0LT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbJ3VzZXJzJ10sCik7Cm15ICVVc2VyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgVXNlciA9PiAkVXNlckxvZ2luLAopOwpteSAkVXNlcklEID0gJFVzZXJEYXRhe1VzZXJJRH07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZ3JvdXAgY3JlYXRlCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwSUQgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAndW5pdHRlc3Rncm91cCcgLiAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpLAogICAgQ29tbWVudCA9PiAnY29tbWVudCBkZXNjcmliaW5nIHRoZSBncm91cCcsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRHcm91cElELAogICAgJ0dyb3VwIGNyZWF0ZScsCik7CgokU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICBydyAgICAgICAgPT4gMSwKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAnR3JvdXAgdXNlciBhZGQnLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNhbGVuZGFyIGNyZWF0ZQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBjYWxlbmRhciBhbmQgYXBwb2ludG1lbnQKbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAndW5pdHRlc3RjYWxlbmRhcicgLiAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpLAogICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgQ29sb3IgICAgICAgID0+ICcjRkY3NzAwJywKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgVmFsaWRJRCAgICAgID0+IDEsCik7CgpteSBAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSA9PiAnU2luZ2xlIFJlY2lwaWVudEFnZW50JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRXZlbnRzICAgICAgICAgICA9PiBbJ0NhbGVuZGFyVXBkYXRlJ10sCiAgICAgICAgICAgIFJlY2lwaWVudEFnZW50cyAgPT4gWyRVc2VySURdLAogICAgICAgICAgICBOb3RpZmljYXRpb25UeXBlID0+IFsnQXBwb2ludG1lbnQnXSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmVzdWx0cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRvQXJyYXkgPT4gWyAkVXNlckRhdGF7VXNlckVtYWlsfSBdLAogICAgICAgICAgICAgICAgQm9keSAgICA9PiAiQ2FsZW5kZXI6ICRDYWxlbmRhcntDYWxlbmRhck5hbWV9PVxuIiwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdSZWNpcGllbnQgQ3VzdG9tZXIgLSBKdXN0VG9SZWFsQ3VzdG9tZXIgZW5hYmxlZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEV2ZW50cyAgICAgICAgICAgPT4gWydDYWxlbmRhclVwZGF0ZSddLAogICAgICAgICAgICBSZWNpcGllbnRzICAgICAgID0+IFsnQ3VzdG9tZXInXSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVHlwZSA9PiBbJ0FwcG9pbnRtZW50J10sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJlc3VsdHMgICAgPT4gW10sCiAgICAgICAgSnVzdFRvUmVhbEN1c3RvbWVyID0+IDEsCiAgICB9LAopOwoKbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKbXkgJEV2ZW50Tm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpOb3RpZmljYXRpb24nKTsKCm15ICRDb3VudCA9IDA7CmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBhZGQgdHJhbnNwb3J0IHNldHRpbmcKICAgICRUZXN0LT57RGF0YX0tPntUcmFuc3BvcnRzfSA9IFsnRW1haWwnXTsKCiAgICAjIHNldCBqdXN0IHRvIHJlYWwgY3VzdG9tZXIKICAgIG15ICRKdXN0VG9SZWFsQ3VzdG9tZXIgPSAkVGVzdC0+e0p1c3RUb1JlYWxDdXN0b21lcn0gfHwgMDsKICAgICRTdWNjZXNzID0gJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgIEtleSAgID0+ICdDdXN0b21lck5vdGlmeUp1c3RUb1JlYWxDdXN0b21lcicsCiAgICAgICAgVmFsdWUgPT4gJEp1c3RUb1JlYWxDdXN0b21lciwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlNldCBub3RpZmljYXRpb25zIGp1c3QgdG8gcmVhbCBjdXN0b21lcjogJEp1c3RUb1JlYWxDdXN0b21lci4iLAogICAgKTsKCiAgICBteSAkTm90aWZpY2F0aW9uSUQgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkFkZCgKICAgICAgICBOYW1lICAgID0+ICJKb2JOYW1lJENvdW50IiwKICAgICAgICBEYXRhICAgID0+ICRUZXN0LT57RGF0YX0sCiAgICAgICAgTWVzc2FnZSA9PiB7CiAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICdKb2JOYW1lJywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgID0+ICdDYWxlbmRlcjogPE9UUlNfQ0FMRU5EQVJfQ0FMRU5EQVJOQU1FPicsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb21tZW50ID0+ICdBbiBvcHRpb25hbCBjb21tZW50JywKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAjIHNhbml0eSBjaGVjawogICAgJFNlbGYtPklzTm90KAogICAgICAgICROb3RpZmljYXRpb25JRCwKICAgICAgICB1bmRlZiwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vdGlmaWNhdGlvbkFkZCgpIHNob3VsZCBub3QgYmUgdW5kZWYiLAogICAgKTsKCiAgICBteSAkUmVzdWx0ID0gJEV2ZW50Tm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPlJ1bigKICAgICAgICBFdmVudCA9PiAnQ2FsZW5kYXJVcGRhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4ge30sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIG15ICRFbWFpbHMgPSAkVGVzdEVtYWlsT2JqZWN0LT5FbWFpbHNHZXQoKTsKCiAgICAjIHJlbW92ZSBub3QgbmVlZGVkIGRhdGEKICAgIGZvciBteSAkRW1haWwgKCBAeyRFbWFpbHN9ICkgewogICAgICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhGcm9tIEhlYWRlcikpIHsKICAgICAgICAgICAgZGVsZXRlICRFbWFpbC0+eyRBdHRyaWJ1dGV9OwogICAgICAgIH0KCiAgICAgICAgIyBkZS1yZWZlcmVuY2UgYm9keQogICAgICAgICRFbWFpbC0+e0JvZHl9ID0gJHsgJEVtYWlsLT57Qm9keX0gfTsKICAgIH0KCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJEVtYWlscywKICAgICAgICAkVGVzdC0+e0V4cGVjdGVkUmVzdWx0c30sCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZWNpcGllbnRzIiwKICAgICk7CgogICAgIyBkZWxldGUgbm90aWZpY2F0aW9uIGV2ZW50CiAgICBteSAkTm90aWZpY2F0aW9uRGVsZXRlID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25EZWxldGUoCiAgICAgICAgSUQgICAgID0+ICROb3RpZmljYXRpb25JRCwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBzYW5pdHkgY2hlY2sKICAgICRTZWxmLT5UcnVlKAogICAgICAgICROb3RpZmljYXRpb25EZWxldGUsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBOb3RpZmljYXRpb25EZWxldGUoKSBzdWNjZXNzZnVsIGZvciBOb3RpZmljYXRpb24gSUQgJE5vdGlmaWNhdGlvbklEIiwKICAgICk7CgogICAgJFRlc3RFbWFpbE9iamVjdC0+Q2xlYW5VcCgpOwoKICAgICRDb3VudCsrOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwpteSAkR3JvdXBPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJFVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiMgY3JlYXRlIHRlc3QgdXNlcgpteSAkVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFVzZXJJRCAgICA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwoKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgIlRlc3QgdXNlciAkVXNlcklEIGNyZWF0ZWQiLAopOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZSA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkUmFuZG9tSUQ7Cm15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRCwKICAgICJUZXN0IGdyb3VwICRVc2VySUQgY3JlYXRlZCIsCik7CgojIGFkZCB0ZXN0IHVzZXIgdG8gdGVzdCBncm91cApteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICBydyAgICAgICAgPT4gMSwKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgYWRkZWQgdG8gdGVzdCBncm91cCAkR3JvdXBJRCIsCik7CgpteSBAQ2FsZW5kYXJJRHM7CgojCiMgVGVzdHMgZm9yIENhbGVuZGFyQ3JlYXRlKCkKIwpteSBAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyQ3JlYXRlIC0gTWlzc2luZyBDYWxlbmRhck5hbWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENvbG9yICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBNaXNzaW5nIFVzZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBNaXNzaW5nIEdyb3VwSUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBNaXNzaW5nIENvbG9yJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBXcm9uZyBDb2xvcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJ3JlZCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBBbGwgcmVxdWlyZWQgcGFyYW1ldGVycycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyQ3JlYXRlIC0gU2FtZSBuYW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBJbnZhbGlkIHN0YXRlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRC0yIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjRUM5MDczJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBPcHRpb25hbCBwYXJhbWV0ZXJzJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgICAgICAgPT4gIkNhbGVuZGFyLSRSYW5kb21JRC0zIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgICAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBTdGFydERhdGUgICAgPT4gJ0ZpcnN0UmVzcG9uc2UnLAogICAgICAgICAgICAgICAgICAgIEVuZERhdGUgICAgICA9PiAnUGx1c181JywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gWzJdLAogICAgICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICdUaGlzIGlzIGEgdGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlcyA9PiAnVGhpcyBpcyBhIHR5cGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIGRhdGEKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICBmb3IgbXkgJEtleSAocXcoQ2FsZW5kYXJJRCBHcm91cElEIENhbGVuZGFyTmFtZSBDb2xvciBDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkgVmFsaWRJRCkpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJ7JEtleX0sCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtICRLZXkgZXhpc3RzIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e0NvbmZpZ30gfSApIHsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnVXNlcklEJzsKCiAgICAgICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgICAgICRUZXN0LT57Q29uZmlnfS0+eyRLZXl9LAogICAgICAgICAgICAgICAgJENhbGVuZGFyeyRLZXl9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBEYXRhIGZvciAkS2V5IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQENhbGVuZGFySURzLCAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIENhbGVuZGFyR2V0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQ2FsZW5kYXJHZXQgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyR2V0IC0gTWlzc2luZyBDYWxlbmRhck5hbWUgYW5kIENhbGVuZGFySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyR2V0IC0gRmlyc3QgY2FsZW5kYXInLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJHZXQgLSBTZWNvbmQgY2FsZW5kYXInLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlELTIiLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckdldCAtIFRoaXJkIGNhbGVuZGFyJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRC0zIiwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgICMgY2hlY2sgZGF0YQogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgIGZvciBteSAkS2V5IChxdyhDYWxlbmRhcklEIEdyb3VwSUQgQ2FsZW5kYXJOYW1lIENvbG9yIENyZWF0ZVRpbWUgQ3JlYXRlQnkgQ2hhbmdlVGltZSBDaGFuZ2VCeSBWYWxpZElEKSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDYWxlbmRhcnskS2V5fSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gJEtleSBleGlzdHMiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYnkgaWQKICAgICAgICBteSAlQ2FsZW5kYXJCeUlEID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjb21wYXJlIHJldHVybmVkIGRhdGEKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFwlQ2FsZW5kYXIsCiAgICAgICAgICAgIFwlQ2FsZW5kYXJCeUlELAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEdldCBieSBDYWxlbmRhcklEIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBDYWxlbmRhckxpc3QoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdDYWxlbmRhckxpc3QgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyTGlzdCAtIFdpdGggVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBDb3VudCAgID0+IDMsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJMaXN0IC0gV2l0aCBVc2VySUQgYW5kIG9ubHkgdmFsaWQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIENvdW50ICAgPT4gMiwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckxpc3QgLSBXaXRoIFVzZXJJRCBhbmQgb25seSBpbnZhbGlkJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBDb3VudCAgID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15IEBSZXN1bHQgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgIyBjaGVjayBkYXRhCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CgogICAgICAgICMgY2hlY2sgY291bnQKICAgICAgICBpZiAoICRUZXN0LT57Q291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICBzY2FsYXIgQFJlc3VsdCwKICAgICAgICAgICAgICAgICRUZXN0LT57Q291bnR9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXN1bHQgY291bnQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb21wYXJlIHJldHVybmVkIGRhdGEKICAgICAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQFJlc3VsdCkgewogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KENhbGVuZGFySUQgR3JvdXBJRCBDYWxlbmRhck5hbWUgQ29sb3IgQ3JlYXRlVGltZSBDcmVhdGVCeSBDaGFuZ2VUaW1lIENoYW5nZUJ5IFZhbGlkSUQpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgICAgICAkQ2FsZW5kYXItPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSAkS2V5IGV4aXN0cyIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBieSBpZAogICAgICAgICAgICAgICAgbXkgJUNhbGVuZGFyQnlJRCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZGVsZXRlICRDYWxlbmRhckJ5SUR7VGlja2V0QXBwb2ludG1lbnRzfTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICAgICAgICAgJENhbGVuZGFyLAogICAgICAgICAgICAgICAgICAgIFwlQ2FsZW5kYXJCeUlELAogICAgICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ29tcGFyZSByZXR1cm5lZCBkYXRhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgc2NhbGFyIEBSZXN1bHQgPiAxLAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBIYXMgcmVzdWx0IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIEBSZXN1bHQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBDYWxlbmRhclVwZGF0ZSgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIE1pc3NpbmcgQ2FsZW5kYXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNoYW5nZS0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJVcGRhdGUgLSBNaXNzaW5nIEdyb3VwSUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICA9PiAkQ2FsZW5kYXJJRHNbMF0sCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2hhbmdlLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIE1pc3NpbmcgQ2FsZW5kYXJOYW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgR3JvdXBJRCAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgQ29sb3IgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAyLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gTWlzc2luZyBDb2xvcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNoYW5nZS0kUmFuZG9tSUQiLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJVcGRhdGUgLSBNaXNzaW5nIFVzZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNoYW5nZS0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIE1pc3NpbmcgVmFsaWRJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNoYW5nZS0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIEFsbCByZXF1aXJlZCBwYXJhbXMgZmlyc3QnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICA9PiAkQ2FsZW5kYXJJRHNbMF0sCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDaGFuZ2UtJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjRkY5OTAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAyLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gQWxsIHJlcXVpcmVkIGFuZCBhbiBvcHRpb25hbCBwYXJhbSBzZWNvbmQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJJRHNbMV0sCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lICAgICAgID0+ICJDaGFuZ2UtJFJhbmRvbUlELTIiLAogICAgICAgICAgICBDb2xvciAgICAgICAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSAgICA9PiAnRmlyc3RSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdQbHVzXzUnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICdUaGlzIGlzIGEgdGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlcyA9PiAnVGhpcyBpcyBhIHR5cGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIEFsbCByZXF1aXJlZCBhbmQgYW4gb3B0aW9uYWwgcGFyYW0gdGhpcmQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJJRHNbMV0sCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lICAgICAgID0+ICJDaGFuZ2UtJFJhbmRvbUlELTIiLAogICAgICAgICAgICBDb2xvciAgICAgICAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gdW5kZWYsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyVXBkYXRlKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIGRhdGEKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYnkgaWQKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRUZXN0LT57Q29uZmlnfS0+e0NhbGVuZGFySUR9LAogICAgICAgICk7CgogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e0NvbmZpZ30gfSApIHsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnVXNlcklEJzsKCiAgICAgICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgICAgICRUZXN0LT57Q29uZmlnfS0+eyRLZXl9LAogICAgICAgICAgICAgICAgJENhbGVuZGFyeyRLZXl9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBEYXRhIGZvciAkS2V5IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQ2FsZW5kYXJQZXJtaXNzaW9uR2V0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQ2FsZW5kYXJQZXJtaXNzaW9uR2V0IC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclBlcm1pc3Npb25HZXQgLSBNaXNzaW5nIENhbGVuZGFySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyUGVybWlzc2lvbkdldCAtIE1pc3NpbmcgVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclBlcm1pc3Npb25HZXQgLSBBbGwgcGFyYW1zIGZpcnN0JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIFJlc3VsdCAgPT4gJ3J3JywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclBlcm1pc3Npb25HZXQgLSBBbGwgcGFyYW1zIHNlY29uZCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBSZXN1bHQgID0+ICdydycsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15ICRQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFBlcm1pc3Npb24sCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBQZXJtaXNzaW9uIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUGVybWlzc2lvbiwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIEdldFRleHRDb2xvcigpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0dldFRleHRDb2xvciAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnR2V0VGV4dENvbG9yIC0gSW52YWxpZCBjb2xvcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQmFja2dyb3VuZCA9PiAnI0NDQ0NDJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdHZXRUZXh0Q29sb3IgLSBXaGl0ZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQmFja2dyb3VuZCA9PiAnI0ZGRicsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgUmVzdWx0ICA9PiAnIzAwMCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnR2V0VGV4dENvbG9yIC0gTGlnaHQgR3JheScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQmFja2dyb3VuZCA9PiAnIzgwODA4MCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgUmVzdWx0ICA9PiAnIzAwMCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnR2V0VGV4dENvbG9yIC0gRGFyayBHcmF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBCYWNrZ3JvdW5kID0+ICcjNzk3OTc5JywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBSZXN1bHQgID0+ICcjRkZGRkZGJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdHZXRUZXh0Q29sb3IgLSBCbGFjaycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQmFja2dyb3VuZCA9PiAnIzAwMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgUmVzdWx0ICA9PiAnI0ZGRkZGRicsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15ICRUZXh0Q29sb3IgPSAkQ2FsZW5kYXJPYmplY3QtPkdldFRleHRDb2xvcigKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgIyBjaGVjayB0ZXh0IGNvbG9yCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkVGV4dENvbG9yLAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gVGV4dCBjb2xvciIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFRleHRDb2xvciwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIENhbGVuZGFyRXhwb3J0KCkgYW5kIENhbGVuZGFySW1wb3J0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQ2FsZW5kYXJFeHBvcnQvSW1wb3J0IC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckV4cG9ydC9JbXBvcnQgLSBObyBDYWxlbmRhckRhdGEnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyRXhwb3J0L0ltcG9ydCAtIEFsbCBwYXJhbXMgd2l0aCBvdmVyd3JpdGUnLAogICAgICAgIEV4cG9ydCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzJdLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIE92ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXMgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFwcG9pbnRtZW50cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzJdLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQxLSRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklEc1syXSwKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50Mi0kUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50cwogICAgaWYgKCAkVGVzdC0+e0FwcG9pbnRtZW50c30gKSB7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoIEB7ICRUZXN0LT57QXBwb2ludG1lbnRzfSB9ICkgewogICAgICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENyZWF0ZWQgYXBwb2ludG1lbnQgKCRBcHBvaW50bWVudElEKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZXhwb3J0IGNhbGVuZGFyCiAgICBpZiAoICRUZXN0LT57RXhwb3J0fSApIHsKICAgICAgICBteSAlRGF0YSA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJFeHBvcnQoCiAgICAgICAgICAgICV7ICRUZXN0LT57RXhwb3J0fSB9LAogICAgICAgICk7CgogICAgICAgICRUZXN0LT57Q29uZmlnfS0+e0RhdGF9ID0gXCVEYXRhOwogICAgfQoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFySW1wb3J0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIHJlc3VsdAogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBTdWNjZXNzIiwKICAgICAgICApOwoKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICAleyAkVGVzdC0+e0V4cG9ydH0gfSwKICAgICAgICApOwoKICAgICAgICAjIHJlc2V0IENyZWF0ZVRpbWUgYW5kIENoYW5nZVRpbWUgc2luY2UgdGhleSBtaWdodCBkaWZmZXIKICAgICAgICBmb3IgbXkgJEtleSAocXcoQ3JlYXRlVGltZSBDaGFuZ2VUaW1lKSkgewogICAgICAgICAgICAkQ2FsZW5kYXJ7JEtleX0gPSB1bmRlZjsKICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57RGF0YX0tPntDYWxlbmRhckRhdGF9LT57JEtleX0gPSB1bmRlZjsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXCVDYWxlbmRhciwKICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57RGF0YX0tPntDYWxlbmRhckRhdGF9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENhbGVuZGFyIGRhdGEiLAogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgJXsgJFRlc3QtPntFeHBvcnR9IH0sCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQVJSQVknLAogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudERhdGE7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEIChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gPSB1bmRlZjsKCiAgICAgICAgICAgICMgcmVzZXQgQ3JlYXRlVGltZSBhbmQgQ2hhbmdlVGltZSBzaW5jZSB0aGV5IG1pZ2h0IGRpZmZlcgogICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoQ3JlYXRlVGltZSBDaGFuZ2VUaW1lKSkgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50eyRLZXl9ID0gdW5kZWY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50RGF0YSwgXCVBcHBvaW50bWVudDsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKCBAeyAkVGVzdC0+e0NvbmZpZ30tPntEYXRhfS0+e0FwcG9pbnRtZW50RGF0YX0gfSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gPSB1bmRlZjsKCiAgICAgICAgICAgICMgcmVzZXQgQ3JlYXRlVGltZSBhbmQgQ2hhbmdlVGltZSBzaW5jZSB0aGV5IG1pZ2h0IGRpZmZlcgogICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoQ3JlYXRlVGltZSBDaGFuZ2VUaW1lKSkgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57JEtleX0gPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcQEFwcG9pbnRtZW50RGF0YSwKICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57RGF0YX0tPntBcHBvaW50bWVudERhdGF9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEFwcG9pbnRtZW50IGRhdGEiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgojIE92ZXJyaWRlIGxvY2FsIHRpbWUgem9uZSBmb3IgZHVyYXRpb24gb2YgdGhlIHRlc3QuCmxvY2FsICRFTlZ7VFp9ID0gJ1VUQyc7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7Cm15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cm15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZSA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkUmFuZG9tSUQ7Cm15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRCwKICAgICJUZXN0IGdyb3VwICRHcm91cElEIGNyZWF0ZWQiLAopOwoKIyBDcmVhdGUgdGVzdCB1c2VyIGFuZCBhZGQgaXQgdG8gdGhlIHRlc3QgZ3JvdXAuCm15ICRVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbJEdyb3VwTmFtZV0sCik7Cm15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRVc2VyTG9naW4gKTsKCiRTZWxmLT5UcnVlKAogICAgJFVzZXJJRCwKICAgICJUZXN0IHVzZXIgJFVzZXJJRCBjcmVhdGVkIiwKKTsKCiMgY3JlYXRlIHRlc3QgY2FsZW5kYXIKbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKKTsKCiRTZWxmLT5UcnVlKAogICAgJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgIkNhbGVuZGFyQ3JlYXRlIC0gJENhbGVuZGFye0NhbGVuZGFySUR9IiwKKTsKCiMKIyBUZXN0cyBmb3IgQXBwb2ludG1lbnRDcmVhdGUoKSwgQXBwb2ludG1lbnRHZXQoKSBhbmQgQXBwb2ludG1lbnRVcGRhdGUoKQojCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRDcmVhdGUgLSBObyBDYWxlbmRhcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaXRsZSAgICAgPT4gIkFwcG9pbnRtZW50LSRSYW5kb21JRCIsCiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gTm8gVGl0bGUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIE5vIFN0YXJ0VGltZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50LSRSYW5kb21JRCIsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRDcmVhdGUgLSBObyBFbmRUaW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIE5vIFVzZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50LSRSYW5kb21JRCIsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIEFsbCByZXF1aXJlZCBwYXJhbXMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgID0+ICJBcHBvaW50bWVudC0kUmFuZG9tSUQiLAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIERlc2NyaXB0aW9uLCBMb2NhdGlvbiBhbmQgQWxsRGF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICJBcHBvaW50bWVudDItJFJhbmRvbUlEIiwKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NhbGVuZGFyIEFwcG9pbnRtZW50JywKICAgICAgICAgICAgTG9jYXRpb24gICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICA9PiAnMjAxNi0wMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgID0+ICcyMDE2LTAxLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gIkFwcG9pbnRtZW50Mi0kUmFuZG9tSUQiLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU29tZSBkZXNjcmlwdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgID0+ICdVU0EnLAogICAgICAgICAgICBTdGFydFRpbWUgICA9PiAnMjAxNi0wMS0wMyAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgID0+ICcyMDE2LTAxLTAzIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CgogICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgKTsKCiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57Q29uZmlnfSB9ICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdVc2VySUQnOwoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50eyRLZXl9LAogICAgICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57JEtleX0sCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJldHVybmVkIGRhdGEiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVGVzdC0+e1VwZGF0ZX0gKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgICV7ICRUZXN0LT57VXBkYXRlfSB9LAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gVXBkYXRlZCBhcHBvaW50bWVudCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntVcGRhdGV9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdVc2VySUQnOwoKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7JEtleX0sCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntVcGRhdGV9LT57JEtleX0sCiAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBVcGRhdGVkIGRhdGEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBBcHBvaW50bWVudExpc3QoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdBcHBvaW50bWVudExpc3QgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIENhbGVuZGFySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIH0sCiAgICAgICAgQ291bnQgICA9PiAyLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudExpc3QgLSBTdGFydFRpbWUgYW5kIEVuZFRpbWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wNCAwMDowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBDb3VudCAgID0+IDIsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIEJlZm9yZSBhcHBvaW50bWVudHMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE1LTEyLTMxIDAwOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMCwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gQWZ0ZXIgYXBwb2ludG1lbnRzJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wNCAwMDowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBDb3VudCAgID0+IDAsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIFRpdGxlIHNlYXJjaCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50Ki0kUmFuZG9tSUQiLCAgICAjIHdpbGRjYXJkCiAgICAgICAgfSwKICAgICAgICBDb3VudCAgID0+IDIsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIERlc2NyaXB0aW9uIHNlYXJjaCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnZm9vYmFyJywgICAgICAgICAgICAgICAgICAgIyBub24tZXhpc3RlbnQKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMCwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gTG9jYXRpb24gc2VhcmNoJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgTG9jYXRpb24gICA9PiAndXNhJywgICAgICAgICAgICAgICAgICAgICAgICMgbG93ZXJjYXNlCiAgICAgICAgfSwKICAgICAgICBDb3VudCAgID0+IDEsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzLAogICAgICAgICAgICAkVGVzdC0+e0NvdW50fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXN1bHQgY291bnQiLAogICAgICAgICk7CgogICAgICAgIGlmICggJFRlc3QtPntDb25maWd9LT57UmVzdWx0fSAmJiAkVGVzdC0+e0NvbmZpZ30tPntSZXN1bHR9IGVxICdBUlJBWScgKSB7CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KEFwcG9pbnRtZW50SUQgQ2FsZW5kYXJJRCBVbmlxdWVJRCBUaXRsZSBTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gJEtleSBleGlzdHMiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFxAQXBwb2ludG1lbnRzLAogICAgICAgICAgICBbXSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIHJlY3VycmluZyBhcHBvaW50bWVudHMKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBPbmNlIHBlciBkYXknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0RhaWx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICMgb25jZSBwZXIgZGF5CiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsICAgICAjIGluY2x1ZGVkIGxhc3QgZGF5CiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gNSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wMiAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wMyAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wNCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wNSAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTYtMDMtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDMtMDIgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDMtMDMgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDMtMDQgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDMtMDUgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uY2UgcGVyIG1vbnRoJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxMi0wMS0zMSAxNTowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxMi0wMS0zMSAxNjowMDowMCcsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ01vbnRobHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmNlIHBlciBtb250aAogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgPT4gJzIwMTMtMDEtMDMgMTY6MDA6MDAnLCAgICAgIyBpbmNsdWRlZCBsYXN0IGRheQogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxMi0wMS0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTMtMDEtMDQgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDEyLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDEyLTAxLTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTAyLTI5IDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTAzLTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA0LTMwIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA1LTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA2LTMwIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA3LTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA4LTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA5LTMwIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTEwLTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTExLTMwIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTEyLTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxMi0wMS0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wMi0yOSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wMy0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wNC0zMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wNS0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wNi0zMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wNy0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wOC0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wOS0zMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0xMC0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0xMS0zMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0xMi0zMSAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gRXZlcnkgbW9udGggYWxsLWRheSBwZXIgbW9udGgnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgID0+ICcyMDA4LTA0LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgID0+ICcyMDA4LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgPT4gJ01vbnRobHknLAogICAgICAgICAgICBSZWN1cnJlbmNlQ291bnQgPT4gMywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMDgtMDQtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDA4LTA3LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDA4LTA0LTMwIDAwOjAwOjAwJywgICAgIyBvbiBzb21lIHN5c3RlbXMgd2l0aCBvbGRlciBkYXRlIHRpbWUgbGlicmFyeQogICAgICAgICAgICAgICAgJzIwMDgtMDUtMzAgMDA6MDA6MDAnLCAgICAjIHRoZXJlIHdpbGwgYmUgYW4gYXBwb2ludG1lbnQgb24gMjAwOC0wNS0zMQogICAgICAgICAgICAgICAgJzIwMDgtMDYtMzAgMDA6MDA6MDAnLCAgICAjIGJ1dCBub3Qgb24gMjAwOC0wNi0zMAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDA4LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDA4LTA1LTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDA4LTA3LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBNaXNzaW5nIFJlY3VycmVuY2VUeXBlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIFdyb25nIFJlY3VycmVuY2VUeXBlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdXcm9uZ0RhaWx5JywgICAgICAgICAgICAgICMgV3JvbmdEYWlseSBpcyBub3Qgc3VwcG9ydGVkCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgPT4gJzIwMTYtMDMtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBXaXRob3V0IFJlY3VycmVuY2VGcmVxdWVuY3knLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE4LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE4LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0N1c3RvbURhaWx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICA9PiAyLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxOC0wMy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTgtMDMtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTgtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDMtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE4LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBNaXNzaW5nIFJlY3VycmVuY2VGcmVxdWVuY3kgKEN1c3RvbVdlZWtseSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgPT4gJzIwMTYtMDMtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBNaXNzaW5nIFJlY3VycmVuY2VGcmVxdWVuY3kgKEN1c3RvbU1vbnRobHkpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdDdXN0b21Nb250aGx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE1pc3NpbmcgUmVjdXJyZW5jZUZyZXF1ZW5jeSAoQ3VzdG9tWWVhcmx5KScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnQ3VzdG9tWWVhcmx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uY2UgcGVyIHdlZWsnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnV2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0xMC0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0xMC0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdXZWVrbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZWFjaCB3ZWVrCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0xMC0wNiAwMDowMDowMCcsICAgICAgICAgICAgIyBpbmNsdWRlZCBsYXN0IGRheQogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMTAtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTYtMTAtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE2LTEwLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBPbmNlIHBlciBtb250aCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdNb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0xMC0wNyAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0xMC0wNyAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdNb250aGx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlYWNoIG1vbnRoCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICA9PiAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBtb250aHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMTAtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE3LTAxLTA4IDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMS0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMi0wNyAxNzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gT25jZSBwZXIgeWVhcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdZZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDI3LTEwLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDI3LTEwLTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ1llYXJseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlYWNoIHllYXIKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgID0+IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgeWVhcnMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMjctMTAtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDMwLTEwLTExIDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDI3LTEwLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI4LTEwLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI5LTEwLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAyNy0xMC0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyOC0xMC0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyOS0xMC0xMCAxNzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gRXZlcnkgdHdvIGRheXMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnQ3VzdG9tIGRhaWx5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTctMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMTctMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnQ3VzdG9tRGFpbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMiwKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgID0+IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE3LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNy0wMS0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wMyAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wNSAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTctMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDEtMDMgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDEtMDUgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uIFdlZG5lc2RheSwgcmVjdXJyaW5nIGV2ZXJ5IHR3byB3ZWVrcyBvbiBNb25kYXkgYW5kIEZyaWRheScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wNS0wNCAxNjowMDowMCcsICAgICAgICAgICAgICAgICAgICMgd2VkbmVzZGF5CiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDUtMDQgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZWFjaCAybmQKICAgICAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDUgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTW9uZGF5IGFuZCBGcmlkYXkKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICA9PiAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBhcHBvaW50bWVudHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA1LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wNS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNi0wNS0wNCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wNS0wNiAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wNS0xNiAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTYtMDUtMDQgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDUtMDYgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDUtMTYgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIEV2ZXJ5IDJuZCBtb250aCBvbiA1dGgsIDEwdGggYW5kIDE1dGggZGF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxOS0wNy0wNSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTktMDctMDUgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAiQ3VzdG9tTW9udGhseSIsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBldmVyeSAyIG1vbnRocwogICAgICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IFsgNSwgMTAsIDE1IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGF5cyBpbiBtb250aAogICAgICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgID0+IDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBhcHBvaW50bWVudHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE5LTA3LTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxOS0xMC0xNiAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gNiwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0wNSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xNSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0wNSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0xMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0xNSAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTktMDctMDUgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDctMTAgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDctMTUgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMDUgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMTAgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMTUgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIEV2ZXJ5IDJuZCB5ZWFyIG9uIEphbnVhcnkgNXRoLCBGZWJydWFyeSBhbmQgRGVjZW1iZXInLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICdDdXN0b20geWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMjItMDEtMDUgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDIyLTAxLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVllYXJseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGV2ZXJ5IDIgeWVhcnMKICAgICAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDIsIDEyIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9udGhzCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAyMi0wMS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMjQtMTItMDYgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDMsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMjItMDEtMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjItMDItMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjItMTItMDUgMTY6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDIyLTAxLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIyLTAyLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIyLTEyLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBFdmVyeSAyIHdlZWtzLCBvbiBNb24sIFdlZCwgVGh1LCBGcmkgYW5kIFN1bicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMjUtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDI1LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZWFjaCAyIHdlZWtzCiAgICAgICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAxLCAzLCA0LCA1LCA3IF0sICAgICAgICAgICAgICAgICMgTW9uLCBXZWQsIFRodSwgRnJpLCBTdW4KICAgICAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICA9PiAnMjAyNi0xMC0wMSAwMDowMDowMCcsICAgICAgICAgICAgIyBvY3RvYmVyCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAyNS0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMjYtMTAtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDE0MywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0zMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0zMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0wOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0zMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMjUtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMDQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMDcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMTUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMTggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMjEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMjkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMTUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMTIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMjQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMjYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMTEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMTIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMjQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMjUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMjYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMDkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMTEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMjEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMjMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMjUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMDQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMTggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMDQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMTggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMTUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMTEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMTUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMjUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMTEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMTIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMjQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMjUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMjYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMDkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMTIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMjMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMjQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMjYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMDkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMjEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMjMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMDQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMTggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uIFR1ZXNkYXkgYW5kIEZyaWRheSwgcmVjdXJyaW5nIGV2ZXJ5IGZpdmUgd2Vla3MuJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTA5LTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wNCAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgID0+ICdDdXN0b21XZWVrbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgID0+IDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlYWNoIDV0aCB3ZWVrCiAgICAgICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAyLCA1IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFR1ZXNkYXkgYW5kIEZyaWRheQogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgID0+ICcyMDIxLTEyLTMxIDIzOjU5OjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA5LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAyMi0wMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMTI3LAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKCiAgICAgICAgICAgICAgICAjIGRhdGVzIGZyb20gcHJldmlvdXMgdGVzdHMKICAgICAgICAgICAgICAgICcyMDE4LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTE1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTE1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIyLTAxLTA1IDE2OjAwOjAwJywKCiAgICAgICAgICAgICAgICAjIGhlcmUgY29tZXMgZGF0ZXMgZnJvbSB0aGlzIHRlc3QKICAgICAgICAgICAgICAgICcyMDE2LTA5LTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTA4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTEzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTE3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAyLTIxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAyLTI0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAzLTI4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAzLTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA1LTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA1LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA2LTA2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA2LTA5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA3LTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA3LTE0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA4LTE1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA4LTE4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA5LTE5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA5LTIyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTEwLTI0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTEwLTI3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTExLTI4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTEyLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAxLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAxLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAyLTA2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAyLTA5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTEzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA0LTE3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA0LTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA1LTIyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA1LTI1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA2LTI2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA2LTI5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA3LTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA4LTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA5LTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA5LTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEwLTA5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEwLTEyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTExLTEzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTExLTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEyLTE4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEyLTIxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAxLTIyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAxLTI1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAyLTI2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA0LTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA0LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA1LTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA1LTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA2LTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA2LTE0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTE5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA4LTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA4LTIzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTI0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTI3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTEwLTI5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTExLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTEyLTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTEyLTA2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAxLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAxLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAyLTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAyLTE0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAzLTE3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAzLTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA0LTIxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA0LTI0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA1LTI2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA1LTI5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA2LTMwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA3LTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA4LTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA4LTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA5LTA4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA5LTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEwLTEzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEwLTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTExLTE3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTExLTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEyLTIyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEyLTI1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAxLTI2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAxLTI5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAzLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAzLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA0LTA2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA0LTA5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA1LTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA1LTE0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA2LTE1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA2LTE4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA3LTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA3LTIzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA4LTI0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA4LTI3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA5LTI4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTEwLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTExLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTExLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTEyLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTEyLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxOC0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMy0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMS0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMi0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0xNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMi0wMS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wOS0wNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMS0wOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMS0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMi0xMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMi0xNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0xNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMi0yMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMi0yNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMy0yOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMy0zMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNi0wNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNi0wOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNy0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNy0xNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wOC0xNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wOC0xOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wOS0xOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wOS0yMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0xMC0yNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0xMC0yNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0xMS0yOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0xMi0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMi0wNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMi0wOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMy0xMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMy0xNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNC0xNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNC0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNS0yMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNS0yNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNi0yNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNi0yOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNy0zMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wOC0wMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wOS0wNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wOS0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMC0wOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMC0xMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMS0xMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMS0xNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMi0xOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMi0yMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wMS0yMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wMS0yNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wMi0yNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNC0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNC0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNS0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNS0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNi0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNi0xNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOC0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOC0yMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0yNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0yNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0xMC0yOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0xMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0xMi0wMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0xMi0wNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMS0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMS0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMi0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMi0xNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMy0xNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMy0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNC0yMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNC0yNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNS0yNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNS0yOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNi0zMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNy0wMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wOC0wNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wOC0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wOS0wOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wOS0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMC0xMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMC0xNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMS0xNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMS0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMi0yMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMi0yNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wMS0yNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wMS0yOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wMy0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wMy0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNC0wNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNC0wOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNS0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNS0xNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNi0xNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNi0xOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNy0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNy0yMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wOC0yNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wOC0yNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wOS0yOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0xMC0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0xMS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0xMS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0xMi0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0xMi0xMCAxNzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gMyBkYXkgYXBwb2ludG1lbnQsIEN1c3RvbSB3ZWVrbHkoTW9uLCBXZWQpIHdpdGggdW50aWwgY29uZGl0aW9uLicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNS0wNy0wNiAyMzowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTUtMDctMDggMDE6MDA6MDAnLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMywKICAgICAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICA9PiAnMjAxNS0xMi0zMSAyMzo1OTowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNS0wNy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDEtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDIwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKCiAgICAgICAgICAgICAgICAjIHByZXZpb3VzIGFwcG9pbnRtZW50cwogICAgICAgICAgICAgICAgJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDEtMDMgMTY6MDA6MDAnLAoKICAgICAgICAgICAgICAgICMgbmV3IGFwcG9pbnRtZW50cwogICAgICAgICAgICAgICAgJzIwMTUtMDctMDYgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMDggMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMjcgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMjkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDgtMTcgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDgtMTkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMDcgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMDkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMjggMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMzAgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTAtMTkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTAtMjEgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTEtMDkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTEtMTEgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTEtMzAgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMDIgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMjEgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMjMgMjM6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKCiAgICAgICAgICAgICAgICAjIHByZXZpb3VzIGFwcG9pbnRtZW50cwogICAgICAgICAgICAgICAgJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDEtMDMgMTc6MDA6MDAnLAoKICAgICAgICAgICAgICAgICMgbmV3IGFwcG9pbnRtZW50cwogICAgICAgICAgICAgICAgJzIwMTUtMDctMDggMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMTAgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMjkgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMzEgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDgtMTkgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDgtMjEgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMDkgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMTEgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMzAgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTAtMDIgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTAtMjEgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTAtMjMgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTEtMTEgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTEtMTMgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMDIgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMDQgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMjMgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMjUgMDE6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIDMgZGF5IGFwcG9pbnRtZW50LCBDdXN0b20gd2Vla2x5KE1vbiwgV2VkKSwgMTAgYXBwb2ludG1lbnRzLicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNC0wNy0wNiAyMzowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTQtMDctMDggMDE6MDA6MDAnLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gMTAsCiAgICAgICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAxLCAzIF0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNC0wNy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTUtMDEtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDEwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE0LTA3LTA2IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTA3IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTA5IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTE0IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTE2IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTIxIDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTIzIDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTI4IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTMwIDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA4LTA0IDIzOjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0wOCAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0wOSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0xMSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0xNiAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0xOCAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0yMyAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0yNSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0zMCAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wOC0wMSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wOC0wNiAwMTowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBTdWNjZXNzIiwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGNvdW50CiAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAleyAkVGVzdC0+e0xpc3R9IC8vIHt9IH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzLAogICAgICAgICAgICAkVGVzdC0+e0xpc3R9LT57Q291bnR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExpc3QgY291bnQiLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgdGltZXMKICAgICAgICBteSBAU3RhcnRUaW1lczsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgIHB1c2ggQFN0YXJ0VGltZXMsICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX07CiAgICAgICAgfQogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXEBTdGFydFRpbWVzLAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFN0YXJ0IHRpbWUgcmVzdWx0IiwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGVuZCB0aW1lcwogICAgICAgIG15IEBFbmRUaW1lczsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgIHB1c2ggQEVuZFRpbWVzLCAkQXBwb2ludG1lbnQtPntFbmRUaW1lfTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXEBFbmRUaW1lcywKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LT57RW5kVGltZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gRW5kIHRpbWUgcmVzdWx0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIEFwcG9pbnRtZW50RGF5cygpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREYXlzIC0gTWlzc2luZyBVc2VySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnMjAxNi0wMS0yNSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMjAxNi0wMi0wMSAwMDowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREYXlzIC0gSmFudWFyeScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAnMjAxNi0wMS0wMScgPT4gMSwKICAgICAgICAgICAgJzIwMTYtMDEtMDMnID0+IDEsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREYXlzIC0gTWFyY2gnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnMjAxNi0wMy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMjAxNi0wNC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgJzIwMTYtMDMtMDEnID0+IDEsCiAgICAgICAgICAgICcyMDE2LTAzLTAyJyA9PiAxLAogICAgICAgICAgICAnMjAxNi0wMy0wMycgPT4gMSwKICAgICAgICAgICAgJzIwMTYtMDMtMDQnID0+IDEsCiAgICAgICAgICAgICcyMDE2LTAzLTA1JyA9PiAxLAogICAgICAgICAgICAnMjAxNi0wMy0wNicgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERheXMgLSBNYXknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnMjAxNi0wNS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMjAxNi0wNi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgJzIwMTYtMDUtMDQnID0+IDEsCiAgICAgICAgICAgICcyMDE2LTA1LTA2JyA9PiAxLAogICAgICAgICAgICAnMjAxNi0wNS0xNicgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJUFwcG9pbnRtZW50RGF5cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREYXlzKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CgogICAgICAgICMgY2hlY2sgZGF0ZXMKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFwlQXBwb2ludG1lbnREYXlzLAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVzdWx0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcJUFwcG9pbnRtZW50RGF5cywKICAgICAgICAgICAge30sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIyBnZXQgYSBmZXcgVW5pcXVlSURzIGluIHF1aWNrIHN1Y2Nlc3Npb24KbXkgQFVuaXF1ZUlEczsKZm9yICggMSAuLiAxMCApIHsKICAgIHB1c2ggQFVuaXF1ZUlEcywgJEFwcG9pbnRtZW50T2JqZWN0LT5HZXRVbmlxdWVJRCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgU3RhcnRUaW1lICA9PiAxNDUxNjA2NDAwLCAgICAjIHNhbWUgc3RhcnQgdGltZSAnMjAxNi0wMS0wMSAwMDowMDowMCcKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwp9CgpteSAlU2VlbjsKZm9yIG15ICRVbmlxdWVJRCAoQFVuaXF1ZUlEcykgewogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRTZWVueyRVbmlxdWVJRH0rKywKICAgICAgICAiVW5pcXVlSUQgJFVuaXF1ZUlEIGlzIHVuaXF1ZSIsCiAgICApOwp9CgojIGNyZWF0ZSBhbm90aGVyIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZTIgPSAndGVzdC1jYWxlbmRhci1ncm91cC0nIC4gJFJhbmRvbUlEIC4gJy0yJzsKbXkgJEdyb3VwSUQyICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lMiwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJEdyb3VwSUQyLAogICAgIlRlc3QgZ3JvdXAgJEdyb3VwSUQyIGNyZWF0ZWQiLAopOwoKIyBhZGQgdGVzdCB1c2VyIHRvIHRlc3QgZ3JvdXAgd2l0aCBybyBwZXJtaXNzaW9ucwpteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQyLAogICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgbW92ZV9pbnRvID0+IDAsCiAgICAgICAgY3JlYXRlICAgID0+IDAsCiAgICAgICAgb3duZXIgICAgID0+IDAsCiAgICAgICAgcHJpb3JpdHkgID0+IDAsCiAgICAgICAgcncgICAgICAgID0+IDAsCiAgICB9LAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlRlc3QgdXNlciAkVXNlcklEIGFkZGVkIHRvIHRlc3QgZ3JvdXAgJEdyb3VwSUQyIHdpdGggJ3JvJyIsCik7CgojIGNyZWF0ZSBhbm90aGVyIHRlc3QgY2FsZW5kYXIKbXkgJUNhbGVuZGFyMiA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyMi0kUmFuZG9tSUQiLAogICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRDIsCiAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKKTsKCiRTZWxmLT5UcnVlKAogICAgJENhbGVuZGFyMntDYWxlbmRhcklEfSwKICAgICJDYWxlbmRhckNyZWF0ZSAtICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0iLAopOwoKIwojIFRlc3RzIGZvciBBcHBvaW50bWVudERlbGV0ZSgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0FwcG9pbnRtZW50RGVsZXRlIC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERlbGV0ZSAtIE5vIEFwcG9pbnRtZW50SUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50RGVsZXRlIC0gTm8gVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREZWxldGUgLSBBbGwgcGFyYW1zJywKICAgICAgICBDcmVhdGUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMi0yOSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDItMjkgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAyLTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMi0yOSAwMDowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREZWxldGUgLSBObyBwZXJtaXNzaW9ucycsCiAgICAgICAgQ3JlYXRlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgID0+ICJBcHBvaW50bWVudC1STy0kUmFuZG9tSUQiLAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA3LTA0IDE5OjQ1OjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wNy0wNCAxOTo0NTowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wNy0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDctMDUgMDA6MDA6MDAnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICBpZiAoICRUZXN0LT57Q3JlYXRlfSApIHsKICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICV7ICRUZXN0LT57Q3JlYXRlfSB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEFwcG9pbnRtZW50IGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgc2F2ZSBhcHBvaW50bWVudCBpZAogICAgICAgICRUZXN0LT57Q29uZmlnfS0+e0FwcG9pbnRtZW50SUR9ID0gJEFwcG9pbnRtZW50SUQ7CgogICAgICAgICMgY2hlY2sgbGlzdAogICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgJXsgJFRlc3QtPntMaXN0fSB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBBcHBvaW50bWVudCBsaXN0IHN0YXJ0IiwKICAgICAgICApOwogICAgfQoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBsaXN0IGFnYWluCiAgICBpZiAoICRUZXN0LT57Q3JlYXRlfSApIHsKICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICV7ICRUZXN0LT57TGlzdH0gfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudExpc3QsCiAgICAgICAgICAgICRUZXN0LT57U3VjY2Vzc30gPyAwIDogMSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBBcHBvaW50bWVudCBsaXN0IGVuZCIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIE5vdGlmaWNhdGlvbnMKIwoKIyBub3RpZmljYXRpb24gY3JlYXRpb24gdGVzdCBkZWZpbml0aW9uCm15IEBOb3RpZmljYXRpb25DcmVhdGVUZXN0cyA9ICgKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIG5vdGlmaWNhdGlvbnMgZGlzYWJsZWQgZXhwbGljaXRseQogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdubyBub3RpZmljYXRpb24nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggd3Jvbmcgbm90aWZpY2F0aW9uIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ3dyb25nIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdXcm9uZ05vdGlmaWNhdGlvblRlbXBsYXRlJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1dyb25nTm90aWZpY2F0aW9uVGVtcGxhdGUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBub3RpZmljYXRpb24gMCBtaW51dGUgdGVtcGxhdGUgKEFwcG9pbnRtZW50U3RhcnQpCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiB0ZW1wbGF0ZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdTdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnU3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBub3RpZmljYXRpb24gMzAgbWludXRlcyB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgNCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdub3RpZmljYXRpb24gdGVtcGxhdGUgMzAgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzozMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTgwMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggbm90aWZpY2F0aW9uIDEyIGhvdXJzIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA0MzIwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMTI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDQzMjAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBub3RpZmljYXRpb24gMiBkYXlzIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA2JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAyIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMTcyODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTcyODAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBub3RpZmljYXRpb24gMSB3ZWVrIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA3JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxIHdlZWsgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNjA0ODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0yNSAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gNjA0ODAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgbWludXRlcyBiZWZvcmUgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA4JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGN1c3RvbSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgOScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBjdXN0b20gMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIyOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gY3VzdG9tIDIgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBtaW51dGVzIGFmdGVyIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMjowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYWZ0ZXIgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgaG91cnMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGFmdGVyIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGRheXMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgbWludXRlcyBiZWZvcmUgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMjM6NTg6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDE1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBob3VycyBiZWZvcmUgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMjI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDE2JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBkYXlzIGJlZm9yZSBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTcnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAyOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTgnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGhvdXJzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxOScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgZGF5cyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDQgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDIwJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGN1c3RvbSAwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgaG91cnMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gY3VzdG9tIDAgaG91cnMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBkYXlzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDIyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGN1c3RvbSAwIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgbWludXRlcyBhZnRlciBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDIzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBtaW51dGVzIGFmdGVyIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGhvdXJzIGFmdGVyIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIGhvdXJzIGFmdGVyIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgZGF5cyBhZnRlciBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDI1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBkYXlzIGFmdGVyIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYmVmb3JlIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDI2JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBtaW51dGVzIGJlZm9yZSBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGhvdXJzIGJlZm9yZSBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyNycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDAgaG91cnMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBkYXlzIGJlZm9yZSBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyOCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDAgZGF5cyBiZWZvcmUgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGFmdGVyIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDI5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBtaW51dGVzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGhvdXJzIGFmdGVyIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDMwJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBob3VycyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGRheXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIGRheXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIC0yMzQ1IGRheXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAtMjM0NSBkYXlzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gLTIzNDUsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMiBtaW51dGVzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDMzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyIGhvdXJzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDM0JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIyOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIyOjAwOjAwJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMiBkYXlzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDM1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMjowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDI6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMjowMCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIgaG91cnMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzcnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGhvdXJzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDI6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAyOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDI6MDA6MDAnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyIGRheXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzgnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGRheXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDQgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgfSwKICAgIH0sCik7CgojIG5vdGlmaWNhdGlvbiBjcmVhdGUgdGVzdCBleGVjdXRpb24KZm9yIG15ICRUZXN0IChATm90aWZpY2F0aW9uQ3JlYXRlVGVzdHMpIHsKCiAgICAjIGNyZWF0ZSBhcHBvaW50bWVudAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICV7ICRUZXN0LT57RGF0YX0gfSwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgY3JlYXRpb24KICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgY3JlYXRlZCAtICcgLiAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259LAogICAgKTsKCiAgICAjIHJldHJpZXZlIHN0b3JlZCBhcHBvaW50bWVudCBpbmZvcm1hdGlvbgogICAgbXkgJUFwcG9pbnRtZW50RGF0YSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgZGF0YSBnZXQKICAgIG15ICRDcmVhdGVkID0gSXNIYXNoUmVmV2l0aERhdGEoIFwlQXBwb2ludG1lbnREYXRhICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ3JlYXRlZCwKICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IGRhdGEgcmV0cmlldmVkIC0gJyAuICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0sCiAgICApOwoKICAgICMgdmVyaWZ5IHJlc3VsdHMKICAgIGZvciBteSAkUmVzdWx0S2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57UmVzdWx0fSB9ICkgewoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRBcHBvaW50bWVudERhdGF7JFJlc3VsdEtleX0sCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+eyRSZXN1bHRLZXl9LAogICAgICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IHJlc3VsdDogJyAuICRSZXN1bHRLZXkgLiAnIC0gJyAuICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgKTsKICAgIH0KfQoKIyBub3RpZmljYXRpb24gdXBkYXRlIHRlc3QgZGVmaW5pdGlvbgpteSBATm90aWZpY2F0aW9uVXBkYXRlVGVzdHMgPSAoCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSBubyB0ZW1wbGF0ZSB0byB3cm9uZyB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnQmVmb3JlIHVwZGF0ZSBubyBub3RpZmljYXRpb24nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byB3cm9uZyBub3RpZmljYXRpb24gdGVtcGxhdGUnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnV3JvbmdOb3RpZmljYXRpb25UZW1wbGF0ZScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdXcm9uZ05vdGlmaWNhdGlvblRlbXBsYXRlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gbm8gdGVtcGxhdGUgdG8gc3RhcnR0aW1lIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdCZWZvcmUgdXBkYXRlIG5vIG5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdTdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnU3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSBzdGFydHRpbWUgdGVtcGxhdGUgdG8gMzAgbWludXRlcyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIHRlbXBsYXRlIDMwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIHRlbXBsYXRlIDMwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMTgwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6MzA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDE4MDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIDMwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIDEyIGhvdXJzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA0JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgMTIgaG91cnMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNDMyMDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDEyOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA0MzIwMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gMTIgaG91cnMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIDIgZGF5cyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgMiBkYXlzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDQzMjAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE3MjgwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDE3MjgwMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gMiBkYXlzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA2JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxNzI4MDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnQmVmb3JlIHVwZGF0ZSB0byBubyBub3RpZmljYXRpb24nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gMTIgaG91cnMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIGN1c3RvbSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgNycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIHRlbXBsYXRlIGN1c3RvbSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNDMyMDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA3JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBjdXN0b20gMiBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzo1ODowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSBjdXN0b20gMiBtaW51dGVzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgOCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDgnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgojIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUgdG8gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgOScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgojIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDEwJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDEwJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzo1ODowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUgdG8gbm8gbm90aWZpY2F0aW9uIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDExJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGhvdXJzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUKICAgICMgdmVyaWZ5IHRoYXQgbm90IG5lZWRlZCB2YWx1ZXMgYXJlIGZsdXNoZWQgYWZ0ZXJ3YXJkcwogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDExJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm8gbm90aWZpY2F0aW9uIHRlbXBsYXRlJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDMwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCik7CgojIG5vdGlmaWNhdGlvbiB1cGRhdGUgdGVzdCBleGVjdXRpb24KZm9yIG15ICRUZXN0IChATm90aWZpY2F0aW9uVXBkYXRlVGVzdHMpIHsKCiAgICAjIGNyZWF0ZSBhcHBvaW50bWVudAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICV7ICRUZXN0LT57RGF0YUJlZm9yZX0gfSwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgY3JlYXRpb24KICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgY3JlYXRlZCAtICcgLiAkVGVzdC0+e0RhdGFCZWZvcmV9LT57RGVzY3JpcHRpb259LAogICAgKTsKCiAgICAjIHJldHJpZXZlIHN0b3JlZCBhcHBvaW50bWVudCBpbmZvcm1hdGlvbgogICAgbXkgJUFwcG9pbnRtZW50RGF0YSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgZGF0YSBnZXQKICAgIG15ICRDcmVhdGVkID0gSXNIYXNoUmVmV2l0aERhdGEoIFwlQXBwb2ludG1lbnREYXRhICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ3JlYXRlZCwKICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IGRhdGEgcmV0cmlldmVkIC0gJyAuICRUZXN0LT57RGF0YUJlZm9yZX0tPntEZXNjcmlwdGlvbn0sCiAgICApOwoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50CiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRVcGRhdGUoCiAgICAgICAgJXsgJFRlc3QtPntEYXRhQWZ0ZXJ9IH0sCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICMgdmVyaWZ5IGFwcG9pbnRtZW50IHVwZGF0ZQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCB1cGRhdGVkIC0gJyAuICRUZXN0LT57RGF0YUFmdGVyfS0+e0Rlc2NyaXB0aW9ufSwKICAgICk7CgogICAgIyByZXRyaWV2ZSBzdG9yZWQgYXBwb2ludG1lbnQgaW5mb3JtYXRpb24KICAgICVBcHBvaW50bWVudERhdGEgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICApOwoKICAgICMgdmVyaWZ5IGFwcG9pbnRtZW50IGRhdGEgZ2V0CiAgICAkQ3JlYXRlZCA9IElzSGFzaFJlZldpdGhEYXRhKCBcJUFwcG9pbnRtZW50RGF0YSApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENyZWF0ZWQsCiAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCBkYXRhIHJldHJpZXZlZCAtICcgLiAkVGVzdC0+e0RhdGFCZWZvcmV9LT57RGVzY3JpcHRpb259LAogICAgKTsKCiAgICAjIHZlcmlmeSByZXN1bHRzCiAgICBmb3IgbXkgJFJlc3VsdEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1Jlc3VsdH0gfSApIHsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQXBwb2ludG1lbnREYXRheyRSZXN1bHRLZXl9LAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0tPnskUmVzdWx0S2V5fSwKICAgICAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCByZXN1bHQ6ICcgLiAkUmVzdWx0S2V5IC4gJyAtICcgLiAkVGVzdC0+e0RhdGFBZnRlcn0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgKTsKICAgIH0KfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgb3ZlcnJpZGUgbG9jYWwgdGltZSB6b25lIGZvciBkdXJhdGlvbiBvZiB0aGUgdGVzdApsb2NhbCAkRU5We1RafSA9ICdVVEMnOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdApteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKIwojIFRlc3RzIGZvciBUaW1lQ2hlY2soKQojCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc3NpbmcgVGltZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdNaXNzaW5nIE9yaWdpbmFsVGltZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVGltZSA9PiAnMjAxNi0wMi0wMSAwMDowMjowMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQWxsIHBhcmFtcycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywKICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICcyMDE2LTAyLTAxIDAwOjAyOjAwJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gJzIwMTYtMDItMDEgMDA6MDE6MDAnLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICJUaW1lQ2hlY2sgLSAkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIlRpbWVDaGVjayAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBTeXN0ZW1UaW1lR2V0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBbGwgcGFyYW1zJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAnMTQ1MTYwNjQ2MCcsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICJTeXN0ZW1UaW1lR2V0IC0gJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICJTeXN0ZW1UaW1lR2V0IC0gJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MgIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIFRpbWVzdGFtcEdldCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ05vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQWxsIHBhcmFtcycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ1MTYwNjQ2MCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiVGltZXN0YW1wR2V0IC0gJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICJUaW1lc3RhbXBHZXQgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQ3VycmVudFRpbWVzdGFtcEdldCgpIGFuZCBDdXJyZW50U3lzdGVtVGltZSgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ05vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHRUaW1lc3RhbXAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRUaW1lc3RhbXBHZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwogICAgbXkgJFJlc3VsdFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRSZXN1bHRUaW1lc3RhbXAsCiAgICAgICAgICAgICJDdXJyZW50VGltZXN0YW1wR2V0IC0gJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRSZXN1bHRTeXN0ZW1UaW1lLAogICAgICAgICAgICAiQ3VycmVudFN5c3RlbVRpbWUgLSAkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRSZXN1bHRUaW1lc3RhbXAgPX4gL1xkezR9LVxkezJ9LVxkezJ9XHNcZHsyfTpcZHsyfTpcZHsyfS8sCiAgICAgICAgICAgICJDdXJyZW50VGltZXN0YW1wR2V0IC0gRXhwZWN0ZWQgZm9ybWF0IiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgSXNJbnRlZ2VyKCRSZXN1bHRTeXN0ZW1UaW1lKSAmJiAkUmVzdWx0U3lzdGVtVGltZSA+IDE0NjMwODE3ODEsCiAgICAgICAgICAgICJDdXJyZW50U3lzdGVtVGltZSAtIEV4cGVjdGVkIGZvcm1hdCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdFRpbWVzdGFtcCwKICAgICAgICAgICAgIkN1cnJlbnRUaW1lc3RhbXBHZXQgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUmVzdWx0U3lzdGVtVGltZSwKICAgICAgICAgICAgIkN1cnJlbnRTeXN0ZW1UaW1lIC0gJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MgIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIERhdGVHZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0ZyaWRheSwgMjAxNi0xMi0yMyAxNDowNToxMCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ4MjUwMTkxMCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gWwogICAgICAgICAgICAxMCwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMTQsCiAgICAgICAgICAgIDIzLAogICAgICAgICAgICAxMiwKICAgICAgICAgICAgMjAxNiwKICAgICAgICAgICAgNSwKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdTdW5kYXksIDIwMTYtMDUtMDggMDI6MDM6MDQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJzE0NjI2NzI5ODQnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IFsKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMywKICAgICAgICAgICAgMiwKICAgICAgICAgICAgOCwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMjAxNiwKICAgICAgICAgICAgNywKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgQFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXEBSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIkRhdGVHZXQgLSAkVGVzdC0+e05hbWV9IC0gUmVzdWx0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICBzY2FsYXIgQFJlc3VsdCwKICAgICAgICAgICAgIkRhdGVHZXQgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgRGF0ZTJTeXN0ZW1UaW1lKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdNaXNpbmcgWWVhcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgTW9udGggID0+ICcxJywKICAgICAgICAgICAgRGF5ICAgID0+ICcxJywKICAgICAgICAgICAgSG91ciAgID0+ICcxJywKICAgICAgICAgICAgTWludXRlID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdNaXNpbmcgTW9udGgnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFllYXIgICA9PiAnMjAxNicsCiAgICAgICAgICAgIERheSAgICA9PiAnMScsCiAgICAgICAgICAgIEhvdXIgICA9PiAnMScsCiAgICAgICAgICAgIE1pbnV0ZSA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnTWlzaW5nIERheScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgWWVhciAgID0+ICcyMDE2JywKICAgICAgICAgICAgTW9udGggID0+ICcxJywKICAgICAgICAgICAgSG91ciAgID0+ICcxJywKICAgICAgICAgICAgTWludXRlID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICcyMDE2LTAxLTAxIDAxOjAwOjAwJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBZZWFyICAgPT4gJzIwMTYnLAogICAgICAgICAgICBNb250aCAgPT4gJzEnLAogICAgICAgICAgICBEYXkgICAgPT4gJzEnLAogICAgICAgICAgICBIb3VyICAgPT4gJzEnLAogICAgICAgICAgICBNaW51dGUgPT4gJzAnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAnMTQ1MTYxMDAwMCcsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlMlN5c3RlbVRpbWUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIkRhdGUyU3lzdGVtVGltZSAtICRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICJEYXRlMlN5c3RlbVRpbWUgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQWRkUGVyaW9kKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdNaXNpbmcgVGltZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgWWVhcnMgID0+ICcxJywKICAgICAgICAgICAgTW9udGhzID0+ICcxJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBbGwgcGFyYW1zJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lICAgPT4gJzE0NjI4NzExNjInLAogICAgICAgICAgICBZZWFycyAgPT4gJzEnLAogICAgICAgICAgICBNb250aHMgPT4gJzEnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAnMTQ5NzA4NTU2MicsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIkFkZFBlcmlvZCAtICRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICJBZGRQZXJpb2QgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgVGltZXpvbmVPZmZzZXRHZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1VUQyAoQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lem9uZUlEID0+ICdVVEMnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAwLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDRVQgKENlbnRyYWwgRXVyb3BlYW4gVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0V1cm9wZS9CZXJsaW4nLAogICAgICAgICAgICBUaW1lICAgICAgID0+IDE0NTY3ODY4MDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IDEsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NFRFQgKENlbnRyYWwgRXVyb3BlYW4gU3VtbWVyIFRpbWUpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lem9uZUlEID0+ICdFdXJvcGUvQmVybGluJywKICAgICAgICAgICAgVGltZSAgICAgICA9PiAxNDYyODcxMTYyLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAyLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDU1QgKENlbnRyYWwgU3RhbmRhcmQgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0FtZXJpY2EvTWV4aWNvX0NpdHknLAogICAgICAgICAgICBUaW1lICAgICAgID0+IDE0NTY3ODY4MDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IC02LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDRFQgKENlbnRyYWwgRGF5bGlnaHQgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0FtZXJpY2EvTWV4aWNvX0NpdHknLAogICAgICAgICAgICBUaW1lICAgICAgID0+IDE0NjI4NzExNjIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IC01LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdJU1QgKEluZGlhIFN0YW5kYXJkIFRpbWUpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lem9uZUlEID0+ICdBc2lhL0NhbGN1dHRhJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gNS41LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdOUFQgKE5lcGFsIFRpbWUpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lem9uZUlEID0+ICdBc2lhL0thdGhtYW5kdScsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IDUuNzUsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ091dGxvb2sgZXhwb3J0IChub24tc3RhbmRhcmQgZm9ybWF0KScsICAgICMgYnVnIzEyNDg1CiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAnKFVUQy0wMjozMCkgTmV3Zm91bmRsYW5kIFN0YW5kYXJkIFRpbWUgKE5TVCknLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAtMi41LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIlRpbWV6b25lT2Zmc2V0R2V0IC0gJFRlc3QtPntOYW1lfSAtIFJlc3VsdCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIlRpbWV6b25lT2Zmc2V0R2V0IC0gJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MgIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIFdlZWtEZXRhaWxzR2V0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdTdW5kYXksIDIwMTctMDUtMTQgMDU6MDU6MDUsIENXMTknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJzE0OTQ3MzgzMDUnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IFsKICAgICAgICAgICAgNywKICAgICAgICAgICAgMTksCiAgICAgICAgXSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15IEBSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcQFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiV2Vla0RldGFpbHNHZXQgLSAkVGVzdC0+e05hbWV9IC0gUmVzdWx0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICBzY2FsYXIgQFJlc3VsdCwKICAgICAgICAgICAgIldlZWtEZXRhaWxzR2V0IC0gJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MgIiwKICAgICAgICApOwogICAgfQp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkQ29uZmlnT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwpteSAkUGx1Z2luT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwpteSAkTWFpbk9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwpteSAkR3JvdXBPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJFVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKbXkgJFRpY2tldE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKIyBnZXQgcmVnaXN0ZXJlZCBwbHVnaW4gbW9kdWxlcwpteSAkUGx1Z2luQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJBcHBvaW50bWVudENhbGVuZGFyOjpQbHVnaW4iKTsKbXkgJFBsdWdpbkNvdW50ICA9IHNjYWxhciBrZXlzICV7JFBsdWdpbkNvbmZpZ307CgpteSAkUGx1Z2luTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKCiRTZWxmLT5UcnVlKAogICAgJFBsdWdpbkxpc3QsCiAgICAnUGx1Z2luIGxpc3QgbG9hZGVkJywKKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBrZXlzICV7JFBsdWdpbkxpc3R9LAogICAgJFBsdWdpbkNvdW50LAogICAgJ1JlZ2lzdGVyZWQgcGx1Z2luIGNvdW50JywKKTsKCm15ICRQbHVnaW5LZXlUaWNrZXQ7CgojIGNoZWNrIGFsbCByZWdpc3RlcmVkIHBsdWdpbiBtb2R1bGVzClBMVUdJTjoKZm9yIG15ICRQbHVnaW5LZXkgKCBzb3J0IGtleXMgJXskUGx1Z2luQ29uZmlnfSApIHsKCiAgICBteSAkR2VuZXJpY01vZHVsZSA9ICRQbHVnaW5Db25maWctPnskUGx1Z2luS2V5fS0+e01vZHVsZX07CiAgICBuZXh0IFBMVUdJTiBpZiAhJEdlbmVyaWNNb2R1bGU7CgogICAgaWYgKCAkR2VuZXJpY01vZHVsZSBlcSAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW46OlRpY2tldCcgKSB7CiAgICAgICAgJFBsdWdpbktleVRpY2tldCA9ICRQbHVnaW5LZXk7CiAgICB9CgogICAgIyBjaGVjayBpZiBtb2R1bGUgY2FuIGJlIHJlcXVpcmVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSksCiAgICAgICAgIlJlcXVpcmVkICckR2VuZXJpY01vZHVsZScgcGx1Z2luIG1vZHVsZSIsCiAgICApOwoKICAgIG15ICRQbHVnaW5Nb2R1bGUgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgY2hlY2sgaWYgbW9kdWxlIGhhcyBiZWVuIGxvYWRlZAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFBsdWdpbk1vZHVsZSwKICAgICAgICAiUGx1Z2luIG1vZHVsZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5IiwKICAgICk7CgogICAgIyBjaGVjayBjbGFzcyBuYW1lCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkUGx1Z2luTW9kdWxlLT5pc2EoJEdlbmVyaWNNb2R1bGUpLAogICAgICAgICdQbHVnaW4gbW9kdWxlIGhhcyBjb3JyZWN0IHBhY2thZ2UgbmFtZScsCiAgICApOwoKICAgICMgY2hlY2sgcmVxdWlyZWQgbWV0aG9kcwogICAgZm9yIG15ICRNZXRob2ROYW1lIChxdyhMaW5rQWRkIExpbmtMaXN0IFNlYXJjaCkpIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFBsdWdpbk1vZHVsZS0+Y2FuKCRNZXRob2ROYW1lKSwKICAgICAgICAgICAgIlBsdWdpbiBtb2R1bGUgaW1wbGVtZW50cyAkTWV0aG9kTmFtZSgpIiwKICAgICAgICApOwogICAgfQoKICAgIG15ICRQbHVnaW5VUkwgPSAkUGx1Z2luQ29uZmlnLT57JFBsdWdpbktleX0tPntVUkx9OwoKICAgICMgY2hlY2sgaWYgVVJMIGNvbnRhaW5zIElEIHBsYWNlaG9sZGVyCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICBzY2FsYXIgJFBsdWdpblVSTCA9fiAvJXMvLAogICAgICAgICdQbHVnaW4gbW9kdWxlIFVSTCBjb250YWlucyBJRCBwbGFjZWhvbGRlcicsCiAgICApOwp9CgojIGNoZWNrIHRpY2tldCBwbHVnaW4gaWYgcmVnaXN0ZXJlZAppZiAoJFBsdWdpbktleVRpY2tldCkgewoKICAgICMgY3JlYXRlIHRlc3QgZ3JvdXAKICAgIG15ICRHcm91cE5hbWUgPSAndGVzdC1jYWxlbmRhci1ncm91cC0nIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgIG15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkR3JvdXBJRCwKICAgICAgICAiVGVzdCBncm91cCAkR3JvdXBJRCBjcmVhdGVkIiwKICAgICk7CgogICAgIyBjcmVhdGUgdGVzdCB1c2VyCiAgICBteSAkVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgR3JvdXBzID0+IFsgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgKTsKICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRVc2VyTG9naW4gKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVXNlcklELAogICAgICAgICJUZXN0IHVzZXIgJFVzZXJJRCBjcmVhdGVkIiwKICAgICk7CgogICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAjIGNyZWF0ZSBhIHRlc3QgdGlja2V0CiAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgVGl0bGUgICAgICAgID0+ICdUZXN0IFRpY2tldCAnIC4gJFJhbmRvbUlELAogICAgICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdvcGVuJywKICAgICAgICBDdXN0b21lck5vICAgPT4gJzEyMzQ2NScsCiAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICdjdXN0b21lckBleGFtcGxlLmNvbScsCiAgICAgICAgT3duZXJJRCAgICAgID0+ICRVc2VySUQsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFRpY2tldElELAogICAgICAgICJUaWNrZXRDcmVhdGUoKSAtICRUaWNrZXRJRCIsCiAgICApOwogICAgbXkgJFRpY2tldE51bWJlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGlja2V0TnVtYmVyLAogICAgICAgICJUaWNrZXROdW1iZXJMb29rdXAoKSAtICRUaWNrZXROdW1iZXIiLAogICAgKTsKCiAgICAjIGNyZXRlIHRlc3QgY2FsZW5kYXIKICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICdUZXN0IENhbGVuZGFyICcgLiAkUmFuZG9tSUQsCiAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAiQ2FsZW5kYXJDcmVhdGUoKSAtICRDYWxlbmRhcntDYWxlbmRhcklEfSIsCiAgICApOwoKICAgICMgY3JlYXRlIHRlc3QgYXBwb2ludG1lbnQKICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBUaXRsZSAgICAgID0+ICdUZXN0IGFwcG9pbnRtZW50ICcgLiAkUmFuZG9tSUQsCiAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wMSAxMjowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wMSAxMzowMDowMCcsCiAgICAgICAgVGltZXpvbmVJRCA9PiAwLAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgIkFwcG9pbnRtZW50Q3JlYXRlKCkgLSAkQXBwb2ludG1lbnRJRCIsCiAgICApOwoKICAgICMgc2VhcmNoIHRoZSB0aWNrZXQgdmlhIHRpY2tldCBudW1iZXIKICAgIG15ICRSZXN1bHRMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luU2VhcmNoKAogICAgICAgIFNlYXJjaCAgICA9PiAkVGlja2V0TnVtYmVyLAogICAgICAgIFBsdWdpbktleSA9PiAkUGx1Z2luS2V5VGlja2V0LAogICAgICAgIFVzZXJJRCAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJFJlc3VsdExpc3QsCiAgICAgICAgewogICAgICAgICAgICAkVGlja2V0SUQgPT4gIiRUaWNrZXROdW1iZXIgVGVzdCBUaWNrZXQgJFJhbmRvbUlEIiwKICAgICAgICB9LAogICAgICAgICdQbHVnaW5TZWFyY2goKSAtIFNlYXJjaCByZXN1bHRzIChieSB0aWNrZXQgbnVtYmVyKScKICAgICk7CgogICAgIyBzZWFyY2ggdGhlIHRpY2tldCB2aWEgdGlja2V0IGlkCiAgICAkUmVzdWx0TGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpblNlYXJjaCgKICAgICAgICBPYmplY3RJRCAgPT4gJFRpY2tldElELAogICAgICAgIFBsdWdpbktleSA9PiAkUGx1Z2luS2V5VGlja2V0LAogICAgICAgIFVzZXJJRCAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJFJlc3VsdExpc3QsCiAgICAgICAgewogICAgICAgICAgICAkVGlja2V0SUQgPT4gIiRUaWNrZXROdW1iZXIgVGVzdCBUaWNrZXQgJFJhbmRvbUlEIiwKICAgICAgICB9LAogICAgICAgICdQbHVnaW5TZWFyY2goKSAtIFNlYXJjaCByZXN1bHRzIChieSB0aWNrZXQgSUQpJwogICAgKTsKCiAgICAjIGxpbmsgYXBwb2ludG1lbnQgd2l0aCB0aGUgdGlja2V0CiAgICBteSAkU3VjY2VzcyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtBZGQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXlUaWNrZXQsCiAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnUGx1Z2luTGlua0FkZCgpIC0gTGluayBhcHBvaW50bWVudCB0byB0aGUgdGlja2V0JywKICAgICk7CgogICAgIyB2ZXJpZnkgbGluawogICAgbXkgJExpbmtMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0xpc3QoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXlUaWNrZXQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkTGlua0xpc3QtPnskVGlja2V0SUR9LAogICAgICAgICdQbHVnaW5MaW5rTGlzdCgpIC0gVmVyaWZ5IGxpbmsgdG8gdGhlIHRpY2tldCcKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRMaW5rTGlzdC0+eyRUaWNrZXRJRH0tPntMaW5rSUR9LAogICAgICAgICRUaWNrZXRJRCwKICAgICAgICAnVGlja2V0SUQnLAogICAgKTsKCiAgICAjIGNoZWNrIFVSTAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJExpbmtMaXN0LT57JFRpY2tldElEfS0+e0xpbmtVUkx9ID1+IC9UaWNrZXRJRD0kVGlja2V0SUQvLAogICAgICAgICdUaWNrZXQgVVJMIGNvbnRhaW5zIHRpY2tldCBJRCcKICAgICAgICApLAoKICAgICAgICAjIGxpbmsgbmFtZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAkTGlua0xpc3QtPnskVGlja2V0SUR9LT57TGlua05hbWV9LAogICAgICAgICIkVGlja2V0TnVtYmVyIFRlc3QgVGlja2V0ICRSYW5kb21JRCIsCiAgICAgICAgJ0xpbmsgbmFtZScKICAgICAgICApLAoKICAgICAgICAjIGRlbGV0ZSBsaW5rcwogICAgICAgICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0RlbGV0ZSgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdQbHVnaW5MaW5rRGVsZXRlKCkgLSBMaW5rcyBkZWxldGVkJwogICAgKTsKCiAgICAjIHZlcmlmeSBsaW5rcyBoYXZlIGJlZW4gZGVsZXRlZAogICAgJExpbmtMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0xpc3QoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXlUaWNrZXQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJExpbmtMaXN0LAogICAgICAgIHt9LAogICAgICAgICdQbHVnaW5MaW5rTGlzdCgpIC0gRW1wdHkgbGluayBsaXN0JywKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpteSAkSGVscGVyICAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkTWFpbk9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwpteSAkR3JvdXBPYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJFVzZXJPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7Cm15ICREeW5hbWljRmllbGRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKbXkgJER5bmFtaWNGaWVsZFZhbHVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZFZhbHVlJyk7Cm15ICRDYWxlbmRhck9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cm15ICRUaWNrZXRPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCm15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgojIGNyZWF0ZSB0ZXN0IHVzZXIKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKCk7Cm15ICRVc2VySUQgICAgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRVc2VyTG9naW4gKTsKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgIlRlc3RVc2VyQ3JlYXRlIC0gJFVzZXJJRCIsCik7CgojIGNyZWF0ZSB0ZXN0IGdyb3VwCm15ICRHcm91cE5hbWUgPSAnR3JvdXAnIC4gJFJhbmRvbUlEOwpteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRCwKICAgICJHcm91cEFkZCAtICRHcm91cE5hbWUgKCRHcm91cElEKSIsCik7CgojIGFkZCB0ZXN0IHVzZXIgdG8gdGVzdCBncm91cApteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBydyA9PiAxLAogICAgfSwKICAgIFVzZXJJRCA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlBlcm1pc3Npb25Hcm91cFVzZXJBZGQgLSBUZXN0IHVzZXIgJFVzZXJJRCBhZGRlZCB0byB0ZXN0IGdyb3VwICRHcm91cElEIiwKKTsKCiMgY3JlYXRlIHRlc3QgcXVldWUgd2l0aCBlc2NhbGF0aW9uIHJ1bGVzCm15ICRRdWV1ZU5hbWUgPSAnUXVldWUnIC4gJFJhbmRvbUlEOwpteSAkUXVldWVJRCAgID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUFkZCgKICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFF1ZXVlTmFtZSwKICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgIEdyb3VwSUQgICAgICAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDMwLAogICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiA3MCwKICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMjQwLAogICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA4MCwKICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMjQ0MCwKICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gOTAsCiAgICBTeXN0ZW1BZGRyZXNzSUQgICAgID0+IDEsCiAgICBTYWx1dGF0aW9uSUQgICAgICAgID0+IDEsCiAgICBTaWduYXR1cmVJRCAgICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsCiAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdTb21lIENvbW1lbnQnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRRdWV1ZUlELAogICAgIlF1ZXVlQWRkIC0gJFF1ZXVlTmFtZSAoJFF1ZXVlSUQpIiwKKTsKCiMgY3JlYXRlIHRlc3QgZHluYW1pYyBmaWVsZHMKbXkgQER5bmFtaWNGaWVsZHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZScgLiAkUmFuZG9tSUQsCiAgICAgICAgTGFiZWwgICAgICA9PiAnRGF0ZScgLiAkUmFuZG9tSUQsCiAgICAgICAgQ29uZmlnICAgICA9PiB7fSwKICAgICAgICBGaWVsZE9yZGVyID0+IDEwMDAwLAogICAgICAgIEZpZWxkVHlwZSAgPT4gJ0RhdGUnLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZVRpbWUnIC4gJFJhbmRvbUlELAogICAgICAgIExhYmVsICAgICAgPT4gJ0RhdGVUaW1lJyAuICRSYW5kb21JRCwKICAgICAgICBDb25maWcgICAgID0+IHt9LAogICAgICAgIEZpZWxkT3JkZXIgPT4gMTAwMDAsCiAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIH0sCik7CmZvciBteSAkRHluYW1pY0ZpZWxkIChARHluYW1pY0ZpZWxkcykgewogICAgbXkgJER5bmFtaWNGaWVsZElEID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkQWRkKAogICAgICAgICV7JER5bmFtaWNGaWVsZH0sCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJER5bmFtaWNGaWVsZElELAogICAgICAgICJEeW5hbWljRmllbGRBZGQgLSAkRHluYW1pY0ZpZWxkLT57TmFtZX0gKCREeW5hbWljRmllbGRJRCkiLAogICAgKTsKICAgICREeW5hbWljRmllbGQtPntEeW5hbWljRmllbGRJRH0gPSAkRHluYW1pY0ZpZWxkSUQ7Cn0KCiMgRnJlZXplIHRpbWUgYXQgdGhpcyBwb2ludCBzaW5jZSBjcmVhdGluZyB0aWNrZXRzIGFuZCBjaGVja2luZyByZXN1bHRzIGNhbiB0YWtlCiMgICBzZXZlcmFsIHNlY29uZHMgdG8gY29tcGxldGUuCiRIZWxwZXItPkZpeGVkVGltZVNldCgKICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKSwKKTsKCm15ICRUaWNrZXRDb3VudCA9IDM7CgojIGNyZWF0ZSBhIGZldyB0ZXN0IHRpY2tldHMKbXkgQFRpY2tldElEczsKZm9yIG15ICRDb3VudCAoIDEgLi4gJFRpY2tldENvdW50ICkgewogICAgbXkgJFRpY2tldFRpdGxlID0gIlRpY2tldCRSYW5kb21JRC0kQ291bnQiOwogICAgbXkgJFRpY2tldElEICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgIFRpdGxlICAgID0+ICRUaWNrZXRUaXRsZSwKICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICBQcmlvcml0eSA9PiAnMyBub3JtYWwnLAogICAgICAgIFN0YXRlICAgID0+ICdvcGVuJywKICAgICAgICBPd25lcklEICA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFRpY2tldElELAogICAgICAgICJUaWNrZXRDcmVhdGUoKSAtICRUaWNrZXRUaXRsZSAoJFRpY2tldElEKSIsCiAgICApOwoKICAgICMgY3JlYXRlIGFydGljbGUKICAgIG15ICRBcnRpY2xlSUQgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgIFRpY2tldElEICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBBcnRpY2xlVHlwZSAgICA9PiAnZW1haWwtZXh0ZXJuYWwnLAogICAgICAgIFNlbmRlclR5cGUgICAgID0+ICdjdXN0b21lcicsCiAgICAgICAgRnJvbSAgICAgICAgICAgPT4gJ1NvbWUgQ3VzdG9tZXIgQSA8Y3VzdG9tZXItYUBleGFtcGxlLmNvbT4nLAogICAgICAgIFRvICAgICAgICAgICAgID0+ICdTb21lIEFnZW50IDxlbWFpbEBleGFtcGxlLmNvbT4nLAogICAgICAgIFN1YmplY3QgICAgICAgID0+ICdzb21lIHNob3J0IGRlc2NyaXB0aW9uJywKICAgICAgICBCb2R5ICAgICAgICAgICA9PiAndGhlIG1lc3NhZ2UgdGV4dCcsCiAgICAgICAgQ29udGVudFR5cGUgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMTUnLAogICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICdFbWFpbEN1c3RvbWVyJywKICAgICAgICBIaXN0b3J5Q29tbWVudCA9PiAnQ3VzdG9tZXIgc2VudCBhbiBlbWFpbCcsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCkgKyA2MCAqIDYwICogMjQsICAgICMgKzI0aAogICAgKTsKICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgWWVhciAgICAgPT4gJFllYXIsCiAgICAgICAgTW9udGggICAgPT4gJE1vbnRoLAogICAgICAgIERheSAgICAgID0+ICREYXksCiAgICAgICAgSG91ciAgICAgPT4gJEhvdXIsCiAgICAgICAgTWludXRlICAgPT4gJE1pbnV0ZSwKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGlja2V0UGVuZGluZ1RpbWVTZXQgLSBUaWNrZXQgJFRpY2tldElEOiAiCiAgICAgICAgICAgIC4gc3ByaW50ZiggJyVkLSUwMmQtJTAyZCAlMDJkOiUwMmQnLCAkWWVhciwgJE1vbnRoLCAkRGF5LCAkSG91ciwgJE1pbnV0ZSApLAogICAgKTsKCiAgICAjIHNldCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkVmFsdWVPYmplY3QtPlZhbHVlU2V0KAogICAgICAgIEZpZWxkSUQgID0+ICREeW5hbWljRmllbGRzWzBdLT57RHluYW1pY0ZpZWxkSUR9LAogICAgICAgIE9iamVjdElEID0+ICRUaWNrZXRJRCwKICAgICAgICBWYWx1ZSAgICA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlRGF0ZVRpbWUgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlZhbHVlU2V0IC0gJER5bmFtaWNGaWVsZHNbMF0tPntEeW5hbWljRmllbGRJRH0gZm9yIHRpY2tldCAkVGlja2V0SUQiLAogICAgKTsKCiAgICAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgRmllbGRJRCAgPT4gJER5bmFtaWNGaWVsZHNbMV0tPntEeW5hbWljRmllbGRJRH0sCiAgICAgICAgT2JqZWN0SUQgPT4gJFRpY2tldElELAogICAgICAgIFZhbHVlICAgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWVEYXRlVGltZSA9PiAnMjAxNi0wMS0wMSAxMjowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVmFsdWVTZXQgLSAkRHluYW1pY0ZpZWxkc1sxXS0+e0R5bmFtaWNGaWVsZElEfSBmb3IgdGlja2V0ICRUaWNrZXRJRCIsCiAgICApOwoKICAgIHB1c2ggQFRpY2tldElEcywgJFRpY2tldElEOwp9CgojIGNyZWF0ZSB0ZXN0IGNhbGVuZGFyCm15ICRDYWxlbmRhck5hbWUgPSAiQ2FsZW5kYXIkUmFuZG9tSUQiOwpteSAlQ2FsZW5kYXIgICAgID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAkQ2FsZW5kYXJOYW1lLAogICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwokU2VsZi0+VHJ1ZSgKICAgICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICJDYWxlbmRhckNyZWF0ZSAtICRDYWxlbmRhck5hbWUgKCRDYWxlbmRhcntDYWxlbmRhcklEfSkiLAopOwoKIyBHZW5lcmF0ZSBmZXcgcmFuZG9tIHN0cmluZ3MgZm9yIFJ1bGVJRHMuCm15IEBSdWxlSURzOwpmb3IgKCAxIC4uIDUgKSB7CiAgICBwdXNoIEBSdWxlSURzLCAkTWFpbk9iamVjdC0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgTGVuZ3RoICAgICA9PiAzMiwKICAgICAgICBEaWN0aW9uYXJ5ID0+IFsgMCAuLiA5LCAnYScgLi4gJ2YnIF0sCiAgICApOwp9CgojCiMgVGVzdHMgZm9yIHRpY2tldCBhcHBvaW50bWVudHMKIwpteSBAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdGaXJzdFJlc3BvbnNlVGltZScsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUnVsZUlEICAgICAgID0+ICRSdWxlSURzWzBdLAogICAgICAgICAgICAgICAgU3RhcnREYXRlICAgID0+ICdGaXJzdFJlc3BvbnNlVGltZScsCiAgICAgICAgICAgICAgICBFbmREYXRlICAgICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gWyRRdWV1ZUlEXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gIiokUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRUaWNrZXRDb3VudCwKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnQgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgIENsZWFudXAgICAgICAgICAgID0+IFtdLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUnVsZUlEICAgICAgID0+ICRSdWxlSURzWzFdLAogICAgICAgICAgICAgICAgU3RhcnREYXRlICAgID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgICAgIEVuZERhdGUgICAgICA9PiAnUGx1c18xNScsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gWyRRdWV1ZUlEXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gIiokUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRUaWNrZXRDb3VudCwKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnQgPT4gJ1VwZGF0ZVRpbWUnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgID0+ICdQbHVzXzE1JywKICAgICAgICAgICAgQ2xlYW51cCAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgPT4gJFJ1bGVJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUnVsZUlEICAgICAgID0+ICRSdWxlSURzWzJdLAogICAgICAgICAgICAgICAgU3RhcnREYXRlICAgID0+ICdTb2x1dGlvblRpbWUnLAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdQbHVzXzMwJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbJFF1ZXVlSURdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiKiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJFRpY2tldENvdW50LAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudCA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgID0+ICdQbHVzXzMwJywKICAgICAgICAgICAgQ2xlYW51cCAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgPT4gJFJ1bGVJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgPT4gJFJ1bGVJRHNbM10sCiAgICAgICAgICAgICAgICBTdGFydERhdGUgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICAgICAgICAgIEVuZERhdGUgICAgICA9PiAnUGx1c182MCcsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gWyRRdWV1ZUlEXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gIiokUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRUaWNrZXRDb3VudCwKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnQgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgPT4gJ1BsdXNfNjAnLAogICAgICAgICAgICBDbGVhbnVwICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUnVsZUlEICA9PiAkUnVsZUlEc1syXSwKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTAxLTAxIDAxOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIFVwZGF0ZVJlc3VsdCA9PiB7CiAgICAgICAgICAgIFVudGlsVGltZSA9PiAtKAogICAgICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpIC0KICAgICAgICAgICAgICAgICAgICAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgICA9PiAkUnVsZUlEc1s0XSwKICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkc1swXS0+e05hbWV9LAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRzWzFdLT57TmFtZX0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gWyRRdWV1ZUlEXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gIiokUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRUaWNrZXRDb3VudCwKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnQgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRzWzBdLT57TmFtZX0sCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRzWzFdLT57TmFtZX0sCiAgICAgICAgICAgIENsZWFudXAgICAgICAgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgID0+ICRSdWxlSURzWzNdLAogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gJzIwMTYtMDMtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgPT4gJzIwMTYtMDMtMDEgMDE6MDA6MDAnLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlUmVzdWx0ID0+IHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZHNbMF0tPntOYW1lfSA9PiAnMjAxNi0wMy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRzWzFdLT57TmFtZX0gPT4gJzIwMTYtMDMtMDEgMDE6MDA6MDAnLAogICAgICAgIH0sCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIHVwZGF0ZSB0ZXN0IGNhbGVuZGFyCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJVcGRhdGUoCiAgICAgICAgJUNhbGVuZGFyLAogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiAkVGVzdC0+e1RpY2tldEFwcG9pbnRtZW50c30sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDYWxlbmRhclVwZGF0ZSAtIFVwZGF0ZSB0aWNrZXQgYXBwb2ludG1lbnRzIHJ1bGUiLAogICAgKTsKCiAgICAjIFByb2Nlc3MgdGlja2V0IGFwcG9pbnRtZW50cyBvZiB0aGUgY2FsZW5kYXIuCiAgICBteSAlUmVzdWx0ID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcigKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICk7CgogICAgbXkgJVJlc3VsdENvbXBhcmU7CiAgICBmb3IgbXkgJFRpY2tldElEICggc29ydCBAVGlja2V0SURzICkgewogICAgICAgIHB1c2ggQHsgJFJlc3VsdENvbXBhcmV7UHJvY2Vzc30gfSwgewogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFJ1bGVJRCAgID0+ICRUZXN0LT57VGlja2V0QXBwb2ludG1lbnRzfS0+WzBdLT57UnVsZUlEfSwKICAgICAgICAgICAgU3VjY2VzcyAgPT4gMSwKICAgICAgICB9OwogICAgfQogICAgJFJlc3VsdENvbXBhcmV7Q2xlYW51cH0gPSAkVGVzdC0+e1Jlc3VsdH0tPntDbGVhbnVwfTsKCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgXCVSZXN1bHQsCiAgICAgICAgXCVSZXN1bHRDb21wYXJlLAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzQ2FsZW5kYXIgLSBSZXN1bHQiLAogICAgKTsKCiAgICAjIGdldCBhcHBvaW50bWVudHMKICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICk7CgogICAgIyBjaGVjayBhcHBvaW50bWVudCBjb3VudAogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzLAogICAgICAgICRUZXN0LT57UmVzdWx0fS0+e0NvdW50fSwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFRpY2tldCBhcHBvaW50bWVudCBjb3VudCIsCiAgICApOwoKICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IGlkIGJ5IHRpY2tldCBudW1iZXIKICAgICAgICAkQXBwb2ludG1lbnQtPntUaXRsZX0gPX4gLyMoWzAtOV0rKVxdLzsKICAgICAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRJRExvb2t1cCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICQxLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aWNrZXQKICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBhcHBvaW50bWVudCBpcyBvZiB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXBwb2ludG1lbnQtPntUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gVGlja2V0IGFwcG9pbnRtZW50IHR5cGUiLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkRmllbGQgKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICBteSAkS2V5ID0gJFRlc3QtPntSZXN1bHR9LT57JEZpZWxkfTsKCiAgICAgICAgICAgICMgZGV0ZXJtaW5lIHRpY2tldCB2YWx1ZSBmb3IgdGhlIGZpZWxkCiAgICAgICAgICAgIG15ICRUaWNrZXRWYWx1ZTsKCiAgICAgICAgICAgICMgZXNjYWxhdGlvbiB0aW1lcwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0tPnskRmllbGR9IGVxICdGaXJzdFJlc3BvbnNlVGltZScKICAgICAgICAgICAgICAgIHx8ICRUZXN0LT57UmVzdWx0fS0+eyRGaWVsZH0gZXEgJ1VwZGF0ZVRpbWUnCiAgICAgICAgICAgICAgICB8fCAkVGVzdC0+e1Jlc3VsdH0tPnskRmllbGR9IGVxICdTb2x1dGlvblRpbWUnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUaWNrZXRWYWx1ZSA9ICRUaWNrZXR7ICRUZXN0LT57UmVzdWx0fS0+eyRGaWVsZH0gLiAnRGVzdGluYXRpb25EYXRlJyB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHBlbmRpbmcgdGltZQogICAgICAgICAgICBlbHNpZiAoICRUZXN0LT57UmVzdWx0fS0+eyRGaWVsZH0gZXEgJ1BlbmRpbmdUaW1lJyApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRWYWx1ZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpICsgJFRpY2tldHtVbnRpbFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFRpY2tldFZhbHVlID0gJFRpY2tldHsgJFRlc3QtPntSZXN1bHR9LT57JEZpZWxkfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgc3RhcnQgdGltZSB2YWx1ZQogICAgICAgICAgICBpZiAoICRGaWVsZCBlcSAnU3RhcnRUaW1lJyApIHsKICAgICAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+e1N0YXJ0VGltZVZhbHVlfSA9ICRUaWNrZXRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkZXRlcm1pbmUgcHJlc2V0IHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZTsKICAgICAgICAgICAgaWYgKCAkS2V5ID1+IC9eUGx1c18oWzAtOV0rKSQvICkgewogICAgICAgICAgICAgICAgbXkgJFByZXNldCA9IGludCAkMTsKCiAgICAgICAgICAgICAgICAjIGdldCBzdGFydCB0aW1lCiAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVGVzdC0+e1Jlc3VsdH0tPntTdGFydFRpbWVWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIGVuZCB0aW1lIHVzaW5nIHByZXNldCB2YWx1ZQogICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkU3RhcnRUaW1lICsgNjAgKiAkUHJlc2V0OwogICAgICAgICAgICAgICAgJFRpY2tldFZhbHVlID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29tcGFyZSB2YWx1ZXMKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57JEZpZWxkfSwKICAgICAgICAgICAgICAgICRUaWNrZXRWYWx1ZSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQXBwb2ludG1lbnQgJEZpZWxkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJFRlc3QtPntVcGRhdGV9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRVcGRhdGUoCiAgICAgICAgICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICAleyAkVGVzdC0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBBcHBvaW50bWVudCB1cGRhdGUiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYW51YWxseSB0cmlnZ2VyIGFwcG9pbnRtZW50IGV2ZW50IG1vZHVsZQogICAgICAgICAgICAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50VXBkYXRlVGlja2V0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnVGlja2V0JyApOwoKICAgICAgICAgICAgIyBnZXQgdGlja2V0IGRhdGEgYWdhaW4KICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb21wYXJlIHZhbHVlcwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICV7ICRUZXN0LT57VXBkYXRlUmVzdWx0fSB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAkVGVzdC0+e1VwZGF0ZVJlc3VsdH0tPnskRmllbGR9LAogICAgICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gVGlja2V0ICRGaWVsZCIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgojIENsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UuCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgb3ZlcnJpZGUgbG9jYWwgdGltZSB6b25lIGZvciBkdXJhdGlvbiBvZiB0aGUgdGVzdApsb2NhbCAkRU5We1RafSA9ICdVVEMnOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJFVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKbXkgJEdyb3VwT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7Cm15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cm15ICRFeHBvcnRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXhwb3J0OjpJQ2FsJyk7Cm15ICRJbXBvcnRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SW1wb3J0OjpJQ2FsJyk7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGNyZWF0ZSB0ZXN0IHVzZXIKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKCk7Cm15ICRVc2VySUQgICAgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRVc2VyTG9naW4gKTsKCiRTZWxmLT5UcnVlKAogICAgJFVzZXJJRCwKICAgICJUZXN0IHVzZXIgJFVzZXJJRCBjcmVhdGVkIiwKKTsKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZSA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJEdyb3VwSUQsCiAgICAiVGVzdCBncm91cCAkVXNlcklEIGNyZWF0ZWQiLAopOwoKIyBhZGQgdGVzdCB1c2VyIHRvIHRlc3QgZ3JvdXAKbXkgJFN1Y2Nlc3MgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cFVzZXJBZGQoCiAgICBHSUQgICAgICAgID0+ICRHcm91cElELAogICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgY3JlYXRlICAgID0+IDEsCiAgICAgICAgb3duZXIgICAgID0+IDEsCiAgICAgICAgcHJpb3JpdHkgID0+IDEsCiAgICAgICAgcncgICAgICAgID0+IDEsCiAgICB9LAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlRlc3QgdXNlciAkVXNlcklEIGFkZGVkIHRvIHRlc3QgZ3JvdXAgJEdyb3VwSUQiLAopOwoKbXkgQFRlYW1JRDsKbXkgQFJlc291cmNlSUQ7CgojIGNoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQKaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKCiAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwoKICAgICMgY3JlYXRlIHRlc3QgdGVhbQogICAgbXkgJFRlYW1OYW1lID0gJ3Rlc3QtdGVhbS0nIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICRTdWNjZXNzID0gJFRlYW1PYmplY3QtPlRlYW1BZGQoCiAgICAgICAgTmFtZSAgICA9PiAkVGVhbU5hbWUsCiAgICAgICAgR3JvdXBJRCA9PiAkR3JvdXBJRCwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnVGVhbUFkZCgpIC0gVGVzdCB0ZWFtIGNyZWF0ZWQnLAogICAgKTsKCiAgICBteSAlVGVhbSA9ICRUZWFtT2JqZWN0LT5UZWFtR2V0KAogICAgICAgIE5hbWUgICA9PiAkVGVhbU5hbWUsCiAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTdWNjZXNzID0gJFRlYW1PYmplY3QtPlRlYW1Vc2VyQWRkKAogICAgICAgIFRlYW1JRCAgICAgPT4gJFRlYW17SUR9LAogICAgICAgIFRlYW1Vc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZWFtVXNlckFkZCgpIC0gQWRkZWQgdGVzdCB1c2VyIHRvIHRlc3QgdGVhbScsCiAgICApOwoKICAgIHB1c2ggQFRlYW1JRCwgICAgICRUZWFte0lEfTsKICAgIHB1c2ggQFJlc291cmNlSUQsICRVc2VySUQ7Cn0KCiMgY3JlYXRlIGEgdGVzdCBjYWxlbmRhciBmb3IgZXhwb3J0Cm15ICRFeHBvcnRDYWxlbmRhck5hbWUgPSAnRXhwb3J0ICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAlRXhwb3J0Q2FsZW5kYXIgICAgID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAkRXhwb3J0Q2FsZW5kYXJOYW1lLAogICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAiQ2FsZW5kYXJDcmVhdGUoIENhbGVuZGFyTmFtZSA9PiAnJEV4cG9ydENhbGVuZGFyTmFtZScsIENvbG9yID0+ICcjM0E4N0FEJywgR3JvdXBJRCA9PiAkR3JvdXBJRCwgVXNlcklEID0+ICRVc2VySUQgKSAtIENhbGVuZGFySUQ6ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSIsCik7CgojIHNhbXBsZSBhcHBvaW50bWVudHMKbXkgQEFwcG9pbnRtZW50cyA9ICgKCiAgICAjIHJlZ3VsYXIKICAgIHsKICAgICAgICBDYWxlbmRhcklEICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgPT4gJzIwMTYtMDMtMDEgMTA6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgID0+ICcyMDE2LTAzLTAxIDEyOjAwOjAwJywKICAgICAgICBUaXRsZSAgICAgICA9PiAnUmVndWxhciBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NhbXBsZSBkZXNjcmlwdGlvbicsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyBhbGwtZGF5IHdpdGggcmVzb3VyY2UKICAgIHsKICAgICAgICBDYWxlbmRhcklEID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAzLTAyIDAwOjAwOjAwJywKICAgICAgICBBbGxEYXkgICAgID0+IDEsCiAgICAgICAgVGl0bGUgICAgICA9PiAnQWxsLWRheSBBcHBvaW50bWVudCcsCiAgICAgICAgTG9jYXRpb24gICA9PiAnU2FtcGxlIGxvY2F0aW9uJywKICAgICAgICBUZWFtSUQgICAgID0+IFxAVGVhbUlELAogICAgICAgIFJlc291cmNlSUQgPT4gXEBSZXNvdXJjZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyByZWN1cnJpbmcgZGFpbHkKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICA9PiAnMjAxNi0wMy0wMSAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgPT4gJ0RhaWx5JywKICAgICAgICBSZWN1cnJlbmNlQ291bnQgPT4gMywKICAgICAgICBUaXRsZSAgICAgICAgICAgPT4gJ1JlY3VycmluZyBEYWlseSBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdFdmVyeSBkYXksIGZvciAzIGRheXMnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIHJlY3VycmluZyB3ZWVrbHkKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICA9PiAnMjAxNi0wMy0wMiAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgID0+ICcyMDE2LTAzLTAyIDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgPT4gJ1dlZWtseScsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ID0+IDMsCiAgICAgICAgVGl0bGUgICAgICAgICAgID0+ICdSZWN1cnJpbmcgV2Vla2x5IEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0V2ZXJ5IHdlZWssIGZvciAzIHdlZWtzJywKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyByZWN1cnJpbmcgbW9udGhseQogICAgewogICAgICAgIENhbGVuZGFySUQgICAgICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgID0+ICcyMDE2LTAzLTAzIDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgPT4gJzIwMTYtMDMtMDMgMTY6MDA6MDAnLAogICAgICAgIFJlY3VycmluZyAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICA9PiAnTW9udGhseScsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ID0+IDMsCiAgICAgICAgVGl0bGUgICAgICAgICAgID0+ICdSZWN1cnJpbmcgTW9udGhseSBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdFdmVyeSBtb250aCwgZm9yIDMgbW9udGhzJywKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyByZWN1cnJpbmcgeWVhcmx5CiAgICB7CiAgICAgICAgQ2FsZW5kYXJJRCAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgPT4gJzIwMTYtMDMtMDQgMTU6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICA9PiAnMjAxNi0wMy0wNCAxNjowMDowMCcsCiAgICAgICAgUmVjdXJyaW5nICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgID0+ICdZZWFybHknLAogICAgICAgIFJlY3VycmVuY2VDb3VudCA9PiAzLAogICAgICAgIFRpdGxlICAgICAgICAgICA9PiAnUmVjdXJyaW5nIFllYXJseSBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdFdmVyeSBZZWFybHksIGZvciAzIHllYXJzJywKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyBjdXN0b20gZGFpbHkgcmVjdXJyaW5nCiAgICB7CiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTU6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdDdXN0b21EYWlseScsCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDIsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgID0+IDMsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdDdXN0b20gRGFpbHkgUmVjdXJyaW5nIEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgPT4gJ0V2ZXJ5IDIgZGF5cywgMyB0aW1lcycsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICB9LAoKICAgICMgIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nCiAgICB7CiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wMy0wMiAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMiAxNjowMDowMCcsCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLAogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAxLCAzLCA3IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1vbiwgV2VkLCBTdW4KICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgID0+IDYsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIFdlZWtseSBSZWN1cnJpbmcgQXBwb2ludG1lbnQnLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgPT4gJ0V2ZXJ5IG1vbmRheSwgd2VkbmVzZGF5IGFuZCBzdW5kYXksIDYgYXBwb2ludG1lbnRzJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICB9LAoKICAgICMgY3VzdG9tIG1vbnRobHkgcmVjdXJyaW5nIG1vbnRobHkKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAzLTAzIDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAzLTAzIDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tTW9udGhseScsCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLAogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAxLCAzLCAzMSBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxc3QsIDN0aCBhbmQgMzFzdAogICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgPT4gJzIwMTctMTAtMDEgMDA6MDA6MDAnLAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBNb250aGx5IFJlY3VycmluZyBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnRXZlcnkgMXN0LCAzdGggYW5kIDMxc3QgZGF5LCB1bnRpbCAyMDE3LTEwLTAxJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICB9LAoKICAgICMgY3VzdG9tIHllYXJseSByZWN1cnJpbmcgeWVhcmx5CiAgICB7CiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wMy0wNCAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMy0wNCAxNjowMDowMCcsCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVllYXJseScsCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDMsIDEyIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgamFuLCBtYXIsIGRlYwogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwKICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgID0+IDEwLAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBZZWFybHkgUmVjdXJyaW5nIEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICdFdmVyeSAyIFllYXJzIGluIEphbiwgRmViIGFuZCBNYXIgLSAxMCB0aW1lcycsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgfSwKKTsKCmZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICJBcHBvaW50bWVudENyZWF0ZSgpIC0gQXBwb2ludG1lbnRJRDogJEFwcG9pbnRtZW50SUQiLAogICAgKTsKfQoKIyBleHBvcnQgYXBwb2ludG1lbnRzCm15ICRJQ2FsU3RyaW5nID0gJEV4cG9ydE9iamVjdC0+RXhwb3J0KAogICAgQ2FsZW5kYXJJRCA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCik7CgojIGdldCBleHBvcnRlZCBhcHBvaW50bWVudHMKbXkgQEV4cG9ydGVkQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICBDYWxlbmRhcklEID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAopOwoKJFNlbGYtPlRydWUoCiAgICAkSUNhbFN0cmluZywKICAgICdFeHBvcnQoKSAtIENhbGVuZGFyIGV4cG9ydGVkIHRvIGlDYWwgZm9ybWF0JywKKTsKCiMgY3JlYXRlIGEgdGVzdCBjYWxlbmRhciBmb3IgaW1wb3J0Cm15ICRJbXBvcnRDYWxlbmRhck5hbWUgPSAnSW1wb3J0ICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAlSW1wb3J0Q2FsZW5kYXIgICAgID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAkSW1wb3J0Q2FsZW5kYXJOYW1lLAogICAgQ29sb3IgICAgICAgID0+ICcjRUM5MDczJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkSW1wb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAiQ2FsZW5kYXJDcmVhdGUoIENhbGVuZGFyTmFtZSA9PiAnJEltcG9ydENhbGVuZGFyTmFtZScsIEdyb3VwSUQgPT4gJEdyb3VwSUQsIFVzZXJJRCA9PiAkVXNlcklEICkgLSBDYWxlbmRhcklEOiAkSW1wb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0iLAopOwoKIyBpbXBvcnQgYXBwb2ludG1lbnRzCiRTdWNjZXNzID0gJEltcG9ydE9iamVjdC0+SW1wb3J0KAogICAgQ2FsZW5kYXJJRCA9PiAkSW1wb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBJQ2FsICAgICAgID0+ICRJQ2FsU3RyaW5nLAogICAgVXNlcklEICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICdJbXBvcnQoKSAtIENhbGVuZGFyIGltcG9ydGVkIGZyb20gaUNhbCBmb3JtYXQnLAopOwoKIyBnZXQgaW1wb3J0ZWQgYXBwb2ludG1lbnRzCm15IEBJbXBvcnRlZEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgQ2FsZW5kYXJJRCA9PiAkSW1wb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKKTsKCiMgbnVtYmVyIG9mIGltcG9ydGVkIGFuZCBleHBvcnRlZCBhcHBvaW50bWVudHMgbWF0Y2gKJFNlbGYtPklzKAogICAgc2NhbGFyIEBJbXBvcnRlZEFwcG9pbnRtZW50cywKICAgIHNjYWxhciBARXhwb3J0ZWRBcHBvaW50bWVudHMsCiAgICAnSW1wb3J0ZWQgYXBwb2ludG1lbnQgY291bnQnCik7CgpteSAkQ291bnQgPSAxOwpmb3IgbXkgJEltcG9ydGVkQXBwb2ludG1lbnQgKEBJbXBvcnRlZEFwcG9pbnRtZW50cykgewoKICAgICMgZGVsZXRlIHNwZWNpZmljIGtleXMKICAgIGRlbGV0ZSAkSW1wb3J0ZWRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwogICAgZGVsZXRlICRJbXBvcnRlZEFwcG9pbnRtZW50LT57Q2FsZW5kYXJJRH07CiAgICBkZWxldGUgJEltcG9ydGVkQXBwb2ludG1lbnQtPntVbmlxdWVJRH07CiAgICBkZWxldGUgJEltcG9ydGVkQXBwb2ludG1lbnQtPntQYXJlbnRJRH07CiAgICBkZWxldGUgJEV4cG9ydGVkQXBwb2ludG1lbnRzWyAkQ291bnQgLSAxIF0tPntBcHBvaW50bWVudElEfTsKICAgIGRlbGV0ZSAkRXhwb3J0ZWRBcHBvaW50bWVudHNbICRDb3VudCAtIDEgXS0+e0NhbGVuZGFySUR9OwogICAgZGVsZXRlICRFeHBvcnRlZEFwcG9pbnRtZW50c1sgJENvdW50IC0gMSBdLT57VW5pcXVlSUR9OwogICAgZGVsZXRlICRFeHBvcnRlZEFwcG9pbnRtZW50c1sgJENvdW50IC0gMSBdLT57UGFyZW50SUR9OwoKICAgICMgY29tcGFyZSBpbXBvcnRlZCBhbmQgZXhwb3J0ZWQgYXBwb2ludG1lbnRzCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJEltcG9ydGVkQXBwb2ludG1lbnQsCiAgICAgICAgJEV4cG9ydGVkQXBwb2ludG1lbnRzWyAkQ291bnQgLSAxIF0sCiAgICAgICAgIkltcG9ydGVkIGFwcG9pbnRtZW50ICRDb3VudCIsCiAgICApOwogICAgJENvdW50Kys7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgT3ZlcnJpZGUgbG9jYWwgdGltZSB6b25lIGZvciBkdXJhdGlvbiBvZiB0aGUgdGVzdC4gVGhpcyBpcyByZXF1aXJlZCBzaW5jZSBleHBlY3RlZCBpbXBvcnRlZCBkYXRlCiMgICB2YWx1ZXMgYXJlIGFsbCBpbiBVVEMuCmxvY2FsICRFTlZ7VFp9ID0gJ1VUQyc7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7Cm15ICRVc2VyT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgojIGNyZWF0ZSB0ZXN0IHVzZXIKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKCk7Cm15ICRVc2VySUQgICAgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRVc2VyTG9naW4gKTsKCiRTZWxmLT5UcnVlKAogICAgJFVzZXJJRCwKICAgICJUZXN0IHVzZXIgJFVzZXJJRCBjcmVhdGVkIiwKKTsKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZSA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJEdyb3VwSUQsCiAgICAiVGVzdCBncm91cCAkVXNlcklEIGNyZWF0ZWQiLAopOwoKIyBhZGQgdGVzdCB1c2VyIHRvIHRlc3QgZ3JvdXAKbXkgJFN1Y2Nlc3MgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cFVzZXJBZGQoCiAgICBHSUQgICAgICAgID0+ICRHcm91cElELAogICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgY3JlYXRlICAgID0+IDEsCiAgICAgICAgb3duZXIgICAgID0+IDEsCiAgICAgICAgcHJpb3JpdHkgID0+IDEsCiAgICAgICAgcncgICAgICAgID0+IDEsCiAgICB9LAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlRlc3QgdXNlciAkVXNlcklEIGFkZGVkIHRvIHRlc3QgZ3JvdXAgJEdyb3VwSUQiLAopOwoKbXkgQFRlYW1JRDsKbXkgQFJlc291cmNlSUQ7CgojIGNoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQKaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKCiAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwoKICAgICMgY3JlYXRlIHRlc3QgdGVhbQogICAgJFN1Y2Nlc3MgPSAkVGVhbU9iamVjdC0+VGVhbUFkZCgKICAgICAgICBOYW1lICAgID0+ICdUZXN0IFRlYW0nLAogICAgICAgIEdyb3VwSUQgPT4gMSwgICAgICAgICAgICAgIyBhZG1pbgogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsICAgICAgICAgICAgICMgcm9vdAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnVGVhbUFkZCgpIC0gVGVzdCB0ZWFtIGNyZWF0ZWQnLAogICAgKTsKCiAgICBteSAlVGVhbSA9ICRUZWFtT2JqZWN0LT5UZWFtR2V0KAogICAgICAgIE5hbWUgICA9PiAnVGVzdCBUZWFtJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJBZGQoCiAgICAgICAgVGVhbUlEICAgICA9PiAkVGVhbXtJRH0sCiAgICAgICAgVGVhbVVzZXJJRCA9PiAxLCAgICAgICAgICAgIyByb290CiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnVGVhbVVzZXJBZGQoKSAtIEFkZGVkIHJvb3QgdXNlciB0byB0ZXN0IHRlYW0nLAogICAgKTsKCiAgICBwdXNoIEBUZWFtSUQsICAgICAkVGVhbXtJRH07CiAgICBwdXNoIEBSZXNvdXJjZUlELCAxOwp9CgojIHRoaXMgd2lsbCBiZSBvawpteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICdUZXN0IGNhbGVuZGFyJywKICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKKTsKCiRTZWxmLT5UcnVlKAogICAgJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgIkNhbGVuZGFyQ3JlYXRlKCBDYWxlbmRhck5hbWUgPT4gJ1Rlc3QgY2FsZW5kYXInLCBDb2xvciA9PiAnIzNBODdBRCcsIEdyb3VwSUQgPT4gJEdyb3VwSUQsIFVzZXJJRCA9PiAkVXNlcklEICkgLSBDYWxlbmRhcklEIiwKKTsKCiMgcmVhZCBzYW1wbGUgLmljcyBmaWxlCm15ICRDb250ZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RmlsZVJlYWQoCiAgICBEaXJlY3RvcnkgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+e0hvbWV9IC4gJy9zY3JpcHRzL3Rlc3Qvc2FtcGxlL0NhbGVuZGFyLycsCiAgICBGaWxlbmFtZSAgPT4gJ1NhbXBsZUNhbGVuZGFyLmljcycsCik7CgokU2VsZi0+VHJ1ZSgKICAgICR7JENvbnRlbnR9LAogICAgJy5pY3Mgc3RyaW5nIGxvYWRlZCcsCik7CgpteSAkSW1wb3J0U3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SW1wb3J0OjpJQ2FsJyktPkltcG9ydCgKICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgSUNhbCAgICAgICA9PiAkeyRDb250ZW50fSwKICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgIFVudGlsTGltaXQgPT4gJzIwMTgtMDEtMDEgMDA6MDA6MDAnLAopOwoKJFNlbGYtPlRydWUoCiAgICAkSW1wb3J0U3VjY2VzcywKICAgICdJbXBvcnQgc3VjY2VzcycsCik7CgpteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAopOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIEBBcHBvaW50bWVudHMsCiAgICAxNzEsCiAgICAnQXBwb2ludG1lbnQgY291bnQnLAopOwoKbXkgQFJlc3VsdCA9ICgKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFxAVGVhbUlELAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMDUgMDA6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0FsbCBkYXknLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gXEBSZXNvdXJjZUlELAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMDYgMDA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAndGVzdCBhbGwgZGF5IGV2ZW50JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gJzEnLAogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTEyIDA5OjMwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09ubHkgb25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnQmVsZ3JhZGUnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDQtMTIgMTA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+ICcxJywKICAgICAgICAnQWxsRGF5JyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMTkgMDk6MzA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdPbmNlIHBlciB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMTkgMTA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTI2IDA5OjMwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTI2IDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09ubHkgb25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnQmVsZ3JhZGUnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMDMgMDk6MzA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNS0wMyAxMDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMTAgMTA6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdPbmNlIHBlciB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMTAgMDk6MzA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0xNyAwOTozMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMTcgMTA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnQmVsZ3JhZGUnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09ubHkgb25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA1LTI0IDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09ubHkgb25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnQmVsZ3JhZGUnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0yNCAwOTozMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTMxIDA5OjMwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0zMSAxMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNi0wNyAwOTozMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNi0wNyAxMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdHZXJtYW55JywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTEyIDEyOjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTEyIDExOjE1OjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0xMiAxMToxNTowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdNb250aGx5IG1lZXRpbmcnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMTIgMTI6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNb250aGx5IG1lZXRpbmcnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNi0xMiAxMToxNTowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA2LTEyIDEyOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdHZXJtYW55JwogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA3LTEyIDExOjE1OjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNy0xMiAxMjowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA4LTEyIDExOjE1OjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA4LTEyIDEyOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA5LTEyIDExOjE1OjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wOS0xMiAxMjowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTEwLTEyIDEyOjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMC0xMiAxMToxNTowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTExLTEyIDEyOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0xMS0xMiAxMToxNTowMCcsCiAgICB9LAogICAgewogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNb250aGx5IG1lZXRpbmcnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTItMTIgMTE6MTU6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMi0xMiAxMjowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmNlIHBlciBtb250aCcsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAxLTEyIDExOjE1OjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDEtMTIgMTI6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDItMTIgMTI6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAyLTEyIDExOjE1OjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTMxIDA2OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAzLTMxIDA3OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTMwIDA2OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMzAgMDc6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTMxIDA3OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFbmQgb2YgdGhlIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMzEgMDY6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNi0zMCAwNzowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFbmQgb2YgdGhlIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNi0zMCAwNjowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA3LTMxIDA3OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDctMzEgMDY6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VuZCBvZiB0aGUgbW9udGgnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA4LTMxIDA3OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA4LTMxIDA2OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDktMzAgMDY6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA5LTMwIDA3OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VuZCBvZiB0aGUgbW9udGgnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0xMC0zMSAwNjowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMTAtMzEgMDc6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMS0zMCAwNzowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMS0zMCAwNjowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMi0zMSAwNjowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFbmQgb2YgdGhlIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0xMi0zMSAwNzowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wMS0zMSAwNzowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTAxLTMxIDA2OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VuZCBvZiB0aGUgbW9udGgnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDItMjggMDY6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTctMDItMjggMDc6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDEtMzEgMDk6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAyIG1vbnRocycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnVGVzdCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAndGVzdCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMS0zMSAxMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdUZXN0JywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICd0ZXN0JywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAzLTMxIDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMy0zMSAwOTowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAyIG1vbnRocycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMzEgMTA6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ3Rlc3QnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1Rlc3QnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMiBtb250aHMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0zMSAwOTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMiBtb250aHMnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDctMzEgMDk6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA3LTMxIDEwOjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnVGVzdCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAndGVzdCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICd0ZXN0JywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdUZXN0JywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDEtMzEgMTA6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMiBtb250aHMnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAxLTMxIDA5OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTEyIDA4OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMTIgMDc6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMTQgMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTE0IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0xNiAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMTYgMDc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTE4IDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNC0xOCAwODowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMjAgMDg6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0yMCAwNzowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTIyIDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0yMiAwODowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTI0IDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTI0IDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTI2IDA3OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTI2IDA4OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMjggMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMjggMDc6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0zMCAwNzowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMzAgMDg6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0wMiAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMDIgMDc6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMDQgMDc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA1LTA0IDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMDYgMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTA2IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JwogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDUtMDggMDc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0wOCAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMTAgMDc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA1LTEwIDA4OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0xMiAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0xMiAwNzowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTE0IDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTE0IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTE2IDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0xNiAwODowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTE4IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMTggMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTIwIDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDUtMjAgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMjIgMDc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA1LTIyIDA4OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMjQgMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMjQgMDc6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMjYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0yNiAwNzowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0yOCAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDUtMjggMDc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTXkgZXZlbnQnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0zMCAwNzowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTMwIDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA2LTAxIDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA2LTAxIDA3OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMDEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gJzEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMDEgMDg6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMiB5ZWFycycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDIgeWVhcnMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTgtMDQtMDEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxOC0wNC0wMSAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDIgeWVhcnMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMjAtMDQtMDEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMjAtMDQtMDEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTAyIDAwOjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+ICcxJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNC0wMyAwMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gJzEnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0wNSAwMDowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0wNiAwMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+ICcxJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTA4IDAwOjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gJzEnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMDkgMDA6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiAnMScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTEyIDAwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTExIDAwOjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0xNCAwMDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDQtMTUgMDA6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgID0+ICcxJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTE3IDAwOjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNC0xOCAwMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgPT4gJzEnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gJzEnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTIxIDAwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAzdGhkIGFsbCBkYXknLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTIwIDAwOjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+ICcxJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTI0IDAwOjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAzdGhkIGFsbCBkYXknLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0yMyAwMDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiAnMScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0yNyAwMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMjYgMDA6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTMwIDAwOjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gJzEnLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMjkgMDA6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDMtMDcgMTY6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiAnMScsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdGaXJzdCAzIGRheXMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMy0wNyAxNTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDMtMDggMTY6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMy0wOCAxNTowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRmlyc3QgMyBkYXlzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0ZpcnN0IDMgZGF5cycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTA5IDE1OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAzLTA5IDE2OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDMtMDIgMTc6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnT25jZSBwZXIgbmV4dCAyIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gJzEnLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMy0wMiAxODowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ09uY2UgcGVyIG5leHQgMiBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0wMiAxNzowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0wMiAxODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAxLTAzIDE4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDEtMDMgMTc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0phbnVhcnkgM3RoIG5leHQgMyB5ZWFycycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdKYW51YXJ5IDN0aCBuZXh0IDMgeWVhcnMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDEtMDMgMTc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTctMDEtMDMgMTg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTgtMDEtMDMgMTg6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTgtMDEtMDMgMTc6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0phbnVhcnkgM3RoIG5leHQgMyB5ZWFycycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0xMiAxNDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMTIgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gJzEnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMjYgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTI2IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMTAgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA1LTEwIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTI0IDE1OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0yNCAxNDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDYtMDcgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA2LTA3IDE1OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDYtMjEgMTQ6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA2LTIxIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDctMDUgMTU6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNy0wNSAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA3LTE5IDE0OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNy0xOSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDgtMDIgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA4LTAyIDE1OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JwogICAgfSwKICAgIHsKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA4LTE2IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wOC0xNiAxNDowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDgtMzAgMTU6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wOC0zMCAxNDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wOS0xMyAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA5LTEzIDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDktMjcgMTU6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDktMjcgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICB9LAogICAgewogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTEwLTExIDE0OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTEwLTExIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScKICAgIH0sCiAgICB7CiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0xMC0yNSAxNTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTEwLTI1IDE0OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMS0wOCAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMS0wOCAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTEtMjIgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMTEtMjIgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMi0wNiAxNTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTItMDYgMTQ6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMTItMjAgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTEyLTIwIDE0OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDEtMDMgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDEtMDMgMTQ6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wMS0xNyAxNDowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTAxLTE3IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wMS0zMSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0wMS0zMSAxNDowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXQogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE3LTAyLTE0IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTAyLTE0IDE0OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wMi0yOCAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAyLTI4IDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDMtMTQgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTAzLTE0IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDMtMjggMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAzLTI4IDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDQtMTEgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wNC0xMSAxNDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDQtMjUgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTA0LTI1IDE0OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDUtMDkgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA1LTA5IDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wNS0yMyAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA1LTIzIDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTA2LTA2IDE0OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNy0wNi0wNiAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wNi0yMCAxNTowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDYtMjAgMTQ6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDctMDQgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE3LTA3LTA0IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTA3LTE4IDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wNy0xOCAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wOC0wMSAxNDowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDgtMDEgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDgtMTUgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA4LTE1IDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wOC0yOSAxNTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDgtMjkgMTQ6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA5LTEyIDE0OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDktMTIgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDktMjYgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA5LTI2IDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0xMC0xMCAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTctMTAtMTAgMTU6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMTAtMjQgMTU6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMTAtMjQgMTQ6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMTEtMDcgMTQ6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMTEtMDcgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0xMS0yMSAxNTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMTEtMjEgMTQ6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTEyLTA1IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0xMi0wNSAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0xMi0xOSAxNTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0xMi0xOSAxNDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMS0xMSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+ICcxJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMS0xMSAwODowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10KICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTEzIDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDEtMTMgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMS0xNyAwOTowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTE3IDA4OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAxLTI3IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMS0yNyAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMScKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMS0zMSAwOTowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMS0zMSAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAyLTEwIDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDItMTAgMDg6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDItMTQgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMi0xNCAwODowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10KICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDItMjQgMDk6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMi0yNCAwODowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMi0yOCAwODowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wMi0yOCAwOTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDMtMDkgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMy0wOSAwODowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDMtMTMgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTAzLTEzIDA5OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDMtMjMgMDk6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMy0yMyAwODowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMy0yNyAwODowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMy0yNyAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAxLTEyIDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDEtMTIgMDk6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMS0xNiAwODowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMS0xNiAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTMxIDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMS0zMSAwOTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDItMTYgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDItMTYgMDg6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDMtMTYgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTE2IDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAzLTMxIDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDMtMzEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTE2IDA5OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0xNiAwODowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMTYgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTE2IDA4OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMzEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTMxIDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA2LTE2IDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA2LTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA3LTE2IDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNy0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA3LTMxIDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA3LTMxIDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wOC0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDgtMTYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDgtMzEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA4LTMxIDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wOS0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDktMTYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTAtMTYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMC0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTAtMzEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTEwLTMxIDA5OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMS0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMS0xNiAwODowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTItMTYgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTEyLTE2IDA5OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTItMzEgMDg6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0xMi0zMSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAxLTMxIDA5OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAxLTMxIDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMi0yOSAwODowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wMi0yOSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMi0zMSAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTEyLTMxIDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gNCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMS0wNCAxNTowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDEtMDQgMTY6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMi0wNCAxNTowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSA0JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDItMDQgMTY6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wMi0wNCAxNTowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSA0JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDItMDQgMTY6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMS0wNCAxNjowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ1llYXJseScsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAxLTA0IDE1OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDEtMDQgMTU6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdZZWFybHknLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE3LTAxLTA0IDE2OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAopOwoKTE9PUDoKZm9yICggbXkgJEluZGV4ID0gMDsgJEluZGV4IDwgc2NhbGFyIEBBcHBvaW50bWVudHM7ICRJbmRleCsrICkgewogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFJlc3VsdFskSW5kZXhdIH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgdW5kZWYKICAgICAgICBpZiAoICFkZWZpbmVkICRSZXN1bHRbJEluZGV4XS0+eyRLZXl9ICkgewoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c1skSW5kZXhdLT57JEtleX0sCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICJDaGVjayBpZiAkS2V5IGlzIHVuZGVmLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUmVzdWx0WyRJbmRleF0tPnskS2V5fSApICkgewogICAgICAgICAgICBteSAlSXRlbXMgPSAoKTsKICAgICAgICAgICAgJEl0ZW1zeyRffSArPSAxIGZvcmVhY2ggKCBAeyAkUmVzdWx0WyRJbmRleF0tPnskS2V5fSB9ICk7CiAgICAgICAgICAgICRJdGVtc3skX30gLT0gMSBmb3JlYWNoICggQHsgJEFwcG9pbnRtZW50c1skSW5kZXhdLT57JEtleX0gfSApOwoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAhKCBncmVwIHsgJF8gIT0gMCB9IHZhbHVlcyAlSXRlbXMgKSwKICAgICAgICAgICAgICAgICJDaGVjayBpZiBhcnJheSAkS2V5IGlzIE9LLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggSXNTdHJpbmdXaXRoRGF0YSggJFJlc3VsdFskSW5kZXhdLT57JEtleX0gKSApIHsKCiAgICAgICAgICAgICMgU2tpcCBQYXJlbnRJRCBzaW5jZSB0aGlzIHZhbHVlIGNhbid0IG1hdGNoIEFwcG9pbnRtZW50SUQgKGV2ZXJ5IHRpbWUgaXMgZGlmZmVyZW50KQogICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxCgogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c1skSW5kZXhdLT57JEtleX0sCiAgICAgICAgICAgICAgICAkUmVzdWx0WyRJbmRleF0tPnskS2V5fSwKICAgICAgICAgICAgICAgICJDaGVjayBpZiAkS2V5IHZhbHVlIGlzIE9LLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiAgICAgICAgIyBEbyBub3QgY2hlY2sgUmljaFRleHQuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbJ2FkbWluJ10sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWRtaW5Ob3RpZmljYXRpb25FdmVudCBzY3JlZW4uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Iik7CgogICAgICAgICMgQ2hlY2sgb3ZlcnZpZXcgc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIENsaWNrICJBZGQgbm90aWZpY2F0aW9uIi4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50O1N1YmFjdGlvbj1BZGQnICldIikKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ2hlY2sgYWRkIE5vdGlmaWNhdGlvbkV2ZW50IHNjcmVlbi4KICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgcXcoTmFtZSBDb21tZW50IFZhbGlkSUQgRXZlbnRzIGVuX1N1YmplY3QgZW5fQm9keSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiMkSUQiLCAnY3NzJyApOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQoKICAgICAgICAjIFRvZ2dsZSBUaWNrZXQgZmlsdGVyIHdpZGdldC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAYXJpYS1jb250cm9scywgXCdDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8xJyldIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCdhW2FyaWEtY29udHJvbHMqPVwiQ29yZV9VSV9BdXRvZ2VuZXJhdGVkSURfMVwiXScpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnKSA9PT0gJ3RydWUnOyIKICAgICAgICApOwoKICAgICAgICAjIFRvZ2dsZSBBcnRpY2xlIGZpbHRlciAoT25seSBmb3IgQXJ0aWNsZUNyZWF0ZSBhbmQgQXJ0aWNsZVNlbmQgZXZlbnQpIHdpZGdldC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAYXJpYS1jb250cm9scywgXCdDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8yJyldIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCdhW2FyaWEtY29udHJvbHMqPVwiQ29yZV9VSV9BdXRvZ2VuZXJhdGVkSURfMlwiXScpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnKSA9PT0gJ2ZhbHNlJzsiCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBOb3RpZmljYXRpb25FdmVudC4KICAgICAgICBteSAkTm90aWZFdmVudFJhbmRvbUlEID0gIk5vdGlmaWNhdGlvbkV2ZW50IiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJE5vdGlmRXZlbnRUZXh0ICAgICA9ICJTZWxlbml1bSBOb3RpZmljYXRpb25FdmVudCB0ZXN0IjsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCROb3RpZkV2ZW50UmFuZG9tSUQpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NvbW1lbnQiLCAnY3NzJyApLT5zZW5kX2tleXMoJE5vdGlmRXZlbnRUZXh0KTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNFdmVudHMnKS52YWwoJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9TdWJqZWN0IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCROb3RpZkV2ZW50VGV4dCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjZW5fQm9keSIsICAgICdjc3MnICktPnNlbmRfa2V5cygkTm90aWZFdmVudFRleHQpOwoKICAgICAgICAjIENoZWNrICdBZGRpdGlvbmFsIHJlY2lwaWVudCcgbGVuZ3RoIHZhbGlkYXRpb24gZnJvbSBBZGRpdGlvbmFsIHJlY2lwaWVudCBlbWFpbCBhZGRyZXNzZXMgKHNlZSBidWcjMTM5MzYpLgogICAgICAgIG15ICRGaWVsZFZhbHVlID0gImEiIHggMjAxOwoKICAgICAgICAjIENoZWNrIFRyYW5zcG9ydEVtYWlsIGNoZWNrYm94IGlmIGl0IGlzIG5vdCBjaGVja2VkLgogICAgICAgIG15ICRUcmFuc3BvcnRFbWFpbENoZWNrID0gJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcjVHJhbnNwb3J0RW1haWwnKS5wcm9wKCdjaGVja2VkJyk7Iik7CiAgICAgICAgaWYgKCAhJFRyYW5zcG9ydEVtYWlsQ2hlY2sgKSB7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjVHJhbnNwb3J0RW1haWwnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7Iik7CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjVHJhbnNwb3J0RW1haWwnKS5wcm9wKCdjaGVja2VkJykgPT09IHRydWU7IiApOwogICAgICAgIH0KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNSZWNpcGllbnRFbWFpbCIsICdjc3MnICktPnNlbmRfa2V5cygkRmllbGRWYWx1ZSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdHlwZT0nc3VibWl0J10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI1JlY2lwaWVudEVtYWlsLkVycm9yJykubGVuZ3RoOyIgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI1JlY2lwaWVudEVtYWlsLkVycm9yJykubGVuZ3RoOyIpLAogICAgICAgICAgICAiVmFsaWRhdGlvbiBmb3IgJ0FkZGl0aW9uYWwgcmVjaXBpZW50JyBmaWVsZCBpcyBjb3JyZWN0IiwKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JlY2lwaWVudEVtYWlsIiwgJ2NzcycgKS0+Y2xlYXIoKTsKCiAgICAgICAgIyBTZXQgYmFjayBUcmFuc3BvcnRFbWFpbCBjaGVja2JveCBpZiBpdCB3YXMgbm90IGNoZWNrZWQuCiAgICAgICAgaWYgKCAhJFRyYW5zcG9ydEVtYWlsQ2hlY2sgKSB7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjVHJhbnNwb3J0RW1haWwnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpOyIpOwogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI1RyYW5zcG9ydEVtYWlsJykucHJvcCgnY2hlY2tlZCcpID09PSBmYWxzZTsiICk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ2hlY2sgaWYgdGVzdCBOb3RpZmljYXRpb25FdmVudCBzaG93IG9uIEFkbWluTm90aWZpY2F0aW9uRXZlbnQgc2NyZWVuLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy5EYXRhVGFibGUgdHIgdGQgYTpjb250YWlucygkTm90aWZFdmVudFJhbmRvbUlEKScpLmxlbmd0aDsiKSwKICAgICAgICAgICAgIiROb3RpZkV2ZW50UmFuZG9tSUQgTm90aWZpY2Fpb25FdmVudCBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIHRlc3QgTm90aWZpY2F0aW9uRXZlbnQgdmFsdWVzLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAkTm90aWZFdmVudFJhbmRvbUlELCAnbGlua190ZXh0JyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjTmFtZScsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkTm90aWZFdmVudFJhbmRvbUlELAogICAgICAgICAgICAiI05hbWUgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQ29tbWVudCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkTm90aWZFdmVudFRleHQsCiAgICAgICAgICAgICIjQ29tbWVudCBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNlbl9TdWJqZWN0JywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICROb3RpZkV2ZW50VGV4dCwKICAgICAgICAgICAgIiNlbl9TdWJqZWN0IHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI2VuX0JvZHknLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJE5vdGlmRXZlbnRUZXh0LAogICAgICAgICAgICAiI2VuX0JvZHkgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjVmFsaWRJRCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiI1ZhbGlkSUQgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwoKICAgICAgICAjIEVkaXQgdGVzdCBOb3RpZmljYXRpb25FdmVudCBhbmQgc2V0IGl0IHRvIGludmFsaWQuCiAgICAgICAgbXkgJEVkaXROb3RpZkV2ZW50VGV4dCA9ICJTZWxlbml1bSBlZGl0ZWQgTm90aWZpY2F0aW9uRXZlbnQgdGVzdCI7CgogICAgICAgICMgVG9nZ2xlIEFydGljbGUgZmlsdGVyIChPbmx5IGZvciBBcnRpY2xlQ3JlYXRlIGFuZCBBcnRpY2xlU2VuZCBldmVudCkgd2lkZ2V0LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBhcmlhLWNvbnRyb2xzLCBcJ0NvcmVfVUlfQXV0b2dlbmVyYXRlZElEXzInKV0iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJ2FbYXJpYS1jb250cm9scyo9XCJDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8yXCJdJykuYXR0cignYXJpYS1leHBhbmRlZCcpID09PSAnZmFsc2UnOyIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDb21tZW50IiwgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9Cb2R5IiwgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9Cb2R5IiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCRFZGl0Tm90aWZFdmVudFRleHQpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI2VuX1N1YmplY3QiLCAnY3NzJyApLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI2VuX1N1YmplY3QiLCAnY3NzJyApLT5zZW5kX2tleXMoJEVkaXROb3RpZkV2ZW50VGV4dCk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNWYWxpZElEJykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcuRGF0YVRhYmxlIHRyIHRkIGE6Y29udGFpbnMoJE5vdGlmRXZlbnRSYW5kb21JRCknKS5sZW5ndGg7IgogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgZWRpdGVkIE5vdGlmY2F0aW9uRXZlbnQgdmFsdWVzLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAkTm90aWZFdmVudFJhbmRvbUlELCAnbGlua190ZXh0JyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQ29tbWVudCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAiIiwKICAgICAgICAgICAgIiNDb21tZW50IHVwZGF0ZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNlbl9Cb2R5JywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRFZGl0Tm90aWZFdmVudFRleHQsCiAgICAgICAgICAgICIjZW5fQm9keSB1cGRhdGVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjVmFsaWRJRCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAyLAogICAgICAgICAgICAiI1ZhbGlkSUQgdXBkYXRlZCB2YWx1ZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBHbyBiYWNrIHRvIEFkbWluTm90aWZpY2F0aW9uRXZlbnQgb3ZlcnZpZXcgc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCIpOwoKICAgICAgICAjIENoZWNrIGNsYXNzIG9mIGludmFsaWQgTm90aWZpY2F0aW9uRXZlbnQgaW4gdGhlIG92ZXJ2aWV3IHRhYmxlLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgndHIuSW52YWxpZCB0ZCBhOmNvbnRhaW5zKCROb3RpZkV2ZW50UmFuZG9tSUQpJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIlRoZXJlIGlzIGEgY2xhc3MgJ0ludmFsaWQnIGZvciB0ZXN0IE5vdGlmaWNhdGlvbkV2ZW50IiwKICAgICAgICApOwoKICAgICAgICAjIEdldCBOb3RpZmljYXRpb25FdmVudElELgogICAgICAgIG15ICVOb3RpZkV2ZW50SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKS0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBOYW1lID0+ICROb3RpZkV2ZW50UmFuZG9tSUQKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uIGRlbGV0ZSBpY29uLgogICAgICAgIG15ICRDaGVja0NvbmZpcm1KUyA9IDw8IkpBVkFTQ1JJUFQiOwooZnVuY3Rpb24gKCkgewogICAgd2luZG93LmNvbmZpcm0gPSBmdW5jdGlvbiAobWVzc2FnZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKfSgpKTsKSkFWQVNDUklQVAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoJENoZWNrQ29uZmlybUpTKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBTTEEgd2l0aCBkZWxldGUgYnV0dG9uLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ1N1YmFjdGlvbj1EZWxldGU7SUQ9JE5vdGlmRXZlbnRJRHtJRH0nICldIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBDaGVjayBpZiB0ZXN0IE5vdGlmaWNhdGlvbkV2ZW50IGlzIGRlbGV0ZWQuCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgndHIuSW52YWxpZCB0ZCBhOmNvbnRhaW5zKCROb3RpZkV2ZW50UmFuZG9tSUQpJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIlRlc3QgTm90aWZpY2F0aW9uRXZlbnQgaXMgZGVsZXRlZCAtICROb3RpZkV2ZW50UmFuZG9tSUQiLAogICAgICAgICkgfHwgZGllOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICAgICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBncm91cC4KICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRMYW5ndWFnZSAgICAgID0gJ2VuJzsKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgICA9PiBbICd1c2VycycsICRHcm91cE5hbWUgXSwKICAgICAgICAgICAgTGFuZ3VhZ2UgPT4gJExhbmd1YWdlLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICBteSAkVXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY3VzdG9tZXIgdXNlci4KICAgICAgICBteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCBjdXN0b21lciB1c2VyIjsKCiAgICAgICAgIyBMb2dpbiBhcyB0ZXN0IHVzZXIuCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIGEgZmV3IHRlc3QgY2FsZW5kYXJzLgogICAgICAgIG15IEBDYWxlbmRhcnM7CiAgICAgICAgbXkgJENvdW50ID0gMTsKICAgICAgICBmb3IgbXkgJENvbG9yICggJyMzQTg3QUQnLCAnI0VDOTA3MycsICcjNkJBRDU0JyApIHsKICAgICAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIkQ291bnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAkQ29sb3IsCiAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDYWxlbmRhcnMsIFwlQ2FsZW5kYXI7CgogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICB9CgogICAgICAgIG15ICRDYWxlbmRhcldlZWtEYXlTdGFydCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCA3OwoKICAgICAgICAjIEdldCBzdGFydCBvZiB0aGUgd2Vlay4KICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwogICAgICAgIG15ICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CiAgICAgICAgd2hpbGUgKCAkV2Vla0RheSAhPSAkQ2FsZW5kYXJXZWVrRGF5U3RhcnQgKSB7CiAgICAgICAgICAgICRTdGFydFRpbWUgLT0gNjAgKiA2MCAqIDI0OwogICAgICAgICAgICAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICMgQXBwb2ludG1lbnQgdGltZXMgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrLgogICAgICAgIG15ICVTdGFydFRpbWUgPSAoCiAgICAgICAgICAgIERheSAgICA9PiAkRGF5LAogICAgICAgICAgICBNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICBZZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgIEhvdXIgICA9PiAxMiwKICAgICAgICAgICAgTWludXRlID0+IDE1LAogICAgICAgICk7CgogICAgICAgICMgRGVmaW5lIGFwcG9pbnRtZW50IG5hbWVzLgogICAgICAgIG15IEBBcHBvaW50bWVudE5hbWVzID0gKCAnQXBwb2ludG1lbnQgMScsICdBcHBvaW50bWVudCAyJywgJ0FwcG9pbnRtZW50IDMnICk7CgogICAgICAgICMgR28gdG8gYWdlbmRhIG92ZXJ2aWV3IHBhZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3Iik7CgogICAgICAgICMgQ2xpY2sgb24gdGhlIGFwcG9pbnRtZW50IGNyZWF0ZSBidXR0b24uCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgV2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIGEgcmVndWxhciBhcHBvaW50bWVudC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoICRBcHBvaW50bWVudE5hbWVzWzBdICk7CiAgICAgICAgZm9yIG15ICRHcm91cCAocXcoU3RhcnQgRW5kKSkgewogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhIb3VyIE1pbnV0ZSBEYXkgTW9udGggWWVhcikpIHsKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgIlwkKCcjJEdyb3VwJEZpZWxkJykudmFsKCRTdGFydFRpbWV7JEZpZWxkfSkudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyc1swXS0+e0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgU2F2ZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5EaWFsb2cuTW9kYWwnKS5sZW5ndGgiICk7CgogICAgICAgICMgVmVyaWZ5IHRoZSByZWd1bGFyIGFwcG9pbnRtZW50IGlzIHZpc2libGUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgndGJvZHkgdHI6Y29udGFpbnMoJEFwcG9pbnRtZW50TmFtZXNbMF0pJykubGVuZ3RoOyIpLAogICAgICAgICAgICAiRmlyc3QgYXBwb2ludG1lbnQgJyRBcHBvaW50bWVudE5hbWVzWzBdJyBmb3VuZCBpbiB0aGUgdGFibGUiCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayBvbiB0aGUgY3JlYXRlIGJ1dHRvbiBmb3IgYW5vdGhlciBhcHBvaW50bWVudCBkaWFsb2cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBDcmVhdGUgYW4gYWxsLWRheSBhcHBvaW50bWVudC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgICduYW1lJyApLT5zZW5kX2tleXMoICRBcHBvaW50bWVudE5hbWVzWzFdICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdBbGxEYXknLCAnbmFtZScgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgIGZvciBteSAkR3JvdXAgKHF3KFN0YXJ0IEVuZCkpIHsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJcJCgnIyRHcm91cCRGaWVsZCcpLnZhbCgkU3RhcnRUaW1leyRGaWVsZH0pLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcnNbMV0tPntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5EaWFsb2cuTW9kYWwnKS5sZW5ndGgiICk7CgogICAgICAgICMgVmVyaWZ5IHRoZSBhbGwtZGF5IGFwcG9pbnRtZW50IGlzIHZpc2libGUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgndGJvZHkgdHI6Y29udGFpbnMoJEFwcG9pbnRtZW50TmFtZXNbMV0pJykubGVuZ3RoOyIpLAogICAgICAgICAgICAiU2Vjb25kIGFwcG9pbnRtZW50ICckQXBwb2ludG1lbnROYW1lc1sxXScgZm91bmQgaW4gdGhlIHRhYmxlIgogICAgICAgICk7CgogICAgICAgIG15ICRSZWN1cnJlbmNlQ291bnQgPSAzOwoKICAgICAgICAjIENsaWNrIGFnYWluIG9uIHRoZSBjcmVhdGUgYnV0dG9uIGZvciBhbiBhcHBvaW50bWVudCBkaWFsb2cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBDcmVhdGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCAkQXBwb2ludG1lbnROYW1lc1syXSApOwogICAgICAgIGZvciBteSAkR3JvdXAgKHF3KFN0YXJ0IEVuZCkpIHsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoSG91ciBNaW51dGUgRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJcJCgnIyRHcm91cCRGaWVsZCcpLnZhbCgkU3RhcnRUaW1leyRGaWVsZH0pLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcnNbMl0tPntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdEYWlseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJFJlY3VycmVuY2VDb3VudCk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmICFcJCgnLkRpYWxvZy5Nb2RhbCcpLmxlbmd0aCIgKTsKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkUmVmcmVzaCgpOwoKICAgICAgICAjIFZlcmlmeSBhbGwgdGhpcmQgYXBwb2ludG1lbnQgb2NjdXJyZW5jZXMgYXJlIHZpc2libGUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCd0Ym9keSB0cjpjb250YWlucygkQXBwb2ludG1lbnROYW1lc1syXSknKS5sZW5ndGggPT09ICRSZWN1cnJlbmNlQ291bnQ7IgogICAgICAgICAgICApLAogICAgICAgICAgICAiQWxsIHRoaXJkIGFwcG9pbnRtZW50IG9jY3VycmVuY2VzIGZvdW5kIGluIHRoZSB0YWJsZSIKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0aGlyZCBhcHBvaW50bWVudCBtYXN0ZXIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICRBcHBvaW50bWVudE5hbWVzWzJdLCAnbGlua190ZXh0JyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCAmJiBcJCgnI0VkaXRGb3JtRGVsZXRlJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtRGVsZXRlJywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEFsZXJ0UHJlc2VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5hY2NlcHRfYWxlcnQoKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAgXCQoJ3Rib2R5IHRyOmNvbnRhaW5zKCRBcHBvaW50bWVudE5hbWVzWzJdKScpLmxlbmd0aCA9PT0gMDsiCiAgICAgICAgKTsKCiAgICAgICAgIyBWZXJpZnkgYWxsIHRoaXJkIGFwcG9pbnRtZW50IG9jY3VyZW5jZXMgaGF2ZSBiZWVuIHJlbW92ZWQuCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJ3Rib2R5IHRyOmNvbnRhaW5zKCRBcHBvaW50bWVudE5hbWVzWzJdKScpLmxlbmd0aDsiKSwKICAgICAgICAgICAgIkFsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cmVuY2VzIGRlbGV0ZWQiCiAgICAgICAgKTsKICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGdyb3VwLgogICAgICAgIG15ICRHcm91cE5hbWUgPSAidGVzdC1jYWxlbmRhci1ncm91cC0kUmFuZG9tSUQiOwogICAgICAgIG15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRHcm91cElELAogICAgICAgICAgICAnVGVzdCBncm91cCBjcmVhdGVkJywKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHF1ZXVlLgogICAgICAgIG15ICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gIlF1ZXVlJFJhbmRvbUlEIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgICAgICAgICBTaWduYXR1cmVJRCAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdTb21lIGNvbW1lbnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUXVldWVJRCwKICAgICAgICAgICAgJ1Rlc3QgcXVldWUgY3JlYXRlZCcsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIENoYW5nZSByZXNvbHV0aW9uIChkZXNrdG9wIG1vZGUpLgogICAgICAgICRTZWxlbml1bS0+c2V0X3dpbmRvd19zaXplKCA3NjgsIDEwNTAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRMYW5ndWFnZSAgICAgID0gJ2VuJzsKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgICA9PiBbJEdyb3VwTmFtZV0sCiAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYW5ndWFnZSwKICAgICAgICApIHx8IGRpZSAnRGlkIG5vdCBnZXQgdGVzdCB1c2VyJzsKCiAgICAgICAgIyBTdGFydCB0ZXN0LgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIE9wZW4gQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIHBhZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIik7CgogICAgICAgICMgQ2xpY2sgQWRkIG5ldyBjYWxlbmRhci4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5TaWRlYmFyQ29sdW1uIHVsLkFjdGlvbkxpc3QgYSNBZGQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgV3JpdGUgY2FsZW5kYXIgbmFtZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGlucHV0I0NhbGVuZGFyTmFtZScsICdjc3MnICktPnNlbmRfa2V5cygiQ2FsZW5kYXIgJFJhbmRvbUlEIik7CgogICAgICAgICMgU2V0IGl0IHRvIHRlc3QgZ3JvdXAuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjR3JvdXBJRCcpLnZhbCgkR3JvdXBJRCkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBTdWJtaXQuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdmb3JtI0NhbGVuZGFyRnJvbSBidXR0b24jU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFZlcmlmeSBkb3dubG9hZCBhbmQgY29weS10by1jbGlwYm9hcmQgbGlua3MuCiAgICAgICAgZm9yIG15ICRDbGFzcyAocXcoRG93bmxvYWRMaW5rIENvcHlUb0NsaXBib2FyZCkpIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi4kQ2xhc3MiLCAnY3NzJyApOwoKICAgICAgICAgICAgbXkgJFVSTDsKICAgICAgICAgICAgaWYgKCAkQ2xhc3MgZXEgJ0Rvd25sb2FkTGluaycgKSB7CiAgICAgICAgICAgICAgICAkVVJMID0gJEVsZW1lbnQtPmdldF9hdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRDbGFzcyBlcSAnQ29weVRvQ2xpcGJvYXJkJyApIHsKICAgICAgICAgICAgICAgICRVUkwgPSAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy4kQ2xhc3MnKS5hdHRyKCdkYXRhLWNsaXBib2FyZC10ZXh0Jyk7Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVSTCwKICAgICAgICAgICAgICAgICIkQ2xhc3MgVVJMIHByZXNlbnQiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFVSTCBzaG91bGQgbm90IGNvbnRhaW4gT1RSUyBzcGVjaWZpYyBVUkwgZGVsaW1pdGVyIG9mIHNlbWljb2xvbiAoOykuCiAgICAgICAgICAgICMgICBGb3IgYmV0dGVyIGNvbXBhdGliaWxpdHksIHVzZSBzdGFuZGFyZCBhbXBlcnNhbmQgKCYpIGluc3RlYWQuCiAgICAgICAgICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMjY2NyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgKCAkVVJMID1+IC9bO10vICkgPyAxIDogMCwKICAgICAgICAgICAgICAgICIkQ2xhc3MgVVJMIGRvZXMgbm90IGNvbnRhaW4gZm9yYmlkZGVuIGNoYXJhY3RlcnMiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjCiAgICAgICAgIyBMZXQncyB0cnkgdG8gYWRkIGNhbGVuZGFyIHdpdGggc2FtZSBuYW1lLgogICAgICAgICMKICAgICAgICAjIENsaWNrIEFkZCBuZXcgY2FsZW5kYXIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuU2lkZWJhckNvbHVtbiB1bC5BY3Rpb25MaXN0IGEjQWRkJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFdyaXRlIGNhbGVuZGFyIG5hbWUuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdmb3JtI0NhbGVuZGFyRnJvbSBpbnB1dCNDYWxlbmRhck5hbWUnLCAnY3NzJyApLT5zZW5kX2tleXMoIkNhbGVuZGFyICRSYW5kb21JRCIpOwoKICAgICAgICAjIFNldCBpdCB0byB0ZXN0IGdyb3VwLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0dyb3VwSUQnKS52YWwoJEdyb3VwSUQpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgU3VibWl0LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnZm9ybSNDYWxlbmRhckZyb20gYnV0dG9uI1N1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBXYWl0IGZvciBzZXJ2ZXIgc2lkZSBlcnJvci4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCdkaXYuRGlhbG9nIGJ1dHRvbiNEaWFsb2dCdXR0b24xJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgQ2xpY2sgb2sgdG8gZGlzbWlzcy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Rpdi5EaWFsb2cgYnV0dG9uI0RpYWxvZ0J1dHRvbjEnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgV2FpdCBmb3IgdG9vbHRpcCBtZXNzYWdlLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJ2RpdiNPVFJTX1VJX1Rvb2x0aXBzX0Vycm9yVG9vbHRpcCcpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIFVwZGF0ZSBjYWxlbmRhciBuYW1lLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnZm9ybSNDYWxlbmRhckZyb20gaW5wdXQjQ2FsZW5kYXJOYW1lJywgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGlucHV0I0NhbGVuZGFyTmFtZScsICdjc3MnICktPnNlbmRfa2V5cygiQ2FsZW5kYXIgJFJhbmRvbUlEIDIiKTsKCiAgICAgICAgIyBTZXQgaXQgdG8gaW52YWxpZC4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNWYWxpZElEJykudmFsKDIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgQWRkIHRpY2tldCBhcHBvaW50bWVudCBydWxlLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLldpZGdldFNpbXBsZS5Db2xsYXBzZWQgLldpZGdldEFjdGlvbi5Ub2dnbGUgYScsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNBZGRSdWxlQnV0dG9uJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgU2V0IGEgcXVldWUuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUXVldWVJRF8xJykudmFsKCckUXVldWVJRCcpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgQWRkIHRpdGxlIGFzIHNlYXJjaCBwYXJhbWV0ZXIuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjU2VhcmNoUGFyYW1zJykudmFsKCdUaXRsZScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQWRkQnV0dG9uJywgICAgICAgICAgICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNTZWFyY2hQYXJhbV8xX1RpdGxlJywgJ2NzcycgKS0+c2VuZF9rZXlzKCdUZXN0KicpOwoKICAgICAgICAjIFN1Ym1pdC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGJ1dHRvbiNTdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgVmVyaWZ5IHR3byBjYWxlbmRhcnMgYXJlIHNob3duLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5Db250ZW50Q29sdW1uIHRhYmxlIHRib2R5IHRyOnZpc2libGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAyLAogICAgICAgICAgICAnQWxsIGNhbGVuZGFycyBhcmUgZGlzcGxheWVkJywKICAgICAgICApOwoKICAgICAgICAjIEZpbHRlciBqdXN0IGFkZGVkIGNhbGVuZGFyLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnaW5wdXQjRmlsdGVyQ2FsZW5kYXJzJywgJ2NzcycgKS0+c2VuZF9rZXlzKCJDYWxlbmRhciAkUmFuZG9tSUQgMiIpOwoKICAgICAgICBzbGVlcCAxOwoKICAgICAgICAjIFZlcmlmeSBvbmx5IG9uZSBjYWxlbmRhciBpcyBzaG93bi4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuQ29udGVudENvbHVtbiB0YWJsZSB0Ym9keSB0cjp2aXNpYmxlJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgJ0NhbGVuZGFycyBhcmUgZmlsdGVyZWQgY29ycmVjdGx5JywKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSB0aGUgY2FsZW5kYXIgaXMgaW52YWxpZC4KICAgICAgICBteSAkTGFuZ3VhZ2VPYmplY3QgPSBLZXJuZWw6Okxhbmd1YWdlLT5uZXcoCiAgICAgICAgICAgIFVzZXJMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkNvbnRlbnRDb2x1bW4gdGFibGUgdGJvZHkgdHI6bnRoLW9mLXR5cGUoMikgdGQ6bnRoLW9mLXR5cGUoNCknLCAnY3NzJyApCiAgICAgICAgICAgICAgICAtPmdldF90ZXh0KCksCiAgICAgICAgICAgICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdpbnZhbGlkJyksCiAgICAgICAgICAgICdDYWxlbmRhciBpcyBtYXJrZWQgaW52YWxpZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBFZGl0IGludmFsaWQgY2FsZW5kYXIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQ29udGVudENvbHVtbiB0YWJsZSB0Ym9keSB0cjpudGgtb2YtdHlwZSgyKSB0ZCBhJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFNldCBpdCB0byBpbnZhbGlkLXRlbXBvcmFyaWx5LgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1ZhbGlkSUQnKS52YWwoMykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBWZXJpZnkgcnVsZSBoYXMgYmVlbiBzdG9yZWQgcHJvcGVybHkuCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnc2VsZWN0W2lkKj1cIlF1ZXVlSURfXCJdJykudmFsKCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICBbJFF1ZXVlSURdLAogICAgICAgICAgICAnUXVldWUgc3RvcmVkIHByb3Blcmx5JywKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJ2lucHV0W2lkKj1cIl9UaXRsZVwiXScpLnZhbCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ1Rlc3QqJywKICAgICAgICAgICAgJ1NlYXJjaCBwYXJhbSBzdG9yZWQgcHJvcGVybHknLAogICAgICAgICk7CgogICAgICAgICMgUmVtb3ZlIHRoZSBydWxlLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLlJlbW92ZUJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBTdWJtaXQuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdmb3JtI0NhbGVuZGFyRnJvbSBidXR0b24jU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFZlcmlmeSB0aGUgY2FsZW5kYXIgaXMgaW52YWxpZCB0ZW1wb3JhcmlseS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkNvbnRlbnRDb2x1bW4gdGFibGUgdGJvZHkgdHI6bnRoLW9mLXR5cGUoMikgdGQ6bnRoLW9mLXR5cGUoNCknLCAnY3NzJyApCiAgICAgICAgICAgICAgICAtPmdldF90ZXh0KCksCiAgICAgICAgICAgICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdpbnZhbGlkLXRlbXBvcmFyaWx5JyksCiAgICAgICAgICAgICdDYWxlbmRhciBpcyBtYXJrZWQgaW52YWxpZCB0ZW1wb3JhcmlseScsCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGVhbnVwCgogICAgICAgIG15ICREQk9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgICAgIG15ICRTY2hlZHVsZXJEQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyk7CgogICAgICAgICMgRGVsZXRlIHRlc3QgY2FsZW5kYXJzLgogICAgICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2FsZW5kYXIgV0hFUkUgbmFtZSA9ID8gT1IgbmFtZSA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCJDYWxlbmRhciAkUmFuZG9tSUQiLCBcIkNhbGVuZGFyICRSYW5kb21JRCAyIiwgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBjYWxlbmRhcnMgLSBDYWxlbmRhciAkUmFuZG9tSUQgKDIpIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0ZXN0IHF1ZXVlLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gcXVldWUgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUXVldWVJRCwgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBxdWV1ZSAtICRRdWV1ZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIFJlbW92ZSBzY2hlZHVsZWQgYXN5bmNocm9ub3VzIHRhc2tzIGZyb20gREIsIGFzIHRoZXkgbWF5IGludGVyZmVyZSB3aXRoIHRlc3RzIHJ1biBsYXRlci4KICAgICAgICBteSBAVGFza0lEczsKICAgICAgICBteSBAQWxsVGFza3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tMaXN0KAogICAgICAgICAgICBUeXBlID0+ICdBc3luY2hyb25vdXNFeGVjdXRvcicsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFRhc2sgKEBBbGxUYXNrcykgewogICAgICAgICAgICBpZiAoICRUYXNrLT57TmFtZX0gZXEgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhci1UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcigpJyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFRhc2tJRHMsICRUYXNrLT57VGFza0lEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgbXkgJFRhc2tJRCAoQFRhc2tJRHMpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJFRhc2tJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJUYXNrRGVsZXRlIC0gUmVtb3ZlZCBzY2hlZHVsZWQgYXN5bmNocm9ub3VzIHRhc2sgJFRhc2tJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICBmb3IgbXkgJENhY2hlIChxdyhDYWxlbmRhciBRdWV1ZSkpIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgpteSAkRWxlbWVudFJlYWRPbmx5ID0gc3ViIHsKICAgIG15ICglUGFyYW0pID0gQF87CgogICAgIyBWYWx1ZSBpcyBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVW5pdFRlc3RPYmplY3QgRWxlbWVudCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjJFBhcmFte0VsZW1lbnR9JykubGVuZ3RoIiApOwoKICAgICRQYXJhbXtVbml0VGVzdE9iamVjdH0tPklzKAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyMkUGFyYW17RWxlbWVudH0uUmVhZE9ubHlWYWx1ZScpLmxlbmd0aDsiCiAgICAgICAgKSwKICAgICAgICAkUGFyYW17VmFsdWV9LAogICAgICAgICIkUGFyYW17RWxlbWVudH0gcmVhZCBvbmx5ICgkUGFyYW17VmFsdWV9KSIsCiAgICApOwp9OwoKbXkgJEVsZW1lbnRFeGlzdHMgPSBzdWIgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICAjIFZhbHVlIGlzIG9wdGlvbmFsIHBhcmFtZXRlci4KICAgIGZvciBteSAkTmVlZGVkIChxdyhVbml0VGVzdE9iamVjdCBFbGVtZW50KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRMZW5ndGggPSAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICJyZXR1cm4gXCQoJyMkUGFyYW17RWxlbWVudH0nKS5sZW5ndGg7IgogICAgKTsKCiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFBhcmFte1VuaXRUZXN0T2JqZWN0fS0+VHJ1ZSgKICAgICAgICAgICAgJExlbmd0aCwKICAgICAgICAgICAgIiRQYXJhbXtFbGVtZW50fSBleGlzdHMiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17VW5pdFRlc3RPYmplY3R9LT5GYWxzZSgKICAgICAgICAgICAgJExlbmd0aCwKICAgICAgICAgICAgIiRQYXJhbXtFbGVtZW50fSBub3QgZXhpc3RzIiwKICAgICAgICApOwogICAgfQp9OwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkR3JvdXBPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgICAgICBteSAkVGltZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwogICAgICAgIG15ICRUaWNrZXRPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBncm91cC4KICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGdyb3VwLgogICAgICAgIG15ICRHcm91cE5hbWUyID0gInRlc3QtY2FsZW5kYXItZ3JvdXAyLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQyICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUyLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIEFkZCByb290IHRvIHRoZSBjcmVhdGVkIGdyb3VwLgogICAgICAgICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBJRDIsCiAgICAgICAgICAgIFVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIG1vdmVfaW50byA9PiAxLAogICAgICAgICAgICAgICAgY3JlYXRlICAgID0+IDEsCiAgICAgICAgICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICAgICAgICAgIHByaW9yaXR5ICA9PiAxLAogICAgICAgICAgICAgICAgcncgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQ2hhbmdlIHJlc29sdXRpb24gKGRlc2t0b3AgbW9kZSkuCiAgICAgICAgJFNlbGVuaXVtLT5zZXRfd2luZG93X3NpemUoIDc2OCwgMTA1MCApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIuCiAgICAgICAgbXkgJExhbmd1YWdlICAgICAgPSAnZW4nOwogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyAgID0+IFsgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgdXNlcic7CgogICAgICAgICMgR2V0IFVzZXJJRC4KICAgICAgICBteSAkVXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY3VzdG9tZXIgdXNlci4KICAgICAgICBteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpCiAgICAgICAgICAgIHx8IGRpZSAnRGlkIG5vdCBnZXQgdGVzdCBjdXN0b21lciB1c2VyJzsKCiAgICAgICAgIyBDcmVhdGUgYSBmZXcgdGVzdCBjYWxlbmRhcnMuCiAgICAgICAgbXkgJUNhbGVuZGFyMSA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIxICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJUNhbGVuZGFyMiA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIyICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0VDOTA3MycsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJUNhbGVuZGFyMyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIzICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzZCQUQ1NCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJUNhbGVuZGFyNCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXI0ICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzc4QTdGQycsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRDIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBhIHRlc3QgdGlja2V0LgogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICJMaW5rIFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgIEN1c3RvbWVyTm8gICA9PiAnMTIzNDY1JywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICdjdXN0b21lckBleGFtcGxlLmNvbScsCiAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXRDcmVhdGUoKSAtICRUaWNrZXRJRCIsCiAgICAgICAgKTsKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldE51bWJlciwKICAgICAgICAgICAgIlRpY2tldE51bWJlckxvb2t1cCgpIC0gJFRpY2tldE51bWJlciIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBHbyB0byBjYWxlbmRhciBvdmVydmlldyBwYWdlLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgR28gdG8gcHJldmlvdXMgd2Vlay4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10b29sYmFyIC5mYy1wcmV2LWJ1dHRvbicsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgVmVyaWZ5IGFsbCB0aHJlZSBjYWxlbmRhcnMgYXJlIHZpc2libGUuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLkNhbGVuZGFyU3dpdGNoOnZpc2libGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAzLAogICAgICAgICAgICAnQWxsIHRocmVlIGNhbGVuZGFycyB2aXNpYmxlJywKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSBjb3B5LXRvLWNsaXBib2FyZCBsaW5rLgogICAgICAgIG15ICRVUkwgPSAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy5Db3B5VG9DbGlwYm9hcmQnKS5hdHRyKCdkYXRhLWNsaXBib2FyZC10ZXh0Jyk7Iik7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVVJMLAogICAgICAgICAgICAnQ29weVRvQ2xpcGJvYXJkIFVSTCBwcmVzZW50JwogICAgICAgICk7CgogICAgICAgICMgVVJMIHNob3VsZCBub3QgY29udGFpbiBPVFJTIHNwZWNpZmljIFVSTCBkZWxpbWl0ZXIgb2Ygc2VtaWNvbG9uICg7KS4KICAgICAgICAjICAgRm9yIGJldHRlciBjb21wYXRpYmlsaXR5LCB1c2Ugc3RhbmRhcmQgYW1wZXJzYW5kICgmKSBpbnN0ZWFkLgogICAgICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMjY2NyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICggJFVSTCA9fiAvWztdLyApID8gMSA6IDAsCiAgICAgICAgICAgICdDb3B5VG9DbGlwYm9hcmQgVVJMIGRvZXMgbm90IGNvbnRhaW4gZm9yYmlkZGVuIGNoYXJhY3RlcnMnCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayBvbiB0aGUgdGltZWxpbmUgdmlldyBmb3IgYW4gYXBwb2ludG1lbnQgZGlhbG9nLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lV2Vlay12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDpudGgtY2hpbGQoNSknLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICMgRWxlbWVudHMgdGhhdCBhcmUgbm90IGFsbG93ZWQgaW4gZGlhbG9nLgogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1EZWxldGUgRWRpdEZvcm1Db3B5KSkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cy0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEVudGVyIHNvbWUgZGF0YS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNUaXRsZSIsICAgICdjc3MnICktPnNlbmRfa2V5cygnQXBwb2ludG1lbnQgMScpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0xvY2F0aW9uIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCdTdHJhdWJpbmcnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VuZEhvdXInLCAgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCcxOCcpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLlBsdWdpbkZpZWxkJywgJ2NzcycgKS0+c2VuZF9rZXlzKCRUaWNrZXROdW1iZXIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aDsnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkVGlja2V0TnVtYmVyKScpLmNsaWNrKCk7Iik7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcuUGx1Z2luQ29udGFpbmVyIGRpdiBhW3RhcmdldD1cIl9ibGFua1wiXScpLmxlbmd0aDsiCiAgICAgICAgKTsKCiAgICAgICAgIyBWZXJpZnkgY29ycmVjdCB0aWNrZXQgaXMgbGlzdGVkLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5QbHVnaW5Db250YWluZXIgZGl2IGFbdGFyZ2V0PVwiX2JsYW5rXCJdJykudGV4dCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIiRUaWNrZXROdW1iZXIgTGluayBUaWNrZXQgJFJhbmRvbUlEIiwKICAgICAgICAgICAgJ0xpbmsgdGlja2V0IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgbG9jYXRpb24gbGluayBjb250YWlucyBjb3JyZWN0IHZhbHVlLgogICAgICAgIG15ICRMb2NhdGlvbkxpbmtVUkwgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5Mb2NhdGlvbkxpbmsnLCAnY3NzJyApLT5nZXRfYXR0cmlidXRlKCdocmVmJyk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMb2NhdGlvbkxpbmtVUkwgPX4gL1N0cmF1YmluZyQvLAogICAgICAgICAgICAnTG9jYXRpb24gbGluayBjb250YWlucyBjb3JyZWN0IHZhbHVlJywKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uIFNhdmUuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBhbGwgQUpBWCBjYWxscyBmaW5pc2hlZC4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJC5hY3RpdmUgPT0gMCIgKTsKCiAgICAgICAgIyBWZXJpZnkgZmlyc3QgYXBwb2ludG1lbnQgaXMgdmlzaWJsZS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuZmMtdGltZWxpbmUtZXZlbnQgLmZjLXRpdGxlJykudGV4dCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IDEnLAogICAgICAgICAgICAnRmlyc3QgYXBwb2ludG1lbnQgdmlzaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBHbyB0byB0aGUgdGlja2V0IHpvb20gc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0ke1RpY2tldElEfSIpOwoKICAgICAgICAjIEZpbmQgbGluayB0byB0aGUgYXBwb2ludG1lbnQgb24gcGFnZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2EuTGlua09iamVjdExpbmsnLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNUaXRsZScpLnZhbCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IDEnLAogICAgICAgICAgICAnVGl0bGUgbWF0Y2hlcycsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgJ0NhbGVuZGFyIG1hdGNoZXMnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLlBsdWdpbkNvbnRhaW5lciBkaXYgYVt0YXJnZXQ9XCJfYmxhbmtcIl0nKS50ZXh0KCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICAiJFRpY2tldE51bWJlciBMaW5rIFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgICAgICAnTGluayB0aWNrZXQgbWF0Y2hlcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBsb2NhdGlvbiBsaW5rIGNvbnRhaW5zIGNvcnJlY3QgdmFsdWUuCiAgICAgICAgJExvY2F0aW9uTGlua1VSTCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkxvY2F0aW9uTGluaycsICdjc3MnICktPmdldF9hdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJExvY2F0aW9uTGlua1VSTCA9fiAvU3RyYXViaW5nJC8sCiAgICAgICAgICAgICdMb2NhdGlvbiBsaW5rIGNvbnRhaW5zIGNvcnJlY3QgdmFsdWUnLAogICAgICAgICk7CgogICAgICAgICMgQ2FuY2VsIHRoZSBkaWFsb2cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1DYW5jZWwnLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgR28gdG8gcHJldmlvdXMgd2Vlay4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10b29sYmFyIC5mYy1wcmV2LWJ1dHRvbicsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgQ2xpY2sgb24gdGhlIHRpbWVsaW5lIHZpZXcgZm9yIGFub3RoZXIgYXBwb2ludG1lbnQgZGlhbG9nLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lV2Vlay12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDpudGgtY2hpbGQoNSknLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICMgRW50ZXIgc29tZSBkYXRhLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdBcHBvaW50bWVudCAyJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQWxsRGF5JywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0FsbERheSIpLnByb3AoImNoZWNrZWQiKSA9PT0gdHJ1ZTsnICk7CgogICAgICAgICMgQ2xpY2sgb24gU2F2ZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgIyBIaWRlIHRoZSBmaXJzdCBjYWxlbmRhciBmcm9tIHZpZXcuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LCAnaWQnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDYWxlbmRhcicKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAnIikucHJvcCgiY2hlY2tlZCIpID09PSBmYWxzZTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZScpLnRleHQoKSA9PT0gJ0FwcG9pbnRtZW50IDInOyIKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSBzZWNvbmQgYXBwb2ludG1lbnQgaXMgdmlzaWJsZS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuZmMtdGltZWxpbmUtZXZlbnQgLmZjLXRpdGxlJykudGV4dCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IDInLAogICAgICAgICAgICAnU2Vjb25kIGFwcG9pbnRtZW50IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IHNlY29uZCBhcHBvaW50bWVudCBpcyBhbiBhbGwgZGF5IGFwcG9pbnRtZW50LgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmEtc3VuLW8nKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnMScsCiAgICAgICAgICAgICdTZWNvbmQgYXBwb2ludG1lbnQgaW4gYW4gYWxsIGRheSBhcHBvaW50bWVudCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayBhZ2FpbiBvbiB0aGUgdGltZWxpbmUgdmlldyBmb3IgYW4gYXBwb2ludG1lbnQgZGlhbG9nLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lV2Vlay12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDpudGgtY2hpbGQoNSknLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICMgRW50ZXIgc29tZSBkYXRhLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdBcHBvaW50bWVudCAzJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjN7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0VuZEhvdXInLCAnbmFtZScgKS0+c2VuZF9rZXlzKCcxOCcpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdEYWlseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgQ2xpY2sgb24gU2F2ZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIGFsbCBBSkFYIGNhbGxzIGZpbmlzaGVkLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkLmFjdGl2ZSA9PSAwIiApOwoKICAgICAgICAjIEhpZGUgdGhlIHNlY29uZCBjYWxlbmRhciBmcm9tIHZpZXcuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LCAnaWQnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDYWxlbmRhcicKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAnIikucHJvcCgiY2hlY2tlZCIpID09PSBmYWxzZTsnCiAgICAgICAgKTsKCiAgICAgICAgIyBWZXJpZnkgYWxsIHRoaXJkIGFwcG9pbnRtZW50IG9jY3VyZW5jZXMgYXJlIHZpc2libGUuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICc0JywKICAgICAgICAgICAgJ0FsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cnJlbmNlcyB2aXNpYmxlJywKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uIGFuIGFwcG9pbnRtZW50LgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnLmZjLXRpbWVsaW5lLWV2ZW50OmVxKDApIC5mYy10aXRsZScpLnRyaWdnZXIoJ2NsaWNrJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyBDbGljayBvbiBEZWxldGUuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1EZWxldGUnLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEFsZXJ0UHJlc2VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5hY2NlcHRfYWxlcnQoKTsKCiAgICAgICAgIyBXYWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIGFsbCBBSkFYIGNhbGxzIGZpbmlzaGVkLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkLmFjdGl2ZSA9PSAwOyIgKTsKCiAgICAgICAgIyBWZXJpZnkgYWxsIHRoaXJkIGFwcG9pbnRtZW50IG9jY3VyZW5jZXMgaGF2ZSBiZWVuIHJlbW92ZWQuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICcwJywKICAgICAgICAgICAgJ0FsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cnJlbmNlcyByZW1vdmVkJywKICAgICAgICApOwoKICAgICAgICAjIFNob3cgYWxsIHRocmVlIGNhbGVuZGFycy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0NhbGVuZGFyJyAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sICdpZCcgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0NhbGVuZGFyJyAuICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0sICdpZCcgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycgKTsKCiAgICAgICAgIyBWZXJpZnkgb25seSB0d28gYXBwb2ludG1lbnRzIGFyZSB2aXNpYmxlLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnMicsCiAgICAgICAgICAgICdGaXJzdCBhbmQgc2Vjb25kIGFwcG9pbnRtZW50IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgT3BlbiBkYXRlcGlja2VyLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLWp1bXAtYnV0dG9uJywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNEYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIC5IaWdobGlnaHQiKS5sZW5ndGggPT09IDE7JwogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IGV4YWN0bHkgb25lIGRheSB3aXRoIGFwcG9pbnRtZW50cyBpcyBoaWdobGlnaHRlZC4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjRGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1jYWxlbmRhciAuSGlnaGxpZ2h0JykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgJ0RhdGVwaWNrZXIgcHJvcGVybHkgaGlnaGxpZ2h0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgQ2xvc2UgZGF0ZXBpY2tlci4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2RpdiNEYXRlcGlja2VyT3ZlcmxheScsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIjRGF0ZXBpY2tlck92ZXJsYXkiKS5sZW5ndGg7JyApOwoKICAgICAgICAjIEZpbHRlciBqdXN0IHRoaXJkIGNhbGVuZGFyLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnaW5wdXQjRmlsdGVyQ2FsZW5kYXJzJywgJ2NzcycgKS0+c2VuZF9rZXlzKCdDYWxlbmRhcjMnKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkNhbGVuZGFyU3dpdGNoOnZpc2libGUiKS5sZW5ndGggPT09IDE7JwogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IG9ubHkgb25lIGNhbGVuZGFyIGlzIHNob3duIGluIHRoZSBsaXN0LgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5DYWxlbmRhclN3aXRjaDp2aXNpYmxlJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgJ0NhbGVuZGFycyBhcmUgZmlsdGVyZWQgY29ycmVjdGx5JywKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBuZXcgQXBwb2ludG1lbnQgKGFzIHJvb3QpLgogICAgICAgIG15ICRTdGFydFRpbWUgICAgICAgPSAkVGltZU9iamVjdC0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkVGltZU9iamVjdC0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CiAgICAgICAgJFN0YXJ0VGltZSA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtIC0gNyAqIDI0ICogNjAgKiA2MCwgICAgIyBsYXN0IHdlZWsKICAgICAgICApOwoKICAgICAgICBteSAkRW5kVGltZSA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtIC0gNyAqIDI0ICogNjAgKiA2MCArIDIgKiA2MCAqIDYwLCAgICAjIDIgaG91cnMgYWZ0ZXIgc3RhcnQgdGltZQogICAgICAgICk7CgogICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgPT4gJENhbGVuZGFyNHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJ1Blcm1pc3Npb25zIGNoZWNrIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgIEVuZFRpbWUgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICA9PiAwLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgJ1Blcm1pc3Npb24gQXBwb2ludG1lbnQgY3JlYXRlZC4nLAogICAgICAgICk7CgogICAgICAgICMgQWRkIHJvIHBlcm1pc3Npb25zIHRvIHRoZSB1c2VyLgogICAgICAgICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBJRDIsCiAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICBybyA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIFJlbG9hZCBwYWdlLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgU2hvdyB0aGUgZm91cnRoIGNhbGVuZGFyIGFuZCBoaWRlIGFsbCBvdGhlcnMuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXI0e0NhbGVuZGFySUR9LCAnaWQnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDYWxlbmRhcicKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyNHtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAnIikucHJvcCgiY2hlY2tlZCIpID09PSB0cnVlOycKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnQ2FsZW5kYXInIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwgJ2lkJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjQ2FsZW5kYXInCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gJyIpLnByb3AoImNoZWNrZWQiKSA9PT0gZmFsc2U7JwogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LCAnaWQnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDYWxlbmRhcicKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAnIikucHJvcCgiY2hlY2tlZCIpID09PSBmYWxzZTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0NhbGVuZGFyJyAuICRDYWxlbmRhcjN7Q2FsZW5kYXJJRH0sICdpZCcgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0NhbGVuZGFyJwogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIze0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICciKS5wcm9wKCJjaGVja2VkIikgPT09IGZhbHNlOycKICAgICAgICApOwoKICAgICAgICAjIEdvIHRvIHByZXZpb3VzIHdlZWsuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdG9vbGJhciAuZmMtcHJldi1idXR0b24nLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoICYmICQoIi5mYy1ldmVudC1jb250YWluZXIgYSIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgIyBGaW5kIHRoZSBhcHBvaW50bWVudCBsaW5rLgogICAgICAgIG15ICRBcHBvaW50bWVudExpbmsgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy1ldmVudC1jb250YWluZXIgYScsICdjc3MnICk7CgogICAgICAgICMgQ2xpY2sgb24gYXBwb2ludG1lbnQuCiAgICAgICAgJEFwcG9pbnRtZW50TGluay0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGg7IiApOwoKICAgICAgICBteSAkVGVhbU9iamVjdFJlZ2lzdGVyZWQKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKTsKCiAgICAgICAgIyBDaGVjayBpZiBmaWVsZHMgYXJlIGRpc2FibGVkLgogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50ICgKICAgICAgICAgICAgcXcoVGl0bGUgRGVzY3JpcHRpb24gTG9jYXRpb24gQ2FsZW5kYXJJRCBUZWFtSUQgUmVzb3VyY2VJRCBTdGFydERheSBFbmREYXkgQWxsRGF5CiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgIyBDaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkLgogICAgICAgICAgICBpZiAoICEkVGVhbU9iamVjdFJlZ2lzdGVyZWQgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEVMRU1FTlQgaWYgJEVsZW1lbnQgZXEgJ1RlYW1JRCcgfHwgJEVsZW1lbnQgZXEgJ1Jlc291cmNlSUQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRWxlbWVudFJlYWRPbmx5LT4oCiAgICAgICAgICAgICAgICBVbml0VGVzdE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRWxlbWVudHMgdGhhdCBhcmUgbm90IGFsbG93ZWQgb24gcGFnZS4KICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KEVkaXRGb3JtU3VibWl0IEVkaXRGb3JtRGVsZXRlIEVkaXRGb3JtQ29weSkpIHsKICAgICAgICAgICAgJEVsZW1lbnRFeGlzdHMtPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBFbGVtZW50cyB0aGF0IHNob3VsZCBiZSBvbiBwYWdlLgogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1DYW5jZWwpKSB7CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyMkRWxlbWVudCcpLmxlbmd0aDsiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzLT4oCiAgICAgICAgICAgICAgICBVbml0VGVzdE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2xpY2sgb24gY2FuY2VsLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtQ2FuY2VsJywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAjIEFkZCBtb3ZlX2ludG8gcGVybWlzc2lvbnMgdG8gdGhlIHVzZXIuCiAgICAgICAgJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cElEMiwKICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQ2xpY2sgb24gYXBwb2ludG1lbnQuCiAgICAgICAgJEFwcG9pbnRtZW50TGluay0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIENoZWNrIGlmIGZpZWxkcyBhcmUgZGlzYWJsZWQuCiAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyggQ2FsZW5kYXJJRCApKSB7CiAgICAgICAgICAgICRFbGVtZW50UmVhZE9ubHktPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBpZiBmaWVsZHMgYXJlIGVuYWJsZWQuCiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKAogICAgICAgICAgICBxdyhUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbiBUZWFtSUQgUmVzb3VyY2VJRCBTdGFydERheSBFbmREYXkgQWxsRGF5IFJlY3VycmVuY2VUeXBlKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIENoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQuCiAgICAgICAgICAgIGlmICggISRUZWFtT2JqZWN0UmVnaXN0ZXJlZCApIHsKICAgICAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAkRWxlbWVudCBlcSAnVGVhbUlEJyB8fCAkRWxlbWVudCBlcSAnUmVzb3VyY2VJRCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRFbGVtZW50UmVhZE9ubHktPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBFbGVtZW50cyB0aGF0IGFyZSBub3QgYWxsb3dlZCBvbiBwYWdlLgogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1EZWxldGUgRWRpdEZvcm1Db3B5KSkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cy0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIG9uIHBhZ2UuCiAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyhFZGl0Rm9ybVN1Ym1pdCBFZGl0Rm9ybUNhbmNlbCkpIHsKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnIyRFbGVtZW50JykubGVuZ3RoOyIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEVsZW1lbnRFeGlzdHMtPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDbGljayBvbiBjYW5jZWwuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1DYW5jZWwnLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgQWRkIGNyZWF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgdXNlci4KICAgICAgICAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cFVzZXJBZGQoCiAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQyLAogICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICAgICAgICAgIGNyZWF0ZSAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uIGFwcG9pbnRtZW50LgogICAgICAgICRBcHBvaW50bWVudExpbmstPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyBDaGVjayBpZiBmaWVsZHMgYXJlIGVuYWJsZWQuCiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKAogICAgICAgICAgICBxdyhUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbiBDYWxlbmRhcklEIFRlYW1JRCBSZXNvdXJjZUlEIFN0YXJ0RGF5IEVuZERheSBBbGxEYXkKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIENoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQuCiAgICAgICAgICAgIGlmICggISRUZWFtT2JqZWN0UmVnaXN0ZXJlZCApIHsKICAgICAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAkRWxlbWVudCBlcSAnVGVhbUlEJyB8fCAkRWxlbWVudCBlcSAnUmVzb3VyY2VJRCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRFbGVtZW50UmVhZE9ubHktPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBFbGVtZW50cyB0aGF0IHNob3VsZCBiZSBvbiBwYWdlLgogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1Db3B5IEVkaXRGb3JtU3VibWl0IEVkaXRGb3JtRGVsZXRlIEVkaXRGb3JtQ2FuY2VsKSkgewogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjJEVsZW1lbnQnKS5sZW5ndGg7IgogICAgICAgICAgICApOwogICAgICAgICAgICAkRWxlbWVudEV4aXN0cy0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjCiAgICAgICAgIyBDbGVhbnVwCiAgICAgICAgIwoKICAgICAgICBteSAkU2NoZWR1bGVyREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpOwogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgICAgICBteSAkREJPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBEZWxldGUgYXBwb2ludG1lbnRzIGFuZCBjYWxlbmRhcnMuCiAgICAgICAgZm9yIG15ICRDYWxlbmRhcklEICgKICAgICAgICAgICAgJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgJENhbGVuZGFyMntDYWxlbmRhcklEfSwKICAgICAgICAgICAgJENhbGVuZGFyM3tDYWxlbmRhcklEfSwKICAgICAgICAgICAgJENhbGVuZGFyNHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEIChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBEZWxldGUgdGVzdCBjYWxlbmRhcnMuCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gY2FsZW5kYXIgV0hFUkUgaWQgPSAkQ2FsZW5kYXJJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiRGVsZXRlZCB0ZXN0IGNhbGVuZGFyIC0gJENhbGVuZGFySUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZWxldGUgdGVzdCB0aWNrZXQuCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCB0aWNrZXQgLSAkVGlja2V0SUQiLAogICAgICAgICk7CgogICAgICAgICMgUmVtb3ZlIHNjaGVkdWxlZCBhc3luY2hyb25vdXMgdGFza3MgZnJvbSBEQiwgYXMgdGhleSBtYXkgaW50ZXJmZXJlIHdpdGggdGVzdHMgcnVuIGxhdGVyLgogICAgICAgIG15IEBUYXNrSURzOwogICAgICAgIG15IEBBbGxUYXNrcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0xpc3QoCiAgICAgICAgICAgIFR5cGUgPT4gJ0FzeW5jaHJvbm91c0V4ZWN1dG9yJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkVGFzayAoQEFsbFRhc2tzKSB7CiAgICAgICAgICAgIGlmICggJFRhc2stPntOYW1lfSBlcSAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyLVRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1RpY2tldCgpJyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFRhc2tJRHMsICRUYXNrLT57VGFza0lEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgbXkgJFRhc2tJRCAoQFRhc2tJRHMpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJFRhc2tJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJUYXNrRGVsZXRlIC0gUmVtb3ZlZCBzY2hlZHVsZWQgYXN5bmNocm9ub3VzIHRhc2sgJFRhc2tJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSBncm91cC11c2VyIHJlbGF0aW9ucy4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gZ3JvdXBfdXNlciBXSEVSRSBncm91cF9pZCA9ICRHcm91cElEIE9SIGdyb3VwX2lkID0gJEdyb3VwSUQyIiwKICAgICAgICApOwogICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkdyb3VwVXNlckRlbGV0ZSAtICRSYW5kb21JRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSBncm91cHMuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGdyb3VwcyBXSEVSRSBpZCA9ICRHcm91cElEIE9SIGlkID0gJEdyb3VwSUQyIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkdyb3VwRGVsZXRlIC0gJFJhbmRvbUlEIiwKICAgICAgICApOwoKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICBmb3IgbXkgJENhY2hlIChxdyhBcHBvaW50bWVudCBDYWxlbmRhciBHcm91cCBUaWNrZXQpKSB7CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CiAgICB9LAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIG92ZXJyaWRlIGxvY2FsIHRpbWUgem9uZSBmb3IgZHVyYXRpb24gb2YgdGhlIHRlc3QKbG9jYWwgJEVOVntUWn0gPSAnVVRDJzsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgZ3JvdXAKICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gdGltZQogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwoKICAgICAgICAjIGFkZCAxIG1vbnRoCiAgICAgICAgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgVGltZSAgID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICBNb250aHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBkYXRlIGluZm8gKFNlY29uZCwgTWludXRlLCBIb3VyLCBEYXksIE1vbnRoLCBZZWFyLCBEYXlPZldlZWspCiAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICk7CgogICAgICAgICMgY2hhbmdlIHJlc29sdXRpb24gKGRlc2t0b3AgbW9kZSkKICAgICAgICAkU2VsZW5pdW0tPnNldF93aW5kb3dfc2l6ZSggNzY4LCAxMDUwICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlcgogICAgICAgIG15ICRMYW5ndWFnZSAgICAgID0gJ2VuJzsKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgICA9PiBbICd1c2VycycsICRHcm91cE5hbWUgXSwKICAgICAgICAgICAgTGFuZ3VhZ2UgPT4gJExhbmd1YWdlLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAjIGdldCBVc2VySUQKICAgICAgICBteSAkVXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgc3RhcnQgdGVzdAogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIGZldyB0ZXN0IGNhbGVuZGFycwogICAgICAgIG15ICVDYWxlbmRhcjEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiTXkgQ2FsZW5kYXIgJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBjYWxlbmRhciBvdmVydmlldyBwYWdlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkLmFjdGl2ZSA9PSAwIiApOwoKICAgICAgICAjIGNsaWNrIG9uIHRoZSBtb250aCB2aWV3CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtbW9udGgtYnV0dG9uJywgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuZmMtbW9udGgtdmlldyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgZ28gdG8gbmV4dCBtb250aAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLW5leHQtYnV0dG9uJywgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JyApOwoKICAgICAgICAjIGdldCBkYXRlIGluZm8gKFNlY29uZCwgTWludXRlLCBIb3VyLCBEYXksIE1vbnRoLCBZZWFyLCBEYXlPZldlZWspCiAgICAgICAgbXkgJERhdGFEYXRlID0gIiREYXRlSW5mb1s1XS0iOwogICAgICAgIGlmICggJERhdGVJbmZvWzRdIDwgMTAgKSB7CiAgICAgICAgICAgICREYXRhRGF0ZSAuPSAiMCI7CiAgICAgICAgfQogICAgICAgICREYXRhRGF0ZSAuPSAiJERhdGVJbmZvWzRdLTAxIjsKCiAgICAgICAgIyBjcmVhdGUgZXZlcnkgZGF5IGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykubGVuZ3RoICYmIFwkKCcjRWRpdEZvcm1TdWJtaXQnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdFdmVyeSBkYXknKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdEYWlseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzMSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSA0IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMxLAogICAgICAgICAgICA0LAogICAgICAgICAgICAiQ3JlYXRlIGRhaWx5IHJlY3VycmluZyBhcHBvaW50bWVudC4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgJERlbGV0ZTEgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHMxWzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTEsCiAgICAgICAgICAgICJEZWxldGUgZGFpbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGV2ZXJ5IHdlZWsgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS5sZW5ndGggJiYgXCQoJyNFZGl0Rm9ybVN1Ym1pdCcpLmxlbmd0aDsiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IHdlZWsnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdXZWVrbHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSAzIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzMnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzMiA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMyLAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15ICRTdGFydEFwcG9pbnRtZW50ICAgICAgID0gIiREYXRhRGF0ZSAwMDowMDowMCI7CiAgICAgICAgbXkgJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRBcHBvaW50bWVudCwKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQyU3RhcnRUaW1lcyA9ICgKICAgICAgICAgICAgJFN0YXJ0QXBwb2ludG1lbnQsCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSArIDcgKiAyNCAqIDM2MDAsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSArIDE0ICogMjQgKiAzNjAwLAogICAgICAgICAgICApLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uIDIgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHMyWyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50MlN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgJERlbGV0ZTIgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHMyWzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTIsCiAgICAgICAgICAgICJEZWxldGUgd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBldmVyeSBtb250aCBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGg7IiApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLmxlbmd0aCAmJiBcJCgnI0VkaXRGb3JtU3VibWl0JykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnRXZlcnkgbW9udGgnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdNb250aGx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGVyZSBhcmUgMyBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzMywKICAgICAgICAgICAgMywKICAgICAgICAgICAgIkNyZWF0ZSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudC4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50M1N0YXJ0VGltZXMgPSAoCiAgICAgICAgICAgICRTdGFydEFwcG9pbnRtZW50LAogICAgICAgICAgICAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgICAgICAgICAgTW9udGhzID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVGltZSAgID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgICAgICAgICAgICAgIE1vbnRocyA9PiAyLAogICAgICAgICAgICAgICAgICAgIFRpbWUgICA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICksCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMiApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czNbJEluZGV4XS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQzU3RhcnRUaW1lc1skSW5kZXhdLAogICAgICAgICAgICAgICAgIkNoZWNrIHN0YXJ0IHRpbWUgIyRJbmRleCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICBteSAkRGVsZXRlMyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czNbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVsZXRlMywKICAgICAgICAgICAgIkRlbGV0ZSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBldmVyeSB5ZWFyIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykubGVuZ3RoICYmIFwkKCcjRWRpdEZvcm1TdWJtaXQnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdFdmVyeSB5ZWFyJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnWWVhcmx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGVyZSBhcmUgMyBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzNCwKICAgICAgICAgICAgMywKICAgICAgICAgICAgIkNyZWF0ZSB5ZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50LiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQ0U3RhcnRUaW1lcyA9ICgKICAgICAgICAgICAgJFN0YXJ0QXBwb2ludG1lbnQsCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgICAgICAgICBZZWFycyA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRpbWUgID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgICAgICAgICAgICAgIFllYXJzID0+IDIsCiAgICAgICAgICAgICAgICAgICAgVGltZSAgPT4gJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uIDIgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHM0WyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50NFN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgJERlbGV0ZTQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHM0WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTQsCiAgICAgICAgICAgICJEZWxldGUgeWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhcHBvaW50bWVudCBldmVyeSBzZWNvbmQgZGF5CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykubGVuZ3RoICYmIFwkKCcjRWRpdEZvcm1TdWJtaXQnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdFdmVyeSAybmQgZGF5Jyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIGRheQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VJbnRlcnZhbCcpLnZhbCgyKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzNSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM1LAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSBkYWlseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudDVTdGFydFRpbWVzID0gKAogICAgICAgICAgICAkU3RhcnRBcHBvaW50bWVudCwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtICsgMiAqIDI0ICogMzYwMCwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtICsgNCAqIDI0ICogMzYwMCwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzNVskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDVTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGU1ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzNVswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU1LAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSBkYWlseSByZWN1cnJpbmcgYXBwb2ludG1lbnRzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS5sZW5ndGggJiYgXCQoJyNFZGl0Rm9ybVN1Ym1pdCcpLmxlbmd0aDsiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IDJuZCBNb25kYXksIFdlZG5lc2RheSBhbmQgU3VuZGF5Jyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJykudmFsKCdDdXN0b21XZWVrbHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgZm9yIGpzCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdjp2aXNpYmxlIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIGRheQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGl0J3MgZGVzZWxlY3RlZAogICAgICAgIG15ICREZXNlbGVjdGVkNiA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiAhJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlc2VsZWN0ZWQ2LAogICAgICAgICAgICAiQ2hlY2sgaWYgbm90aGluZyBpcyBzZWxlY3RlZCAoIzYpLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCBNb24KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT1cIjFcIl0nKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlbGVjdGVkIHN1Y2Nlc3NmdWwKICAgICAgICBteSAkV2FpdDZGb3IxID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b25bdmFsdWU9XCIxXCJdIikuaGFzQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkV2FpdDZGb3IxLAogICAgICAgICAgICAiQ3VzdG9tIHdlZWtseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIE1vbmRheSBpcyBzZWxlY3RlZC4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZWxlY3QgV2VkCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b25bdmFsdWU9XCIzXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQ2Rm9yMyA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPVwiM1wiXSIpLmhhc0NsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ2Rm9yMywKICAgICAgICAgICAgIkN1c3RvbSB3ZWVrbHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiBXZWRuZXNkYXkgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IFN1bgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPVwiN1wiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0NkZvcjcgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT1cIjdcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXYWl0NkZvcjcsCiAgICAgICAgICAgICJDdXN0b20gd2Vla2x5IGFwcG9pbnRtZW50IC0gY2hlY2sgaWYgU3VuZGF5IGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNldCBlYWNoIDJuZCB3ZWVrCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUludGVydmFsJykudmFsKDIpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSA2IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCc2Jyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzNiA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSA2IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM2LAogICAgICAgICAgICA2LAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50LiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lczsKICAgICAgICBteSAkU3lzdGVtVGltZTYgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAiJERhdGFEYXRlIDAwOjAwOjAwIiwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdENXNjsKCiAgICAgICAgd2hpbGUgKCBzY2FsYXIgQEFwcG9pbnRtZW50NlN0YXJ0VGltZXMgIT0gNiApIHsKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAoICRUbXAsICRDVzYgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lNiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIGN1cnJlbnQgZGF5CiAgICAgICAgICAgIGlmICggISRMYXN0Q1c2ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RDVzYgPSAkQ1c2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggZ3JlcCB7ICREYXlPZldlZWsgPT0gJF8gfSAoIDEsIDMsIDcgKSApICAgICMgY2hlY2sgaWYgZGF5IGlzIHZhbGlkCiAgICAgICAgICAgICAgICAmJiAoICggJENXNiAtICRMYXN0Q1c2ICkgJSAyID09IDAgKSAgICAgICAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RDVzYgPSAkQ1c2OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lNiArPSAyNCAqIDM2MDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiA1ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzNlskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDZTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGU2ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzNlswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU2LAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50KHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQpCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykubGVuZ3RoICYmIFwkKCcjRWRpdEZvcm1TdWJtaXQnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdDdXN0b20gd2Vla2x5IHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdDdXN0b20nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgdW50aWwganMgc2hvd3MgSW50ZXJ2YWwKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlSW50ZXJ2YWw6dmlzaWJsZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVR5cGUnKS52YWwoJ0N1c3RvbVdlZWtseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCBmb3IganMKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2OnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgZGVzZWxlY3Qgc2VsZWN0ZWQgZGF5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgaXQncyBkZXNlbGVjdGVkCiAgICAgICAgbXkgJERlc2VsZWN0ZWQ3ID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuICEkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikubGVuZ3RoOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVzZWxlY3RlZDcsCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjNykuIgogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlSW50ZXJ2YWwnKS52YWwoMik7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzMnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHM3ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czcsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgICJDcmVhdGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQod2l0aG91dCBhbnkgZGF5IHNlbGVjdGVkKS4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50N1N0YXJ0VGltZXM7CiAgICAgICAgbXkgJFN5c3RlbVRpbWU3ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gIiREYXRhRGF0ZSAwMDowMDowMCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RDVzc7CiAgICAgICAgbXkgJERheU9mV2Vlazc7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDdTdGFydFRpbWVzICE9IDMgKSB7CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU3LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgKCAkVG1wLCAkQ1c3ICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGRheQogICAgICAgICAgICBpZiAoICEkTGFzdENXNyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50N1N0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU3LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0Q1c3ICAgID0gJENXNzsKICAgICAgICAgICAgICAgICREYXlPZldlZWs3ID0gJERheU9mV2VlazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAoICREYXlPZldlZWsgPT0gJERheU9mV2VlazcgKSAgICAjIGNoZWNrIGlmIGRheSBpcyB2YWxpZAogICAgICAgICAgICAgICAgJiYgKCAoICRDVzcgLSAkTGFzdENXNyApICUgMiA9PSAwICkgICAgIyBjaGVjayBpZiBJbnRlcnZhbCBtYXRjaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50N1N0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU3LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0Q1c3ID0gJENXNzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgb25lIGRheQogICAgICAgICAgICAkU3lzdGVtVGltZTcgKz0gMjQgKiAzNjAwOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMiApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czdbJEluZGV4XS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQ3U3RhcnRUaW1lc1skSW5kZXhdLAogICAgICAgICAgICAgICAgIkNoZWNrIHN0YXJ0IHRpbWUgIyRJbmRleCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlNyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czdbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVsZXRlNywKICAgICAgICAgICAgIkRlbGV0ZSBjdXN0b20gd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS5sZW5ndGggJiYgXCQoJyNFZGl0Rm9ybVN1Ym1pdCcpLmxlbmd0aDsiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IDJuZCBtb250aCwgb24gM3RoLCAxMHRoIGFuZCAzMXRoIG9mIG1vbnRoLicpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0N1c3RvbScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBqcyBzaG93cyBJbnRlcnZhbAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VJbnRlcnZhbDp2aXNpYmxlIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLnZhbCgnQ3VzdG9tTW9udGhseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCBmb3IganMKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdjp2aXNpYmxlIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIGRheQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUnKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBpdCdzIGRlc2VsZWN0ZWQKICAgICAgICBteSAkRGVzZWxlY3RlZDggPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gISQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikubGVuZ3RoOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVzZWxlY3RlZDgsCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjOCkuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IDN0aAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjNcIl0nKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlbGVjdGVkIHN1Y2Nlc3NmdWwKICAgICAgICBteSAkV2FpdDhGb3IzID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uW3ZhbHVlPVwiM1wiXSIpLmhhc0NsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ4Rm9yMywKICAgICAgICAgICAgIkN1c3RvbSBtb250aGx5IGFwcG9pbnRtZW50IC0gY2hlY2sgaWYgMyBpcyBzZWxlY3RlZC4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZWxlY3QgMTB0aAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjEwXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQ4Rm9yMTAgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9XCIxMFwiXSIpLmhhc0NsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ4Rm9yMTAsCiAgICAgICAgICAgICJDdXN0b20gbW9udGhseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIDEwIGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCAzMQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjMxXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQ4Rm9yMzEgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9XCIzMVwiXSIpLmhhc0NsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ4Rm9yMzEsCiAgICAgICAgICAgICJDdXN0b20gbW9udGhseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIDMxIGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNldCBlYWNoIDJuZCB3ZWVrCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUludGVydmFsJykudmFsKDIpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSAyMCBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnMjAnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHM4ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDIwIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM4LAogICAgICAgICAgICAyMCwKICAgICAgICAgICAgIkNyZWF0ZSBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudDhTdGFydFRpbWVzOwogICAgICAgIG15ICRTeXN0ZW1UaW1lOCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICIkRGF0YURhdGUgMDA6MDA6MDAiLAogICAgICAgICk7CgogICAgICAgIG15ICRMYXN0TW9udGg4OwoKICAgICAgICB3aGlsZSAoIHNjYWxhciBAQXBwb2ludG1lbnQ4U3RhcnRUaW1lcyAhPSAyMCApIHsKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTgsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkTGFzdE1vbnRoOCApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50OFN0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU4LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0TW9udGg4ID0gJE1vbnRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggZ3JlcCB7ICREYXkgPT0gJF8gfSAoIDMsIDEwLCAzMSApICkgICAgIyBjaGVjayBpZiBkYXkgaXMgdmFsaWQKICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAoICRNb250aCAtICRMYXN0TW9udGg4ICkgJSAyID09IDAgICAgIyBjaGVjayBpZiBJbnRlcnZhbCBtYXRjaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50OFN0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU4LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgb25lIGRheQogICAgICAgICAgICAkU3lzdGVtVGltZTggKz0gMjQgKiAzNjAwOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMTkgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHM4WyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50OFN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJERlbGV0ZTggPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHM4WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTgsCiAgICAgICAgICAgICJEZWxldGUgY3VzdG9tIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50KHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQpCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykubGVuZ3RoICYmIFwkKCcjRWRpdEZvcm1TdWJtaXQnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdDdXN0b20gbW9udGhseSB3aXRob3V0IGFueXRoaW5nIHNlbGVjdGVkJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJykudmFsKCdDdXN0b21Nb250aGx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IGZvciBqcwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2OnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgZGVzZWxlY3Qgc2VsZWN0ZWQgZGF5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGl0J3MgZGVzZWxlY3RlZAogICAgICAgIG15ICREZXNlbGVjdGVkOSA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiAhJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5sZW5ndGg7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZXNlbGVjdGVkOSwKICAgICAgICAgICAgIkNoZWNrIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQgKCM5KS4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZWFjaCAybmQgeWVhcgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VJbnRlcnZhbCcpLnZhbCgyKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnMycpOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czkgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGVyZSBhcmUgMyBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzOSwKICAgICAgICAgICAgMywKICAgICAgICAgICAgIkNyZWF0ZSBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgYXBwb2ludG1lbnQod2l0aG91dCBhbnkgZGF5IHNlbGVjdGVkKS4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50OVN0YXJ0VGltZXM7CiAgICAgICAgbXkgJFN5c3RlbVRpbWU5ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gIiREYXRhRGF0ZSAwMDowMDowMCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RNb250aDk7CiAgICAgICAgbXkgJERheTk7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDlTdGFydFRpbWVzICE9IDMgKSB7CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU5LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgY3VycmVudCBkYXkKICAgICAgICAgICAgaWYgKCAhJExhc3RNb250aDkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudDlTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lOSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGFzdE1vbnRoOSA9ICRNb250aDsKICAgICAgICAgICAgICAgICREYXk5ICAgICAgID0gJERheTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAoICREYXkgPT0gJERheTkgKSAgICAjIGNoZWNrIGlmIGRheSBpcyB2YWxpZAogICAgICAgICAgICAgICAgJiYgKCAoICRNb250aCAtICRMYXN0TW9udGg5ICkgJSAyID09IDAgKSAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ5U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RNb250aDkgPSAkTW9udGg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIG9uZSBkYXkKICAgICAgICAgICAgJFN5c3RlbVRpbWU5ICs9IDI0ICogMzYwMDsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uIDIgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHM5WyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50OVN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJERlbGV0ZTkgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHM5WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTksCiAgICAgICAgICAgICJEZWxldGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnRzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgY3VzdG9tIHllYXJseSByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS5sZW5ndGggJiYgXCQoJyNFZGl0Rm9ybVN1Ym1pdCcpLmxlbmd0aDsiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IDJuZCB5ZWFyLCBpbiBGZWJydWFyeSwgT2N0b2JlciBhbmQgRGVjZW1iZXIuJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJykudmFsKCdDdXN0b21ZZWFybHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgZm9yIGpzCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdjp2aXNpYmxlIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIG1vbnRoCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgaXQncyBkZXNlbGVjdGVkCiAgICAgICAgbXkgJERlc2VsZWN0ZWQxMCA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiAhJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlc2VsZWN0ZWQxMCwKICAgICAgICAgICAgIkNoZWNrIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQgKCMxMCkuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IEZlYnJ1YXJ5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9XCIyXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQxMEZvcjIgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvblt2YWx1ZT1cIjJcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXYWl0MTBGb3IyLAogICAgICAgICAgICAiQ3VzdG9tIHllYXJseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIEZlYnJ1YXJ5IGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCBPY3RvYmVyCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9XCIxMFwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0MTBGb3IxMCA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPVwiMTBcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXYWl0MTBGb3IxMCwKICAgICAgICAgICAgIkN1c3RvbSB5ZWFybHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiBPY3RvYmVyIGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCBEZWNlbWJlcgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPVwiMTJcIl0nKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlbGVjdGVkIHN1Y2Nlc3NmdWwKICAgICAgICBteSAkV2FpdDEwRm9yMTIgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvblt2YWx1ZT1cIjEyXCJdIikuaGFzQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkV2FpdDEwRm9yMTIsCiAgICAgICAgICAgICJDdXN0b20geWVhcmx5IGFwcG9pbnRtZW50IC0gY2hlY2sgaWYgRGVjZW1iZXIgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlSW50ZXJ2YWwnKS52YWwoMik7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDYgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzYnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHMxMCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSA2IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMxMCwKICAgICAgICAgICAgNiwKICAgICAgICAgICAgIkNyZWF0ZSBjdXN0b20geWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudC4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50MTBTdGFydFRpbWVzOwogICAgICAgIG15ICRTeXN0ZW1UaW1lMTAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAiJERhdGFEYXRlIDAwOjAwOjAwIiwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdFllYXIxMDsKICAgICAgICBteSAkRGF5MTA7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDEwU3RhcnRUaW1lcyAhPSA2ICkgewogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkTGFzdFllYXIxMCApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50MTBTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RZZWFyMTAgPSAkWWVhcjsKICAgICAgICAgICAgICAgICREYXkxMCAgICAgID0gJERheTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAkRGF5ID09ICREYXkxMAogICAgICAgICAgICAgICAgJiYgKCBncmVwIHsgJE1vbnRoID09ICRfIH0gKCAyLCAxMCwgMTIgKSApICAgICMgY2hlY2sgaWYgZGF5IGlzIHZhbGlkCiAgICAgICAgICAgICAgICAmJiAoICggJFllYXIgLSAkTGFzdFllYXIxMCApICUgMiA9PSAwICkgICAgICAgIyBjaGVjayBpZiBJbnRlcnZhbCBtYXRjaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50MTBTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lMTAgKz0gMjQgKiAzNjAwOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gNSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czEwWyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50MTBTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGUxMCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czEwWzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTEwLAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBjdXN0b20gd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudCh3aXRob3V0IGFueXRoaW5nIHNlbGVjdGVkKQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGg7IiApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLmxlbmd0aCAmJiBcJCgnI0VkaXRGb3JtU3VibWl0JykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnQ3VzdG9tIHllYXJseSB3aXRob3V0IGFueXRoaW5nIHNlbGVjdGVkJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJykudmFsKCdDdXN0b21ZZWFybHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgZm9yIGpzCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdjp2aXNpYmxlIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIG1vbnRoCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgaXQncyBkZXNlbGVjdGVkCiAgICAgICAgbXkgJERlc2VsZWN0ZWQxMSA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiAhJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlc2VsZWN0ZWQxMSwKICAgICAgICAgICAgIkNoZWNrIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQgKCMxMSkuIgogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIHllYXIKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlSW50ZXJ2YWwnKS52YWwoMik7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzMnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHMxMSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMxMSwKICAgICAgICAgICAgMywKICAgICAgICAgICAgIkNyZWF0ZSBjdXN0b20geWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudCh3aXRob3V0IGFueSBtb250aCBzZWxlY3RlZCkuIgogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudDExU3RhcnRUaW1lczsKICAgICAgICBteSAkU3lzdGVtVGltZTExID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gIiREYXRhRGF0ZSAwMDowMDowMCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RZZWFyMTE7CiAgICAgICAgbXkgJERheTExOwogICAgICAgIG15ICRNb250aDExOwoKICAgICAgICB3aGlsZSAoIHNjYWxhciBAQXBwb2ludG1lbnQxMVN0YXJ0VGltZXMgIT0gMyApIHsKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTExLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgY3VycmVudCBkYXkKICAgICAgICAgICAgaWYgKCAhJExhc3RZZWFyMTEgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudDExU3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTExLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0WWVhcjExID0gJFllYXI7CiAgICAgICAgICAgICAgICAkRGF5MTEgICAgICA9ICREYXk7CiAgICAgICAgICAgICAgICAkTW9udGgxMSAgICA9ICRNb250aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAoICREYXkgPT0gJERheTExICkgICAgIyBjaGVjayBpZiBkYXkgaXMgdmFsaWQKICAgICAgICAgICAgICAgICYmICRNb250aCA9PSAkTW9udGgxMQogICAgICAgICAgICAgICAgJiYgKCAoICRZZWFyIC0gJExhc3RZZWFyMTEgKSAlIDIgPT0gMCApICAgICMgY2hlY2sgaWYgSW50ZXJ2YWwgbWF0Y2hlcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudDExU3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTExLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgb25lIGRheQogICAgICAgICAgICAkU3lzdGVtVGltZTExICs9IDI0ICogMzYwMDsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uIDIgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHMxMVskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDExU3RhcnRUaW1lc1skSW5kZXhdLAogICAgICAgICAgICAgICAgIkNoZWNrIHN0YXJ0IHRpbWUgIyRJbmRleCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlMTEgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHMxMVswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGUxMSwKICAgICAgICAgICAgIkRlbGV0ZSBjdXN0b20geWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudHMod2l0aG91dCBhbnkgbW9udGggc2VsZWN0ZWQpLiIsCiAgICAgICAgKTsKICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHcm91cE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgICAgIG15ICRDYWxlbmRhck9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgICAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICAgICAjIERhc2hib2FyZCB3aWRnZXQgY29uZmlnIGtleS4KICAgICAgICBteSAkRGFzaGJvYXJkQ29uZmlnS2V5ID0gJzA1MDAtQXBwb2ludG1lbnRDYWxlbmRhcic7CgogICAgICAgICMgVHVybiBvbiBkYXNoYm9hcmQgd2lkZ2V0IGJ5IGRlZmF1bHQuCiAgICAgICAgbXkgJERhc2hib2FyZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGFzaGJvYXJkQmFja2VuZCcpLT57JERhc2hib2FyZENvbmZpZ0tleX07CiAgICAgICAgJERhc2hib2FyZENvbmZpZy0+e0RlZmF1bHR9ID0gMTsKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAiRGFzaGJvYXJkQmFja2VuZCMjIyREYXNoYm9hcmRDb25maWdLZXkiLAogICAgICAgICAgICBWYWx1ZSA9PiAkRGFzaGJvYXJkQ29uZmlnLAogICAgICAgICk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEdyb3VwSUQsCiAgICAgICAgICAgICJDcmVhdGVkIHRlc3QgZ3JvdXAgLSAkR3JvdXBJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbJEdyb3VwTmFtZV0sCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgdXNlcic7CiAgICAgICAgbXkgJFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVXNlcklELAogICAgICAgICAgICAiQ3JlYXRlZCB0ZXN0IHVzZXIgLSAkVXNlcklEIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBhIHRlc3QgY2FsZW5kYXIuCiAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhciAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICJDcmVhdGVkIHRlc3QgY2FsZW5kYXIgLSAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0iLAogICAgICAgICk7CgogICAgICAgICMgR2V0IGN1cnJlbnQgdGltZS4KICAgICAgICBteSAkU3RhcnRUaW1lICAgICAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CiAgICAgICAgbXkgJFN0YXJ0VGltZXN0YW1wID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICApOwoKICAgICAgICAjIEp1c3QgYmVmb3JlIG1pZG5pZ2h0IHRvZGF5LgogICAgICAgIG15ICRUb2RheSA9IHN1YnN0ciggJFN0YXJ0VGltZXN0YW1wLCAwLCAxMCApIC4gJyAyMzo1OTo1OSc7CgogICAgICAgIG15ICRUb21vcnJvdyA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUgKyA2MCAqIDYwICogMjQsICAgICMgKzI0IGhvdXJzCiAgICAgICAgKTsKICAgICAgICBteSAkRGF5QWZ0ZXJUb21vcnJvdyA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUgKyA2MCAqIDYwICogNDgsICAgICMgKzQ4IGhvdXJzCiAgICAgICAgKTsKICAgICAgICBteSAkVHdvRGF5c0FmdGVyVG9tb3Jyb3cgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lICsgNjAgKiA2MCAqIDcyLCAgICAjICs3MiBob3VycwogICAgICAgICk7CgogICAgICAgICMgU2FtcGxlIGFwcG9pbnRtZW50cy4KICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gKAoKICAgICAgICAgICAgIyBUb2RheS4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgID0+ICRUb2RheSwKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJFRvZGF5LAogICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiVG9kYXkgJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIEZpbHRlciAgICAgPT4gJ1RvZGF5JywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgVG9tb3Jyb3cuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAkVG9tb3Jyb3csCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgID0+ICRUb21vcnJvdywKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIlRvbW9ycm93ICRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBGaWx0ZXIgICAgID0+ICdUb21vcnJvdycsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIERheSBhZnRlciB0b21vcnJvdy4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgID0+ICREYXlBZnRlclRvbW9ycm93LAogICAgICAgICAgICAgICAgRW5kVGltZSAgICA9PiAkRGF5QWZ0ZXJUb21vcnJvdywKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkRheSBhZnRlciB0b21vcnJvdyAkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRmlsdGVyICAgICA9PiAnU29vbicsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIFR3byBkYXlzIGFmdGVyIHRvbW9ycm93LgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJFR3b0RheXNBZnRlclRvbW9ycm93LAogICAgICAgICAgICAgICAgRW5kVGltZSAgICA9PiAkVHdvRGF5c0FmdGVyVG9tb3Jyb3csCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgID0+ICJUd28gZGF5cyBhZnRlciB0b21vcnJvdyAkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRmlsdGVyICAgICA9PiAnU29vbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgYXBwb2ludG1lbnRzLgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJXskQXBwb2ludG1lbnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgIkNyZWF0ZWQgdGVzdCBhcHBvaW50bWVudCAtICRBcHBvaW50bWVudElEIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gPSAkQXBwb2ludG1lbnRJRDsKICAgICAgICB9CgogICAgICAgICMgTG9naW4gYXMgdGVzdCB1c2VyLgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSB3aWRnZXQgaXMgcHJlc2VudC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEYXNoYm9hcmQkRGFzaGJvYXJkQ29uZmlnS2V5IiwgJ2NzcycgKTsKCiAgICAgICAgIyBDaGVjayBhcHBvaW50bWVudHMuCiAgICAgICAgbXkgJUZpbHRlckNvdW50OwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKCiAgICAgICAgICAgICMgUmVtZW1iZXIgZmlsdGVyLgogICAgICAgICAgICAkRmlsdGVyQ291bnR7ICRBcHBvaW50bWVudC0+e0ZpbHRlcn0gfSArPSAxOwoKICAgICAgICAgICAgIyBTd2l0Y2ggZmlsdGVyLgogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcuQXBwb2ludG1lbnRGaWx0ZXIgI0Rhc2hib2FyZCR7RGFzaGJvYXJkQ29uZmlnS2V5fSRBcHBvaW50bWVudC0+e0ZpbHRlcn0nKS50cmlnZ2VyKCdjbGljaycpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgV2FpdCB1bnRpbCBhbGwgQUpBWCBjYWxscyBmaW5pc2hlZC4KICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQuYWN0aXZlID09IDAiICk7CgogICAgICAgICAgICAjIFZlcmlmeSBhcHBvaW50bWVudCBpcyB2aXNpYmxlLgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBcHBvaW50bWVudElEPSRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9XCcpXSIpOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBmaWx0ZXIgY291bnQuCiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlckNvdW50ICkgewogICAgICAgICAgICBteSAkRmlsdGVyTGluayA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0Rhc2hib2FyZCR7RGFzaGJvYXJkQ29uZmlnS2V5fSR7RmlsdGVyfSIsICdjc3MnICk7CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkRmlsdGVyTGluay0+Z2V0X3RleHQoKSwKICAgICAgICAgICAgICAgICIkRmlsdGVyICgkRmlsdGVyQ291bnR7JEZpbHRlcn0pIiwKICAgICAgICAgICAgICAgICJGaWx0ZXIgY291bnQgLSAkRmlsdGVyIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIHRlc3QgYXBwb2ludG1lbnRzLgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJEZWxldGVkIHRlc3QgYXBwb2ludG1lbnQgLSAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSB0ZXN0IGNhbGVuZGFyLgogICAgICAgIGlmICggJENhbGVuZGFye0NhbGVuZGFySUR9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNhbGVuZGFyIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRDYWxlbmRhcntDYWxlbmRhcklEfSBdLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBjYWxlbmRhciAtICRDYWxlbmRhcntDYWxlbmRhcklEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICBmb3IgbXkgJENhY2hlIChxdyhDYWxlbmRhciBBcHBvaW50bWVudCkpIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIEdldCBTZWxlbml1bSBvYmplY3QuCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJFVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgICAgICBteSAkR3JvdXBPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgICAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRDYWNoZU9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICAgICAjIFNldCBsaW5rIG9iamVjdCB2aWV3IG1vZGUgdG8gJ0NvbXBsZXgnLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdMaW5rT2JqZWN0OjpWaWV3TW9kZScsCiAgICAgICAgICAgIFZhbHVlID0+ICdDb21wbGV4JywKICAgICAgICApOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGdyb3VwLgogICAgICAgIG15ICRHcm91cE5hbWUgPSAiZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkR3JvdXBJRCwKICAgICAgICAgICAgIkdyb3VwSUQgJEdyb3VwSUQgLSBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIuCiAgICAgICAgbXkgJExhbmd1YWdlICAgICAgPSAnZW4nOwogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyAgID0+IFsgJ2FkbWluJywgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgdXNlcic7CgogICAgICAgICMgR2V0IHRlc3QgdXNlciBJRC4KICAgICAgICBteSAkVXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGNhbGVuZGFyLgogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiTXkgQ2FsZW5kYXIgJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkQ2FsZW5kYXJJRCA9ICRDYWxlbmRhcntDYWxlbmRhcklEfTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENhbGVuZGFySUQsCiAgICAgICAgICAgICJDYWxlbmRhcklEICRDYWxlbmRhcklEIC0gY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB0aWNrZXQuCiAgICAgICAgbXkgJFRpY2tldFRpdGxlICA9ICJUaWNrZXQtJFJhbmRvbUlEIjsKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlTnVtYmVyKCk7CiAgICAgICAgbXkgJFRpY2tldElEICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVE4gICAgICAgICAgID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkVGlja2V0VGl0bGUsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdvcGVuJywKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICcxMjM0NjUnLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJ2N1c3RvbWVyT25lQGV4YW1wbGUuY29tJywKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgIlRpY2tldElEICRUaWNrZXRJRCAtIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgTG9naW4gYXMgdGVzdCB1c2VyLgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciKTsKCiAgICAgICAgbXkgJEFwcG9pbnRtZW50TmFtZSA9ICJBcHBvaW50bWVudC0kUmFuZG9tSUQiOwoKICAgICAgICAjIEFkZCBhcHBvaW50bWVudHMgYW5kIGxpbmsgd2l0aCB0ZXN0IHRpY2tldC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbiIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RpdGxlIiwgICAgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCIkQXBwb2ludG1lbnROYW1lIik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGVzY3JpcHRpb24iLCAnY3NzJyApLT5zZW5kX2tleXMoJ1Rlc3QgcmVwZWF0aW5nIGFwcG9pbnRtZW50Jyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgkQ2FsZW5kYXJJRCkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnRGFpbHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNSZWN1cnJlbmNlTGltaXQnKS5sZW5ndGgiICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjUmVjdXJyZW5jZUNvdW50JykubGVuZ3RoIiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JlY3VycmVuY2VDb3VudCIsICdjc3MnICktPnNlbmRfa2V5cygnMycpOwoKICAgICAgICBteSAkQXV0b0NvbXBsZXRlU3RyaW5nID0gIiRUaWNrZXROdW1iZXIgJFRpY2tldFRpdGxlIjsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggImlucHV0LlBsdWdpbkZpZWxkLnVpLWF1dG9jb21wbGV0ZS1pbnB1dCIsICdjc3MnICktPnNlbmRfa2V5cygkUmFuZG9tSUQpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJsaS51aS1tZW51LWl0ZW0iKS5sZW5ndGggPT09IDEnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkQXV0b0NvbXBsZXRlU3RyaW5nKScpLmNsaWNrKCkiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nLk1vZGFsIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CgogICAgICAgICMgR2V0IHRlc3QgYXBwb2ludG1lbnRzLgogICAgICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICApOwoKICAgICAgICAjIEdldCBwYXJlbnQgYW5kIGNoaWxkIGFwcG9pbnRtZW50cy4KICAgICAgICBteSAkUGFyZW50QXBwb2ludG1lbnQ7CiAgICAgICAgbXkgQENoaWxkQXBwb2ludG1lbnRzOwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQXBwb2ludG1lbnQtPntSZWN1cnJpbmd9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQ2hpbGRBcHBvaW50bWVudHMsICRBcHBvaW50bWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJlbnRBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBHZXQgdGhlIGxhc3QgY2hpbGQgYXBwb2ludG1lbnQgSUQuCiAgICAgICAgbXkgJExhc3RDaGlsZEFwcG9pbnRtZW50SUQgPSAkQ2hpbGRBcHBvaW50bWVudHNbLTFdLT57QXBwb2ludG1lbnRJRH07CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRUaWNrZXRab29tLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBDaGVjayBhcHBvaW50bWVudCBsaW5rcyAtIGFsbCBhcHBvaW50bWVudHMgc2hvdWxkIGJlIGluIHRoZSB0YWJsZS4KICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjQXBwb2ludG1lbnQgdGJvZHkgYVtocmVmKj1cIkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAuICJcIl0nKS5sZW5ndGg7IgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICJBZGRlZCBhcHBvaW50bWVudCAtIEFwcG9pbnRtZW50SUQgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gLSBmb3VuZCIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIHRoZSBsYXN0IHJlY3VycmluZyBhcHBvaW50bWVudCBsaW5rLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0kTGFzdENoaWxkQXBwb2ludG1lbnRJRCcgKV0iCiAgICAgICAgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5SZW1vdmVCdXR0b24iLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgIVwkKCcuUGx1Z2luQ29udGFpbmVyOnZpc2libGUnKS5sZW5ndGgiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nLk1vZGFsIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRUaWNrZXRab29tLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBDaGVjayBhcHBvaW50bWVudCBsaW5rcyAtIG9ubHkgdGhlIGxhc3QgYXBwb2ludG1lbnQgc2hvdWxkIG5vdCBiZSBpbiB0aGUgdGFibGUuCiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwogICAgICAgICAgICBteSAkTGVuZ3RoICAgICAgICA9ICRBcHBvaW50bWVudElEICE9ICRMYXN0Q2hpbGRBcHBvaW50bWVudElEID8gMSA6IDA7CiAgICAgICAgICAgIG15ICRJc0ZvdW5kICAgICAgID0gJExlbmd0aCA/ICdmb3VuZCcgOiAnbm90IGZvdW5kJzsKCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgInJldHVybiBcJCgnI0FwcG9pbnRtZW50IHRib2R5IGFbaHJlZio9XCJBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0kQXBwb2ludG1lbnRJRFwiXScpLmxlbmd0aDsiCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJExlbmd0aCwKICAgICAgICAgICAgICAgICJBZnRlciBkZWxldGUgY2hpbGQgYXBwb2ludG1lbnQgbGluayAtIEFwcG9pbnRtZW50SUQgJEFwcG9pbnRtZW50SUQgLSAkSXNGb3VuZCIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRWRpdCBwYXJlbnQgYXBwb2ludG1lbnQgbmFtZSB0byBjaGVjayBpZiBhbGwgY2hpbGQgYXBwb2ludG1lbnRzIHdpbGwgYmUgcmVjcmVhdGVkLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0iCiAgICAgICAgICAgICAgICAuICRQYXJlbnRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAuICInKV0iCiAgICAgICAgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNUaXRsZSIsICAgICAgICAgICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVGl0bGUiLCAgICAgICAgICAnY3NzJyApLT5zZW5kX2tleXMoIiRBcHBvaW50bWVudE5hbWUtRWRpdCIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2cuTW9kYWwiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKCiAgICAgICAgIyBDbGVhbiB0aGUgY2FjaGUgYW5kIGdldCB0aGUgc2FtZSBwYXJlbnQgYXBwb2ludG1lbnQgd2l0aCBuZXcgY2hpbGRyZW4uCiAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCBUeXBlID0+ICdBcHBvaW50bWVudExpc3QnIC4gJENhbGVuZGFySUQgKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFpvb20uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIFdhaXQgdW50aWwgQXBwb2ludG1lbnQgdGFibGUgaXMgc2hvd24uCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNBcHBvaW50bWVudCB0Ym9keSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBWZXJpZnkgdGhlIHRhYmxlIGV4aXN0cyBvbiBBZ2VudFRpY2tldFpvb20uCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI0FwcG9pbnRtZW50IHRib2R5JykubGVuZ3RoIiksCiAgICAgICAgICAgICJUYWJsZSB3aXRoIGFwcG9pbnRtZW50cyBvbiBBZ2VudFRpY2tldFpvb20gLSBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBpZiB0aGVyZSBhcmUgbm8gcHJldmlvdXMgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBDaGlsZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNBcHBvaW50bWVudCB0Ym9keSBhW2hyZWYqPVwiQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9IgogICAgICAgICAgICAgICAgICAgICAgICAuICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlwiXScpLmxlbmd0aDsiCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgIkFmdGVyIGNoYW5nZSBwYXJlbnQgYXBwb2ludG1lbnQgLSBPbGQgY2hpbGQgYXBwb2ludG1lbnRJRCAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSAtIG5vdCBmb3VuZCIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIG5ldyBjaGlsZCBhcHBvaW50bWVudHMgYXJlIGxpbmtlZCB0byB0aGUgdGlja2V0LgogICAgICAgIEFQUE9JTlRNRU5UOgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVCBpZiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSA9PSAkUGFyZW50QXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjQXBwb2ludG1lbnQgdGJvZHkgYVtocmVmKj1cIkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAuICJcIl0nKS5sZW5ndGg7IgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICJBZnRlciBjaGFuZ2UgcGFyZW50IGFwcG9pbnRtZW50IC0gTmV3IGNoaWxkIGFwcG9pbnRtZW50ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9IC0gZm91bmQiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCB0aWNrZXQuCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldElEICRUaWNrZXRJRCAtIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIHBhcmVudCB3aXRoIGFsbCBjaGlsZCBhcHBvaW50bWVudHMuCiAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJlbnRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJQYXJlbnQgQXBwb2ludG1lbnRJRCAkUGFyZW50QXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSBhbmQgYWxsIGl0cyBjaGlsZHJlbiAtIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIHRlc3QgY2FsZW5kYXIuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBjYWxlbmRhciBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDYWxlbmRhcklEIF0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJDYWxlbmRhcklEICRDYWxlbmRhcklEIC0gZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgZ3JvdXAtdXNlciByZWxhdGlvbi4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGdyb3VwX3VzZXIgV0hFUkUgZ3JvdXBfaWQgPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkR3JvdXBJRCBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiR3JvdXAtdXNlciByZWxhdGlvbiBmb3IgZ3JvdXAgSUQgJEdyb3VwSUQgLSBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0ZXN0IGdyb3VwLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gZ3JvdXBzIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEdyb3VwSUQgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkdyb3VwSUQgJEdyb3VwSUQgLSBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIE1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgpOwoKICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgICAgICBteSAkR3JvdXBPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgICAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwogICAgICAgIG15ICRVc2VyT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIEdldCBjdXJyZW50IHN5c3RlbSB0aW1lLgogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwoKICAgICAgICAjIEFkZCAxIG1vbnRoLgogICAgICAgICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgIFRpbWUgICA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgTW9udGhzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgZGF0ZSBpbmZvIChTZWNvbmQsIE1pbnV0ZSwgSG91ciwgRGF5LCBNb250aCwgWWVhciwgRGF5T2ZXZWVrKS4KICAgICAgICBteSBARGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGFuZ2UgcmVzb2x1dGlvbiAoZGVza3RvcCBtb2RlKS4KICAgICAgICAkU2VsZW5pdW0tPnNldF93aW5kb3dfc2l6ZSggNzY4LCAxMDUwICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdXNlci4KICAgICAgICBteSAkTGFuZ3VhZ2UgICAgICA9ICdlbic7CiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzICAgPT4gWyAndXNlcnMnLCAkR3JvdXBOYW1lIF0sCiAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYW5ndWFnZSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBHZXQgVXNlcklELgogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgU3RhcnQgdGVzdC4KICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgYSBmZXcgdGVzdCBjYWxlbmRhcnMuCiAgICAgICAgbXkgJUNhbGVuZGFyMSA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiTXkgQ2FsZW5kYXIgJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBHbyB0byBjYWxlbmRhciBvdmVydmlldyBwYWdlLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CgogICAgICAgICMgV2FpdCBmb3IgQUpBWCB0byBmaW5pc2guCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgQ2xpY2sgb24gdGhlIG1vbnRoIHZpZXcuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtbW9udGgtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFdhaXQgZm9yIEFKQVggdG8gZmluaXNoLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JyApOwoKICAgICAgICAjIEdvIHRvIG5leHQgbW9udGguCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdG9vbGJhciAuZmMtbmV4dC1idXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgV2FpdCBmb3IgQUpBWCB0byBmaW5pc2guCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgR2V0IGRhdGUgaW5mbyAoU2Vjb25kLCBNaW51dGUsIEhvdXIsIERheSwgTW9udGgsIFllYXIsIERheU9mV2VlaykuCiAgICAgICAgbXkgJERhdGFEYXRlID0gIiREYXRlSW5mb1s1XS0iOwogICAgICAgIGlmICggJERhdGVJbmZvWzRdIDwgMTAgKSB7CiAgICAgICAgICAgICREYXRhRGF0ZSAuPSAiMCI7CiAgICAgICAgfQogICAgICAgICREYXRhRGF0ZSAuPSAiJERhdGVJbmZvWzRdLTAxIjsKCiAgICAgICAgIwogICAgICAgICMgUHJlLURlZmluZWQgVGVtcGxhdGVzCiAgICAgICAgIwoKICAgICAgICAjIERlZmluZSBhcHBvaW50bWVudCB0ZXN0IHdpdGggcHJlLWRlZmluZWQgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy4KICAgICAgICBteSBAVGVtcGxhdGVDcmVhdGVUZXN0cyA9ICgKCiAgICAgICAgICAgICMgTm8gYWN0aXZlIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZS4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ05vIG5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIE5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSBzdGFydCAoYXBwb2ludG1lbnQgc3RhcnQgdGltZSkuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdBcHBvaW50bWVudCBzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnU3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIE5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSA1IG1pbnV0ZXMgYmVmb3JlLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnNSBtaW51dGVzIGJlZm9yZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMzAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDMwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMzAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIE5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxNSBtaW51dGVzIGJlZm9yZS4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJzE1IG1pbnV0ZXMgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA5MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gOTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA5MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgTm90aWZpY2F0aW9uIHRlbXBsYXRlIDMwIG1pbnV0ZXMgYmVmb3JlLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMzAgbWludXRlcyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE4MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMTgwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTgwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBOb3RpZmljYXRpb24gdGVtcGxhdGUgMSBob3VyIGJlZm9yZS4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJzEgaG91ciBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDM2MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMzYwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMzYwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBOb3RpZmljYXRpb24gdGVtcGxhdGUgMiBob3VycyBiZWZvcmUuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcyIGhvdXJzIGJlZm9yZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNzIwMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiA3MjAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA3MjAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIE5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxMiBob3VycyBiZWZvcmUuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcxMiBob3VycyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDQzMjAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDQzMjAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA0MzIwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBOb3RpZmljYXRpb24gdGVtcGxhdGUgMSBkYXkgYmVmb3JlLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMSBkYXkgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA4NjQwMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiA4NjQwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gODY0MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgTm90aWZpY2F0aW9uIHRlbXBsYXRlIDIgZGF5cyBiZWZvcmUuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcyIGRheXMgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxNzI4MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMTcyODAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAxNzI4MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgTm90aWZpY2F0aW9uIHRlbXBsYXRlIDEgd2VlayBiZWZvcmUuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcxIHdlZWsgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA2MDQ4MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gNjA0ODAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA2MDQ4MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIE5vdGlmaWNhdGlvbiBwcmUtZGVmaW5lZCB0ZW1wbGF0ZSB0ZXN0IGV4ZWN1dGlvbi4KICAgICAgICBmb3IgbXkgJFRlc3QgKEBUZW1wbGF0ZUNyZWF0ZVRlc3RzKSB7CgogICAgICAgICAgICAjIENyZWF0ZSBhcHBvaW50bWVudAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICAgICAjIEVudGVyIHNvbWUgZGF0YS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoIiRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0iKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcjTm90aWZpY2F0aW9uVGVtcGxhdGUnKS52YWwoJyRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2xpY2sgb24gU2F2ZS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIFdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2guCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZXJlIGlzIGFuIGFwcG9pbnRtZW50LgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiQXBwb2ludG1lbnQgbGlzdCB2ZXJpZmljYXRpb24gLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gKSB7CgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0QXBwb2ludG1lbnQgICAgICAgPSAiJERhdGFEYXRlIDAwOjAwOjAwIjsKICAgICAgICAgICAgICAgIG15ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkRhdGUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0gLSAkVGVzdC0+e0RhdGF9LT57T2Zmc2V0fSApLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50TGlzdFswXS0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25EYXRlLAogICAgICAgICAgICAgICAgICAgICJWZXJpZnkgbm90aWZpY2F0aW9uIGRhdGUgLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFZlcmlmeSByZXN1bHRzLgogICAgICAgICAgICBmb3IgbXkgJFJlc3VsdEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1Jlc3VsdH0gfSApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50TGlzdFswXS0+eyRSZXN1bHRLZXl9IC8vICcnLAogICAgICAgICAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+eyRSZXN1bHRLZXl9LAogICAgICAgICAgICAgICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgcmVzdWx0OiAnIC4gJFJlc3VsdEtleSAuICcgLSAnIC4gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREZWxldGUgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRMaXN0WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIERlbGV0ZSBhcHBvaW50bWVudC4KICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkRGVsZXRlLAogICAgICAgICAgICAgICAgIkRlbGV0ZSBhcHBvaW50bWVudCB2ZXJpZmljYXRpb24gLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIwogICAgICAgICMgQ3VzdG9tIFJlbGF0aXZlIFRlbXBsYXRlcwogICAgICAgICMKCiAgICAgICAgIyBEZWZpbmUgYXBwb2ludG1lbnQgdGVzdCB3aXRoIGN1c3RvbSBub3RpZmljYXRpb24gdGVtcGxhdGVzLgogICAgICAgIG15IEBUZW1wbGF0ZUN1c3RvbVJlbGF0aXZlQ3JlYXRlVGVzdHMgPSAoCgogICAgICAgICAgICAjIEN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGJlZm9yZSBzdGFydC4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIHJlbGF0aXZlIDAgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBDdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIC0yIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0LgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVsYXRpdmUgLTIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IC0yLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQ3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0LgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVsYXRpdmUgMiBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIEN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGFmdGVyIHN0YXJ0LgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVsYXRpdmUgMCBtaW51dGVzIGFmdGVyIHN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIEN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGJlZm9yZSBlbmQuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWxhdGl2ZSAwIG1pbnV0ZXMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQ3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYWZ0ZXIgZW5kLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVsYXRpdmUgMCBtaW51dGVzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBOb3RpZmljYXRpb24gY3VzdG9tIHJlbGF0aXZlIHRlbXBsYXRlIHRlc3QgZXhlY3V0aW9uLgogICAgICAgIGZvciBteSAkVGVzdCAoQFRlbXBsYXRlQ3VzdG9tUmVsYXRpdmVDcmVhdGVUZXN0cykgewoKICAgICAgICAgICAgIyBDcmVhdGUgYXBwb2ludG1lbnQKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgIyBXYWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKCiAgICAgICAgICAgICMgRW50ZXIgc29tZSBkYXRhLgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygiJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSIpOwogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2VsZWN0IGN1c3RvbSB0ZW1wbGF0ZS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI05vdGlmaWNhdGlvblRlbXBsYXRlJykudmFsKCckVGVzdC0+e0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEFjdGl2YXRlIHRoZSByZWxhdGl2ZSBub3RpZmljYXRpb25zLgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0IiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgICAgICMgRmlsbCBvdXQgdGhlIGN1c3RvbSB1bml0IGNvdW50IGZpZWxkLgogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcjTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQnKS52YWwoJyRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0nKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEZpbGwgb3V0IHRoZSBjdXN0b20gdW5pdCBmaWVsZC4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCcpLnZhbCgnJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgRmlsbCBvdXQgdGhlIGN1c3RvbSB1bml0IHBvaW50IG9mIHRpbWUgZmllbGQuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJykudmFsKCckVGVzdC0+e0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2xpY2sgb24gU2F2ZS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIFdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2guCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZXJlIGlzIGFuIGFwcG9pbnRtZW50LgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiQXBwb2ludG1lbnQgbGlzdCB2ZXJpZmljYXRpb24gLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEdldCB0aGUgbmVlZGVkIG5vdGlmaWNhdGlvbiBwYXJhbXMKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRDb3VudCA9ICRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH07CgogICAgICAgICAgICAjIFRoZSBiYWNrZW5kIHRyZWF0cyBuZWdhdGl2ZSB2YWx1ZXMgYXMgMC4KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tVW5pdENvdW50IDwgMCApIHsKICAgICAgICAgICAgICAgICRDdXN0b21Vbml0Q291bnQgPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdCAgICAgID0gJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH07CiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0UG9pbnQgPSAkVGVzdC0+e0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX07CgogICAgICAgICAgICAjIFNldHVwIHRoZSBjb3VudCB0byBjb21wdXRlIGZvciB0aGUgb2Zmc2V0LgogICAgICAgICAgICBteSAlVW5pdE9mZnNldENvbXB1dGUgPSAoCiAgICAgICAgICAgICAgICBtaW51dGVzID0+IDYwLAogICAgICAgICAgICAgICAgaG91cnMgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgZGF5cyAgICA9PiA4NjQwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25Mb2NhbFRpbWU7CgogICAgICAgICAgICAjIENvbXB1dGUgZnJvbSBzdGFydCB0aW1lLgogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdhZnRlcnN0YXJ0JyApIHsKCiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uTG9jYWxUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRMaXN0WzBdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcHV0ZSBmcm9tIGVuZCB0aW1lLgogICAgICAgICAgICBlbHNpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJlbmQnICkgewoKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudExpc3RbMF0tPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcHV0ZSB0aGUgb2Zmc2V0IHRvIGJlIHVzZWQuCiAgICAgICAgICAgIG15ICRPZmZzZXQgPSAoICRDdXN0b21Vbml0Q291bnQgKiAkVW5pdE9mZnNldENvbXB1dGV7JEN1c3RvbVVuaXR9ICk7CgogICAgICAgICAgICAjIFNhdmUgdGhlIG5ld2x5IGNvbXB1dGVkIG5vdGlmaWNhdGlvbiBkYXRldGltZSBzdHJpbmcuCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25EYXRlID0gJyc7CgogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnICkgewogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkRhdGUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJE5vdGlmaWNhdGlvbkxvY2FsVGltZSAtICRPZmZzZXQgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0ZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkTm90aWZpY2F0aW9uTG9jYWxUaW1lICsgJE9mZnNldCApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50TGlzdFswXS0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkRhdGUsCiAgICAgICAgICAgICAgICAiVmVyaWZ5IG5vdGlmaWNhdGlvbiBkYXRlIC0gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSAuIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJERlbGV0ZSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudExpc3RbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgRGVsZXRlIGFwcG9pbnRtZW50LgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICREZWxldGUsCiAgICAgICAgICAgICAgICAiRGVsZXRlIGFwcG9pbnRtZW50IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjCiAgICAgICAgIyBDdXN0b20gRGF0ZVRpbWUgVGVtcGxhdGVzCiAgICAgICAgIwoKICAgICAgICAjIERlZmluZSBhcHBvaW50bWVudCB0ZXN0IHdpdGggY3VzdG9tIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMuCiAgICAgICAgbXkgQFRlbXBsYXRlQ3VzdG9tRGF0ZVRpbWVDcmVhdGVUZXN0cyA9ICgKCiAgICAgICAgICAgICMgQ3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyMDE2LTA5LTAxIDEwOjEwOjAwLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gZGF0ZXRpbWUgMjAxNi0wOS0wMSAxMDoxMDowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNb250aCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnOScsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVZZWFyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNicsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVIb3VyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTAnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzEwJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDEwOjEwOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMTA6MTA6MDAnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBDdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIwMTYtMTAtMTggMDA6MDM6MDAuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBkYXRldGltZSAyMDE2LTEwLTE4IDAxOjAzOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZURheSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxOCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNb250aCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTAnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lWWVhciAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lSG91ciAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzMnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMTAtMTggMDE6MDM6MDAnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0xMC0xOCAwMTowMzowMCcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIEN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMjAxNy0xMC0xOCAwMDowMzowMC4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIGRhdGV0aW1lIDIwMTctMTAtMTggMDM6MDM6MDAnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzE4JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZU1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxMCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVZZWFyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNycsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVIb3VyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNy0xMC0xOCAwMzowMzowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE3LTEwLTE4IDAzOjAzOjAwJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQ3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyMDE2LTEwLTE4IDAyOjAzOjAwLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gZGF0ZXRpbWUgMjAxNi0xMC0xOCAwMjowMzowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTgnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzEwJywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZVllYXIgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZUhvdXIgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyJywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZU1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgID0+ICczJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTEwLTE4IDAyOjAzOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMTAtMTggMDI6MDM6MDAnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgTm90aWZpY2F0aW9uIGRhdGV0aW1lIHRlbXBsYXRlIHRlc3QgZXhlY3V0aW9uLgogICAgICAgIGZvciBteSAkVGVzdCAoQFRlbXBsYXRlQ3VzdG9tRGF0ZVRpbWVDcmVhdGVUZXN0cykgewoKICAgICAgICAgICAgIyBDcmVhdGUgYXBwb2ludG1lbnQuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgV2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkuCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICAgICAjIEVudGVyIHNvbWUgZGF0YS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoIiRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0iKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNlbGVjdCBjdXN0b20gdGVtcGxhdGUuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyNOb3RpZmljYXRpb25UZW1wbGF0ZScpLnZhbCgnJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBBY3RpdmF0ZSB0aGUgcmVsYXRpdmUgbm90aWZpY2F0aW9ucy4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgU2VsZWN0IGRheS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5JykudmFsKCckVGVzdC0+e0RhdGF9LT57RGF0ZVRpbWVEYXl9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNlbGVjdCBtb250aC4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgnKS52YWwoJyRUZXN0LT57RGF0YX0tPntEYXRlVGltZU1vbnRofScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTZWxlY3QgeWVhci4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcicpLnZhbCgnJFRlc3QtPntEYXRhfS0+e0RhdGVUaW1lWWVhcn0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2VsZWN0IGhvdXIuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXInKS52YWwoJyRUZXN0LT57RGF0YX0tPntEYXRlVGltZUhvdXJ9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNlbGVjdCBtaW51dGUuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZScpLnZhbCgnJFRlc3QtPntEYXRhfS0+e0RhdGVUaW1lTWludXRlfScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBDbGljayBvbiBTYXZlLgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgV2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaC4KICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlcmUgaXMgYW4gYXBwb2ludG1lbnQuCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRMaXN0LAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJBcHBvaW50bWVudCBsaXN0IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVmVyaWZ5IHJlc3VsdHMuCiAgICAgICAgICAgIGZvciBteSAkUmVzdWx0S2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57UmVzdWx0fSB9ICkgewoKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRMaXN0WzBdLT57JFJlc3VsdEtleX0sCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LT57JFJlc3VsdEtleX0sCiAgICAgICAgICAgICAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCByZXN1bHQ6ICcgLiAkUmVzdWx0S2V5IC4gJyAtICcgLiAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBEZWxldGUgYXBwb2ludG1lbnQuCiAgICAgICAgICAgIG15ICREZWxldGUgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRMaXN0WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICREZWxldGUsCiAgICAgICAgICAgICAgICAiRGVsZXRlIGFwcG9pbnRtZW50IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfSwKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgICAgICBteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICAjIHR1cm4gb24gdXNlciB0aW1lIHpvbmVzCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVab25lVXNlcicsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBncm91cAogICAgICAgIG15ICRHcm91cE5hbWUgPSAidGVzdC1jYWxlbmRhci1ncm91cC0kUmFuZG9tSUQiOwogICAgICAgIG15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBjaGFuZ2UgcmVzb2x1dGlvbiAoZGVza3RvcCBtb2RlKQogICAgICAgICRTZWxlbml1bS0+c2V0X3dpbmRvd19zaXplKCA3NjgsIDEwNTAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB1c2VyCiAgICAgICAgbXkgJExhbmd1YWdlICAgICAgPSAnZW4nOwogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyAgID0+IFsgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgdXNlcic7CgogICAgICAgICMgZ2V0IFVzZXJJRAogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgc3RhcnQgdGVzdAogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIHRlc3QgY2FsZW5kYXIKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ28gdG8gY2FsZW5kYXIgb3ZlcnZpZXcgcGFnZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwoKICAgICAgICAjIGdvIHRvIHByZXZpb3VzIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10b29sYmFyIC5mYy1wcmV2LWJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgY2xpY2sgb24gdGhlIHRpbWVsaW5lIHZpZXcgZm9yIGFuIGFwcG9pbnRtZW50IGRpYWxvZwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lV2Vlay12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDpudGgtY2hpbGQoNSknLCAnY3NzJyApCiAgICAgICAgICAgIC0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdUaW1lIFpvbmUgQXBwb2ludG1lbnQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFye0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdFbmRIb3VyJywgJ25hbWUnICktPnNlbmRfa2V5cygnMTgnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgaXMgdmlzaWJsZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS50ZXh0KCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnVGltZSBab25lIEFwcG9pbnRtZW50JywKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IHZpc2libGUgKENhbGVuZGFyIE92ZXJ2aWV3KScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBhZ2VuZGEgb3ZlcnZpZXcgcGFnZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldztGaWx0ZXI9V2VlaztKdW1wPVByZXYiKTsKCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgaXMgdmlzaWJsZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJ1RpbWUgWm9uZSBBcHBvaW50bWVudCcgKSA+IC0xLAogICAgICAgICAgICAnQXBwb2ludG1lbnQgdmlzaWJsZSAoQWdlbmRhIE92ZXJ2aWV3KScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXBwb2ludG1lbnQgaWQKICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJy5NYXN0ZXJBY3Rpb25MaW5rJykuZGF0YSgnYXBwb2ludG1lbnRJZCcpOyIKICAgICAgICApOwoKICAgICAgICAjIGdldCBkaXNwbGF5ZWQgc3RhcnQgZGF0ZQogICAgICAgIG15ICRTdGFydERhdGUKICAgICAgICAgICAgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi8vKltcQGlkPSdBcHBvaW50bWVudElEXyRBcHBvaW50bWVudElEJ10vdGRbNF0iLCAneHBhdGgnICktPmdldF90ZXh0KCk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgdGltZQogICAgICAgICRTdGFydERhdGUgPX4gLyhcZHsyfTpcZHsyfTpcZHsyfSkkLzsKICAgICAgICBteSAkU3RhcnRUaW1lID0gJDE7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU3RhcnRUaW1lLAogICAgICAgICAgICAnMDg6MDA6MDAnLAogICAgICAgICAgICAnU3RhcnQgdGltZSBpbiBsb2NhbCB0aW1lJywKICAgICAgICApOwoKICAgICAgICAjIHR1cm4gb24gdXNlciB0aW1lIHpvbmVzCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVab25lVXNlcicsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB0dXJuIG9mZiBicm93c2VyIGF1dG8gb2Zmc2V0CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVab25lVXNlckJyb3dzZXJBdXRvT2Zmc2V0JywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNldCB1c2VyJ3MgdGltZSB6b25lCiAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJUaW1lWm9uZScsCiAgICAgICAgICAgIFZhbHVlICA9PiAnKzInLCAgICAgICAgICAgICAjIEV1cm9wZS9CZXJsaW4KICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3Qgc2V0IHByZWZlcmVuY2UgVXNlclRpbWVab25lJzsKCiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFByZWZlcmVuY2Vze1VzZXJUaW1lWm9uZX0sCiAgICAgICAgICAgICcrMicsCiAgICAgICAgICAgICdQcmVmZXJlbmNlIFVzZXJUaW1lWm9uZSBjb3JyZWN0JywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgZm9yIG15ICRDYWNoZSAocXcoQ2FsZW5kYXIgQXBwb2ludG1lbnQpKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KCiAgICAgICAgIyBsb2cgaW4gYWdhaW4KICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBhZ2VuZGEgb3ZlcnZpZXcgcGFnZSBhZ2FpbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldztGaWx0ZXI9V2VlaztKdW1wPVByZXYiKTsKCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyBnZXQgZGlzcGxheWVkIHN0YXJ0IGRhdGUKICAgICAgICBteSAkU3RhcnREYXRlVFoKICAgICAgICAgICAgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi8vKltcQGlkPSdBcHBvaW50bWVudElEXyRBcHBvaW50bWVudElEJ10vdGRbNF0iLCAneHBhdGgnICktPmdldF90ZXh0KCk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgdGltZSBhZ2FpbgogICAgICAgICRTdGFydERhdGVUWiA9fiAvKFxkezJ9OlxkezJ9OlxkezJ9XHNcKFwrMlwpKSQvOwogICAgICAgIG15ICRTdGFydFRpbWVUWiA9ICQxOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFN0YXJ0VGltZVRaLAogICAgICAgICAgICAnMTA6MDA6MDAgKCsyKScsCiAgICAgICAgICAgICJTdGFydCB0aW1lIGluIHVzZXIncyB0aW1lIHpvbmUiLAogICAgICAgICk7CgogICAgICAgICMgZ28gdG8gY2FsZW5kYXIgb3ZlcnZpZXcgcGFnZSBhZ2FpbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkLmFjdGl2ZSA9PSAwIiApOwoKICAgICAgICAjIGdvIHRvIHByZXZpb3VzIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10b29sYmFyIC5mYy1wcmV2LWJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgY2xpY2sgb24gYW4gYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10aW1lbGluZS1ldmVudCcsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcuRGlhbG9nJykubGVuZ3RoICYmIFwkKCcjU3RhcnRIb3VyJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgaG91cgogICAgICAgIG15ICRTdGFydEhvdXJUWiA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnU3RhcnRIb3VyJywgJ25hbWUnICktPmdldF92YWx1ZSgpOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFN0YXJ0SG91clRaLAogICAgICAgICAgICAxMCwKICAgICAgICAgICAgIlN0YXJ0IGhvdXIgaW4gdXNlcidzIHRpbWUgem9uZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGVhbnVwCgogICAgICAgICMgZGVsZXRlIHRlc3QgYXBwb2ludG1lbnQKICAgICAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBhcHBvaW50bWVudCAtICRBcHBvaW50bWVudElEIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNhbGVuZGFyCiAgICAgICAgaWYgKCAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2FsZW5kYXIgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJENhbGVuZGFye0NhbGVuZGFySUR9IF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiRGVsZXRlZCB0ZXN0IGNhbGVuZGFyIC0gJENhbGVuZGFye0NhbGVuZGFySUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICBmb3IgbXkgJENhY2hlIChxdyhDYWxlbmRhciBBcHBvaW50bWVudCkpIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJENhY2hlICk7CiAgICAgICAgfQogICAgfSwKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewogICAgICAgIG15ICRIZWxwZXIgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJExpbWl0ICAgID0gMTA7CgogICAgICAgICMgU2V0IENhbGVuZGFyTGltaXRPdmVydmlldy4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnQXBwb2ludG1lbnRDYWxlbmRhcjo6Q2FsZW5kYXJMaW1pdE92ZXJ2aWV3JywKICAgICAgICAgICAgVmFsdWUgPT4gJExpbWl0LAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIuCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgICAgICkgfHwgZGllICdEaWQgbm90IGdldCB0ZXN0IHVzZXInOwoKICAgICAgICBteSAkVXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY2FsZW5kYXJzLgogICAgICAgIG15IEBDYWxlbmRhcklEczsKICAgICAgICBteSAkTGFzdENhbGVuZGFySW5kZXggPSAxNTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMCAuLiAkTGFzdENhbGVuZGFySW5kZXggKSB7CiAgICAgICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyJENvdW50LSRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAiQ2FsZW5kYXJJRCAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gaXMgY3JlYXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQENhbGVuZGFySURzLCAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH07CgogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICB9CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgR28gdG8gY2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgVmVyaWZ5IHRoYXQgb25seSBmaXJzdCBjYWxlbmRhcnMgKGxpbWl0ZWQgYnkgQ2FsZW5kYXJMaW1pdE92ZXJ2aWV3IHNldHRpbmcpIGFyZSBjaGVja2VkLgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uICRMYXN0Q2FsZW5kYXJJbmRleCApIHsKICAgICAgICAgICAgbXkgJExlbmd0aCAgPSAoICRJbmRleCA8ICRMaW1pdCApID8gMSAgICAgICAgIDogMDsKICAgICAgICAgICAgbXkgJENoZWNrZWQgPSAkTGVuZ3RoICAgICAgICAgICAgID8gJ2NoZWNrZWQnIDogJ3VuY2hlY2tlZCc7CiAgICAgICAgICAgIG15ICRDYWxlbmRhcklEID0gJENhbGVuZGFySURzWyRJbmRleF07CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNDYWxlbmRhciRDYWxlbmRhcklEOmNoZWNrZWQnKS5sZW5ndGg7IiksCiAgICAgICAgICAgICAgICAkTGVuZ3RoLAogICAgICAgICAgICAgICAgIkJ5IGRlZmF1bHQgLSBDYWxlbmRhcklEICRDYWxlbmRhcklEIC0gJENoZWNrZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgQENoZWNrZWRJbmRpY2VzID0gKCAxLCAyLCA1LCA4LCAxMSwgMTIsIDE0ICk7CgogICAgICAgICMgVW5jaGVjayBhbGwgYW5kIHRoZW4gY2hlY2sgY2FsZW5kYXJzIGZyb20gdGhlIGFycmF5LgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjQ2FsZW5kYXJzIHRib2R5IGlucHV0W3R5cGU9Y2hlY2tib3hdJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsiKTsKCiAgICAgICAgZm9yIG15ICRJbmRleCAoQENoZWNrZWRJbmRpY2VzKSB7CiAgICAgICAgICAgIG15ICRDYWxlbmRhcklEID0gJENhbGVuZGFySURzWyRJbmRleF07CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NhbGVuZGFyJENhbGVuZGFySUQiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0NhbGVuZGFyJENhbGVuZGFySUQ6Y2hlY2tlZCcpLmxlbmd0aDsiICk7CiAgICAgICAgICAgIHNsZWVwIDE7CiAgICAgICAgfQoKICAgICAgICAjIEdvIGFnYWluIHRvIGNhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycgKTsKCiAgICAgICAgIyBWZXJpZnkgdGhhdCBvbmx5IGNhbGVuZGFycyBmcm9tIHRoZSBhcnJheSBhcmUgY2hlY2tlZCAoc2VlIGJ1ZyMxNDA1NCkuCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJExhc3RDYWxlbmRhckluZGV4ICkgewogICAgICAgICAgICBteSAkTGVuZ3RoID0gKCBncmVwIHsgJF8gPT0gJEluZGV4IH0gQENoZWNrZWRJbmRpY2VzICkgPyAxIDogMDsKICAgICAgICAgICAgbXkgJENoZWNrZWQgPSAkTGVuZ3RoID8gJ2NoZWNrZWQnIDogJ3VuY2hlY2tlZCc7CiAgICAgICAgICAgIG15ICRDYWxlbmRhcklEID0gJENhbGVuZGFySURzWyRJbmRleF07CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNDYWxlbmRhciRDYWxlbmRhcklEOmNoZWNrZWQnKS5sZW5ndGg7IiksCiAgICAgICAgICAgICAgICAkTGVuZ3RoLAogICAgICAgICAgICAgICAgIkFmdGVyIGNoYW5nZXMgLSBDYWxlbmRhciAkQ2FsZW5kYXJJRCAtICRDaGVja2VkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2xlYW51cC4KICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgICAgICBteSAkU3VjY2VzczsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBjYWxlbmRhcnMuCiAgICAgICAgZm9yIG15ICRDYWxlbmRhcklEIChAQ2FsZW5kYXJJRHMpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gY2FsZW5kYXIgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJENhbGVuZGFySUQgXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDYWxlbmRhcklEICRDYWxlbmRhcklEIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZWxldGUgZ3JvdXAtdXNlciByZWxhdGlvbnMuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBncm91cF91c2VyIFdIRVJFIGdyb3VwX2lkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEdyb3VwSUQgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkdyb3VwLXVzZXIgcmVsYXRpb24gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBncm91cC4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGdyb3VwcyBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsgXCRHcm91cElEIF0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJHcm91cElEICRHcm91cElEIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICAgICAjIE1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KENhbGVuZGFyIEdyb3VwKSkgewogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoIFR5cGUgPT4gJENhY2hlICk7CiAgICAgICAgfQogICAgfSwKKTsKCjE7Cg==
QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vTW96aWxsYS5vcmcvTk9OU0dNTCBNb3ppbGxhIENhbGVuZGFyIFYxLjEvL0VODQpWRVJTSU9OOjIuMA0KQkVHSU46VlRJTUVaT05FDQpUWklEOkV1cm9wZS9CZXJsaW4NCkJFR0lOOkRBWUxJR0hUDQpUWk9GRlNFVEZST006KzAxMDANClRaT0ZGU0VUVE86KzAyMDANClRaTkFNRTpDRVNUDQpEVFNUQVJUOjE5NzAwMzI5VDAyMDAwMA0KUlJVTEU6RlJFUT1ZRUFSTFk7QllEQVk9LTFTVTtCWU1PTlRIPTMNCkVORDpEQVlMSUdIVA0KQkVHSU46U1RBTkRBUkQNClRaT0ZGU0VURlJPTTorMDIwMA0KVFpPRkZTRVRUTzorMDEwMA0KVFpOQU1FOkNFVA0KRFRTVEFSVDoxOTcwMTAyNVQwMzAwMDANClJSVUxFOkZSRVE9WUVBUkxZO0JZREFZPS0xU1U7QllNT05USD0xMA0KRU5EOlNUQU5EQVJEDQpFTkQ6VlRJTUVaT05FDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTVUMDYwODExWg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNVQwNjA4MzBaDQpEVFNUQU1QOjIwMTYwNDE1VDA2MDgzMFoNClVJRDozMzM5NjA5Ni01Y2FmLWUyNGYtYWM1NC01MmZkMGJlMmJlOWUNClNVTU1BUlk6QWxsIGRheQ0KRFRTVEFSVDtWQUxVRT1EQVRFOjIwMTYwNDA1DQpEVEVORDtWQUxVRT1EQVRFOjIwMTYwNDA2DQpUUkFOU1A6VFJBTlNQQVJFTlQNCkRFU0NSSVBUSU9OOnRlc3QgYWxsIGRheSBldmVudA0KWC1PVFJTLVRFQU06VGVzdCBUZWFtDQpYLU9UUlMtUkVTT1VSQ0U6cm9vdEBsb2NhbGhvc3QNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxMlQwODA2MjhaDQpMQVNULU1PRElGSUVEOjIwMTYwNDEyVDA4MDc0NFoNCkRUU1RBTVA6MjAxNjA0MTJUMDgwNzQ0Wg0KVUlEOjAwNzJhMjE2LTIyOWUtMGM0MC1hODRmLTczOTNlMWJiNjg5Nw0KU1VNTUFSWTpPbmNlIHBlciB3ZWVrDQpSUlVMRTpGUkVRPVdFRUtMWTtVTlRJTD0yMDE2MDYwOVQwOTMwMDBaDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDQxMlQxMTMwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDQxMlQxMjAwMDANClRSQU5TUDpPUEFRVUUNCkxPQ0FUSU9OOkJlbGdyYWRlDQpERVNDUklQVElPTjpPbmx5IG9uY2UgcGVyIHdlZWsNClNFUVVFTkNFOjENClgtTU9aLUdFTkVSQVRJT046MQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNDEyVDA5MzcwNVoNCkxBU1QtTU9ESUZJRUQ6MjAxNjA0MTJUMDkzNzU5Wg0KRFRTVEFNUDoyMDE2MDQxMlQwOTM3NTlaDQpVSUQ6Mjg5ZTA4M2YtZDQwZi04NDQ3LWFlODUtNmVhMDhjMDhkYjhmDQpTVU1NQVJZOk1vbnRobHkgbWVldGluZw0KUlJVTEU6RlJFUT1NT05USExZO1VOVElMPTIwMTcwMzAyVDEyMTUwMFoNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDEzMTUwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDE0MDAwMA0KVFJBTlNQOk9QQVFVRQ0KTE9DQVRJT046R2VybWFueQ0KREVTQ1JJUFRJT046T25jZSBwZXIgbW9udGgNClNFUVVFTkNFOjENClgtTU9aLUdFTkVSQVRJT046MQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNDEyVDEzMDMwNFoNCkxBU1QtTU9ESUZJRUQ6MjAxNjA0MTJUMTMwMzU2Wg0KRFRTVEFNUDoyMDE2MDQxMlQxMzAzNTZaDQpVSUQ6ZmU2ODlhZGYtNjZmNi1lNDQ3LWE4MDctNzhlYTg5ZTc5ZGJhDQpTVU1NQVJZOkVuZCBvZiB0aGUgbW9udGgNClJSVUxFOkZSRVE9TU9OVEhMWTtVTlRJTD0yMDE3MDMxMlQwNzAwMDBaDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDMzMVQwODAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDMzMVQwOTAwMDANClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxM1QxMzA1MzBaDQpMQVNULU1PRElGSUVEOjIwMTYwNDEzVDEzMDkyNloNCkRUU1RBTVA6MjAxNjA0MTNUMTMwOTI2Wg0KVUlEOmNmZTU3ZDY4LTEyNjMtOTE0Ny1hMDRhLTY4MGNhOTJlMWYzNQ0KU1VNTUFSWTpFYWNoIDIgbW9udGhzDQpSUlVMRTpGUkVRPU1PTlRITFk7VU5USUw9MjAxNzAyMDJUMDkwMDAwWjtJTlRFUlZBTD0yO0JZTU9OVEhEQVk9MzENCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTMxVDEwMDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTMxVDExMDAwMA0KVFJBTlNQOk9QQVFVRQ0KTE9DQVRJT046VGVzdA0KREVTQ1JJUFRJT046dGVzdA0KU0VRVUVOQ0U6MQ0KWC1NT1otR0VORVJBVElPTjoxDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTJUMDcxNTA2Wg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNFQwNzE1MzRaDQpEVFNUQU1QOjIwMTYwNDE0VDA3MTUzNFoNClVJRDoxZmFjOGVkYi1jYjRkLTc4NGEtOGQzNC0xYTc0M2MxMDc0MWENClNVTU1BUlk6TXkgZXZlbnQNClJSVUxFOkZSRVE9REFJTFk7VU5USUw9MjAxNjA2MDFUMDcwMDAwWjtJTlRFUlZBTD0yDQpDQVRFR09SSUVTOkNsaWVudHMNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDA5MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDEwMDAwMA0KVFJBTlNQOk9QQVFVRQ0KTE9DQVRJT046U3RhcmEgUGF6b3ZhDQpERVNDUklQVElPTjpUZXN0IGRlc2NyaXB0aW9uDQpTRVFVRU5DRToxDQpYLU1PWi1HRU5FUkFUSU9OOjENCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxNFQwNzE2MTBaDQpMQVNULU1PRElGSUVEOjIwMTYwNDE0VDA3MTkyMloNCkRUU1RBTVA6MjAxNjA0MTRUMDcxOTIyWg0KVUlEOjM3MDhlNzRmLWI5MDEtYzY0My1hOWQwLWExNzgzOGFmZDQ4OQ0KU1VNTUFSWTpFYWNoIDIgeWVhcnMNClJSVUxFOkZSRVE9WUVBUkxZO1VOVElMPTIwMjAwNjAyVDA4MDAwMFo7SU5URVJWQUw9MjtCWU1PTlRIREFZPTE7QllNT05USD00DQoNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDAxVDEwMDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDAxVDExMDAwMA0KVFJBTlNQOk9QQVFVRQ0KU0VRVUVOQ0U6MQ0KWC1NT1otR0VORVJBVElPTjoxDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTVUMDYzMjIwWg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNVQwNjMzMDhaDQpEVFNUQU1QOjIwMTYwNDE1VDA2MzMwOFoNClVJRDo0OGY0ZjA5NC02Y2IzLWM5NDEtYjI2YS00MzRkNTIxMTU0N2YNClNVTU1BUlk6RWFjaCAzdGhkIGFsbCBkYXkNClJSVUxFOkZSRVE9REFJTFk7VU5USUw9MjAxNjA0MzA7SU5URVJWQUw9Mw0KRFRTVEFSVDtWQUxVRT1EQVRFOjIwMTYwNDAyDQpEVEVORDtWQUxVRT1EQVRFOjIwMTYwNDAzDQpUUkFOU1A6VFJBTlNQQVJFTlQNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxNVQxMzM5MDdaDQpMQVNULU1PRElGSUVEOjIwMTYwNDE1VDEzMzk1OVoNCkRUU1RBTVA6MjAxNjA0MTVUMTMzOTU5Wg0KVUlEOjFlN2IxZTY4LWIxMjgtNDE0Mi1iNDRhLTllZGY5ODcyZmJmOA0KU1VNTUFSWTpGaXJzdCAzIGRheXMNClJSVUxFOkZSRVE9REFJTFk7Q09VTlQ9Mw0KRFRTVEFSVDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAzMDdUMTYwMDAwDQpEVEVORDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAzMDdUMTcwMDAwDQpUUkFOU1A6T1BBUVVFDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTVUMTUxNTMzWg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNVQxNTE2MjJaDQpEVFNUQU1QOjIwMTYwNDE1VDE1MTYyMloNClVJRDo3YTc5NzRlMy1hYzEyLTFhNDEtYTM4My05YmE5MTFlY2Y1MTUNClNVTU1BUlk6T25jZSBwZXIgbmV4dCAyIG1vbnRoDQpSUlVMRTpGUkVRPU1PTlRITFk7Q09VTlQ9MjtCWU1PTlRIREFZPTINCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMzAyVDE4MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMzAyVDE5MDAwMA0KVFJBTlNQOk9QQVFVRQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNDE1VDE1MTcxMFoNCkxBU1QtTU9ESUZJRUQ6MjAxNjA0MTVUMTUxODA5Wg0KRFRTVEFNUDoyMDE2MDQxNVQxNTE4MDlaDQpVSUQ6OTE1ZmQ2YmItNjhkYS02NjQ4LTkyZmMtZDBiZDRlMmE0NDk2DQpTVU1NQVJZOkphbnVhcnkgM3RoIG5leHQgMyB5ZWFycw0KUlJVTEU6RlJFUT1ZRUFSTFk7Q09VTlQ9MztCWU1PTlRIREFZPTM7QllNT05USD0xDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwM1QxODAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwM1QxOTAwMDANClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQyOFQxNDAwMzVaDQpMQVNULU1PRElGSUVEOjIwMTYwNTA0VDE0MzgzMloNCkRUU1RBTVA6MjAxNjA1MDRUMTQzODMyWg0KVUlEOkIwQzdBQzMyLUU5NjMtNDRCNy04QjdFLTc4MjM4MjE2QTcyNg0KUkRBVEU7VkFMVUU9REFURS1USU1FOjIwMTYwNTAyVDE0MDAwMFoNCkVYREFURToyMDE2MDUwMlQxNDAwMDBaDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDUwMlQxNjAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDUwMlQxNjAwMDANClgtTU9aLUZBS0VELU1BU1RFUjoxDQpTRVFVRU5DRToxDQpYLU1PWi1HRU5FUkFUSU9OOjENCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxMlQxMzM5NDRaDQpMQVNULU1PRElGSUVEOjIwMTYwNTA5VDE0MjQyOFoNCkRUU1RBTVA6MjAxNjA1MDlUMTQyNDI4Wg0KVUlEOmU1ZDA1YzNmLWUwODAtYTY0Zi1iZWQ4LTVjOTZhYjkyNDhkNA0KU1VNTUFSWTpFYWNoIDJuZCB3ZWVrDQpSUlVMRTpGUkVRPVdFRUtMWTtJTlRFUlZBTD0yO0JZREFZPVRVDQpYLU1PWi1MQVNUQUNLOjIwMTYwNTA5VDE0MjQyOFoNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDE2MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDE3MDAwMA0KVFJBTlNQOk9QQVFVRQ0KREVTQ1JJUFRJT046RGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheQ0KWC1NT1otR0VORVJBVElPTjo4DQpCRUdJTjpWQUxBUk0NCkFDVElPTjpESVNQTEFZDQpUUklHR0VSO1ZBTFVFPURVUkFUSU9OOi1QMUQNCkRFU0NSSVBUSU9OOkRlZmF1bHQgTW96aWxsYSBEZXNjcmlwdGlvbg0KRU5EOlZBTEFSTQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNTExVDA2Mjk0NloNCkxBU1QtTU9ESUZJRUQ6MjAxNjA1MTFUMDYzMTMyWg0KRFRTVEFNUDoyMDE2MDUxMVQwNjMxMzJaDQpVSUQ6Y2I0YjUzMTQtYzg4Mi03MzQ1LWE0N2QtMDA2YzEwNmRjMmZmDQpTVU1NQVJZOkN1c3RvbSAxDQpSUlVMRTpGUkVRPVdFRUtMWTtVTlRJTD0yMDE2MDQwMVQwNzAwMDBaO0lOVEVSVkFMPTI7QllEQVk9V0UsU1UNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTExVDA5MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTExVDEwMDAwMA0KVFJBTlNQOk9QQVFVRQ0KREVTQ1JJUFRJT046U3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuDQpTRVFVRU5DRToxDQpYLU1PWi1HRU5FUkFUSU9OOjENCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDUxMVQwNjMxNTNaDQpMQVNULU1PRElGSUVEOjIwMTYwNTExVDA2MzM1NFoNCkRUU1RBTVA6MjAxNjA1MTFUMDYzMzU0Wg0KVUlEOjM1MTg0OWQ2LTRjMTUtNTM0ZS1iOTYxLTBiZjNmN2NhZWIxOA0KU1VNTUFSWTpDdXN0b20gMg0KUlJVTEU6RlJFUT1NT05USExZO1VOVElMPTIwMTcwMTAxVDA4MDAwMFo7QllNT05USERBWT0xNiwzMQ0KRFRTVEFSVDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAxMTJUMDkwMDAwDQpEVEVORDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAxMTJUMTAwMDAwDQpUUkFOU1A6T1BBUVVFDQpERVNDUklQVElPTjpTdGFydCBvbiBqYW4gMTJcLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLg0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNTI1VDEwMDIyMFoNClVJRDo1REEwMjhEMS0yRTU4LTQ5MTUtODc4Qi03MTI0NEFGMjIzNDUNClJSVUxFOkZSRVE9WUVBUkxZO0lOVEVSVkFMPTI7QllNT05USD0xLDIsMTINCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEzMVQxMDAwMDANClRSQU5TUDpPUEFRVUUNClNVTU1BUlk6Q3VzdG9tIDMNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTMxVDA5MDAwMA0KRFRTVEFNUDoyMDE2MDUyNVQxMDEwMzBaDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA1MjVUMTM1MTE5Wg0KTEFTVC1NT0RJRklFRDoyMDE2MDUyNVQxMzU0MDFaDQpEVFNUQU1QOjIwMTYwNTI1VDEzNTQwMVoNClVJRDoxZjlmOGQ3NS01NmJlLWRhNDAtOWUxMC1mYjVmNmM5OWI2YmENClNVTU1BUlk6Q3VzdG9tIDQNClJSVUxFOkZSRVE9WUVBUkxZO0JZTU9OVEhEQVk9NDtCWU1PTlRIPTINCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTA0VDE2MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTA0VDE3MDAwMA0KVFJBTlNQOk9QQVFVRQ0KWC1NT1otR0VORVJBVElPTjoxDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA1MjVUMTM1MTE5Wg0KTEFTVC1NT0RJRklFRDoyMDE2MDUyNVQxMzU0MDFaDQpEVFNUQU1QOjIwMTYwNTI1VDEzNTQwMVoNClVJRDoxZjlmOGQ3NS01NmJlLWRhNDAtOWUxMC1mYjVmNmM5OWI2YmINClNVTU1BUlk6WWVhcmx5DQpSUlVMRTpGUkVRPVlFQVJMWTtCWU1PTlRIREFZPTQ7QllNT05USD0xDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwNFQxNjAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwNFQxNzAwMDANClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkVORDpWQ0FMRU5EQVINCg==
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEgU3R5bGVzaGVldAogKiBEb2NzICYgTGljZW5zZTogaHR0cDovL2Z1bGxjYWxlbmRhci5pby8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLwoKCi5mYyB7CglkaXJlY3Rpb246IGx0cjsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KCi5mYy1ydGwgewoJdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCmJvZHkgLmZjIHsgLyogZXh0cmEgcHJlY2VkZW5jZSB0byBvdmVyY29tZSBqcXVpICovCglmb250LXNpemU6IDFlbTsKfQoKCi8qIENvbG9ycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdW50aGVtZWQgdGgsCi5mYy11bnRoZW1lZCB0ZCwKLmZjLXVudGhlbWVkIHRoZWFkLAouZmMtdW50aGVtZWQgdGJvZHksCi5mYy11bnRoZW1lZCAuZmMtZGl2aWRlciwKLmZjLXVudGhlbWVkIC5mYy1yb3csCi5mYy11bnRoZW1lZCAuZmMtY29udGVudCwgLyogZm9yIGd1dHRlciBib3JkZXIgKi8KLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyLAouZmMtdW50aGVtZWQgLmZjLWxpc3QtdmlldywKLmZjLXVudGhlbWVkIC5mYy1saXN0LWhlYWRpbmcgdGQgewoJYm9yZGVyLWNvbG9yOiAjZGRkOwp9CgouZmMtdW50aGVtZWQgLmZjLXBvcG92ZXIgewoJYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKfQoKLmZjLXVudGhlbWVkIC5mYy1kaXZpZGVyLAouZmMtdW50aGVtZWQgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciwKLmZjLXVudGhlbWVkIC5mYy1saXN0LWhlYWRpbmcgdGQgewoJYmFja2dyb3VuZDogI2VlZTsKfQoKLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLWNsb3NlIHsKCWNvbG9yOiAjNjY2Owp9CgouZmMtdW50aGVtZWQgLmZjLXRvZGF5IHsKCWJhY2tncm91bmQ6ICNmY2Y4ZTM7Cn0KCi5mYy1oaWdobGlnaHQgeyAvKiB3aGVuIHVzZXIgaXMgc2VsZWN0aW5nIGNlbGxzICovCgliYWNrZ3JvdW5kOiAjYmNlOGYxOwoJb3BhY2l0eTogLjM7Cn0KCi5mYy1iZ2V2ZW50IHsgLyogZGVmYXVsdCBsb29rIGZvciBiYWNrZ3JvdW5kIGV2ZW50cyAqLwoJYmFja2dyb3VuZDogcmdiKDE0MywgMjIzLCAxMzApOwoJb3BhY2l0eTogLjM7Cn0KCi5mYy1ub25idXNpbmVzcyB7IC8qIGRlZmF1bHQgbG9vayBmb3Igbm9uLWJ1c2luZXNzLWhvdXJzIGFyZWFzICovCgkvKiB3aWxsIGluaGVyaXQgLmZjLWJnZXZlbnQncyBzdHlsZXMgKi8KCWJhY2tncm91bmQ6ICNkN2Q3ZDc7Cn0KCgovKiBJY29ucyAoaW5saW5lIGVsZW1lbnRzIHdpdGggc3R5bGVkIHRleHQgdGhhdCBtb2NrIGFycm93IGljb25zKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtaWNvbiB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgloZWlnaHQ6IDFlbTsKCWxpbmUtaGVpZ2h0OiAxZW07Cglmb250LXNpemU6IDFlbTsKCXRleHQtYWxpZ246IGNlbnRlcjsKCW92ZXJmbG93OiBoaWRkZW47Cglmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlOwoKCS8qIGRvbid0IGFsbG93IGJyb3dzZXIgdGV4dC1zZWxlY3Rpb24gKi8KCS13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKCS13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cgkta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CgktbW96LXVzZXItc2VsZWN0OiBub25lOwoJLW1zLXVzZXItc2VsZWN0OiBub25lOwoJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgovKgpBY2NlcHRhYmxlIGZvbnQtZmFtaWx5IG92ZXJyaWRlcyBmb3IgaW5kaXZpZHVhbCBpY29uczoKCSJBcmlhbCIsIHNhbnMtc2VyaWYKCSJUaW1lcyBOZXcgUm9tYW4iLCBzZXJpZgoKTk9URTogdXNlIHBlcmNlbnRhZ2UgZm9udCBzaXplcyBvciBlbHNlIG9sZCBJRSBjaG9rZXMKKi8KCi5mYy1pY29uOmFmdGVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmZjLWljb24tbGVmdC1zaW5nbGUtYXJyb3c6YWZ0ZXIgewoJY29udGVudDogIlwwMjAzOSI7Cglmb250LXdlaWdodDogYm9sZDsKCWZvbnQtc2l6ZTogMjAwJTsKCXRvcDogLTclOwp9CgouZmMtaWNvbi1yaWdodC1zaW5nbGUtYXJyb3c6YWZ0ZXIgewoJY29udGVudDogIlwwMjAzQSI7Cglmb250LXdlaWdodDogYm9sZDsKCWZvbnQtc2l6ZTogMjAwJTsKCXRvcDogLTclOwp9CgouZmMtaWNvbi1sZWZ0LWRvdWJsZS1hcnJvdzphZnRlciB7Cgljb250ZW50OiAiXDAwMEFCIjsKCWZvbnQtc2l6ZTogMTYwJTsKCXRvcDogLTclOwp9CgouZmMtaWNvbi1yaWdodC1kb3VibGUtYXJyb3c6YWZ0ZXIgewoJY29udGVudDogIlwwMDBCQiI7Cglmb250LXNpemU6IDE2MCU7Cgl0b3A6IC03JTsKfQoKLmZjLWljb24tbGVmdC10cmlhbmdsZTphZnRlciB7Cgljb250ZW50OiAiXDI1QzQiOwoJZm9udC1zaXplOiAxMjUlOwoJdG9wOiAzJTsKfQoKLmZjLWljb24tcmlnaHQtdHJpYW5nbGU6YWZ0ZXIgewoJY29udGVudDogIlwyNUJBIjsKCWZvbnQtc2l6ZTogMTI1JTsKCXRvcDogMyU7Cn0KCi5mYy1pY29uLWRvd24tdHJpYW5nbGU6YWZ0ZXIgewoJY29udGVudDogIlwyNUJDIjsKCWZvbnQtc2l6ZTogMTI1JTsKCXRvcDogMiU7Cn0KCi5mYy1pY29uLXg6YWZ0ZXIgewoJY29udGVudDogIlwwMDBENyI7Cglmb250LXNpemU6IDIwMCU7Cgl0b3A6IDYlOwp9CgoKLyogQnV0dG9ucyAoc3R5bGVkIDxidXR0b24+IHRhZ3MsIG5vcm1hbGl6ZWQgdG8gd29yayBjcm9zcy1icm93c2VyKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMgYnV0dG9uIHsKCS8qIGZvcmNlIGhlaWdodCB0byBpbmNsdWRlIHRoZSBib3JkZXIgYW5kIHBhZGRpbmcgKi8KCS1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKCS13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CgoJLyogZGltZW5zaW9ucyAqLwoJbWFyZ2luOiAwOwoJaGVpZ2h0OiAyLjFlbTsKCXBhZGRpbmc6IDAgLjZlbTsKCgkvKiB0ZXh0ICYgY3Vyc29yICovCglmb250LXNpemU6IDFlbTsgLyogbm9ybWFsaXplICovCgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJY3Vyc29yOiBwb2ludGVyOwp9CgovKiBGaXJlZm94IGhhcyBhbiBhbm5veWluZyBpbm5lciBib3JkZXIgKi8KLmZjIGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgfQoJCi5mYy1zdGF0ZS1kZWZhdWx0IHsgLyogbm9uLXRoZW1lICovCglib3JkZXI6IDFweCBzb2xpZDsKfQoKLmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLWxlZnQgeyAvKiBub24tdGhlbWUgKi8KCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKfQoKLmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLXJpZ2h0IHsgLyogbm9uLXRoZW1lICovCglib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OwoJYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDsKfQoKLyogaWNvbnMgaW4gYnV0dG9ucyAqLwoKLmZjIGJ1dHRvbiAuZmMtaWNvbiB7IC8qIG5vbi10aGVtZSAqLwoJcG9zaXRpb246IHJlbGF0aXZlOwoJdG9wOiAtMC4wNWVtOyAvKiBzZWVtcyB0byBiZSBhIGdvb2QgYWRqdXN0bWVudCBhY3Jvc3MgYnJvd3NlcnMgKi8KCW1hcmdpbjogMCAuMmVtOwoJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoJCi8qCiAgYnV0dG9uIHN0YXRlcwogIGJvcnJvd2VkIGZyb20gdHdpdHRlciBib290c3RyYXAgKGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwLykKKi8KCi5mYy1zdGF0ZS1kZWZhdWx0IHsKCWJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7CgliYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYsICNlNmU2ZTYpOwoJYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAgMCwgMCAxMDAlLCBmcm9tKCNmZmZmZmYpLCB0bygjZTZlNmU2KSk7CgliYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYsICNlNmU2ZTYpOwoJYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmZmZmZiwgI2U2ZTZlNik7CgliYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZmZmZmZmLCAjZTZlNmU2KTsKCWJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKCWJvcmRlci1jb2xvcjogI2U2ZTZlNiAjZTZlNmU2ICNiZmJmYmY7Cglib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKSByZ2JhKDAsIDAsIDAsIDAuMSkgcmdiYSgwLCAwLCAwLCAwLjI1KTsKCWNvbG9yOiAjMzMzOwoJdGV4dC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOwoJYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDUpOwp9CgouZmMtc3RhdGUtaG92ZXIsCi5mYy1zdGF0ZS1kb3duLAouZmMtc3RhdGUtYWN0aXZlLAouZmMtc3RhdGUtZGlzYWJsZWQgewoJY29sb3I6ICMzMzMzMzM7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZTZlNmU2Owp9CgouZmMtc3RhdGUtaG92ZXIgewoJY29sb3I6ICMzMzMzMzM7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNXB4OwoJLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwoJICAgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwoJICAgICAtby10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwoJICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwp9CgouZmMtc3RhdGUtZG93biwKLmZjLXN0YXRlLWFjdGl2ZSB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwoJYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKCWJveC1zaGFkb3c6IGluc2V0IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTUpLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KTsKfQoKLmZjLXN0YXRlLWRpc2FibGVkIHsKCWN1cnNvcjogZGVmYXVsdDsKCWJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CglvcGFjaXR5OiAwLjY1OwoJYm94LXNoYWRvdzogbm9uZTsKfQoKCi8qIEJ1dHRvbnMgR3JvdXBzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1idXR0b24tZ3JvdXAgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgovKgpldmVyeSBidXR0b24gdGhhdCBpcyBub3QgZmlyc3QgaW4gYSBidXR0b24gZ3JvdXAgc2hvdWxkIHNjb290Y2ggb3ZlciBvbmUgcGl4ZWwgYW5kIGNvdmVyIHRoZQpwcmV2aW91cyBidXR0b24ncyBib3JkZXIuLi4KKi8KCi5mYyAuZmMtYnV0dG9uLWdyb3VwID4gKiB7IC8qIGV4dHJhIHByZWNlZGVuY2UgYi9jIGJ1dHRvbnMgaGF2ZSBtYXJnaW4gc2V0IHRvIHplcm8gKi8KCWZsb2F0OiBsZWZ0OwoJbWFyZ2luOiAwIDAgMCAtMXB4Owp9CgouZmMgLmZjLWJ1dHRvbi1ncm91cCA+IDpmaXJzdC1jaGlsZCB7IC8qIHNhbWUgKi8KCW1hcmdpbi1sZWZ0OiAwOwp9CgoKLyogUG9wb3ZlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtcG9wb3ZlciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3gtc2hhZG93OiAwIDJweCA2cHggcmdiYSgwLDAsMCwuMTUpOwp9CgouZmMtcG9wb3ZlciAuZmMtaGVhZGVyIHsgLyogVE9ETzogYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggZmMtaGVhZC9mYy1ib2R5ICovCglwYWRkaW5nOiAycHggNHB4Owp9CgouZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy10aXRsZSB7CgltYXJnaW46IDAgMnB4Owp9CgouZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZSB7CgljdXJzb3I6IHBvaW50ZXI7Cn0KCi5mYy1sdHIgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtdGl0bGUsCi5mYy1ydGwgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtY2xvc2UgewoJZmxvYXQ6IGxlZnQ7Cn0KCi5mYy1ydGwgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtdGl0bGUsCi5mYy1sdHIgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtY2xvc2UgewoJZmxvYXQ6IHJpZ2h0Owp9CgovKiB1bnRoZW1lZCAqLwoKLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIHsKCWJvcmRlci13aWR0aDogMXB4OwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKfQoKLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLWNsb3NlIHsKCWZvbnQtc2l6ZTogLjllbTsKCW1hcmdpbi10b3A6IDJweDsKfQoKLyoganF1aSB0aGVtZWQgKi8KCi5mYy1wb3BvdmVyID4gLnVpLXdpZGdldC1oZWFkZXIgKyAudWktd2lkZ2V0LWNvbnRlbnQgewoJYm9yZGVyLXRvcDogMDsgLyogd2hlcmUgdGhleSBtZWV0LCBsZXQgdGhlIGhlYWRlciBoYXZlIHRoZSBib3JkZXIgKi8KfQoKCi8qIE1pc2MgUmV1c2FibGUgQ29tcG9uZW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtZGl2aWRlciB7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHg7Cn0KCmhyLmZjLWRpdmlkZXIgewoJaGVpZ2h0OiAwOwoJbWFyZ2luOiAwOwoJcGFkZGluZzogMCAwIDJweDsgLyogaGVpZ2h0IGlzIHVucmVsaWFibGUgYWNyb3NzIGJyb3dzZXJzLCBzbyB1c2UgcGFkZGluZyAqLwoJYm9yZGVyLXdpZHRoOiAxcHggMDsKfQoKLmZjLWNsZWFyIHsKCWNsZWFyOiBib3RoOwp9CgouZmMtYmcsCi5mYy1iZ2V2ZW50LXNrZWxldG9uLAouZmMtaGlnaGxpZ2h0LXNrZWxldG9uLAouZmMtaGVscGVyLXNrZWxldG9uIHsKCS8qIHRoZXNlIGVsZW1lbnQgc2hvdWxkIGFsd2F5cyBjbGluZyB0byB0b3AtbGVmdC9yaWdodCBjb3JuZXJzICovCglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi5mYy1iZyB7Cglib3R0b206IDA7IC8qIHN0cmVjaCBiZyB0byBib3R0b20gZWRnZSAqLwp9CgouZmMtYmcgdGFibGUgewoJaGVpZ2h0OiAxMDAlOyAvKiBzdHJlY2ggYmcgdG8gYm90dG9tIGVkZ2UgKi8KfQoKCi8qIFRhYmxlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMgdGFibGUgewoJd2lkdGg6IDEwMCU7Cglib3gtc2l6aW5nOiBib3JkZXItYm94OyAvKiBmaXggc2Nyb2xsYmFyIGlzc3VlIGluIGZpcmVmb3ggKi8KCXRhYmxlLWxheW91dDogZml4ZWQ7Cglib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJYm9yZGVyLXNwYWNpbmc6IDA7Cglmb250LXNpemU6IDFlbTsgLyogbm9ybWFsaXplIGNyb3NzLWJyb3dzZXIgKi8KfQoKLmZjIHRoIHsKCXRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmZjIHRoLAouZmMgdGQgewoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMXB4OwoJcGFkZGluZzogMDsKCXZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KCi5mYyB0ZC5mYy10b2RheSB7Cglib3JkZXItc3R5bGU6IGRvdWJsZTsgLyogb3ZlcmNvbWUgbmVpZ2hib3JpbmcgYm9yZGVycyAqLwp9CgoKLyogSW50ZXJuYWwgTmF2IExpbmtzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCmFbZGF0YS1nb3RvXSB7CgljdXJzb3I6IHBvaW50ZXI7Cn0KCmFbZGF0YS1nb3RvXTpob3ZlciB7Cgl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKCi8qIEZha2UgVGFibGUgUm93cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMgLmZjLXJvdyB7IC8qIGV4dHJhIHByZWNlZGVuY2UgdG8gb3ZlcmNvbWUgdGhlbWVzIHcvIC51aS13aWRnZXQtY29udGVudCBmb3JjaW5nIGEgMXB4IGJvcmRlciAqLwoJLyogbm8gdmlzaWJsZSBib3JkZXIgYnkgZGVmYXVsdC4gYnV0IG1ha2UgYXZhaWxhYmxlIGlmIG5lZWQgYmUgKHNjcm9sbGJhciB3aWR0aCBjb21wZW5zYXRpb24pICovCglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAwOwp9CgouZmMtcm93IHRhYmxlIHsKCS8qIGRvbid0IHB1dCBsZWZ0L3JpZ2h0IGJvcmRlciBvbiBhbnl0aGluZyB3aXRoaW4gYSBmYWtlIHJvdy4KCSAgIHRoZSBvdXRlciB0Ym9keSB3aWxsIHdvcnJ5IGFib3V0IHRoaXMgKi8KCWJvcmRlci1sZWZ0OiAwIGhpZGRlbiB0cmFuc3BhcmVudDsKCWJvcmRlci1yaWdodDogMCBoaWRkZW4gdHJhbnNwYXJlbnQ7CgoJLyogbm8gYm90dG9tIGJvcmRlcnMgb24gcm93cyAqLwoJYm9yZGVyLWJvdHRvbTogMCBoaWRkZW4gdHJhbnNwYXJlbnQ7IAp9CgouZmMtcm93OmZpcnN0LWNoaWxkIHRhYmxlIHsKCWJvcmRlci10b3A6IDAgaGlkZGVuIHRyYW5zcGFyZW50OyAvKiBubyB0b3AgYm9yZGVyIG9uIGZpcnN0IHJvdyAqLwp9CgoKLyogRGF5IFJvdyAodXNlZCB3aXRoaW4gdGhlIGhlYWRlciBhbmQgdGhlIERheUdyaWQpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1yb3cgewoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZmMtcm93IC5mYy1iZyB7Cgl6LWluZGV4OiAxOwp9CgovKiBoaWdobGlnaHRpbmcgY2VsbHMgJiBiYWNrZ3JvdW5kIGV2ZW50IHNrZWxldG9uICovCgouZmMtcm93IC5mYy1iZ2V2ZW50LXNrZWxldG9uLAouZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b24gewoJYm90dG9tOiAwOyAvKiBzdHJldGNoIHNrZWxldG9uIHRvIGJvdHRvbSBvZiByb3cgKi8KfQoKLmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiB0YWJsZSwKLmZjLXJvdyAuZmMtaGlnaGxpZ2h0LXNrZWxldG9uIHRhYmxlIHsKCWhlaWdodDogMTAwJTsgLyogc3RyZXRjaCBza2VsZXRvbiB0byBib3R0b20gb2Ygcm93ICovCn0KCi5mYy1yb3cgLmZjLWhpZ2hsaWdodC1za2VsZXRvbiB0ZCwKLmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiB0ZCB7Cglib3JkZXItY29sb3I6IHRyYW5zcGFyZW50Owp9CgouZmMtcm93IC5mYy1iZ2V2ZW50LXNrZWxldG9uIHsKCXotaW5kZXg6IDI7Cgp9CgouZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b24gewoJei1pbmRleDogMzsKfQoKLyoKcm93IGNvbnRlbnQgKHdoaWNoIGNvbnRhaW5zIGRheS93ZWVrIG51bWJlcnMgYW5kIGV2ZW50cykgYXMgd2VsbCBhcyAiaGVscGVyIiAod2hpY2ggY29udGFpbnMKdGVtcG9yYXJ5IHJlbmRlcmVkIGV2ZW50cykuCiovCgouZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDQ7CglwYWRkaW5nLWJvdHRvbTogMnB4OyAvKiBtYXRjaGVzIHRoZSBzcGFjZSBhYm92ZSB0aGUgZXZlbnRzICovCn0KCi5mYy1yb3cgLmZjLWhlbHBlci1za2VsZXRvbiB7Cgl6LWluZGV4OiA1Owp9CgouZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHRkLAouZmMtcm93IC5mYy1oZWxwZXItc2tlbGV0b24gdGQgewoJLyogc2VlLXRocm91Z2ggdG8gdGhlIGJhY2tncm91bmQgYmVsb3cgKi8KCWJhY2tncm91bmQ6IG5vbmU7IC8qIGluIGNhc2UgPHRkPnMgYXJlIGdsb2JhbGx5IHN0eWxlZCAqLwoJYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKCgkvKiBkb24ndCBwdXQgYSBib3JkZXIgYmV0d2VlbiBldmVudHMgYW5kL29yIHRoZSBkYXkgbnVtYmVyICovCglib3JkZXItYm90dG9tOiAwOwp9CgouZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHRib2R5IHRkLCAvKiBjZWxscyB3aXRoIGV2ZW50cyBpbnNpZGUgKHNvIE5PVCB0aGUgZGF5IG51bWJlciBjZWxsKSAqLwouZmMtcm93IC5mYy1oZWxwZXItc2tlbGV0b24gdGJvZHkgdGQgewoJLyogZG9uJ3QgcHV0IGEgYm9yZGVyIGJldHdlZW4gZXZlbnQgY2VsbHMgKi8KCWJvcmRlci10b3A6IDA7Cn0KCgovKiBTY3JvbGxpbmcgQ29udGFpbmVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1zY3JvbGxlciB7Cgktd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7Cn0KCi8qIFRPRE86IG1vdmUgdG8gYWdlbmRhL2Jhc2ljICovCi5mYy1zY3JvbGxlciA+IC5mYy1kYXktZ3JpZCwKLmZjLXNjcm9sbGVyID4gLmZjLXRpbWUtZ3JpZCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHJlLXNjb3BlIGFsbCBwb3NpdGlvbnMgKi8KCXdpZHRoOiAxMDAlOyAvKiBoYWNrIHRvIGZvcmNlIHJlLXNpemluZyB0aGlzIGlubmVyIGVsZW1lbnQgd2hlbiBzY3JvbGxiYXJzIGFwcGVhci9kaXNhcHBlYXIgKi8KfQoKCi8qIEdsb2JhbCBFdmVudCBTdHlsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWV2ZW50IHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsgLyogZm9yIHJlc2l6ZSBoYW5kbGUgYW5kIG90aGVyIGlubmVyIHBvc2l0aW9uaW5nICovCglkaXNwbGF5OiBibG9jazsgLyogbWFrZSB0aGUgPGE+IHRhZyBibG9jayAqLwoJZm9udC1zaXplOiAuODVlbTsKCWxpbmUtaGVpZ2h0OiAxLjM7Cglib3JkZXItcmFkaXVzOiAzcHg7Cglib3JkZXI6IDFweCBzb2xpZCAjM2E4N2FkOyAvKiBkZWZhdWx0IEJPUkRFUiBjb2xvciAqLwoJZm9udC13ZWlnaHQ6IG5vcm1hbDsgLyogdW5kbyBqcXVpJ3MgdWktd2lkZ2V0LWhlYWRlciBib2xkICovCn0KCi5mYy1ldmVudCwKLmZjLWV2ZW50LWRvdCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjM2E4N2FkOyAvKiBkZWZhdWx0IEJBQ0tHUk9VTkQgY29sb3IgKi8KfQoKLyogb3ZlcnBvd2VyIHNvbWUgb2YgYm9vdHN0cmFwJ3MgYW5kIGpxdWkncyBzdHlsZXMgb24gPGE+IHRhZ3MgKi8KLmZjLWV2ZW50LAouZmMtZXZlbnQ6aG92ZXIsCi51aS13aWRnZXQgLmZjLWV2ZW50IHsKCWNvbG9yOiAjZmZmOyAvKiBkZWZhdWx0IFRFWFQgY29sb3IgKi8KCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgLyogaWYgPGE+IGhhcyBhbiBocmVmICovCn0KCi5mYy1ldmVudFtocmVmXSwKLmZjLWV2ZW50LmZjLWRyYWdnYWJsZSB7CgljdXJzb3I6IHBvaW50ZXI7IC8qIGdpdmUgZXZlbnRzIHdpdGggbGlua3MgYW5kIGRyYWdnYWJsZSBldmVudHMgYSBoYW5kIG1vdXNlIHBvaW50ZXIgKi8KfQoKLmZjLW5vdC1hbGxvd2VkLCAvKiBjYXVzZXMgYSAid2FybmluZyIgY3Vyc29yLiBhcHBsaWVkIG9uIGJvZHkgKi8KLmZjLW5vdC1hbGxvd2VkIC5mYy1ldmVudCB7IC8qIHRvIG92ZXJyaWRlIGFuIGV2ZW50J3MgY3VzdG9tIGN1cnNvciAqLwoJY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLmZjLWV2ZW50IC5mYy1iZyB7IC8qIHRoZSBnZW5lcmljIC5mYy1iZyBhbHJlYWR5IGRvZXMgcG9zaXRpb24gKi8KCXotaW5kZXg6IDE7CgliYWNrZ3JvdW5kOiAjZmZmOwoJb3BhY2l0eTogLjI1Owp9CgouZmMtZXZlbnQgLmZjLWNvbnRlbnQgewoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMjsKfQoKLyogcmVzaXplciAoY3Vyc29yIEFORCB0b3VjaCBkZXZpY2VzKSAqLwoKLmZjLWV2ZW50IC5mYy1yZXNpemVyIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDQ7Cn0KCi8qIHJlc2l6ZXIgKHRvdWNoIGRldmljZXMpICovCgouZmMtZXZlbnQgLmZjLXJlc2l6ZXIgewoJZGlzcGxheTogbm9uZTsKfQoKLmZjLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtcmVzaXplciwKLmZjLWV2ZW50LmZjLXNlbGVjdGVkIC5mYy1yZXNpemVyIHsKCS8qIG9ubHkgc2hvdyB3aGVuIGhvdmVyaW5nIG9yIHNlbGVjdGVkICh3aXRoIHRvdWNoKSAqLwoJZGlzcGxheTogYmxvY2s7Cn0KCi8qIGhpdCBhcmVhICovCgouZmMtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXI6YmVmb3JlIHsKCS8qIDQweDQwIHRvdWNoIGFyZWEgKi8KCWNvbnRlbnQ6ICIiOwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogOTk5OTsgLyogdXNlciBvZiB0aGlzIHV0aWwgY2FuIHNjb3BlIHdpdGhpbiBhIGxvd2VyIHotaW5kZXggKi8KCXRvcDogNTAlOwoJbGVmdDogNTAlOwoJd2lkdGg6IDQwcHg7CgloZWlnaHQ6IDQwcHg7CgltYXJnaW4tbGVmdDogLTIwcHg7CgltYXJnaW4tdG9wOiAtMjBweDsKfQoKCi8qIEV2ZW50IFNlbGVjdGlvbiAob25seSBmb3IgdG91Y2ggZGV2aWNlcykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWV2ZW50LmZjLXNlbGVjdGVkIHsKCXotaW5kZXg6IDk5OTkgIWltcG9ydGFudDsgLyogb3ZlcmNvbWVzIGlubGluZSB6LWluZGV4ICovCglib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOwp9CgouZmMtZXZlbnQuZmMtc2VsZWN0ZWQuZmMtZHJhZ2dpbmcgewoJYm94LXNoYWRvdzogMCAycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKCi8qIEhvcml6b250YWwgRXZlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIGJpZ2dlciB0b3VjaCBhcmVhIHdoZW4gc2VsZWN0ZWQgKi8KLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQ6YmVmb3JlIHsKCWNvbnRlbnQ6ICIiOwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMzsgLyogYmVsb3cgcmVzaXplcnMgKi8KCXRvcDogLTEwcHg7Cglib3R0b206IC0xMHB4OwoJbGVmdDogMDsKCXJpZ2h0OiAwOwp9CgovKiBldmVudHMgdGhhdCBhcmUgY29udGludWluZyB0by9mcm9tIGFub3RoZXIgd2Vlay4ga2lsbCByb3VuZGVkIGNvcm5lcnMgYW5kIGJ1dHQgdXAgYWdhaW5zdCBlZGdlICovCgouZmMtbHRyIC5mYy1oLWV2ZW50LmZjLW5vdC1zdGFydCwKLmZjLXJ0bCAuZmMtaC1ldmVudC5mYy1ub3QtZW5kIHsKCW1hcmdpbi1sZWZ0OiAwOwoJYm9yZGVyLWxlZnQtd2lkdGg6IDA7CglwYWRkaW5nLWxlZnQ6IDFweDsgLyogcmVwbGFjZSB0aGUgYm9yZGVyIHdpdGggcGFkZGluZyAqLwoJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDsKCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7Cn0KCi5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtbm90LWVuZCwKLmZjLXJ0bCAuZmMtaC1ldmVudC5mYy1ub3Qtc3RhcnQgewoJbWFyZ2luLXJpZ2h0OiAwOwoJYm9yZGVyLXJpZ2h0LXdpZHRoOiAwOwoJcGFkZGluZy1yaWdodDogMXB4OyAvKiByZXBsYWNlIHRoZSBib3JkZXIgd2l0aCBwYWRkaW5nICovCglib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsKCWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwOwp9CgovKiByZXNpemVyIChjdXJzb3IgQU5EIHRvdWNoIGRldmljZXMpICovCgovKiBsZWZ0IHJlc2l6ZXIgICovCi5mYy1sdHIgLmZjLWgtZXZlbnQgLmZjLXN0YXJ0LXJlc2l6ZXIsCi5mYy1ydGwgLmZjLWgtZXZlbnQgLmZjLWVuZC1yZXNpemVyIHsKCWN1cnNvcjogdy1yZXNpemU7CglsZWZ0OiAtMXB4OyAvKiBvdmVyY29tZSBib3JkZXIgKi8KfQoKLyogcmlnaHQgcmVzaXplciAqLwouZmMtbHRyIC5mYy1oLWV2ZW50IC5mYy1lbmQtcmVzaXplciwKLmZjLXJ0bCAuZmMtaC1ldmVudCAuZmMtc3RhcnQtcmVzaXplciB7CgljdXJzb3I6IGUtcmVzaXplOwoJcmlnaHQ6IC0xcHg7IC8qIG92ZXJjb21lIGJvcmRlciAqLwp9CgovKiByZXNpemVyIChtb3VzZSBkZXZpY2VzKSAqLwoKLmZjLWgtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVyIHsKCXdpZHRoOiA3cHg7Cgl0b3A6IC0xcHg7IC8qIG92ZXJjb21lIHRvcCBib3JkZXIgKi8KCWJvdHRvbTogLTFweDsgLyogb3ZlcmNvbWUgYm90dG9tIGJvcmRlciAqLwp9CgovKiByZXNpemVyICh0b3VjaCBkZXZpY2VzKSAqLwoKLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXIgewoJLyogOHg4IGxpdHRsZSBkb3QgKi8KCWJvcmRlci1yYWRpdXM6IDRweDsKCWJvcmRlci13aWR0aDogMXB4OwoJd2lkdGg6IDZweDsKCWhlaWdodDogNnB4OwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci1jb2xvcjogaW5oZXJpdDsKCWJhY2tncm91bmQ6ICNmZmY7CgkvKiB2ZXJ0aWNhbGx5IGNlbnRlciAqLwoJdG9wOiA1MCU7CgltYXJnaW4tdG9wOiAtNHB4Owp9CgovKiBsZWZ0IHJlc2l6ZXIgICovCi5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXN0YXJ0LXJlc2l6ZXIsCi5mYy1ydGwgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWVuZC1yZXNpemVyIHsKCW1hcmdpbi1sZWZ0OiAtNHB4OyAvKiBjZW50ZXJzIHRoZSA4eDggZG90IG9uIHRoZSBsZWZ0IGVkZ2UgKi8KfQoKLyogcmlnaHQgcmVzaXplciAqLwouZmMtbHRyIC5mYy1oLWV2ZW50LmZjLXNlbGVjdGVkIC5mYy1lbmQtcmVzaXplciwKLmZjLXJ0bCAuZmMtaC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtc3RhcnQtcmVzaXplciB7CgltYXJnaW4tcmlnaHQ6IC00cHg7IC8qIGNlbnRlcnMgdGhlIDh4OCBkb3Qgb24gdGhlIHJpZ2h0IGVkZ2UgKi8KfQoKCi8qIERheUdyaWQgZXZlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KV2UgdXNlIHRoZSBmdWxsICJmYy1kYXktZ3JpZC1ldmVudCIgY2xhc3MgaW5zdGVhZCBvZiB1c2luZyBkZXNjZW5kYW50cyBiZWNhdXNlIHRoZSBldmVudCB3b24ndApiZSBhIGRlc2NlbmRhbnQgb2YgdGhlIGdyaWQgd2hlbiBpdCBpcyBiZWluZyBkcmFnZ2VkLgoqLwoKLmZjLWRheS1ncmlkLWV2ZW50IHsKCW1hcmdpbjogMXB4IDJweCAwOyAvKiBzcGFjaW5nIGJldHdlZW4gZXZlbnRzIGFuZCBlZGdlcyAqLwoJcGFkZGluZzogMCAxcHg7Cn0KCnRyOmZpcnN0LWNoaWxkID4gdGQgPiAuZmMtZGF5LWdyaWQtZXZlbnQgewoJbWFyZ2luLXRvcDogMnB4OyAvKiBhIGxpdHRsZSBiaXQgbW9yZSBzcGFjZSBiZWZvcmUgdGhlIGZpcnN0IGV2ZW50ICovCn0KCi5mYy1kYXktZ3JpZC1ldmVudC5mYy1zZWxlY3RlZDphZnRlciB7Cgljb250ZW50OiAiIjsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDE7IC8qIHNhbWUgei1pbmRleCBhcyBmYy1iZywgYmVoaW5kIHRleHQgKi8KCS8qIG92ZXJjb21lIHRoZSBib3JkZXJzICovCgl0b3A6IC0xcHg7CglyaWdodDogLTFweDsKCWJvdHRvbTogLTFweDsKCWxlZnQ6IC0xcHg7CgkvKiBkYXJrZW5pbmcgZWZmZWN0ICovCgliYWNrZ3JvdW5kOiAjMDAwOwoJb3BhY2l0eTogLjI1Owp9CgouZmMtZGF5LWdyaWQtZXZlbnQgLmZjLWNvbnRlbnQgeyAvKiBmb3JjZSBldmVudHMgdG8gYmUgb25lLWxpbmUgdGFsbCAqLwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKCW92ZXJmbG93OiBoaWRkZW47Cn0KCi5mYy1kYXktZ3JpZC1ldmVudCAuZmMtdGltZSB7Cglmb250LXdlaWdodDogYm9sZDsKfQoKLyogcmVzaXplciAoY3Vyc29yIGRldmljZXMpICovCgovKiBsZWZ0IHJlc2l6ZXIgICovCi5mYy1sdHIgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtc3RhcnQtcmVzaXplciwKLmZjLXJ0bCAuZmMtZGF5LWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1lbmQtcmVzaXplciB7CgltYXJnaW4tbGVmdDogLTJweDsgLyogdG8gdGhlIGRheSBjZWxsJ3MgZWRnZSAqLwp9CgovKiByaWdodCByZXNpemVyICovCi5mYy1sdHIgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtZW5kLXJlc2l6ZXIsCi5mYy1ydGwgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtc3RhcnQtcmVzaXplciB7CgltYXJnaW4tcmlnaHQ6IC0ycHg7IC8qIHRvIHRoZSBkYXkgY2VsbCdzIGVkZ2UgKi8KfQoKCi8qIEV2ZW50IExpbWl0aW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qICJtb3JlIiBsaW5rIHRoYXQgcmVwcmVzZW50cyBoaWRkZW4gZXZlbnRzICovCgphLmZjLW1vcmUgewoJbWFyZ2luOiAxcHggM3B4OwoJZm9udC1zaXplOiAuODVlbTsKCWN1cnNvcjogcG9pbnRlcjsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKYS5mYy1tb3JlOmhvdmVyIHsKCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgouZmMtbGltaXRlZCB7IC8qIHJvd3MgYW5kIGNlbGxzIHRoYXQgYXJlIGhpZGRlbiBiZWNhdXNlIG9mIGEgIm1vcmUiIGxpbmsgKi8KCWRpc3BsYXk6IG5vbmU7Cn0KCi8qIHBvcG92ZXIgdGhhdCBhcHBlYXJzIHdoZW4gIm1vcmUiIGxpbmsgaXMgY2xpY2tlZCAqLwoKLmZjLWRheS1ncmlkIC5mYy1yb3cgewoJei1pbmRleDogMTsgLyogbWFrZSB0aGUgIm1vcmUiIHBvcG92ZXIgb25lIGhpZ2hlciB0aGFuIHRoaXMgKi8KfQoKLmZjLW1vcmUtcG9wb3ZlciB7Cgl6LWluZGV4OiAyOwoJd2lkdGg6IDIyMHB4Owp9CgouZmMtbW9yZS1wb3BvdmVyIC5mYy1ldmVudC1jb250YWluZXIgewoJcGFkZGluZzogMTBweDsKfQoKCi8qIE5vdyBJbmRpY2F0b3IKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLW5vdy1pbmRpY2F0b3IgewoJcG9zaXRpb246IGFic29sdXRlOwoJYm9yZGVyOiAwIHNvbGlkIHJlZDsKfQoKCi8qIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdW5zZWxlY3RhYmxlIHsKCS13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CgkgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwoJICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKCSAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CgkgICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoJLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwoJLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwp9CgoKCi8qIFRvb2xiYXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRvb2xiYXIgewoJdGV4dC1hbGlnbjogY2VudGVyOwoJbWFyZ2luLWJvdHRvbTogMWVtOwp9CgouZmMtdG9vbGJhciAuZmMtbGVmdCB7CglmbG9hdDogbGVmdDsKfQoKLmZjLXRvb2xiYXIgLmZjLXJpZ2h0IHsKCWZsb2F0OiByaWdodDsKfQoKLmZjLXRvb2xiYXIgLmZjLWNlbnRlciB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi8qIHRoZSB0aGluZ3Mgd2l0aGluIGVhY2ggbGVmdC9yaWdodC9jZW50ZXIgc2VjdGlvbiAqLwouZmMgLmZjLXRvb2xiYXIgPiAqID4gKiB7IC8qIGV4dHJhIHByZWNlZGVuY2UgdG8gb3ZlcnJpZGUgYnV0dG9uIGJvcmRlciBtYXJnaW5zICovCglmbG9hdDogbGVmdDsKCW1hcmdpbi1sZWZ0OiAuNzVlbTsKfQoKLyogdGhlIGZpcnN0IHRoaW5nIHdpdGhpbiBlYWNoIGxlZnQvY2VudGVyL3JpZ2h0IHNlY3Rpb24gKi8KLmZjIC5mYy10b29sYmFyID4gKiA+IDpmaXJzdC1jaGlsZCB7IC8qIGV4dHJhIHByZWNlZGVuY2UgdG8gb3ZlcnJpZGUgYnV0dG9uIGJvcmRlciBtYXJnaW5zICovCgltYXJnaW4tbGVmdDogMDsKfQoJCi8qIHRpdGxlIHRleHQgKi8KCi5mYy10b29sYmFyIGgyIHsKCW1hcmdpbjogMDsKfQoKLyogYnV0dG9uIGxheWVyaW5nIChmb3IgYm9yZGVyIHByZWNlZGVuY2UpICovCgouZmMtdG9vbGJhciBidXR0b24gewoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZmMtdG9vbGJhciAuZmMtc3RhdGUtaG92ZXIsCi5mYy10b29sYmFyIC51aS1zdGF0ZS1ob3ZlciB7Cgl6LWluZGV4OiAyOwp9CgkKLmZjLXRvb2xiYXIgLmZjLXN0YXRlLWRvd24gewoJei1pbmRleDogMzsKfQoKLmZjLXRvb2xiYXIgLmZjLXN0YXRlLWFjdGl2ZSwKLmZjLXRvb2xiYXIgLnVpLXN0YXRlLWFjdGl2ZSB7Cgl6LWluZGV4OiA0Owp9CgouZmMtdG9vbGJhciBidXR0b246Zm9jdXMgewoJei1pbmRleDogNTsKfQoKCi8qIFZpZXcgU3RydWN0dXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIHVuZG8gdHdpdHRlciBib290c3RyYXAncyBib3gtc2l6aW5nIHJ1bGVzLiBub3JtYWxpemVzIHBvc2l0aW9uaW5nIHRlY2huaXF1ZXMgKi8KLyogZG9uJ3QgZG8gdGhpcyBmb3IgdGhlIHRvb2xiYXIgYmVjYXVzZSB3ZSdsbCB3YW50IGJvb3RzdHJhcCB0byBzdHlsZSB0aG9zZSBidXR0b25zIGFzIHNvbWUgcHQgKi8KLmZjLXZpZXctY29udGFpbmVyICosCi5mYy12aWV3LWNvbnRhaW5lciAqOmJlZm9yZSwKLmZjLXZpZXctY29udGFpbmVyICo6YWZ0ZXIgewoJLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsKCSAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7CgkgICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94Owp9CgouZmMtdmlldywgLyogc2NvcGUgcG9zaXRpb25pbmcgYW5kIHotaW5kZXgncyBmb3IgZXZlcnl0aGluZyB3aXRoaW4gdGhlIHZpZXcgKi8KLmZjLXZpZXcgPiB0YWJsZSB7IC8qIHNvIGRyYWdnZWQgZWxlbWVudHMgY2FuIGJlIGFib3ZlIHRoZSB2aWV3J3MgbWFpbiBlbGVtZW50ICovCglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwp9CgoKCi8qIEJhc2ljVmlldwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBkYXkgcm93IHN0cnVjdHVyZSAqLwoKLmZjLWJhc2ljV2Vlay12aWV3IC5mYy1jb250ZW50LXNrZWxldG9uLAouZmMtYmFzaWNEYXktdmlldyAuZmMtY29udGVudC1za2VsZXRvbiB7CgkvKiB0aGVyZSBtYXkgYmUgd2VlayBudW1iZXJzIGluIHRoZXNlIHZpZXdzLCBzbyBubyBwYWRkaW5nLXRvcCAqLwoJcGFkZGluZy1ib3R0b206IDFlbTsgLyogZW5zdXJlIGEgc3BhY2UgYXQgYm90dG9tIG9mIGNlbGwgZm9yIHVzZXIgc2VsZWN0aW5nL2NsaWNraW5nICovCn0KCi5mYy1iYXNpYy12aWV3IC5mYy1ib2R5IC5mYy1yb3cgewoJbWluLWhlaWdodDogNGVtOyAvKiBlbnN1cmUgdGhhdCBhbGwgcm93cyBhcmUgYXQgbGVhc3QgdGhpcyB0YWxsICovCn0KCi8qIGEgInJpZ2lkIiByb3cgd2lsbCB0YWtlIHVwIGEgY29uc3RhbnQgYW1vdW50IG9mIGhlaWdodCBiZWNhdXNlIGNvbnRlbnQtc2tlbGV0b24gaXMgYWJzb2x1dGUgKi8KCi5mYy1yb3cuZmMtcmlnaWQgewoJb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmZjLXJvdy5mYy1yaWdpZCAuZmMtY29udGVudC1za2VsZXRvbiB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi8qIHdlZWsgYW5kIGRheSBudW1iZXIgc3R5bGluZyAqLwoKLmZjLWRheS10b3AuZmMtb3RoZXItbW9udGggewoJb3BhY2l0eTogMC4zOwp9CgouZmMtYmFzaWMtdmlldyAuZmMtd2Vlay1udW1iZXIsCi5mYy1iYXNpYy12aWV3IC5mYy1kYXktbnVtYmVyIHsKCXBhZGRpbmc6IDJweDsKfQoKLmZjLWJhc2ljLXZpZXcgdGguZmMtd2Vlay1udW1iZXIsCi5mYy1iYXNpYy12aWV3IHRoLmZjLWRheS1udW1iZXIgewoJcGFkZGluZzogMCAycHg7IC8qIGNvbHVtbiBoZWFkZXJzIGNhbid0IGhhdmUgYXMgbXVjaCB2IHNwYWNlICovCn0KCi5mYy1sdHIgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLWRheS1udW1iZXIgeyBmbG9hdDogcmlnaHQ7IH0KLmZjLXJ0bCAuZmMtYmFzaWMtdmlldyAuZmMtZGF5LXRvcCAuZmMtZGF5LW51bWJlciB7IGZsb2F0OiBsZWZ0OyB9CgouZmMtbHRyIC5mYy1iYXNpYy12aWV3IC5mYy1kYXktdG9wIC5mYy13ZWVrLW51bWJlciB7IGZsb2F0OiBsZWZ0OyBib3JkZXItcmFkaXVzOiAwIDAgM3B4IDA7IH0KLmZjLXJ0bCAuZmMtYmFzaWMtdmlldyAuZmMtZGF5LXRvcCAuZmMtd2Vlay1udW1iZXIgeyBmbG9hdDogcmlnaHQ7IGJvcmRlci1yYWRpdXM6IDAgMCAwIDNweDsgfQoKLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLXdlZWstbnVtYmVyIHsKCW1pbi13aWR0aDogMS41ZW07Cgl0ZXh0LWFsaWduOiBjZW50ZXI7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOwoJY29sb3I6ICM4MDgwODA7Cn0KCi8qIHdoZW4gd2Vlay9kYXkgbnVtYmVyIGhhdmUgb3duIGNvbHVtbiAqLwoKLmZjLWJhc2ljLXZpZXcgdGQuZmMtd2Vlay1udW1iZXIgewoJdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmMtYmFzaWMtdmlldyB0ZC5mYy13ZWVrLW51bWJlciA+ICogewoJLyogd29yayBhcm91bmQgdGhlIHdheSB3ZSBkbyBjb2x1bW4gcmVzaXppbmcgYW5kIGVuc3VyZSBhIG1pbmltdW0gd2lkdGggKi8KCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCW1pbi13aWR0aDogMS4yNWVtOwp9CgoKLyogQWdlbmRhVmlldyBhbGwtZGF5IGFyZWEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWFnZW5kYS12aWV3IC5mYy1kYXktZ3JpZCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAyOyAvKiBzbyB0aGUgIm1vcmUuLiIgcG9wb3ZlciB3aWxsIGJlIG92ZXIgdGhlIHRpbWUgZ3JpZCAqLwp9CgouZmMtYWdlbmRhLXZpZXcgLmZjLWRheS1ncmlkIC5mYy1yb3cgewoJbWluLWhlaWdodDogM2VtOyAvKiBhbGwtZGF5IHNlY3Rpb24gd2lsbCBuZXZlciBnZXQgc2hvcnRlciB0aGFuIHRoaXMgKi8KfQoKLmZjLWFnZW5kYS12aWV3IC5mYy1kYXktZ3JpZCAuZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHsKCXBhZGRpbmctYm90dG9tOiAxZW07IC8qIGdpdmUgc3BhY2UgdW5kZXJuZWF0aCBldmVudHMgZm9yIGNsaWNraW5nL3NlbGVjdGluZyBkYXlzICovCn0KCgovKiBUaW1lR3JpZCBheGlzIHJ1bm5pbmcgZG93biB0aGUgc2lkZSAoZm9yIGJvdGggdGhlIGFsbC1kYXkgYXJlYSBhbmQgdGhlIHNsb3QgYXJlYSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjIC5mYy1heGlzIHsgLyogLmZjIHRvIG92ZXJjb21lIGRlZmF1bHQgY2VsbCBzdHlsZXMgKi8KCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CglwYWRkaW5nOiAwIDRweDsKCXdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5mYy1sdHIgLmZjLWF4aXMgewoJdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCi5mYy1ydGwgLmZjLWF4aXMgewoJdGV4dC1hbGlnbjogbGVmdDsKfQoKLnVpLXdpZGdldCB0ZC5mYy1heGlzIHsKCWZvbnQtd2VpZ2h0OiBub3JtYWw7IC8qIG92ZXJjb21lIGpxdWkgdGhlbWUgbWFraW5nIGl0IGJvbGQgKi8KfQoKCi8qIFRpbWVHcmlkIFN0cnVjdHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdGltZS1ncmlkLWNvbnRhaW5lciwgLyogc28gc2Nyb2xsIGNvbnRhaW5lcidzIHotaW5kZXggaXMgYmVsb3cgYWxsLWRheSAqLwouZmMtdGltZS1ncmlkIHsgLyogc28gc2xhdHMvYmcvY29udGVudC9ldGMgcG9zaXRpb25zIGdldCBzY29wZWQgd2l0aGluIGhlcmUgKi8KCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDE7Cn0KCi5mYy10aW1lLWdyaWQgewoJbWluLWhlaWdodDogMTAwJTsgLyogc28gaWYgaGVpZ2h0IHNldHRpbmcgaXMgJ2F1dG8nLCAuZmMtYmcgc3RyZXRjaGVzIHRvIGZpbGwgaGVpZ2h0ICovCn0KCi5mYy10aW1lLWdyaWQgdGFibGUgeyAvKiBkb24ndCBwdXQgb3V0ZXIgYm9yZGVycyBvbiBzbGF0cy9iZy9jb250ZW50L2V0YyAqLwoJYm9yZGVyOiAwIGhpZGRlbiB0cmFuc3BhcmVudDsKfQoKLmZjLXRpbWUtZ3JpZCA+IC5mYy1iZyB7Cgl6LWluZGV4OiAxOwp9CgouZmMtdGltZS1ncmlkIC5mYy1zbGF0cywKLmZjLXRpbWUtZ3JpZCA+IGhyIHsgLyogdGhlIDxocj4gQWdlbmRhVmlldyBpbmplY3RzIHdoZW4gZ3JpZCBpcyBzaG9ydGVyIHRoYW4gc2Nyb2xsZXIgKi8KCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDI7Cn0KCi5mYy10aW1lLWdyaWQgLmZjLWNvbnRlbnQtY29sIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsgLyogYmVjYXVzZSBub3ctaW5kaWNhdG9yIGxpdmVzIGRpcmVjdGx5IGluc2lkZSAqLwp9CgouZmMtdGltZS1ncmlkIC5mYy1jb250ZW50LXNrZWxldG9uIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDM7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi8qIGRpdnMgd2l0aGluIGEgY2VsbCB3aXRoaW4gdGhlIGZjLWNvbnRlbnQtc2tlbGV0b24gKi8KCi5mYy10aW1lLWdyaWQgLmZjLWJ1c2luZXNzLWNvbnRhaW5lciB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwp9CgouZmMtdGltZS1ncmlkIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAyOwp9CgouZmMtdGltZS1ncmlkIC5mYy1oaWdobGlnaHQtY29udGFpbmVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDM7Cn0KCi5mYy10aW1lLWdyaWQgLmZjLWV2ZW50LWNvbnRhaW5lciB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiA0Owp9CgouZmMtdGltZS1ncmlkIC5mYy1ub3ctaW5kaWNhdG9yLWxpbmUgewoJei1pbmRleDogNTsKfQoKLmZjLXRpbWUtZ3JpZCAuZmMtaGVscGVyLWNvbnRhaW5lciB7IC8qIGFsc28gaXMgZmMtZXZlbnQtY29udGFpbmVyICovCglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiA2Owp9CgoKLyogVGltZUdyaWQgU2xhdHMgKGxpbmVzIHRoYXQgcnVuIGhvcml6b250YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWUtZ3JpZCAuZmMtc2xhdHMgdGQgewoJaGVpZ2h0OiAxLjVlbTsKCWJvcmRlci1ib3R0b206IDA7IC8qIGVhY2ggY2VsbCBpcyByZXNwb25zaWJsZSBmb3IgaXRzIHRvcCBib3JkZXIgKi8KfQoKLmZjLXRpbWUtZ3JpZCAuZmMtc2xhdHMgLmZjLW1pbm9yIHRkIHsKCWJvcmRlci10b3Atc3R5bGU6IGRvdHRlZDsKfQoKLmZjLXRpbWUtZ3JpZCAuZmMtc2xhdHMgLnVpLXdpZGdldC1jb250ZW50IHsgLyogZm9yIGpxdWkgdGhlbWUgKi8KCWJhY2tncm91bmQ6IG5vbmU7IC8qIHNlZSB0aHJvdWdoIHRvIGZjLWJnICovCn0KCgovKiBUaW1lR3JpZCBIaWdobGlnaHRpbmcgU2xvdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWUtZ3JpZCAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7IC8qIGEgZGl2IHdpdGhpbiBhIGNlbGwgd2l0aGluIHRoZSBmYy1oaWdobGlnaHQtc2tlbGV0b24gKi8KCXBvc2l0aW9uOiByZWxhdGl2ZTsgLyogc2NvcGVzIHRoZSBsZWZ0L3JpZ2h0IG9mIHRoZSBmYy1oaWdobGlnaHQgdG8gYmUgaW4gdGhlIGNvbHVtbiAqLwp9CgouZmMtdGltZS1ncmlkIC5mYy1oaWdobGlnaHQgewoJcG9zaXRpb246IGFic29sdXRlOwoJbGVmdDogMDsKCXJpZ2h0OiAwOwoJLyogdG9wIGFuZCBib3R0b20gd2lsbCBiZSBpbiBieSBKUyAqLwp9CgoKLyogVGltZUdyaWQgRXZlbnQgQ29udGFpbm1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWx0ciAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXIgeyAvKiBzcGFjZSBvbiB0aGUgc2lkZXMgb2YgZXZlbnRzIGZvciBMVFIgKGRlZmF1bHQpICovCgltYXJnaW46IDAgMi41JSAwIDJweDsKfQoKLmZjLXJ0bCAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXIgeyAvKiBzcGFjZSBvbiB0aGUgc2lkZXMgb2YgZXZlbnRzIGZvciBSVEwgKi8KCW1hcmdpbjogMCAycHggMCAyLjUlOwp9CgouZmMtdGltZS1ncmlkIC5mYy1ldmVudCwKLmZjLXRpbWUtZ3JpZCAuZmMtYmdldmVudCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl6LWluZGV4OiAxOyAvKiBzY29wZSBpbm5lciB6LWluZGV4J3MgKi8KfQoKLmZjLXRpbWUtZ3JpZCAuZmMtYmdldmVudCB7CgkvKiBiYWNrZ3JvdW5kIGV2ZW50cyBhbHdheXMgc3BhbiBmdWxsIHdpZHRoICovCglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCgovKiBHZW5lcmljIFZlcnRpY2FsIEV2ZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy12LWV2ZW50LmZjLW5vdC1zdGFydCB7IC8qIGV2ZW50cyB0aGF0IGFyZSBjb250aW51aW5nIGZyb20gYW5vdGhlciBkYXkgKi8KCS8qIHJlcGxhY2Ugc3BhY2UgbWFkZSBieSB0aGUgdG9wIGJvcmRlciB3aXRoIHBhZGRpbmcgKi8KCWJvcmRlci10b3Atd2lkdGg6IDA7CglwYWRkaW5nLXRvcDogMXB4OwoKCS8qIHJlbW92ZSB0b3Agcm91bmRlZCBjb3JuZXJzICovCglib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwOwoJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7Cn0KCi5mYy12LWV2ZW50LmZjLW5vdC1lbmQgewoJLyogcmVwbGFjZSBzcGFjZSBtYWRlIGJ5IHRoZSB0b3AgYm9yZGVyIHdpdGggcGFkZGluZyAqLwoJYm9yZGVyLWJvdHRvbS13aWR0aDogMDsKCXBhZGRpbmctYm90dG9tOiAxcHg7CgoJLyogcmVtb3ZlIGJvdHRvbSByb3VuZGVkIGNvcm5lcnMgKi8KCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7Cglib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDsKfQoKCi8qIFRpbWVHcmlkIEV2ZW50IFN0eWxpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpXZSB1c2UgdGhlIGZ1bGwgImZjLXRpbWUtZ3JpZC1ldmVudCIgY2xhc3MgaW5zdGVhZCBvZiB1c2luZyBkZXNjZW5kYW50cyBiZWNhdXNlIHRoZSBldmVudCB3b24ndApiZSBhIGRlc2NlbmRhbnQgb2YgdGhlIGdyaWQgd2hlbiBpdCBpcyBiZWluZyBkcmFnZ2VkLgoqLwoKLmZjLXRpbWUtZ3JpZC1ldmVudCB7CglvdmVyZmxvdzogaGlkZGVuOyAvKiBkb24ndCBsZXQgdGhlIGJnIGZsb3cgb3ZlciByb3VuZGVkIGNvcm5lcnMgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zZWxlY3RlZCB7CgkvKiBuZWVkIHRvIGFsbG93IHRvdWNoIHJlc2l6ZXJzIHRvIGV4dGVuZCBvdXRzaWRlIGV2ZW50J3MgYm91bmRpbmcgYm94ICovCgkvKiBjb21tb24gZmMtc2VsZWN0ZWQgc3R5bGVzIGhpZGUgdGhlIGZjLWJnLCBzbyBkb24ndCBuZWVkIHRoaXMgYW55d2F5ICovCglvdmVyZmxvdzogdmlzaWJsZTsKfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtYmcgewoJZGlzcGxheTogbm9uZTsgLyogaGlkZSBzZW1pLXdoaXRlIGJhY2tncm91bmQsIHRvIGFwcGVhciBkYXJrZXIgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtY29udGVudCB7CglvdmVyZmxvdzogaGlkZGVuOyAvKiBmb3Igd2hlbiAuZmMtc2VsZWN0ZWQgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtdGltZSwKLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtdGl0bGUgewoJcGFkZGluZzogMCAxcHg7Cn0KCi5mYy10aW1lLWdyaWQtZXZlbnQgLmZjLXRpbWUgewoJZm9udC1zaXplOiAuODVlbTsKCXdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qIHNob3J0IG1vZGUsIHdoZXJlIHRpbWUgYW5kIHRpdGxlIGFyZSBvbiB0aGUgc2FtZSBsaW5lICovCgouZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy1jb250ZW50IHsKCS8qIGRvbid0IHdyYXAgdG8gc2Vjb25kIGxpbmUgKG5vdyB0aGF0IGNvbnRlbnRzIHdpbGwgYmUgaW5saW5lKSAqLwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZSwKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGl0bGUgewoJLyogcHV0IHRoZSB0aW1lIGFuZCB0aXRsZSBvbiB0aGUgc2FtZSBsaW5lICovCglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9CgouZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aW1lIHNwYW4gewoJZGlzcGxheTogbm9uZTsgLyogZG9uJ3QgZGlzcGxheSB0aGUgZnVsbCB0aW1lIHRleHQuLi4gKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZTpiZWZvcmUgewoJY29udGVudDogYXR0cihkYXRhLXN0YXJ0KTsgLyogLi4uaW5zdGVhZCwgZGlzcGxheSBvbmx5IHRoZSBzdGFydCB0aW1lICovCn0KCi5mYy10aW1lLWdyaWQtZXZlbnQuZmMtc2hvcnQgLmZjLXRpbWU6YWZ0ZXIgewoJY29udGVudDogIlwwMDBBMC1cMDAwQTAiOyAvKiBzZXBlcmF0ZSB3aXRoIGEgZGFzaCwgd3JhcHBlZCBpbiBuYnNwJ3MgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGl0bGUgewoJZm9udC1zaXplOiAuODVlbTsgLyogbWFrZSB0aGUgdGl0bGUgdGV4dCB0aGUgc2FtZSBzaXplIGFzIHRoZSB0aW1lICovCglwYWRkaW5nOiAwOyAvKiB1bmRvIHBhZGRpbmcgZnJvbSBhYm92ZSAqLwp9CgovKiByZXNpemVyIChjdXJzb3IgZGV2aWNlKSAqLwoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1hbGxvdy1tb3VzZS1yZXNpemUgLmZjLXJlc2l6ZXIgewoJbGVmdDogMDsKCXJpZ2h0OiAwOwoJYm90dG9tOiAwOwoJaGVpZ2h0OiA4cHg7CglvdmVyZmxvdzogaGlkZGVuOwoJbGluZS1oZWlnaHQ6IDhweDsKCWZvbnQtc2l6ZTogMTFweDsKCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7CgljdXJzb3I6IHMtcmVzaXplOwp9CgouZmMtdGltZS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtcmVzaXplcjphZnRlciB7Cgljb250ZW50OiAiPSI7Cn0KCi8qIHJlc2l6ZXIgKHRvdWNoIGRldmljZSkgKi8KCi5mYy10aW1lLWdyaWQtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXIgewoJLyogMTB4MTAgZG90ICovCglib3JkZXItcmFkaXVzOiA1cHg7Cglib3JkZXItd2lkdGg6IDFweDsKCXdpZHRoOiA4cHg7CgloZWlnaHQ6IDhweDsKCWJvcmRlci1zdHlsZTogc29saWQ7Cglib3JkZXItY29sb3I6IGluaGVyaXQ7CgliYWNrZ3JvdW5kOiAjZmZmOwoJLyogaG9yaXpvbnRhbGx5IGNlbnRlciAqLwoJbGVmdDogNTAlOwoJbWFyZ2luLWxlZnQ6IC01cHg7CgkvKiBjZW50ZXIgb24gdGhlIGJvdHRvbSBlZGdlICovCglib3R0b206IC01cHg7Cn0KCgovKiBOb3cgSW5kaWNhdG9yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy10aW1lLWdyaWQgLmZjLW5vdy1pbmRpY2F0b3ItbGluZSB7Cglib3JkZXItdG9wLXdpZHRoOiAxcHg7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi8qIGFycm93IG9uIGF4aXMgKi8KCi5mYy10aW1lLWdyaWQgLmZjLW5vdy1pbmRpY2F0b3ItYXJyb3cgewoJbWFyZ2luLXRvcDogLTVweDsgLyogdmVydGljYWxseSBjZW50ZXIgb24gdG9wIGNvb3JkaW5hdGUgKi8KfQoKLmZjLWx0ciAuZmMtdGltZS1ncmlkIC5mYy1ub3ctaW5kaWNhdG9yLWFycm93IHsKCWxlZnQ6IDA7CgkvKiB0cmlhbmdsZSBwb2ludGluZyByaWdodC4uLiAqLwoJYm9yZGVyLXdpZHRoOiA1cHggMCA1cHggNnB4OwoJYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7Cglib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKfQoKLmZjLXJ0bCAuZmMtdGltZS1ncmlkIC5mYy1ub3ctaW5kaWNhdG9yLWFycm93IHsKCXJpZ2h0OiAwOwoJLyogdHJpYW5nbGUgcG9pbnRpbmcgbGVmdC4uLiAqLwoJYm9yZGVyLXdpZHRoOiA1cHggNnB4IDVweCAwOwoJYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7Cglib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKfQoKCgovKiBMaXN0IFZpZXcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogcG9zc2libHkgcmV1c2FibGUgKi8KCi5mYy1ldmVudC1kb3QgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJd2lkdGg6IDEwcHg7CgloZWlnaHQ6IDEwcHg7Cglib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi8qIHZpZXcgd3JhcHBlciAqLwoKLmZjLXJ0bCAuZmMtbGlzdC12aWV3IHsKCWRpcmVjdGlvbjogcnRsOyAvKiB1bmxpa2UgY29yZSB2aWV3cywgbGV2ZXJhZ2UgYnJvd3NlciBSVEwgKi8KfQoKLmZjLWxpc3QtdmlldyB7Cglib3JkZXItd2lkdGg6IDFweDsKCWJvcmRlci1zdHlsZTogc29saWQ7Cn0KCi8qIHRhYmxlIHJlc2V0cyAqLwoKLmZjIC5mYy1saXN0LXRhYmxlIHsKCXRhYmxlLWxheW91dDogYXV0bzsgLyogZm9yIHNocmlua3dyYXBwaW5nIGNlbGwgY29udGVudCAqLwp9CgouZmMtbGlzdC10YWJsZSB0ZCB7Cglib3JkZXItd2lkdGg6IDFweCAwIDA7CglwYWRkaW5nOiA4cHggMTRweDsKfQoKLmZjLWxpc3QtdGFibGUgdHI6Zmlyc3QtY2hpbGQgdGQgewoJYm9yZGVyLXRvcC13aWR0aDogMDsKfQoKLyogZGF5IGhlYWRpbmdzIHdpdGggdGhlIGxpc3QgKi8KCi5mYy1saXN0LWhlYWRpbmcgewoJYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4Owp9CgouZmMtbGlzdC1oZWFkaW5nIHRkIHsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9CgouZmMtbHRyIC5mYy1saXN0LWhlYWRpbmctbWFpbiB7IGZsb2F0OiBsZWZ0OyB9Ci5mYy1sdHIgLmZjLWxpc3QtaGVhZGluZy1hbHQgeyBmbG9hdDogcmlnaHQ7IH0KCi5mYy1ydGwgLmZjLWxpc3QtaGVhZGluZy1tYWluIHsgZmxvYXQ6IHJpZ2h0OyB9Ci5mYy1ydGwgLmZjLWxpc3QtaGVhZGluZy1hbHQgeyBmbG9hdDogbGVmdDsgfQoKLyogZXZlbnQgbGlzdCBpdGVtcyAqLwoKLmZjLWxpc3QtaXRlbS5mYy1oYXMtdXJsIHsKCWN1cnNvcjogcG9pbnRlcjsgLyogd2hvbGUgcm93IHdpbGwgYmUgY2xpY2thYmxlICovCn0KCi5mYy1saXN0LWl0ZW06aG92ZXIgdGQgewoJYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKfQoKLmZjLWxpc3QtaXRlbS1tYXJrZXIsCi5mYy1saXN0LWl0ZW0tdGltZSB7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJd2lkdGg6IDFweDsKfQoKLyogbWFrZSB0aGUgZG90IGNsb3NlciB0byB0aGUgZXZlbnQgdGl0bGUgKi8KLmZjLWx0ciAuZmMtbGlzdC1pdGVtLW1hcmtlciB7IHBhZGRpbmctcmlnaHQ6IDA7IH0KLmZjLXJ0bCAuZmMtbGlzdC1pdGVtLW1hcmtlciB7IHBhZGRpbmctbGVmdDogMDsgfQoKLmZjLWxpc3QtaXRlbS10aXRsZSBhIHsKCS8qIGV2ZXJ5IGV2ZW50IHRpdGxlIGNlbGwgaGFzIGFuIDxhPiB0YWcgKi8KCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWNvbG9yOiBpbmhlcml0Owp9CgouZmMtbGlzdC1pdGVtLXRpdGxlIGFbaHJlZl06aG92ZXIgewoJLyogaG92ZXIgZWZmZWN0IG9ubHkgb24gdGl0bGVzIHdpdGggaHJlZnMgKi8KCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBtZXNzYWdlIHdoZW4gbm8gZXZlbnRzICovCgouZmMtbGlzdC1lbXB0eS13cmFwMiB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cglib3R0b206IDA7Cn0KCi5mYy1saXN0LWVtcHR5LXdyYXAxIHsKCXdpZHRoOiAxMDAlOwoJaGVpZ2h0OiAxMDAlOwoJZGlzcGxheTogdGFibGU7Cn0KCi5mYy1saXN0LWVtcHR5IHsKCWRpc3BsYXk6IHRhYmxlLWNlbGw7Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmMtdW50aGVtZWQgLmZjLWxpc3QtZW1wdHkgeyAvKiB0aGVtZSB3aWxsIHByb3ZpZGUgb3duIGJhY2tncm91bmQgKi8KCWJhY2tncm91bmQtY29sb3I6ICNlZWU7Cn0K
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEgU3R5bGVzaGVldAogKiBEb2NzICYgTGljZW5zZTogaHR0cDovL2Z1bGxjYWxlbmRhci5pby8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLy5mYy1pY29uLGJvZHkgLmZje2ZvbnQtc2l6ZToxZW19LmZjLWJ1dHRvbi1ncm91cCwuZmMtaWNvbntkaXNwbGF5OmlubGluZS1ibG9ja30uZmMtYmcsLmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiwuZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b257Ym90dG9tOjB9LmZjLWljb24sLmZjLXVuc2VsZWN0YWJsZXsta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZX0uZmN7ZGlyZWN0aW9uOmx0cjt0ZXh0LWFsaWduOmxlZnR9LmZjLXJ0bHt0ZXh0LWFsaWduOnJpZ2h0fS5mYyB0aCwuZmMtYmFzaWMtdmlldyB0ZC5mYy13ZWVrLW51bWJlciwuZmMtaWNvbiwuZmMtdG9vbGJhcnt0ZXh0LWFsaWduOmNlbnRlcn0uZmMtdW50aGVtZWQgLmZjLWNvbnRlbnQsLmZjLXVudGhlbWVkIC5mYy1kaXZpZGVyLC5mYy11bnRoZW1lZCAuZmMtbGlzdC1oZWFkaW5nIHRkLC5mYy11bnRoZW1lZCAuZmMtbGlzdC12aWV3LC5mYy11bnRoZW1lZCAuZmMtcG9wb3ZlciwuZmMtdW50aGVtZWQgLmZjLXJvdywuZmMtdW50aGVtZWQgdGJvZHksLmZjLXVudGhlbWVkIHRkLC5mYy11bnRoZW1lZCB0aCwuZmMtdW50aGVtZWQgdGhlYWR7Ym9yZGVyLWNvbG9yOiNkZGR9LmZjLXVudGhlbWVkIC5mYy1wb3BvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZn0uZmMtdW50aGVtZWQgLmZjLWRpdmlkZXIsLmZjLXVudGhlbWVkIC5mYy1saXN0LWhlYWRpbmcgdGQsLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXJ7YmFja2dyb3VuZDojZWVlfS5mYy11bnRoZW1lZCAuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZXtjb2xvcjojNjY2fS5mYy11bnRoZW1lZCAuZmMtdG9kYXl7YmFja2dyb3VuZDojZmNmOGUzfS5mYy1oaWdobGlnaHR7YmFja2dyb3VuZDojYmNlOGYxO29wYWNpdHk6LjN9LmZjLWJnZXZlbnR7YmFja2dyb3VuZDojOGZkZjgyO29wYWNpdHk6LjN9LmZjLW5vbmJ1c2luZXNze2JhY2tncm91bmQ6I2Q3ZDdkN30uZmMtaWNvbntoZWlnaHQ6MWVtO2xpbmUtaGVpZ2h0OjFlbTtvdmVyZmxvdzpoaWRkZW47Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IixDb3VyaWVyLG1vbm9zcGFjZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LmZjLWljb246YWZ0ZXJ7cG9zaXRpb246cmVsYXRpdmV9LmZjLWljb24tbGVmdC1zaW5nbGUtYXJyb3c6YWZ0ZXJ7Y29udGVudDoiXDAyMDM5Ijtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjIwMCU7dG9wOi03JX0uZmMtaWNvbi1yaWdodC1zaW5nbGUtYXJyb3c6YWZ0ZXJ7Y29udGVudDoiXDAyMDNBIjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjIwMCU7dG9wOi03JX0uZmMtaWNvbi1sZWZ0LWRvdWJsZS1hcnJvdzphZnRlcntjb250ZW50OiJcMDAwQUIiO2ZvbnQtc2l6ZToxNjAlO3RvcDotNyV9LmZjLWljb24tcmlnaHQtZG91YmxlLWFycm93OmFmdGVye2NvbnRlbnQ6IlwwMDBCQiI7Zm9udC1zaXplOjE2MCU7dG9wOi03JX0uZmMtaWNvbi1sZWZ0LXRyaWFuZ2xlOmFmdGVye2NvbnRlbnQ6IlwyNUM0Ijtmb250LXNpemU6MTI1JTt0b3A6MyV9LmZjLWljb24tcmlnaHQtdHJpYW5nbGU6YWZ0ZXJ7Y29udGVudDoiXDI1QkEiO2ZvbnQtc2l6ZToxMjUlO3RvcDozJX0uZmMtaWNvbi1kb3duLXRyaWFuZ2xlOmFmdGVye2NvbnRlbnQ6IlwyNUJDIjtmb250LXNpemU6MTI1JTt0b3A6MiV9LmZjLWljb24teDphZnRlcntjb250ZW50OiJcMDAwRDciO2ZvbnQtc2l6ZToyMDAlO3RvcDo2JX0uZmMgYnV0dG9uey1tb3otYm94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW46MDtoZWlnaHQ6Mi4xZW07cGFkZGluZzowIC42ZW07Zm9udC1zaXplOjFlbTt3aGl0ZS1zcGFjZTpub3dyYXA7Y3Vyc29yOnBvaW50ZXJ9LmZjIGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcnttYXJnaW46MDtwYWRkaW5nOjB9LmZjLXN0YXRlLWRlZmF1bHR7Ym9yZGVyOjFweCBzb2xpZDtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjZmZmKSx0bygjZTZlNmU2KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtib3JkZXItY29sb3I6I2U2ZTZlNiAjZTZlNmU2ICNiZmJmYmY7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjI1KTtjb2xvcjojMzMzO3RleHQtc2hhZG93OjAgMXB4IDFweCByZ2JhKDI1NSwyNTUsMjU1LC43NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjIpLDAgMXB4IDJweCByZ2JhKDAsMCwwLC4wNSl9LmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLWxlZnR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHh9LmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLXJpZ2h0e2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHh9LmZjIGJ1dHRvbiAuZmMtaWNvbntwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6LS4wNWVtO21hcmdpbjowIC4yZW07dmVydGljYWwtYWxpZ246bWlkZGxlfS5mYy1zdGF0ZS1hY3RpdmUsLmZjLXN0YXRlLWRpc2FibGVkLC5mYy1zdGF0ZS1kb3duLC5mYy1zdGF0ZS1ob3Zlcntjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2U2ZTZlNn0uZmMtc3RhdGUtaG92ZXJ7Y29sb3I6IzMzMzt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE1cHg7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtcG9zaXRpb24gLjFzIGxpbmVhcjstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyOy1vLXRyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyO3RyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyfS5mYy1zdGF0ZS1hY3RpdmUsLmZjLXN0YXRlLWRvd257YmFja2dyb3VuZC1jb2xvcjojY2NjO2JhY2tncm91bmQtaW1hZ2U6bm9uZTtib3gtc2hhZG93Omluc2V0IDAgMnB4IDRweCByZ2JhKDAsMCwwLC4xNSksMCAxcHggMnB4IHJnYmEoMCwwLDAsLjA1KX0uZmMtc3RhdGUtZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHQ7YmFja2dyb3VuZC1pbWFnZTpub25lO29wYWNpdHk6LjY1O2JveC1zaGFkb3c6bm9uZX0uZmMtZXZlbnQuZmMtZHJhZ2dhYmxlLC5mYy1ldmVudFtocmVmXSwuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZSxhW2RhdGEtZ290b117Y3Vyc29yOnBvaW50ZXJ9LmZjIC5mYy1idXR0b24tZ3JvdXA+KntmbG9hdDpsZWZ0O21hcmdpbjowIDAgMCAtMXB4fS5mYyAuZmMtYnV0dG9uLWdyb3VwPjpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowfS5mYy1wb3BvdmVye3Bvc2l0aW9uOmFic29sdXRlO2JveC1zaGFkb3c6MCAycHggNnB4IHJnYmEoMCwwLDAsLjE1KX0uZmMtcG9wb3ZlciAuZmMtaGVhZGVye3BhZGRpbmc6MnB4IDRweH0uZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy10aXRsZXttYXJnaW46MCAycHh9LmZjLWx0ciAuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy10aXRsZSwuZmMtcnRsIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLWNsb3Nle2Zsb2F0OmxlZnR9LmZjLWx0ciAuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZSwuZmMtcnRsIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLXRpdGxle2Zsb2F0OnJpZ2h0fS5mYy11bnRoZW1lZCAuZmMtcG9wb3Zlcntib3JkZXItd2lkdGg6MXB4O2JvcmRlci1zdHlsZTpzb2xpZH0uZmMtdW50aGVtZWQgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtY2xvc2V7Zm9udC1zaXplOi45ZW07bWFyZ2luLXRvcDoycHh9LmZjLXBvcG92ZXI+LnVpLXdpZGdldC1oZWFkZXIrLnVpLXdpZGdldC1jb250ZW50e2JvcmRlci10b3A6MH0uZmMtZGl2aWRlcntib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjFweH1oci5mYy1kaXZpZGVye2hlaWdodDowO21hcmdpbjowO3BhZGRpbmc6MCAwIDJweDtib3JkZXItd2lkdGg6MXB4IDB9LmZjLWJnIHRhYmxlLC5mYy1yb3cgLmZjLWJnZXZlbnQtc2tlbGV0b24gdGFibGUsLmZjLXJvdyAuZmMtaGlnaGxpZ2h0LXNrZWxldG9uIHRhYmxle2hlaWdodDoxMDAlfS5mYy1jbGVhcntjbGVhcjpib3RofS5mYy1iZywuZmMtYmdldmVudC1za2VsZXRvbiwuZmMtaGVscGVyLXNrZWxldG9uLC5mYy1oaWdobGlnaHQtc2tlbGV0b257cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3JpZ2h0OjB9LmZjIHRhYmxle3dpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3RhYmxlLWxheW91dDpmaXhlZDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDtmb250LXNpemU6MWVtfS5mYyB0ZCwuZmMgdGh7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoxcHg7cGFkZGluZzowO3ZlcnRpY2FsLWFsaWduOnRvcH0uZmMgdGQuZmMtdG9kYXl7Ym9yZGVyLXN0eWxlOmRvdWJsZX1hW2RhdGEtZ290b106aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uZmMgLmZjLXJvd3tib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjB9LmZjLXJvdyB0YWJsZXtib3JkZXItbGVmdDowIGhpZGRlbiB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6MCBoaWRkZW4gdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbTowIGhpZGRlbiB0cmFuc3BhcmVudH0uZmMtcm93OmZpcnN0LWNoaWxkIHRhYmxle2JvcmRlci10b3A6MCBoaWRkZW4gdHJhbnNwYXJlbnR9LmZjLXJvd3twb3NpdGlvbjpyZWxhdGl2ZX0uZmMtcm93IC5mYy1iZ3t6LWluZGV4OjF9LmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiB0ZCwuZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b24gdGR7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5mYy1yb3cgLmZjLWJnZXZlbnQtc2tlbGV0b257ei1pbmRleDoyfS5mYy1yb3cgLmZjLWhpZ2hsaWdodC1za2VsZXRvbnt6LWluZGV4OjN9LmZjLXJvdyAuZmMtY29udGVudC1za2VsZXRvbntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjQ7cGFkZGluZy1ib3R0b206MnB4fS5mYy1yb3cgLmZjLWhlbHBlci1za2VsZXRvbnt6LWluZGV4OjV9LmZjLXJvdyAuZmMtY29udGVudC1za2VsZXRvbiB0ZCwuZmMtcm93IC5mYy1oZWxwZXItc2tlbGV0b24gdGR7YmFja2dyb3VuZDowIDA7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MH0uZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHRib2R5IHRkLC5mYy1yb3cgLmZjLWhlbHBlci1za2VsZXRvbiB0Ym9keSB0ZHtib3JkZXItdG9wOjB9LmZjLXNjcm9sbGVyey13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5mYy1yb3cuZmMtcmlnaWQsLmZjLXRpbWUtZ3JpZC1ldmVudHtvdmVyZmxvdzpoaWRkZW59LmZjLXNjcm9sbGVyPi5mYy1kYXktZ3JpZCwuZmMtc2Nyb2xsZXI+LmZjLXRpbWUtZ3JpZHtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlfS5mYy1ldmVudHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTouODVlbTtsaW5lLWhlaWdodDoxLjM7Ym9yZGVyLXJhZGl1czozcHg7Ym9yZGVyOjFweCBzb2xpZCAjM2E4N2FkO2ZvbnQtd2VpZ2h0OjQwMH0uZmMtZXZlbnQsLmZjLWV2ZW50LWRvdHtiYWNrZ3JvdW5kLWNvbG9yOiMzYTg3YWR9LmZjLWV2ZW50LC5mYy1ldmVudDpob3ZlciwudWktd2lkZ2V0IC5mYy1ldmVudHtjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lfS5mYy1ub3QtYWxsb3dlZCwuZmMtbm90LWFsbG93ZWQgLmZjLWV2ZW50e2N1cnNvcjpub3QtYWxsb3dlZH0uZmMtZXZlbnQgLmZjLWJne3otaW5kZXg6MTtiYWNrZ3JvdW5kOiNmZmY7b3BhY2l0eTouMjV9LmZjLWV2ZW50IC5mYy1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Mn0uZmMtZXZlbnQgLmZjLXJlc2l6ZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDo0O2Rpc3BsYXk6bm9uZX0uZmMtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVyLC5mYy1ldmVudC5mYy1zZWxlY3RlZCAuZmMtcmVzaXplcntkaXNwbGF5OmJsb2NrfS5mYy1ldmVudC5mYy1zZWxlY3RlZCAuZmMtcmVzaXplcjpiZWZvcmV7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4Ojk5OTk7dG9wOjUwJTtsZWZ0OjUwJTt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O21hcmdpbi1sZWZ0Oi0yMHB4O21hcmdpbi10b3A6LTIwcHh9LmZjLWV2ZW50LmZjLXNlbGVjdGVke3otaW5kZXg6OTk5OSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDJweCA1cHggcmdiYSgwLDAsMCwuMil9LmZjLWV2ZW50LmZjLXNlbGVjdGVkLmZjLWRyYWdnaW5ne2JveC1zaGFkb3c6MCAycHggN3B4IHJnYmEoMCwwLDAsLjMpfS5mYy1oLWV2ZW50LmZjLXNlbGVjdGVkOmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mzt0b3A6LTEwcHg7Ym90dG9tOi0xMHB4O2xlZnQ6MDtyaWdodDowfS5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtbm90LXN0YXJ0LC5mYy1ydGwgLmZjLWgtZXZlbnQuZmMtbm90LWVuZHttYXJnaW4tbGVmdDowO2JvcmRlci1sZWZ0LXdpZHRoOjA7cGFkZGluZy1sZWZ0OjFweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtbm90LWVuZCwuZmMtcnRsIC5mYy1oLWV2ZW50LmZjLW5vdC1zdGFydHttYXJnaW4tcmlnaHQ6MDtib3JkZXItcmlnaHQtd2lkdGg6MDtwYWRkaW5nLXJpZ2h0OjFweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LmZjLWx0ciAuZmMtaC1ldmVudCAuZmMtc3RhcnQtcmVzaXplciwuZmMtcnRsIC5mYy1oLWV2ZW50IC5mYy1lbmQtcmVzaXplcntjdXJzb3I6dy1yZXNpemU7bGVmdDotMXB4fS5mYy1sdHIgLmZjLWgtZXZlbnQgLmZjLWVuZC1yZXNpemVyLC5mYy1ydGwgLmZjLWgtZXZlbnQgLmZjLXN0YXJ0LXJlc2l6ZXJ7Y3Vyc29yOmUtcmVzaXplO3JpZ2h0Oi0xcHh9LmZjLWgtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVye3dpZHRoOjdweDt0b3A6LTFweDtib3R0b206LTFweH0uZmMtaC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtcmVzaXplcntib3JkZXItcmFkaXVzOjRweDtib3JkZXItd2lkdGg6MXB4O3dpZHRoOjZweDtoZWlnaHQ6NnB4O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOiNmZmY7dG9wOjUwJTttYXJnaW4tdG9wOi00cHh9LmZjLWx0ciAuZmMtaC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtc3RhcnQtcmVzaXplciwuZmMtcnRsIC5mYy1oLWV2ZW50LmZjLXNlbGVjdGVkIC5mYy1lbmQtcmVzaXplcnttYXJnaW4tbGVmdDotNHB4fS5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWVuZC1yZXNpemVyLC5mYy1ydGwgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXN0YXJ0LXJlc2l6ZXJ7bWFyZ2luLXJpZ2h0Oi00cHh9LmZjLWRheS1ncmlkLWV2ZW50e21hcmdpbjoxcHggMnB4IDA7cGFkZGluZzowIDFweH10cjpmaXJzdC1jaGlsZD50ZD4uZmMtZGF5LWdyaWQtZXZlbnR7bWFyZ2luLXRvcDoycHh9LmZjLWRheS1ncmlkLWV2ZW50LmZjLXNlbGVjdGVkOmFmdGVye2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3RvcDotMXB4O3JpZ2h0Oi0xcHg7Ym90dG9tOi0xcHg7bGVmdDotMXB4O2JhY2tncm91bmQ6IzAwMDtvcGFjaXR5Oi4yNX0uZmMtZGF5LWdyaWQtZXZlbnQgLmZjLWNvbnRlbnR7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbn0uZmMtZGF5LWdyaWQtZXZlbnQgLmZjLXRpbWV7Zm9udC13ZWlnaHQ6NzAwfS5mYy1sdHIgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtc3RhcnQtcmVzaXplciwuZmMtcnRsIC5mYy1kYXktZ3JpZC1ldmVudC5mYy1hbGxvdy1tb3VzZS1yZXNpemUgLmZjLWVuZC1yZXNpemVye21hcmdpbi1sZWZ0Oi0ycHh9LmZjLWx0ciAuZmMtZGF5LWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1lbmQtcmVzaXplciwuZmMtcnRsIC5mYy1kYXktZ3JpZC1ldmVudC5mYy1hbGxvdy1tb3VzZS1yZXNpemUgLmZjLXN0YXJ0LXJlc2l6ZXJ7bWFyZ2luLXJpZ2h0Oi0ycHh9YS5mYy1tb3Jle21hcmdpbjoxcHggM3B4O2ZvbnQtc2l6ZTouODVlbTtjdXJzb3I6cG9pbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZX1hLmZjLW1vcmU6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uZmMtbGltaXRlZHtkaXNwbGF5Om5vbmV9LmZjLWRheS1ncmlkIC5mYy1yb3d7ei1pbmRleDoxfS5mYy1tb3JlLXBvcG92ZXJ7ei1pbmRleDoyO3dpZHRoOjIyMHB4fS5mYy1tb3JlLXBvcG92ZXIgLmZjLWV2ZW50LWNvbnRhaW5lcntwYWRkaW5nOjEwcHh9LmZjLW5vdy1pbmRpY2F0b3J7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjAgc29saWQgcmVkfS5mYy11bnNlbGVjdGFibGV7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uZmMtdG9vbGJhcnttYXJnaW4tYm90dG9tOjFlbX0uZmMtdG9vbGJhciAuZmMtbGVmdHtmbG9hdDpsZWZ0fS5mYy10b29sYmFyIC5mYy1yaWdodHtmbG9hdDpyaWdodH0uZmMtdG9vbGJhciAuZmMtY2VudGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5mYyAuZmMtdG9vbGJhcj4qPip7ZmxvYXQ6bGVmdDttYXJnaW4tbGVmdDouNzVlbX0uZmMgLmZjLXRvb2xiYXI+Kj46Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MH0uZmMtdG9vbGJhciBoMnttYXJnaW46MH0uZmMtdG9vbGJhciBidXR0b257cG9zaXRpb246cmVsYXRpdmV9LmZjLXRvb2xiYXIgLmZjLXN0YXRlLWhvdmVyLC5mYy10b29sYmFyIC51aS1zdGF0ZS1ob3Zlcnt6LWluZGV4OjJ9LmZjLXRvb2xiYXIgLmZjLXN0YXRlLWRvd257ei1pbmRleDozfS5mYy10b29sYmFyIC5mYy1zdGF0ZS1hY3RpdmUsLmZjLXRvb2xiYXIgLnVpLXN0YXRlLWFjdGl2ZXt6LWluZGV4OjR9LmZjLXRvb2xiYXIgYnV0dG9uOmZvY3Vze3otaW5kZXg6NX0uZmMtdmlldy1jb250YWluZXIgKiwuZmMtdmlldy1jb250YWluZXIgOmFmdGVyLC5mYy12aWV3LWNvbnRhaW5lciA6YmVmb3Jley13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveH0uZmMtdmlldywuZmMtdmlldz50YWJsZXtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLWJhc2ljRGF5LXZpZXcgLmZjLWNvbnRlbnQtc2tlbGV0b24sLmZjLWJhc2ljV2Vlay12aWV3IC5mYy1jb250ZW50LXNrZWxldG9ue3BhZGRpbmctYm90dG9tOjFlbX0uZmMtYmFzaWMtdmlldyAuZmMtYm9keSAuZmMtcm93e21pbi1oZWlnaHQ6NGVtfS5mYy1yb3cuZmMtcmlnaWQgLmZjLWNvbnRlbnQtc2tlbGV0b257cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3JpZ2h0OjB9LmZjLWRheS10b3AuZmMtb3RoZXItbW9udGh7b3BhY2l0eTouM30uZmMtYmFzaWMtdmlldyAuZmMtZGF5LW51bWJlciwuZmMtYmFzaWMtdmlldyAuZmMtd2Vlay1udW1iZXJ7cGFkZGluZzoycHh9LmZjLWJhc2ljLXZpZXcgdGguZmMtZGF5LW51bWJlciwuZmMtYmFzaWMtdmlldyB0aC5mYy13ZWVrLW51bWJlcntwYWRkaW5nOjAgMnB4fS5mYy1sdHIgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLWRheS1udW1iZXJ7ZmxvYXQ6cmlnaHR9LmZjLXJ0bCAuZmMtYmFzaWMtdmlldyAuZmMtZGF5LXRvcCAuZmMtZGF5LW51bWJlcntmbG9hdDpsZWZ0fS5mYy1sdHIgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLXdlZWstbnVtYmVye2Zsb2F0OmxlZnQ7Ym9yZGVyLXJhZGl1czowIDAgM3B4fS5mYy1ydGwgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLXdlZWstbnVtYmVye2Zsb2F0OnJpZ2h0O2JvcmRlci1yYWRpdXM6MCAwIDAgM3B4fS5mYy1iYXNpYy12aWV3IC5mYy1kYXktdG9wIC5mYy13ZWVrLW51bWJlcnttaW4td2lkdGg6MS41ZW07dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZjJmMmYyO2NvbG9yOmdyZXl9LmZjLWJhc2ljLXZpZXcgdGQuZmMtd2Vlay1udW1iZXI+KntkaXNwbGF5OmlubGluZS1ibG9jazttaW4td2lkdGg6MS4yNWVtfS5mYy1hZ2VuZGEtdmlldyAuZmMtZGF5LWdyaWR7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5mYy1hZ2VuZGEtdmlldyAuZmMtZGF5LWdyaWQgLmZjLXJvd3ttaW4taGVpZ2h0OjNlbX0uZmMtYWdlbmRhLXZpZXcgLmZjLWRheS1ncmlkIC5mYy1yb3cgLmZjLWNvbnRlbnQtc2tlbGV0b257cGFkZGluZy1ib3R0b206MWVtfS5mYyAuZmMtYXhpc3t2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZzowIDRweDt3aGl0ZS1zcGFjZTpub3dyYXB9LmZjLWx0ciAuZmMtYXhpc3t0ZXh0LWFsaWduOnJpZ2h0fS5mYy1ydGwgLmZjLWF4aXN7dGV4dC1hbGlnbjpsZWZ0fS51aS13aWRnZXQgdGQuZmMtYXhpc3tmb250LXdlaWdodDo0MDB9LmZjLXRpbWUtZ3JpZCwuZmMtdGltZS1ncmlkLWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLXRpbWUtZ3JpZHttaW4taGVpZ2h0OjEwMCV9LmZjLXRpbWUtZ3JpZCB0YWJsZXtib3JkZXI6MCBoaWRkZW4gdHJhbnNwYXJlbnR9LmZjLXRpbWUtZ3JpZD4uZmMtYmd7ei1pbmRleDoxfS5mYy10aW1lLWdyaWQgLmZjLXNsYXRzLC5mYy10aW1lLWdyaWQ+aHJ7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5mYy10aW1lLWdyaWQgLmZjLWNvbnRlbnQtY29se3Bvc2l0aW9uOnJlbGF0aXZlfS5mYy10aW1lLWdyaWQgLmZjLWNvbnRlbnQtc2tlbGV0b257cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDozO3RvcDowO2xlZnQ6MDtyaWdodDowfS5mYy10aW1lLWdyaWQgLmZjLWJ1c2luZXNzLWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLXRpbWUtZ3JpZCAuZmMtYmdldmVudC1jb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5mYy10aW1lLWdyaWQgLmZjLWhpZ2hsaWdodC1jb250YWluZXJ7ei1pbmRleDozO3Bvc2l0aW9uOnJlbGF0aXZlfS5mYy10aW1lLWdyaWQgLmZjLWV2ZW50LWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjR9LmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1saW5le3otaW5kZXg6NX0uZmMtdGltZS1ncmlkIC5mYy1oZWxwZXItY29udGFpbmVye3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Nn0uZmMtdGltZS1ncmlkIC5mYy1zbGF0cyB0ZHtoZWlnaHQ6MS41ZW07Ym9yZGVyLWJvdHRvbTowfS5mYy10aW1lLWdyaWQgLmZjLXNsYXRzIC5mYy1taW5vciB0ZHtib3JkZXItdG9wLXN0eWxlOmRvdHRlZH0uZmMtdGltZS1ncmlkIC5mYy1zbGF0cyAudWktd2lkZ2V0LWNvbnRlbnR7YmFja2dyb3VuZDowIDB9LmZjLXRpbWUtZ3JpZCAuZmMtaGlnaGxpZ2h0e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtyaWdodDowfS5mYy1sdHIgLmZjLXRpbWUtZ3JpZCAuZmMtZXZlbnQtY29udGFpbmVye21hcmdpbjowIDIuNSUgMCAycHh9LmZjLXJ0bCAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXJ7bWFyZ2luOjAgMnB4IDAgMi41JX0uZmMtdGltZS1ncmlkIC5mYy1iZ2V2ZW50LC5mYy10aW1lLWdyaWQgLmZjLWV2ZW50e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MX0uZmMtdGltZS1ncmlkIC5mYy1iZ2V2ZW50e2xlZnQ6MDtyaWdodDowfS5mYy12LWV2ZW50LmZjLW5vdC1zdGFydHtib3JkZXItdG9wLXdpZHRoOjA7cGFkZGluZy10b3A6MXB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5mYy12LWV2ZW50LmZjLW5vdC1lbmR7Ym9yZGVyLWJvdHRvbS13aWR0aDowO3BhZGRpbmctYm90dG9tOjFweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0uZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNlbGVjdGVke292ZXJmbG93OnZpc2libGV9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtYmd7ZGlzcGxheTpub25lfS5mYy10aW1lLWdyaWQtZXZlbnQgLmZjLWNvbnRlbnR7b3ZlcmZsb3c6aGlkZGVufS5mYy10aW1lLWdyaWQtZXZlbnQgLmZjLXRpbWUsLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtdGl0bGV7cGFkZGluZzowIDFweH0uZmMtdGltZS1ncmlkLWV2ZW50IC5mYy10aW1le2ZvbnQtc2l6ZTouODVlbTt3aGl0ZS1zcGFjZTpub3dyYXB9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtY29udGVudHt3aGl0ZS1zcGFjZTpub3dyYXB9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZSwuZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aXRsZXtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3B9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZSBzcGFue2Rpc3BsYXk6bm9uZX0uZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aW1lOmJlZm9yZXtjb250ZW50OmF0dHIoZGF0YS1zdGFydCl9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZTphZnRlcntjb250ZW50OiJcMDAwQTAtXDAwMEEwIn0uZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aXRsZXtmb250LXNpemU6Ljg1ZW07cGFkZGluZzowfS5mYy10aW1lLWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVye2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO2hlaWdodDo4cHg7b3ZlcmZsb3c6aGlkZGVuO2xpbmUtaGVpZ2h0OjhweDtmb250LXNpemU6MTFweDtmb250LWZhbWlseTptb25vc3BhY2U7dGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnMtcmVzaXplfS5mYy10aW1lLWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVyOmFmdGVye2NvbnRlbnQ6Ij0ifS5mYy10aW1lLWdyaWQtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXJ7Ym9yZGVyLXJhZGl1czo1cHg7Ym9yZGVyLXdpZHRoOjFweDt3aWR0aDo4cHg7aGVpZ2h0OjhweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDojZmZmO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi01cHg7Ym90dG9tOi01cHh9LmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1saW5le2JvcmRlci10b3Atd2lkdGg6MXB4O2xlZnQ6MDtyaWdodDowfS5mYy10aW1lLWdyaWQgLmZjLW5vdy1pbmRpY2F0b3ItYXJyb3d7bWFyZ2luLXRvcDotNXB4fS5mYy1sdHIgLmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1hcnJvd3tsZWZ0OjA7Ym9yZGVyLXdpZHRoOjVweCAwIDVweCA2cHg7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItYm90dG9tLWNvbG9yOnRyYW5zcGFyZW50fS5mYy1ydGwgLmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1hcnJvd3tyaWdodDowO2JvcmRlci13aWR0aDo1cHggNnB4IDVweCAwO2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbS1jb2xvcjp0cmFuc3BhcmVudH0uZmMtZXZlbnQtZG90e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7Ym9yZGVyLXJhZGl1czo1cHh9LmZjLXJ0bCAuZmMtbGlzdC12aWV3e2RpcmVjdGlvbjpydGx9LmZjLWxpc3Qtdmlld3tib3JkZXItd2lkdGg6MXB4O2JvcmRlci1zdHlsZTpzb2xpZH0uZmMgLmZjLWxpc3QtdGFibGV7dGFibGUtbGF5b3V0OmF1dG99LmZjLWxpc3QtdGFibGUgdGR7Ym9yZGVyLXdpZHRoOjFweCAwIDA7cGFkZGluZzo4cHggMTRweH0uZmMtbGlzdC10YWJsZSB0cjpmaXJzdC1jaGlsZCB0ZHtib3JkZXItdG9wLXdpZHRoOjB9LmZjLWxpc3QtaGVhZGluZ3tib3JkZXItYm90dG9tLXdpZHRoOjFweH0uZmMtbGlzdC1oZWFkaW5nIHRke2ZvbnQtd2VpZ2h0OjcwMH0uZmMtbHRyIC5mYy1saXN0LWhlYWRpbmctbWFpbntmbG9hdDpsZWZ0fS5mYy1sdHIgLmZjLWxpc3QtaGVhZGluZy1hbHQsLmZjLXJ0bCAuZmMtbGlzdC1oZWFkaW5nLW1haW57ZmxvYXQ6cmlnaHR9LmZjLXJ0bCAuZmMtbGlzdC1oZWFkaW5nLWFsdHtmbG9hdDpsZWZ0fS5mYy1saXN0LWl0ZW0uZmMtaGFzLXVybHtjdXJzb3I6cG9pbnRlcn0uZmMtbGlzdC1pdGVtOmhvdmVyIHRke2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX0uZmMtbGlzdC1pdGVtLW1hcmtlciwuZmMtbGlzdC1pdGVtLXRpbWV7d2hpdGUtc3BhY2U6bm93cmFwO3dpZHRoOjFweH0uZmMtbHRyIC5mYy1saXN0LWl0ZW0tbWFya2Vye3BhZGRpbmctcmlnaHQ6MH0uZmMtcnRsIC5mYy1saXN0LWl0ZW0tbWFya2Vye3BhZGRpbmctbGVmdDowfS5mYy1saXN0LWl0ZW0tdGl0bGUgYXt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjppbmhlcml0fS5mYy1saXN0LWl0ZW0tdGl0bGUgYVtocmVmXTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5mYy1saXN0LWVtcHR5LXdyYXAye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowfS5mYy1saXN0LWVtcHR5LXdyYXAxe3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ZGlzcGxheTp0YWJsZX0uZmMtbGlzdC1lbXB0eXtkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyfS5mYy11bnRoZW1lZCAuZmMtbGlzdC1lbXB0eXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9
LyohCiAqIEZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgdjEuNC4wCiAqIERvY3MgJiBMaWNlbnNlOiBodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLwoKLyogVE9ETzogYnJlYWsgdGhpcyBmaWxlIHVwICovCgovKiBTY3JvbGxlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtc2Nyb2xsZXItY2xpcCB7CglvdmVyZmxvdzogaGlkZGVuOyAvKiBmb3IgY2xpcHBpbmcgc2Nyb2xsYmFycyAqLwoJcG9zaXRpb246IHJlbGF0aXZlOyAvKiBzbyB0aGluZ3MgbGlrZSBzY3JvbGxmb2xsb3dlcnMgY2FuIGF0dGFjaCB0byB0aGlzICovCn0KCi8qIHN1cHJlc3NlcyByZW5kZXJpbmcgb2YgbmF0aXZlIHNjcm9sbGJhcnMgKi8KLyogb24gLmZjLXNjcm9sbGVyICovCi5mYy1uby1zY3JvbGxiYXJzIHsKCWJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMCk7IC8qIGhhY2sgZm9yIGR5bmFtaWMgRE9NIG5vZGVzIChpbiBDaHJvbWUgT1NYIGF0IGxlYXN0KSAqLwp9Ci5mYy1uby1zY3JvbGxiYXJzOjotd2Via2l0LXNjcm9sbGJhciB7Cgl3aWR0aDogMDsKCWhlaWdodDogMDsKfQoKLmZjLXNjcm9sbGVyLWNhbnZhcyB7Cglwb3NpdGlvbjogcmVsYXRpdmU7IC8qIG9yaWdpbiBmb3IgYmcgKi8KCWJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIHNvIHRoYXQgcGFkZGluZyAoZm9yIGd1dHRlcikgd2lsbCBiZSBwYXJ0IG9mIGhlaWdodCAqLwoJbWluLWhlaWdodDogMTAwJTsKfQoKLmZjLXNjcm9sbGVyLWNhbnZhcyA+IC5mYy1iZyB7Cgl6LWluZGV4OiAxOyAvKiBtYWtlIGRlZmF1bHQ/ICovCn0KCi5mYy1zY3JvbGxlci1jYW52YXMgPiAuZmMtY29udGVudCB7Cgl6LWluZGV4OiAyOyAvKiBtYWtlIGRlZmF1bHQ/ICovCglwb3NpdGlvbjogcmVsYXRpdmU7IC8qIG9yaWdpbiBmb3IgaW5uZXIgY29udGVudCAqLwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMDsKfQoKLyogZm9yIHRoZW1lZCwgaGFyZCB0byBnZXQgdGhlIGJvcmRlci1jb2xvciwgc28ganVzdCBmb3JnZXQgaXQgKFJFVklTSVQpICovCi51aS13aWRnZXQgLmZjLXNjcm9sbGVyLWNhbnZhcyA+IC5mYy1jb250ZW50IHsKCWJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KCi5mYy1zY3JvbGxlci1jYW52YXMuZmMtZ3V0dGVyLWxlZnQgPiAuZmMtY29udGVudCB7IGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7IG1hcmdpbi1sZWZ0OiAtMXB4IH0KLmZjLXNjcm9sbGVyLWNhbnZhcy5mYy1ndXR0ZXItcmlnaHQgPiAuZmMtY29udGVudCB7IGJvcmRlci1yaWdodC13aWR0aDogMXB4OyBtYXJnaW4tcmlnaHQ6IC0xcHggfQouZmMtc2Nyb2xsZXItY2FudmFzLmZjLWd1dHRlci10b3AgPiAuZmMtY29udGVudCB7IGJvcmRlci10b3Atd2lkdGg6IDFweDsgbWFyZ2luLXRvcDogLTFweCB9Ci5mYy1zY3JvbGxlci1jYW52YXMuZmMtZ3V0dGVyLWJvdHRvbSA+IC5mYy1jb250ZW50IHsgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OyBtYXJnaW4tYm90dG9tOiAtMXB4IH0KCgovKiBWaWV3IFN0cnVjdHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtcnRsIC5mYy10aW1lbGluZSB7CglkaXJlY3Rpb246IHJ0bDsKfQoKLmZjLXRpbWVsaW5lIC5mYy1kaXZpZGVyIHsKCXdpZHRoOiAzcHg7Cglib3JkZXItc3R5bGU6IGRvdWJsZTsgLyogb3ZlcmNvbWUgbmVpZ2hib3JpbmcgYm9yZGVycyAqLwp9CgouZmMtdGltZWxpbmUgLmZjLWhlYWQgPiB0ciA+IC5mYy1kaXZpZGVyIHsKCWJvcmRlci1ib3R0b206IDA7Cn0KCi5mYy10aW1lbGluZSAuZmMtYm9keSA+IHRyID4gLmZjLWRpdmlkZXIgewoJYm9yZGVyLXRvcDogMDsKfQoKLmZjLXRpbWVsaW5lIC5mYy1ib2R5IC5mYy1kaXZpZGVyLnVpLXdpZGdldC1oZWFkZXIgewoJYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKfQoKLmZjLXNjcm9sbGVkIC5mYy1oZWFkIC5mYy1zY3JvbGxlciB7Cgl6LWluZGV4OiAyOyAvKiBzbyBkcm9wIHNoYWRvdyB3aWxsIGdvIGFib3ZlIGJvZHkgcGFuZXMgKi8KfQoKLmZjLXRpbWVsaW5lLmZjLXNjcm9sbGVkIC5mYy1oZWFkIC5mYy1zY3JvbGxlciB7Cglib3gtc2hhZG93OiAwIDNweCA0cHggcmdiYSgwLDAsMCwwLjA3NSk7Cn0KCi5mYy10aW1lbGluZSAuZmMtYm9keSAuZmMtc2Nyb2xsZXIgewoJei1pbmRleDogMTsKfQoKLyoKb24gYWxsIHRhYmxlcyB0aGF0IGV4cGFuZCB0byB0aGUgZWRnZXMsIGtpbGwgdGhlIG91dGVyIGJvcmRlciwKYmVjYXVzZSB0aGUgY29udGFpbmVyIGVsZW1lbnRzIHRha2UgY2FyZSBvZiBpdAoqLwouZmMtdGltZWxpbmUgLmZjLXNjcm9sbGVyLWNhbnZhcyA+IGRpdiA+IHRhYmxlLAouZmMtdGltZWxpbmUgLmZjLXNjcm9sbGVyLWNhbnZhcyA+IGRpdiA+IGRpdiA+IHRhYmxlIHsKCWJvcmRlci1zdHlsZTogaGlkZGVuOwp9CgoKLyogVGFibGUgQ2VsbCBDb21tb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWVsaW5lIHRoLAouZmMtdGltZWxpbmUgdGQgewoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmZjLXRpbWVsaW5lIC5mYy1jZWxsLWNvbnRlbnQgewoJb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmZjLXRpbWVsaW5lIC5mYy1jZWxsLXRleHQgewoJcGFkZGluZy1sZWZ0OiA0cHg7CglwYWRkaW5nLXJpZ2h0OiA0cHg7Cn0KCi5mYy10aW1lbGluZSAuZmMtY29sLXJlc2l6ZXIgewoJY3Vyc29yOiBjb2wtcmVzaXplOwp9CgovKgpDZWxscyBhdCB0aGUgc3RhcnQgb2YgYSB3ZWVrClRPRE86IGZpZ3VyZSBvdXQgYmV0dGVyIHN0eWxpbmcKCi5mYy1sdHIgLmZjLXRpbWVsaW5lIC5mYy1lbS1jZWxsIGRpdiB7Cglib3JkZXItbGVmdDogM3B4IHNvbGlkICNlZWU7CgloZWlnaHQ6IDEwMCU7Cn0KLmZjLXJ0bCAuZmMtdGltZWxpbmUgLmZjLWVtLWNlbGwgewoJYm9yZGVyLXJpZ2h0LXdpZHRoOiAzcHg7Cn0KKi8KCi8qIGhlYWQgKi8KCi5mYy10aW1lbGluZSB0aCB7Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgouZmMtdGltZWxpbmUgLmZjLWhlYWQgLmZjLWNlbGwtY29udGVudCB7CglwYWRkaW5nLXRvcDogM3B4OwoJcGFkZGluZy1ib3R0b206IDNweDsKfQoKLyogYm9keSAqLwoKLmZjLXRpbWVsaW5lIC5mYy1ib2R5IC51aS13aWRnZXQtY29udGVudCB7CgliYWNrZ3JvdW5kLWltYWdlOiBub25lOwp9CgoKLyogUmVzb3VyY2UgQXJlYQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtcmVzb3VyY2UtYXJlYSB7Cgl3aWR0aDogMzAlOwp9CgouZmMtcmVzb3VyY2UtYXJlYSBjb2wgewoJd2lkdGg6IDQwJTsKCW1pbi13aWR0aDogNzBweDsgLyogd2lsbCBiZSByZWFkIGJ5IEpTICovCn0KCi5mYy1yZXNvdXJjZS1hcmVhIGNvbC5mYy1tYWluLWNvbCB7Cgl3aWR0aDogNjAlOyAvKiBtYWtlIHRoZSBmaXJzdCBjb2x1bW4gaW4gYSBuZXN0ZWQgc2V0dXAgYmlnZ2VyICovCn0KCgouZmMtZmxhdCAuZmMtZXhwYW5kZXItc3BhY2UgeyAvKiBmYy1mbGF0IGlzIG9wcG9zaXRlIG9mIGZjLW5lc3RlZCAqLwoJZGlzcGxheTogbm9uZTsKfQoKCi5mYy1sdHIgLmZjLXJlc291cmNlLWFyZWEgdHIgPiAqIHsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KLmZjLXJ0bCAuZmMtcmVzb3VyY2UtYXJlYSB0ciA+ICogewoJdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCi5mYy1yZXNvdXJjZS1hcmVhIC5mYy1jZWxsLWNvbnRlbnQgewoJcGFkZGluZy1sZWZ0OiA0cHg7CglwYWRkaW5nLXJpZ2h0OiA0cHg7Cn0KCi8qIGhlYWQgKi8KCi5mYy1yZXNvdXJjZS1hcmVhIC5mYy1zdXBlciB0aCB7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5mYy1yZXNvdXJjZS1hcmVhIHRoID4gZGl2IHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNlbGwtY29udGVudCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwp9CgouZmMtcmVzb3VyY2UtYXJlYSB0aCAuZmMtY29sLXJlc2l6ZXIgewoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMjsKCXRvcDogMDsKCWJvdHRvbTogMDsKCXdpZHRoOiA1cHg7Cn0KCi5mYy1sdHIgLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVyIHsKCXJpZ2h0OiAtM3B4Owp9Ci5mYy1ydGwgLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVyIHsKCWxlZnQ6IC0zcHg7Cn0KCi8qIGJvZHkgKi8KCnRyLmZjLWNvbGxhcHNlZCA+IHRkLCAvKiBiZWZvcmUgdGhlIHRyYW5zaXRpb24gKHByZXZlbnRzIGluaXRpYWwgZmxpY2tlcikgKi8KdHIuZmMtdHJhbnNpdGlvbmluZyA+IHRkIHsgLyogZHVyaW5nIHRoZSB0cmFuc2l0aW9uICovCglvdmVyZmxvdzogaGlkZGVuOyAvKiBwcmV2ZW50cyBhYnNvbHV0ZWx5LXBvc2l0aW9uZWQgZXZlbnRzIGZyb20gYmxlZWRpbmcgb3V0ICovCn0KCnRyLmZjLXRyYW5zaXRpb25pbmcgPiB0ZCA+IGRpdiB7Cgl0cmFuc2l0aW9uOiBtYXJnaW4tdG9wIDAuMnM7Cn0KCnRyLmZjLWNvbGxhcHNlZCA+IHRkID4gZGl2IHsKCW1hcmdpbi10b3A6IC0xMHB4Owp9CgoKLmZjLWJvZHkgLmZjLXJlc291cmNlLWFyZWEgLmZjLWNlbGwtY29udGVudCB7IC8qIG1pZ2h0IEJFIHRoZSBjZWxsICovCglwYWRkaW5nLXRvcDogOHB4OwoJcGFkZGluZy1ib3R0b206IDhweDsKfQoKLmZjLW5vLW92ZXJsYXAgLmZjLWJvZHkgLmZjLXJlc291cmNlLWFyZWEgLmZjLWNlbGwtY29udGVudCB7IC8qIG1pZ2h0IEJFIHRoZSBjZWxsICovCglwYWRkaW5nLXRvcDogNXB4OwoJcGFkZGluZy1ib3R0b206IDVweDsKfQoKLmZjLXJlc291cmNlLWFyZWEgLmZjLWljb24geyAvKiB0aGUgZXhwYW5kZXIgYW5kIHNwYWNlcnMgYmVmb3JlIHRoZSBleHBhbmRlciAqLwoJd2lkdGg6IDFlbTsgLyogZW5zdXJlIGNvbnN0YW50IHdpZHRoLCBlc3AgZm9yIGVtcHR5IGljb25zICovCglmb250LXNpemU6IC45ZW07Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJbWFyZ2luLXRvcDogLTElOwp9CgouZmMtcmVzb3VyY2UtYXJlYSAuZmMtZXhwYW5kZXIgewoJY3Vyc29yOiBwb2ludGVyOwoJY29sb3I6ICM2NjY7IC8qIGZvciB0aGUgaWNvbiB3aXRoaW4gKi8KfQoKCi8qIFRpbWUgQXJlYQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdGltZS1hcmVhIGNvbCB7CgltaW4td2lkdGg6IDIuMmVtOyAvKiBkZXRlY3RlZCBieSBKUyAqLwp9CgovKiBoZWFkICovCgouZmMtbHRyIC5mYy10aW1lLWFyZWEgLmZjLWNocm9ubyB0aCB7Cgl0ZXh0LWFsaWduOiBsZWZ0Owp9Ci5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtY2hyb25vIHRoIHsKCXRleHQtYWxpZ246IHJpZ2h0Owp9CgovKiBib2R5IHNsYXRzICh2ZXJ0aWNhbCBsaW5lcykgKi8KCi5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHsgLyogZmMtYmcgaXMgcmVzcG9uc2libGUgZm9yIGEgbG90IG9mIHRoaXMgbm93ISAqLwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMTsKCXRvcDogMDsKCWxlZnQ6IDA7CglyaWdodDogMDsKCWJvdHRvbTogMDsKfQoKLmZjLXRpbWUtYXJlYSAuZmMtc2xhdHMgdGFibGUgewoJaGVpZ2h0OiAxMDAlOwp9CgouZmMtdGltZS1hcmVhIC5mYy1zbGF0cyAuZmMtbWlub3IgewoJYm9yZGVyLXN0eWxlOiBkb3R0ZWQ7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRkIHsKCWJvcmRlci13aWR0aDogMCAxcHg7IC8qIG5lZWQgdG8gZG8gdGhpcy4gc29tZXRpbWVzIC0xIG1hcmdpbiB3b3VsZG4ndCBoaWRlIHRoZSBkb3R0ZWQgKi8KfQoKLmZjLWx0ciAuZmMtdGltZS1hcmVhIC5mYy1zbGF0cyB0ZCB7Cglib3JkZXItcmlnaHQtd2lkdGg6IDA7Cn0KLmZjLXJ0bCAuZmMtdGltZS1hcmVhIC5mYy1zbGF0cyB0ZCB7Cglib3JkZXItbGVmdC13aWR0aDogMDsKfQoKLyogYm9keSBjb250ZW50IGNvbnRhaW5lcnMKICAgY2FuIGJlIHdpdGhpbiByb3dzIG9yIGRpcmVjdGx5IHdpdGhpbiB0aGUgcGFuZSdzIGNvbnRlbnQKKi8KCi5mYy10aW1lLWFyZWEgLmZjLWJnZXZlbnQtY29udGFpbmVyLAouZmMtdGltZS1hcmVhIC5mYy1oaWdobGlnaHQtY29udGFpbmVyIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDI7IC8qIG9ubHkgZm9yIGRpcmVjdGx5IHdpdGhpbiBwYW5lLiBub3QgZm9yIHJvdy4gb3ZlcnJpZGRlbiBsYXRlciAqLwoJdG9wOiAwOwoJYm90dG9tOiAwOwoJd2lkdGg6IDA7Cn0KCi5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtaGVscGVyLWNvbnRhaW5lciwgLyogb25seSB3aXRoaW4gcm93ICovCi5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudC1jb250YWluZXIsCi5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7CglsZWZ0OiAwOwp9Ci5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtaGVscGVyLWNvbnRhaW5lciwgLyogb25seSB3aXRoaW4gcm93ICovCi5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudC1jb250YWluZXIsCi5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7CglyaWdodDogMDsKfQoKLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudCwKLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0IHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMDsKCWJvdHRvbTogMDsKfQoKLyogYm9keSByZXNvdXJjZSByb3dzICovCgouZmMtdGltZS1hcmVhIC5mYy1yb3dzIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDM7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLXJvd3MgLnVpLXdpZGdldC1jb250ZW50IHsKCWJhY2tncm91bmQ6IG5vbmU7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLXJvd3MgdGQgPiBkaXYgewoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZmMtdGltZS1hcmVhIC5mYy1yb3dzIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciwKLmZjLXRpbWUtYXJlYSAuZmMtcm93cyAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7Cgl6LWluZGV4OiAxOwp9CgouZmMtdGltZS1hcmVhIC5mYy1ldmVudC1jb250YWluZXIgewoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMjsgLyogYWJvdmUgYmdldmVudCBhbmQgaGlnaGxpZ2h0ICovCgl3aWR0aDogMDsgLyogZm9yIGV2ZW50IHBvc2l0aW9uaW5nLiB3aWxsIGVuZCB1cCBvbiBjb3JyZWN0IHNpZGUgYmFzZWQgb24gZGlyICovCn0KCi5mYy10aW1lLWFyZWEgLmZjLWhlbHBlci1jb250YWluZXIgeyAvKiBhbHNvIGFuIGZjLWV2ZW50LWNvbnRhaW5lciAqLwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMzsKCXRvcDogMDsKfQoKLmZjLXRpbWUtYXJlYSAuZmMtZXZlbnQtY29udGFpbmVyIHsKCXBhZGRpbmctYm90dG9tOiA4cHg7Cgl0b3A6IC0xcHg7Cn0KCi5mYy10aW1lLWFyZWEgdHI6Zmlyc3QtY2hpbGQgLmZjLWV2ZW50LWNvbnRhaW5lciB7Cgl0b3A6IDA7Cn0KCi5mYy1uby1vdmVybGFwIC5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lciB7CglwYWRkaW5nLWJvdHRvbTogMDsKCXRvcDogMDsKfQoKCi8qIE5vdyBJbmRpY2F0b3IKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWVsaW5lIC5mYy1ub3ctaW5kaWNhdG9yIHsgLyogYm90aCB0aGUgYXJyb3cgYW5kIHRoZSBsaW5lICovCgl6LWluZGV4OiAzOyAvKiBvbmUgYWJvdmUgc2Nyb2xsZXIncyBmYy1jb250ZW50ICovCgl0b3A6IDA7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLW5vdy1pbmRpY2F0b3ItYXJyb3cgewoJbWFyZ2luOiAwIC02cHg7IC8qIDUsIHRoZW4gb25lIG1vcmUgdG8gY291bnRlcmFjdCBzY3JvbGxlcidzIG5lZ2F0aXZlIG1hcmdpbnMgKi8KCS8qIHRyaWFuZ2xlIHBvaW50aW5nIGRvd24uLi4gKi8KCWJvcmRlci13aWR0aDogNnB4IDVweCAwIDVweDsKCWJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKCWJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLW5vdy1pbmRpY2F0b3ItbGluZSB7CgltYXJnaW46IDAgLTFweDsgLyogY291bnRlcmFjdCBzY3JvbGxlcidzIG5lZ2F0aXZlIG1hcmdpbnMgKi8KCWJvdHRvbTogMDsKCWJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7Cn0KCgovKiBUaW1lIEdyaWQgRXZlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy10aW1lbGluZS1ldmVudCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3JkZXItcmFkaXVzOiAwOwoJcGFkZGluZzogMnB4IDA7CgltYXJnaW4tYm90dG9tOiAxcHg7Cn0KCi5mYy1uby1vdmVybGFwIC5mYy10aW1lbGluZS1ldmVudCB7CglwYWRkaW5nOiA1cHggMDsKCW1hcmdpbi1ib3R0b206IDA7Cn0KCi8qIGRvbid0IG92ZXJsYXAgZ3JpZCBsaW5lcyBhdCB0aGUgZXZlbnQncyBlbmQgKi8KLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQgeyBtYXJnaW4tcmlnaHQ6IDFweCB9Ci5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50IHsgbWFyZ2luLWxlZnQ6IDFweCB9CgouZmMtdGltZWxpbmUtZXZlbnQgLmZjLWNvbnRlbnQgewoJcGFkZGluZzogMCAxcHg7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1lIHsKCWZvbnQtd2VpZ2h0OiBib2xkOwoJcGFkZGluZzogMCAxcHg7Cn0KCi5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1lIHsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsgLyogd2lsbCBmb3JjZSBpdCBvbiB0aGUgb3RoZXIgc2lkZSAqLwp9CgouZmMtdGltZWxpbmUtZXZlbnQgLmZjLXRpdGxlIHsKCXBhZGRpbmc6IDAgMXB4Owp9CgouZmMtdGltZWxpbmUtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWJnIHsKCWRpc3BsYXk6IG5vbmU7IC8qIGhpZGUgc2VtaS13aGl0ZSBiYWNrZ3JvdW5kLCB0byBhcHBlYXIgZGFya2VyICovCn0KCgovKiBmb2xsb3dlciBsb2dpYyAqLwoKCi5mYy1sdHIgLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZSB7CglwYWRkaW5nLWxlZnQ6IDEwcHg7CgltYXJnaW4tbGVmdDogLThweDsKfQouZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUgewoJcGFkZGluZy1yaWdodDogMTBweDsKCW1hcmdpbi1yaWdodDogLThweDsKfQoKLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZSB7CgltYXJnaW4tbGVmdDogLTJweDsKfQouZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxlIHsKCW1hcmdpbi1yaWdodDogLTJweDsKfQoKLmZjLXRpbWVsaW5lLWV2ZW50LmZjLW5vdC1zdGFydCAuZmMtdGl0bGUsCi5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZyB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxlOmJlZm9yZSwKLmZjLWJvZHkgLmZjLXRpbWUtYXJlYSAuZmMtZm9sbG93aW5nOmJlZm9yZSB7IC8qIGdlbmVyaWMgYXJyb3cgKi8KCWNvbnRlbnQ6ICIiOwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiA1MCU7CgltYXJnaW4tdG9wOiAtNXB4OwoJYm9yZGVyOiA1cHggc29saWQgIzAwMDsKCWJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwoJYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7CglvcGFjaXR5OiAuNTsKfQoKLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZTpiZWZvcmUsCi5mYy1sdHIgLmZjLWJvZHkgLmZjLXRpbWUtYXJlYSAuZmMtZm9sbG93aW5nOmJlZm9yZSB7IC8qIExUUi4gbGVmdCBwb2ludGluZyBhcnJvdyAqLwoJYm9yZGVyLWxlZnQ6IDA7CglsZWZ0OiAycHg7Cn0KCi5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50LmZjLW5vdC1zdGFydCAuZmMtdGl0bGU6YmVmb3JlLAouZmMtcnRsIC5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZzpiZWZvcmUgeyAvKiBSVEwuIHJpZ2h0IHBvaW50aW5nIGFycm93ICovCglib3JkZXItcmlnaHQ6IDA7CglyaWdodDogMnB4Owp9CgoKLyogTGljZW5zZSBNZXNzYWdlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1saWNlbnNlLW1lc3NhZ2UgewoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogOTk5OTk7Cglib3R0b206IDFweDsKCWxlZnQ6IDFweDsKCWJhY2tncm91bmQ6ICNlZWU7Cglib3JkZXItY29sb3I6ICNkZGQ7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHggMXB4IDAgMDsKCXBhZGRpbmc6IDJweCA0cHg7Cglmb250LXNpemU6IDEycHg7Cglib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4Owp9Cg==
LyohCiAqIEZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgdjEuNC4wCiAqIERvY3MgJiBMaWNlbnNlOiBodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLy5mYy1yZXNvdXJjZS1hcmVhIC5mYy1jZWxsLWNvbnRlbnQsLmZjLXRpbWVsaW5lIC5mYy1jZWxsLXRleHR7cGFkZGluZy1sZWZ0OjRweDtwYWRkaW5nLXJpZ2h0OjRweH0uZmMtcmVzb3VyY2UtYXJlYSB0aD5kaXYsLmZjLXNjcm9sbGVyLWNhbnZhcywuZmMtc2Nyb2xsZXItY2FudmFzPi5mYy1jb250ZW50LC5mYy1zY3JvbGxlci1jbGlwe3Bvc2l0aW9uOnJlbGF0aXZlfS5mYy1zY3JvbGxlci1jbGlwLC5mYy10aW1lbGluZSAuZmMtY2VsbC1jb250ZW50LHRyLmZjLWNvbGxhcHNlZD50ZCx0ci5mYy10cmFuc2l0aW9uaW5nPnRke292ZXJmbG93OmhpZGRlbn0uZmMtbm8tc2Nyb2xsYmFyc3tiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMCl9LmZjLXRpbWVsaW5lIC5mYy1ib2R5IC5mYy1kaXZpZGVyLnVpLXdpZGdldC1oZWFkZXIsLmZjLXRpbWVsaW5lIC5mYy1ib2R5IC51aS13aWRnZXQtY29udGVudHtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmZjLW5vLXNjcm9sbGJhcnM6Oi13ZWJraXQtc2Nyb2xsYmFye3dpZHRoOjA7aGVpZ2h0OjB9LmZjLXNjcm9sbGVyLWNhbnZhc3tib3gtc2l6aW5nOmJvcmRlci1ib3g7bWluLWhlaWdodDoxMDAlfS5mYy1zY3JvbGxlci1jYW52YXM+LmZjLWJne3otaW5kZXg6MX0uZmMtc2Nyb2xsZXItY2FudmFzPi5mYy1jb250ZW50e3otaW5kZXg6Mjtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjB9LnVpLXdpZGdldCAuZmMtc2Nyb2xsZXItY2FudmFzPi5mYy1jb250ZW50e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uZmMtc2Nyb2xsZXItY2FudmFzLmZjLWd1dHRlci1sZWZ0Pi5mYy1jb250ZW50e2JvcmRlci1sZWZ0LXdpZHRoOjFweDttYXJnaW4tbGVmdDotMXB4fS5mYy1zY3JvbGxlci1jYW52YXMuZmMtZ3V0dGVyLXJpZ2h0Pi5mYy1jb250ZW50e2JvcmRlci1yaWdodC13aWR0aDoxcHg7bWFyZ2luLXJpZ2h0Oi0xcHh9LmZjLXNjcm9sbGVyLWNhbnZhcy5mYy1ndXR0ZXItdG9wPi5mYy1jb250ZW50e2JvcmRlci10b3Atd2lkdGg6MXB4O21hcmdpbi10b3A6LTFweH0uZmMtc2Nyb2xsZXItY2FudmFzLmZjLWd1dHRlci1ib3R0b20+LmZjLWNvbnRlbnR7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7bWFyZ2luLWJvdHRvbTotMXB4fS5mYy1ydGwgLmZjLXRpbWVsaW5le2RpcmVjdGlvbjpydGx9LmZjLXRpbWVsaW5lIC5mYy1kaXZpZGVye3dpZHRoOjNweDtib3JkZXItc3R5bGU6ZG91YmxlfS5mYy10aW1lbGluZSAuZmMtaGVhZD50cj4uZmMtZGl2aWRlcntib3JkZXItYm90dG9tOjB9LmZjLXRpbWVsaW5lIC5mYy1ib2R5PnRyPi5mYy1kaXZpZGVye2JvcmRlci10b3A6MH0uZmMtc2Nyb2xsZWQgLmZjLWhlYWQgLmZjLXNjcm9sbGVye3otaW5kZXg6Mn0uZmMtdGltZWxpbmUuZmMtc2Nyb2xsZWQgLmZjLWhlYWQgLmZjLXNjcm9sbGVye2JveC1zaGFkb3c6MCAzcHggNHB4IHJnYmEoMCwwLDAsLjA3NSl9LmZjLXRpbWVsaW5lIC5mYy1ib2R5IC5mYy1zY3JvbGxlcnt6LWluZGV4OjF9LmZjLXRpbWVsaW5lIC5mYy1zY3JvbGxlci1jYW52YXM+ZGl2PmRpdj50YWJsZSwuZmMtdGltZWxpbmUgLmZjLXNjcm9sbGVyLWNhbnZhcz5kaXY+dGFibGV7Ym9yZGVyLXN0eWxlOmhpZGRlbn0uZmMtdGltZWxpbmUgdGQsLmZjLXRpbWVsaW5lIHRoe3doaXRlLXNwYWNlOm5vd3JhcH0uZmMtdGltZWxpbmUgLmZjLWNvbC1yZXNpemVye2N1cnNvcjpjb2wtcmVzaXplfS5mYy10aW1lbGluZSB0aHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZjLXRpbWVsaW5lIC5mYy1oZWFkIC5mYy1jZWxsLWNvbnRlbnR7cGFkZGluZy10b3A6M3B4O3BhZGRpbmctYm90dG9tOjNweH0uZmMtcmVzb3VyY2UtYXJlYXt3aWR0aDozMCV9LmZjLXJlc291cmNlLWFyZWEgY29se3dpZHRoOjQwJTttaW4td2lkdGg6NzBweH0uZmMtcmVzb3VyY2UtYXJlYSBjb2wuZmMtbWFpbi1jb2x7d2lkdGg6NjAlfS5mYy1mbGF0IC5mYy1leHBhbmRlci1zcGFjZXtkaXNwbGF5Om5vbmV9LmZjLWx0ciAuZmMtcmVzb3VyY2UtYXJlYSB0cj4qe3RleHQtYWxpZ246bGVmdH0uZmMtcnRsIC5mYy1yZXNvdXJjZS1hcmVhIHRyPip7dGV4dC1hbGlnbjpyaWdodH0uZmMtcmVzb3VyY2UtYXJlYSAuZmMtc3VwZXIgdGh7dGV4dC1hbGlnbjpjZW50ZXJ9LmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNlbGwtY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVyLC5mYy10aW1lLWFyZWEgLmZjLWJnZXZlbnQsLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LC5mYy10aW1lLWFyZWEgLmZjLXNsYXRze3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowfS5mYy1yZXNvdXJjZS1hcmVhIHRoIC5mYy1jb2wtcmVzaXplcnt6LWluZGV4OjI7d2lkdGg6NXB4fS5mYy1sdHIgLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVye3JpZ2h0Oi0zcHh9LmZjLXJ0bCAuZmMtcmVzb3VyY2UtYXJlYSB0aCAuZmMtY29sLXJlc2l6ZXJ7bGVmdDotM3B4fXRyLmZjLXRyYW5zaXRpb25pbmc+dGQ+ZGl2e3RyYW5zaXRpb246bWFyZ2luLXRvcCAuMnN9dHIuZmMtY29sbGFwc2VkPnRkPmRpdnttYXJnaW4tdG9wOi0xMHB4fS5mYy1ib2R5IC5mYy1yZXNvdXJjZS1hcmVhIC5mYy1jZWxsLWNvbnRlbnR7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0uZmMtbm8tb3ZlcmxhcCAuZmMtYm9keSAuZmMtcmVzb3VyY2UtYXJlYSAuZmMtY2VsbC1jb250ZW50e3BhZGRpbmctdG9wOjVweDtwYWRkaW5nLWJvdHRvbTo1cHh9LmZjLXJlc291cmNlLWFyZWEgLmZjLWljb257d2lkdGg6MWVtO2ZvbnQtc2l6ZTouOWVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tdG9wOi0xJX0uZmMtcmVzb3VyY2UtYXJlYSAuZmMtZXhwYW5kZXJ7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY2Nn0uZmMtdGltZS1hcmVhIGNvbHttaW4td2lkdGg6Mi4yZW19LmZjLWx0ciAuZmMtdGltZS1hcmVhIC5mYy1jaHJvbm8gdGh7dGV4dC1hbGlnbjpsZWZ0fS5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtY2hyb25vIHRoe3RleHQtYWxpZ246cmlnaHR9LmZjLXRpbWUtYXJlYSAuZmMtc2xhdHN7ei1pbmRleDoxO2xlZnQ6MDtyaWdodDowfS5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRhYmxle2hlaWdodDoxMDAlfS5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIC5mYy1taW5vcntib3JkZXItc3R5bGU6ZG90dGVkfS5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRke2JvcmRlci13aWR0aDowIDFweH0uZmMtbHRyIC5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRke2JvcmRlci1yaWdodC13aWR0aDowfS5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtc2xhdHMgdGR7Ym9yZGVyLWxlZnQtd2lkdGg6MH0uZmMtdGltZS1hcmVhIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciwuZmMtdGltZS1hcmVhIC5mYy1oaWdobGlnaHQtY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6MDtib3R0b206MDt3aWR0aDowfS5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudC1jb250YWluZXIsLmZjLWx0ciAuZmMtdGltZS1hcmVhIC5mYy1oZWxwZXItY29udGFpbmVyLC5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lcntsZWZ0OjB9LmZjLXJ0bCAuZmMtdGltZS1hcmVhIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciwuZmMtcnRsIC5mYy10aW1lLWFyZWEgLmZjLWhlbHBlci1jb250YWluZXIsLmZjLXJ0bCAuZmMtdGltZS1hcmVhIC5mYy1oaWdobGlnaHQtY29udGFpbmVye3JpZ2h0OjB9LmZjLXRpbWUtYXJlYSAuZmMtcm93c3twb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjN9LmZjLXRpbWUtYXJlYSAuZmMtcm93cyAudWktd2lkZ2V0LWNvbnRlbnR7YmFja2dyb3VuZDowIDB9LmZjLXRpbWUtYXJlYSAuZmMtcm93cyB0ZD5kaXZ7cG9zaXRpb246cmVsYXRpdmV9LmZjLXRpbWUtYXJlYSAuZmMtcm93cyAuZmMtYmdldmVudC1jb250YWluZXIsLmZjLXRpbWUtYXJlYSAuZmMtcm93cyAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lcnt6LWluZGV4OjF9LmZjLXRpbWUtYXJlYSAuZmMtZXZlbnQtY29udGFpbmVye3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Mjt3aWR0aDowfS5mYy10aW1lLWFyZWEgLmZjLWhlbHBlci1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDozO3RvcDowfS5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lcntwYWRkaW5nLWJvdHRvbTo4cHg7dG9wOi0xcHh9LmZjLXRpbWUtYXJlYSB0cjpmaXJzdC1jaGlsZCAuZmMtZXZlbnQtY29udGFpbmVye3RvcDowfS5mYy1uby1vdmVybGFwIC5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lcntwYWRkaW5nLWJvdHRvbTowO3RvcDowfS5mYy10aW1lbGluZSAuZmMtbm93LWluZGljYXRvcnt6LWluZGV4OjM7dG9wOjB9LmZjLXRpbWUtYXJlYSAuZmMtbm93LWluZGljYXRvci1hcnJvd3ttYXJnaW46MCAtNnB4O2JvcmRlci13aWR0aDo2cHggNXB4IDA7Ym9yZGVyLWxlZnQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5mYy10aW1lLWFyZWEgLmZjLW5vdy1pbmRpY2F0b3ItbGluZXttYXJnaW46MCAtMXB4O2JvdHRvbTowO2JvcmRlci1sZWZ0LXdpZHRoOjFweH0uZmMtdGltZWxpbmUtZXZlbnR7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czowO3BhZGRpbmc6MnB4IDA7bWFyZ2luLWJvdHRvbToxcHh9LmZjLW5vLW92ZXJsYXAgLmZjLXRpbWVsaW5lLWV2ZW50e3BhZGRpbmc6NXB4IDA7bWFyZ2luLWJvdHRvbTowfS5mYy1sdHIgLmZjLXRpbWVsaW5lLWV2ZW50e21hcmdpbi1yaWdodDoxcHh9LmZjLXJ0bCAuZmMtdGltZWxpbmUtZXZlbnR7bWFyZ2luLWxlZnQ6MXB4fS5mYy10aW1lbGluZS1ldmVudCAuZmMtY29udGVudHtwYWRkaW5nOjAgMXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW59LmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1le2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOjAgMXB4fS5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1le2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGV7cGFkZGluZzowIDFweH0uZmMtdGltZWxpbmUtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWJne2Rpc3BsYXk6bm9uZX0uZmMtbHRyIC5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGV7cGFkZGluZy1sZWZ0OjEwcHg7bWFyZ2luLWxlZnQ6LThweH0uZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGV7cGFkZGluZy1yaWdodDoxMHB4O21hcmdpbi1yaWdodDotOHB4fS5mYy1sdHIgLmZjLXRpbWVsaW5lLWV2ZW50LmZjLW5vdC1zdGFydCAuZmMtdGl0bGV7bWFyZ2luLWxlZnQ6LTJweH0uZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxle21hcmdpbi1yaWdodDotMnB4fS5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZywuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZXtwb3NpdGlvbjpyZWxhdGl2ZX0uZmMtYm9keSAuZmMtdGltZS1hcmVhIC5mYy1mb2xsb3dpbmc6YmVmb3JlLC5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxlOmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bWFyZ2luLXRvcDotNXB4O2JvcmRlcjo1cHggc29saWQgIzAwMDtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnQ7b3BhY2l0eTouNX0uZmMtbHRyIC5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZzpiZWZvcmUsLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZTpiZWZvcmV7Ym9yZGVyLWxlZnQ6MDtsZWZ0OjJweH0uZmMtcnRsIC5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZzpiZWZvcmUsLmZjLXJ0bCAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZTpiZWZvcmV7Ym9yZGVyLXJpZ2h0OjA7cmlnaHQ6MnB4fS5mYy1saWNlbnNlLW1lc3NhZ2V7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDo5OTk5OTtib3R0b206MXB4O2xlZnQ6MXB4O2JhY2tncm91bmQ6I2VlZTtib3JkZXItY29sb3I6I2RkZDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjFweCAxcHggMCAwO3BhZGRpbmc6MnB4IDRweDtmb250LXNpemU6MTJweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHh9
LyoqKgpTcGVjdHJ1bSBDb2xvcnBpY2tlciB2MS44LjAKaHR0cHM6Ly9naXRodWIuY29tL2Jncmlucy9zcGVjdHJ1bQpBdXRob3I6IEJyaWFuIEdyaW5zdGVhZApMaWNlbnNlOiBNSVQKKioqLwoKLnNwLWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgbGVmdDowOwogICAgZGlzcGxheTppbmxpbmUtYmxvY2s7CiAgICAqZGlzcGxheTogaW5saW5lOwogICAgKnpvb206IDE7CiAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vYmdyaW5zL3NwZWN0cnVtL2lzc3Vlcy80MCAqLwogICAgei1pbmRleDogOTk5OTk5NDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KLnNwLWNvbnRhaW5lci5zcC1mbGF0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLyogRml4IGZvciAqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfSAqLwouc3AtY29udGFpbmVyLAouc3AtY29udGFpbmVyICogewogICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7CiAgICAgICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94Owp9CgovKiBodHRwOi8vYW5zY2lhdGgudHVtYmxyLmNvbS9wb3N0LzczNDc0OTU4NjkvY3NzLWFzcGVjdC1yYXRpbyAqLwouc3AtdG9wIHsKICBwb3NpdGlvbjpyZWxhdGl2ZTsKICB3aWR0aDogMTAwJTsKICBkaXNwbGF5OmlubGluZS1ibG9jazsKfQouc3AtdG9wLWlubmVyIHsKICAgcG9zaXRpb246YWJzb2x1dGU7CiAgIHRvcDowOwogICBsZWZ0OjA7CiAgIGJvdHRvbTowOwogICByaWdodDowOwp9Ci5zcC1jb2xvciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6MDsKICAgIGxlZnQ6MDsKICAgIGJvdHRvbTowOwogICAgcmlnaHQ6MjAlOwp9Ci5zcC1odWUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOjA7CiAgICByaWdodDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0Ojg0JTsKICAgIGhlaWdodDogMTAwJTsKfQoKLnNwLWNsZWFyLWVuYWJsZWQgLnNwLWh1ZSB7CiAgICB0b3A6MzNweDsKICAgIGhlaWdodDogNzcuNSU7Cn0KCi5zcC1maWxsIHsKICAgIHBhZGRpbmctdG9wOiA4MCU7Cn0KLnNwLXNhdCwgLnNwLXZhbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6MDsKICAgIGxlZnQ6MDsKICAgIHJpZ2h0OjA7CiAgICBib3R0b206MDsKfQoKLnNwLWFscGhhLWVuYWJsZWQgLnNwLXRvcCB7CiAgICBtYXJnaW4tYm90dG9tOiAxOHB4Owp9Ci5zcC1hbHBoYS1lbmFibGVkIC5zcC1hbHBoYSB7CiAgICBkaXNwbGF5OiBibG9jazsKfQouc3AtYWxwaGEtaGFuZGxlIHsKICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgdG9wOi00cHg7CiAgICBib3R0b206IC00cHg7CiAgICB3aWR0aDogNnB4OwogICAgbGVmdDogNTAlOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgIG9wYWNpdHk6IC44Owp9Ci5zcC1hbHBoYSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAtMTRweDsKICAgIHJpZ2h0OiAwOwogICAgbGVmdDogMDsKICAgIGhlaWdodDogOHB4Owp9Ci5zcC1hbHBoYS1pbm5lciB7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjMzMzOwp9Cgouc3AtY2xlYXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLnNwLWNsZWFyLnNwLWNsZWFyLWRpc3BsYXkgewogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwp9Cgouc3AtY2xlYXItZW5hYmxlZCAuc3AtY2xlYXIgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowcHg7CiAgICByaWdodDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0Ojg0JTsKICAgIGhlaWdodDogMjhweDsKfQoKLyogRG9uJ3QgYWxsb3cgdGV4dCBzZWxlY3Rpb24gKi8KLnNwLWNvbnRhaW5lciwgLnNwLXJlcGxhY2VyLCAuc3AtcHJldmlldywgLnNwLWRyYWdnZXIsIC5zcC1zbGlkZXIsIC5zcC1hbHBoYSwgLnNwLWNsZWFyLCAuc3AtYWxwaGEtaGFuZGxlLCAuc3AtY29udGFpbmVyLnNwLWRyYWdnaW5nIC5zcC1pbnB1dCwgLnNwLWNvbnRhaW5lciBidXR0b24gIHsKICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsKICAgIC1tb3otdXNlci1zZWxlY3Q6IC1tb3otbm9uZTsKICAgIC1vLXVzZXItc2VsZWN0Om5vbmU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnNwLWNvbnRhaW5lci5zcC1pbnB1dC1kaXNhYmxlZCAuc3AtaW5wdXQtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLnNwLWNvbnRhaW5lci5zcC1idXR0b25zLWRpc2FibGVkIC5zcC1idXR0b24tY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLnNwLWNvbnRhaW5lci5zcC1wYWxldHRlLWJ1dHRvbnMtZGlzYWJsZWQgLnNwLXBhbGV0dGUtYnV0dG9uLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5zcC1wYWxldHRlLW9ubHkgLnNwLXBpY2tlci1jb250YWluZXIgewogICAgZGlzcGxheTogbm9uZTsKfQouc3AtcGFsZXR0ZS1kaXNhYmxlZCAuc3AtcGFsZXR0ZS1jb250YWluZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLnNwLWluaXRpYWwtZGlzYWJsZWQgLnNwLWluaXRpYWwgewogICAgZGlzcGxheTogbm9uZTsKfQoKCi8qIEdyYWRpZW50cyBmb3IgaHVlLCBzYXR1cmF0aW9uIGFuZCB2YWx1ZSBpbnN0ZWFkIG9mIGltYWdlcy4gIE5vdCBwcmV0dHkuLi4gYnV0IGl0IHdvcmtzICovCi5zcC1zYXQgewogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsICAwIDAsIDEwMCUgMCwgZnJvbSgjRkZGKSwgdG8ocmdiYSgyMDQsIDE1NCwgMTI5LCAwKSkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgI0ZGRiwgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCAjZmZmLCByZ2JhKDIwNCwgMTU0LCAxMjksIDApKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCAjZmZmLCByZ2JhKDIwNCwgMTU0LCAxMjksIDApKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgI2ZmZiwgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICNmZmYsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgLW1zLWZpbHRlcjogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGUgPSAxLCBzdGFydENvbG9yc3RyPSNGRkZGRkZGRiwgZW5kQ29sb3JzdHI9IzAwQ0M5QTgxKSI7CiAgICBmaWx0ZXIgOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoR3JhZGllbnRUeXBlID0gMSwgc3RhcnRDb2xvcnN0cj0nI0ZGRkZGRkZGJywgZW5kQ29sb3JzdHI9JyMwMENDOUE4MScpOwp9Ci5zcC12YWwgewogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAgMTAwJSwgMCAwLCBmcm9tKCMwMDAwMDApLCB0byhyZ2JhKDIwNCwgMTU0LCAxMjksIDApKSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChib3R0b20sICMwMDAwMDAsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoYm90dG9tLCAjMDAwLCByZ2JhKDIwNCwgMTU0LCAxMjksIDApKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChib3R0b20sICMwMDAsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudChib3R0b20sICMwMDAsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgIzAwMCwgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7CiAgICAtbXMtZmlsdGVyOiAicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9IzAwQ0M5QTgxLCBlbmRDb2xvcnN0cj0jRkYwMDAwMDApIjsKICAgIGZpbHRlciA6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjMDBDQzlBODEnLCBlbmRDb2xvcnN0cj0nI0ZGMDAwMDAwJyk7Cn0KCi5zcC1odWUgewogICAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZmYwMDAwIDAlLCAjZmZmZjAwIDE3JSwgIzAwZmYwMCAzMyUsICMwMGZmZmYgNTAlLCAjMDAwMGZmIDY3JSwgI2ZmMDBmZiA4MyUsICNmZjAwMDAgMTAwJSk7CiAgICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmMDAwMCAwJSwgI2ZmZmYwMCAxNyUsICMwMGZmMDAgMzMlLCAjMDBmZmZmIDUwJSwgIzAwMDBmZiA2NyUsICNmZjAwZmYgODMlLCAjZmYwMDAwIDEwMCUpOwogICAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmMDAwMCAwJSwgI2ZmZmYwMCAxNyUsICMwMGZmMDAgMzMlLCAjMDBmZmZmIDUwJSwgIzAwMDBmZiA2NyUsICNmZjAwZmYgODMlLCAjZmYwMDAwIDEwMCUpOwogICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSgjZmYwMDAwKSwgY29sb3Itc3RvcCgwLjE3LCAjZmZmZjAwKSwgY29sb3Itc3RvcCgwLjMzLCAjMDBmZjAwKSwgY29sb3Itc3RvcCgwLjUsICMwMGZmZmYpLCBjb2xvci1zdG9wKDAuNjcsICMwMDAwZmYpLCBjb2xvci1zdG9wKDAuODMsICNmZjAwZmYpLCB0bygjZmYwMDAwKSk7CiAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZjAwMDAgMCUsICNmZmZmMDAgMTclLCAjMDBmZjAwIDMzJSwgIzAwZmZmZiA1MCUsICMwMDAwZmYgNjclLCAjZmYwMGZmIDgzJSwgI2ZmMDAwMCAxMDAlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNmZjAwMDAgMCUsICNmZmZmMDAgMTclLCAjMDBmZjAwIDMzJSwgIzAwZmZmZiA1MCUsICMwMDAwZmYgNjclLCAjZmYwMGZmIDgzJSwgI2ZmMDAwMCAxMDAlKTsKfQoKLyogSUUgZmlsdGVycyBkbyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBjb2xvciBzdG9wcy4KICAgR2VuZXJhdGUgNiBkaXZzLCBsaW5lIHRoZW0gdXAsIGFuZCBkbyB0d28gY29sb3IgZ3JhZGllbnRzIGZvciBlYWNoLgogICBZZXMsIHJlYWxseS4KICovCi5zcC0xIHsKICAgIGhlaWdodDoxNyU7CiAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmYwMDAwJywgZW5kQ29sb3JzdHI9JyNmZmZmMDAnKTsKfQouc3AtMiB7CiAgICBoZWlnaHQ6MTYlOwogICAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmZmYwMCcsIGVuZENvbG9yc3RyPScjMDBmZjAwJyk7Cn0KLnNwLTMgewogICAgaGVpZ2h0OjE3JTsKICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyMwMGZmMDAnLCBlbmRDb2xvcnN0cj0nIzAwZmZmZicpOwp9Ci5zcC00IHsKICAgIGhlaWdodDoxNyU7CiAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjMDBmZmZmJywgZW5kQ29sb3JzdHI9JyMwMDAwZmYnKTsKfQouc3AtNSB7CiAgICBoZWlnaHQ6MTYlOwogICAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nIzAwMDBmZicsIGVuZENvbG9yc3RyPScjZmYwMGZmJyk7Cn0KLnNwLTYgewogICAgaGVpZ2h0OjE3JTsKICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZjAwZmYnLCBlbmRDb2xvcnN0cj0nI2ZmMDAwMCcpOwp9Cgouc3AtaGlkZGVuIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLyogQ2xlYXJmaXggaGFjayAqLwouc3AtY2Y6YmVmb3JlLCAuc3AtY2Y6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogdGFibGU7IH0KLnNwLWNmOmFmdGVyIHsgY2xlYXI6IGJvdGg7IH0KLnNwLWNmIHsgKnpvb206IDE7IH0KCi8qIE1vYmlsZSBkZXZpY2VzLCBtYWtlIGh1ZSBzbGlkZXIgYmlnZ2VyIHNvIGl0IGlzIGVhc2llciB0byBzbGlkZSAqLwpAbWVkaWEgKG1heC1kZXZpY2Utd2lkdGg6IDQ4MHB4KSB7CiAgICAuc3AtY29sb3IgeyByaWdodDogNDAlOyB9CiAgICAuc3AtaHVlIHsgbGVmdDogNjMlOyB9CiAgICAuc3AtZmlsbCB7IHBhZGRpbmctdG9wOiA2MCU7IH0KfQouc3AtZHJhZ2dlciB7CiAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgaGVpZ2h0OiA1cHg7CiAgIHdpZHRoOiA1cHg7CiAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7CiAgIGJhY2tncm91bmQ6ICMwMDA7CiAgIGN1cnNvcjogcG9pbnRlcjsKICAgcG9zaXRpb246YWJzb2x1dGU7CiAgIHRvcDowOwogICBsZWZ0OiAwOwp9Ci5zcC1zbGlkZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOjA7CiAgICBjdXJzb3I6cG9pbnRlcjsKICAgIGhlaWdodDogM3B4OwogICAgbGVmdDogLTFweDsKICAgIHJpZ2h0OiAtMXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgb3BhY2l0eTogLjg7Cn0KCi8qClRoZW1lIGF1dGhvcnM6CkhlcmUgYXJlIHRoZSBiYXNpYyB0aGVtZWFibGUgZGlzcGxheSBvcHRpb25zIChjb2xvcnMsIGZvbnRzLCBnbG9iYWwgd2lkdGhzKS4KU2VlIGh0dHA6Ly9iZ3JpbnMuZ2l0aHViLmlvL3NwZWN0cnVtL3RoZW1lcy8gZm9yIGluc3RydWN0aW9ucy4KKi8KCi5zcC1jb250YWluZXIgewogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFQ0VDRUM7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjZjBjNDlCOwogICAgcGFkZGluZzogMDsKfQouc3AtY29udGFpbmVyLCAuc3AtY29udGFpbmVyIGJ1dHRvbiwgLnNwLWNvbnRhaW5lciBpbnB1dCwgLnNwLWNvbG9yLCAuc3AtaHVlLCAuc3AtY2xlYXIgewogICAgZm9udDogbm9ybWFsIDEycHggIkx1Y2lkYSBHcmFuZGUiLCAiTHVjaWRhIFNhbnMgVW5pY29kZSIsICJMdWNpZGEgU2FucyIsIEdlbmV2YSwgVmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tcy1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQouc3AtdG9wIHsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKfQouc3AtY29sb3IsIC5zcC1odWUsIC5zcC1jbGVhciB7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjNjY2Owp9CgovKiBJbnB1dCAqLwouc3AtaW5wdXQtY29udGFpbmVyIHsKICAgIGZsb2F0OnJpZ2h0OwogICAgd2lkdGg6IDEwMHB4OwogICAgbWFyZ2luLWJvdHRvbTogNHB4Owp9Ci5zcC1pbml0aWFsLWRpc2FibGVkICAuc3AtaW5wdXQtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5zcC1pbnB1dCB7CiAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICBib3JkZXI6IDFweCBpbnNldDsKICAgcGFkZGluZzogNHB4IDVweDsKICAgbWFyZ2luOiAwOwogICB3aWR0aDogMTAwJTsKICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudDsKICAgYm9yZGVyLXJhZGl1czogM3B4OwogICBjb2xvcjogIzIyMjsKfQouc3AtaW5wdXQ6Zm9jdXMgIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkIG9yYW5nZTsKfQouc3AtaW5wdXQuc3AtdmFsaWRhdGlvbi1lcnJvciB7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7CiAgICBiYWNrZ3JvdW5kOiAjZmRkOwp9Ci5zcC1waWNrZXItY29udGFpbmVyICwgLnNwLXBhbGV0dGUtY29udGFpbmVyIHsKICAgIGZsb2F0OmxlZnQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgcGFkZGluZy1ib3R0b206IDMwMHB4OwogICAgbWFyZ2luLWJvdHRvbTogLTI5MHB4Owp9Ci5zcC1waWNrZXItY29udGFpbmVyIHsKICAgIHdpZHRoOiAxNzJweDsKICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggI2ZmZjsKfQoKLyogUGFsZXR0ZXMgKi8KLnNwLXBhbGV0dGUtY29udGFpbmVyIHsKICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4ICNjY2M7Cn0KCi5zcC1wYWxldHRlLW9ubHkgLnNwLXBhbGV0dGUtY29udGFpbmVyIHsKICAgIGJvcmRlcjogMDsKfQoKLnNwLXBhbGV0dGUgLnNwLXRodW1iLWVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgcG9zaXRpb246cmVsYXRpdmU7CiAgICBmbG9hdDpsZWZ0OwogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDE1cHg7CiAgICBtYXJnaW46IDNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlcjpzb2xpZCAycHggdHJhbnNwYXJlbnQ7Cn0KLnNwLXBhbGV0dGUgLnNwLXRodW1iLWVsOmhvdmVyLCAuc3AtcGFsZXR0ZSAuc3AtdGh1bWItZWwuc3AtdGh1bWItYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogb3JhbmdlOwp9Ci5zcC10aHVtYi1lbCB7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKfQoKLyogSW5pdGlhbCAqLwouc3AtaW5pdGlhbCB7CiAgICBmbG9hdDogbGVmdDsKICAgIGJvcmRlcjogc29saWQgMXB4ICMzMzM7Cn0KLnNwLWluaXRpYWwgc3BhbiB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMjVweDsKICAgIGJvcmRlcjpub25lOwogICAgZGlzcGxheTpibG9jazsKICAgIGZsb2F0OmxlZnQ7CiAgICBtYXJnaW46MDsKfQoKLnNwLWluaXRpYWwgLnNwLWNsZWFyLWRpc3BsYXkgewogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwp9CgovKiBCdXR0b25zICovCi5zcC1wYWxldHRlLWJ1dHRvbi1jb250YWluZXIsCi5zcC1idXR0b24tY29udGFpbmVyIHsKICAgIGZsb2F0OiByaWdodDsKfQoKLyogUmVwbGFjZXIgKHRoZSBsaXR0bGUgcHJldmlldyBkaXYgdGhhdCBzaG93cyB1cCBpbnN0ZWFkIG9mIHRoZSA8aW5wdXQ+KSAqLwouc3AtcmVwbGFjZXIgewogICAgbWFyZ2luOjA7CiAgICBvdmVyZmxvdzpoaWRkZW47CiAgICBjdXJzb3I6cG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweDsKICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrOwogICAgKnpvb206IDE7CiAgICAqZGlzcGxheTogaW5saW5lOwogICAgYm9yZGVyOiBzb2xpZCAxcHggIzkxNzY1ZDsKICAgIGJhY2tncm91bmQ6ICNlZWU7CiAgICBjb2xvcjogIzMzMzsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLnNwLXJlcGxhY2VyOmhvdmVyLCAuc3AtcmVwbGFjZXIuc3AtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogI0YwQzQ5QjsKICAgIGNvbG9yOiAjMTExOwp9Ci5zcC1yZXBsYWNlci5zcC1kaXNhYmxlZCB7CiAgICBjdXJzb3I6ZGVmYXVsdDsKICAgIGJvcmRlci1jb2xvcjogc2lsdmVyOwogICAgY29sb3I6IHNpbHZlcjsKfQouc3AtZGQgewogICAgcGFkZGluZzogMnB4IDA7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTZweDsKICAgIGZsb2F0OmxlZnQ7CiAgICBmb250LXNpemU6MTBweDsKfQouc3AtcHJldmlldyB7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgIHdpZHRoOjI1cHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjMjIyOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBmbG9hdDpsZWZ0OwogICAgei1pbmRleDogMDsKfQoKLnNwLXBhbGV0dGUgewogICAgKndpZHRoOiAyMjBweDsKICAgIG1heC13aWR0aDogMjIwcHg7Cn0KLnNwLXBhbGV0dGUgLnNwLXRodW1iLWVsIHsKICAgIHdpZHRoOjE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBtYXJnaW46MnB4IDFweDsKICAgIGJvcmRlcjogc29saWQgMXB4ICNkMGQwZDA7Cn0KCi5zcC1jb250YWluZXIgewogICAgcGFkZGluZy1ib3R0b206MDsKfQoKCi8qIEJ1dHRvbnM6IGh0dHA6Ly9oZWxsb2hhcHB5Lm9yZy9jc3MzLWJ1dHRvbnMvICovCi5zcC1jb250YWluZXIgYnV0dG9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOwogIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZWVlZWVlLCAjY2NjY2NjKTsKICBiYWNrZ3JvdW5kLWltYWdlOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2JiYjsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgY29sb3I6ICMzMzM7CiAgZm9udC1zaXplOiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxOwogIHBhZGRpbmc6IDVweCA0cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHRleHQtc2hhZG93OiAwIDFweCAwICNlZWU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQouc3AtY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOwogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZGRkZGRkLCAjYmJiYmJiKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2RkZGRkZCwgI2JiYmJiYik7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2RkZGRkZCwgI2JiYmJiYik7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjZGRkZGRkLCAjYmJiYmJiKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNkZGRkZGQsICNiYmJiYmIpOwogICAgYm9yZGVyOiAxcHggc29saWQgI2JiYjsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjOTk5OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2RkZDsKfQouc3AtY29udGFpbmVyIGJ1dHRvbjphY3RpdmUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjODg4OwogICAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgNXB4IDJweCAjYWFhYWFhLCAwIDFweCAwIDAgI2VlZWVlZTsKICAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAwIDVweCAycHggI2FhYWFhYSwgMCAxcHggMCAwICNlZWVlZWU7CiAgICAtbXMtYm94LXNoYWRvdzogaW5zZXQgMCAwIDVweCAycHggI2FhYWFhYSwgMCAxcHggMCAwICNlZWVlZWU7CiAgICAtby1ib3gtc2hhZG93OiBpbnNldCAwIDAgNXB4IDJweCAjYWFhYWFhLCAwIDFweCAwIDAgI2VlZWVlZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCA1cHggMnB4ICNhYWFhYWEsIDAgMXB4IDAgMCAjZWVlZWVlOwp9Ci5zcC1jYW5jZWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6ICNkOTNmM2YgIWltcG9ydGFudDsKICAgIG1hcmdpbjowOwogICAgcGFkZGluZzoycHg7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKCn0KLnNwLWNhbmNlbDpob3ZlciB7CiAgICBjb2xvcjogI2Q5M2YzZiAhaW1wb3J0YW50OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KCgouc3AtcGFsZXR0ZSBzcGFuOmhvdmVyLCAuc3AtcGFsZXR0ZSBzcGFuLnNwLXRodW1iLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6ICMwMDA7Cn0KCi5zcC1wcmV2aWV3LCAuc3AtYWxwaGEsIC5zcC10aHVtYi1lbCB7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUF3QUFBQU1DQUlBQUFEWkY4dXdBQUFBR1VsRVFWUVlWMk00Z3dIK1l3Q0dJYXNJVXdoVDI1QlZCQUR0ellOWXJIdnY0Z0FBQUFCSlJVNUVya0pnZ2c9PSk7Cn0KLnNwLXByZXZpZXctaW5uZXIsIC5zcC1hbHBoYS1pbm5lciwgLnNwLXRodW1iLWlubmVyIHsKICAgIGRpc3BsYXk6YmxvY2s7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowO2xlZnQ6MDtib3R0b206MDtyaWdodDowOwp9Cgouc3AtcGFsZXR0ZSAuc3AtdGh1bWItaW5uZXIgewogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KCi5zcC1wYWxldHRlIC5zcC10aHVtYi1saWdodC5zcC10aHVtYi1hY3RpdmUgLnNwLXRodW1iLWlubmVyIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJJQUFBQVNDQVlBQUFCV3pvNVhBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUlWSlJFRlVlTnBpWUJoc2dKRk1mZnhBWEFCbE41SnJ1VDRRM3dmaS8wRHNUNjRoOFVEOEhtcElQQ1dHL0tlbUlmT0pDVUIrQW9hY3g2RUdCWnlIQnFJK1dzREN3dVE5bWh4ZWcyQTIxME50Zm84a2xrOXNPTWlqYVVSbTd5YzFVUDJSTkNNYktFOU9ESzFITTZpZWdZTGtmeDhwbGlnQzlsQ0Q3S21Sb2YwWmhqUUFDREFBY2VvdnJ0cFZCUmtBQUFBQVNVVk9SSzVDWUlJPSk7Cn0KCi5zcC1wYWxldHRlIC5zcC10aHVtYi1kYXJrLnNwLXRodW1iLWFjdGl2ZSAuc3AtdGh1bWItaW5uZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQklBQUFBU0NBWUFBQUJXem81WEFBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4and2OFlRVUFBQUFKY0VoWmN3QUFEc01BQUE3REFjZHZxR1FBQUFBYWRFVllkRk52Wm5SM1lYSmxBRkJoYVc1MExrNUZWQ0IyTXk0MUxqRXdNUFJ5b1FBQUFNZEpSRUZVT0UrdGtnc053ekFNUk11Z0VBYWhFQWFoRUFaaEVBcWxFQVpoRUFvaEVBWWg4MVgyZEltOGZLcEVzcExHdnVkUE9zVVlweEUyQklKQ3JvSm1FVzlxSitNS2FCRmhFTU5hYlN5OW9JY0lQd3JCK2FmdkFVRm9LNEgwdE1hUTNYdGxyZ2dEaE9WVk11VDRFNU1NRzBGQmJDRVl6allUN094TEV2SUhRTFkyeld3UTNEKzlsdXlPUVRmS0RpRkQzaVVJZlBrOFZxcktqZ0FpU2ZHRlBlY3JnNkhONm0vaUJjd2lEQW83V2lCZWF3YStLd2g3dFpvU0NHTE1xd2xTQXpWRGhvSys2dkg0RzBQNXdka0FBQUFBU1VWT1JLNUNZSUk9KTsKfQoKLnNwLWNsZWFyLWRpc3BsYXkgewogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEZBQVVBUGNBQUFBQUFKbVptWjJkblo2ZW5xS2lvcU9qbzZTa3BLV2xwYWFtcHFlbnA2aW9xS21wcWFxcXFxdXJxL0h4OGZMeTh2VDA5UFgxOWZmMzkvajQrUG41K2ZyNit2djcrd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQUVBQVA4QUxBQUFBQUFVQUJRQUFBaWhBUDlGb1BDdm9NR0RCeTA4K0VkaFFBSUpDQ015YkNEQUFZVUVBUkJBbEZpUVFvTUFCUWhLVUpCeFkwU1BJQ0VZSEJuZ2dFbURLQXVvUE1qUzVjR1lNeEhXM0lpVDQ3OEpKQThNL0NqVFowR2dMUmVrTkdwd0FzWUFCSEl5cGNBZ1FNc0lURHRXSllCUjZOU3FNaWNvOWNxUjZ0S2ZZN0dlQkN1VndsaXBETm1lZkF0VHJrU3pCMVJhSUFvWG9kc0FCaVpBRUZCMDZnSUJXQzFtTFZnQmEwQUFPdz09KTsKfQo=
LyoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIEFwcG9pbnRtZW50IENhbGVuZGFyCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCiAgICAjRWRpdEFwcG9pbnRtZW50Rm9ybSB7CiAgICAgICAgd2lkdGg6IDU2MHB4OwogICAgfQoKICAgIC5JbmxpbmVCdXR0b24gewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcGFkZGluZzogMDsKICAgIH0KCiAgICAuRmlsdGVyTWVzc2FnZSB0ZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRiAhaW1wb3J0YW50OwogICAgfQoKICAgIC5DYWxlbmRhckNvbG9yIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQkJCOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yNSk7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIH0KCiAgICAuZmMtY29udGVudCAuSWNvbnMsCiAgICAuQXBwb2ludG1lbnRUb29sdGlwID4gLkljb25zIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICB9CgogICAgLmZjLWNvbnRlbnQgaSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAwLjllbTsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBvcGFjaXR5OiAwLjM7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICB9CgogICAgdHI6aG92ZXIgdGQgLmZjLWNvbnRlbnQgaSB7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICB9CgogICAgLmZjIGJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZDogI0VFRTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQkJCOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbiAwLjJzOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAzcHggN3B4IDZweDsKICAgICAgICBsaW5lLWhlaWdodDogMTRweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIGNvbG9yOiAjMzMzOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjRkZGOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIH0KCiAgICAjRGF0ZXBpY2tlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHotaW5kZXg6IDEwMDsKICAgIH0KCiAgICAjRGF0ZXBpY2tlck92ZXJsYXkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB6LWluZGV4OiA1MDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICB9CgogICAgLkFwcG9pbnRtZW50VG9vbHRpcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwogICAgICAgIHdpZHRoOiAzNzVweDsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICB9CgogICAgLkFwcG9pbnRtZW50VG9vbHRpcCA+IC5JY29ucyBpIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDAuOWVtOwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgIH0KCiAgICAuQXBwb2ludG1lbnRUb29sdGlwID4gZmllbGRzZXQ6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCA+IGxhYmVsIHsKICAgICAgICBsaW5lLWhlaWdodDogMS4yZW07CiAgICAgICAgY29sb3I6ICM5MjkyOTI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgbWluLWhlaWdodDogMTdweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMXB4OwogICAgICAgIHBhZGRpbmctdG9wOiAwLjNlbTsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICB3aWR0aDogMzAlOwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCA+IC5WYWx1ZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjRlbTsKICAgICAgICBwYWRkaW5nLXRvcDogMC4yZW07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA1LjZlbTsKICAgIH0KCiAgICAuQXBwb2ludG1lbnRUb29sdGlwID4gZmllbGRzZXQgPiAuVmFsdWU6ZW1wdHksCiAgICAuQXBwb2ludG1lbnRUb29sdGlwID4gZmllbGRzZXQgPiAuVmFsdWU6ZW1wdHkgKyBsYWJlbCwKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCA+IC5WYWx1ZTplbXB0eSB+IGRpdi5DbGVhciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KCiAgICAuQXBwb2ludG1lbnRUb29sdGlwIC5GbGFnIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB9CgogICAgLkNhbGVuZGFyV2lkZ2V0IC51aS1kYXRlcGlja2VyLXRyaWdnZXIgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICB9CgogICAgLlJlYWRPbmx5VmFsdWUgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgIH0KCiAgICAuUmVhZE9ubHlWYWx1ZSNMb2NhdGlvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgfQoKICAgICNSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdiAuRmllbGRFeHBsYW5hdGlvbjpudGgtY2hpbGQoMikgewogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICB9CgogICAgI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgLkZpZWxkRXhwbGFuYXRpb24sCiAgICAjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgLkZpZWxkRXhwbGFuYXRpb24sCiAgICAjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiAuRmllbGRFeHBsYW5hdGlvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgIH0KCiAgICAuUGx1Z2luQ29udGFpbmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjJGMkYyOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGJveC1zaGFkb3c6IDFweCAxcHggNXB4ICNDQ0MgaW5zZXQ7CiAgICAgICAgcGFkZGluZzogMnB4IDhweCA0cHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgIH0KCiAgICAuUGx1Z2luQ29udGFpbmVyOmVtcHR5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC5QbHVnaW5Db250YWluZXIgYSB7CiAgICAgICAgbGluZS1oZWlnaHQ6IDFlbTsKICAgIH0KCiAgICAuUGx1Z2luQ29udGFpbmVyIGE6Zmlyc3QtY2hpbGQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiA5NiU7CiAgICB9CgogICAgLmZjLWFnZW5kYS12aWV3IHRoLmZjLXJlc291cmNlLWNlbGwgewogICAgICAgIGNvbG9yOiAjNEI0QjRCOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgfQoKICAgIC5mYy1zdGF0ZS1kZWZhdWx0LmZjLWNvcm5lci1sZWZ0IHsKICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwOwogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7CiAgICB9CgogICAgLmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLXJpZ2h0IHsKICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDsKICAgIH0KCiAgICAuZmMtc3RhdGUtaG92ZXIsCiAgICAuZmMtc3RhdGUtZG93biwKICAgIC5mYy1zdGF0ZS1hY3RpdmUsCiAgICAuZmMtc3RhdGUtZGlzYWJsZWQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNFNUU1RTUgIWltcG9ydGFudDsKICAgICAgICBib3JkZXItY29sb3I6ICM5OTkgIWltcG9ydGFudDsKICAgIH0KCiAgICAuZmMtc3RhdGUtZG93biwKICAgIC5mYy1zdGF0ZS1hY3RpdmUgewogICAgICAgIGJveC1zaGFkb3c6IDFweCAxcHggM3B4ICNCMEIwQjAgaW5zZXQsIC0xcHggLTFweCAzcHggI0IwQjBCMCBpbnNldDsKICAgIH0KCiAgICAuZmMtdG9vbGJhciBoMiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgbWFyZ2luLXRvcDogNnB4OwogICAgfQoKICAgIC5mYy12aWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRGREZEOwogICAgfQoKICAgIC5mYy12aWV3IHRhYmxlIHRoZWFkLmZjLWhlYWQgewogICAgICAgIGJhY2tncm91bmQ6ICNFRUVFRUU7CiAgICB9CgogICAgLmZjLXZpZXcgdGFibGUgdGhlYWQuZmMtaGVhZCB0aC5mYy13aWRnZXQtaGVhZGVyIHsKICAgICAgICBjb2xvcjogIzRCNEI0QjsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CiAgICB9CgogICAgLmZjLWZvbGxvd2luZyB7CiAgICAgICAgcGFkZGluZy10b3A6IDJweCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYy13aWRnZXQtaGVhZGVyIC5mYy1mb2xsb3dpbmcgewogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgcGFkZGluZy10b3A6IDFweCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5XZWVrTnVtYmVyLAogICAgLmZjLXdlZWstbnVtYmVyIHsKICAgICAgICBjb2xvcjogI0IwQjBCMCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYy1yZXNvdXJjZS1hcmVhIH4gLmZjLXRpbWUtYXJlYSAuZmMtZm9sbG93aW5nIHsKICAgICAgICBwYWRkaW5nLXRvcDogMXB4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZjLW1vbnRoLXZpZXcgdGguZmMtd2lkZ2V0LWhlYWRlciwKICAgIC5mYy1hZ2VuZGEtdmlldyB0aC5mYy13aWRnZXQtaGVhZGVyIHsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAzcHg7CiAgICB9CgogICAgLmZjLWx0ciAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgfQoKICAgIC5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lciB7CiAgICAgICAgdG9wOiAycHg7CiAgICB9CgogICAgLmZjIC5mYy10b2RheSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjFBQjsKICAgIH0KCiAgICAudWktYXV0b2NvbXBsZXRlIHsKICAgICAgICB6LWluZGV4OiA0MDAwICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLkJ1dHRvblRhYmxlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgIH0KCiAgICAuQnV0dG9uVGFibGUgYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgIH0KCiAgICAuQnV0dG9uVGFibGUgLmZjIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwogICAgfQoKICAgIC5GaWVsZElubGluZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiAjMDAwOwogICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICB9CgogICAgI0NvbnRleHRTZXR0aW5nc0RpYWxvZ1Jlc291cmNlT3ZlcnZpZXcgewogICAgICAgIG1heC1oZWlnaHQ6IDYwMHB4OwogICAgICAgIHdpZHRoOiA5NTBweDsKICAgIH0KCiAgICAjUmVzdG9yZURlZmF1bHRTZXR0aW5ncyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgfQoKICAgIHRyOmhvdmVyIHRkIGEjUmVzdG9yZURlZmF1bHRTZXR0aW5ncyBpIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgIH0KCiAgICB0ciB0ZCBhI1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3M6aG92ZXIgaSB7CiAgICAgICAgY29sb3I6ICMwMDA7CiAgICB9CgogICAgLkZpZWxkLkluZm8gYSB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICB9CgogICAgLkZpZWxkIGEuQnV0dG9uOmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgIH0KCiAgICAuRmllbGQgYS5CdXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgfQoKICAgIC5GaWVsZCBhLkJ1dHRvbjpob3ZlciB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgfQoKICAgIC5GaWVsZC5JbmZvIGEuQnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjM0U2QzdDOwogICAgfQoKICAgIC5GaWVsZC5JbmZvIGEuQnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNEI3QzhFOwogICAgfQoKICAgIC5GaWVsZC5JbmZvIGEuQnV0dG9uIGkgewogICAgICAgIGNvbG9yOiAjODlDNkQxOwogICAgfQoKICAgIC8qKgogICAgICogRm9udC1Bd2Vzb21lIGNoYXJhY3RlciBjbGFzc2VzCiAgICAgKi8KICAgIC5mYS1jaGFyLWE6YmVmb3JlLCAuZmEtY2hhci1iOmJlZm9yZSwgLmZhLWNoYXItYzpiZWZvcmUsIC5mYS1jaGFyLWQ6YmVmb3JlLCAuZmEtY2hhci1lOmJlZm9yZSwKICAgIC5mYS1jaGFyLWY6YmVmb3JlLCAuZmEtY2hhci1nOmJlZm9yZSwgLmZhLWNoYXItaDpiZWZvcmUsIC5mYS1jaGFyLWk6YmVmb3JlLCAuZmEtY2hhci1qOmJlZm9yZSwKICAgIC5mYS1jaGFyLWs6YmVmb3JlLCAuZmEtY2hhci1sOmJlZm9yZSwgLmZhLWNoYXItbTpiZWZvcmUsIC5mYS1jaGFyLW46YmVmb3JlLCAuZmEtY2hhci1vOmJlZm9yZSwKICAgIC5mYS1jaGFyLXA6YmVmb3JlLCAuZmEtY2hhci1xOmJlZm9yZSwgLmZhLWNoYXItcjpiZWZvcmUsIC5mYS1jaGFyLXM6YmVmb3JlLCAuZmEtY2hhci10OmJlZm9yZSwKICAgIC5mYS1jaGFyLXU6YmVmb3JlLCAuZmEtY2hhci12OmJlZm9yZSwgLmZhLWNoYXItdzpiZWZvcmUsIC5mYS1jaGFyLXg6YmVmb3JlLCAuZmEtY2hhci15OmJlZm9yZSwKICAgIC5mYS1jaGFyLXo6YmVmb3JlLCAuZmEtY2hhci0wOmJlZm9yZSwgLmZhLWNoYXItMTpiZWZvcmUsIC5mYS1jaGFyLTI6YmVmb3JlLCAuZmEtY2hhci0zOmJlZm9yZSwKICAgIC5mYS1jaGFyLTQ6YmVmb3JlLCAuZmEtY2hhci01OmJlZm9yZSwgLmZhLWNoYXItNjpiZWZvcmUsIC5mYS1jaGFyLTc6YmVmb3JlLCAuZmEtY2hhci04OmJlZm9yZSwKICAgIC5mYS1jaGFyLTk6YmVmb3JlIHsKICAgICAgICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgIH0KICAgIC5mYS1jaGFyLWE6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiQSI7CiAgICB9CiAgICAuZmEtY2hhci1iOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkIiOwogICAgfQogICAgLmZhLWNoYXItYzpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJDIjsKICAgIH0KICAgIC5mYS1jaGFyLWQ6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiRCI7CiAgICB9CiAgICAuZmEtY2hhci1lOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkUiOwogICAgfQogICAgLmZhLWNoYXItZjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJGIjsKICAgIH0KICAgIC5mYS1jaGFyLWc6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiRyI7CiAgICB9CiAgICAuZmEtY2hhci1oOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkgiOwogICAgfQogICAgLmZhLWNoYXItaTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJJIjsKICAgIH0KICAgIC5mYS1jaGFyLWo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiSiI7CiAgICB9CiAgICAuZmEtY2hhci1rOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIksiOwogICAgfQogICAgLmZhLWNoYXItbDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJMIjsKICAgIH0KICAgIC5mYS1jaGFyLW06YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiTSI7CiAgICB9CiAgICAuZmEtY2hhci1uOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIk4iOwogICAgfQogICAgLmZhLWNoYXItbzpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJPIjsKICAgIH0KICAgIC5mYS1jaGFyLXA6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiUCI7CiAgICB9CiAgICAuZmEtY2hhci1xOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlEiOwogICAgfQogICAgLmZhLWNoYXItcjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJSIjsKICAgIH0KICAgIC5mYS1jaGFyLXM6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiUyI7CiAgICB9CiAgICAuZmEtY2hhci10OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlQiOwogICAgfQogICAgLmZhLWNoYXItdTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJVIjsKICAgIH0KICAgIC5mYS1jaGFyLXY6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiViI7CiAgICB9CiAgICAuZmEtY2hhci13OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlciOwogICAgfQogICAgLmZhLWNoYXIteDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJYIjsKICAgIH0KICAgIC5mYS1jaGFyLXk6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiWSI7CiAgICB9CiAgICAuZmEtY2hhci16OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIloiOwogICAgfQogICAgLmZhLWNoYXItMDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICIwIjsKICAgIH0KICAgIC5mYS1jaGFyLTE6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiMSI7CiAgICB9CiAgICAuZmEtY2hhci0yOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjIiOwogICAgfQogICAgLmZhLWNoYXItMzpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICIzIjsKICAgIH0KICAgIC5mYS1jaGFyLTQ6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiNCI7CiAgICB9CiAgICAuZmEtY2hhci01OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjUiOwogICAgfQogICAgLmZhLWNoYXItNjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI2IjsKICAgIH0KICAgIC5mYS1jaGFyLTc6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiNyI7CiAgICB9CiAgICAuZmEtY2hhci04OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjgiOwogICAgfQogICAgLmZhLWNoYXItOTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI5IjsKICAgIH0KCn0gLyogZW5kIEBtZWRpYSAqLwoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAwcHgpIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIHsKCiAgICAjQ29udGV4dFNldHRpbmdzRGlhbG9nUmVzb3VyY2VPdmVydmlldywKICAgICNFZGl0QXBwb2ludG1lbnRGb3JtIHsKICAgICAgICB3aWR0aDogYXV0bzsKICAgIH0KCn0gLyogZW5kIEBtZWRpYSAqLwo=
LyoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIEFwcG9pbnRtZW50IENhbGVuZGFyIEFnZW5kYSBPdmVydmlldwogKi8KCkBtZWRpYSBzY3JlZW4scHJvamVjdGlvbix0dixoYW5kaGVsZCB7CgogICAgLkNvbG9yIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIH0KCiAgICAuQnV0dG9ucyB7CiAgICAgICAgbWFyZ2luOiA0cHggM3B4IDJweDsKICAgIH0KCiAgICAuSGVhZGVyTGVmdCwKICAgIC5SVEwgLkhlYWRlclJpZ2h0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgIH0KCiAgICAuSGVhZGVyTGVmdC5CdXR0b25zIGEsCiAgICAuUlRMIC5IZWFkZXJSaWdodC5CdXR0b25zIGEgewogICAgICAgIG1hcmdpbi1yaWdodDogM3B4OwogICAgfQoKICAgIC5IZWFkZXJDZW50ZXIgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW4tdG9wOiA5cHg7CiAgICB9CgogICAgLkhlYWRlckNlbnRlciBoMiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICB9CgogICAgLkhlYWRlclJpZ2h0LAogICAgLlJUTCAuSGVhZGVyTGVmdCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgfQoKICAgIC5IZWFkZXJSaWdodC5CdXR0b25zIGEsCiAgICAuUlRMIC5IZWFkZXJMZWZ0LkJ1dHRvbnMgYSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgIH0KCiAgICAuRGF0ZURpdmlkZXIgewogICAgICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5EYXRlRGl2aWRlciB0ZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRTsKICAgICAgICBib3JkZXItdG9wOiAxcHggZG90dGVkICNDQ0M7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAjQ0NDOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyZW07CiAgICB9CgogICAgLkRhdGVEaXZpZGVyLkZpcnN0ID4gdGQgewogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICB9CgogICAgLlRhYmxlU21hbGwgdGJvZHkgdHIuRGF0ZURpdmlkZXI6aG92ZXIgdGQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNFRUU7CiAgICB9CgogICAgLk92ZXJ2aWV3Q29udHJvbC5Mb2FkaW5nIC5Db250cm9sUm93IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjREREIHVybCgiLi4vaW1nL2xvYWRlci5naWYiKSBuby1yZXBlYXQgcmlnaHQgNXB4IGNlbnRlcjsKICAgIH0KCiAgICAuUlRMIC5PdmVydmlld0NvbnRyb2wuTG9hZGluZyAuQ29udHJvbFJvdyB7CiAgICAgICAgYmFja2dyb3VuZDogI0RERCB1cmwoIi4uL2ltZy9sb2FkZXIuZ2lmIikgbm8tcmVwZWF0IGxlZnQgNXB4IGNlbnRlcjsKICAgIH0KCn0gLyogZW5kIEBtZWRpYSAqLwo=
LyoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIEFwcG9pbnRtZW50IENhbGVuZGFyIE1hbmFnZQogKi8KCkBtZWRpYSBzY3JlZW4scHJvamVjdGlvbix0dixoYW5kaGVsZCB7CgogICAgLldpZGdldFNpbXBsZSBmaWVsZHNldC5TZXBhcmF0ZWQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKICAgICAgICBtYXJnaW46IDlweCAwOwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgIH0KCiAgICAuSW5saW5lQnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICB9CgogICAgdHIuSW52YWxpZCAuRG93bmxvYWRMaW5rLAogICAgdHIuSW52YWxpZCAuSW5saW5lQnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC5DYWxlbmRhckNvbG9yIHsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQkJCOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yNSk7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIH0KCiAgICAuSW52YWxpZCAuQ2FsZW5kYXJDb2xvciB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgfQoKICAgIC8qKgogICAgICogU3BlY3RydW0gQ29sb3IgcGlja2VyCiAgICAgKi8KICAgIC5Db2xvclBhbGV0dGVCdXR0b24uc3AtcmVwbGFjZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkY7CiAgICAgICAgYm94LXNoYWRvdzogMXB4IDFweCAzcHggI0VFRSBpbnNldCwgLTFweCAtMXB4IDNweCAjRUVFIGluc2V0OwogICAgICAgIGJvcmRlci1jb2xvcjogI0MwQzBDMCAjQzlDOUM5ICNDOUM5Qzk7CiAgICAgICAgcGFkZGluZzogM3B4IDRweCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVCdXR0b24uc3AtcmVwbGFjZXI6aG92ZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogI0MwQzBDMCAjQzlDOUM5ICNDOUM5Qzk7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbi5zcC1yZXBsYWNlcjpmb2N1cywKICAgIC5Db2xvclBhbGV0dGVCdXR0b24uc3AtcmVwbGFjZXIuc3AtYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6ICNGOTI7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbiAuc3AtcHJldmlldyB7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQnV0dG9uIC5zcC1wcmV2aWV3LWlubmVyLAogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lciAuc3AtdGh1bWItaW5uZXIgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyIC5zcC10aHVtYi1pbm5lcjpob3ZlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjRjkyOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVCdXR0b24gLnNwLWRkIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgICBoZWlnaHQ6IDhweDsKICAgICAgICBsaW5lLWhlaWdodDogOHB4OwogICAgICAgIHBhZGRpbmc6IDRweCAwOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyLAogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgYnV0dG9uLAogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgaW5wdXQgewogICAgICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICNDMEMwQzAgI0M5QzlDOSAjQzlDOUM5OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkY7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzMzMzsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDEycHg7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICAgIGJhY2tncm91bmQ6ICNFRUU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQkJCOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4gMC4yczsKICAgICAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjRUVFOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTVFNUU1OwogICAgICAgIGJvcmRlci1jb2xvcjogIzk5OTsKICAgICAgICBjb2xvcjogIzAwMDsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyLnNwLWNvbnRhaW5lciBpbnB1dCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgIH0KICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIC5zcC1pbnB1dC5zcC12YWxpZGF0aW9uLWVycm9yIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjRkZGOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIC5zcC1jYW5jZWwgewogICAgICAgIGNvbG9yOiAjRjkyICFpbXBvcnRhbnQ7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIC5zcC1jYW5jZWw6aG92ZXIgewogICAgICAgIGNvbG9yOiAjRjcyICFpbXBvcnRhbnQ7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIgLnNwLXBhbGV0dGUtY29udGFpbmVyLAogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lciAuc3AtcGlja2VyLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogNXB4IDVweCAyOTVweDsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyIC5zcC1wYWxldHRlLXRvZ2dsZSB7CiAgICAgICAgbWFyZ2luLXRvcDogM3B4OwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIgLnNwLXBhbGV0dGUgewogICAgICAgIG1heC13aWR0aDogMjQwcHg7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lciAuc3AtcGFsZXR0ZSAuc3AtdGh1bWItZWwgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBtYXJnaW46IDJweDsKICAgIH0KCiAgICBpbnB1dFtyZWFkb25seV0gKyAuQ29sb3JQYWxldHRlQnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjREREOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgfQoKfSAvKiBlbmQgQG1lZGlhICovCg==
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEKICogRG9jcyAmIExpY2Vuc2U6IGh0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vCiAqIChjKSAyMDE2IEFkYW0gU2hhdwogKi8KCihmdW5jdGlvbihmYWN0b3J5KSB7CglpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CgkJZGVmaW5lKFsgJ2pxdWVyeScsICdtb21lbnQnIF0sIGZhY3RvcnkpOwoJfQoJZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7IC8vIE5vZGUvQ29tbW9uSlMKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ21vbWVudCcpKTsKCX0KCWVsc2UgewoJCWZhY3RvcnkoalF1ZXJ5LCBtb21lbnQpOwoJfQp9KShmdW5jdGlvbigkLCBtb21lbnQpIHsKCjs7Cgp2YXIgRkMgPSAkLmZ1bGxDYWxlbmRhciA9IHsKCXZlcnNpb246ICIzLjAuMSIsCglpbnRlcm5hbEFwaVZlcnNpb246IDYKfTsKdmFyIGZjVmlld3MgPSBGQy52aWV3cyA9IHt9OwoKCiQuZm4uZnVsbENhbGVuZGFyID0gZnVuY3Rpb24ob3B0aW9ucykgewoJdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBmb3IgYSBwb3NzaWJsZSBtZXRob2QgY2FsbAoJdmFyIHJlcyA9IHRoaXM7IC8vIHdoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAodGhpcyBqUXVlcnkgb2JqZWN0IGJ5IGRlZmF1bHQpCgoJdGhpcy5lYWNoKGZ1bmN0aW9uKGksIF9lbGVtZW50KSB7IC8vIGxvb3AgZWFjaCBET00gZWxlbWVudCBpbnZvbHZlZAoJCXZhciBlbGVtZW50ID0gJChfZWxlbWVudCk7CgkJdmFyIGNhbGVuZGFyID0gZWxlbWVudC5kYXRhKCdmdWxsQ2FsZW5kYXInKTsgLy8gZ2V0IHRoZSBleGlzdGluZyBjYWxlbmRhciBvYmplY3QgKGlmIGFueSkKCQl2YXIgc2luZ2xlUmVzOyAvLyB0aGUgcmV0dXJuZWQgdmFsdWUgb2YgdGhpcyBzaW5nbGUgbWV0aG9kIGNhbGwKCgkJLy8gYSBtZXRob2QgY2FsbAoJCWlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHsKCQkJaWYgKGNhbGVuZGFyICYmICQuaXNGdW5jdGlvbihjYWxlbmRhcltvcHRpb25zXSkpIHsKCQkJCXNpbmdsZVJlcyA9IGNhbGVuZGFyW29wdGlvbnNdLmFwcGx5KGNhbGVuZGFyLCBhcmdzKTsKCQkJCWlmICghaSkgewoJCQkJCXJlcyA9IHNpbmdsZVJlczsgLy8gcmVjb3JkIHRoZSBmaXJzdCBtZXRob2QgY2FsbCByZXN1bHQKCQkJCX0KCQkJCWlmIChvcHRpb25zID09PSAnZGVzdHJveScpIHsgLy8gZm9yIHRoZSBkZXN0cm95IG1ldGhvZCwgbXVzdCByZW1vdmUgQ2FsZW5kYXIgb2JqZWN0IGRhdGEKCQkJCQllbGVtZW50LnJlbW92ZURhdGEoJ2Z1bGxDYWxlbmRhcicpOwoJCQkJfQoJCQl9CgkJfQoJCS8vIGEgbmV3IGNhbGVuZGFyIGluaXRpYWxpemF0aW9uCgkJZWxzZSBpZiAoIWNhbGVuZGFyKSB7IC8vIGRvbid0IGluaXRpYWxpemUgdHdpY2UKCQkJY2FsZW5kYXIgPSBuZXcgQ2FsZW5kYXIoZWxlbWVudCwgb3B0aW9ucyk7CgkJCWVsZW1lbnQuZGF0YSgnZnVsbENhbGVuZGFyJywgY2FsZW5kYXIpOwoJCQljYWxlbmRhci5yZW5kZXIoKTsKCQl9Cgl9KTsKCQoJcmV0dXJuIHJlczsKfTsKCgp2YXIgY29tcGxleE9wdGlvbnMgPSBbIC8vIG5hbWVzIG9mIG9wdGlvbnMgdGhhdCBhcmUgb2JqZWN0cyB3aG9zZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBjb21iaW5lZAoJJ2hlYWRlcicsCgknYnV0dG9uVGV4dCcsCgknYnV0dG9uSWNvbnMnLAoJJ3RoZW1lQnV0dG9uSWNvbnMnCl07CgoKLy8gTWVyZ2VzIGFuIGFycmF5IG9mIG9wdGlvbiBvYmplY3RzIGludG8gYSBzaW5nbGUgb2JqZWN0CmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhvcHRpb25PYmpzKSB7CglyZXR1cm4gbWVyZ2VQcm9wcyhvcHRpb25PYmpzLCBjb21wbGV4T3B0aW9ucyk7Cn0KCjs7CgovLyBleHBvcnRzCkZDLmludGVyc2VjdFJhbmdlcyA9IGludGVyc2VjdFJhbmdlczsKRkMuYXBwbHlBbGwgPSBhcHBseUFsbDsKRkMuZGVib3VuY2UgPSBkZWJvdW5jZTsKRkMuaXNJbnQgPSBpc0ludDsKRkMuaHRtbEVzY2FwZSA9IGh0bWxFc2NhcGU7CkZDLmNzc1RvU3RyID0gY3NzVG9TdHI7CkZDLnByb3h5ID0gcHJveHk7CkZDLmNhcGl0YWxpc2VGaXJzdExldHRlciA9IGNhcGl0YWxpc2VGaXJzdExldHRlcjsKCgovKiBGdWxsQ2FsZW5kYXItc3BlY2lmaWMgRE9NIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgovLyBHaXZlbiB0aGUgc2Nyb2xsYmFyIHdpZHRocyBvZiBzb21lIG90aGVyIGNvbnRhaW5lciwgY3JlYXRlIGJvcmRlcnMvbWFyZ2lucyBvbiByb3dFbHMgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGxlZnQKLy8gYW5kIHJpZ2h0IHNwYWNlIHRoYXQgd2FzIG9mZnNldCBieSB0aGUgc2Nyb2xsYmFycy4gQSAxLXBpeGVsIGJvcmRlciBmaXJzdCwgdGhlbiBtYXJnaW4gYmV5b25kIHRoYXQuCmZ1bmN0aW9uIGNvbXBlbnNhdGVTY3JvbGwocm93RWxzLCBzY3JvbGxiYXJXaWR0aHMpIHsKCWlmIChzY3JvbGxiYXJXaWR0aHMubGVmdCkgewoJCXJvd0Vscy5jc3MoewoJCQknYm9yZGVyLWxlZnQtd2lkdGgnOiAxLAoJCQknbWFyZ2luLWxlZnQnOiBzY3JvbGxiYXJXaWR0aHMubGVmdCAtIDEKCQl9KTsKCX0KCWlmIChzY3JvbGxiYXJXaWR0aHMucmlnaHQpIHsKCQlyb3dFbHMuY3NzKHsKCQkJJ2JvcmRlci1yaWdodC13aWR0aCc6IDEsCgkJCSdtYXJnaW4tcmlnaHQnOiBzY3JvbGxiYXJXaWR0aHMucmlnaHQgLSAxCgkJfSk7Cgl9Cn0KCgovLyBVbmRvZXMgY29tcGVuc2F0ZVNjcm9sbCBhbmQgcmVzdG9yZXMgYWxsIGJvcmRlcnMvbWFyZ2lucwpmdW5jdGlvbiB1bmNvbXBlbnNhdGVTY3JvbGwocm93RWxzKSB7Cglyb3dFbHMuY3NzKHsKCQknbWFyZ2luLWxlZnQnOiAnJywKCQknbWFyZ2luLXJpZ2h0JzogJycsCgkJJ2JvcmRlci1sZWZ0LXdpZHRoJzogJycsCgkJJ2JvcmRlci1yaWdodC13aWR0aCc6ICcnCgl9KTsKfQoKCi8vIE1ha2UgdGhlIG1vdXNlIGN1cnNvciBleHByZXNzIHRoYXQgYW4gZXZlbnQgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgYXJlYQpmdW5jdGlvbiBkaXNhYmxlQ3Vyc29yKCkgewoJJCgnYm9keScpLmFkZENsYXNzKCdmYy1ub3QtYWxsb3dlZCcpOwp9CgoKLy8gUmV0dXJucyB0aGUgbW91c2UgY3Vyc29yIHRvIGl0cyBvcmlnaW5hbCBsb29rCmZ1bmN0aW9uIGVuYWJsZUN1cnNvcigpIHsKCSQoJ2JvZHknKS5yZW1vdmVDbGFzcygnZmMtbm90LWFsbG93ZWQnKTsKfQoKCi8vIEdpdmVuIGEgdG90YWwgYXZhaWxhYmxlIGhlaWdodCB0byBmaWxsLCBoYXZlIGBlbHNgIChlc3NlbnRpYWxseSBjaGlsZCByb3dzKSBleHBhbmQgdG8gYWNjb21vZGF0ZS4KLy8gQnkgZGVmYXVsdCwgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIHNob3J0ZXIgdGhhbiB0aGUgcmVjb21tZW5kZWQgaGVpZ2h0IGFyZSBleHBhbmRlZCB1bmlmb3JtbHksIG5vdCBjb25zaWRlcmluZwovLyBhbnkgb3RoZXIgZWxzIHRoYXQgYXJlIGFscmVhZHkgdG9vIHRhbGwuIGlmIGBzaG91bGRSZWRpc3RyaWJ1dGVgIGlzIG9uLCBpdCBjb25zaWRlcnMgdGhlc2UgdGFsbCByb3dzIGFuZCAKLy8gcmVkdWNlcyB0aGUgYXZhaWxhYmxlIGhlaWdodC4KZnVuY3Rpb24gZGlzdHJpYnV0ZUhlaWdodChlbHMsIGF2YWlsYWJsZUhlaWdodCwgc2hvdWxkUmVkaXN0cmlidXRlKSB7CgoJLy8gKkZMT09SSU5HIE5PVEUqOiB3ZSBmbG9vciBpbiBjZXJ0YWluIHBsYWNlcyBiZWNhdXNlIHpvb20gY2FuIGdpdmUgaW5hY2N1cmF0ZSBmbG9hdGluZy1wb2ludCBkaW1lbnNpb25zLAoJLy8gYW5kIGl0IGlzIGJldHRlciB0byBiZSBzaG9ydGVyIHRoYW4gdGFsbGVyLCB0byBhdm9pZCBjcmVhdGluZyB1bm5lY2Vzc2FyeSBzY3JvbGxiYXJzLgoKCXZhciBtaW5PZmZzZXQxID0gTWF0aC5mbG9vcihhdmFpbGFibGVIZWlnaHQgLyBlbHMubGVuZ3RoKTsgLy8gZm9yIG5vbi1sYXN0IGVsZW1lbnQKCXZhciBtaW5PZmZzZXQyID0gTWF0aC5mbG9vcihhdmFpbGFibGVIZWlnaHQgLSBtaW5PZmZzZXQxICogKGVscy5sZW5ndGggLSAxKSk7IC8vIGZvciBsYXN0IGVsZW1lbnQgKkZMT09SSU5HIE5PVEUqCgl2YXIgZmxleEVscyA9IFtdOyAvLyBlbGVtZW50cyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4cGFuZC4gYXJyYXkgb2YgRE9NIG5vZGVzCgl2YXIgZmxleE9mZnNldHMgPSBbXTsgLy8gYW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIGl0IHRha2VzIHVwCgl2YXIgZmxleEhlaWdodHMgPSBbXTsgLy8gYWN0dWFsIGNzcyBoZWlnaHQKCXZhciB1c2VkSGVpZ2h0ID0gMDsKCgl1bmRpc3RyaWJ1dGVIZWlnaHQoZWxzKTsgLy8gZ2l2ZSBhbGwgZWxlbWVudHMgdGhlaXIgbmF0dXJhbCBoZWlnaHQKCgkvLyBmaW5kIGVsZW1lbnRzIHRoYXQgYXJlIGJlbG93IHRoZSByZWNvbW1lbmRlZCBoZWlnaHQgKGV4cGFuZGFibGUpLgoJLy8gaW1wb3J0YW50IHRvIHF1ZXJ5IGZvciBoZWlnaHRzIGluIGEgc2luZ2xlIGZpcnN0IHBhc3MgKHRvIGF2b2lkIHJlZmxvdyBvc2NpbGxhdGlvbikuCgllbHMuZWFjaChmdW5jdGlvbihpLCBlbCkgewoJCXZhciBtaW5PZmZzZXQgPSBpID09PSBlbHMubGVuZ3RoIC0gMSA/IG1pbk9mZnNldDIgOiBtaW5PZmZzZXQxOwoJCXZhciBuYXR1cmFsT2Zmc2V0ID0gJChlbCkub3V0ZXJIZWlnaHQodHJ1ZSk7CgoJCWlmIChuYXR1cmFsT2Zmc2V0IDwgbWluT2Zmc2V0KSB7CgkJCWZsZXhFbHMucHVzaChlbCk7CgkJCWZsZXhPZmZzZXRzLnB1c2gobmF0dXJhbE9mZnNldCk7CgkJCWZsZXhIZWlnaHRzLnB1c2goJChlbCkuaGVpZ2h0KCkpOwoJCX0KCQllbHNlIHsKCQkJLy8gdGhpcyBlbGVtZW50IHN0cmV0Y2hlcyBwYXN0IHJlY29tbWVuZGVkIGhlaWdodCAobm9uLWV4cGFuZGFibGUpLiBtYXJrIHRoZSBzcGFjZSBhcyBvY2N1cGllZC4KCQkJdXNlZEhlaWdodCArPSBuYXR1cmFsT2Zmc2V0OwoJCX0KCX0pOwoKCS8vIHJlYWRqdXN0IHRoZSByZWNvbW1lbmRlZCBoZWlnaHQgdG8gb25seSBjb25zaWRlciB0aGUgaGVpZ2h0IGF2YWlsYWJsZSB0byBub24tbWF4ZWQtb3V0IHJvd3MuCglpZiAoc2hvdWxkUmVkaXN0cmlidXRlKSB7CgkJYXZhaWxhYmxlSGVpZ2h0IC09IHVzZWRIZWlnaHQ7CgkJbWluT2Zmc2V0MSA9IE1hdGguZmxvb3IoYXZhaWxhYmxlSGVpZ2h0IC8gZmxleEVscy5sZW5ndGgpOwoJCW1pbk9mZnNldDIgPSBNYXRoLmZsb29yKGF2YWlsYWJsZUhlaWdodCAtIG1pbk9mZnNldDEgKiAoZmxleEVscy5sZW5ndGggLSAxKSk7IC8vICpGTE9PUklORyBOT1RFKgoJfQoKCS8vIGFzc2lnbiBoZWlnaHRzIHRvIGFsbCBleHBhbmRhYmxlIGVsZW1lbnRzCgkkKGZsZXhFbHMpLmVhY2goZnVuY3Rpb24oaSwgZWwpIHsKCQl2YXIgbWluT2Zmc2V0ID0gaSA9PT0gZmxleEVscy5sZW5ndGggLSAxID8gbWluT2Zmc2V0MiA6IG1pbk9mZnNldDE7CgkJdmFyIG5hdHVyYWxPZmZzZXQgPSBmbGV4T2Zmc2V0c1tpXTsKCQl2YXIgbmF0dXJhbEhlaWdodCA9IGZsZXhIZWlnaHRzW2ldOwoJCXZhciBuZXdIZWlnaHQgPSBtaW5PZmZzZXQgLSAobmF0dXJhbE9mZnNldCAtIG5hdHVyYWxIZWlnaHQpOyAvLyBzdWJ0cmFjdCB0aGUgbWFyZ2luL3BhZGRpbmcKCgkJaWYgKG5hdHVyYWxPZmZzZXQgPCBtaW5PZmZzZXQpIHsgLy8gd2UgY2hlY2sgdGhpcyBhZ2FpbiBiZWNhdXNlIHJlZGlzdHJpYnV0aW9uIG1pZ2h0IGhhdmUgY2hhbmdlZCB0aGluZ3MKCQkJJChlbCkuaGVpZ2h0KG5ld0hlaWdodCk7CgkJfQoJfSk7Cn0KCgovLyBVbmRvZXMgZGlzdHJ1YnV0ZUhlaWdodCwgcmVzdG9yaW5nIGFsbCBlbHMgdG8gdGhlaXIgbmF0dXJhbCBoZWlnaHQKZnVuY3Rpb24gdW5kaXN0cmlidXRlSGVpZ2h0KGVscykgewoJZWxzLmhlaWdodCgnJyk7Cn0KCgovLyBHaXZlbiBgZWxzYCwgYSBqUXVlcnkgc2V0IG9mIDx0ZD4gY2VsbHMsIGZpbmQgdGhlIGNlbGwgd2l0aCB0aGUgbGFyZ2VzdCBuYXR1cmFsIHdpZHRoIGFuZCBzZXQgdGhlIHdpZHRocyBvZiBhbGwgdGhlCi8vIGNlbGxzIHRvIGJlIHRoYXQgd2lkdGguCi8vIFBSRVJFUVVJU0lURTogaWYgeW91IHdhbnQgYSBjZWxsIHRvIHRha2UgdXAgd2lkdGgsIGl0IG5lZWRzIHRvIGhhdmUgYSBzaW5nbGUgaW5uZXIgZWxlbWVudCB3LyBkaXNwbGF5OmlubGluZQpmdW5jdGlvbiBtYXRjaENlbGxXaWR0aHMoZWxzKSB7Cgl2YXIgbWF4SW5uZXJXaWR0aCA9IDA7CgoJZWxzLmZpbmQoJz4gKicpLmVhY2goZnVuY3Rpb24oaSwgaW5uZXJFbCkgewoJCXZhciBpbm5lcldpZHRoID0gJChpbm5lckVsKS5vdXRlcldpZHRoKCk7CgkJaWYgKGlubmVyV2lkdGggPiBtYXhJbm5lcldpZHRoKSB7CgkJCW1heElubmVyV2lkdGggPSBpbm5lcldpZHRoOwoJCX0KCX0pOwoKCW1heElubmVyV2lkdGgrKzsgLy8gc29tZXRpbWVzIG5vdCBhY2N1cmF0ZSBvZiB3aWR0aCB0aGUgdGV4dCBuZWVkcyB0byBzdGF5IG9uIG9uZSBsaW5lLiBpbnN1cmFuY2UKCgllbHMud2lkdGgobWF4SW5uZXJXaWR0aCk7CgoJcmV0dXJuIG1heElubmVyV2lkdGg7Cn0KCgovLyBHaXZlbiBvbmUgZWxlbWVudCB0aGF0IHJlc2lkZXMgaW5zaWRlIGFub3RoZXIsCi8vIFN1YnRyYWN0cyB0aGUgaGVpZ2h0IG9mIHRoZSBpbm5lciBlbGVtZW50IGZyb20gdGhlIG91dGVyIGVsZW1lbnQuCmZ1bmN0aW9uIHN1YnRyYWN0SW5uZXJFbEhlaWdodChvdXRlckVsLCBpbm5lckVsKSB7Cgl2YXIgYm90aCA9IG91dGVyRWwuYWRkKGlubmVyRWwpOwoJdmFyIGRpZmY7CgoJLy8gZWZmaW4nIElFOC85LzEwLzExIHNvbWV0aW1lcyByZXR1cm5zIDAgZm9yIGRpbWVuc2lvbnMuIHRoaXMgd2VpcmQgaGFjayB3YXMgdGhlIG9ubHkgdGhpbmcgdGhhdCB3b3JrZWQKCWJvdGguY3NzKHsKCQlwb3NpdGlvbjogJ3JlbGF0aXZlJywgLy8gY2F1c2UgYSByZWZsb3csIHdoaWNoIHdpbGwgZm9yY2UgZnJlc2ggZGltZW5zaW9uIHJlY2FsY3VsYXRpb24KCQlsZWZ0OiAtMSAvLyBlbnN1cmUgcmVmbG93IGluIGNhc2UgdGhlIGVsIHdhcyBhbHJlYWR5IHJlbGF0aXZlLiBuZWdhdGl2ZSBpcyBsZXNzIGxpa2VseSB0byBjYXVzZSBuZXcgc2Nyb2xsCgl9KTsKCWRpZmYgPSBvdXRlckVsLm91dGVySGVpZ2h0KCkgLSBpbm5lckVsLm91dGVySGVpZ2h0KCk7IC8vIGdyYWIgdGhlIGRpbWVuc2lvbnMKCWJvdGguY3NzKHsgcG9zaXRpb246ICcnLCBsZWZ0OiAnJyB9KTsgLy8gdW5kbyBoYWNrCgoJcmV0dXJuIGRpZmY7Cn0KCgovKiBFbGVtZW50IEdlb20gVXRpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMuZ2V0T3V0ZXJSZWN0ID0gZ2V0T3V0ZXJSZWN0OwpGQy5nZXRDbGllbnRSZWN0ID0gZ2V0Q2xpZW50UmVjdDsKRkMuZ2V0Q29udGVudFJlY3QgPSBnZXRDb250ZW50UmVjdDsKRkMuZ2V0U2Nyb2xsYmFyV2lkdGhzID0gZ2V0U2Nyb2xsYmFyV2lkdGhzOwoKCi8vIGJvcnJvd2VkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkvYmxvYi8xLjExLjAvdWkvY29yZS5qcyNMNTEKZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsKSB7Cgl2YXIgcG9zaXRpb24gPSBlbC5jc3MoJ3Bvc2l0aW9uJyksCgkJc2Nyb2xsUGFyZW50ID0gZWwucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJdmFyIHBhcmVudCA9ICQodGhpcyk7CgkJCXJldHVybiAoLyhhdXRvfHNjcm9sbCkvKS50ZXN0KAoJCQkJcGFyZW50LmNzcygnb3ZlcmZsb3cnKSArIHBhcmVudC5jc3MoJ292ZXJmbG93LXknKSArIHBhcmVudC5jc3MoJ292ZXJmbG93LXgnKQoJCQkpOwoJCX0pLmVxKDApOwoKCXJldHVybiBwb3NpdGlvbiA9PT0gJ2ZpeGVkJyB8fCAhc2Nyb2xsUGFyZW50Lmxlbmd0aCA/ICQoZWxbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgOiBzY3JvbGxQYXJlbnQ7Cn0KCgovLyBRdWVyaWVzIHRoZSBvdXRlciBib3VuZGluZyBhcmVhIG9mIGEgalF1ZXJ5IGVsZW1lbnQuCi8vIFJldHVybnMgYSByZWN0YW5nbGUgd2l0aCBhYnNvbHV0ZSBjb29yZGluYXRlczogbGVmdCwgcmlnaHQgKGV4Y2x1c2l2ZSksIHRvcCwgYm90dG9tIChleGNsdXNpdmUpLgovLyBPcmlnaW4gaXMgb3B0aW9uYWwuCmZ1bmN0aW9uIGdldE91dGVyUmVjdChlbCwgb3JpZ2luKSB7Cgl2YXIgb2Zmc2V0ID0gZWwub2Zmc2V0KCk7Cgl2YXIgbGVmdCA9IG9mZnNldC5sZWZ0IC0gKG9yaWdpbiA/IG9yaWdpbi5sZWZ0IDogMCk7Cgl2YXIgdG9wID0gb2Zmc2V0LnRvcCAtIChvcmlnaW4gPyBvcmlnaW4udG9wIDogMCk7CgoJcmV0dXJuIHsKCQlsZWZ0OiBsZWZ0LAoJCXJpZ2h0OiBsZWZ0ICsgZWwub3V0ZXJXaWR0aCgpLAoJCXRvcDogdG9wLAoJCWJvdHRvbTogdG9wICsgZWwub3V0ZXJIZWlnaHQoKQoJfTsKfQoKCi8vIFF1ZXJpZXMgdGhlIGFyZWEgd2l0aGluIHRoZSBtYXJnaW4vYm9yZGVyL3Njcm9sbGJhcnMgb2YgYSBqUXVlcnkgZWxlbWVudC4gRG9lcyBub3QgZ28gd2l0aGluIHRoZSBwYWRkaW5nLgovLyBSZXR1cm5zIGEgcmVjdGFuZ2xlIHdpdGggYWJzb2x1dGUgY29vcmRpbmF0ZXM6IGxlZnQsIHJpZ2h0IChleGNsdXNpdmUpLCB0b3AsIGJvdHRvbSAoZXhjbHVzaXZlKS4KLy8gT3JpZ2luIGlzIG9wdGlvbmFsLgovLyBOT1RFOiBzaG91bGQgdXNlIGNsaWVudExlZnQvY2xpZW50VG9wLCBidXQgdmVyeSB1bnJlbGlhYmxlIGNyb3NzLWJyb3dzZXIuCmZ1bmN0aW9uIGdldENsaWVudFJlY3QoZWwsIG9yaWdpbikgewoJdmFyIG9mZnNldCA9IGVsLm9mZnNldCgpOwoJdmFyIHNjcm9sbGJhcldpZHRocyA9IGdldFNjcm9sbGJhcldpZHRocyhlbCk7Cgl2YXIgbGVmdCA9IG9mZnNldC5sZWZ0ICsgZ2V0Q3NzRmxvYXQoZWwsICdib3JkZXItbGVmdC13aWR0aCcpICsgc2Nyb2xsYmFyV2lkdGhzLmxlZnQgLSAob3JpZ2luID8gb3JpZ2luLmxlZnQgOiAwKTsKCXZhciB0b3AgPSBvZmZzZXQudG9wICsgZ2V0Q3NzRmxvYXQoZWwsICdib3JkZXItdG9wLXdpZHRoJykgKyBzY3JvbGxiYXJXaWR0aHMudG9wIC0gKG9yaWdpbiA/IG9yaWdpbi50b3AgOiAwKTsKCglyZXR1cm4gewoJCWxlZnQ6IGxlZnQsCgkJcmlnaHQ6IGxlZnQgKyBlbFswXS5jbGllbnRXaWR0aCwgLy8gY2xpZW50V2lkdGggaW5jbHVkZXMgcGFkZGluZyBidXQgTk9UIHNjcm9sbGJhcnMKCQl0b3A6IHRvcCwKCQlib3R0b206IHRvcCArIGVsWzBdLmNsaWVudEhlaWdodCAvLyBjbGllbnRIZWlnaHQgaW5jbHVkZXMgcGFkZGluZyBidXQgTk9UIHNjcm9sbGJhcnMKCX07Cn0KCgovLyBRdWVyaWVzIHRoZSBhcmVhIHdpdGhpbiB0aGUgbWFyZ2luL2JvcmRlci9wYWRkaW5nIG9mIGEgalF1ZXJ5IGVsZW1lbnQuIEFzc3VtZWQgbm90IHRvIGhhdmUgc2Nyb2xsYmFycy4KLy8gUmV0dXJucyBhIHJlY3RhbmdsZSB3aXRoIGFic29sdXRlIGNvb3JkaW5hdGVzOiBsZWZ0LCByaWdodCAoZXhjbHVzaXZlKSwgdG9wLCBib3R0b20gKGV4Y2x1c2l2ZSkuCi8vIE9yaWdpbiBpcyBvcHRpb25hbC4KZnVuY3Rpb24gZ2V0Q29udGVudFJlY3QoZWwsIG9yaWdpbikgewoJdmFyIG9mZnNldCA9IGVsLm9mZnNldCgpOyAvLyBqdXN0IG91dHNpZGUgb2YgYm9yZGVyLCBtYXJnaW4gbm90IGluY2x1ZGVkCgl2YXIgbGVmdCA9IG9mZnNldC5sZWZ0ICsgZ2V0Q3NzRmxvYXQoZWwsICdib3JkZXItbGVmdC13aWR0aCcpICsgZ2V0Q3NzRmxvYXQoZWwsICdwYWRkaW5nLWxlZnQnKSAtCgkJKG9yaWdpbiA/IG9yaWdpbi5sZWZ0IDogMCk7Cgl2YXIgdG9wID0gb2Zmc2V0LnRvcCArIGdldENzc0Zsb2F0KGVsLCAnYm9yZGVyLXRvcC13aWR0aCcpICsgZ2V0Q3NzRmxvYXQoZWwsICdwYWRkaW5nLXRvcCcpIC0KCQkob3JpZ2luID8gb3JpZ2luLnRvcCA6IDApOwoKCXJldHVybiB7CgkJbGVmdDogbGVmdCwKCQlyaWdodDogbGVmdCArIGVsLndpZHRoKCksCgkJdG9wOiB0b3AsCgkJYm90dG9tOiB0b3AgKyBlbC5oZWlnaHQoKQoJfTsKfQoKCi8vIFJldHVybnMgdGhlIGNvbXB1dGVkIGxlZnQvcmlnaHQvdG9wL2JvdHRvbSBzY3JvbGxiYXIgd2lkdGhzIGZvciB0aGUgZ2l2ZW4galF1ZXJ5IGVsZW1lbnQuCi8vIE5PVEU6IHNob3VsZCB1c2UgY2xpZW50TGVmdC9jbGllbnRUb3AsIGJ1dCB2ZXJ5IHVucmVsaWFibGUgY3Jvc3MtYnJvd3Nlci4KZnVuY3Rpb24gZ2V0U2Nyb2xsYmFyV2lkdGhzKGVsKSB7Cgl2YXIgbGVmdFJpZ2h0V2lkdGggPSBlbC5pbm5lcldpZHRoKCkgLSBlbFswXS5jbGllbnRXaWR0aDsgLy8gdGhlIHBhZGRpbmdzIGNhbmNlbCBvdXQsIGxlYXZpbmcgdGhlIHNjcm9sbGJhcnMKCXZhciB3aWR0aHMgPSB7CgkJbGVmdDogMCwKCQlyaWdodDogMCwKCQl0b3A6IDAsCgkJYm90dG9tOiBlbC5pbm5lckhlaWdodCgpIC0gZWxbMF0uY2xpZW50SGVpZ2h0IC8vIHRoZSBwYWRkaW5ncyBjYW5jZWwgb3V0LCBsZWF2aW5nIHRoZSBib3R0b20gc2Nyb2xsYmFyCgl9OwoKCWlmIChnZXRJc0xlZnRSdGxTY3JvbGxiYXJzKCkgJiYgZWwuY3NzKCdkaXJlY3Rpb24nKSA9PSAncnRsJykgeyAvLyBpcyB0aGUgc2Nyb2xsYmFyIG9uIHRoZSBsZWZ0IHNpZGU/CgkJd2lkdGhzLmxlZnQgPSBsZWZ0UmlnaHRXaWR0aDsKCX0KCWVsc2UgewoJCXdpZHRocy5yaWdodCA9IGxlZnRSaWdodFdpZHRoOwoJfQoKCXJldHVybiB3aWR0aHM7Cn0KCgovLyBMb2dpYyBmb3IgZGV0ZXJtaW5pbmcgaWYsIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmlnaHQtdG8tbGVmdCwgdGhlIHNjcm9sbGJhciBhcHBlYXJzIG9uIHRoZSBsZWZ0IHNpZGUKCnZhciBfaXNMZWZ0UnRsU2Nyb2xsYmFycyA9IG51bGw7CgpmdW5jdGlvbiBnZXRJc0xlZnRSdGxTY3JvbGxiYXJzKCkgeyAvLyByZXNwb25zaWJsZSBmb3IgY2FjaGluZyB0aGUgY29tcHV0YXRpb24KCWlmIChfaXNMZWZ0UnRsU2Nyb2xsYmFycyA9PT0gbnVsbCkgewoJCV9pc0xlZnRSdGxTY3JvbGxiYXJzID0gY29tcHV0ZUlzTGVmdFJ0bFNjcm9sbGJhcnMoKTsKCX0KCXJldHVybiBfaXNMZWZ0UnRsU2Nyb2xsYmFyczsKfQoKZnVuY3Rpb24gY29tcHV0ZUlzTGVmdFJ0bFNjcm9sbGJhcnMoKSB7IC8vIGNyZWF0ZXMgYW4gb2Zmc2NyZWVuIHRlc3QgZWxlbWVudCwgdGhlbiByZW1vdmVzIGl0Cgl2YXIgZWwgPSAkKCc8ZGl2PjxkaXYvPjwvZGl2PicpCgkJLmNzcyh7CgkJCXBvc2l0aW9uOiAnYWJzb2x1dGUnLAoJCQl0b3A6IC0xMDAwLAoJCQlsZWZ0OiAwLAoJCQlib3JkZXI6IDAsCgkJCXBhZGRpbmc6IDAsCgkJCW92ZXJmbG93OiAnc2Nyb2xsJywKCQkJZGlyZWN0aW9uOiAncnRsJwoJCX0pCgkJLmFwcGVuZFRvKCdib2R5Jyk7Cgl2YXIgaW5uZXJFbCA9IGVsLmNoaWxkcmVuKCk7Cgl2YXIgcmVzID0gaW5uZXJFbC5vZmZzZXQoKS5sZWZ0ID4gZWwub2Zmc2V0KCkubGVmdDsgLy8gaXMgdGhlIGlubmVyIGRpdiBzaGlmdGVkIHRvIGFjY29tbW9kYXRlIGEgbGVmdCBzY3JvbGxiYXI/CgllbC5yZW1vdmUoKTsKCXJldHVybiByZXM7Cn0KCgovLyBSZXRyaWV2ZXMgYSBqUXVlcnkgZWxlbWVudCdzIGNvbXB1dGVkIENTUyB2YWx1ZSBhcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KLy8gSWYgdGhlIHF1ZXJpZWQgdmFsdWUgaXMgbm9uLW51bWVyaWMgKGV4OiBJRSBjYW4gcmV0dXJuICJtZWRpdW0iIGZvciBib3JkZXIgd2lkdGgpLCB3aWxsIGp1c3QgcmV0dXJuIHplcm8uCmZ1bmN0aW9uIGdldENzc0Zsb2F0KGVsLCBwcm9wKSB7CglyZXR1cm4gcGFyc2VGbG9hdChlbC5jc3MocHJvcCkpIHx8IDA7Cn0KCgovKiBNb3VzZSAvIFRvdWNoIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCkZDLnByZXZlbnREZWZhdWx0ID0gcHJldmVudERlZmF1bHQ7CgoKLy8gUmV0dXJucyBhIGJvb2xlYW4gd2hldGhlciB0aGlzIHdhcyBhIGxlZnQgbW91c2UgY2xpY2sgYW5kIG5vIGN0cmwga2V5ICh3aGljaCBtZWFucyByaWdodCBjbGljayBvbiBNYWMpCmZ1bmN0aW9uIGlzUHJpbWFyeU1vdXNlQnV0dG9uKGV2KSB7CglyZXR1cm4gZXYud2hpY2ggPT0gMSAmJiAhZXYuY3RybEtleTsKfQoKCmZ1bmN0aW9uIGdldEV2WChldikgewoJaWYgKGV2LnBhZ2VYICE9PSB1bmRlZmluZWQpIHsKCQlyZXR1cm4gZXYucGFnZVg7Cgl9Cgl2YXIgdG91Y2hlcyA9IGV2Lm9yaWdpbmFsRXZlbnQudG91Y2hlczsKCWlmICh0b3VjaGVzKSB7CgkJcmV0dXJuIHRvdWNoZXNbMF0ucGFnZVg7Cgl9Cn0KCgpmdW5jdGlvbiBnZXRFdlkoZXYpIHsKCWlmIChldi5wYWdlWSAhPT0gdW5kZWZpbmVkKSB7CgkJcmV0dXJuIGV2LnBhZ2VZOwoJfQoJdmFyIHRvdWNoZXMgPSBldi5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7CglpZiAodG91Y2hlcykgewoJCXJldHVybiB0b3VjaGVzWzBdLnBhZ2VZOwoJfQp9CgoKZnVuY3Rpb24gZ2V0RXZJc1RvdWNoKGV2KSB7CglyZXR1cm4gL150b3VjaC8udGVzdChldi50eXBlKTsKfQoKCmZ1bmN0aW9uIHByZXZlbnRTZWxlY3Rpb24oZWwpIHsKCWVsLmFkZENsYXNzKCdmYy11bnNlbGVjdGFibGUnKQoJCS5vbignc2VsZWN0c3RhcnQnLCBwcmV2ZW50RGVmYXVsdCk7Cn0KCgovLyBTdG9wcyBhIG1vdXNlL3RvdWNoIGV2ZW50IGZyb20gZG9pbmcgaXQncyBuYXRpdmUgYnJvd3NlciBhY3Rpb24KZnVuY3Rpb24gcHJldmVudERlZmF1bHQoZXYpIHsKCWV2LnByZXZlbnREZWZhdWx0KCk7Cn0KCgovLyBhdHRhY2ggYSBoYW5kbGVyIHRvIGdldCBjYWxsZWQgd2hlbiBBTlkgc2Nyb2xsIGFjdGlvbiBoYXBwZW5zIG9uIHRoZSBwYWdlLgovLyB0aGlzIHdhcyBpbXBvc3NpYmxlIHRvIGRvIHdpdGggbm9ybWFsIG9uL29mZiBiZWNhdXNlICdzY3JvbGwnIGRvZXNuJ3QgYnViYmxlLgovLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zMjk1NDU2NS85NjM0MgovLyByZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLgpmdW5jdGlvbiBiaW5kQW55U2Nyb2xsKGhhbmRsZXIpIHsKCWlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewoJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCB0cnVlKTsgLy8gdXNlQ2FwdHVyZT10cnVlCgkJcmV0dXJuIHRydWU7Cgl9CglyZXR1cm4gZmFsc2U7Cn0KCgovLyB1bmRvZXMgYmluZEFueVNjcm9sbC4gbXVzdCBwYXNzIGluIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4KLy8gcmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4KZnVuY3Rpb24gdW5iaW5kQW55U2Nyb2xsKGhhbmRsZXIpIHsKCWlmICh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcikgewoJCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCB0cnVlKTsgLy8gdXNlQ2FwdHVyZT10cnVlCgkJcmV0dXJuIHRydWU7Cgl9CglyZXR1cm4gZmFsc2U7Cn0KCgovKiBHZW5lcmFsIEdlb21ldHJ5IFV0aWxzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMuaW50ZXJzZWN0UmVjdHMgPSBpbnRlcnNlY3RSZWN0czsKCi8vIFJldHVybnMgYSBuZXcgcmVjdGFuZ2xlIHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIHJlY3RhbmdsZXMuIElmIHRoZXkgZG9uJ3QgaW50ZXJzZWN0LCByZXR1cm5zIGZhbHNlCmZ1bmN0aW9uIGludGVyc2VjdFJlY3RzKHJlY3QxLCByZWN0MikgewoJdmFyIHJlcyA9IHsKCQlsZWZ0OiBNYXRoLm1heChyZWN0MS5sZWZ0LCByZWN0Mi5sZWZ0KSwKCQlyaWdodDogTWF0aC5taW4ocmVjdDEucmlnaHQsIHJlY3QyLnJpZ2h0KSwKCQl0b3A6IE1hdGgubWF4KHJlY3QxLnRvcCwgcmVjdDIudG9wKSwKCQlib3R0b206IE1hdGgubWluKHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKQoJfTsKCglpZiAocmVzLmxlZnQgPCByZXMucmlnaHQgJiYgcmVzLnRvcCA8IHJlcy5ib3R0b20pIHsKCQlyZXR1cm4gcmVzOwoJfQoJcmV0dXJuIGZhbHNlOwp9CgoKLy8gUmV0dXJucyBhIG5ldyBwb2ludCB0aGF0IHdpbGwgaGF2ZSBiZWVuIG1vdmVkIHRvIHJlc2lkZSB3aXRoaW4gdGhlIGdpdmVuIHJlY3RhbmdsZQpmdW5jdGlvbiBjb25zdHJhaW5Qb2ludChwb2ludCwgcmVjdCkgewoJcmV0dXJuIHsKCQlsZWZ0OiBNYXRoLm1pbihNYXRoLm1heChwb2ludC5sZWZ0LCByZWN0LmxlZnQpLCByZWN0LnJpZ2h0KSwKCQl0b3A6IE1hdGgubWluKE1hdGgubWF4KHBvaW50LnRvcCwgcmVjdC50b3ApLCByZWN0LmJvdHRvbSkKCX07Cn0KCgovLyBSZXR1cm5zIGEgcG9pbnQgdGhhdCBpcyB0aGUgY2VudGVyIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUKZnVuY3Rpb24gZ2V0UmVjdENlbnRlcihyZWN0KSB7CglyZXR1cm4gewoJCWxlZnQ6IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIsCgkJdG9wOiAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyCgl9Owp9CgoKLy8gU3VidHJhY3RzIHBvaW50MidzIGNvb3JkaW5hdGVzIGZyb20gcG9pbnQxJ3MgY29vcmRpbmF0ZXMsIHJldHVybmluZyBhIGRlbHRhCmZ1bmN0aW9uIGRpZmZQb2ludHMocG9pbnQxLCBwb2ludDIpIHsKCXJldHVybiB7CgkJbGVmdDogcG9pbnQxLmxlZnQgLSBwb2ludDIubGVmdCwKCQl0b3A6IHBvaW50MS50b3AgLSBwb2ludDIudG9wCgl9Owp9CgoKLyogT2JqZWN0IE9yZGVyaW5nIGJ5IEZpZWxkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMucGFyc2VGaWVsZFNwZWNzID0gcGFyc2VGaWVsZFNwZWNzOwpGQy5jb21wYXJlQnlGaWVsZFNwZWNzID0gY29tcGFyZUJ5RmllbGRTcGVjczsKRkMuY29tcGFyZUJ5RmllbGRTcGVjID0gY29tcGFyZUJ5RmllbGRTcGVjOwpGQy5mbGV4aWJsZUNvbXBhcmUgPSBmbGV4aWJsZUNvbXBhcmU7CgoKZnVuY3Rpb24gcGFyc2VGaWVsZFNwZWNzKGlucHV0KSB7Cgl2YXIgc3BlY3MgPSBbXTsKCXZhciB0b2tlbnMgPSBbXTsKCXZhciBpLCB0b2tlbjsKCglpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgewoJCXRva2VucyA9IGlucHV0LnNwbGl0KC9ccyosXHMqLyk7Cgl9CgllbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHsKCQl0b2tlbnMgPSBbIGlucHV0IF07Cgl9CgllbHNlIGlmICgkLmlzQXJyYXkoaW5wdXQpKSB7CgkJdG9rZW5zID0gaW5wdXQ7Cgl9CgoJZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewoJCXRva2VuID0gdG9rZW5zW2ldOwoKCQlpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykgewoJCQlzcGVjcy5wdXNoKAoJCQkJdG9rZW4uY2hhckF0KDApID09ICctJyA/CgkJCQkJeyBmaWVsZDogdG9rZW4uc3Vic3RyaW5nKDEpLCBvcmRlcjogLTEgfSA6CgkJCQkJeyBmaWVsZDogdG9rZW4sIG9yZGVyOiAxIH0KCQkJKTsKCQl9CgkJZWxzZSBpZiAodHlwZW9mIHRva2VuID09PSAnZnVuY3Rpb24nKSB7CgkJCXNwZWNzLnB1c2goeyBmdW5jOiB0b2tlbiB9KTsKCQl9Cgl9CgoJcmV0dXJuIHNwZWNzOwp9CgoKZnVuY3Rpb24gY29tcGFyZUJ5RmllbGRTcGVjcyhvYmoxLCBvYmoyLCBmaWVsZFNwZWNzKSB7Cgl2YXIgaTsKCXZhciBjbXA7CgoJZm9yIChpID0gMDsgaSA8IGZpZWxkU3BlY3MubGVuZ3RoOyBpKyspIHsKCQljbXAgPSBjb21wYXJlQnlGaWVsZFNwZWMob2JqMSwgb2JqMiwgZmllbGRTcGVjc1tpXSk7CgkJaWYgKGNtcCkgewoJCQlyZXR1cm4gY21wOwoJCX0KCX0KCglyZXR1cm4gMDsKfQoKCmZ1bmN0aW9uIGNvbXBhcmVCeUZpZWxkU3BlYyhvYmoxLCBvYmoyLCBmaWVsZFNwZWMpIHsKCWlmIChmaWVsZFNwZWMuZnVuYykgewoJCXJldHVybiBmaWVsZFNwZWMuZnVuYyhvYmoxLCBvYmoyKTsKCX0KCXJldHVybiBmbGV4aWJsZUNvbXBhcmUob2JqMVtmaWVsZFNwZWMuZmllbGRdLCBvYmoyW2ZpZWxkU3BlYy5maWVsZF0pICoKCQkoZmllbGRTcGVjLm9yZGVyIHx8IDEpOwp9CgoKZnVuY3Rpb24gZmxleGlibGVDb21wYXJlKGEsIGIpIHsKCWlmICghYSAmJiAhYikgewoJCXJldHVybiAwOwoJfQoJaWYgKGIgPT0gbnVsbCkgewoJCXJldHVybiAtMTsKCX0KCWlmIChhID09IG51bGwpIHsKCQlyZXR1cm4gMTsKCX0KCWlmICgkLnR5cGUoYSkgPT09ICdzdHJpbmcnIHx8ICQudHlwZShiKSA9PT0gJ3N0cmluZycpIHsKCQlyZXR1cm4gU3RyaW5nKGEpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIpKTsKCX0KCXJldHVybiBhIC0gYjsKfQoKCi8qIEZ1bGxDYWxlbmRhci1zcGVjaWZpYyBNaXNjIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgovLyBDb21wdXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gcmFuZ2VzLiBXaWxsIHJldHVybiBmcmVzaCBkYXRlIGNsb25lcyBpbiBhIHJhbmdlLgovLyBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBpbnRlcnNlY3Rpb24uCi8vIEV4cGVjdHMgYWxsIGRhdGVzIHRvIGJlIG5vcm1hbGl6ZWQgdG8gdGhlIHNhbWUgdGltZXpvbmUgYmVmb3JlaGFuZC4KLy8gVE9ETzogbW92ZSB0byBkYXRlIHNlY3Rpb24/CmZ1bmN0aW9uIGludGVyc2VjdFJhbmdlcyhzdWJqZWN0UmFuZ2UsIGNvbnN0cmFpbnRSYW5nZSkgewoJdmFyIHN1YmplY3RTdGFydCA9IHN1YmplY3RSYW5nZS5zdGFydDsKCXZhciBzdWJqZWN0RW5kID0gc3ViamVjdFJhbmdlLmVuZDsKCXZhciBjb25zdHJhaW50U3RhcnQgPSBjb25zdHJhaW50UmFuZ2Uuc3RhcnQ7Cgl2YXIgY29uc3RyYWludEVuZCA9IGNvbnN0cmFpbnRSYW5nZS5lbmQ7Cgl2YXIgc2VnU3RhcnQsIHNlZ0VuZDsKCXZhciBpc1N0YXJ0LCBpc0VuZDsKCglpZiAoc3ViamVjdEVuZCA+IGNvbnN0cmFpbnRTdGFydCAmJiBzdWJqZWN0U3RhcnQgPCBjb25zdHJhaW50RW5kKSB7IC8vIGluIGJvdW5kcyBhdCBhbGw/CgoJCWlmIChzdWJqZWN0U3RhcnQgPj0gY29uc3RyYWludFN0YXJ0KSB7CgkJCXNlZ1N0YXJ0ID0gc3ViamVjdFN0YXJ0LmNsb25lKCk7CgkJCWlzU3RhcnQgPSB0cnVlOwoJCX0KCQllbHNlIHsKCQkJc2VnU3RhcnQgPSBjb25zdHJhaW50U3RhcnQuY2xvbmUoKTsKCQkJaXNTdGFydCA9ICBmYWxzZTsKCQl9CgoJCWlmIChzdWJqZWN0RW5kIDw9IGNvbnN0cmFpbnRFbmQpIHsKCQkJc2VnRW5kID0gc3ViamVjdEVuZC5jbG9uZSgpOwoJCQlpc0VuZCA9IHRydWU7CgkJfQoJCWVsc2UgewoJCQlzZWdFbmQgPSBjb25zdHJhaW50RW5kLmNsb25lKCk7CgkJCWlzRW5kID0gZmFsc2U7CgkJfQoKCQlyZXR1cm4gewoJCQlzdGFydDogc2VnU3RhcnQsCgkJCWVuZDogc2VnRW5kLAoJCQlpc1N0YXJ0OiBpc1N0YXJ0LAoJCQlpc0VuZDogaXNFbmQKCQl9OwoJfQp9CgoKLyogRGF0ZSBVdGlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpGQy5jb21wdXRlSW50ZXJ2YWxVbml0ID0gY29tcHV0ZUludGVydmFsVW5pdDsKRkMuZGl2aWRlUmFuZ2VCeUR1cmF0aW9uID0gZGl2aWRlUmFuZ2VCeUR1cmF0aW9uOwpGQy5kaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24gPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb247CkZDLm11bHRpcGx5RHVyYXRpb24gPSBtdWx0aXBseUR1cmF0aW9uOwpGQy5kdXJhdGlvbkhhc1RpbWUgPSBkdXJhdGlvbkhhc1RpbWU7Cgp2YXIgZGF5SURzID0gWyAnc3VuJywgJ21vbicsICd0dWUnLCAnd2VkJywgJ3RodScsICdmcmknLCAnc2F0JyBdOwp2YXIgaW50ZXJ2YWxVbml0cyA9IFsgJ3llYXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJyBdOwoKCi8vIERpZmZzIHRoZSB0d28gbW9tZW50cyBpbnRvIGEgRHVyYXRpb24gd2hlcmUgZnVsbC1kYXlzIGFyZSByZWNvcmRlZCBmaXJzdCwgdGhlbiB0aGUgcmVtYWluaW5nIHRpbWUuCi8vIE1vbWVudHMgd2lsbCBoYXZlIHRoZWlyIHRpbWV6b25lcyBub3JtYWxpemVkLgpmdW5jdGlvbiBkaWZmRGF5VGltZShhLCBiKSB7CglyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHsKCQlkYXlzOiBhLmNsb25lKCkuc3RyaXBUaW1lKCkuZGlmZihiLmNsb25lKCkuc3RyaXBUaW1lKCksICdkYXlzJyksCgkJbXM6IGEudGltZSgpIC0gYi50aW1lKCkgLy8gdGltZS1vZi1kYXkgZnJvbSBkYXkgc3RhcnQuIGRpc3JlZ2FyZHMgdGltZXpvbmUKCX0pOwp9CgoKLy8gRGlmZnMgdGhlIHR3byBtb21lbnRzIHZpYSB0aGVpciBzdGFydC1vZi1kYXkgKHJlZ2FyZGxlc3Mgb2YgdGltZXpvbmUpLiBQcm9kdWNlcyB3aG9sZS1kYXkgZHVyYXRpb25zLgpmdW5jdGlvbiBkaWZmRGF5KGEsIGIpIHsKCXJldHVybiBtb21lbnQuZHVyYXRpb24oewoJCWRheXM6IGEuY2xvbmUoKS5zdHJpcFRpbWUoKS5kaWZmKGIuY2xvbmUoKS5zdHJpcFRpbWUoKSwgJ2RheXMnKQoJfSk7Cn0KCgovLyBEaWZmcyB0d28gbW9tZW50cywgcHJvZHVjaW5nIGEgZHVyYXRpb24sIG1hZGUgb2YgYSB3aG9sZS11bml0LWluY3JlbWVudCBvZiB0aGUgZ2l2ZW4gdW5pdC4gVXNlcyByb3VuZGluZy4KZnVuY3Rpb24gZGlmZkJ5VW5pdChhLCBiLCB1bml0KSB7CglyZXR1cm4gbW9tZW50LmR1cmF0aW9uKAoJCU1hdGgucm91bmQoYS5kaWZmKGIsIHVuaXQsIHRydWUpKSwgLy8gcmV0dXJuRmxvYXQ9dHJ1ZQoJCXVuaXQKCSk7Cn0KCgovLyBDb21wdXRlcyB0aGUgdW5pdCBuYW1lIG9mIHRoZSBsYXJnZXN0IHdob2xlLXVuaXQgcGVyaW9kIG9mIHRpbWUuCi8vIEZvciBleGFtcGxlLCA0OCBob3VycyB3aWxsIGJlICJkYXlzIiB3aGVyZWFzIDQ5IGhvdXJzIHdpbGwgYmUgImhvdXJzIi4KLy8gQWNjZXB0cyBzdGFydC9lbmQsIGEgcmFuZ2Ugb2JqZWN0LCBvciBhbiBvcmlnaW5hbCBkdXJhdGlvbiBvYmplY3QuCmZ1bmN0aW9uIGNvbXB1dGVJbnRlcnZhbFVuaXQoc3RhcnQsIGVuZCkgewoJdmFyIGksIHVuaXQ7Cgl2YXIgdmFsOwoKCWZvciAoaSA9IDA7IGkgPCBpbnRlcnZhbFVuaXRzLmxlbmd0aDsgaSsrKSB7CgkJdW5pdCA9IGludGVydmFsVW5pdHNbaV07CgkJdmFsID0gY29tcHV0ZVJhbmdlQXModW5pdCwgc3RhcnQsIGVuZCk7CgoJCWlmICh2YWwgPj0gMSAmJiBpc0ludCh2YWwpKSB7CgkJCWJyZWFrOwoJCX0KCX0KCglyZXR1cm4gdW5pdDsgLy8gd2lsbCBiZSAibWlsbGlzZWNvbmRzIiBpZiBub3RoaW5nIGVsc2UgbWF0Y2hlcwp9CgoKLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiB1bml0cyAobGlrZSAiaG91cnMiKSBpbiB0aGUgZ2l2ZW4gcmFuZ2UuCi8vIFJhbmdlIGNhbiBiZSBhIHtzdGFydCxlbmR9IG9iamVjdCwgc2VwYXJhdGUgc3RhcnQvZW5kIGFyZ3MsIG9yIGEgRHVyYXRpb24uCi8vIFJlc3VsdHMgYXJlIGJhc2VkIG9uIE1vbWVudCdzIC5hcygpIGFuZCAuZGlmZigpIG1ldGhvZHMsIHNvIHJlc3VsdHMgY2FuIGRlcGVuZCBvbiBpbnRlcm5hbCBoYW5kbGluZwovLyBvZiBtb250aC1kaWZmaW5nIGxvZ2ljICh3aGljaCB0ZW5kcyB0byB2YXJ5IGZyb20gdmVyc2lvbiB0byB2ZXJzaW9uKS4KZnVuY3Rpb24gY29tcHV0ZVJhbmdlQXModW5pdCwgc3RhcnQsIGVuZCkgewoKCWlmIChlbmQgIT0gbnVsbCkgeyAvLyBnaXZlbiBzdGFydCwgZW5kCgkJcmV0dXJuIGVuZC5kaWZmKHN0YXJ0LCB1bml0LCB0cnVlKTsKCX0KCWVsc2UgaWYgKG1vbWVudC5pc0R1cmF0aW9uKHN0YXJ0KSkgeyAvLyBnaXZlbiBkdXJhdGlvbgoJCXJldHVybiBzdGFydC5hcyh1bml0KTsKCX0KCWVsc2UgeyAvLyBnaXZlbiB7IHN0YXJ0LCBlbmQgfSByYW5nZSBvYmplY3QKCQlyZXR1cm4gc3RhcnQuZW5kLmRpZmYoc3RhcnQuc3RhcnQsIHVuaXQsIHRydWUpOwoJfQp9CgoKLy8gSW50ZWxsaWdlbnRseSBkaXZpZGVzIGEgcmFuZ2UgKHNwZWNpZmllZCBieSBhIHN0YXJ0L2VuZCBwYXJhbXMpIGJ5IGEgZHVyYXRpb24KZnVuY3Rpb24gZGl2aWRlUmFuZ2VCeUR1cmF0aW9uKHN0YXJ0LCBlbmQsIGR1cikgewoJdmFyIG1vbnRoczsKCglpZiAoZHVyYXRpb25IYXNUaW1lKGR1cikpIHsKCQlyZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cjsKCX0KCW1vbnRocyA9IGR1ci5hc01vbnRocygpOwoJaWYgKE1hdGguYWJzKG1vbnRocykgPj0gMSAmJiBpc0ludChtb250aHMpKSB7CgkJcmV0dXJuIGVuZC5kaWZmKHN0YXJ0LCAnbW9udGhzJywgdHJ1ZSkgLyBtb250aHM7Cgl9CglyZXR1cm4gZW5kLmRpZmYoc3RhcnQsICdkYXlzJywgdHJ1ZSkgLyBkdXIuYXNEYXlzKCk7Cn0KCgovLyBJbnRlbGxpZ2VudGx5IGRpdmlkZXMgb25lIGR1cmF0aW9uIGJ5IGFub3RoZXIKZnVuY3Rpb24gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKGR1cjEsIGR1cjIpIHsKCXZhciBtb250aHMxLCBtb250aHMyOwoKCWlmIChkdXJhdGlvbkhhc1RpbWUoZHVyMSkgfHwgZHVyYXRpb25IYXNUaW1lKGR1cjIpKSB7CgkJcmV0dXJuIGR1cjEgLyBkdXIyOwoJfQoJbW9udGhzMSA9IGR1cjEuYXNNb250aHMoKTsKCW1vbnRoczIgPSBkdXIyLmFzTW9udGhzKCk7CglpZiAoCgkJTWF0aC5hYnMobW9udGhzMSkgPj0gMSAmJiBpc0ludChtb250aHMxKSAmJgoJCU1hdGguYWJzKG1vbnRoczIpID49IDEgJiYgaXNJbnQobW9udGhzMikKCSkgewoJCXJldHVybiBtb250aHMxIC8gbW9udGhzMjsKCX0KCXJldHVybiBkdXIxLmFzRGF5cygpIC8gZHVyMi5hc0RheXMoKTsKfQoKCi8vIEludGVsbGlnZW50bHkgbXVsdGlwbGllcyBhIGR1cmF0aW9uIGJ5IGEgbnVtYmVyCmZ1bmN0aW9uIG11bHRpcGx5RHVyYXRpb24oZHVyLCBuKSB7Cgl2YXIgbW9udGhzOwoKCWlmIChkdXJhdGlvbkhhc1RpbWUoZHVyKSkgewoJCXJldHVybiBtb21lbnQuZHVyYXRpb24oZHVyICogbik7Cgl9Cgltb250aHMgPSBkdXIuYXNNb250aHMoKTsKCWlmIChNYXRoLmFicyhtb250aHMpID49IDEgJiYgaXNJbnQobW9udGhzKSkgewoJCXJldHVybiBtb21lbnQuZHVyYXRpb24oeyBtb250aHM6IG1vbnRocyAqIG4gfSk7Cgl9CglyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHsgZGF5czogZHVyLmFzRGF5cygpICogbiB9KTsKfQoKCi8vIFJldHVybnMgYSBib29sZWFuIGFib3V0IHdoZXRoZXIgdGhlIGdpdmVuIGR1cmF0aW9uIGhhcyBhbnkgdGltZSBwYXJ0cyAoaG91cnMvbWludXRlcy9zZWNvbmRzL21zKQpmdW5jdGlvbiBkdXJhdGlvbkhhc1RpbWUoZHVyKSB7CglyZXR1cm4gQm9vbGVhbihkdXIuaG91cnMoKSB8fCBkdXIubWludXRlcygpIHx8IGR1ci5zZWNvbmRzKCkgfHwgZHVyLm1pbGxpc2Vjb25kcygpKTsKfQoKCmZ1bmN0aW9uIGlzTmF0aXZlRGF0ZShpbnB1dCkgewoJcmV0dXJuICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXScgfHwgaW5wdXQgaW5zdGFuY2VvZiBEYXRlOwp9CgoKLy8gUmV0dXJucyBhIGJvb2xlYW4gYWJvdXQgd2hldGhlciB0aGUgZ2l2ZW4gaW5wdXQgaXMgYSB0aW1lIHN0cmluZywgbGlrZSAiMDY6NDA6MDAiIG9yICIwNjowMCIKZnVuY3Rpb24gaXNUaW1lU3RyaW5nKHN0cikgewoJcmV0dXJuIC9eXGQrXDpcZCsoPzpcOlxkK1wuPyg/OlxkezN9KT8pPyQvLnRlc3Qoc3RyKTsKfQoKCi8qIExvZ2dpbmcgYW5kIERlYnVnCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMubG9nID0gZnVuY3Rpb24oKSB7Cgl2YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlOwoKCWlmIChjb25zb2xlICYmIGNvbnNvbGUubG9nKSB7CgkJcmV0dXJuIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7Cgl9Cn07CgpGQy53YXJuID0gZnVuY3Rpb24oKSB7Cgl2YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlOwoKCWlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgewoJCXJldHVybiBjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTsKCX0KCWVsc2UgewoJCXJldHVybiBGQy5sb2cuYXBwbHkoRkMsIGFyZ3VtZW50cyk7Cgl9Cn07CgoKLyogR2VuZXJhbCBVdGlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgaGFzT3duUHJvcE1ldGhvZCA9IHt9Lmhhc093blByb3BlcnR5OwoKCi8vIE1lcmdlcyBhbiBhcnJheSBvZiBvYmplY3RzIGludG8gYSBzaW5nbGUgb2JqZWN0LgovLyBUaGUgc2Vjb25kIGFyZ3VtZW50IGFsbG93cyBmb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgd2hvJ3Mgb2JqZWN0IHZhbHVlcyB3aWxsIGJlIG1lcmdlZCB0b2dldGhlci4KZnVuY3Rpb24gbWVyZ2VQcm9wcyhwcm9wT2JqcywgY29tcGxleFByb3BzKSB7Cgl2YXIgZGVzdCA9IHt9OwoJdmFyIGksIG5hbWU7Cgl2YXIgY29tcGxleE9ianM7Cgl2YXIgaiwgdmFsOwoJdmFyIHByb3BzOwoKCWlmIChjb21wbGV4UHJvcHMpIHsKCQlmb3IgKGkgPSAwOyBpIDwgY29tcGxleFByb3BzLmxlbmd0aDsgaSsrKSB7CgkJCW5hbWUgPSBjb21wbGV4UHJvcHNbaV07CgkJCWNvbXBsZXhPYmpzID0gW107CgoJCQkvLyBjb2xsZWN0IHRoZSB0cmFpbGluZyBvYmplY3QgdmFsdWVzLCBzdG9wcGluZyB3aGVuIGEgbm9uLW9iamVjdCBpcyBkaXNjb3ZlcmVkCgkJCWZvciAoaiA9IHByb3BPYmpzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CgkJCQl2YWwgPSBwcm9wT2Jqc1tqXVtuYW1lXTsKCgkJCQlpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKCQkJCQljb21wbGV4T2Jqcy51bnNoaWZ0KHZhbCk7CgkJCQl9CgkJCQllbHNlIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgewoJCQkJCWRlc3RbbmFtZV0gPSB2YWw7IC8vIGlmIHRoZXJlIHdlcmUgbm8gb2JqZWN0cywgdGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJLy8gaWYgdGhlIHRyYWlsaW5nIHZhbHVlcyB3ZXJlIG9iamVjdHMsIHVzZSB0aGUgbWVyZ2VkIHZhbHVlCgkJCWlmIChjb21wbGV4T2Jqcy5sZW5ndGgpIHsKCQkJCWRlc3RbbmFtZV0gPSBtZXJnZVByb3BzKGNvbXBsZXhPYmpzKTsKCQkJfQoJCX0KCX0KCgkvLyBjb3B5IHZhbHVlcyBpbnRvIHRoZSBkZXN0aW5hdGlvbiwgZ29pbmcgZnJvbSBsYXN0IHRvIGZpcnN0Cglmb3IgKGkgPSBwcm9wT2Jqcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCXByb3BzID0gcHJvcE9ianNbaV07CgoJCWZvciAobmFtZSBpbiBwcm9wcykgewoJCQlpZiAoIShuYW1lIGluIGRlc3QpKSB7IC8vIGlmIGFscmVhZHkgYXNzaWduZWQgYnkgcHJldmlvdXMgcHJvcHMgb3IgY29tcGxleCBwcm9wcywgZG9uJ3QgcmVhc3NpZ24KCQkJCWRlc3RbbmFtZV0gPSBwcm9wc1tuYW1lXTsKCQkJfQoJCX0KCX0KCglyZXR1cm4gZGVzdDsKfQoKCi8vIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBoYXMgdGhlIGdpdmVuIHByb3RvdHlwZS4gSnVzdCBsaWtlIE9iamVjdC5jcmVhdGUKZnVuY3Rpb24gY3JlYXRlT2JqZWN0KHByb3RvKSB7Cgl2YXIgZiA9IGZ1bmN0aW9uKCkge307CglmLnByb3RvdHlwZSA9IHByb3RvOwoJcmV0dXJuIG5ldyBmKCk7Cn0KCgpmdW5jdGlvbiBjb3B5T3duUHJvcHMoc3JjLCBkZXN0KSB7Cglmb3IgKHZhciBuYW1lIGluIHNyYykgewoJCWlmIChoYXNPd25Qcm9wKHNyYywgbmFtZSkpIHsKCQkJZGVzdFtuYW1lXSA9IHNyY1tuYW1lXTsKCQl9Cgl9Cn0KCgpmdW5jdGlvbiBoYXNPd25Qcm9wKG9iaiwgbmFtZSkgewoJcmV0dXJuIGhhc093blByb3BNZXRob2QuY2FsbChvYmosIG5hbWUpOwp9CgoKLy8gSXMgdGhlIGdpdmVuIHZhbHVlIGEgbm9uLW9iamVjdCBub24tZnVuY3Rpb24gdmFsdWU/CmZ1bmN0aW9uIGlzQXRvbWljKHZhbCkgewoJcmV0dXJuIC91bmRlZmluZWR8bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmcvLnRlc3QoJC50eXBlKHZhbCkpOwp9CgoKZnVuY3Rpb24gYXBwbHlBbGwoZnVuY3Rpb25zLCB0aGlzT2JqLCBhcmdzKSB7CglpZiAoJC5pc0Z1bmN0aW9uKGZ1bmN0aW9ucykpIHsKCQlmdW5jdGlvbnMgPSBbIGZ1bmN0aW9ucyBdOwoJfQoJaWYgKGZ1bmN0aW9ucykgewoJCXZhciBpOwoJCXZhciByZXQ7CgkJZm9yIChpPTA7IGk8ZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7CgkJCXJldCA9IGZ1bmN0aW9uc1tpXS5hcHBseSh0aGlzT2JqLCBhcmdzKSB8fCByZXQ7CgkJfQoJCXJldHVybiByZXQ7Cgl9Cn0KCgpmdW5jdGlvbiBmaXJzdERlZmluZWQoKSB7Cglmb3IgKHZhciBpPTA7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkJaWYgKGFyZ3VtZW50c1tpXSAhPT0gdW5kZWZpbmVkKSB7CgkJCXJldHVybiBhcmd1bWVudHNbaV07CgkJfQoJfQp9CgoKZnVuY3Rpb24gaHRtbEVzY2FwZShzKSB7CglyZXR1cm4gKHMgKyAnJykucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQoJCS5yZXBsYWNlKC88L2csICcmbHQ7JykKCQkucmVwbGFjZSgvPi9nLCAnJmd0OycpCgkJLnJlcGxhY2UoLycvZywgJyYjMDM5OycpCgkJLnJlcGxhY2UoLyIvZywgJyZxdW90OycpCgkJLnJlcGxhY2UoL1xuL2csICc8YnIgLz4nKTsKfQoKCmZ1bmN0aW9uIHN0cmlwSHRtbEVudGl0aWVzKHRleHQpIHsKCXJldHVybiB0ZXh0LnJlcGxhY2UoLyYuKj87L2csICcnKTsKfQoKCi8vIEdpdmVuIGEgaGFzaCBvZiBDU1MgcHJvcGVydGllcywgcmV0dXJucyBhIHN0cmluZyBvZiBDU1MuCi8vIFVzZXMgcHJvcGVydHkgbmFtZXMgYXMtaXMgKG5vIGNhbWVsLWNhc2UgY29udmVyc2lvbikuIFdpbGwgbm90IG1ha2Ugc3RhdGVtZW50cyBmb3IgbnVsbC91bmRlZmluZWQgdmFsdWVzLgpmdW5jdGlvbiBjc3NUb1N0cihjc3NQcm9wcykgewoJdmFyIHN0YXRlbWVudHMgPSBbXTsKCgkkLmVhY2goY3NzUHJvcHMsIGZ1bmN0aW9uKG5hbWUsIHZhbCkgewoJCWlmICh2YWwgIT0gbnVsbCkgewoJCQlzdGF0ZW1lbnRzLnB1c2gobmFtZSArICc6JyArIHZhbCk7CgkJfQoJfSk7CgoJcmV0dXJuIHN0YXRlbWVudHMuam9pbignOycpOwp9CgoKLy8gR2l2ZW4gYW4gb2JqZWN0IGhhc2ggb2YgSFRNTCBhdHRyaWJ1dGUgbmFtZXMgdG8gdmFsdWVzLAovLyBnZW5lcmF0ZXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgYmV0d2VlbiA8ID4gaW4gSFRNTApmdW5jdGlvbiBhdHRyc1RvU3RyKGF0dHJzKSB7Cgl2YXIgcGFydHMgPSBbXTsKCgkkLmVhY2goYXR0cnMsIGZ1bmN0aW9uKG5hbWUsIHZhbCkgewoJCWlmICh2YWwgIT0gbnVsbCkgewoJCQlwYXJ0cy5wdXNoKG5hbWUgKyAnPSInICsgaHRtbEVzY2FwZSh2YWwpICsgJyInKTsKCQl9Cgl9KTsKCglyZXR1cm4gcGFydHMuam9pbignICcpOwp9CgoKZnVuY3Rpb24gY2FwaXRhbGlzZUZpcnN0TGV0dGVyKHN0cikgewoJcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTsKfQoKCmZ1bmN0aW9uIGNvbXBhcmVOdW1iZXJzKGEsIGIpIHsgLy8gZm9yIC5zb3J0KCkKCXJldHVybiBhIC0gYjsKfQoKCmZ1bmN0aW9uIGlzSW50KG4pIHsKCXJldHVybiBuICUgMSA9PT0gMDsKfQoKCi8vIFJldHVybnMgYSBtZXRob2QgYm91bmQgdG8gdGhlIGdpdmVuIG9iamVjdCBjb250ZXh0LgovLyBKdXN0IGxpa2Ugb25lIG9mIHRoZSBqUXVlcnkucHJveHkgc2lnbmF0dXJlcywgYnV0IHdpdGhvdXQgdGhlIHVuZGVzaXJlZCBiZWhhdmlvciBvZiB0cmVhdGluZyB0aGUgc2FtZSBtZXRob2Qgd2l0aAovLyBkaWZmZXJlbnQgY29udGV4dHMgYXMgaWRlbnRpY2FsIHdoZW4gYmluZGluZy91bmJpbmRpbmcgZXZlbnRzLgpmdW5jdGlvbiBwcm94eShvYmosIG1ldGhvZE5hbWUpIHsKCXZhciBtZXRob2QgPSBvYmpbbWV0aG9kTmFtZV07CgoJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCXJldHVybiBtZXRob2QuYXBwbHkob2JqLCBhcmd1bWVudHMpOwoJfTsKfQoKCi8vIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgYXMgbG9uZyBhcyBpdCBjb250aW51ZXMgdG8gYmUgaW52b2tlZCwgd2lsbCBub3QKLy8gYmUgdHJpZ2dlcmVkLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvcgovLyBOIG1pbGxpc2Vjb25kcy4gSWYgYGltbWVkaWF0ZWAgaXMgcGFzc2VkLCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGUKLy8gbGVhZGluZyBlZGdlLCBpbnN0ZWFkIG9mIHRoZSB0cmFpbGluZy4KLy8gaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL2Jsb2IvMS42LjAvdW5kZXJzY29yZS5qcyNMNzE0CmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkgewoJdmFyIHRpbWVvdXQsIGFyZ3MsIGNvbnRleHQsIHRpbWVzdGFtcCwgcmVzdWx0OwoKCXZhciBsYXRlciA9IGZ1bmN0aW9uKCkgewoJCXZhciBsYXN0ID0gK25ldyBEYXRlKCkgLSB0aW1lc3RhbXA7CgkJaWYgKGxhc3QgPCB3YWl0KSB7CgkJCXRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0IC0gbGFzdCk7CgkJfQoJCWVsc2UgewoJCQl0aW1lb3V0ID0gbnVsbDsKCQkJaWYgKCFpbW1lZGlhdGUpIHsKCQkJCXJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7CgkJCQljb250ZXh0ID0gYXJncyA9IG51bGw7CgkJCX0KCQl9Cgl9OwoKCXJldHVybiBmdW5jdGlvbigpIHsKCQljb250ZXh0ID0gdGhpczsKCQlhcmdzID0gYXJndW1lbnRzOwoJCXRpbWVzdGFtcCA9ICtuZXcgRGF0ZSgpOwoJCXZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0OwoJCWlmICghdGltZW91dCkgewoJCQl0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7CgkJfQoJCWlmIChjYWxsTm93KSB7CgkJCXJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7CgkJCWNvbnRleHQgPSBhcmdzID0gbnVsbDsKCQl9CgkJcmV0dXJuIHJlc3VsdDsKCX07Cn0KCgovLyBIQUNLIGFyb3VuZCBqUXVlcnkncyBub3cgQSsgcHJvbWlzZXM6IGV4ZWN1dGUgY2FsbGJhY2sgc3luY2hyb25vdXNseSBpZiBhbHJlYWR5IHJlc29sdmVkLgovLyB0aGVuRnVuYyBzaG91bGRuJ3QgYWNjZXB0IGFyZ3MuCi8vIHNpbWlsYXIgdG8gd2hlblJlc291cmNlcyBpbiBTY2hlZHVsZXIgcGx1Z2luLgpmdW5jdGlvbiBzeW5jVGhlbihwcm9taXNlLCB0aGVuRnVuYykgewoJLy8gbm90IGEgcHJvbWlzZSwgb3IgYW4gYWxyZWFkeS1yZXNvbHZlZCBwcm9taXNlPwoJaWYgKCFwcm9taXNlIHx8ICFwcm9taXNlLnRoZW4gfHwgcHJvbWlzZS5zdGF0ZSgpID09PSAncmVzb2x2ZWQnKSB7CgkJcmV0dXJuICQud2hlbih0aGVuRnVuYygpKTsgLy8gcmVzb2x2ZSBpbW1lZGlhdGVseQoJfQoJZWxzZSBpZiAodGhlbkZ1bmMpIHsKCQlyZXR1cm4gcHJvbWlzZS50aGVuKHRoZW5GdW5jKTsKCX0KfQoKOzsKCi8qCkdFTkVSQUwgTk9URSBvbiBtb21lbnRzIHRocm91Z2hvdXQgdGhlICplbnRpcmUgcmVzdCogb2YgdGhlIGNvZGViYXNlOgpBbGwgbW9tZW50cyBhcmUgYXNzdW1lZCB0byBiZSBhbWJpZ3VvdXNseS16b25lZCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLAp3aXRoIHRoZSBOT1RBQkxFIEVYQ0VPUFRJT04gb2Ygc3RhcnQvZW5kIGRhdGVzIHRoYXQgbGl2ZSBvbiAqRXZlbnQgT2JqZWN0cyouCkFtYmlndW91c2x5LVRJTUVEIG1vbWVudHMgYXJlIGFzc3VtZWQgdG8gYmUgYW1iaWd1b3VzbHktem9uZWQgYnkgbmF0dXJlLgoqLwoKdmFyIGFtYmlnRGF0ZU9mTW9udGhSZWdleCA9IC9eXHMqXGR7NH0tXGRcZCQvOwp2YXIgYW1iaWdUaW1lT3Jab25lUmVnZXggPQoJL15ccypcZHs0fS0oPzooXGRcZC1cZFxkKXwoV1xkXGQkKXwoV1xkXGQtXGQpfChcZFxkXGQpKSgoVHwgKShcZFxkKDpcZFxkKDpcZFxkKFwuXGQrKT8pPyk/KT8pPyQvOwp2YXIgbmV3TW9tZW50UHJvdG8gPSBtb21lbnQuZm47IC8vIHdoZXJlIHdlIHdpbGwgYXR0YWNoIG91ciBuZXcgbWV0aG9kcwp2YXIgb2xkTW9tZW50UHJvdG8gPSAkLmV4dGVuZCh7fSwgbmV3TW9tZW50UHJvdG8pOyAvLyBjb3B5IG9mIG9yaWdpbmFsIG1vbWVudCBtZXRob2RzCgovLyB0ZWxsIG1vbWVudGpzIHRvIHRyYW5zZmVyIHRoZXNlIHByb3BlcnRpZXMgdXBvbiBjbG9uZQp2YXIgbW9tZW50UHJvcGVydGllcyA9IG1vbWVudC5tb21lbnRQcm9wZXJ0aWVzOwptb21lbnRQcm9wZXJ0aWVzLnB1c2goJ19mdWxsQ2FsZW5kYXInKTsKbW9tZW50UHJvcGVydGllcy5wdXNoKCdfYW1iaWdUaW1lJyk7Cm1vbWVudFByb3BlcnRpZXMucHVzaCgnX2FtYmlnWm9uZScpOwoKCi8vIENyZWF0aW5nCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIENyZWF0ZXMgYSBuZXcgbW9tZW50LCBzaW1pbGFyIHRvIHRoZSB2YW5pbGxhIG1vbWVudCguLi4pIGNvbnN0cnVjdG9yLCBidXQgd2l0aAovLyBleHRyYSBmZWF0dXJlcyAoYW1iaWd1b3VzIHRpbWUsIGVuaGFuY2VkIGZvcm1hdHRpbmcpLiBXaGVuIGdpdmVuIGFuIGV4aXN0aW5nIG1vbWVudCwKLy8gaXQgd2lsbCBmdW5jdGlvbiBhcyBhIGNsb25lIChhbmQgcmV0YWluIHRoZSB6b25lIG9mIHRoZSBtb21lbnQpLiBBbnl0aGluZyBlbHNlIHdpbGwKLy8gcmVzdWx0IGluIGEgbW9tZW50IGluIHRoZSBsb2NhbCB6b25lLgpGQy5tb21lbnQgPSBmdW5jdGlvbigpIHsKCXJldHVybiBtYWtlTW9tZW50KGFyZ3VtZW50cyk7Cn07CgovLyBTYW1lcyBhcyBGQy5tb21lbnQsIGJ1dCBmb3JjZXMgdGhlIHJlc3VsdGluZyBtb21lbnQgdG8gYmUgaW4gdGhlIFVUQyB0aW1lem9uZS4KRkMubW9tZW50LnV0YyA9IGZ1bmN0aW9uKCkgewoJdmFyIG1vbSA9IG1ha2VNb21lbnQoYXJndW1lbnRzLCB0cnVlKTsKCgkvLyBGb3JjZSBpdCBpbnRvIFVUQyBiZWNhdXNlIG1ha2VNb21lbnQgZG9lc24ndCBndWFyYW50ZWUgaXQKCS8vIChpZiBnaXZlbiBhIHByZS1leGlzdGluZyBtb21lbnQgZm9yIGV4YW1wbGUpCglpZiAobW9tLmhhc1RpbWUoKSkgeyAvLyBkb24ndCBnaXZlIGFtYmlndW91c2x5LXRpbWVkIG1vbWVudHMgYSBVVEMgem9uZQoJCW1vbS51dGMoKTsKCX0KCglyZXR1cm4gbW9tOwp9OwoKLy8gU2FtZSBhcyBGQy5tb21lbnQsIGJ1dCB3aGVuIGdpdmVuIGFuIElTTzg2MDEgc3RyaW5nLCB0aGUgdGltZXpvbmUgb2Zmc2V0IGlzIHByZXNlcnZlZC4KLy8gSVNPODYwMSBzdHJpbmdzIHdpdGggbm8gdGltZXpvbmUgb2Zmc2V0IHdpbGwgYmVjb21lIGFtYmlndW91c2x5IHpvbmVkLgpGQy5tb21lbnQucGFyc2Vab25lID0gZnVuY3Rpb24oKSB7CglyZXR1cm4gbWFrZU1vbWVudChhcmd1bWVudHMsIHRydWUsIHRydWUpOwp9OwoKLy8gQnVpbGRzIGFuIGVuaGFuY2VkIG1vbWVudCBmcm9tIGFyZ3MuIFdoZW4gZ2l2ZW4gYW4gZXhpc3RpbmcgbW9tZW50LCBpdCBjbG9uZXMuIFdoZW4gZ2l2ZW4gYQovLyBuYXRpdmUgRGF0ZSwgb3IgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzICh0aGUgY3VycmVudCB0aW1lKSwgdGhlIHJlc3VsdGluZyBtb21lbnQgd2lsbCBiZSBsb2NhbC4KLy8gQW55dGhpbmcgZWxzZSBuZWVkcyB0byBiZSAicGFyc2VkIiAoYSBzdHJpbmcgb3IgYW4gYXJyYXkpLCBhbmQgd2lsbCBiZSBhZmZlY3RlZCBieToKLy8gICAgcGFyc2VBc1VUQyAtIGlmIHRoZXJlIGlzIG5vIHpvbmUgaW5mb3JtYXRpb24sIHNob3VsZCB3ZSBwYXJzZSB0aGUgaW5wdXQgaW4gVVRDPwovLyAgICBwYXJzZVpvbmUgLSBpZiB0aGVyZSBpcyB6b25lIGluZm9ybWF0aW9uLCBzaG91bGQgd2UgZm9yY2UgdGhlIHpvbmUgb2YgdGhlIG1vbWVudD8KZnVuY3Rpb24gbWFrZU1vbWVudChhcmdzLCBwYXJzZUFzVVRDLCBwYXJzZVpvbmUpIHsKCXZhciBpbnB1dCA9IGFyZ3NbMF07Cgl2YXIgaXNTaW5nbGVTdHJpbmcgPSBhcmdzLmxlbmd0aCA9PSAxICYmIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7Cgl2YXIgaXNBbWJpZ1RpbWU7Cgl2YXIgaXNBbWJpZ1pvbmU7Cgl2YXIgYW1iaWdNYXRjaDsKCXZhciBtb207CgoJaWYgKG1vbWVudC5pc01vbWVudChpbnB1dCkgfHwgaXNOYXRpdmVEYXRlKGlucHV0KSB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7CgkJbW9tID0gbW9tZW50LmFwcGx5KG51bGwsIGFyZ3MpOwoJfQoJZWxzZSB7IC8vICJwYXJzaW5nIiBpcyByZXF1aXJlZAoJCWlzQW1iaWdUaW1lID0gZmFsc2U7CgkJaXNBbWJpZ1pvbmUgPSBmYWxzZTsKCgkJaWYgKGlzU2luZ2xlU3RyaW5nKSB7CgkJCWlmIChhbWJpZ0RhdGVPZk1vbnRoUmVnZXgudGVzdChpbnB1dCkpIHsKCQkJCS8vIGFjY2VwdCBzdHJpbmdzIGxpa2UgJzIwMTQtMDUnLCBidXQgY29udmVydCB0byB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoCgkJCQlpbnB1dCArPSAnLTAxJzsKCQkJCWFyZ3MgPSBbIGlucHV0IF07IC8vIGZvciB3aGVuIHdlIHBhc3MgaXQgb24gdG8gbW9tZW50J3MgY29uc3RydWN0b3IKCQkJCWlzQW1iaWdUaW1lID0gdHJ1ZTsKCQkJCWlzQW1iaWdab25lID0gdHJ1ZTsKCQkJfQoJCQllbHNlIGlmICgoYW1iaWdNYXRjaCA9IGFtYmlnVGltZU9yWm9uZVJlZ2V4LmV4ZWMoaW5wdXQpKSkgewoJCQkJaXNBbWJpZ1RpbWUgPSAhYW1iaWdNYXRjaFs1XTsgLy8gbm8gdGltZSBwYXJ0PwoJCQkJaXNBbWJpZ1pvbmUgPSB0cnVlOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCQuaXNBcnJheShpbnB1dCkpIHsKCQkJLy8gYXJyYXlzIGhhdmUgbm8gdGltZXpvbmUgaW5mb3JtYXRpb24sIHNvIGFzc3VtZSBhbWJpZ3VvdXMgem9uZQoJCQlpc0FtYmlnWm9uZSA9IHRydWU7CgkJfQoJCS8vIG90aGVyd2lzZSwgcHJvYmFibHkgYSBzdHJpbmcgd2l0aCBhIGZvcm1hdAoKCQlpZiAocGFyc2VBc1VUQyB8fCBpc0FtYmlnVGltZSkgewoJCQltb20gPSBtb21lbnQudXRjLmFwcGx5KG1vbWVudCwgYXJncyk7CgkJfQoJCWVsc2UgewoJCQltb20gPSBtb21lbnQuYXBwbHkobnVsbCwgYXJncyk7CgkJfQoKCQlpZiAoaXNBbWJpZ1RpbWUpIHsKCQkJbW9tLl9hbWJpZ1RpbWUgPSB0cnVlOwoJCQltb20uX2FtYmlnWm9uZSA9IHRydWU7IC8vIGFtYmlndW91cyB0aW1lIGFsd2F5cyBtZWFucyBhbWJpZ3VvdXMgem9uZQoJCX0KCQllbHNlIGlmIChwYXJzZVpvbmUpIHsgLy8gbGV0J3MgcmVjb3JkIHRoZSBpbnB1dHRlZCB6b25lIHNvbWVob3cKCQkJaWYgKGlzQW1iaWdab25lKSB7CgkJCQltb20uX2FtYmlnWm9uZSA9IHRydWU7CgkJCX0KCQkJZWxzZSBpZiAoaXNTaW5nbGVTdHJpbmcpIHsKCQkJCW1vbS51dGNPZmZzZXQoaW5wdXQpOyAvLyBpZiBub3QgYSB2YWxpZCB6b25lLCB3aWxsIGFzc2lnbiBVVEMKCQkJfQoJCX0KCX0KCgltb20uX2Z1bGxDYWxlbmRhciA9IHRydWU7IC8vIGZsYWcgZm9yIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkKCglyZXR1cm4gbW9tOwp9CgoKLy8gV2VlayBOdW1iZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8vIFJldHVybnMgdGhlIHdlZWsgbnVtYmVyLCBjb25zaWRlcmluZyB0aGUgbG9jYWxlJ3MgY3VzdG9tIHdlZWsgbnVtYmVyIGNhbGN1YXRpb24KLy8gYHdlZWtzYCBpcyBhbiBhbGlhcyBmb3IgYHdlZWtgCm5ld01vbWVudFByb3RvLndlZWsgPSBuZXdNb21lbnRQcm90by53ZWVrcyA9IGZ1bmN0aW9uKGlucHV0KSB7Cgl2YXIgd2Vla0NhbGMgPSB0aGlzLl9sb2NhbGUuX2Z1bGxDYWxlbmRhcl93ZWVrQ2FsYzsKCglpZiAoaW5wdXQgPT0gbnVsbCAmJiB0eXBlb2Ygd2Vla0NhbGMgPT09ICdmdW5jdGlvbicpIHsgLy8gY3VzdG9tIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIGdldHRlcgoJCXJldHVybiB3ZWVrQ2FsYyh0aGlzKTsKCX0KCWVsc2UgaWYgKHdlZWtDYWxjID09PSAnSVNPJykgewoJCXJldHVybiBvbGRNb21lbnRQcm90by5pc29XZWVrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIElTTyBnZXR0ZXIvc2V0dGVyCgl9CgoJcmV0dXJuIG9sZE1vbWVudFByb3RvLndlZWsuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gbG9jYWwgZ2V0dGVyL3NldHRlcgp9OwoKCi8vIFRpbWUtb2YtZGF5Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIEdFVFRFUgovLyBSZXR1cm5zIGEgRHVyYXRpb24gd2l0aCB0aGUgaG91cnMvbWludXRlcy9zZWNvbmRzL21zIHZhbHVlcyBvZiB0aGUgbW9tZW50LgovLyBJZiB0aGUgbW9tZW50IGhhcyBhbiBhbWJpZ3VvdXMgdGltZSwgYSBkdXJhdGlvbiBvZiAwMDowMCB3aWxsIGJlIHJldHVybmVkLgovLwovLyBTRVRURVIKLy8gWW91IGNhbiBzdXBwbHkgYSBEdXJhdGlvbiwgYSBNb21lbnQsIG9yIGEgRHVyYXRpb24tbGlrZSBhcmd1bWVudC4KLy8gV2hlbiBzZXR0aW5nIHRoZSB0aW1lLCBhbmQgdGhlIG1vbWVudCBoYXMgYW4gYW1iaWd1b3VzIHRpbWUsIGl0IHRoZW4gYmVjb21lcyB1bmFtYmlndW91cy4KbmV3TW9tZW50UHJvdG8udGltZSA9IGZ1bmN0aW9uKHRpbWUpIHsKCgkvLyBGYWxsYmFjayB0byB0aGUgb3JpZ2luYWwgbWV0aG9kIChpZiB0aGVyZSBpcyBvbmUpIGlmIHRoaXMgbW9tZW50IHdhc24ndCBjcmVhdGVkIHZpYSBGdWxsQ2FsZW5kYXIuCgkvLyBgdGltZWAgaXMgYSBnZW5lcmljIGVub3VnaCBtZXRob2QgbmFtZSB3aGVyZSB0aGlzIHByZWNhdXRpb24gaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGNvbGxpc2lvbnMgdy8gb3RoZXIgcGx1Z2lucy4KCWlmICghdGhpcy5fZnVsbENhbGVuZGFyKSB7CgkJcmV0dXJuIG9sZE1vbWVudFByb3RvLnRpbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCX0KCglpZiAodGltZSA9PSBudWxsKSB7IC8vIGdldHRlcgoJCXJldHVybiBtb21lbnQuZHVyYXRpb24oewoJCQlob3VyczogdGhpcy5ob3VycygpLAoJCQltaW51dGVzOiB0aGlzLm1pbnV0ZXMoKSwKCQkJc2Vjb25kczogdGhpcy5zZWNvbmRzKCksCgkJCW1pbGxpc2Vjb25kczogdGhpcy5taWxsaXNlY29uZHMoKQoJCX0pOwoJfQoJZWxzZSB7IC8vIHNldHRlcgoKCQl0aGlzLl9hbWJpZ1RpbWUgPSBmYWxzZTsgLy8gbWFyayB0aGF0IHRoZSBtb21lbnQgbm93IGhhcyBhIHRpbWUKCgkJaWYgKCFtb21lbnQuaXNEdXJhdGlvbih0aW1lKSAmJiAhbW9tZW50LmlzTW9tZW50KHRpbWUpKSB7CgkJCXRpbWUgPSBtb21lbnQuZHVyYXRpb24odGltZSk7CgkJfQoKCQkvLyBUaGUgZGF5IHZhbHVlIHNob3VsZCBjYXVzZSBvdmVyZmxvdyAoc28gMjQgaG91cnMgYmVjb21lcyAwMDowMDowMCBvZiBuZXh0IGRheSkuCgkJLy8gT25seSBmb3IgRHVyYXRpb24gdGltZXMsIG5vdCBNb21lbnQgdGltZXMuCgkJdmFyIGRheUhvdXJzID0gMDsKCQlpZiAobW9tZW50LmlzRHVyYXRpb24odGltZSkpIHsKCQkJZGF5SG91cnMgPSBNYXRoLmZsb29yKHRpbWUuYXNEYXlzKCkpICogMjQ7CgkJfQoKCQkvLyBXZSBuZWVkIHRvIHNldCB0aGUgaW5kaXZpZHVhbCBmaWVsZHMuCgkJLy8gQ2FuJ3QgdXNlIHN0YXJ0T2YoJ2RheScpIHRoZW4gYWRkIGR1cmF0aW9uLiBJbiBjYXNlIG9mIERTVCBhdCBzdGFydCBvZiBkYXkuCgkJcmV0dXJuIHRoaXMuaG91cnMoZGF5SG91cnMgKyB0aW1lLmhvdXJzKCkpCgkJCS5taW51dGVzKHRpbWUubWludXRlcygpKQoJCQkuc2Vjb25kcyh0aW1lLnNlY29uZHMoKSkKCQkJLm1pbGxpc2Vjb25kcyh0aW1lLm1pbGxpc2Vjb25kcygpKTsKCX0KfTsKCi8vIENvbnZlcnRzIHRoZSBtb21lbnQgdG8gVVRDLCBzdHJpcHBpbmcgb3V0IGl0cyB0aW1lLW9mLWRheSBhbmQgdGltZXpvbmUgb2Zmc2V0LAovLyBidXQgcHJlc2VydmluZyBpdHMgWU1ELiBBIG1vbWVudCB3aXRoIGEgc3RyaXBwZWQgdGltZSB3aWxsIGRpc3BsYXkgbm8gdGltZQovLyBub3IgdGltZXpvbmUgb2Zmc2V0IHdoZW4gLmZvcm1hdCgpIGlzIGNhbGxlZC4KbmV3TW9tZW50UHJvdG8uc3RyaXBUaW1lID0gZnVuY3Rpb24oKSB7CgoJaWYgKCF0aGlzLl9hbWJpZ1RpbWUpIHsKCgkJdGhpcy51dGModHJ1ZSk7IC8vIGtlZXBMb2NhbFRpbWU9dHJ1ZSAoZm9yIGtlZXBpbmcgKmRhdGUqIHZhbHVlKQoKCQkvLyBzZXQgdGltZSB0byB6ZXJvCgkJdGhpcy5zZXQoewoJCQlob3VyczogMCwKCQkJbWludXRlczogMCwKCQkJc2Vjb25kczogMCwKCQkJbXM6IDAKCQl9KTsKCgkJLy8gTWFyayB0aGUgdGltZSBhcyBhbWJpZ3VvdXMuIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHRoZSAudXRjKCkgY2FsbCwgd2hpY2ggbWlnaHQgY2FsbCAudXRjT2Zmc2V0KCksCgkJLy8gd2hpY2ggY2xlYXJzIGFsbCBhbWJpZyBmbGFncy4KCQl0aGlzLl9hbWJpZ1RpbWUgPSB0cnVlOwoJCXRoaXMuX2FtYmlnWm9uZSA9IHRydWU7IC8vIGlmIGFtYmlndW91cyB0aW1lLCBhbHNvIGFtYmlndW91cyB0aW1lem9uZSBvZmZzZXQKCX0KCglyZXR1cm4gdGhpczsgLy8gZm9yIGNoYWluaW5nCn07CgovLyBSZXR1cm5zIGlmIHRoZSBtb21lbnQgaGFzIGEgbm9uLWFtYmlndW91cyB0aW1lIChib29sZWFuKQpuZXdNb21lbnRQcm90by5oYXNUaW1lID0gZnVuY3Rpb24oKSB7CglyZXR1cm4gIXRoaXMuX2FtYmlnVGltZTsKfTsKCgovLyBUaW1lem9uZQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBDb252ZXJ0cyB0aGUgbW9tZW50IHRvIFVUQywgc3RyaXBwaW5nIG91dCBpdHMgdGltZXpvbmUgb2Zmc2V0LCBidXQgcHJlc2VydmluZyBpdHMKLy8gWU1EIGFuZCB0aW1lLW9mLWRheS4gQSBtb21lbnQgd2l0aCBhIHN0cmlwcGVkIHRpbWV6b25lIG9mZnNldCB3aWxsIGRpc3BsYXkgbm8KLy8gdGltZXpvbmUgb2Zmc2V0IHdoZW4gLmZvcm1hdCgpIGlzIGNhbGxlZC4KbmV3TW9tZW50UHJvdG8uc3RyaXBab25lID0gZnVuY3Rpb24oKSB7Cgl2YXIgd2FzQW1iaWdUaW1lOwoKCWlmICghdGhpcy5fYW1iaWdab25lKSB7CgoJCXdhc0FtYmlnVGltZSA9IHRoaXMuX2FtYmlnVGltZTsKCgkJdGhpcy51dGModHJ1ZSk7IC8vIGtlZXBMb2NhbFRpbWU9dHJ1ZSAoZm9yIGtlZXBpbmcgZGF0ZSBhbmQgdGltZSB2YWx1ZXMpCgoJCS8vIHRoZSBhYm92ZSBjYWxsIHRvIC51dGMoKS8udXRjT2Zmc2V0KCkgdW5mb3J0dW5hdGVseSBtaWdodCBjbGVhciB0aGUgYW1iaWcgZmxhZ3MsIHNvIHJlc3RvcmUKCQl0aGlzLl9hbWJpZ1RpbWUgPSB3YXNBbWJpZ1RpbWUgfHwgZmFsc2U7CgoJCS8vIE1hcmsgdGhlIHpvbmUgYXMgYW1iaWd1b3VzLiBUaGlzIG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgLnV0YygpIGNhbGwsIHdoaWNoIG1pZ2h0IGNhbGwgLnV0Y09mZnNldCgpLAoJCS8vIHdoaWNoIGNsZWFycyB0aGUgYW1iaWcgZmxhZ3MuCgkJdGhpcy5fYW1iaWdab25lID0gdHJ1ZTsKCX0KCglyZXR1cm4gdGhpczsgLy8gZm9yIGNoYWluaW5nCn07CgovLyBSZXR1cm5zIG9mIHRoZSBtb21lbnQgaGFzIGEgbm9uLWFtYmlndW91cyB0aW1lem9uZSBvZmZzZXQgKGJvb2xlYW4pCm5ld01vbWVudFByb3RvLmhhc1pvbmUgPSBmdW5jdGlvbigpIHsKCXJldHVybiAhdGhpcy5fYW1iaWdab25lOwp9OwoKCi8vIGltcGxpY2l0bHkgbWFya3MgYSB6b25lCm5ld01vbWVudFByb3RvLmxvY2FsID0gZnVuY3Rpb24oa2VlcExvY2FsVGltZSkgewoKCS8vIGZvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBhbWJpZ3VvdXNseS16b25lZCB0byBsb2NhbCwKCS8vIGtlZXAgdGhlIHRpbWUgdmFsdWVzIHdoZW4gY29udmVydGluZyBmcm9tIFVUQyAtPiBsb2NhbAoJb2xkTW9tZW50UHJvdG8ubG9jYWwuY2FsbCh0aGlzLCB0aGlzLl9hbWJpZ1pvbmUgfHwga2VlcExvY2FsVGltZSk7CgoJLy8gZW5zdXJlIG5vbi1hbWJpZ3VvdXMKCS8vIHRoaXMgcHJvYmFibHkgYWxyZWFkeSBoYXBwZW5lZCB2aWEgbG9jYWwoKSAtPiB1dGNPZmZzZXQoKSwgYnV0IGRvbid0IHJlbHkgb24gTW9tZW50J3MgaW50ZXJuYWxzCgl0aGlzLl9hbWJpZ1RpbWUgPSBmYWxzZTsKCXRoaXMuX2FtYmlnWm9uZSA9IGZhbHNlOwoKCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKfTsKCgovLyBpbXBsaWNpdGx5IG1hcmtzIGEgem9uZQpuZXdNb21lbnRQcm90by51dGMgPSBmdW5jdGlvbihrZWVwTG9jYWxUaW1lKSB7CgoJb2xkTW9tZW50UHJvdG8udXRjLmNhbGwodGhpcywga2VlcExvY2FsVGltZSk7CgoJLy8gZW5zdXJlIG5vbi1hbWJpZ3VvdXMKCS8vIHRoaXMgcHJvYmFibHkgYWxyZWFkeSBoYXBwZW5lZCB2aWEgdXRjKCkgLT4gdXRjT2Zmc2V0KCksIGJ1dCBkb24ndCByZWx5IG9uIE1vbWVudCdzIGludGVybmFscwoJdGhpcy5fYW1iaWdUaW1lID0gZmFsc2U7Cgl0aGlzLl9hbWJpZ1pvbmUgPSBmYWxzZTsKCglyZXR1cm4gdGhpczsKfTsKCgovLyBpbXBsaWNpdGx5IG1hcmtzIGEgem9uZSAod2lsbCBwcm9iYWJseSBnZXQgY2FsbGVkIHVwb24gLnV0YygpIGFuZCAubG9jYWwoKSkKbmV3TW9tZW50UHJvdG8udXRjT2Zmc2V0ID0gZnVuY3Rpb24odHpvKSB7CgoJaWYgKHR6byAhPSBudWxsKSB7IC8vIHNldHRlcgoJCS8vIHRoZXNlIGFzc2lnbm1lbnRzIG5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgdGhlIG9yaWdpbmFsIHpvbmUgbWV0aG9kIGlzIGNhbGxlZC4KCQkvLyBJIGZvcmdldCB3aHksIHNvbWV0aGluZyB0byBkbyB3aXRoIGEgYnJvd3NlciBjcmFzaC4KCQl0aGlzLl9hbWJpZ1RpbWUgPSBmYWxzZTsKCQl0aGlzLl9hbWJpZ1pvbmUgPSBmYWxzZTsKCX0KCglyZXR1cm4gb2xkTW9tZW50UHJvdG8udXRjT2Zmc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07CgoKLy8gRm9ybWF0dGluZwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpuZXdNb21lbnRQcm90by5mb3JtYXQgPSBmdW5jdGlvbigpIHsKCWlmICh0aGlzLl9mdWxsQ2FsZW5kYXIgJiYgYXJndW1lbnRzWzBdKSB7IC8vIGFuIGVuaGFuY2VkIG1vbWVudD8gYW5kIGEgZm9ybWF0IHN0cmluZyBwcm92aWRlZD8KCQlyZXR1cm4gZm9ybWF0RGF0ZSh0aGlzLCBhcmd1bWVudHNbMF0pOyAvLyBvdXIgZXh0ZW5kZWQgZm9ybWF0dGluZwoJfQoJaWYgKHRoaXMuX2FtYmlnVGltZSkgewoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQodGhpcywgJ1lZWVktTU0tREQnKTsKCX0KCWlmICh0aGlzLl9hbWJpZ1pvbmUpIHsKCQlyZXR1cm4gb2xkTW9tZW50Rm9ybWF0KHRoaXMsICdZWVlZLU1NLUREW1RdSEg6bW06c3MnKTsKCX0KCXJldHVybiBvbGRNb21lbnRQcm90by5mb3JtYXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKCm5ld01vbWVudFByb3RvLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24oKSB7CglpZiAodGhpcy5fYW1iaWdUaW1lKSB7CgkJcmV0dXJuIG9sZE1vbWVudEZvcm1hdCh0aGlzLCAnWVlZWS1NTS1ERCcpOwoJfQoJaWYgKHRoaXMuX2FtYmlnWm9uZSkgewoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQodGhpcywgJ1lZWVktTU0tRERbVF1ISDptbTpzcycpOwoJfQoJcmV0dXJuIG9sZE1vbWVudFByb3RvLnRvSVNPU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07Cgo7OwoKLy8gU2luZ2xlIERhdGUgRm9ybWF0dGluZwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKLy8gY2FsbCB0aGlzIGlmIHlvdSB3YW50IE1vbWVudCdzIG9yaWdpbmFsIGZvcm1hdCBtZXRob2QgdG8gYmUgdXNlZApmdW5jdGlvbiBvbGRNb21lbnRGb3JtYXQobW9tLCBmb3JtYXRTdHIpIHsKCXJldHVybiBvbGRNb21lbnRQcm90by5mb3JtYXQuY2FsbChtb20sIGZvcm1hdFN0cik7IC8vIG9sZE1vbWVudFByb3RvIGRlZmluZWQgaW4gbW9tZW50LWV4dC5qcwp9CgoKLy8gRm9ybWF0cyBgZGF0ZWAgd2l0aCBhIE1vbWVudCBmb3JtYXR0aW5nIHN0cmluZywgYnV0IGFsbG93IG91ciBub24temVybyBhcmVhcyBhbmQKLy8gYWRkaXRpb25hbCB0b2tlbi4KZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXRTdHIpIHsKCXJldHVybiBmb3JtYXREYXRlV2l0aENodW5rcyhkYXRlLCBnZXRGb3JtYXRTdHJpbmdDaHVua3MoZm9ybWF0U3RyKSk7Cn0KCgpmdW5jdGlvbiBmb3JtYXREYXRlV2l0aENodW5rcyhkYXRlLCBjaHVua3MpIHsKCXZhciBzID0gJyc7Cgl2YXIgaTsKCglmb3IgKGk9MDsgaTxjaHVua3MubGVuZ3RoOyBpKyspIHsKCQlzICs9IGZvcm1hdERhdGVXaXRoQ2h1bmsoZGF0ZSwgY2h1bmtzW2ldKTsKCX0KCglyZXR1cm4gczsKfQoKCi8vIGFkZGl0aW9uIGZvcm1hdHRpbmcgdG9rZW5zIHdlIHdhbnQgcmVjb2duaXplZAp2YXIgdG9rZW5PdmVycmlkZXMgPSB7Cgl0OiBmdW5jdGlvbihkYXRlKSB7IC8vICJhIiBvciAicCIKCQlyZXR1cm4gb2xkTW9tZW50Rm9ybWF0KGRhdGUsICdhJykuY2hhckF0KDApOwoJfSwKCVQ6IGZ1bmN0aW9uKGRhdGUpIHsgLy8gIkEiIG9yICJQIgoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQoZGF0ZSwgJ0EnKS5jaGFyQXQoMCk7Cgl9Cn07CgoKZnVuY3Rpb24gZm9ybWF0RGF0ZVdpdGhDaHVuayhkYXRlLCBjaHVuaykgewoJdmFyIHRva2VuOwoJdmFyIG1heWJlU3RyOwoKCWlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7IC8vIGEgbGl0ZXJhbCBzdHJpbmcKCQlyZXR1cm4gY2h1bms7Cgl9CgllbHNlIGlmICgodG9rZW4gPSBjaHVuay50b2tlbikpIHsgLy8gYSB0b2tlbiwgbGlrZSAiWVlZWSIKCQlpZiAodG9rZW5PdmVycmlkZXNbdG9rZW5dKSB7CgkJCXJldHVybiB0b2tlbk92ZXJyaWRlc1t0b2tlbl0oZGF0ZSk7IC8vIHVzZSBvdXIgY3VzdG9tIHRva2VuCgkJfQoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQoZGF0ZSwgdG9rZW4pOwoJfQoJZWxzZSBpZiAoY2h1bmsubWF5YmUpIHsgLy8gYSBncm91cGluZyBvZiBvdGhlciBjaHVua3MgdGhhdCBtdXN0IGJlIG5vbi16ZXJvCgkJbWF5YmVTdHIgPSBmb3JtYXREYXRlV2l0aENodW5rcyhkYXRlLCBjaHVuay5tYXliZSk7CgkJaWYgKG1heWJlU3RyLm1hdGNoKC9bMS05XS8pKSB7CgkJCXJldHVybiBtYXliZVN0cjsKCQl9Cgl9CgoJcmV0dXJuICcnOwp9CgoKLy8gRGF0ZSBSYW5nZSBGb3JtYXR0aW5nCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVE9ETzogbWFrZSBpdCB3b3JrIHdpdGggdGltZXpvbmUgb2Zmc2V0CgovLyBVc2luZyBhIGZvcm1hdHRpbmcgc3RyaW5nIG1lYW50IGZvciBhIHNpbmdsZSBkYXRlLCBnZW5lcmF0ZSBhIHJhbmdlIHN0cmluZywgbGlrZQovLyAiU2VwIDIgLSA5IDIwMTMiLCB0aGF0IGludGVsbGlnZW50bHkgaW5zZXJ0cyBhIHNlcGFyYXRvciB3aGVyZSB0aGUgZGF0ZXMgZGlmZmVyLgovLyBJZiB0aGUgZGF0ZXMgYXJlIHRoZSBzYW1lIGFzIGZhciBhcyB0aGUgZm9ybWF0IHN0cmluZyBpcyBjb25jZXJuZWQsIGp1c3QgcmV0dXJuIGEgc2luZ2xlCi8vIHJlbmRlcmluZyBvZiBvbmUgZGF0ZSwgd2l0aG91dCBhbnkgc2VwYXJhdG9yLgpmdW5jdGlvbiBmb3JtYXRSYW5nZShkYXRlMSwgZGF0ZTIsIGZvcm1hdFN0ciwgc2VwYXJhdG9yLCBpc1JUTCkgewoJdmFyIGxvY2FsZURhdGE7CgoJZGF0ZTEgPSBGQy5tb21lbnQucGFyc2Vab25lKGRhdGUxKTsKCWRhdGUyID0gRkMubW9tZW50LnBhcnNlWm9uZShkYXRlMik7CgoJbG9jYWxlRGF0YSA9IGRhdGUxLmxvY2FsZURhdGEoKTsKCgkvLyBFeHBhbmQgbG9jYWxpemVkIGZvcm1hdCBzdHJpbmdzLCBsaWtlICJMTCIgLT4gIk1NTU0gRCBZWVlZIgoJZm9ybWF0U3RyID0gbG9jYWxlRGF0YS5sb25nRGF0ZUZvcm1hdChmb3JtYXRTdHIpIHx8IGZvcm1hdFN0cjsKCS8vIEJUVywgdGhpcyBpcyBub3QgaW1wb3J0YW50IGZvciBgZm9ybWF0RGF0ZWAgYmVjYXVzZSBpdCBpcyBpbXBvc3NpYmxlIHRvIHB1dCBjdXN0b20gdG9rZW5zCgkvLyBvciBub24temVybyBhcmVhcyBpbiBNb21lbnQncyBsb2NhbGl6ZWQgZm9ybWF0IHN0cmluZ3MuCgoJc2VwYXJhdG9yID0gc2VwYXJhdG9yIHx8ICcgLSAnOwoKCXJldHVybiBmb3JtYXRSYW5nZVdpdGhDaHVua3MoCgkJZGF0ZTEsCgkJZGF0ZTIsCgkJZ2V0Rm9ybWF0U3RyaW5nQ2h1bmtzKGZvcm1hdFN0ciksCgkJc2VwYXJhdG9yLAoJCWlzUlRMCgkpOwp9CkZDLmZvcm1hdFJhbmdlID0gZm9ybWF0UmFuZ2U7IC8vIGV4cG9zZQoKCmZ1bmN0aW9uIGZvcm1hdFJhbmdlV2l0aENodW5rcyhkYXRlMSwgZGF0ZTIsIGNodW5rcywgc2VwYXJhdG9yLCBpc1JUTCkgewoJdmFyIHVuem9uZWREYXRlMSA9IGRhdGUxLmNsb25lKCkuc3RyaXBab25lKCk7IC8vIGZvciBmb3JtYXRTaW1pbGFyQ2h1bmsKCXZhciB1bnpvbmVkRGF0ZTIgPSBkYXRlMi5jbG9uZSgpLnN0cmlwWm9uZSgpOyAvLyAiCgl2YXIgY2h1bmtTdHI7IC8vIHRoZSByZW5kZXJpbmcgb2YgdGhlIGNodW5rCgl2YXIgbGVmdEk7Cgl2YXIgbGVmdFN0ciA9ICcnOwoJdmFyIHJpZ2h0STsKCXZhciByaWdodFN0ciA9ICcnOwoJdmFyIG1pZGRsZUk7Cgl2YXIgbWlkZGxlU3RyMSA9ICcnOwoJdmFyIG1pZGRsZVN0cjIgPSAnJzsKCXZhciBtaWRkbGVTdHIgPSAnJzsKCgkvLyBTdGFydCBhdCB0aGUgbGVmdG1vc3Qgc2lkZSBvZiB0aGUgZm9ybWF0dGluZyBzdHJpbmcgYW5kIGNvbnRpbnVlIHVudGlsIHlvdSBoaXQgYSB0b2tlbgoJLy8gdGhhdCBpcyBub3QgdGhlIHNhbWUgYmV0d2VlbiBkYXRlcy4KCWZvciAobGVmdEk9MDsgbGVmdEk8Y2h1bmtzLmxlbmd0aDsgbGVmdEkrKykgewoJCWNodW5rU3RyID0gZm9ybWF0U2ltaWxhckNodW5rKGRhdGUxLCBkYXRlMiwgdW56b25lZERhdGUxLCB1bnpvbmVkRGF0ZTIsIGNodW5rc1tsZWZ0SV0pOwoJCWlmIChjaHVua1N0ciA9PT0gZmFsc2UpIHsKCQkJYnJlYWs7CgkJfQoJCWxlZnRTdHIgKz0gY2h1bmtTdHI7Cgl9CgoJLy8gU2ltaWxhcmx5LCBzdGFydCBhdCB0aGUgcmlnaHRtb3N0IHNpZGUgb2YgdGhlIGZvcm1hdHRpbmcgc3RyaW5nIGFuZCBtb3ZlIGxlZnQKCWZvciAocmlnaHRJPWNodW5rcy5sZW5ndGgtMTsgcmlnaHRJPmxlZnRJOyByaWdodEktLSkgewoJCWNodW5rU3RyID0gZm9ybWF0U2ltaWxhckNodW5rKGRhdGUxLCBkYXRlMiwgdW56b25lZERhdGUxLCB1bnpvbmVkRGF0ZTIsICBjaHVua3NbcmlnaHRJXSk7CgkJaWYgKGNodW5rU3RyID09PSBmYWxzZSkgewoJCQlicmVhazsKCQl9CgkJcmlnaHRTdHIgPSBjaHVua1N0ciArIHJpZ2h0U3RyOwoJfQoKCS8vIFRoZSBhcmVhIGluIHRoZSBtaWRkbGUgaXMgZGlmZmVyZW50IGZvciBib3RoIG9mIHRoZSBkYXRlcy4KCS8vIENvbGxlY3QgdGhlbSBkaXN0aW5jdGx5IHNvIHdlIGNhbiBqYW0gdGhlbSB0b2dldGhlciBsYXRlci4KCWZvciAobWlkZGxlST1sZWZ0STsgbWlkZGxlSTw9cmlnaHRJOyBtaWRkbGVJKyspIHsKCQltaWRkbGVTdHIxICs9IGZvcm1hdERhdGVXaXRoQ2h1bmsoZGF0ZTEsIGNodW5rc1ttaWRkbGVJXSk7CgkJbWlkZGxlU3RyMiArPSBmb3JtYXREYXRlV2l0aENodW5rKGRhdGUyLCBjaHVua3NbbWlkZGxlSV0pOwoJfQoKCWlmIChtaWRkbGVTdHIxIHx8IG1pZGRsZVN0cjIpIHsKCQlpZiAoaXNSVEwpIHsKCQkJbWlkZGxlU3RyID0gbWlkZGxlU3RyMiArIHNlcGFyYXRvciArIG1pZGRsZVN0cjE7CgkJfQoJCWVsc2UgewoJCQltaWRkbGVTdHIgPSBtaWRkbGVTdHIxICsgc2VwYXJhdG9yICsgbWlkZGxlU3RyMjsKCQl9Cgl9CgoJcmV0dXJuIGxlZnRTdHIgKyBtaWRkbGVTdHIgKyByaWdodFN0cjsKfQoKCnZhciBzaW1pbGFyVW5pdE1hcCA9IHsKCVk6ICd5ZWFyJywKCU06ICdtb250aCcsCglEOiAnZGF5JywgLy8gZGF5IG9mIG1vbnRoCglkOiAnZGF5JywgLy8gZGF5IG9mIHdlZWsKCS8vIHByZXZlbnRzIGEgc2VwYXJhdG9yIGJldHdlZW4gYW55dGhpbmcgdGltZS1yZWxhdGVkLi4uCglBOiAnc2Vjb25kJywgLy8gQU0vUE0KCWE6ICdzZWNvbmQnLCAvLyBhbS9wbQoJVDogJ3NlY29uZCcsIC8vIEEvUAoJdDogJ3NlY29uZCcsIC8vIGEvcAoJSDogJ3NlY29uZCcsIC8vIGhvdXIgKDI0KQoJaDogJ3NlY29uZCcsIC8vIGhvdXIgKDEyKQoJbTogJ3NlY29uZCcsIC8vIG1pbnV0ZQoJczogJ3NlY29uZCcgLy8gc2Vjb25kCn07Ci8vIFRPRE86IHdlZWsgbWF5YmU/CgoKLy8gR2l2ZW4gYSBmb3JtYXR0aW5nIGNodW5rLCBhbmQgZ2l2ZW4gdGhhdCBib3RoIGRhdGVzIGFyZSBzaW1pbGFyIGluIHRoZSByZWdhcmQgdGhlCi8vIGZvcm1hdHRpbmcgY2h1bmsgaXMgY29uY2VybmVkLCBmb3JtYXQgZGF0ZTEgYWdhaW5zdCBgY2h1bmtgLiBPdGhlcndpc2UsIHJldHVybiBgZmFsc2VgLgpmdW5jdGlvbiBmb3JtYXRTaW1pbGFyQ2h1bmsoZGF0ZTEsIGRhdGUyLCB1bnpvbmVkRGF0ZTEsIHVuem9uZWREYXRlMiwgY2h1bmspIHsKCXZhciB0b2tlbjsKCXZhciB1bml0OwoKCWlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7IC8vIGEgbGl0ZXJhbCBzdHJpbmcKCQlyZXR1cm4gY2h1bms7Cgl9CgllbHNlIGlmICgodG9rZW4gPSBjaHVuay50b2tlbikpIHsKCQl1bml0ID0gc2ltaWxhclVuaXRNYXBbdG9rZW4uY2hhckF0KDApXTsKCgkJLy8gYXJlIHRoZSBkYXRlcyB0aGUgc2FtZSBmb3IgdGhpcyB1bml0IG9mIG1lYXN1cmVtZW50PwoJCS8vIHVzZSB0aGUgdW56b25lZCBkYXRlcyBmb3IgdGhpcyBjYWxjdWxhdGlvbiBiZWNhdXNlIHVucmVsaWFibGUgd2hlbiBuZWFyIERTVCAoYnVnICMyMzk2KQoJCWlmICh1bml0ICYmIHVuem9uZWREYXRlMS5pc1NhbWUodW56b25lZERhdGUyLCB1bml0KSkgewoJCQlyZXR1cm4gb2xkTW9tZW50Rm9ybWF0KGRhdGUxLCB0b2tlbik7IC8vIHdvdWxkIGJlIHRoZSBzYW1lIGlmIHdlIHVzZWQgYGRhdGUyYAoJCQkvLyBCVFcsIGRvbid0IHN1cHBvcnQgY3VzdG9tIHRva2VucwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7IC8vIHRoZSBjaHVuayBpcyBOT1QgdGhlIHNhbWUgZm9yIHRoZSB0d28gZGF0ZXMKCS8vIEJUVywgZG9uJ3Qgc3VwcG9ydCBzcGxpdHRpbmcgb24gbm9uLXplcm8gYXJlYXMKfQoKCi8vIENodW5raW5nIFV0aWxzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgp2YXIgZm9ybWF0U3RyaW5nQ2h1bmtDYWNoZSA9IHt9OwoKCmZ1bmN0aW9uIGdldEZvcm1hdFN0cmluZ0NodW5rcyhmb3JtYXRTdHIpIHsKCWlmIChmb3JtYXRTdHIgaW4gZm9ybWF0U3RyaW5nQ2h1bmtDYWNoZSkgewoJCXJldHVybiBmb3JtYXRTdHJpbmdDaHVua0NhY2hlW2Zvcm1hdFN0cl07Cgl9CglyZXR1cm4gKGZvcm1hdFN0cmluZ0NodW5rQ2FjaGVbZm9ybWF0U3RyXSA9IGNodW5rRm9ybWF0U3RyaW5nKGZvcm1hdFN0cikpOwp9CgoKLy8gQnJlYWsgdGhlIGZvcm1hdHRpbmcgc3RyaW5nIGludG8gYW4gYXJyYXkgb2YgY2h1bmtzCmZ1bmN0aW9uIGNodW5rRm9ybWF0U3RyaW5nKGZvcm1hdFN0cikgewoJdmFyIGNodW5rcyA9IFtdOwoJdmFyIGNodW5rZXIgPSAvXFsoW15cXV0qKVxdfFwoKFteXCldKilcKXwoTFRTfExUfChcdylcNCpvPyl8KFteXHdcW1woXSspL2c7IC8vIFRPRE86IG1vcmUgZGVzY3JpbWluYXRpb24KCXZhciBtYXRjaDsKCgl3aGlsZSAoKG1hdGNoID0gY2h1bmtlci5leGVjKGZvcm1hdFN0cikpKSB7CgkJaWYgKG1hdGNoWzFdKSB7IC8vIGEgbGl0ZXJhbCBzdHJpbmcgaW5zaWRlIFsgLi4uIF0KCQkJY2h1bmtzLnB1c2gobWF0Y2hbMV0pOwoJCX0KCQllbHNlIGlmIChtYXRjaFsyXSkgeyAvLyBub24temVybyBmb3JtYXR0aW5nIGluc2lkZSAoIC4uLiApCgkJCWNodW5rcy5wdXNoKHsgbWF5YmU6IGNodW5rRm9ybWF0U3RyaW5nKG1hdGNoWzJdKSB9KTsKCQl9CgkJZWxzZSBpZiAobWF0Y2hbM10pIHsgLy8gYSBmb3JtYXR0aW5nIHRva2VuCgkJCWNodW5rcy5wdXNoKHsgdG9rZW46IG1hdGNoWzNdIH0pOwoJCX0KCQllbHNlIGlmIChtYXRjaFs1XSkgeyAvLyBhbiB1bmVuY2xvc2VkIGxpdGVyYWwgc3RyaW5nCgkJCWNodW5rcy5wdXNoKG1hdGNoWzVdKTsKCQl9Cgl9CgoJcmV0dXJuIGNodW5rczsKfQoKCi8vIE1pc2MgVXRpbHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8vIGdyYW51bGFyaXR5IG9ubHkgZ29lcyB1cCB1bnRpbCBkYXkKLy8gVE9ETzogdW5pZnkgd2l0aCBzaW1pbGFyVW5pdE1hcAp2YXIgdG9rZW5HcmFudWxhcml0aWVzID0gewoJWTogeyB2YWx1ZTogMSwgdW5pdDogJ3llYXInIH0sCglNOiB7IHZhbHVlOiAyLCB1bml0OiAnbW9udGgnIH0sCglXOiB7IHZhbHVlOiAzLCB1bml0OiAnd2VlaycgfSwKCXc6IHsgdmFsdWU6IDMsIHVuaXQ6ICd3ZWVrJyB9LAoJRDogeyB2YWx1ZTogNCwgdW5pdDogJ2RheScgfSwgLy8gZGF5IG9mIG1vbnRoCglkOiB7IHZhbHVlOiA0LCB1bml0OiAnZGF5JyB9IC8vIGRheSBvZiB3ZWVrCn07CgovLyByZXR1cm5zIGEgdW5pdCBzdHJpbmcsIGVpdGhlciAneWVhcicsICdtb250aCcsICdkYXknLCBvciBudWxsCi8vIGZvciB0aGUgbW9zdCBncmFudWxhciBmb3JtYXR0aW5nIHRva2VuIGluIHRoZSBzdHJpbmcuCkZDLnF1ZXJ5TW9zdEdyYW51bGFyRm9ybWF0VW5pdCA9IGZ1bmN0aW9uKGZvcm1hdFN0cikgewoJdmFyIGNodW5rcyA9IGdldEZvcm1hdFN0cmluZ0NodW5rcyhmb3JtYXRTdHIpOwoJdmFyIGksIGNodW5rOwoJdmFyIGNhbmRpZGF0ZTsKCXZhciBiZXN0OwoKCWZvciAoaSA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBpKyspIHsKCQljaHVuayA9IGNodW5rc1tpXTsKCQlpZiAoY2h1bmsudG9rZW4pIHsKCQkJY2FuZGlkYXRlID0gdG9rZW5HcmFudWxhcml0aWVzW2NodW5rLnRva2VuLmNoYXJBdCgwKV07CgkJCWlmIChjYW5kaWRhdGUpIHsKCQkJCWlmICghYmVzdCB8fCBjYW5kaWRhdGUudmFsdWUgPiBiZXN0LnZhbHVlKSB7CgkJCQkJYmVzdCA9IGNhbmRpZGF0ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoYmVzdCkgewoJCXJldHVybiBiZXN0LnVuaXQ7Cgl9CgoJcmV0dXJuIG51bGw7Cn07Cgo7OwoKRkMuQ2xhc3MgPSBDbGFzczsgLy8gZXhwb3J0CgovLyBDbGFzcyB0aGF0IGFsbCBvdGhlciBjbGFzc2VzIHdpbGwgaW5oZXJpdCBmcm9tCmZ1bmN0aW9uIENsYXNzKCkgeyB9CgoKLy8gQ2FsbGVkIG9uIGEgY2xhc3MgdG8gY3JlYXRlIGEgc3ViY2xhc3MuCi8vIExhc3QgYXJndW1lbnQgY29udGFpbnMgaW5zdGFuY2UgbWV0aG9kcy4gQW55IGFyZ3VtZW50IGJlZm9yZSB0aGUgbGFzdCBhcmUgY29uc2lkZXJlZCBtaXhpbnMuCkNsYXNzLmV4dGVuZCA9IGZ1bmN0aW9uKCkgewoJdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7Cgl2YXIgaTsKCXZhciBtZW1iZXJzOwoKCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewoJCW1lbWJlcnMgPSBhcmd1bWVudHNbaV07CgkJaWYgKGkgPCBsZW4gLSAxKSB7IC8vIG5vdCB0aGUgbGFzdCBhcmd1bWVudD8KCQkJbWl4SW50b0NsYXNzKHRoaXMsIG1lbWJlcnMpOwoJCX0KCX0KCglyZXR1cm4gZXh0ZW5kQ2xhc3ModGhpcywgbWVtYmVycyB8fCB7fSk7IC8vIG1lbWJlcnMgd2lsbCBiZSB1bmRlZmluZWQgaWYgbm8gYXJndW1lbnRzCn07CgoKLy8gQWRkcyBuZXcgbWVtYmVyIHZhcmlhYmxlcy9tZXRob2RzIHRvIHRoZSBjbGFzcydzIHByb3RvdHlwZS4KLy8gQ2FuIGJlIGNhbGxlZCB3aXRoIGFub3RoZXIgY2xhc3MsIG9yIGEgcGxhaW4gb2JqZWN0IGhhc2ggY29udGFpbmluZyBuZXcgbWVtYmVycy4KQ2xhc3MubWl4aW4gPSBmdW5jdGlvbihtZW1iZXJzKSB7CgltaXhJbnRvQ2xhc3ModGhpcywgbWVtYmVycyk7Cn07CgoKZnVuY3Rpb24gZXh0ZW5kQ2xhc3Moc3VwZXJDbGFzcywgbWVtYmVycykgewoJdmFyIHN1YkNsYXNzOwoKCS8vIGVuc3VyZSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgc3ViY2xhc3MsIGZvcndhcmRpbmcgYWxsIGFyZ3VtZW50cyB0byB0aGUgc3VwZXItY29uc3RydWN0b3IgaWYgaXQgZG9lc24ndCBleGlzdAoJaWYgKGhhc093blByb3AobWVtYmVycywgJ2NvbnN0cnVjdG9yJykpIHsKCQlzdWJDbGFzcyA9IG1lbWJlcnMuY29uc3RydWN0b3I7Cgl9CglpZiAodHlwZW9mIHN1YkNsYXNzICE9PSAnZnVuY3Rpb24nKSB7CgkJc3ViQ2xhc3MgPSBtZW1iZXJzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CgkJCXN1cGVyQ2xhc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCQl9OwoJfQoKCS8vIGJ1aWxkIHRoZSBiYXNlIHByb3RvdHlwZSBmb3IgdGhlIHN1YmNsYXNzLCB3aGljaCBpcyBhbiBuZXcgb2JqZWN0IGNoYWluZWQgdG8gdGhlIHN1cGVyY2xhc3MncyBwcm90b3R5cGUKCXN1YkNsYXNzLnByb3RvdHlwZSA9IGNyZWF0ZU9iamVjdChzdXBlckNsYXNzLnByb3RvdHlwZSk7CgoJLy8gY29weSBlYWNoIG1lbWJlciB2YXJpYWJsZS9tZXRob2Qgb250byB0aGUgdGhlIHN1YmNsYXNzJ3MgcHJvdG90eXBlCgljb3B5T3duUHJvcHMobWVtYmVycywgc3ViQ2xhc3MucHJvdG90eXBlKTsKCgkvLyBjb3B5IG92ZXIgYWxsIGNsYXNzIHZhcmlhYmxlcy9tZXRob2RzIHRvIHRoZSBzdWJjbGFzcywgc3VjaCBhcyBgZXh0ZW5kYCBhbmQgYG1peGluYAoJY29weU93blByb3BzKHN1cGVyQ2xhc3MsIHN1YkNsYXNzKTsKCglyZXR1cm4gc3ViQ2xhc3M7Cn0KCgpmdW5jdGlvbiBtaXhJbnRvQ2xhc3ModGhlQ2xhc3MsIG1lbWJlcnMpIHsKCWNvcHlPd25Qcm9wcyhtZW1iZXJzLCB0aGVDbGFzcy5wcm90b3R5cGUpOwp9Cjs7Cgp2YXIgRW1pdHRlck1peGluID0gRkMuRW1pdHRlck1peGluID0gewoKCS8vIGpRdWVyeS1pZmljYXRpb24gdmlhICQodGhpcykgYWxsb3dzIGEgbm9uLURPTSBvYmplY3QgdG8gaGF2ZQoJLy8gdGhlIHNhbWUgZXZlbnQgaGFuZGxpbmcgY2FwYWJpbGl0aWVzIChpbmNsdWRpbmcgbmFtZXNwYWNlcykuCgoKCW9uOiBmdW5jdGlvbih0eXBlcywgaGFuZGxlcikgewoKCQkvLyBoYW5kbGVycyBhcmUgYWx3YXlzIGNhbGxlZCB3aXRoIGFuICJldmVudCIgb2JqZWN0IGFzIHRoZWlyIGZpcnN0IHBhcmFtLgoJCS8vIHNuZWFrIHRoZSBgdGhpc2AgY29udGV4dCBhbmQgYXJndW1lbnRzIGludG8gdGhlIGV4dHJhIHBhcmFtZXRlciBvYmplY3QKCQkvLyBhbmQgZm9yd2FyZCB0aGVtIG9uIHRvIHRoZSBvcmlnaW5hbCBoYW5kbGVyLgoJCXZhciBpbnRlcmNlcHQgPSBmdW5jdGlvbihldiwgZXh0cmEpIHsKCQkJcmV0dXJuIGhhbmRsZXIuYXBwbHkoCgkJCQlleHRyYS5jb250ZXh0IHx8IHRoaXMsCgkJCQlleHRyYS5hcmdzIHx8IFtdCgkJCSk7CgkJfTsKCgkJLy8gbWltaWNrIGpRdWVyeSdzIGludGVybmFsICJwcm94eSIgc3lzdGVtIChyaXNreSwgSSBrbm93KQoJCS8vIGNhdXNpbmcgYWxsIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIC5ndWlkIHRvIGFwcGVhciB0byBiZSB0aGUgc2FtZS4KCQkvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9ibG9iLzIuMi40L3NyYy9jb3JlLmpzI0w0NDgKCQkvLyB0aGlzIGlzIG5lZWRlZCBmb3IgY2FsbGluZyAub2ZmIHdpdGggdGhlIG9yaWdpbmFsIG5vbi1pbnRlcmNlcHQgaGFuZGxlci4KCQlpZiAoIWhhbmRsZXIuZ3VpZCkgewoJCQloYW5kbGVyLmd1aWQgPSAkLmd1aWQrKzsKCQl9CgkJaW50ZXJjZXB0Lmd1aWQgPSBoYW5kbGVyLmd1aWQ7CgoJCSQodGhpcykub24odHlwZXMsIGludGVyY2VwdCk7CgoJCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKCX0sCgoKCW9mZjogZnVuY3Rpb24odHlwZXMsIGhhbmRsZXIpIHsKCQkkKHRoaXMpLm9mZih0eXBlcywgaGFuZGxlcik7CgoJCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKCX0sCgoKCXRyaWdnZXI6IGZ1bmN0aW9uKHR5cGVzKSB7CgkJdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZpcnN0CgoJCS8vIHBhc3MgaW4gImV4dHJhIiBpbmZvIHRvIHRoZSBpbnRlcmNlcHQKCQkkKHRoaXMpLnRyaWdnZXJIYW5kbGVyKHR5cGVzLCB7IGFyZ3M6IGFyZ3MgfSk7CgoJCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKCX0sCgoKCXRyaWdnZXJXaXRoOiBmdW5jdGlvbih0eXBlcywgY29udGV4dCwgYXJncykgewoKCQkvLyBgdHJpZ2dlckhhbmRsZXJgIGlzIGxlc3MgcmVsaWFudCBvbiB0aGUgRE9NIGNvbXBhcmVkIHRvIGB0cmlnZ2VyYC4KCQkvLyBwYXNzIGluICJleHRyYSIgaW5mbyB0byB0aGUgaW50ZXJjZXB0LgoJCSQodGhpcykudHJpZ2dlckhhbmRsZXIodHlwZXMsIHsgY29udGV4dDogY29udGV4dCwgYXJnczogYXJncyB9KTsKCgkJcmV0dXJuIHRoaXM7IC8vIGZvciBjaGFpbmluZwoJfQoKfTsKCjs7CgovKgpVdGlsaXR5IG1ldGhvZHMgZm9yIGVhc2lseSBsaXN0ZW5pbmcgdG8gZXZlbnRzIG9uIGFub3RoZXIgb2JqZWN0LAphbmQgbW9yZSBpbXBvcnRhbnRseSwgZWFzaWx5IHVubGlzdGVuaW5nIGZyb20gdGhlbS4KKi8KdmFyIExpc3RlbmVyTWl4aW4gPSBGQy5MaXN0ZW5lck1peGluID0gKGZ1bmN0aW9uKCkgewoJdmFyIGd1aWQgPSAwOwoJdmFyIExpc3RlbmVyTWl4aW4gPSB7CgoJCWxpc3RlbmVySWQ6IG51bGwsCgoJCS8qCgkJR2l2ZW4gYW4gYG90aGVyYCBvYmplY3QgdGhhdCBoYXMgb24vb2ZmIG1ldGhvZHMsIGJpbmQgdGhlIGdpdmVuIGBjYWxsYmFja2AgdG8gYW4gZXZlbnQgYnkgdGhlIGdpdmVuIG5hbWUuCgkJVGhlIGBjYWxsYmFja2Agd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgYHRoaXNgIGNvbnRleHQgb2YgdGhlIG9iamVjdCB0aGF0IC5saXN0ZW5UbyBpcyBiZWluZyBjYWxsZWQgb24uCgkJQ2FuIGJlIGNhbGxlZDoKCQkJLmxpc3RlblRvKG90aGVyLCBldmVudE5hbWUsIGNhbGxiYWNrKQoJCU9SCgkJCS5saXN0ZW5UbyhvdGhlciwgewoJCQkJZXZlbnROYW1lMTogY2FsbGJhY2sxLAoJCQkJZXZlbnROYW1lMjogY2FsbGJhY2syCgkJCX0pCgkJKi8KCQlsaXN0ZW5UbzogZnVuY3Rpb24ob3RoZXIsIGFyZywgY2FsbGJhY2spIHsKCQkJaWYgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnKSB7IC8vIGdpdmVuIGRpY3Rpb25hcnkgb2YgY2FsbGJhY2tzCgkJCQlmb3IgKHZhciBldmVudE5hbWUgaW4gYXJnKSB7CgkJCQkJaWYgKGFyZy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7CgkJCQkJCXRoaXMubGlzdGVuVG8ob3RoZXIsIGV2ZW50TmFtZSwgYXJnW2V2ZW50TmFtZV0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgewoJCQkJb3RoZXIub24oCgkJCQkJYXJnICsgJy4nICsgdGhpcy5nZXRMaXN0ZW5lck5hbWVzcGFjZSgpLCAvLyB1c2UgZXZlbnQgbmFtZXNwYWNpbmcgdG8gaWRlbnRpZnkgdGhpcyBvYmplY3QKCQkJCQkkLnByb3h5KGNhbGxiYWNrLCB0aGlzKSAvLyBhbHdheXMgdXNlIGB0aGlzYCBjb250ZXh0CgkJCQkJCS8vIHRoZSB1c3VhbGx5LXVuZGVzaXJlZCBqUXVlcnkgZ3VpZCBiZWhhdmlvciBkb2Vzbid0IG1hdHRlciwKCQkJCQkJLy8gYmVjYXVzZSB3ZSBhbHdheXMgdW5iaW5kIHZpYSBuYW1lc3BhY2UKCQkJCSk7CgkJCX0KCQl9LAoKCQkvKgoJCUNhdXNlcyB0aGUgY3VycmVudCBvYmplY3QgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gZXZlbnRzIG9uIHRoZSBgb3RoZXJgIG9iamVjdC4KCQlgZXZlbnROYW1lYCBpcyBvcHRpb25hbC4gSWYgb21pdHRlZCwgd2lsbCBzdG9wIGxpc3RlbmluZyB0byBBTEwgZXZlbnRzIG9uIGBvdGhlcmAuCgkJKi8KCQlzdG9wTGlzdGVuaW5nVG86IGZ1bmN0aW9uKG90aGVyLCBldmVudE5hbWUpIHsKCQkJb3RoZXIub2ZmKChldmVudE5hbWUgfHwgJycpICsgJy4nICsgdGhpcy5nZXRMaXN0ZW5lck5hbWVzcGFjZSgpKTsKCQl9LAoKCQkvKgoJCVJldHVybnMgYSBzdHJpbmcsIHVuaXF1ZSB0byB0aGlzIG9iamVjdCwgdG8gYmUgdXNlZCBmb3IgZXZlbnQgbmFtZXNwYWNpbmcKCQkqLwoJCWdldExpc3RlbmVyTmFtZXNwYWNlOiBmdW5jdGlvbigpIHsKCQkJaWYgKHRoaXMubGlzdGVuZXJJZCA9PSBudWxsKSB7CgkJCQl0aGlzLmxpc3RlbmVySWQgPSBndWlkKys7CgkJCX0KCQkJcmV0dXJuICdfbGlzdGVuZXInICsgdGhpcy5saXN0ZW5lcklkOwoJCX0KCgl9OwoJcmV0dXJuIExpc3RlbmVyTWl4aW47Cn0pKCk7Cjs7CgovLyBzaW1wbGUgY2xhc3MgZm9yIHRvZ2dsZSBhIGBpc0lnbm9yaW5nTW91c2VgIGZsYWcgb24gZGVsYXkKLy8gaW5pdE1vdXNlSWdub3JpbmcgbXVzdCBmaXJzdCBiZSBjYWxsZWQsIHdpdGggYSBtaWxsaXNlY29uZCBkZWxheSBzZXR0aW5nLgp2YXIgTW91c2VJZ25vcmVyTWl4aW4gPSB7CgoJaXNJZ25vcmluZ01vdXNlOiBmYWxzZSwgLy8gYm9vbAoJZGVsYXlVbmlnbm9yZU1vdXNlOiBudWxsLCAvLyBtZXRob2QKCgoJaW5pdE1vdXNlSWdub3Jpbmc6IGZ1bmN0aW9uKGRlbGF5KSB7CgkJdGhpcy5kZWxheVVuaWdub3JlTW91c2UgPSBkZWJvdW5jZShwcm94eSh0aGlzLCAndW5pZ25vcmVNb3VzZScpLCBkZWxheSB8fCAxMDAwKTsKCX0sCgoKCS8vIHRlbXBvcmFyaWx5IGlnbm9yZSBtb3VzZSBhY3Rpb25zIG9uIHNlZ21lbnRzCgl0ZW1wSWdub3JlTW91c2U6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNJZ25vcmluZ01vdXNlID0gdHJ1ZTsKCQl0aGlzLmRlbGF5VW5pZ25vcmVNb3VzZSgpOwoJfSwKCgoJLy8gZGVsYXlVbmlnbm9yZU1vdXNlIGV2ZW50dWFsbHkgY2FsbHMgdGhpcwoJdW5pZ25vcmVNb3VzZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc0lnbm9yaW5nTW91c2UgPSBmYWxzZTsKCX0KCn07Cgo7OwoKLyogQSByZWN0YW5ndWxhciBwYW5lbCB0aGF0IGlzIGFic29sdXRlbHkgcG9zaXRpb25lZCBvdmVyIG90aGVyIGNvbnRlbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk9wdGlvbnM6CgktIGNsYXNzTmFtZSAoc3RyaW5nKQoJLSBjb250ZW50IChIVE1MIHN0cmluZyBvciBqUXVlcnkgZWxlbWVudCBzZXQpCgktIHBhcmVudEVsCgktIHRvcAoJLSBsZWZ0CgktIHJpZ2h0ICh0aGUgeCBjb29yZCBvZiB3aGVyZSB0aGUgcmlnaHQgZWRnZSBzaG91bGQgYmUuIG5vdCBhICJDU1MiIHJpZ2h0KQoJLSBhdXRvSGlkZSAoYm9vbGVhbikKCS0gc2hvdyAoY2FsbGJhY2spCgktIGhpZGUgKGNhbGxiYWNrKQoqLwoKdmFyIFBvcG92ZXIgPSBDbGFzcy5leHRlbmQoTGlzdGVuZXJNaXhpbiwgewoKCWlzSGlkZGVuOiB0cnVlLAoJb3B0aW9uczogbnVsbCwKCWVsOiBudWxsLCAvLyB0aGUgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBwb3BvdmVyLiBnZW5lcmF0ZWQgYnkgdGhpcyBvYmplY3QKCW1hcmdpbjogMTAsIC8vIHRoZSBzcGFjZSByZXF1aXJlZCBiZXR3ZWVuIHRoZSBwb3BvdmVyIGFuZCB0aGUgZWRnZXMgb2YgdGhlIHNjcm9sbCBjb250YWluZXIKCgoJY29uc3RydWN0b3I6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJfSwKCgoJLy8gU2hvd3MgdGhlIHBvcG92ZXIgb24gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gUmVuZGVycyBpdCBpZiBub3QgYWxyZWFkeQoJc2hvdzogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNIaWRkZW4pIHsKCQkJaWYgKCF0aGlzLmVsKSB7CgkJCQl0aGlzLnJlbmRlcigpOwoJCQl9CgkJCXRoaXMuZWwuc2hvdygpOwoJCQl0aGlzLnBvc2l0aW9uKCk7CgkJCXRoaXMuaXNIaWRkZW4gPSBmYWxzZTsKCQkJdGhpcy50cmlnZ2VyKCdzaG93Jyk7CgkJfQoJfSwKCgoJLy8gSGlkZXMgdGhlIHBvcG92ZXIsIHRocm91Z2ggQ1NTLCBidXQgZG9lcyBub3QgcmVtb3ZlIGl0IGZyb20gdGhlIERPTQoJaGlkZTogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLmlzSGlkZGVuKSB7CgkJCXRoaXMuZWwuaGlkZSgpOwoJCQl0aGlzLmlzSGlkZGVuID0gdHJ1ZTsKCQkJdGhpcy50cmlnZ2VyKCdoaWRlJyk7CgkJfQoJfSwKCgoJLy8gQ3JlYXRlcyBgdGhpcy5lbGAgYW5kIHJlbmRlcnMgY29udGVudCBpbnNpZGUgb2YgaXQKCXJlbmRlcjogZnVuY3Rpb24oKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKCgkJdGhpcy5lbCA9ICQoJzxkaXYgY2xhc3M9ImZjLXBvcG92ZXIiLz4nKQoJCQkuYWRkQ2xhc3Mob3B0aW9ucy5jbGFzc05hbWUgfHwgJycpCgkJCS5jc3MoewoJCQkJLy8gcG9zaXRpb24gaW5pdGlhbGx5IHRvIHRoZSB0b3AgbGVmdCB0byBhdm9pZCBjcmVhdGluZyBzY3JvbGxiYXJzCgkJCQl0b3A6IDAsCgkJCQlsZWZ0OiAwCgkJCX0pCgkJCS5hcHBlbmQob3B0aW9ucy5jb250ZW50KQoJCQkuYXBwZW5kVG8ob3B0aW9ucy5wYXJlbnRFbCk7CgoJCS8vIHdoZW4gYSBjbGljayBoYXBwZW5zIG9uIGFueXRoaW5nIGluc2lkZSB3aXRoIGEgJ2ZjLWNsb3NlJyBjbGFzc05hbWUsIGhpZGUgdGhlIHBvcG92ZXIKCQl0aGlzLmVsLm9uKCdjbGljaycsICcuZmMtY2xvc2UnLCBmdW5jdGlvbigpIHsKCQkJX3RoaXMuaGlkZSgpOwoJCX0pOwoKCQlpZiAob3B0aW9ucy5hdXRvSGlkZSkgewoJCQl0aGlzLmxpc3RlblRvKCQoZG9jdW1lbnQpLCAnbW91c2Vkb3duJywgdGhpcy5kb2N1bWVudE1vdXNlZG93bik7CgkJfQoJfSwKCgoJLy8gVHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzICphbnl3aGVyZSogaW4gdGhlIGRvY3VtZW50LCBmb3IgdGhlIGF1dG9IaWRlIGZlYXR1cmUKCWRvY3VtZW50TW91c2Vkb3duOiBmdW5jdGlvbihldikgewoJCS8vIG9ubHkgaGlkZSB0aGUgcG9wb3ZlciBpZiB0aGUgY2xpY2sgaGFwcGVuZWQgb3V0c2lkZSB0aGUgcG9wb3ZlcgoJCWlmICh0aGlzLmVsICYmICEkKGV2LnRhcmdldCkuY2xvc2VzdCh0aGlzLmVsKS5sZW5ndGgpIHsKCQkJdGhpcy5oaWRlKCk7CgkJfQoJfSwKCgoJLy8gSGlkZXMgYW5kIHVucmVnaXN0ZXJzIGFueSBoYW5kbGVycwoJcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24oKSB7CgkJdGhpcy5oaWRlKCk7CgoJCWlmICh0aGlzLmVsKSB7CgkJCXRoaXMuZWwucmVtb3ZlKCk7CgkJCXRoaXMuZWwgPSBudWxsOwoJCX0KCgkJdGhpcy5zdG9wTGlzdGVuaW5nVG8oJChkb2N1bWVudCksICdtb3VzZWRvd24nKTsKCX0sCgoKCS8vIFBvc2l0aW9ucyB0aGUgcG9wb3ZlciBvcHRpbWFsbHksIHVzaW5nIHRoZSB0b3AvbGVmdC9yaWdodCBvcHRpb25zCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgkJdmFyIG9yaWdpbiA9IHRoaXMuZWwub2Zmc2V0UGFyZW50KCkub2Zmc2V0KCk7CgkJdmFyIHdpZHRoID0gdGhpcy5lbC5vdXRlcldpZHRoKCk7CgkJdmFyIGhlaWdodCA9IHRoaXMuZWwub3V0ZXJIZWlnaHQoKTsKCQl2YXIgd2luZG93RWwgPSAkKHdpbmRvdyk7CgkJdmFyIHZpZXdwb3J0RWwgPSBnZXRTY3JvbGxQYXJlbnQodGhpcy5lbCk7CgkJdmFyIHZpZXdwb3J0VG9wOwoJCXZhciB2aWV3cG9ydExlZnQ7CgkJdmFyIHZpZXdwb3J0T2Zmc2V0OwoJCXZhciB0b3A7IC8vIHRoZSAicG9zaXRpb24iIChub3QgIm9mZnNldCIpIHZhbHVlcyBmb3IgdGhlIHBvcG92ZXIKCQl2YXIgbGVmdDsgLy8KCgkJLy8gY29tcHV0ZSB0b3AgYW5kIGxlZnQKCQl0b3AgPSBvcHRpb25zLnRvcCB8fCAwOwoJCWlmIChvcHRpb25zLmxlZnQgIT09IHVuZGVmaW5lZCkgewoJCQlsZWZ0ID0gb3B0aW9ucy5sZWZ0OwoJCX0KCQllbHNlIGlmIChvcHRpb25zLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHsKCQkJbGVmdCA9IG9wdGlvbnMucmlnaHQgLSB3aWR0aDsgLy8gZGVyaXZlIHRoZSBsZWZ0IHZhbHVlIGZyb20gdGhlIHJpZ2h0IHZhbHVlCgkJfQoJCWVsc2UgewoJCQlsZWZ0ID0gMDsKCQl9CgoJCWlmICh2aWV3cG9ydEVsLmlzKHdpbmRvdykgfHwgdmlld3BvcnRFbC5pcyhkb2N1bWVudCkpIHsgLy8gbm9ybWFsaXplIGdldFNjcm9sbFBhcmVudCdzIHJlc3VsdAoJCQl2aWV3cG9ydEVsID0gd2luZG93RWw7CgkJCXZpZXdwb3J0VG9wID0gMDsgLy8gdGhlIHdpbmRvdyBpcyBhbHdheXMgYXQgdGhlIHRvcCBsZWZ0CgkJCXZpZXdwb3J0TGVmdCA9IDA7IC8vIChhbmQgLm9mZnNldCgpIHdvbid0IHdvcmsgaWYgY2FsbGVkIGhlcmUpCgkJfQoJCWVsc2UgewoJCQl2aWV3cG9ydE9mZnNldCA9IHZpZXdwb3J0RWwub2Zmc2V0KCk7CgkJCXZpZXdwb3J0VG9wID0gdmlld3BvcnRPZmZzZXQudG9wOwoJCQl2aWV3cG9ydExlZnQgPSB2aWV3cG9ydE9mZnNldC5sZWZ0OwoJCX0KCgkJLy8gaWYgdGhlIHdpbmRvdyBpcyBzY3JvbGxlZCwgaXQgY2F1c2VzIHRoZSB2aXNpYmxlIGFyZWEgdG8gYmUgZnVydGhlciBkb3duCgkJdmlld3BvcnRUb3AgKz0gd2luZG93RWwuc2Nyb2xsVG9wKCk7CgkJdmlld3BvcnRMZWZ0ICs9IHdpbmRvd0VsLnNjcm9sbExlZnQoKTsKCgkJLy8gY29uc3RyYWluIHRvIHRoZSB2aWV3IHBvcnQuIGlmIGNvbnN0cmFpbmVkIGJ5IHR3byBlZGdlcywgZ2l2ZSBwcmVjZWRlbmNlIHRvIHRvcC9sZWZ0CgkJaWYgKG9wdGlvbnMudmlld3BvcnRDb25zdHJhaW4gIT09IGZhbHNlKSB7CgkJCXRvcCA9IE1hdGgubWluKHRvcCwgdmlld3BvcnRUb3AgKyB2aWV3cG9ydEVsLm91dGVySGVpZ2h0KCkgLSBoZWlnaHQgLSB0aGlzLm1hcmdpbik7CgkJCXRvcCA9IE1hdGgubWF4KHRvcCwgdmlld3BvcnRUb3AgKyB0aGlzLm1hcmdpbik7CgkJCWxlZnQgPSBNYXRoLm1pbihsZWZ0LCB2aWV3cG9ydExlZnQgKyB2aWV3cG9ydEVsLm91dGVyV2lkdGgoKSAtIHdpZHRoIC0gdGhpcy5tYXJnaW4pOwoJCQlsZWZ0ID0gTWF0aC5tYXgobGVmdCwgdmlld3BvcnRMZWZ0ICsgdGhpcy5tYXJnaW4pOwoJCX0KCgkJdGhpcy5lbC5jc3MoewoJCQl0b3A6IHRvcCAtIG9yaWdpbi50b3AsCgkJCWxlZnQ6IGxlZnQgLSBvcmlnaW4ubGVmdAoJCX0pOwoJfSwKCgoJLy8gVHJpZ2dlcnMgYSBjYWxsYmFjay4gQ2FsbHMgYSBmdW5jdGlvbiBpbiB0aGUgb3B0aW9uIGhhc2ggb2YgdGhlIHNhbWUgbmFtZS4KCS8vIEFyZ3VtZW50cyBiZXlvbmQgdGhlIGZpcnN0IGBuYW1lYCBhcmUgZm9yd2FyZGVkIG9uLgoJLy8gVE9ETzogYmV0dGVyIGNvZGUgcmV1c2UgZm9yIHRoaXMuIFJlcGVhdCBjb2RlCgl0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7CgkJaWYgKHRoaXMub3B0aW9uc1tuYW1lXSkgewoJCQl0aGlzLm9wdGlvbnNbbmFtZV0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJfQoJfQoKfSk7Cgo7OwoKLyoKQSBjYWNoZSBmb3IgdGhlIGxlZnQvcmlnaHQvdG9wL2JvdHRvbS93aWR0aC9oZWlnaHQgdmFsdWVzIGZvciBvbmUgb3IgbW9yZSBlbGVtZW50cy4KV29ya3Mgd2l0aCBib3RoIG9mZnNldCAoZnJvbSB0b3BsZWZ0IGRvY3VtZW50KSBhbmQgcG9zaXRpb24gKGZyb20gb2Zmc2V0UGFyZW50KS4KCm9wdGlvbnM6Ci0gZWxzCi0gaXNIb3Jpem9udGFsCi0gaXNWZXJ0aWNhbAoqLwp2YXIgQ29vcmRDYWNoZSA9IEZDLkNvb3JkQ2FjaGUgPSBDbGFzcy5leHRlbmQoewoKCWVsczogbnVsbCwgLy8galF1ZXJ5IHNldCAoYXNzdW1lZCB0byBiZSBzaWJsaW5ncykKCWZvcmNlZE9mZnNldFBhcmVudEVsOiBudWxsLCAvLyBvcHRpb25zIGNhbiBvdmVycmlkZSB0aGUgbmF0dXJhbCBvZmZzZXRQYXJlbnQKCW9yaWdpbjogbnVsbCwgLy8ge2xlZnQsdG9wfSBwb3NpdGlvbiBvZiBvZmZzZXRQYXJlbnQgb2YgZWxzCglib3VuZGluZ1JlY3Q6IG51bGwsIC8vIGNvbnN0cmFpbiBjb3JkaW5hdGVzIHRvIHRoaXMgcmVjdGFuZ2xlLiB7bGVmdCxyaWdodCx0b3AsYm90dG9tfSBvciBudWxsCglpc0hvcml6b250YWw6IGZhbHNlLCAvLyB3aGV0aGVyIHRvIHF1ZXJ5IGZvciBsZWZ0L3JpZ2h0L3dpZHRoCglpc1ZlcnRpY2FsOiBmYWxzZSwgLy8gd2hldGhlciB0byBxdWVyeSBmb3IgdG9wL2JvdHRvbS9oZWlnaHQKCgkvLyBhcnJheXMgb2YgY29vcmRpbmF0ZXMgKG9mZnNldHMgZnJvbSB0b3BsZWZ0IG9mIGRvY3VtZW50KQoJbGVmdHM6IG51bGwsCglyaWdodHM6IG51bGwsCgl0b3BzOiBudWxsLAoJYm90dG9tczogbnVsbCwKCgoJY29uc3RydWN0b3I6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCQl0aGlzLmVscyA9ICQob3B0aW9ucy5lbHMpOwoJCXRoaXMuaXNIb3Jpem9udGFsID0gb3B0aW9ucy5pc0hvcml6b250YWw7CgkJdGhpcy5pc1ZlcnRpY2FsID0gb3B0aW9ucy5pc1ZlcnRpY2FsOwoJCXRoaXMuZm9yY2VkT2Zmc2V0UGFyZW50RWwgPSBvcHRpb25zLm9mZnNldFBhcmVudCA/ICQob3B0aW9ucy5vZmZzZXRQYXJlbnQpIDogbnVsbDsKCX0sCgoKCS8vIFF1ZXJpZXMgdGhlIGVscyBmb3IgY29vcmRpbmF0ZXMgYW5kIHN0b3JlcyB0aGVtLgoJLy8gQ2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdXNpbmcgYW5kIG9mIHRoZSBnZXQqIG1ldGhvZHMgYmVsb3cuCglidWlsZDogZnVuY3Rpb24oKSB7CgkJdmFyIG9mZnNldFBhcmVudEVsID0gdGhpcy5mb3JjZWRPZmZzZXRQYXJlbnRFbCB8fCB0aGlzLmVscy5lcSgwKS5vZmZzZXRQYXJlbnQoKTsKCgkJdGhpcy5vcmlnaW4gPSBvZmZzZXRQYXJlbnRFbC5vZmZzZXQoKTsKCQl0aGlzLmJvdW5kaW5nUmVjdCA9IHRoaXMucXVlcnlCb3VuZGluZ1JlY3QoKTsKCgkJaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7CgkJCXRoaXMuYnVpbGRFbEhvcml6b250YWxzKCk7CgkJfQoJCWlmICh0aGlzLmlzVmVydGljYWwpIHsKCQkJdGhpcy5idWlsZEVsVmVydGljYWxzKCk7CgkJfQoJfSwKCgoJLy8gRGVzdHJveXMgYWxsIGludGVybmFsIGRhdGEgYWJvdXQgY29vcmRpbmF0ZXMsIGZyZWVpbmcgbWVtb3J5CgljbGVhcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5vcmlnaW4gPSBudWxsOwoJCXRoaXMuYm91bmRpbmdSZWN0ID0gbnVsbDsKCQl0aGlzLmxlZnRzID0gbnVsbDsKCQl0aGlzLnJpZ2h0cyA9IG51bGw7CgkJdGhpcy50b3BzID0gbnVsbDsKCQl0aGlzLmJvdHRvbXMgPSBudWxsOwoJfSwKCgoJLy8gV2hlbiBjYWxsZWQsIGlmIGNvb3JkIGNhY2hlcyBhcmVuJ3QgYnVpbHQsIGJ1aWxkcyB0aGVtCgllbnN1cmVCdWlsdDogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLm9yaWdpbikgewoJCQl0aGlzLmJ1aWxkKCk7CgkJfQoJfSwKCgoJLy8gUG9wdWxhdGVzIHRoZSBsZWZ0L3JpZ2h0IGludGVybmFsIGNvb3JkaW5hdGUgYXJyYXlzCglidWlsZEVsSG9yaXpvbnRhbHM6IGZ1bmN0aW9uKCkgewoJCXZhciBsZWZ0cyA9IFtdOwoJCXZhciByaWdodHMgPSBbXTsKCgkJdGhpcy5lbHMuZWFjaChmdW5jdGlvbihpLCBub2RlKSB7CgkJCXZhciBlbCA9ICQobm9kZSk7CgkJCXZhciBsZWZ0ID0gZWwub2Zmc2V0KCkubGVmdDsKCQkJdmFyIHdpZHRoID0gZWwub3V0ZXJXaWR0aCgpOwoKCQkJbGVmdHMucHVzaChsZWZ0KTsKCQkJcmlnaHRzLnB1c2gobGVmdCArIHdpZHRoKTsKCQl9KTsKCgkJdGhpcy5sZWZ0cyA9IGxlZnRzOwoJCXRoaXMucmlnaHRzID0gcmlnaHRzOwoJfSwKCgoJLy8gUG9wdWxhdGVzIHRoZSB0b3AvYm90dG9tIGludGVybmFsIGNvb3JkaW5hdGUgYXJyYXlzCglidWlsZEVsVmVydGljYWxzOiBmdW5jdGlvbigpIHsKCQl2YXIgdG9wcyA9IFtdOwoJCXZhciBib3R0b21zID0gW107CgoJCXRoaXMuZWxzLmVhY2goZnVuY3Rpb24oaSwgbm9kZSkgewoJCQl2YXIgZWwgPSAkKG5vZGUpOwoJCQl2YXIgdG9wID0gZWwub2Zmc2V0KCkudG9wOwoJCQl2YXIgaGVpZ2h0ID0gZWwub3V0ZXJIZWlnaHQoKTsKCgkJCXRvcHMucHVzaCh0b3ApOwoJCQlib3R0b21zLnB1c2godG9wICsgaGVpZ2h0KTsKCQl9KTsKCgkJdGhpcy50b3BzID0gdG9wczsKCQl0aGlzLmJvdHRvbXMgPSBib3R0b21zOwoJfSwKCgoJLy8gR2l2ZW4gYSBsZWZ0IG9mZnNldCAoZnJvbSBkb2N1bWVudCBsZWZ0KSwgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVsIHRoYXQgaXQgaG9yaXpvbnRhbGx5IGludGVyc2VjdHMuCgkvLyBJZiBubyBpbnRlcnNlY3Rpb24gaXMgbWFkZSwgcmV0dXJucyB1bmRlZmluZWQuCglnZXRIb3Jpem9udGFsSW5kZXg6IGZ1bmN0aW9uKGxlZnRPZmZzZXQpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgoJCXZhciBsZWZ0cyA9IHRoaXMubGVmdHM7CgkJdmFyIHJpZ2h0cyA9IHRoaXMucmlnaHRzOwoJCXZhciBsZW4gPSBsZWZ0cy5sZW5ndGg7CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewoJCQlpZiAobGVmdE9mZnNldCA+PSBsZWZ0c1tpXSAmJiBsZWZ0T2Zmc2V0IDwgcmlnaHRzW2ldKSB7CgkJCQlyZXR1cm4gaTsKCQkJfQoJCX0KCX0sCgoKCS8vIEdpdmVuIGEgdG9wIG9mZnNldCAoZnJvbSBkb2N1bWVudCB0b3ApLCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZWwgdGhhdCBpdCB2ZXJ0aWNhbGx5IGludGVyc2VjdHMuCgkvLyBJZiBubyBpbnRlcnNlY3Rpb24gaXMgbWFkZSwgcmV0dXJucyB1bmRlZmluZWQuCglnZXRWZXJ0aWNhbEluZGV4OiBmdW5jdGlvbih0b3BPZmZzZXQpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgoJCXZhciB0b3BzID0gdGhpcy50b3BzOwoJCXZhciBib3R0b21zID0gdGhpcy5ib3R0b21zOwoJCXZhciBsZW4gPSB0b3BzLmxlbmd0aDsKCQl2YXIgaTsKCgkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkJCWlmICh0b3BPZmZzZXQgPj0gdG9wc1tpXSAmJiB0b3BPZmZzZXQgPCBib3R0b21zW2ldKSB7CgkJCQlyZXR1cm4gaTsKCQkJfQoJCX0KCX0sCgoKCS8vIEdldHMgdGhlIGxlZnQgb2Zmc2V0IChmcm9tIGRvY3VtZW50IGxlZnQpIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleAoJZ2V0TGVmdE9mZnNldDogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLmxlZnRzW2xlZnRJbmRleF07Cgl9LAoKCgkvLyBHZXRzIHRoZSBsZWZ0IHBvc2l0aW9uIChmcm9tIG9mZnNldFBhcmVudCBsZWZ0KSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXgKCWdldExlZnRQb3NpdGlvbjogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLmxlZnRzW2xlZnRJbmRleF0gLSB0aGlzLm9yaWdpbi5sZWZ0OwoJfSwKCgoJLy8gR2V0cyB0aGUgcmlnaHQgb2Zmc2V0IChmcm9tIGRvY3VtZW50IGxlZnQpIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4KCS8vIFRoaXMgdmFsdWUgaXMgTk9UIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCdzIHJpZ2h0IGVkZ2UsIGxpa2UgdGhlIENTUyBjb25jZXB0IG9mICJyaWdodCIgd291bGQgYmUuCglnZXRSaWdodE9mZnNldDogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLnJpZ2h0c1tsZWZ0SW5kZXhdOwoJfSwKCgoJLy8gR2V0cyB0aGUgcmlnaHQgcG9zaXRpb24gKGZyb20gb2Zmc2V0UGFyZW50IGxlZnQpIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4KCS8vIFRoaXMgdmFsdWUgaXMgTk9UIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXRQYXJlbnQncyByaWdodCBlZGdlLCBsaWtlIHRoZSBDU1MgY29uY2VwdCBvZiAicmlnaHQiIHdvdWxkIGJlLgoJZ2V0UmlnaHRQb3NpdGlvbjogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLnJpZ2h0c1tsZWZ0SW5kZXhdIC0gdGhpcy5vcmlnaW4ubGVmdDsKCX0sCgoKCS8vIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleAoJZ2V0V2lkdGg6IGZ1bmN0aW9uKGxlZnRJbmRleCkgewoJCXRoaXMuZW5zdXJlQnVpbHQoKTsKCQlyZXR1cm4gdGhpcy5yaWdodHNbbGVmdEluZGV4XSAtIHRoaXMubGVmdHNbbGVmdEluZGV4XTsKCX0sCgoKCS8vIEdldHMgdGhlIHRvcCBvZmZzZXQgKGZyb20gZG9jdW1lbnQgdG9wKSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXgKCWdldFRvcE9mZnNldDogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMudG9wc1t0b3BJbmRleF07Cgl9LAoKCgkvLyBHZXRzIHRoZSB0b3AgcG9zaXRpb24gKGZyb20gb2Zmc2V0UGFyZW50IHRvcCkgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uCglnZXRUb3BQb3NpdGlvbjogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMudG9wc1t0b3BJbmRleF0gLSB0aGlzLm9yaWdpbi50b3A7Cgl9LAoKCS8vIEdldHMgdGhlIGJvdHRvbSBvZmZzZXQgKGZyb20gdGhlIGRvY3VtZW50IHRvcCkgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4LgoJLy8gVGhpcyB2YWx1ZSBpcyBOT1QgcmVsYXRpdmUgdG8gdGhlIG9mZnNldFBhcmVudCdzIGJvdHRvbSBlZGdlLCBsaWtlIHRoZSBDU1MgY29uY2VwdCBvZiAiYm90dG9tIiB3b3VsZCBiZS4KCWdldEJvdHRvbU9mZnNldDogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMuYm90dG9tc1t0b3BJbmRleF07Cgl9LAoKCgkvLyBHZXRzIHRoZSBib3R0b20gcG9zaXRpb24gKGZyb20gdGhlIG9mZnNldFBhcmVudCB0b3ApIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4KCS8vIFRoaXMgdmFsdWUgaXMgTk9UIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXRQYXJlbnQncyBib3R0b20gZWRnZSwgbGlrZSB0aGUgQ1NTIGNvbmNlcHQgb2YgImJvdHRvbSIgd291bGQgYmUuCglnZXRCb3R0b21Qb3NpdGlvbjogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMuYm90dG9tc1t0b3BJbmRleF0gLSB0aGlzLm9yaWdpbi50b3A7Cgl9LAoKCgkvLyBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4CglnZXRIZWlnaHQ6IGZ1bmN0aW9uKHRvcEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLmJvdHRvbXNbdG9wSW5kZXhdIC0gdGhpcy50b3BzW3RvcEluZGV4XTsKCX0sCgoKCS8vIEJvdW5kaW5nIFJlY3QKCS8vIFRPRE86IGRlY291cGxlIHRoaXMgZnJvbSBDb29yZENhY2hlCgoJLy8gQ29tcHV0ZSBhbmQgcmV0dXJuIHdoYXQgdGhlIGVsZW1lbnRzJyBib3VuZGluZyByZWN0YW5nbGUgaXMsIGZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZS4KCS8vIFJpZ2h0IG5vdywgb25seSByZXR1cm5zIGEgcmVjdGFuZ2xlIGlmIGNvbnN0cmFpbmVkIGJ5IGFuIG92ZXJmbG93OnNjcm9sbCBlbGVtZW50LgoJcXVlcnlCb3VuZGluZ1JlY3Q6IGZ1bmN0aW9uKCkgewoJCXZhciBzY3JvbGxQYXJlbnRFbCA9IGdldFNjcm9sbFBhcmVudCh0aGlzLmVscy5lcSgwKSk7CgoJCWlmICghc2Nyb2xsUGFyZW50RWwuaXMoZG9jdW1lbnQpKSB7CgkJCXJldHVybiBnZXRDbGllbnRSZWN0KHNjcm9sbFBhcmVudEVsKTsKCQl9Cgl9LAoKCWlzUG9pbnRJbkJvdW5kczogZnVuY3Rpb24obGVmdE9mZnNldCwgdG9wT2Zmc2V0KSB7CgkJcmV0dXJuIHRoaXMuaXNMZWZ0SW5Cb3VuZHMobGVmdE9mZnNldCkgJiYgdGhpcy5pc1RvcEluQm91bmRzKHRvcE9mZnNldCk7Cgl9LAoKCWlzTGVmdEluQm91bmRzOiBmdW5jdGlvbihsZWZ0T2Zmc2V0KSB7CgkJcmV0dXJuICF0aGlzLmJvdW5kaW5nUmVjdCB8fCAobGVmdE9mZnNldCA+PSB0aGlzLmJvdW5kaW5nUmVjdC5sZWZ0ICYmIGxlZnRPZmZzZXQgPCB0aGlzLmJvdW5kaW5nUmVjdC5yaWdodCk7Cgl9LAoKCWlzVG9wSW5Cb3VuZHM6IGZ1bmN0aW9uKHRvcE9mZnNldCkgewoJCXJldHVybiAhdGhpcy5ib3VuZGluZ1JlY3QgfHwgKHRvcE9mZnNldCA+PSB0aGlzLmJvdW5kaW5nUmVjdC50b3AgJiYgdG9wT2Zmc2V0IDwgdGhpcy5ib3VuZGluZ1JlY3QuYm90dG9tKTsKCX0KCn0pOwoKOzsKCi8qIFRyYWNrcyBhIGRyYWcncyBtb3VzZSBtb3ZlbWVudCwgZmlyaW5nIHZhcmlvdXMgaGFuZGxlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8vIFRPRE86IHVzZSBFbWl0dGVyCgp2YXIgRHJhZ0xpc3RlbmVyID0gRkMuRHJhZ0xpc3RlbmVyID0gQ2xhc3MuZXh0ZW5kKExpc3RlbmVyTWl4aW4sIE1vdXNlSWdub3Jlck1peGluLCB7CgoJb3B0aW9uczogbnVsbCwKCXN1YmplY3RFbDogbnVsbCwKCgkvLyBjb29yZGluYXRlcyBvZiB0aGUgaW5pdGlhbCBtb3VzZWRvd24KCW9yaWdpblg6IG51bGwsCglvcmlnaW5ZOiBudWxsLAoKCS8vIHRoZSB3cmFwcGluZyBlbGVtZW50IHRoYXQgc2Nyb2xscywgb3IgTUlHSFQgc2Nyb2xsIGlmIHRoZXJlJ3Mgb3ZlcmZsb3cuCgkvLyBUT0RPOiBkbyB0aGlzIGZvciB3cmFwcGVycyB0aGF0IGhhdmUgb3ZlcmZsb3c6aGlkZGVuIGFzIHdlbGwuCglzY3JvbGxFbDogbnVsbCwKCglpc0ludGVyYWN0aW5nOiBmYWxzZSwKCWlzRGlzdGFuY2VTdXJwYXNzZWQ6IGZhbHNlLAoJaXNEZWxheUVuZGVkOiBmYWxzZSwKCWlzRHJhZ2dpbmc6IGZhbHNlLAoJaXNUb3VjaDogZmFsc2UsCgoJZGVsYXk6IG51bGwsCglkZWxheVRpbWVvdXRJZDogbnVsbCwKCW1pbkRpc3RhbmNlOiBudWxsLAoKCWhhbmRsZVRvdWNoU2Nyb2xsUHJveHk6IG51bGwsIC8vIGNhbGxzIGhhbmRsZVRvdWNoU2Nyb2xsLCBhbHdheXMgYm91bmQgdG8gYHRoaXNgCgoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihvcHRpb25zKSB7CgkJdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCQl0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsUHJveHkgPSBwcm94eSh0aGlzLCAnaGFuZGxlVG91Y2hTY3JvbGwnKTsKCQl0aGlzLmluaXRNb3VzZUlnbm9yaW5nKDUwMCk7Cgl9LAoKCgkvLyBJbnRlcmFjdGlvbiAoaGlnaC1sZXZlbCkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCXN0YXJ0SW50ZXJhY3Rpb246IGZ1bmN0aW9uKGV2LCBleHRyYU9wdGlvbnMpIHsKCQl2YXIgaXNUb3VjaCA9IGdldEV2SXNUb3VjaChldik7CgoJCWlmIChldi50eXBlID09PSAnbW91c2Vkb3duJykgewoJCQlpZiAodGhpcy5pc0lnbm9yaW5nTW91c2UpIHsKCQkJCXJldHVybjsKCQkJfQoJCQllbHNlIGlmICghaXNQcmltYXJ5TW91c2VCdXR0b24oZXYpKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJZWxzZSB7CgkJCQlldi5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50cyBuYXRpdmUgc2VsZWN0aW9uIGluIG1vc3QgYnJvd3NlcnMKCQkJfQoJCX0KCgkJaWYgKCF0aGlzLmlzSW50ZXJhY3RpbmcpIHsKCgkJCS8vIHByb2Nlc3Mgb3B0aW9ucwoJCQlleHRyYU9wdGlvbnMgPSBleHRyYU9wdGlvbnMgfHwge307CgkJCXRoaXMuZGVsYXkgPSBmaXJzdERlZmluZWQoZXh0cmFPcHRpb25zLmRlbGF5LCB0aGlzLm9wdGlvbnMuZGVsYXksIDApOwoJCQl0aGlzLm1pbkRpc3RhbmNlID0gZmlyc3REZWZpbmVkKGV4dHJhT3B0aW9ucy5kaXN0YW5jZSwgdGhpcy5vcHRpb25zLmRpc3RhbmNlLCAwKTsKCQkJdGhpcy5zdWJqZWN0RWwgPSB0aGlzLm9wdGlvbnMuc3ViamVjdEVsOwoKCQkJdGhpcy5pc0ludGVyYWN0aW5nID0gdHJ1ZTsKCQkJdGhpcy5pc1RvdWNoID0gaXNUb3VjaDsKCQkJdGhpcy5pc0RlbGF5RW5kZWQgPSBmYWxzZTsKCQkJdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkID0gZmFsc2U7CgoJCQl0aGlzLm9yaWdpblggPSBnZXRFdlgoZXYpOwoJCQl0aGlzLm9yaWdpblkgPSBnZXRFdlkoZXYpOwoJCQl0aGlzLnNjcm9sbEVsID0gZ2V0U2Nyb2xsUGFyZW50KCQoZXYudGFyZ2V0KSk7CgoJCQl0aGlzLmJpbmRIYW5kbGVycygpOwoJCQl0aGlzLmluaXRBdXRvU2Nyb2xsKCk7CgkJCXRoaXMuaGFuZGxlSW50ZXJhY3Rpb25TdGFydChldik7CgkJCXRoaXMuc3RhcnREZWxheShldik7CgoJCQlpZiAoIXRoaXMubWluRGlzdGFuY2UpIHsKCQkJCXRoaXMuaGFuZGxlRGlzdGFuY2VTdXJwYXNzZWQoZXYpOwoJCQl9CgkJfQoJfSwKCgoJaGFuZGxlSW50ZXJhY3Rpb25TdGFydDogZnVuY3Rpb24oZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2ludGVyYWN0aW9uU3RhcnQnLCBldik7Cgl9LAoKCgllbmRJbnRlcmFjdGlvbjogZnVuY3Rpb24oZXYsIGlzQ2FuY2VsbGVkKSB7CgkJaWYgKHRoaXMuaXNJbnRlcmFjdGluZykgewoJCQl0aGlzLmVuZERyYWcoZXYpOwoKCQkJaWYgKHRoaXMuZGVsYXlUaW1lb3V0SWQpIHsKCQkJCWNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZW91dElkKTsKCQkJCXRoaXMuZGVsYXlUaW1lb3V0SWQgPSBudWxsOwoJCQl9CgoJCQl0aGlzLmRlc3Ryb3lBdXRvU2Nyb2xsKCk7CgkJCXRoaXMudW5iaW5kSGFuZGxlcnMoKTsKCgkJCXRoaXMuaXNJbnRlcmFjdGluZyA9IGZhbHNlOwoJCQl0aGlzLmhhbmRsZUludGVyYWN0aW9uRW5kKGV2LCBpc0NhbmNlbGxlZCk7CgoJCQkvLyBhIHRvdWNoc3RhcnQrdG91Y2hlbmQgb24gdGhlIHNhbWUgZWxlbWVudCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGFkZGl0aW9uIHNpbXVsYXRlZCBldmVudHM6CgkJCS8vIG1vdXNlb3ZlciArIG1vdXNlb3V0ICsgY2xpY2sKCQkJLy8gbGV0J3MgaWdub3JlIHRoZXNlIGJvZ3VzIGV2ZW50cwoJCQlpZiAodGhpcy5pc1RvdWNoKSB7CgkJCQl0aGlzLnRlbXBJZ25vcmVNb3VzZSgpOwoJCQl9CgkJfQoJfSwKCgoJaGFuZGxlSW50ZXJhY3Rpb25FbmQ6IGZ1bmN0aW9uKGV2LCBpc0NhbmNlbGxlZCkgewoJCXRoaXMudHJpZ2dlcignaW50ZXJhY3Rpb25FbmQnLCBldiwgaXNDYW5jZWxsZWQgfHwgZmFsc2UpOwoJfSwKCgoJLy8gQmluZGluZyBUbyBET00KCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCWJpbmRIYW5kbGVyczogZnVuY3Rpb24oKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdG91Y2hTdGFydElnbm9yZXMgPSAxOwoKCQlpZiAodGhpcy5pc1RvdWNoKSB7CgkJCXRoaXMubGlzdGVuVG8oJChkb2N1bWVudCksIHsKCQkJCXRvdWNobW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsCgkJCQl0b3VjaGVuZDogdGhpcy5lbmRJbnRlcmFjdGlvbiwKCQkJCXRvdWNoY2FuY2VsOiB0aGlzLmVuZEludGVyYWN0aW9uLAoKCQkJCS8vIFNvbWV0aW1lcyB0b3VjaGVuZCBkb2Vzbid0IGZpcmUKCQkJCS8vIChjYW4ndCBmaWd1cmUgb3V0IHdoeS4gdG91Y2hjYW5jZWwgZG9lc24ndCBmaXJlIGVpdGhlci4gaGFzIHRvIGRvIHdpdGggc2Nyb2xsaW5nPykKCQkJCS8vIElmIGFub3RoZXIgdG91Y2hzdGFydCBoYXBwZW5zLCB3ZSBrbm93IGl0J3MgYm9ndXMsIHNvIGNhbmNlbCB0aGUgZHJhZy4KCQkJCS8vIHRvdWNoZW5kIHdpbGwgY29udGludWUgdG8gYmUgYnJva2VuIHVudGlsIHVzZXIgZG9lcyBhIHNob3J0dGFwL3Njcm9sbCwgYnV0IHRoaXMgaXMgYmVzdCB3ZSBjYW4gZG8uCgkJCQl0b3VjaHN0YXJ0OiBmdW5jdGlvbihldikgewoJCQkJCWlmICh0b3VjaFN0YXJ0SWdub3JlcykgeyAvLyBiaW5kSGFuZGxlcnMgaXMgY2FsbGVkIGZyb20gd2l0aGluIGEgdG91Y2hzdGFydCwKCQkJCQkJdG91Y2hTdGFydElnbm9yZXMtLTsgLy8gYW5kIHdlIGRvbid0IHdhbnQgdGhpcyB0byBmaXJlIGltbWVkaWF0ZWx5LCBzbyBpZ25vcmUuCgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlfdGhpcy5lbmRJbnRlcmFjdGlvbihldiwgdHJ1ZSk7IC8vIGlzQ2FuY2VsbGVkPXRydWUKCQkJCQl9CgkJCQl9CgkJCX0pOwoKCQkJLy8gbGlzdGVuIHRvIEFMTCBzY3JvbGwgYWN0aW9ucyBvbiB0aGUgcGFnZQoJCQlpZiAoCgkJCQkhYmluZEFueVNjcm9sbCh0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsUHJveHkpICYmIC8vIGhvcGVmdWxseSB0aGlzIHdvcmtzIGFuZCBzaG9ydC1jaXJjdWl0cyB0aGUgcmVzdAoJCQkJdGhpcy5zY3JvbGxFbCAvLyBvdGhlcndpc2UsIGF0dGFjaCBhIHNpbmdsZSBoYW5kbGVyIHRvIHRoaXMKCQkJKSB7CgkJCQl0aGlzLmxpc3RlblRvKHRoaXMuc2Nyb2xsRWwsICdzY3JvbGwnLCB0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJdGhpcy5saXN0ZW5UbygkKGRvY3VtZW50KSwgewoJCQkJbW91c2Vtb3ZlOiB0aGlzLmhhbmRsZU1vdXNlTW92ZSwKCQkJCW1vdXNldXA6IHRoaXMuZW5kSW50ZXJhY3Rpb24KCQkJfSk7CgkJfQoKCQl0aGlzLmxpc3RlblRvKCQoZG9jdW1lbnQpLCB7CgkJCXNlbGVjdHN0YXJ0OiBwcmV2ZW50RGVmYXVsdCwgLy8gZG9uJ3QgYWxsb3cgc2VsZWN0aW9uIHdoaWxlIGRyYWdnaW5nCgkJCWNvbnRleHRtZW51OiBwcmV2ZW50RGVmYXVsdCAvLyBsb25nIHRhcHMgd291bGQgb3BlbiBtZW51IG9uIENocm9tZSBkZXYgdG9vbHMKCQl9KTsKCX0sCgoKCXVuYmluZEhhbmRsZXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnN0b3BMaXN0ZW5pbmdUbygkKGRvY3VtZW50KSk7CgoJCS8vIHVuYmluZCBzY3JvbGwgbGlzdGVuaW5nCgkJdW5iaW5kQW55U2Nyb2xsKHRoaXMuaGFuZGxlVG91Y2hTY3JvbGxQcm94eSk7CgkJaWYgKHRoaXMuc2Nyb2xsRWwpIHsKCQkJdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCwgJ3Njcm9sbCcpOwoJCX0KCX0sCgoKCS8vIERyYWcgKGhpZ2gtbGV2ZWwpCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgkvLyBleHRyYU9wdGlvbnMgaWdub3JlZCBpZiBkcmFnIGFscmVhZHkgc3RhcnRlZAoJc3RhcnREcmFnOiBmdW5jdGlvbihldiwgZXh0cmFPcHRpb25zKSB7CgkJdGhpcy5zdGFydEludGVyYWN0aW9uKGV2LCBleHRyYU9wdGlvbnMpOyAvLyBlbnN1cmUgaW50ZXJhY3Rpb24gYmVnYW4KCgkJaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHsKCQkJdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTsKCQkJdGhpcy5oYW5kbGVEcmFnU3RhcnQoZXYpOwoJCX0KCX0sCgoKCWhhbmRsZURyYWdTdGFydDogZnVuY3Rpb24oZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2RyYWdTdGFydCcsIGV2KTsKCX0sCgoKCWhhbmRsZU1vdmU6IGZ1bmN0aW9uKGV2KSB7CgkJdmFyIGR4ID0gZ2V0RXZYKGV2KSAtIHRoaXMub3JpZ2luWDsKCQl2YXIgZHkgPSBnZXRFdlkoZXYpIC0gdGhpcy5vcmlnaW5ZOwoJCXZhciBtaW5EaXN0YW5jZSA9IHRoaXMubWluRGlzdGFuY2U7CgkJdmFyIGRpc3RhbmNlU3E7IC8vIGN1cnJlbnQgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLCBzcXVhcmVkCgoJCWlmICghdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkKSB7CgkJCWRpc3RhbmNlU3EgPSBkeCAqIGR4ICsgZHkgKiBkeTsKCQkJaWYgKGRpc3RhbmNlU3EgPj0gbWluRGlzdGFuY2UgKiBtaW5EaXN0YW5jZSkgeyAvLyB1c2UgcHl0aGFnb3JlYW4gdGhlb3JlbQoJCQkJdGhpcy5oYW5kbGVEaXN0YW5jZVN1cnBhc3NlZChldik7CgkJCX0KCQl9CgoJCWlmICh0aGlzLmlzRHJhZ2dpbmcpIHsKCQkJdGhpcy5oYW5kbGVEcmFnKGR4LCBkeSwgZXYpOwoJCX0KCX0sCgoKCS8vIENhbGxlZCB3aGlsZSB0aGUgbW91c2UgaXMgYmVpbmcgbW92ZWQgYW5kIHdoZW4gd2Uga25vdyBhIGxlZ2l0aW1hdGUgZHJhZyBpcyB0YWtpbmcgcGxhY2UKCWhhbmRsZURyYWc6IGZ1bmN0aW9uKGR4LCBkeSwgZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2RyYWcnLCBkeCwgZHksIGV2KTsKCQl0aGlzLnVwZGF0ZUF1dG9TY3JvbGwoZXYpOyAvLyB3aWxsIHBvc3NpYmx5IGNhdXNlIHNjcm9sbGluZwoJfSwKCgoJZW5kRHJhZzogZnVuY3Rpb24oZXYpIHsKCQlpZiAodGhpcy5pc0RyYWdnaW5nKSB7CgkJCXRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlOwoJCQl0aGlzLmhhbmRsZURyYWdFbmQoZXYpOwoJCX0KCX0sCgoKCWhhbmRsZURyYWdFbmQ6IGZ1bmN0aW9uKGV2KSB7CgkJdGhpcy50cmlnZ2VyKCdkcmFnRW5kJywgZXYpOwoJfSwKCgoJLy8gRGVsYXkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCXN0YXJ0RGVsYXk6IGZ1bmN0aW9uKGluaXRpYWxFdikgewoJCXZhciBfdGhpcyA9IHRoaXM7CgoJCWlmICh0aGlzLmRlbGF5KSB7CgkJCXRoaXMuZGVsYXlUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJX3RoaXMuaGFuZGxlRGVsYXlFbmQoaW5pdGlhbEV2KTsKCQkJfSwgdGhpcy5kZWxheSk7CgkJfQoJCWVsc2UgewoJCQl0aGlzLmhhbmRsZURlbGF5RW5kKGluaXRpYWxFdik7CgkJfQoJfSwKCgoJaGFuZGxlRGVsYXlFbmQ6IGZ1bmN0aW9uKGluaXRpYWxFdikgewoJCXRoaXMuaXNEZWxheUVuZGVkID0gdHJ1ZTsKCgkJaWYgKHRoaXMuaXNEaXN0YW5jZVN1cnBhc3NlZCkgewoJCQl0aGlzLnN0YXJ0RHJhZyhpbml0aWFsRXYpOwoJCX0KCX0sCgoKCS8vIERpc3RhbmNlCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgloYW5kbGVEaXN0YW5jZVN1cnBhc3NlZDogZnVuY3Rpb24oZXYpIHsKCQl0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQgPSB0cnVlOwoKCQlpZiAodGhpcy5pc0RlbGF5RW5kZWQpIHsKCQkJdGhpcy5zdGFydERyYWcoZXYpOwoJCX0KCX0sCgoKCS8vIE1vdXNlIC8gVG91Y2gKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCWhhbmRsZVRvdWNoTW92ZTogZnVuY3Rpb24oZXYpIHsKCQkvLyBwcmV2ZW50IGluZXJ0aWEgYW5kIHRvdWNobW92ZS1zY3JvbGxpbmcgd2hpbGUgZHJhZ2dpbmcKCQlpZiAodGhpcy5pc0RyYWdnaW5nKSB7CgkJCWV2LnByZXZlbnREZWZhdWx0KCk7CgkJfQoKCQl0aGlzLmhhbmRsZU1vdmUoZXYpOwoJfSwKCgoJaGFuZGxlTW91c2VNb3ZlOiBmdW5jdGlvbihldikgewoJCXRoaXMuaGFuZGxlTW92ZShldik7Cgl9LAoKCgkvLyBTY3JvbGxpbmcgKHVucmVsYXRlZCB0byBhdXRvLXNjcm9sbCkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCWhhbmRsZVRvdWNoU2Nyb2xsOiBmdW5jdGlvbihldikgewoJCS8vIGlmIHRoZSBkcmFnIGlzIGJlaW5nIGluaXRpYXRlZCBieSB0b3VjaCwgYnV0IGEgc2Nyb2xsIGhhcHBlbnMgYmVmb3JlCgkJLy8gdGhlIGRyYWctaW5pdGlhdGluZyBkZWxheSBpcyBvdmVyLCBjYW5jZWwgdGhlIGRyYWcKCQlpZiAoIXRoaXMuaXNEcmFnZ2luZykgewoJCQl0aGlzLmVuZEludGVyYWN0aW9uKGV2LCB0cnVlKTsgLy8gaXNDYW5jZWxsZWQ9dHJ1ZQoJCX0KCX0sCgoKCS8vIFV0aWxzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgkvLyBUcmlnZ2VycyBhIGNhbGxiYWNrLiBDYWxscyBhIGZ1bmN0aW9uIGluIHRoZSBvcHRpb24gaGFzaCBvZiB0aGUgc2FtZSBuYW1lLgoJLy8gQXJndW1lbnRzIGJleW9uZCB0aGUgZmlyc3QgYG5hbWVgIGFyZSBmb3J3YXJkZWQgb24uCgl0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7CgkJaWYgKHRoaXMub3B0aW9uc1tuYW1lXSkgewoJCQl0aGlzLm9wdGlvbnNbbmFtZV0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJfQoJCS8vIG1ha2VzIF9tZXRob2RzIGNhbGxhYmxlIGJ5IGV2ZW50IG5hbWUuIFRPRE86IGtpbGwgdGhpcwoJCWlmICh0aGlzWydfJyArIG5hbWVdKSB7CgkJCXRoaXNbJ18nICsgbmFtZV0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJfQoJfQoKCn0pOwoKOzsKLyoKdGhpcy5zY3JvbGxFbCBpcyBzZXQgaW4gRHJhZ0xpc3RlbmVyCiovCkRyYWdMaXN0ZW5lci5taXhpbih7CgoJaXNBdXRvU2Nyb2xsOiBmYWxzZSwKCglzY3JvbGxCb3VuZHM6IG51bGwsIC8vIHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0KCXNjcm9sbFRvcFZlbDogbnVsbCwgLy8gcGl4ZWxzIHBlciBzZWNvbmQKCXNjcm9sbExlZnRWZWw6IG51bGwsIC8vIHBpeGVscyBwZXIgc2Vjb25kCglzY3JvbGxJbnRlcnZhbElkOiBudWxsLCAvLyBJRCBvZiBzZXRUaW1lb3V0IGZvciBzY3JvbGxpbmcgYW5pbWF0aW9uIGxvb3AKCgkvLyBkZWZhdWx0cwoJc2Nyb2xsU2Vuc2l0aXZpdHk6IDMwLCAvLyBwaXhlbHMgZnJvbSBlZGdlIGZvciBzY3JvbGxpbmcgdG8gc3RhcnQKCXNjcm9sbFNwZWVkOiAyMDAsIC8vIHBpeGVscyBwZXIgc2Vjb25kLCBhdCBtYXhpbXVtIHNwZWVkCglzY3JvbGxJbnRlcnZhbE1zOiA1MCwgLy8gbWlsbGlzZWNvbmQgd2FpdCBiZXR3ZWVuIHNjcm9sbCBpbmNyZW1lbnQKCgoJaW5pdEF1dG9TY3JvbGw6IGZ1bmN0aW9uKCkgewoJCXZhciBzY3JvbGxFbCA9IHRoaXMuc2Nyb2xsRWw7CgoJCXRoaXMuaXNBdXRvU2Nyb2xsID0KCQkJdGhpcy5vcHRpb25zLnNjcm9sbCAmJgoJCQlzY3JvbGxFbCAmJgoJCQkhc2Nyb2xsRWwuaXMod2luZG93KSAmJgoJCQkhc2Nyb2xsRWwuaXMoZG9jdW1lbnQpOwoKCQlpZiAodGhpcy5pc0F1dG9TY3JvbGwpIHsKCQkJLy8gZGVib3VuY2UgbWFrZXMgc3VyZSByYXBpZCBjYWxscyBkb24ndCBoYXBwZW4KCQkJdGhpcy5saXN0ZW5UbyhzY3JvbGxFbCwgJ3Njcm9sbCcsIGRlYm91bmNlKHRoaXMuaGFuZGxlRGVib3VuY2VkU2Nyb2xsLCAxMDApKTsKCQl9Cgl9LAoKCglkZXN0cm95QXV0b1Njcm9sbDogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbmRBdXRvU2Nyb2xsKCk7IC8vIGtpbGwgYW55IGFuaW1hdGlvbiBsb29wCgoJCS8vIHJlbW92ZSB0aGUgc2Nyb2xsIGhhbmRsZXIgaWYgdGhlcmUgaXMgYSBzY3JvbGxFbAoJCWlmICh0aGlzLmlzQXV0b1Njcm9sbCkgewoJCQl0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0aGlzLnNjcm9sbEVsLCAnc2Nyb2xsJyk7IC8vIHdpbGwgcHJvYmFibHkgZ2V0IHJlbW92ZWQgYnkgdW5iaW5kSGFuZGxlcnMgdG9vIDooCgkJfQoJfSwKCgoJLy8gQ29tcHV0ZXMgYW5kIHN0b3JlcyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHNjcm9sbEVsCgljb21wdXRlU2Nyb2xsQm91bmRzOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5pc0F1dG9TY3JvbGwpIHsKCQkJdGhpcy5zY3JvbGxCb3VuZHMgPSBnZXRPdXRlclJlY3QodGhpcy5zY3JvbGxFbCk7CgkJCS8vIFRPRE86IHVzZSBnZXRDbGllbnRSZWN0IGluIGZ1dHVyZS4gYnV0IHByZXZlbnRzIGF1dG8gc2Nyb2xsaW5nIHdoZW4gb24gdG9wIG9mIHNjcm9sbGJhcnMKCQl9Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiB0aGUgZHJhZ2dpbmcgaXMgaW4gcHJvZ3Jlc3MgYW5kIHNjcm9sbGluZyBzaG91bGQgYmUgdXBkYXRlZAoJdXBkYXRlQXV0b1Njcm9sbDogZnVuY3Rpb24oZXYpIHsKCQl2YXIgc2Vuc2l0aXZpdHkgPSB0aGlzLnNjcm9sbFNlbnNpdGl2aXR5OwoJCXZhciBib3VuZHMgPSB0aGlzLnNjcm9sbEJvdW5kczsKCQl2YXIgdG9wQ2xvc2VuZXNzLCBib3R0b21DbG9zZW5lc3M7CgkJdmFyIGxlZnRDbG9zZW5lc3MsIHJpZ2h0Q2xvc2VuZXNzOwoJCXZhciB0b3BWZWwgPSAwOwoJCXZhciBsZWZ0VmVsID0gMDsKCgkJaWYgKGJvdW5kcykgeyAvLyBvbmx5IHNjcm9sbCBpZiBzY3JvbGxFbCBleGlzdHMKCgkJCS8vIGNvbXB1dGUgY2xvc2VuZXNzIHRvIGVkZ2VzLiB2YWxpZCByYW5nZSBpcyBmcm9tIDAuMCAtIDEuMAoJCQl0b3BDbG9zZW5lc3MgPSAoc2Vuc2l0aXZpdHkgLSAoZ2V0RXZZKGV2KSAtIGJvdW5kcy50b3ApKSAvIHNlbnNpdGl2aXR5OwoJCQlib3R0b21DbG9zZW5lc3MgPSAoc2Vuc2l0aXZpdHkgLSAoYm91bmRzLmJvdHRvbSAtIGdldEV2WShldikpKSAvIHNlbnNpdGl2aXR5OwoJCQlsZWZ0Q2xvc2VuZXNzID0gKHNlbnNpdGl2aXR5IC0gKGdldEV2WChldikgLSBib3VuZHMubGVmdCkpIC8gc2Vuc2l0aXZpdHk7CgkJCXJpZ2h0Q2xvc2VuZXNzID0gKHNlbnNpdGl2aXR5IC0gKGJvdW5kcy5yaWdodCAtIGdldEV2WChldikpKSAvIHNlbnNpdGl2aXR5OwoKCQkJLy8gdHJhbnNsYXRlIHZlcnRpY2FsIGNsb3NlbmVzcyBpbnRvIHZlbG9jaXR5LgoJCQkvLyBtb3VzZSBtdXN0IGJlIGNvbXBsZXRlbHkgaW4gYm91bmRzIGZvciB2ZWxvY2l0eSB0byBoYXBwZW4uCgkJCWlmICh0b3BDbG9zZW5lc3MgPj0gMCAmJiB0b3BDbG9zZW5lc3MgPD0gMSkgewoJCQkJdG9wVmVsID0gdG9wQ2xvc2VuZXNzICogdGhpcy5zY3JvbGxTcGVlZCAqIC0xOyAvLyBuZWdhdGl2ZS4gZm9yIHNjcm9sbGluZyB1cAoJCQl9CgkJCWVsc2UgaWYgKGJvdHRvbUNsb3NlbmVzcyA+PSAwICYmIGJvdHRvbUNsb3NlbmVzcyA8PSAxKSB7CgkJCQl0b3BWZWwgPSBib3R0b21DbG9zZW5lc3MgKiB0aGlzLnNjcm9sbFNwZWVkOwoJCQl9CgoJCQkvLyB0cmFuc2xhdGUgaG9yaXpvbnRhbCBjbG9zZW5lc3MgaW50byB2ZWxvY2l0eQoJCQlpZiAobGVmdENsb3NlbmVzcyA+PSAwICYmIGxlZnRDbG9zZW5lc3MgPD0gMSkgewoJCQkJbGVmdFZlbCA9IGxlZnRDbG9zZW5lc3MgKiB0aGlzLnNjcm9sbFNwZWVkICogLTE7IC8vIG5lZ2F0aXZlLiBmb3Igc2Nyb2xsaW5nIGxlZnQKCQkJfQoJCQllbHNlIGlmIChyaWdodENsb3NlbmVzcyA+PSAwICYmIHJpZ2h0Q2xvc2VuZXNzIDw9IDEpIHsKCQkJCWxlZnRWZWwgPSByaWdodENsb3NlbmVzcyAqIHRoaXMuc2Nyb2xsU3BlZWQ7CgkJCX0KCQl9CgoJCXRoaXMuc2V0U2Nyb2xsVmVsKHRvcFZlbCwgbGVmdFZlbCk7Cgl9LAoKCgkvLyBTZXRzIHRoZSBzcGVlZC1vZi1zY3JvbGxpbmcgZm9yIHRoZSBzY3JvbGxFbAoJc2V0U2Nyb2xsVmVsOiBmdW5jdGlvbih0b3BWZWwsIGxlZnRWZWwpIHsKCgkJdGhpcy5zY3JvbGxUb3BWZWwgPSB0b3BWZWw7CgkJdGhpcy5zY3JvbGxMZWZ0VmVsID0gbGVmdFZlbDsKCgkJdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKTsgLy8gbWFzc2FnZXMgaW50byByZWFsaXN0aWMgdmFsdWVzCgoJCS8vIGlmIHRoZXJlIGlzIG5vbi16ZXJvIHZlbG9jaXR5LCBhbmQgYW4gYW5pbWF0aW9uIGxvb3AgaGFzbid0IGFscmVhZHkgc3RhcnRlZCwgdGhlbiBTVEFSVAoJCWlmICgodGhpcy5zY3JvbGxUb3BWZWwgfHwgdGhpcy5zY3JvbGxMZWZ0VmVsKSAmJiAhdGhpcy5zY3JvbGxJbnRlcnZhbElkKSB7CgkJCXRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKAoJCQkJcHJveHkodGhpcywgJ3Njcm9sbEludGVydmFsRnVuYycpLCAvLyBzY29wZSB0byBgdGhpc2AKCQkJCXRoaXMuc2Nyb2xsSW50ZXJ2YWxNcwoJCQkpOwoJCX0KCX0sCgoKCS8vIEZvcmNlcyBzY3JvbGxUb3BWZWwgYW5kIHNjcm9sbExlZnRWZWwgdG8gYmUgemVybyBpZiBzY3JvbGxpbmcgaGFzIGFscmVhZHkgZ29uZSBhbGwgdGhlIHdheQoJY29uc3RyYWluU2Nyb2xsVmVsOiBmdW5jdGlvbigpIHsKCQl2YXIgZWwgPSB0aGlzLnNjcm9sbEVsOwoKCQlpZiAodGhpcy5zY3JvbGxUb3BWZWwgPCAwKSB7IC8vIHNjcm9sbGluZyB1cD8KCQkJaWYgKGVsLnNjcm9sbFRvcCgpIDw9IDApIHsgLy8gYWxyZWFkeSBzY3JvbGxlZCBhbGwgdGhlIHdheSB1cD8KCQkJCXRoaXMuc2Nyb2xsVG9wVmVsID0gMDsKCQkJfQoJCX0KCQllbHNlIGlmICh0aGlzLnNjcm9sbFRvcFZlbCA+IDApIHsgLy8gc2Nyb2xsaW5nIGRvd24/CgkJCWlmIChlbC5zY3JvbGxUb3AoKSArIGVsWzBdLmNsaWVudEhlaWdodCA+PSBlbFswXS5zY3JvbGxIZWlnaHQpIHsgLy8gYWxyZWFkeSBzY3JvbGxlZCBhbGwgdGhlIHdheSBkb3duPwoJCQkJdGhpcy5zY3JvbGxUb3BWZWwgPSAwOwoJCQl9CgkJfQoKCQlpZiAodGhpcy5zY3JvbGxMZWZ0VmVsIDwgMCkgeyAvLyBzY3JvbGxpbmcgbGVmdD8KCQkJaWYgKGVsLnNjcm9sbExlZnQoKSA8PSAwKSB7IC8vIGFscmVhZHkgc2Nyb2xsZWQgYWxsIHRoZSBsZWZ0PwoJCQkJdGhpcy5zY3JvbGxMZWZ0VmVsID0gMDsKCQkJfQoJCX0KCQllbHNlIGlmICh0aGlzLnNjcm9sbExlZnRWZWwgPiAwKSB7IC8vIHNjcm9sbGluZyByaWdodD8KCQkJaWYgKGVsLnNjcm9sbExlZnQoKSArIGVsWzBdLmNsaWVudFdpZHRoID49IGVsWzBdLnNjcm9sbFdpZHRoKSB7IC8vIGFscmVhZHkgc2Nyb2xsZWQgYWxsIHRoZSB3YXkgcmlnaHQ/CgkJCQl0aGlzLnNjcm9sbExlZnRWZWwgPSAwOwoJCQl9CgkJfQoJfSwKCgoJLy8gVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBkdXJpbmcgZXZlcnkgaXRlcmF0aW9uIG9mIHRoZSBzY3JvbGxpbmcgYW5pbWF0aW9uIGxvb3AKCXNjcm9sbEludGVydmFsRnVuYzogZnVuY3Rpb24oKSB7CgkJdmFyIGVsID0gdGhpcy5zY3JvbGxFbDsKCQl2YXIgZnJhYyA9IHRoaXMuc2Nyb2xsSW50ZXJ2YWxNcyAvIDEwMDA7IC8vIGNvbnNpZGVyaW5nIGFuaW1hdGlvbiBmcmVxdWVuY3ksIHdoYXQgdGhlIHZlbCBzaG91bGQgYmUgbXVsdCdkIGJ5CgoJCS8vIGNoYW5nZSB0aGUgdmFsdWUgb2Ygc2Nyb2xsRWwncyBzY3JvbGwKCQlpZiAodGhpcy5zY3JvbGxUb3BWZWwpIHsKCQkJZWwuc2Nyb2xsVG9wKGVsLnNjcm9sbFRvcCgpICsgdGhpcy5zY3JvbGxUb3BWZWwgKiBmcmFjKTsKCQl9CgkJaWYgKHRoaXMuc2Nyb2xsTGVmdFZlbCkgewoJCQllbC5zY3JvbGxMZWZ0KGVsLnNjcm9sbExlZnQoKSArIHRoaXMuc2Nyb2xsTGVmdFZlbCAqIGZyYWMpOwoJCX0KCgkJdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKTsgLy8gc2luY2UgdGhlIHNjcm9sbCB2YWx1ZXMgY2hhbmdlZCwgcmVjb21wdXRlIHRoZSB2ZWxvY2l0aWVzCgoJCS8vIGlmIHNjcm9sbGVkIGFsbCB0aGUgd2F5LCB3aGljaCBjYXVzZXMgdGhlIHZlbHMgdG8gYmUgemVybywgc3RvcCB0aGUgYW5pbWF0aW9uIGxvb3AKCQlpZiAoIXRoaXMuc2Nyb2xsVG9wVmVsICYmICF0aGlzLnNjcm9sbExlZnRWZWwpIHsKCQkJdGhpcy5lbmRBdXRvU2Nyb2xsKCk7CgkJfQoJfSwKCgoJLy8gS2lsbHMgYW55IGV4aXN0aW5nIHNjcm9sbGluZyBhbmltYXRpb24gbG9vcAoJZW5kQXV0b1Njcm9sbDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCkgewoJCQljbGVhckludGVydmFsKHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCk7CgkJCXRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCA9IG51bGw7CgoJCQl0aGlzLmhhbmRsZVNjcm9sbEVuZCgpOwoJCX0KCX0sCgoKCS8vIEdldCBjYWxsZWQgd2hlbiB0aGUgc2Nyb2xsRWwgaXMgc2Nyb2xsZWQgKE5PVEU6IHRoaXMgaXMgZGVsYXllZCB2aWEgZGVib3VuY2UpCgloYW5kbGVEZWJvdW5jZWRTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCS8vIHJlY29tcHV0ZSBhbGwgY29vcmRpbmF0ZXMsIGJ1dCAqb25seSogaWYgdGhpcyBpcyAqbm90KiBwYXJ0IG9mIG91ciBzY3JvbGxpbmcgYW5pbWF0aW9uCgkJaWYgKCF0aGlzLnNjcm9sbEludGVydmFsSWQpIHsKCQkJdGhpcy5oYW5kbGVTY3JvbGxFbmQoKTsKCQl9Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiBzY3JvbGxpbmcgaGFzIHN0b3BwZWQsIHdoZXRoZXIgdGhyb3VnaCBhdXRvIHNjcm9sbCwgb3IgdGhlIHVzZXIgc2Nyb2xsaW5nCgloYW5kbGVTY3JvbGxFbmQ6IGZ1bmN0aW9uKCkgewoJfQoKfSk7Cjs7CgovKiBUcmFja3MgbW91c2UgbW92ZW1lbnRzIG92ZXIgYSBjb21wb25lbnQgYW5kIHJhaXNlcyBldmVudHMgYWJvdXQgd2hpY2ggaGl0IHRoZSBtb3VzZSBpcyBvdmVyLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kb3B0aW9uczoKLSBzdWJqZWN0RWwKLSBzdWJqZWN0Q2VudGVyCiovCgp2YXIgSGl0RHJhZ0xpc3RlbmVyID0gRHJhZ0xpc3RlbmVyLmV4dGVuZCh7CgoJY29tcG9uZW50OiBudWxsLCAvLyBjb252ZXJ0cyBjb29yZGluYXRlcyB0byBoaXRzCgkJLy8gbWV0aG9kczogcHJlcGFyZUhpdHMsIHJlbGVhc2VIaXRzLCBxdWVyeUhpdAoKCW9yaWdIaXQ6IG51bGwsIC8vIHRoZSBoaXQgdGhlIG1vdXNlIHdhcyBvdmVyIHdoZW4gbGlzdGVuaW5nIHN0YXJ0ZWQKCWhpdDogbnVsbCwgLy8gdGhlIGhpdCB0aGUgbW91c2UgaXMgb3ZlcgoJY29vcmRBZGp1c3Q6IG51bGwsIC8vIGRlbHRhIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgbW91c2UgY29vcmRpbmF0ZXMgd2hlbiBjb21wdXRpbmcgY29sbGlzaW9ucwoKCgljb25zdHJ1Y3RvcjogZnVuY3Rpb24oY29tcG9uZW50LCBvcHRpb25zKSB7CgkJRHJhZ0xpc3RlbmVyLmNhbGwodGhpcywgb3B0aW9ucyk7IC8vIGNhbGwgdGhlIHN1cGVyLWNvbnN0cnVjdG9yCgoJCXRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gZHJhZyBsaXN0ZW5pbmcgc3RhcnRzIChidXQgYSByZWFsIGRyYWcgaGFzIG5vdCBuZWNlc3NhcmlseSBiZWdhbikuCgkvLyBldiBtaWdodCBiZSB1bmRlZmluZWQgaWYgZHJhZ2dpbmcgd2FzIHN0YXJ0ZWQgbWFudWFsbHkuCgloYW5kbGVJbnRlcmFjdGlvblN0YXJ0OiBmdW5jdGlvbihldikgewoJCXZhciBzdWJqZWN0RWwgPSB0aGlzLnN1YmplY3RFbDsKCQl2YXIgc3ViamVjdFJlY3Q7CgkJdmFyIG9yaWdQb2ludDsKCQl2YXIgcG9pbnQ7CgoJCXRoaXMuY29tcHV0ZUNvb3JkcygpOwoKCQlpZiAoZXYpIHsKCQkJb3JpZ1BvaW50ID0geyBsZWZ0OiBnZXRFdlgoZXYpLCB0b3A6IGdldEV2WShldikgfTsKCQkJcG9pbnQgPSBvcmlnUG9pbnQ7CgoJCQkvLyBjb25zdHJhaW4gdGhlIHBvaW50IHRvIGJvdW5kcyBvZiB0aGUgZWxlbWVudCBiZWluZyBkcmFnZ2VkCgkJCWlmIChzdWJqZWN0RWwpIHsKCQkJCXN1YmplY3RSZWN0ID0gZ2V0T3V0ZXJSZWN0KHN1YmplY3RFbCk7IC8vIHVzZWQgZm9yIGNlbnRlcmluZyBhcyB3ZWxsCgkJCQlwb2ludCA9IGNvbnN0cmFpblBvaW50KHBvaW50LCBzdWJqZWN0UmVjdCk7CgkJCX0KCgkJCXRoaXMub3JpZ0hpdCA9IHRoaXMucXVlcnlIaXQocG9pbnQubGVmdCwgcG9pbnQudG9wKTsKCgkJCS8vIHRyZWF0IHRoZSBjZW50ZXIgb2YgdGhlIHN1YmplY3QgYXMgdGhlIGNvbGxpc2lvbiBwb2ludD8KCQkJaWYgKHN1YmplY3RFbCAmJiB0aGlzLm9wdGlvbnMuc3ViamVjdENlbnRlcikgewoKCQkJCS8vIG9ubHkgY29uc2lkZXIgdGhlIGFyZWEgdGhlIHN1YmplY3Qgb3ZlcmxhcHMgdGhlIGhpdC4gYmVzdCBmb3IgbGFyZ2Ugc3ViamVjdHMuCgkJCQkvLyBUT0RPOiBza2lwIHRoaXMgaWYgaGl0IGRpZG4ndCBzdXBwbHkgbGVmdC9yaWdodC90b3AvYm90dG9tCgkJCQlpZiAodGhpcy5vcmlnSGl0KSB7CgkJCQkJc3ViamVjdFJlY3QgPSBpbnRlcnNlY3RSZWN0cyh0aGlzLm9yaWdIaXQsIHN1YmplY3RSZWN0KSB8fAoJCQkJCQlzdWJqZWN0UmVjdDsgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24KCQkJCX0KCgkJCQlwb2ludCA9IGdldFJlY3RDZW50ZXIoc3ViamVjdFJlY3QpOwoJCQl9CgoJCQl0aGlzLmNvb3JkQWRqdXN0ID0gZGlmZlBvaW50cyhwb2ludCwgb3JpZ1BvaW50KTsgLy8gcG9pbnQgLSBvcmlnUG9pbnQKCQl9CgkJZWxzZSB7CgkJCXRoaXMub3JpZ0hpdCA9IG51bGw7CgkJCXRoaXMuY29vcmRBZGp1c3QgPSBudWxsOwoJCX0KCgkJLy8gY2FsbCB0aGUgc3VwZXItbWV0aG9kLiBkbyBpdCBhZnRlciBvcmlnSGl0IGhhcyBiZWVuIGNvbXB1dGVkCgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvblN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cgl9LAoKCgkvLyBSZWNvbXB1dGVzIHRoZSBkcmFnLWNyaXRpY2FsIHBvc2l0aW9ucyBvZiBlbGVtZW50cwoJY29tcHV0ZUNvb3JkczogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb21wb25lbnQucHJlcGFyZUhpdHMoKTsKCQl0aGlzLmNvbXB1dGVTY3JvbGxCb3VuZHMoKTsgLy8gd2h5IGlzIHRoaXMgaGVyZT8/Pz8/PwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gdGhlIGFjdHVhbCBkcmFnIGhhcyBzdGFydGVkCgloYW5kbGVEcmFnU3RhcnQ6IGZ1bmN0aW9uKGV2KSB7CgkJdmFyIGhpdDsKCgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVEcmFnU3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gY2FsbCB0aGUgc3VwZXItbWV0aG9kCgoJCS8vIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHRoaXMub3JpZ0hpdCBpZiB0aGUgbWluLWRpc3RhbmNlIGlzIGxhcmdlCgkJaGl0ID0gdGhpcy5xdWVyeUhpdChnZXRFdlgoZXYpLCBnZXRFdlkoZXYpKTsKCgkJLy8gcmVwb3J0IHRoZSBpbml0aWFsIGhpdCB0aGUgbW91c2UgaXMgb3ZlcgoJCS8vIGVzcGVjaWFsbHkgaW1wb3J0YW50IGlmIG5vIG1pbi1kaXN0YW5jZSBhbmQgZHJhZyBzdGFydHMgaW1tZWRpYXRlbHkKCQlpZiAoaGl0KSB7CgkJCXRoaXMuaGFuZGxlSGl0T3ZlcihoaXQpOwoJCX0KCX0sCgoKCS8vIENhbGxlZCB3aGVuIHRoZSBkcmFnIG1vdmVzCgloYW5kbGVEcmFnOiBmdW5jdGlvbihkeCwgZHksIGV2KSB7CgkJdmFyIGhpdDsKCgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVEcmFnLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoKCQloaXQgPSB0aGlzLnF1ZXJ5SGl0KGdldEV2WChldiksIGdldEV2WShldikpOwoKCQlpZiAoIWlzSGl0c0VxdWFsKGhpdCwgdGhpcy5oaXQpKSB7IC8vIGEgZGlmZmVyZW50IGhpdCB0aGFuIGJlZm9yZT8KCQkJaWYgKHRoaXMuaGl0KSB7CgkJCQl0aGlzLmhhbmRsZUhpdE91dCgpOwoJCQl9CgkJCWlmIChoaXQpIHsKCQkJCXRoaXMuaGFuZGxlSGl0T3ZlcihoaXQpOwoJCQl9CgkJfQoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gZHJhZ2dpbmcgaGFzIGJlZW4gc3RvcHBlZAoJaGFuZGxlRHJhZ0VuZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5oYW5kbGVIaXREb25lKCk7CgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVEcmFnRW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gYSB0aGUgbW91c2UgaGFzIGp1c3QgbW92ZWQgb3ZlciBhIG5ldyBoaXQKCWhhbmRsZUhpdE92ZXI6IGZ1bmN0aW9uKGhpdCkgewoJCXZhciBpc09yaWcgPSBpc0hpdHNFcXVhbChoaXQsIHRoaXMub3JpZ0hpdCk7CgoJCXRoaXMuaGl0ID0gaGl0OwoKCQl0aGlzLnRyaWdnZXIoJ2hpdE92ZXInLCB0aGlzLmhpdCwgaXNPcmlnLCB0aGlzLm9yaWdIaXQpOwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gdGhlIG1vdXNlIGhhcyBqdXN0IG1vdmVkIG91dCBvZiBhIGhpdAoJaGFuZGxlSGl0T3V0OiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5oaXQpIHsKCQkJdGhpcy50cmlnZ2VyKCdoaXRPdXQnLCB0aGlzLmhpdCk7CgkJCXRoaXMuaGFuZGxlSGl0RG9uZSgpOwoJCQl0aGlzLmhpdCA9IG51bGw7CgkJfQoJfSwKCgoJLy8gQ2FsbGVkIGFmdGVyIGEgaGl0T3V0LiBBbHNvIGNhbGxlZCBiZWZvcmUgYSBkcmFnU3RvcAoJaGFuZGxlSGl0RG9uZTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGl0KSB7CgkJCXRoaXMudHJpZ2dlcignaGl0RG9uZScsIHRoaXMuaGl0KTsKCQl9Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gZW5kcywgd2hldGhlciB0aGVyZSB3YXMgYSByZWFsIGRyYWcgb3Igbm90CgloYW5kbGVJbnRlcmFjdGlvbkVuZDogZnVuY3Rpb24oKSB7CgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvbkVuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBjYWxsIHRoZSBzdXBlci1tZXRob2QKCgkJdGhpcy5vcmlnSGl0ID0gbnVsbDsKCQl0aGlzLmhpdCA9IG51bGw7CgoJCXRoaXMuY29tcG9uZW50LnJlbGVhc2VIaXRzKCk7Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiBzY3JvbGxpbmcgaGFzIHN0b3BwZWQsIHdoZXRoZXIgdGhyb3VnaCBhdXRvIHNjcm9sbCwgb3IgdGhlIHVzZXIgc2Nyb2xsaW5nCgloYW5kbGVTY3JvbGxFbmQ6IGZ1bmN0aW9uKCkgewoJCURyYWdMaXN0ZW5lci5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsRW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoKCQl0aGlzLmNvbXB1dGVDb29yZHMoKTsgLy8gaGl0cycgYWJzb2x1dGUgcG9zaXRpb25zIHdpbGwgYmUgaW4gbmV3IHBsYWNlcy4gcmVjb21wdXRlCgl9LAoKCgkvLyBHZXRzIHRoZSBoaXQgdW5kZXJuZWF0aCB0aGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBnaXZlbiBtb3VzZSBldmVudAoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnQsIHRvcCkgewoKCQlpZiAodGhpcy5jb29yZEFkanVzdCkgewoJCQlsZWZ0ICs9IHRoaXMuY29vcmRBZGp1c3QubGVmdDsKCQkJdG9wICs9IHRoaXMuY29vcmRBZGp1c3QudG9wOwoJCX0KCgkJcmV0dXJuIHRoaXMuY29tcG9uZW50LnF1ZXJ5SGl0KGxlZnQsIHRvcCk7Cgl9Cgp9KTsKCgovLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgaGl0cyBhcmUgaWRlbnRpY2FsbHkgZXF1YWwuIGBmYWxzZWAgb3RoZXJ3aXNlLiBNdXN0IGJlIGZyb20gdGhlIHNhbWUgY29tcG9uZW50LgovLyBUd28gbnVsbCB2YWx1ZXMgd2lsbCBiZSBjb25zaWRlcmVkIGVxdWFsLCBhcyB0d28gIm91dCBvZiB0aGUgY29tcG9uZW50IiBzdGF0ZXMgYXJlIHRoZSBzYW1lLgpmdW5jdGlvbiBpc0hpdHNFcXVhbChoaXQwLCBoaXQxKSB7CgoJaWYgKCFoaXQwICYmICFoaXQxKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJaWYgKGhpdDAgJiYgaGl0MSkgewoJCXJldHVybiBoaXQwLmNvbXBvbmVudCA9PT0gaGl0MS5jb21wb25lbnQgJiYKCQkJaXNIaXRQcm9wc1dpdGhpbihoaXQwLCBoaXQxKSAmJgoJCQlpc0hpdFByb3BzV2l0aGluKGhpdDEsIGhpdDApOyAvLyBlbnN1cmVzIGFsbCBwcm9wcyBhcmUgaWRlbnRpY2FsCgl9CgoJcmV0dXJuIGZhbHNlOwp9CgoKLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBvZiBzdWJIaXQncyBub24tc3RhbmRhcmQgcHJvcGVydGllcyBhcmUgd2l0aGluIHN1cGVySGl0CmZ1bmN0aW9uIGlzSGl0UHJvcHNXaXRoaW4oc3ViSGl0LCBzdXBlckhpdCkgewoJZm9yICh2YXIgcHJvcE5hbWUgaW4gc3ViSGl0KSB7CgkJaWYgKCEvXihjb21wb25lbnR8bGVmdHxyaWdodHx0b3B8Ym90dG9tKSQvLnRlc3QocHJvcE5hbWUpKSB7CgkJCWlmIChzdWJIaXRbcHJvcE5hbWVdICE9PSBzdXBlckhpdFtwcm9wTmFtZV0pIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCX0KCXJldHVybiB0cnVlOwp9Cgo7OwoKLyogQ3JlYXRlcyBhIGNsb25lIG9mIGFuIGVsZW1lbnQgYW5kIGxldHMgaXQgdHJhY2sgdGhlIG1vdXNlIGFzIGl0IG1vdmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdmFyIE1vdXNlRm9sbG93ZXIgPSBDbGFzcy5leHRlbmQoTGlzdGVuZXJNaXhpbiwgewoKCW9wdGlvbnM6IG51bGwsCgoJc291cmNlRWw6IG51bGwsIC8vIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBjbG9uZWQgYW5kIG1hZGUgdG8gbG9vayBsaWtlIGl0IGlzIGRyYWdnaW5nCgllbDogbnVsbCwgLy8gdGhlIGNsb25lIG9mIGBzb3VyY2VFbGAgdGhhdCB3aWxsIHRyYWNrIHRoZSBtb3VzZQoJcGFyZW50RWw6IG51bGwsIC8vIHRoZSBlbGVtZW50IHRoYXQgYGVsYCAodGhlIGNsb25lKSB3aWxsIGJlIGF0dGFjaGVkIHRvCgoJLy8gdGhlIGluaXRpYWwgcG9zaXRpb24gb2YgZWwsIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXQgcGFyZW50LiBtYWRlIHRvIG1hdGNoIHRoZSBpbml0aWFsIG9mZnNldCBvZiBzb3VyY2VFbAoJdG9wMDogbnVsbCwKCWxlZnQwOiBudWxsLAoKCS8vIHRoZSBhYnNvbHV0ZSBjb29yZGluYXRlcyBvZiB0aGUgaW5pdGlhdGluZyB0b3VjaC9tb3VzZSBhY3Rpb24KCXkwOiBudWxsLAoJeDA6IG51bGwsCgoJLy8gdGhlIG51bWJlciBvZiBwaXhlbHMgdGhlIG1vdXNlIGhhcyBtb3ZlZCBmcm9tIGl0cyBpbml0aWFsIHBvc2l0aW9uCgl0b3BEZWx0YTogbnVsbCwKCWxlZnREZWx0YTogbnVsbCwKCglpc0ZvbGxvd2luZzogZmFsc2UsCglpc0hpZGRlbjogZmFsc2UsCglpc0FuaW1hdGluZzogZmFsc2UsIC8vIGRvaW5nIHRoZSByZXZlcnQgYW5pbWF0aW9uPwoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihzb3VyY2VFbCwgb3B0aW9ucykgewoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCXRoaXMuc291cmNlRWwgPSBzb3VyY2VFbDsKCQl0aGlzLnBhcmVudEVsID0gb3B0aW9ucy5wYXJlbnRFbCA/ICQob3B0aW9ucy5wYXJlbnRFbCkgOiBzb3VyY2VFbC5wYXJlbnQoKTsgLy8gZGVmYXVsdCB0byBzb3VyY2VFbCdzIHBhcmVudAoJfSwKCgoJLy8gQ2F1c2VzIHRoZSBlbGVtZW50IHRvIHN0YXJ0IGZvbGxvd2luZyB0aGUgbW91c2UKCXN0YXJ0OiBmdW5jdGlvbihldikgewoJCWlmICghdGhpcy5pc0ZvbGxvd2luZykgewoJCQl0aGlzLmlzRm9sbG93aW5nID0gdHJ1ZTsKCgkJCXRoaXMueTAgPSBnZXRFdlkoZXYpOwoJCQl0aGlzLngwID0gZ2V0RXZYKGV2KTsKCQkJdGhpcy50b3BEZWx0YSA9IDA7CgkJCXRoaXMubGVmdERlbHRhID0gMDsKCgkJCWlmICghdGhpcy5pc0hpZGRlbikgewoJCQkJdGhpcy51cGRhdGVQb3NpdGlvbigpOwoJCQl9CgoJCQlpZiAoZ2V0RXZJc1RvdWNoKGV2KSkgewoJCQkJdGhpcy5saXN0ZW5UbygkKGRvY3VtZW50KSwgJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlTW92ZSk7CgkJCX0KCQkJZWxzZSB7CgkJCQl0aGlzLmxpc3RlblRvKCQoZG9jdW1lbnQpLCAnbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVNb3ZlKTsKCQkJfQoJCX0KCX0sCgoKCS8vIENhdXNlcyB0aGUgZWxlbWVudCB0byBzdG9wIGZvbGxvd2luZyB0aGUgbW91c2UuIElmIHNob3VsZFJldmVydCBpcyB0cnVlLCB3aWxsIGFuaW1hdGUgYmFjayB0byBvcmlnaW5hbCBwb3NpdGlvbi4KCS8vIGBjYWxsYmFja2AgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4gSWYgbm8gYW5pbWF0aW9uLCBpdCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5LgoJc3RvcDogZnVuY3Rpb24oc2hvdWxkUmV2ZXJ0LCBjYWxsYmFjaykgewoJCXZhciBfdGhpcyA9IHRoaXM7CgkJdmFyIHJldmVydER1cmF0aW9uID0gdGhpcy5vcHRpb25zLnJldmVydER1cmF0aW9uOwoKCQlmdW5jdGlvbiBjb21wbGV0ZSgpIHsgLy8gbWlnaHQgYmUgY2FsbGVkIGJ5IC5hbmltYXRlKCksIHdoaWNoIG1pZ2h0IGNoYW5nZSBgdGhpc2AgY29udGV4dAoJCQlfdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlOwoJCQlfdGhpcy5yZW1vdmVFbGVtZW50KCk7CgoJCQlfdGhpcy50b3AwID0gX3RoaXMubGVmdDAgPSBudWxsOyAvLyByZXNldCBzdGF0ZSBmb3IgZnV0dXJlIHVwZGF0ZVBvc2l0aW9uIGNhbGxzCgoJCQlpZiAoY2FsbGJhY2spIHsKCQkJCWNhbGxiYWNrKCk7CgkJCX0KCQl9CgoJCWlmICh0aGlzLmlzRm9sbG93aW5nICYmICF0aGlzLmlzQW5pbWF0aW5nKSB7IC8vIGRpc2FsbG93IG1vcmUgdGhhbiBvbmUgc3RvcCBhbmltYXRpb24gYXQgYSB0aW1lCgkJCXRoaXMuaXNGb2xsb3dpbmcgPSBmYWxzZTsKCgkJCXRoaXMuc3RvcExpc3RlbmluZ1RvKCQoZG9jdW1lbnQpKTsKCgkJCWlmIChzaG91bGRSZXZlcnQgJiYgcmV2ZXJ0RHVyYXRpb24gJiYgIXRoaXMuaXNIaWRkZW4pIHsgLy8gZG8gYSByZXZlcnQgYW5pbWF0aW9uPwoJCQkJdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7CgkJCQl0aGlzLmVsLmFuaW1hdGUoewoJCQkJCXRvcDogdGhpcy50b3AwLAoJCQkJCWxlZnQ6IHRoaXMubGVmdDAKCQkJCX0sIHsKCQkJCQlkdXJhdGlvbjogcmV2ZXJ0RHVyYXRpb24sCgkJCQkJY29tcGxldGU6IGNvbXBsZXRlCgkJCQl9KTsKCQkJfQoJCQllbHNlIHsKCQkJCWNvbXBsZXRlKCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBHZXRzIHRoZSB0cmFja2luZyBlbGVtZW50LiBDcmVhdGUgaXQgaWYgbmVjZXNzYXJ5CglnZXRFbDogZnVuY3Rpb24oKSB7CgkJdmFyIGVsID0gdGhpcy5lbDsKCgkJaWYgKCFlbCkgewoJCQllbCA9IHRoaXMuZWwgPSB0aGlzLnNvdXJjZUVsLmNsb25lKCkKCQkJCS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWRkaXRpb25hbENsYXNzIHx8ICcnKQoJCQkJLmNzcyh7CgkJCQkJcG9zaXRpb246ICdhYnNvbHV0ZScsCgkJCQkJdmlzaWJpbGl0eTogJycsIC8vIGluIGNhc2Ugb3JpZ2luYWwgZWxlbWVudCB3YXMgaGlkZGVuIChjb21tb25seSB0aHJvdWdoIGhpZGVFdmVudHMoKSkKCQkJCQlkaXNwbGF5OiB0aGlzLmlzSGlkZGVuID8gJ25vbmUnIDogJycsIC8vIGZvciB3aGVuIGluaXRpYWxseSBoaWRkZW4KCQkJCQltYXJnaW46IDAsCgkJCQkJcmlnaHQ6ICdhdXRvJywgLy8gZXJhc2UgYW5kIHNldCB3aWR0aCBpbnN0ZWFkCgkJCQkJYm90dG9tOiAnYXV0bycsIC8vIGVyYXNlIGFuZCBzZXQgaGVpZ2h0IGluc3RlYWQKCQkJCQl3aWR0aDogdGhpcy5zb3VyY2VFbC53aWR0aCgpLCAvLyBleHBsaWNpdCBoZWlnaHQgaW4gY2FzZSB0aGVyZSB3YXMgYSAncmlnaHQnIHZhbHVlCgkJCQkJaGVpZ2h0OiB0aGlzLnNvdXJjZUVsLmhlaWdodCgpLCAvLyBleHBsaWNpdCB3aWR0aCBpbiBjYXNlIHRoZXJlIHdhcyBhICdib3R0b20nIHZhbHVlCgkJCQkJb3BhY2l0eTogdGhpcy5vcHRpb25zLm9wYWNpdHkgfHwgJycsCgkJCQkJekluZGV4OiB0aGlzLm9wdGlvbnMuekluZGV4CgkJCQl9KTsKCgkJCS8vIHdlIGRvbid0IHdhbnQgbG9uZyB0YXBzIG9yIGFueSBtb3VzZSBpbnRlcmFjdGlvbiBjYXVzaW5nIHNlbGVjdGlvbi9tZW51cy4KCQkJLy8gd291bGQgdXNlIHByZXZlbnRTZWxlY3Rpb24oKSwgYnV0IHRoYXQgcHJldmVudHMgc2VsZWN0c3RhcnQsIGNhdXNpbmcgcHJvYmxlbXMuCgkJCWVsLmFkZENsYXNzKCdmYy11bnNlbGVjdGFibGUnKTsKCgkJCWVsLmFwcGVuZFRvKHRoaXMucGFyZW50RWwpOwoJCX0KCgkJcmV0dXJuIGVsOwoJfSwKCgoJLy8gUmVtb3ZlcyB0aGUgdHJhY2tpbmcgZWxlbWVudCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKCXJlbW92ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmVsKSB7CgkJCXRoaXMuZWwucmVtb3ZlKCk7CgkJCXRoaXMuZWwgPSBudWxsOwoJCX0KCX0sCgoKCS8vIFVwZGF0ZSB0aGUgQ1NTIHBvc2l0aW9uIG9mIHRoZSB0cmFja2luZyBlbGVtZW50Cgl1cGRhdGVQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIHNvdXJjZU9mZnNldDsKCQl2YXIgb3JpZ2luOwoKCQl0aGlzLmdldEVsKCk7IC8vIGVuc3VyZSB0aGlzLmVsCgoJCS8vIG1ha2Ugc3VyZSBvcmlnaW4gaW5mbyB3YXMgY29tcHV0ZWQKCQlpZiAodGhpcy50b3AwID09PSBudWxsKSB7CgkJCXNvdXJjZU9mZnNldCA9IHRoaXMuc291cmNlRWwub2Zmc2V0KCk7CgkJCW9yaWdpbiA9IHRoaXMuZWwub2Zmc2V0UGFyZW50KCkub2Zmc2V0KCk7CgkJCXRoaXMudG9wMCA9IHNvdXJjZU9mZnNldC50b3AgLSBvcmlnaW4udG9wOwoJCQl0aGlzLmxlZnQwID0gc291cmNlT2Zmc2V0LmxlZnQgLSBvcmlnaW4ubGVmdDsKCQl9CgoJCXRoaXMuZWwuY3NzKHsKCQkJdG9wOiB0aGlzLnRvcDAgKyB0aGlzLnRvcERlbHRhLAoJCQlsZWZ0OiB0aGlzLmxlZnQwICsgdGhpcy5sZWZ0RGVsdGEKCQl9KTsKCX0sCgoKCS8vIEdldHMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgbW92ZXMgdGhlIG1vdXNlCgloYW5kbGVNb3ZlOiBmdW5jdGlvbihldikgewoJCXRoaXMudG9wRGVsdGEgPSBnZXRFdlkoZXYpIC0gdGhpcy55MDsKCQl0aGlzLmxlZnREZWx0YSA9IGdldEV2WChldikgLSB0aGlzLngwOwoKCQlpZiAoIXRoaXMuaXNIaWRkZW4pIHsKCQkJdGhpcy51cGRhdGVQb3NpdGlvbigpOwoJCX0KCX0sCgoKCS8vIFRlbXBvcmFyaWx5IG1ha2VzIHRoZSB0cmFja2luZyBlbGVtZW50IGludmlzaWJsZS4gQ2FuIGJlIGNhbGxlZCBiZWZvcmUgZm9sbG93aW5nIHN0YXJ0cwoJaGlkZTogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLmlzSGlkZGVuKSB7CgkJCXRoaXMuaXNIaWRkZW4gPSB0cnVlOwoJCQlpZiAodGhpcy5lbCkgewoJCQkJdGhpcy5lbC5oaWRlKCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBTaG93IHRoZSB0cmFja2luZyBlbGVtZW50IGFmdGVyIGl0IGhhcyBiZWVuIHRlbXBvcmFyaWx5IGhpZGRlbgoJc2hvdzogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNIaWRkZW4pIHsKCQkJdGhpcy5pc0hpZGRlbiA9IGZhbHNlOwoJCQl0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7CgkJCXRoaXMuZ2V0RWwoKS5zaG93KCk7CgkJfQoJfQoKfSk7Cgo7OwoKLyogQW4gYWJzdHJhY3QgY2xhc3MgY29tcHJpc2VkIG9mIGEgImdyaWQiIG9mIGFyZWFzIHRoYXQgZWFjaCByZXByZXNlbnQgYSBzcGVjaWZpYyBkYXRldGltZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnZhciBHcmlkID0gRkMuR3JpZCA9IENsYXNzLmV4dGVuZChMaXN0ZW5lck1peGluLCBNb3VzZUlnbm9yZXJNaXhpbiwgewoKCS8vIHNlbGYtY29uZmlnLCBvdmVycmlkYWJsZSBieSBzdWJjbGFzc2VzCgloYXNEYXlJbnRlcmFjdGlvbnM6IHRydWUsIC8vIGNhbiB1c2VyIGNsaWNrL3NlbGVjdCByYW5nZXMgb2YgdGltZT8KCgl2aWV3OiBudWxsLCAvLyBhIFZpZXcgb2JqZWN0Cglpc1JUTDogbnVsbCwgLy8gc2hvcnRjdXQgdG8gdGhlIHZpZXcncyBpc1JUTCBvcHRpb24KCglzdGFydDogbnVsbCwKCWVuZDogbnVsbCwKCgllbDogbnVsbCwgLy8gdGhlIGNvbnRhaW5pbmcgZWxlbWVudAoJZWxzQnlGaWxsOiBudWxsLCAvLyBhIGhhc2ggb2YgalF1ZXJ5IGVsZW1lbnQgc2V0cyB1c2VkIGZvciByZW5kZXJpbmcgZWFjaCBmaWxsLiBLZXllZCBieSBmaWxsIG5hbWUuCgoJLy8gZGVyaXZlZCBmcm9tIG9wdGlvbnMKCWV2ZW50VGltZUZvcm1hdDogbnVsbCwKCWRpc3BsYXlFdmVudFRpbWU6IG51bGwsCglkaXNwbGF5RXZlbnRFbmQ6IG51bGwsCgoJbWluUmVzaXplRHVyYXRpb246IG51bGwsIC8vIFRPRE86IGhhY2suIHNldCBieSBzdWJjbGFzc2VzLiBtaW51bXVtIGV2ZW50IHJlc2l6ZSBkdXJhdGlvbgoKCS8vIGlmIGRlZmluZWQsIGhvbGRzIHRoZSB1bml0IGlkZW50aWZpZWQgKGV4OiAieWVhciIgb3IgIm1vbnRoIikgdGhhdCBkZXRlcm1pbmVzIHRoZSBsZXZlbCBvZiBncmFudWxhcml0eQoJLy8gb2YgdGhlIGRhdGUgYXJlYXMuIGlmIG5vdCBkZWZpbmVkLCBhc3N1bWVzIHRvIGJlIGRheSBhbmQgdGltZSBncmFudWxhcml0eS4KCS8vIFRPRE86IHBvcnQgaXNUaW1lU2NhbGUgaW50byBzYW1lIHN5c3RlbT8KCWxhcmdlVW5pdDogbnVsbCwKCglkYXlEcmFnTGlzdGVuZXI6IG51bGwsCglzZWdEcmFnTGlzdGVuZXI6IG51bGwsCglzZWdSZXNpemVMaXN0ZW5lcjogbnVsbCwKCWV4dGVybmFsRHJhZ0xpc3RlbmVyOiBudWxsLAoKCgljb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlldykgewoJCXRoaXMudmlldyA9IHZpZXc7CgkJdGhpcy5pc1JUTCA9IHZpZXcub3B0KCdpc1JUTCcpOwoJCXRoaXMuZWxzQnlGaWxsID0ge307CgoJCXRoaXMuZGF5RHJhZ0xpc3RlbmVyID0gdGhpcy5idWlsZERheURyYWdMaXN0ZW5lcigpOwoJCXRoaXMuaW5pdE1vdXNlSWdub3JpbmcoKTsKCX0sCgoKCS8qIE9wdGlvbnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyB0aGUgZm9ybWF0IHN0cmluZyB1c2VkIGZvciBldmVudCB0aW1lIHRleHQsIGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgYnkgJ3RpbWVGb3JtYXQnCgljb21wdXRlRXZlbnRUaW1lRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy52aWV3Lm9wdCgnc21hbGxUaW1lRm9ybWF0Jyk7Cgl9LAoKCgkvLyBEZXRlcm1pbmVzIHdoZXRoZXIgZXZlbnRzIHNob3VsZCBoYXZlIHRoZWlyIGVuZCB0aW1lcyBkaXNwbGF5ZWQsIGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgYnkgJ2Rpc3BsYXlFdmVudFRpbWUnLgoJLy8gT25seSBhcHBsaWVzIHRvIG5vbi1hbGwtZGF5IGV2ZW50cy4KCWNvbXB1dGVEaXNwbGF5RXZlbnRUaW1lOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0sCgoKCS8vIERldGVybWluZXMgd2hldGhlciBldmVudHMgc2hvdWxkIGhhdmUgdGhlaXIgZW5kIHRpbWVzIGRpc3BsYXllZCwgaWYgbm90IGV4cGxpY2l0bHkgZGVmaW5lZCBieSAnZGlzcGxheUV2ZW50RW5kJwoJY29tcHV0ZURpc3BsYXlFdmVudEVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRydWU7Cgl9LAoKCgkvKiBEYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gVGVsbHMgdGhlIGdyaWQgYWJvdXQgd2hhdCBwZXJpb2Qgb2YgdGltZSB0byBkaXNwbGF5LgoJLy8gQW55IGRhdGUtcmVsYXRlZCBpbnRlcm5hbCBkYXRhIHNob3VsZCBiZSBnZW5lcmF0ZWQuCglzZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsKCQl0aGlzLnN0YXJ0ID0gcmFuZ2Uuc3RhcnQuY2xvbmUoKTsKCQl0aGlzLmVuZCA9IHJhbmdlLmVuZC5jbG9uZSgpOwoKCQl0aGlzLnJhbmdlVXBkYXRlZCgpOwoJCXRoaXMucHJvY2Vzc1JhbmdlT3B0aW9ucygpOwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gaW50ZXJuYWwgdmFyaWFibGVzIHRoYXQgcmVseSBvbiB0aGUgcmFuZ2Ugc2hvdWxkIGJlIHVwZGF0ZWQKCXJhbmdlVXBkYXRlZDogZnVuY3Rpb24oKSB7Cgl9LAoKCgkvLyBVcGRhdGVzIHZhbHVlcyB0aGF0IHJlbHkgb24gb3B0aW9ucyBhbmQgYWxzbyByZWxhdGUgdG8gcmFuZ2UKCXByb2Nlc3NSYW5nZU9wdGlvbnM6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBkaXNwbGF5RXZlbnRUaW1lOwoJCXZhciBkaXNwbGF5RXZlbnRFbmQ7CgoJCXRoaXMuZXZlbnRUaW1lRm9ybWF0ID0KCQkJdmlldy5vcHQoJ2V2ZW50VGltZUZvcm1hdCcpIHx8CgkJCXZpZXcub3B0KCd0aW1lRm9ybWF0JykgfHwgLy8gZGVwcmVjYXRlZAoJCQl0aGlzLmNvbXB1dGVFdmVudFRpbWVGb3JtYXQoKTsKCgkJZGlzcGxheUV2ZW50VGltZSA9IHZpZXcub3B0KCdkaXNwbGF5RXZlbnRUaW1lJyk7CgkJaWYgKGRpc3BsYXlFdmVudFRpbWUgPT0gbnVsbCkgewoJCQlkaXNwbGF5RXZlbnRUaW1lID0gdGhpcy5jb21wdXRlRGlzcGxheUV2ZW50VGltZSgpOyAvLyBtaWdodCBiZSBiYXNlZCBvZmYgb2YgcmFuZ2UKCQl9CgoJCWRpc3BsYXlFdmVudEVuZCA9IHZpZXcub3B0KCdkaXNwbGF5RXZlbnRFbmQnKTsKCQlpZiAoZGlzcGxheUV2ZW50RW5kID09IG51bGwpIHsKCQkJZGlzcGxheUV2ZW50RW5kID0gdGhpcy5jb21wdXRlRGlzcGxheUV2ZW50RW5kKCk7IC8vIG1pZ2h0IGJlIGJhc2VkIG9mZiBvZiByYW5nZQoJCX0KCgkJdGhpcy5kaXNwbGF5RXZlbnRUaW1lID0gZGlzcGxheUV2ZW50VGltZTsKCQl0aGlzLmRpc3BsYXlFdmVudEVuZCA9IGRpc3BsYXlFdmVudEVuZDsKCX0sCgoKCS8vIENvbnZlcnRzIGEgc3BhbiAoaGFzIHVuem9uZWQgc3RhcnQvZW5kIGFuZCBhbnkgb3RoZXIgZ3JpZC1zcGVjaWZpYyBsb2NhdGlvbiBpbmZvcm1hdGlvbikKCS8vIGludG8gYW4gYXJyYXkgb2Ygc2VnbWVudHMgKHBpZWNlcyBvZiBldmVudHMgd2hvc2UgZm9ybWF0IGlzIGRlY2lkZWQgYnkgdGhlIGdyaWQpLgoJc3BhblRvU2VnczogZnVuY3Rpb24oc3BhbikgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8vIERpZmZzIHRoZSB0d28gZGF0ZXMsIHJldHVybmluZyBhIGR1cmF0aW9uLCBiYXNlZCBvbiBncmFudWxhcml0eSBvZiB0aGUgZ3JpZAoJLy8gVE9ETzogcG9ydCBpc1RpbWVTY2FsZSBpbnRvIHRoaXMgc3lzdGVtPwoJZGlmZkRhdGVzOiBmdW5jdGlvbihhLCBiKSB7CgkJaWYgKHRoaXMubGFyZ2VVbml0KSB7CgkJCXJldHVybiBkaWZmQnlVbml0KGEsIGIsIHRoaXMubGFyZ2VVbml0KTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBkaWZmRGF5VGltZShhLCBiKTsKCQl9Cgl9LAoKCgkvKiBIaXQgQXJlYQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ2FsbGVkIGJlZm9yZSBvbmUgb3IgbW9yZSBxdWVyeUhpdCBjYWxscyBtaWdodCBoYXBwZW4uIFNob3VsZCBwcmVwYXJlIGFueSBjYWNoZWQgY29vcmRpbmF0ZXMgZm9yIHF1ZXJ5SGl0CglwcmVwYXJlSGl0czogZnVuY3Rpb24oKSB7Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiBxdWVyeUhpdCBjYWxscyBoYXZlIHN1YnNpZGVkLiBHb29kIHBsYWNlIHRvIGNsZWFyIGFueSBjb29yZGluYXRlIGNhY2hlcy4KCXJlbGVhc2VIaXRzOiBmdW5jdGlvbigpIHsKCX0sCgoKCS8vIEdpdmVuIGNvb3JkaW5hdGVzIGZyb20gdGhlIHRvcGxlZnQgb2YgdGhlIGRvY3VtZW50LCByZXR1cm4gZGF0YSBhYm91dCB0aGUgZGF0ZS1yZWxhdGVkIGFyZWEgdW5kZXJuZWF0aC4KCS8vIENhbiByZXR1cm4gYW4gb2JqZWN0IHdpdGggYXJiaXRyYXJ5IHByb3BlcnRpZXMgKGFsdGhvdWdoIHRvcC9yaWdodC9sZWZ0L2JvdHRvbSBhcmUgZW5jb3VyYWdlZCkuCgkvLyBNdXN0IGhhdmUgYSBgZ3JpZGAgcHJvcGVydHksIGEgcmVmZXJlbmNlIHRvIHRoaXMgY3VycmVudCBncmlkLiBUT0RPOiBhdm9pZCB0aGlzCgkvLyBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IGdldEhpdFNwYW4gYW5kIGdldEhpdEVsLgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewoJfSwKCgoJLy8gR2l2ZW4gcG9zaXRpb24tbGV2ZWwgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXRlLXJlbGF0ZWQgYXJlYSB3aXRoaW4gdGhlIGdyaWQsCgkvLyBzaG91bGQgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGF0IGxlYXN0IGEgc3RhcnQvZW5kIGRhdGUuIENhbiBwcm92aWRlIG90aGVyIGluZm9ybWF0aW9uIGFzIHdlbGwuCglnZXRIaXRTcGFuOiBmdW5jdGlvbihoaXQpIHsKCX0sCgoKCS8vIEdpdmVuIHBvc2l0aW9uLWxldmVsIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0ZS1yZWxhdGVkIGFyZWEgd2l0aGluIHRoZSBncmlkLAoJLy8gc2hvdWxkIHJldHVybiBhIGpRdWVyeSBlbGVtZW50IHRoYXQgYmVzdCByZXByZXNlbnRzIGl0LiBwYXNzZWQgdG8gZGF5Q2xpY2sgY2FsbGJhY2suCglnZXRIaXRFbDogZnVuY3Rpb24oaGl0KSB7Cgl9LAoKCgkvKiBSZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFNldHMgdGhlIGNvbnRhaW5lciBlbGVtZW50IHRoYXQgdGhlIGdyaWQgc2hvdWxkIHJlbmRlciBpbnNpZGUgb2YuCgkvLyBEb2VzIG90aGVyIERPTS1yZWxhdGVkIGluaXRpYWxpemF0aW9ucy4KCXNldEVsZW1lbnQ6IGZ1bmN0aW9uKGVsKSB7CgkJdGhpcy5lbCA9IGVsOwoKCQlpZiAodGhpcy5oYXNEYXlJbnRlcmFjdGlvbnMpIHsKCQkJcHJldmVudFNlbGVjdGlvbihlbCk7CgoJCQl0aGlzLmJpbmREYXlIYW5kbGVyKCd0b3VjaHN0YXJ0JywgdGhpcy5kYXlUb3VjaFN0YXJ0KTsKCQkJdGhpcy5iaW5kRGF5SGFuZGxlcignbW91c2Vkb3duJywgdGhpcy5kYXlNb3VzZWRvd24pOwoJCX0KCgkJLy8gYXR0YWNoIGV2ZW50LWVsZW1lbnQtcmVsYXRlZCBoYW5kbGVycy4gaW4gR3JpZC5ldmVudHMKCQkvLyBzYW1lIGdhcmJhZ2UgY29sbGVjdGlvbiBub3RlIGFzIGFib3ZlLgoJCXRoaXMuYmluZFNlZ0hhbmRsZXJzKCk7CgoJCXRoaXMuYmluZEdsb2JhbEhhbmRsZXJzKCk7Cgl9LAoKCgliaW5kRGF5SGFuZGxlcjogZnVuY3Rpb24obmFtZSwgaGFuZGxlcikgewoJCXZhciBfdGhpcyA9IHRoaXM7CgoJCS8vIGF0dGFjaCBhIGhhbmRsZXIgdG8gdGhlIGdyaWQncyByb290IGVsZW1lbnQuCgkJLy8galF1ZXJ5IHdpbGwgdGFrZSBjYXJlIG9mIHVucmVnaXN0ZXJpbmcgdGhlbSB3aGVuIHJlbW92ZUVsZW1lbnQgZ2V0cyBjYWxsZWQuCgkJdGhpcy5lbC5vbihuYW1lLCBmdW5jdGlvbihldikgewoJCQlpZiAoCgkJCQkhJChldi50YXJnZXQpLmlzKAoJCQkJCV90aGlzLnNlZ1NlbGVjdG9yICsgJywnICsgLy8gZGlyZWN0bHkgb24gYW4gZXZlbnQgZWxlbWVudAoJCQkJCV90aGlzLnNlZ1NlbGVjdG9yICsgJyAqLCcgKyAvLyB3aXRoaW4gYW4gZXZlbnQgZWxlbWVudAoJCQkJCScuZmMtbW9yZSwnICsgLy8gYSAibW9yZS4uIiBsaW5rCgkJCQkJJ2FbZGF0YS1nb3RvXScgLy8gYSBjbGlja2FibGUgbmF2IGxpbmsKCQkJCSkKCQkJKSB7CgkJCQlyZXR1cm4gaGFuZGxlci5jYWxsKF90aGlzLCBldik7CgkJCX0KCQl9KTsKCX0sCgoKCS8vIFJlbW92ZXMgdGhlIGdyaWQncyBjb250YWluZXIgZWxlbWVudCBmcm9tIHRoZSBET00uIFVuZG9lcyBhbnkgb3RoZXIgRE9NLXJlbGF0ZWQgYXR0YWNobWVudHMuCgkvLyBET0VTIE5PVCByZW1vdmUgYW55IGNvbnRlbnQgYmVmb3JlaGFuZCAoZG9lc24ndCBjbGVhciBldmVudHMgb3IgY2FsbCB1bnJlbmRlckRhdGVzKSwgdW5saWtlIFZpZXcKCXJlbW92ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKTsKCQl0aGlzLmNsZWFyRHJhZ0xpc3RlbmVycygpOwoKCQl0aGlzLmVsLnJlbW92ZSgpOwoKCQkvLyBOT1RFOiB3ZSBkb24ndCBudWxsLW91dCB0aGlzLmVsIGZvciB0aGUgc2FtZSByZWFzb25zIHdlIGRvbid0IGRvIGl0IHdpdGhpbiBWaWV3OjpyZW1vdmVFbGVtZW50Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgZ3JpZCB2aWV3IGJlZm9yZSBhbnkgY29udGVudCBpcyByZW5kZXJlZAoJcmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLy8gUmVuZGVycyB0aGUgZ3JpZCdzIGRhdGUtcmVsYXRlZCBjb250ZW50IChsaWtlIGFyZWFzIHRoYXQgcmVwcmVzZW50IGRheXMvdGltZXMpLgoJLy8gQXNzdW1lcyBzZXRSYW5nZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbmQgdGhlIHNrZWxldG9uIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIGdyaWQncyBkYXRlLXJlbGF0ZWQgY29udGVudAoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvKiBIYW5kbGVycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQmluZHMgRE9NIGhhbmRsZXJzIHRvIGVsZW1lbnRzIHRoYXQgcmVzaWRlIG91dHNpZGUgdGhlIGdyaWQsIHN1Y2ggYXMgdGhlIGRvY3VtZW50CgliaW5kR2xvYmFsSGFuZGxlcnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMubGlzdGVuVG8oJChkb2N1bWVudCksIHsKCQkJZHJhZ3N0YXJ0OiB0aGlzLmV4dGVybmFsRHJhZ1N0YXJ0LCAvLyBqcXVpCgkJCXNvcnRzdGFydDogdGhpcy5leHRlcm5hbERyYWdTdGFydCAvLyBqcXVpCgkJfSk7Cgl9LAoKCgkvLyBVbmJpbmRzIERPTSBoYW5kbGVycyBmcm9tIGVsZW1lbnRzIHRoYXQgcmVzaWRlIG91dHNpZGUgdGhlIGdyaWQKCXVuYmluZEdsb2JhbEhhbmRsZXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnN0b3BMaXN0ZW5pbmdUbygkKGRvY3VtZW50KSk7Cgl9LAoKCgkvLyBQcm9jZXNzIGEgbW91c2Vkb3duIG9uIGFuIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgZGF5LiBGb3IgZGF5IGNsaWNraW5nIGFuZCBzZWxlY3RpbmcuCglkYXlNb3VzZWRvd246IGZ1bmN0aW9uKGV2KSB7CgkJaWYgKCF0aGlzLmlzSWdub3JpbmdNb3VzZSkgewoJCQl0aGlzLmRheURyYWdMaXN0ZW5lci5zdGFydEludGVyYWN0aW9uKGV2LCB7CgkJCQkvL2Rpc3RhbmNlOiA1LCAvLyBuZWVkcyBtb3JlIHdvcmsgaWYgd2Ugd2FudCBkYXlDbGljayB0byBmaXJlIGNvcnJlY3RseQoJCQl9KTsKCQl9Cgl9LAoKCglkYXlUb3VjaFN0YXJ0OiBmdW5jdGlvbihldikgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQkvLyBIQUNLIHRvIHByZXZlbnQgYSB1c2VyJ3MgY2xpY2thd2F5IGZvciB1bnNlbGVjdGluZyBhIHJhbmdlIG9yIGFuIGV2ZW50CgkJLy8gZnJvbSBjYXVzaW5nIGEgZGF5Q2xpY2suCgkJaWYgKHZpZXcuaXNTZWxlY3RlZCB8fCB2aWV3LnNlbGVjdGVkRXZlbnQpIHsKCQkJdGhpcy50ZW1wSWdub3JlTW91c2UoKTsKCQl9CgoJCXRoaXMuZGF5RHJhZ0xpc3RlbmVyLnN0YXJ0SW50ZXJhY3Rpb24oZXYsIHsKCQkJZGVsYXk6IHRoaXMudmlldy5vcHQoJ2xvbmdQcmVzc0RlbGF5JykKCQl9KTsKCX0sCgoKCS8vIENyZWF0ZXMgYSBsaXN0ZW5lciB0aGF0IHRyYWNrcyB0aGUgdXNlcidzIGRyYWcgYWNyb3NzIGRheSBlbGVtZW50cy4KCS8vIEZvciBkYXkgY2xpY2tpbmcgYW5kIHNlbGVjdGluZy4KCWJ1aWxkRGF5RHJhZ0xpc3RlbmVyOiBmdW5jdGlvbigpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBpc1NlbGVjdGFibGUgPSB2aWV3Lm9wdCgnc2VsZWN0YWJsZScpOwoJCXZhciBkYXlDbGlja0hpdDsgLy8gbnVsbCBpZiBpbnZhbGlkIGRheUNsaWNrCgkJdmFyIHNlbGVjdGlvblNwYW47IC8vIG51bGwgaWYgaW52YWxpZCBzZWxlY3Rpb24KCgkJLy8gdGhpcyBsaXN0ZW5lciB0cmFja3MgYSBtb3VzZWRvd24gb24gYSBkYXkgZWxlbWVudCwgYW5kIGEgc3Vic2VxdWVudCBkcmFnLgoJCS8vIGlmIHRoZSBkcmFnIGVuZHMgb24gdGhlIHNhbWUgZGF5LCBpdCBpcyBhICdkYXlDbGljaycuCgkJLy8gaWYgJ3NlbGVjdGFibGUnIGlzIGVuYWJsZWQsIHRoaXMgbGlzdGVuZXIgYWxzbyBkZXRlY3RzIHNlbGVjdGlvbnMuCgkJdmFyIGRyYWdMaXN0ZW5lciA9IG5ldyBIaXREcmFnTGlzdGVuZXIodGhpcywgewoJCQlzY3JvbGw6IHZpZXcub3B0KCdkcmFnU2Nyb2xsJyksCgkJCWludGVyYWN0aW9uU3RhcnQ6IGZ1bmN0aW9uKCkgewoJCQkJZGF5Q2xpY2tIaXQgPSBkcmFnTGlzdGVuZXIub3JpZ0hpdDsgLy8gZm9yIGRheUNsaWNrLCB3aGVyZSBubyBkcmFnZ2luZyBoYXBwZW5zCgkJCQlzZWxlY3Rpb25TcGFuID0gbnVsbDsKCQkJfSwKCQkJZHJhZ1N0YXJ0OiBmdW5jdGlvbigpIHsKCQkJCXZpZXcudW5zZWxlY3QoKTsgLy8gc2luY2Ugd2UgY291bGQgYmUgcmVuZGVyaW5nIGEgbmV3IHNlbGVjdGlvbiwgd2Ugd2FudCB0byBjbGVhciBhbnkgb2xkIG9uZQoJCQl9LAoJCQloaXRPdmVyOiBmdW5jdGlvbihoaXQsIGlzT3JpZywgb3JpZ0hpdCkgewoJCQkJaWYgKG9yaWdIaXQpIHsgLy8gY2xpY2sgbmVlZHMgdG8gaGF2ZSBzdGFydGVkIG9uIGEgaGl0CgoJCQkJCS8vIGlmIHVzZXIgZHJhZ2dlZCB0byBhbm90aGVyIGNlbGwgYXQgYW55IHBvaW50LCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGEgZGF5Q2xpY2sKCQkJCQlpZiAoIWlzT3JpZykgewoJCQkJCQlkYXlDbGlja0hpdCA9IG51bGw7CgkJCQkJfQoKCQkJCQlpZiAoaXNTZWxlY3RhYmxlKSB7CgkJCQkJCXNlbGVjdGlvblNwYW4gPSBfdGhpcy5jb21wdXRlU2VsZWN0aW9uKAoJCQkJCQkJX3RoaXMuZ2V0SGl0U3BhbihvcmlnSGl0KSwKCQkJCQkJCV90aGlzLmdldEhpdFNwYW4oaGl0KQoJCQkJCQkpOwoJCQkJCQlpZiAoc2VsZWN0aW9uU3BhbikgewoJCQkJCQkJX3RoaXMucmVuZGVyU2VsZWN0aW9uKHNlbGVjdGlvblNwYW4pOwoJCQkJCQl9CgkJCQkJCWVsc2UgaWYgKHNlbGVjdGlvblNwYW4gPT09IGZhbHNlKSB7CgkJCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0sCgkJCWhpdE91dDogZnVuY3Rpb24oKSB7IC8vIGNhbGxlZCBiZWZvcmUgbW91c2UgbW92ZXMgdG8gYSBkaWZmZXJlbnQgaGl0IE9SIG1vdmVkIG91dCBvZiBhbGwgaGl0cwoJCQkJZGF5Q2xpY2tIaXQgPSBudWxsOwoJCQkJc2VsZWN0aW9uU3BhbiA9IG51bGw7CgkJCQlfdGhpcy51bnJlbmRlclNlbGVjdGlvbigpOwoJCQl9LAoJCQloaXREb25lOiBmdW5jdGlvbigpIHsgLy8gY2FsbGVkIGFmdGVyIGEgaGl0T3V0IE9SIGJlZm9yZSBhIGRyYWdFbmQKCQkJCWVuYWJsZUN1cnNvcigpOwoJCQl9LAoJCQlpbnRlcmFjdGlvbkVuZDogZnVuY3Rpb24oZXYsIGlzQ2FuY2VsbGVkKSB7CgkJCQlpZiAoIWlzQ2FuY2VsbGVkKSB7CgkJCQkJaWYgKAoJCQkJCQlkYXlDbGlja0hpdCAmJgoJCQkJCQkhX3RoaXMuaXNJZ25vcmluZ01vdXNlIC8vIHNlZSBoYWNrIGluIGRheVRvdWNoU3RhcnQKCQkJCQkpIHsKCQkJCQkJdmlldy50cmlnZ2VyRGF5Q2xpY2soCgkJCQkJCQlfdGhpcy5nZXRIaXRTcGFuKGRheUNsaWNrSGl0KSwKCQkJCQkJCV90aGlzLmdldEhpdEVsKGRheUNsaWNrSGl0KSwKCQkJCQkJCWV2CgkJCQkJCSk7CgkJCQkJfQoJCQkJCWlmIChzZWxlY3Rpb25TcGFuKSB7CgkJCQkJCS8vIHRoZSBzZWxlY3Rpb24gd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiByZW5kZXJlZC4ganVzdCByZXBvcnQgaXQKCQkJCQkJdmlldy5yZXBvcnRTZWxlY3Rpb24oc2VsZWN0aW9uU3BhbiwgZXYpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0pOwoKCQlyZXR1cm4gZHJhZ0xpc3RlbmVyOwoJfSwKCgoJLy8gS2lsbHMgYWxsIGluLXByb2dyZXNzIGRyYWdnaW5nLgoJLy8gVXNlZnVsIGZvciB3aGVuIHB1YmxpYyBBUEkgbWV0aG9kcyB0aGF0IHJlc3VsdCBpbiByZS1yZW5kZXJpbmcgYXJlIGludm9rZWQgZHVyaW5nIGEgZHJhZy4KCS8vIEFsc28gdXNlZnVsIGZvciB3aGVuIHRvdWNoIGRldmljZXMgbWlzYmVoYXZlIGFuZCBkb24ndCBmaXJlIHRoZWlyIHRvdWNoZW5kLgoJY2xlYXJEcmFnTGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRheURyYWdMaXN0ZW5lci5lbmRJbnRlcmFjdGlvbigpOwoKCQlpZiAodGhpcy5zZWdEcmFnTGlzdGVuZXIpIHsKCQkJdGhpcy5zZWdEcmFnTGlzdGVuZXIuZW5kSW50ZXJhY3Rpb24oKTsgLy8gd2lsbCBjbGVhciB0aGlzLnNlZ0RyYWdMaXN0ZW5lcgoJCX0KCQlpZiAodGhpcy5zZWdSZXNpemVMaXN0ZW5lcikgewoJCQl0aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyLmVuZEludGVyYWN0aW9uKCk7IC8vIHdpbGwgY2xlYXIgdGhpcy5zZWdSZXNpemVMaXN0ZW5lcgoJCX0KCQlpZiAodGhpcy5leHRlcm5hbERyYWdMaXN0ZW5lcikgewoJCQl0aGlzLmV4dGVybmFsRHJhZ0xpc3RlbmVyLmVuZEludGVyYWN0aW9uKCk7IC8vIHdpbGwgY2xlYXIgdGhpcy5leHRlcm5hbERyYWdMaXN0ZW5lcgoJCX0KCX0sCgoKCS8qIEV2ZW50IEhlbHBlcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCS8vIFRPRE86IHNob3VsZCBwcm9iYWJseSBtb3ZlIHRoaXMgdG8gR3JpZC5ldmVudHMsIGxpa2Ugd2UgZGlkIGV2ZW50IGRyYWdnaW5nIC8gcmVzaXppbmcKCgoJLy8gUmVuZGVycyBhIG1vY2sgZXZlbnQgYXQgdGhlIGdpdmVuIGV2ZW50IGxvY2F0aW9uLCB3aGljaCBjb250YWlucyB6b25lZCBzdGFydC9lbmQgcHJvcGVydGllcy4KCS8vIFJldHVybnMgYWxsIG1vY2sgZXZlbnQgZWxlbWVudHMuCglyZW5kZXJFdmVudExvY2F0aW9uSGVscGVyOiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzb3VyY2VTZWcpIHsKCQl2YXIgZmFrZUV2ZW50ID0gdGhpcy5mYWJyaWNhdGVIZWxwZXJFdmVudChldmVudExvY2F0aW9uLCBzb3VyY2VTZWcpOwoKCQlyZXR1cm4gdGhpcy5yZW5kZXJIZWxwZXIoZmFrZUV2ZW50LCBzb3VyY2VTZWcpOyAvLyBkbyB0aGUgYWN0dWFsIHJlbmRlcmluZwoJfSwKCgoJLy8gQnVpbGRzIGEgZmFrZSBldmVudCBnaXZlbiB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMgYW5kIGEgc2VnbWVudCBpcyBzaG91bGQgYmUgaW5zcGlyZWQgZnJvbS4KCS8vIFRoZSByYW5nZSdzIGVuZCBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB0aGUgbW9jayBldmVudCB0aGF0IGlzIHJlbmRlcmVkIHdpbGwgaGF2ZSBhIG51bGwgZW5kIHRpbWUuCgkvLyBgc291cmNlU2VnYCBpcyB0aGUgaW50ZXJuYWwgc2VnbWVudCBvYmplY3QgaW52b2x2ZWQgaW4gdGhlIGRyYWcuIElmIG51bGwsIHNvbWV0aGluZyBleHRlcm5hbCBpcyBkcmFnZ2luZy4KCWZhYnJpY2F0ZUhlbHBlckV2ZW50OiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzb3VyY2VTZWcpIHsKCQl2YXIgZmFrZUV2ZW50ID0gc291cmNlU2VnID8gY3JlYXRlT2JqZWN0KHNvdXJjZVNlZy5ldmVudCkgOiB7fTsgLy8gbWFzayB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0IGlmIHBvc3NpYmxlCgoJCWZha2VFdmVudC5zdGFydCA9IGV2ZW50TG9jYXRpb24uc3RhcnQuY2xvbmUoKTsKCQlmYWtlRXZlbnQuZW5kID0gZXZlbnRMb2NhdGlvbi5lbmQgPyBldmVudExvY2F0aW9uLmVuZC5jbG9uZSgpIDogbnVsbDsKCQlmYWtlRXZlbnQuYWxsRGF5ID0gbnVsbDsgLy8gZm9yY2UgaXQgdG8gYmUgZnJlc2hseSBjb21wdXRlZCBieSBub3JtYWxpemVFdmVudERhdGVzCgkJdGhpcy52aWV3LmNhbGVuZGFyLm5vcm1hbGl6ZUV2ZW50RGF0ZXMoZmFrZUV2ZW50KTsKCgkJLy8gdGhpcyBleHRyYSBjbGFzc05hbWUgd2lsbCBiZSB1c2VmdWwgZm9yIGRpZmZlcmVudGlhdGluZyByZWFsIGV2ZW50cyBmcm9tIG1vY2sgZXZlbnRzIGluIENTUwoJCWZha2VFdmVudC5jbGFzc05hbWUgPSAoZmFrZUV2ZW50LmNsYXNzTmFtZSB8fCBbXSkuY29uY2F0KCdmYy1oZWxwZXInKTsKCgkJLy8gaWYgc29tZXRoaW5nIGV4dGVybmFsIGlzIGJlaW5nIGRyYWdnZWQgaW4sIGRvbid0IHJlbmRlciBhIHJlc2l6ZXIKCQlpZiAoIXNvdXJjZVNlZykgewoJCQlmYWtlRXZlbnQuZWRpdGFibGUgPSBmYWxzZTsKCQl9CgoJCXJldHVybiBmYWtlRXZlbnQ7Cgl9LAoKCgkvLyBSZW5kZXJzIGEgbW9jayBldmVudC4gR2l2ZW4gem9uZWQgZXZlbnQgZGF0ZSBwcm9wZXJ0aWVzLgoJLy8gTXVzdCByZXR1cm4gYWxsIG1vY2sgZXZlbnQgZWxlbWVudHMuCglyZW5kZXJIZWxwZXI6IGZ1bmN0aW9uKGV2ZW50TG9jYXRpb24sIHNvdXJjZVNlZykgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8vIFVucmVuZGVycyBhIG1vY2sgZXZlbnQKCXVucmVuZGVySGVscGVyOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvKiBTZWxlY3Rpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhIHNlbGVjdGlvbi4gV2lsbCBoaWdobGlnaHQgYnkgZGVmYXVsdCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KCS8vIEdpdmVuIGEgc3BhbiAodW56b25lZCBzdGFydC9lbmQgYW5kIG90aGVyIG1pc2MgZGF0YSkKCXJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbikgewoJCXRoaXMucmVuZGVySGlnaGxpZ2h0KHNwYW4pOwoJfSwKCgoJLy8gVW5yZW5kZXJzIGFueSB2aXN1YWwgaW5kaWNhdGlvbnMgb2YgYSBzZWxlY3Rpb24uIFdpbGwgdW5yZW5kZXIgYSBoaWdobGlnaHQgYnkgZGVmYXVsdC4KCXVucmVuZGVyU2VsZWN0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCk7Cgl9LAoKCgkvLyBHaXZlbiB0aGUgZmlyc3QgYW5kIGxhc3QgZGF0ZS1zcGFucyBvZiBhIHNlbGVjdGlvbiwgcmV0dXJucyBhbm90aGVyIGRhdGUtc3BhbiBvYmplY3QuCgkvLyBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBhbmQgcHJvdmlkZSBhZGRpdGlvbmFsIGRhdGEgaW4gdGhlIHNwYW4gb2JqZWN0LiBXaWxsIGJlIHBhc3NlZCB0byByZW5kZXJTZWxlY3Rpb24oKS4KCS8vIFdpbGwgcmV0dXJuIGZhbHNlIGlmIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCBhbmQgdGhpcyBzaG91bGQgYmUgaW5kaWNhdGVkIHRvIHRoZSB1c2VyLgoJLy8gV2lsbCByZXR1cm4gbnVsbC91bmRlZmluZWQgaWYgYSBzZWxlY3Rpb24gaW52YWxpZCBidXQgbm8gZXJyb3Igc2hvdWxkIGJlIHJlcG9ydGVkLgoJY29tcHV0ZVNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbjAsIHNwYW4xKSB7CgkJdmFyIHNwYW4gPSB0aGlzLmNvbXB1dGVTZWxlY3Rpb25TcGFuKHNwYW4wLCBzcGFuMSk7CgoJCWlmIChzcGFuICYmICF0aGlzLnZpZXcuY2FsZW5kYXIuaXNTZWxlY3Rpb25TcGFuQWxsb3dlZChzcGFuKSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gc3BhbjsKCX0sCgoKCS8vIEdpdmVuIHR3byBzcGFucywgbXVzdCByZXR1cm4gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28uCgkvLyBUT0RPOiBkbyB0aGlzIHNlcGFyYXRpb24gb2YgY29uY2VybnMgKGNvbWJpbmluZyBWUyB2YWxpZGF0aW9uKSBmb3IgZXZlbnQgZG5kL3Jlc2l6ZSB0b28uCgljb21wdXRlU2VsZWN0aW9uU3BhbjogZnVuY3Rpb24oc3BhbjAsIHNwYW4xKSB7CgkJdmFyIGRhdGVzID0gWyBzcGFuMC5zdGFydCwgc3BhbjAuZW5kLCBzcGFuMS5zdGFydCwgc3BhbjEuZW5kIF07CgoJCWRhdGVzLnNvcnQoY29tcGFyZU51bWJlcnMpOyAvLyBzb3J0cyBjaHJvbm9sb2dpY2FsbHkuIHdvcmtzIHdpdGggTW9tZW50cwoKCQlyZXR1cm4geyBzdGFydDogZGF0ZXNbMF0uY2xvbmUoKSwgZW5kOiBkYXRlc1szXS5jbG9uZSgpIH07Cgl9LAoKCgkvKiBIaWdobGlnaHQKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgYW4gZW1waGFzaXMgb24gdGhlIGdpdmVuIGRhdGUgcmFuZ2UuIEdpdmVuIGEgc3BhbiAodW56b25lZCBzdGFydC9lbmQgYW5kIG90aGVyIG1pc2MgZGF0YSkKCXJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24oc3BhbikgewoJCXRoaXMucmVuZGVyRmlsbCgnaGlnaGxpZ2h0JywgdGhpcy5zcGFuVG9TZWdzKHNwYW4pKTsKCX0sCgoKCS8vIFVucmVuZGVycyB0aGUgZW1waGFzaXMgb24gYSBkYXRlIHJhbmdlCgl1bnJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckZpbGwoJ2hpZ2hsaWdodCcpOwoJfSwKCgoJLy8gR2VuZXJhdGVzIGFuIGFycmF5IG9mIGNsYXNzTmFtZXMgZm9yIHJlbmRlcmluZyB0aGUgaGlnaGxpZ2h0LiBVc2VkIGJ5IHRoZSBmaWxsIHN5c3RlbS4KCWhpZ2hsaWdodFNlZ0NsYXNzZXM6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBbICdmYy1oaWdobGlnaHQnIF07Cgl9LAoKCgkvKiBCdXNpbmVzcyBIb3VycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7Cgl9LAoKCgl1bnJlbmRlckJ1c2luZXNzSG91cnM6IGZ1bmN0aW9uKCkgewoJfSwKCgoJLyogTm93IEluZGljYXRvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJZ2V0Tm93SW5kaWNhdG9yVW5pdDogZnVuY3Rpb24oKSB7Cgl9LAoKCglyZW5kZXJOb3dJbmRpY2F0b3I6IGZ1bmN0aW9uKGRhdGUpIHsKCX0sCgoKCXVucmVuZGVyTm93SW5kaWNhdG9yOiBmdW5jdGlvbigpIHsKCX0sCgoKCS8qIEZpbGwgU3lzdGVtIChoaWdobGlnaHQsIGJhY2tncm91bmQgZXZlbnRzLCBidXNpbmVzcyBob3VycykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglUT0RPOiByZW1vdmUgdGhpcyBzeXN0ZW0uIGxpa2Ugd2UgZGlkIGluIFRpbWVHcmlkCgkqLwoKCgkvLyBSZW5kZXJzIGEgc2V0IG9mIHJlY3RhbmdsZXMgb3ZlciB0aGUgZ2l2ZW4gc2VnbWVudHMgb2YgdGltZS4KCS8vIE1VU1QgUkVUVVJOIGEgc3Vic2V0IG9mIHNlZ3MsIHRoZSBzZWdzIHRoYXQgd2VyZSBhY3R1YWxseSByZW5kZXJlZC4KCS8vIFJlc3BvbnNpYmxlIGZvciBwb3B1bGF0aW5nIHRoaXMuZWxzQnlGaWxsLiBUT0RPOiBiZXR0ZXIgQVBJIGZvciBleHByZXNzaW5nIHRoaXMgcmVxdWlyZW1lbnQKCXJlbmRlckZpbGw6IGZ1bmN0aW9uKHR5cGUsIHNlZ3MpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYSBzcGVjaWZpYyB0eXBlIG9mIGZpbGwgdGhhdCBpcyBjdXJyZW50bHkgcmVuZGVyZWQgb24gdGhlIGdyaWQKCXVucmVuZGVyRmlsbDogZnVuY3Rpb24odHlwZSkgewoJCXZhciBlbCA9IHRoaXMuZWxzQnlGaWxsW3R5cGVdOwoKCQlpZiAoZWwpIHsKCQkJZWwucmVtb3ZlKCk7CgkJCWRlbGV0ZSB0aGlzLmVsc0J5RmlsbFt0eXBlXTsKCQl9Cgl9LAoKCgkvLyBSZW5kZXJzIGFuZCBhc3NpZ25zIGFuIGBlbGAgcHJvcGVydHkgZm9yIGVhY2ggZmlsbCBzZWdtZW50LiBHZW5lcmljIGVub3VnaCB0byB3b3JrIHdpdGggZGlmZmVyZW50IHR5cGVzLgoJLy8gT25seSByZXR1cm5zIHNlZ21lbnRzIHRoYXQgc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkLgoJLy8gVG8gYmUgaGFybmVzc2VkIGJ5IHJlbmRlckZpbGwgKGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMpLgoJLy8gQW5hbGFnb3VzIHRvIHJlbmRlckZnU2VnRWxzLgoJcmVuZGVyRmlsbFNlZ0VsczogZnVuY3Rpb24odHlwZSwgc2VncykgewoJCXZhciBfdGhpcyA9IHRoaXM7CgkJdmFyIHNlZ0VsTWV0aG9kID0gdGhpc1t0eXBlICsgJ1NlZ0VsJ107CgkJdmFyIGh0bWwgPSAnJzsKCQl2YXIgcmVuZGVyZWRTZWdzID0gW107CgkJdmFyIGk7CgoJCWlmIChzZWdzLmxlbmd0aCkgewoKCQkJLy8gYnVpbGQgYSBsYXJnZSBjb25jYXRlbmF0aW9uIG9mIHNlZ21lbnQgSFRNTAoJCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQkJaHRtbCArPSB0aGlzLmZpbGxTZWdIdG1sKHR5cGUsIHNlZ3NbaV0pOwoJCQl9CgoJCQkvLyBHcmFiIGluZGl2aWR1YWwgZWxlbWVudHMgZnJvbSB0aGUgY29tYmluZWQgSFRNTCBzdHJpbmcuIFVzZSBlYWNoIGFzIHRoZSBkZWZhdWx0IHJlbmRlcmluZy4KCQkJLy8gVGhlbiwgY29tcHV0ZSB0aGUgJ2VsJyBmb3IgZWFjaCBzZWdtZW50LgoJCQkkKGh0bWwpLmVhY2goZnVuY3Rpb24oaSwgbm9kZSkgewoJCQkJdmFyIHNlZyA9IHNlZ3NbaV07CgkJCQl2YXIgZWwgPSAkKG5vZGUpOwoKCQkJCS8vIGFsbG93IGN1c3RvbSBmaWx0ZXIgbWV0aG9kcyBwZXItdHlwZQoJCQkJaWYgKHNlZ0VsTWV0aG9kKSB7CgkJCQkJZWwgPSBzZWdFbE1ldGhvZC5jYWxsKF90aGlzLCBzZWcsIGVsKTsKCQkJCX0KCgkJCQlpZiAoZWwpIHsgLy8gY3VzdG9tIGZpbHRlcnMgZGlkIG5vdCBjYW5jZWwgdGhlIHJlbmRlcgoJCQkJCWVsID0gJChlbCk7IC8vIGFsbG93IGN1c3RvbSBmaWx0ZXIgdG8gcmV0dXJuIHJhdyBET00gbm9kZQoKCQkJCQkvLyBjb3JyZWN0IGVsZW1lbnQgdHlwZT8gKHdvdWxkIGJlIGJhZCBpZiBhIG5vbi1URCB3ZXJlIGluc2VydGVkIGludG8gYSB0YWJsZSBmb3IgZXhhbXBsZSkKCQkJCQlpZiAoZWwuaXMoX3RoaXMuZmlsbFNlZ1RhZykpIHsKCQkJCQkJc2VnLmVsID0gZWw7CgkJCQkJCXJlbmRlcmVkU2Vncy5wdXNoKHNlZyk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiByZW5kZXJlZFNlZ3M7Cgl9LAoKCglmaWxsU2VnVGFnOiAnZGl2JywgLy8gc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKCgoJLy8gQnVpbGRzIHRoZSBIVE1MIG5lZWRlZCBmb3Igb25lIGZpbGwgc2VnbWVudC4gR2VuZXJpYyBlbm91Z2ggdG8gd29yayB3aXRoIGRpZmZlcmVudCB0eXBlcy4KCWZpbGxTZWdIdG1sOiBmdW5jdGlvbih0eXBlLCBzZWcpIHsKCgkJLy8gY3VzdG9tIGhvb2tzIHBlci10eXBlCgkJdmFyIGNsYXNzZXNNZXRob2QgPSB0aGlzW3R5cGUgKyAnU2VnQ2xhc3NlcyddOwoJCXZhciBjc3NNZXRob2QgPSB0aGlzW3R5cGUgKyAnU2VnQ3NzJ107CgoJCXZhciBjbGFzc2VzID0gY2xhc3Nlc01ldGhvZCA/IGNsYXNzZXNNZXRob2QuY2FsbCh0aGlzLCBzZWcpIDogW107CgkJdmFyIGNzcyA9IGNzc1RvU3RyKGNzc01ldGhvZCA/IGNzc01ldGhvZC5jYWxsKHRoaXMsIHNlZykgOiB7fSk7CgoJCXJldHVybiAnPCcgKyB0aGlzLmZpbGxTZWdUYWcgKwoJCQkoY2xhc3Nlcy5sZW5ndGggPyAnIGNsYXNzPSInICsgY2xhc3Nlcy5qb2luKCcgJykgKyAnIicgOiAnJykgKwoJCQkoY3NzID8gJyBzdHlsZT0iJyArIGNzcyArICciJyA6ICcnKSArCgkJCScgLz4nOwoJfSwKCgoKCS8qIEdlbmVyaWMgcmVuZGVyaW5nIHV0aWxpdGllcyBmb3Igc3ViY2xhc3NlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZXMgSFRNTCBjbGFzc05hbWVzIGZvciBhIHNpbmdsZS1kYXkgZWxlbWVudAoJZ2V0RGF5Q2xhc3NlczogZnVuY3Rpb24oZGF0ZSkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB0b2RheSA9IHZpZXcuY2FsZW5kYXIuZ2V0Tm93KCk7CgkJdmFyIGNsYXNzZXMgPSBbICdmYy0nICsgZGF5SURzW2RhdGUuZGF5KCldIF07CgoJCWlmICgKCQkJdmlldy5pbnRlcnZhbER1cmF0aW9uLmFzKCdtb250aHMnKSA9PSAxICYmCgkJCWRhdGUubW9udGgoKSAhPSB2aWV3LmludGVydmFsU3RhcnQubW9udGgoKQoJCSkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLW90aGVyLW1vbnRoJyk7CgkJfQoKCQlpZiAoZGF0ZS5pc1NhbWUodG9kYXksICdkYXknKSkgewoJCQljbGFzc2VzLnB1c2goCgkJCQknZmMtdG9kYXknLAoJCQkJdmlldy5oaWdobGlnaHRTdGF0ZUNsYXNzCgkJCSk7CgkJfQoJCWVsc2UgaWYgKGRhdGUgPCB0b2RheSkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLXBhc3QnKTsKCQl9CgkJZWxzZSB7CgkJCWNsYXNzZXMucHVzaCgnZmMtZnV0dXJlJyk7CgkJfQoKCQlyZXR1cm4gY2xhc3NlczsKCX0KCn0pOwoKOzsKCi8qIEV2ZW50LXJlbmRlcmluZyBhbmQgZXZlbnQtaW50ZXJhY3Rpb24gbWV0aG9kcyBmb3IgdGhlIGFic3RyYWN0IEdyaWQgY2xhc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpHcmlkLm1peGluKHsKCgkvLyBzZWxmLWNvbmZpZywgb3ZlcnJpZGFibGUgYnkgc3ViY2xhc3NlcwoJc2VnU2VsZWN0b3I6ICcuZmMtZXZlbnQtY29udGFpbmVyID4gKicsIC8vIHdoYXQgY29uc3RpdHV0ZXMgYW4gZXZlbnQgZWxlbWVudD8KCgltb3VzZWRPdmVyU2VnOiBudWxsLCAvLyB0aGUgc2VnbWVudCBvYmplY3QgdGhlIHVzZXIncyBtb3VzZSBpcyBvdmVyLiBudWxsIGlmIG92ZXIgbm90aGluZwoJaXNEcmFnZ2luZ1NlZzogZmFsc2UsIC8vIGlzIGEgc2VnbWVudCBiZWluZyBkcmFnZ2VkPyBib29sZWFuCglpc1Jlc2l6aW5nU2VnOiBmYWxzZSwgLy8gaXMgYSBzZWdtZW50IGJlaW5nIHJlc2l6ZWQ/IGJvb2xlYW4KCWlzRHJhZ2dpbmdFeHRlcm5hbDogZmFsc2UsIC8vIGpxdWktZHJhZ2dpbmcgYW4gZXh0ZXJuYWwgZWxlbWVudD8gYm9vbGVhbgoJc2VnczogbnVsbCwgLy8gdGhlICpldmVudCogc2VnbWVudHMgY3VycmVudGx5IHJlbmRlcmVkIGluIHRoZSBncmlkLiBUT0RPOiByZW5hbWUgdG8gYGV2ZW50U2Vnc2AKCgoJLy8gUmVuZGVycyB0aGUgZ2l2ZW4gZXZlbnRzIG9udG8gdGhlIGdyaWQKCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJdmFyIGJnRXZlbnRzID0gW107CgkJdmFyIGZnRXZlbnRzID0gW107CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKCQkJKGlzQmdFdmVudChldmVudHNbaV0pID8gYmdFdmVudHMgOiBmZ0V2ZW50cykucHVzaChldmVudHNbaV0pOwoJCX0KCgkJdGhpcy5zZWdzID0gW10uY29uY2F0KCAvLyByZWNvcmQgYWxsIHNlZ3MKCQkJdGhpcy5yZW5kZXJCZ0V2ZW50cyhiZ0V2ZW50cyksCgkJCXRoaXMucmVuZGVyRmdFdmVudHMoZmdFdmVudHMpCgkJKTsKCX0sCgoKCXJlbmRlckJnRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHsKCQl2YXIgc2VncyA9IHRoaXMuZXZlbnRzVG9TZWdzKGV2ZW50cyk7CgoJCS8vIHJlbmRlckJnU2VncyBtaWdodCByZXR1cm4gYSBzdWJzZXQgb2Ygc2Vncywgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCQlyZXR1cm4gdGhpcy5yZW5kZXJCZ1NlZ3Moc2VncykgfHwgc2VnczsKCX0sCgoKCXJlbmRlckZnRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHsKCQl2YXIgc2VncyA9IHRoaXMuZXZlbnRzVG9TZWdzKGV2ZW50cyk7CgoJCS8vIHJlbmRlckZnU2VncyBtaWdodCByZXR1cm4gYSBzdWJzZXQgb2Ygc2Vncywgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCQlyZXR1cm4gdGhpcy5yZW5kZXJGZ1NlZ3Moc2VncykgfHwgc2VnczsKCX0sCgoKCS8vIFVucmVuZGVycyBhbGwgZXZlbnRzIGN1cnJlbnRseSByZW5kZXJlZCBvbiB0aGUgZ3JpZAoJdW5yZW5kZXJFdmVudHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGFuZGxlU2VnTW91c2VvdXQoKTsgLy8gdHJpZ2dlciBhbiBldmVudE1vdXNlb3V0IGlmIHVzZXIncyBtb3VzZSBpcyBvdmVyIGFuIGV2ZW50CgkJdGhpcy5jbGVhckRyYWdMaXN0ZW5lcnMoKTsKCgkJdGhpcy51bnJlbmRlckZnU2VncygpOwoJCXRoaXMudW5yZW5kZXJCZ1NlZ3MoKTsKCgkJdGhpcy5zZWdzID0gbnVsbDsKCX0sCgoKCS8vIFJldHJpZXZlcyBhbGwgcmVuZGVyZWQgc2VnbWVudCBvYmplY3RzIGN1cnJlbnRseSByZW5kZXJlZCBvbiB0aGUgZ3JpZAoJZ2V0RXZlbnRTZWdzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5zZWdzIHx8IFtdOwoJfSwKCgoJLyogRm9yZWdyb3VuZCBTZWdtZW50IFJlbmRlcmluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBmb3JlZ3JvdW5kIGV2ZW50IHNlZ21lbnRzIG9udG8gdGhlIGdyaWQuIE1heSByZXR1cm4gYSBzdWJzZXQgb2Ygc2VncyB0aGF0IHdlcmUgcmVuZGVyZWQuCglyZW5kZXJGZ1NlZ3M6IGZ1bmN0aW9uKHNlZ3MpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYWxsIGN1cnJlbnRseSByZW5kZXJlZCBmb3JlZ3JvdW5kIHNlZ21lbnRzCgl1bnJlbmRlckZnU2VnczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLy8gUmVuZGVycyBhbmQgYXNzaWducyBhbiBgZWxgIHByb3BlcnR5IGZvciBlYWNoIGZvcmVncm91bmQgZXZlbnQgc2VnbWVudC4KCS8vIE9ubHkgcmV0dXJucyBzZWdtZW50cyB0aGF0IHN1Y2Nlc3NmdWxseSByZW5kZXJlZC4KCS8vIEEgdXRpbGl0eSB0aGF0IHN1YmNsYXNzZXMgbWF5IHVzZS4KCXJlbmRlckZnU2VnRWxzOiBmdW5jdGlvbihzZWdzLCBkaXNhYmxlUmVzaXppbmcpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgaHRtbCA9ICcnOwoJCXZhciByZW5kZXJlZFNlZ3MgPSBbXTsKCQl2YXIgaTsKCgkJaWYgKHNlZ3MubGVuZ3RoKSB7IC8vIGRvbid0IGJ1aWxkIGFuIGVtcHR5IGh0bWwgc3RyaW5nCgoJCQkvLyBidWlsZCBhIGxhcmdlIGNvbmNhdGVuYXRpb24gb2YgZXZlbnQgc2VnbWVudCBIVE1MCgkJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCQlodG1sICs9IHRoaXMuZmdTZWdIdG1sKHNlZ3NbaV0sIGRpc2FibGVSZXNpemluZyk7CgkJCX0KCgkJCS8vIEdyYWIgaW5kaXZpZHVhbCBlbGVtZW50cyBmcm9tIHRoZSBjb21iaW5lZCBIVE1MIHN0cmluZy4gVXNlIGVhY2ggYXMgdGhlIGRlZmF1bHQgcmVuZGVyaW5nLgoJCQkvLyBUaGVuLCBjb21wdXRlIHRoZSAnZWwnIGZvciBlYWNoIHNlZ21lbnQuIEFuIGVsIG1pZ2h0IGJlIG51bGwgaWYgdGhlIGV2ZW50UmVuZGVyIGNhbGxiYWNrIHJldHVybmVkIGZhbHNlLgoJCQkkKGh0bWwpLmVhY2goZnVuY3Rpb24oaSwgbm9kZSkgewoJCQkJdmFyIHNlZyA9IHNlZ3NbaV07CgkJCQl2YXIgZWwgPSB2aWV3LnJlc29sdmVFdmVudEVsKHNlZy5ldmVudCwgJChub2RlKSk7CgoJCQkJaWYgKGVsKSB7CgkJCQkJZWwuZGF0YSgnZmMtc2VnJywgc2VnKTsgLy8gdXNlZCBieSBoYW5kbGVycwoJCQkJCXNlZy5lbCA9IGVsOwoJCQkJCXJlbmRlcmVkU2Vncy5wdXNoKHNlZyk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJlbmRlcmVkU2VnczsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIG9mIGEgZm9yZWdyb3VuZCBldmVudCBzZWdtZW50LiBVc2VkIGJ5IHJlbmRlckZnU2VnRWxzKCkKCWZnU2VnSHRtbDogZnVuY3Rpb24oc2VnLCBkaXNhYmxlUmVzaXppbmcpIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8qIEJhY2tncm91bmQgU2VnbWVudCBSZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgdGhlIGdpdmVuIGJhY2tncm91bmQgZXZlbnQgc2VnbWVudHMgb250byB0aGUgZ3JpZC4KCS8vIFJldHVybnMgYSBzdWJzZXQgb2YgdGhlIHNlZ3MgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlbmRlcmVkLgoJcmVuZGVyQmdTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJcmV0dXJuIHRoaXMucmVuZGVyRmlsbCgnYmdFdmVudCcsIHNlZ3MpOwoJfSwKCgoJLy8gVW5yZW5kZXJzIGFsbCB0aGUgY3VycmVudGx5IHJlbmRlcmVkIGJhY2tncm91bmQgZXZlbnQgc2VnbWVudHMKCXVucmVuZGVyQmdTZWdzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVyRmlsbCgnYmdFdmVudCcpOwoJfSwKCgoJLy8gUmVuZGVycyBhIGJhY2tncm91bmQgZXZlbnQgZWxlbWVudCwgZ2l2ZW4gdGhlIGRlZmF1bHQgcmVuZGVyaW5nLiBDYWxsZWQgYnkgdGhlIGZpbGwgc3lzdGVtLgoJYmdFdmVudFNlZ0VsOiBmdW5jdGlvbihzZWcsIGVsKSB7CgkJcmV0dXJuIHRoaXMudmlldy5yZXNvbHZlRXZlbnRFbChzZWcuZXZlbnQsIGVsKTsgLy8gd2lsbCBmaWx0ZXIgdGhyb3VnaCBldmVudFJlbmRlcgoJfSwKCgoJLy8gR2VuZXJhdGVzIGFuIGFycmF5IG9mIGNsYXNzTmFtZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIG9mIGEgYmFja2dyb3VuZCBldmVudC4KCS8vIENhbGxlZCBieSBmaWxsU2VnSHRtbC4KCWJnRXZlbnRTZWdDbGFzc2VzOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIHNvdXJjZSA9IGV2ZW50LnNvdXJjZSB8fCB7fTsKCgkJcmV0dXJuIFsgJ2ZjLWJnZXZlbnQnIF0uY29uY2F0KAoJCQlldmVudC5jbGFzc05hbWUsCgkJCXNvdXJjZS5jbGFzc05hbWUgfHwgW10KCQkpOwoJfSwKCgoJLy8gR2VuZXJhdGVzIGEgc2VtaWNvbG9uLXNlcGFyYXRlZCBDU1Mgc3RyaW5nIHRvIGJlIHVzZWQgZm9yIHRoZSBkZWZhdWx0IHJlbmRlcmluZyBvZiBhIGJhY2tncm91bmQgZXZlbnQuCgkvLyBDYWxsZWQgYnkgZmlsbFNlZ0h0bWwuCgliZ0V2ZW50U2VnQ3NzOiBmdW5jdGlvbihzZWcpIHsKCQlyZXR1cm4gewoJCQknYmFja2dyb3VuZC1jb2xvcic6IHRoaXMuZ2V0U2VnU2tpbkNzcyhzZWcpWydiYWNrZ3JvdW5kLWNvbG9yJ10KCQl9OwoJfSwKCgoJLy8gR2VuZXJhdGVzIGFuIGFycmF5IG9mIGNsYXNzTmFtZXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlbmRlcmluZyBidXNpbmVzcyBob3VycyBvdmVybGF5LiBDYWxsZWQgYnkgdGhlIGZpbGwgc3lzdGVtLgoJLy8gQ2FsbGVkIGJ5IGZpbGxTZWdIdG1sLgoJYnVzaW5lc3NIb3Vyc1NlZ0NsYXNzZXM6IGZ1bmN0aW9uKHNlZykgewoJCXJldHVybiBbICdmYy1ub25idXNpbmVzcycsICdmYy1iZ2V2ZW50JyBdOwoJfSwKCgoJLyogQnVzaW5lc3MgSG91cnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENvbXB1dGUgYnVzaW5lc3MgaG91ciBzZWdzIGZvciB0aGUgZ3JpZCdzIGN1cnJlbnQgZGF0ZSByYW5nZS4KCS8vIENhbGxlciBtdXN0IGFzayBpZiB3aG9sZS1kYXkgYnVzaW5lc3MgaG91cnMgYXJlIG5lZWRlZC4KCWJ1aWxkQnVzaW5lc3NIb3VyU2VnczogZnVuY3Rpb24od2hvbGVEYXkpIHsKCQl2YXIgZXZlbnRzID0gdGhpcy52aWV3LmNhbGVuZGFyLmdldEN1cnJlbnRCdXNpbmVzc0hvdXJFdmVudHMod2hvbGVEYXkpOwoKCQkvLyBIQUNLLiBFdmVudHVhbGx5IHJlZmFjdG9yIGJ1c2luZXNzIGhvdXJzICJldmVudHMiIHN5c3RlbS4KCQkvLyBJZiBubyBldmVudHMgYXJlIGdpdmVuLCBidXQgYnVzaW5lc3NIb3VycyBpcyBhY3RpdmF0ZWQsIHRoaXMgbWVhbnMgdGhlIGVudGlyZSB2aXNpYmxlIHJhbmdlIHNob3VsZCBiZQoJCS8vIG1hcmtlZCBhcyAqbm90KiBidXNpbmVzcy1ob3VycywgdmlhIGludmVyc2UtYmFja2dyb3VuZCByZW5kZXJpbmcuCgkJaWYgKAoJCQkhZXZlbnRzLmxlbmd0aCAmJgoJCQl0aGlzLnZpZXcuY2FsZW5kYXIub3B0aW9ucy5idXNpbmVzc0hvdXJzIC8vIGRvbid0IGFjY2VzcyB2aWV3IG9wdGlvbi4gZG9lc24ndCB1cGRhdGUgd2l0aCBkeW5hbWljIG9wdGlvbnMKCQkpIHsKCQkJZXZlbnRzID0gWwoJCQkJJC5leHRlbmQoe30sIEJVU0lORVNTX0hPVVJfRVZFTlRfREVGQVVMVFMsIHsKCQkJCQlzdGFydDogdGhpcy52aWV3LmVuZCwgLy8gZ3VhcmFudGVlZCBvdXQtb2YtcmFuZ2UKCQkJCQllbmQ6IHRoaXMudmlldy5lbmQsICAgLy8gIgoJCQkJCWRvdzogbnVsbAoJCQkJfSkKCQkJXTsKCQl9CgoJCXJldHVybiB0aGlzLmV2ZW50c1RvU2VncyhldmVudHMpOwoJfSwKCgoJLyogSGFuZGxlcnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEF0dGFjaGVzIGV2ZW50LWVsZW1lbnQtcmVsYXRlZCBoYW5kbGVycyBmb3IgKmFsbCogcmVuZGVyZWQgZXZlbnQgc2VnbWVudHMgb2YgdGhlIHZpZXcuCgliaW5kU2VnSGFuZGxlcnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuYmluZFNlZ0hhbmRsZXJzVG9FbCh0aGlzLmVsKTsKCX0sCgoKCS8vIEF0dGFjaGVzIGV2ZW50LWVsZW1lbnQtcmVsYXRlZCBoYW5kbGVycyB0byBhbiBhcmJpdHJhcnkgY29udGFpbmVyIGVsZW1lbnQuIGxldmVyYWdlcyBidWJibGluZy4KCWJpbmRTZWdIYW5kbGVyc1RvRWw6IGZ1bmN0aW9uKGVsKSB7CgkJdGhpcy5iaW5kU2VnSGFuZGxlclRvRWwoZWwsICd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVTZWdUb3VjaFN0YXJ0KTsKCQl0aGlzLmJpbmRTZWdIYW5kbGVyVG9FbChlbCwgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVTZWdUb3VjaEVuZCk7CgkJdGhpcy5iaW5kU2VnSGFuZGxlclRvRWwoZWwsICdtb3VzZWVudGVyJywgdGhpcy5oYW5kbGVTZWdNb3VzZW92ZXIpOwoJCXRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKGVsLCAnbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlU2VnTW91c2VvdXQpOwoJCXRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKGVsLCAnbW91c2Vkb3duJywgdGhpcy5oYW5kbGVTZWdNb3VzZWRvd24pOwoJCXRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKGVsLCAnY2xpY2snLCB0aGlzLmhhbmRsZVNlZ0NsaWNrKTsKCX0sCgoKCS8vIEV4ZWN1dGVzIGEgaGFuZGxlciBmb3IgYW55IGEgdXNlci1pbnRlcmFjdGlvbiBvbiBhIHNlZ21lbnQuCgkvLyBIYW5kbGVyIGdldHMgY2FsbGVkIHdpdGggKHNlZywgZXYpLCBhbmQgd2l0aCB0aGUgYHRoaXNgIGNvbnRleHQgb2YgdGhlIEdyaWQKCWJpbmRTZWdIYW5kbGVyVG9FbDogZnVuY3Rpb24oZWwsIG5hbWUsIGhhbmRsZXIpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoKCQllbC5vbihuYW1lLCB0aGlzLnNlZ1NlbGVjdG9yLCBmdW5jdGlvbihldikgewoJCQl2YXIgc2VnID0gJCh0aGlzKS5kYXRhKCdmYy1zZWcnKTsgLy8gZ3JhYiBzZWdtZW50IGRhdGEuIHB1dCB0aGVyZSBieSBWaWV3OjpyZW5kZXJFdmVudHMKCgkJCS8vIG9ubHkgY2FsbCB0aGUgaGFuZGxlcnMgaWYgdGhlcmUgaXMgbm90IGEgZHJhZy9yZXNpemUgaW4gcHJvZ3Jlc3MKCQkJaWYgKHNlZyAmJiAhX3RoaXMuaXNEcmFnZ2luZ1NlZyAmJiAhX3RoaXMuaXNSZXNpemluZ1NlZykgewoJCQkJcmV0dXJuIGhhbmRsZXIuY2FsbChfdGhpcywgc2VnLCBldik7IC8vIGNvbnRleHQgd2lsbCBiZSB0aGUgR3JpZAoJCQl9CgkJfSk7Cgl9LAoKCgloYW5kbGVTZWdDbGljazogZnVuY3Rpb24oc2VnLCBldikgewoJCXZhciByZXMgPSB0aGlzLnZpZXcudHJpZ2dlcignZXZlbnRDbGljaycsIHNlZy5lbFswXSwgc2VnLmV2ZW50LCBldik7IC8vIGNhbiByZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwKCQlpZiAocmVzID09PSBmYWxzZSkgewoJCQlldi5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCX0sCgoKCS8vIFVwZGF0ZXMgaW50ZXJuYWwgc3RhdGUgYW5kIHRyaWdnZXJzIGhhbmRsZXJzIGZvciB3aGVuIGFuIGV2ZW50IGVsZW1lbnQgaXMgbW91c2VkIG92ZXIKCWhhbmRsZVNlZ01vdXNlb3ZlcjogZnVuY3Rpb24oc2VnLCBldikgewoJCWlmICgKCQkJIXRoaXMuaXNJZ25vcmluZ01vdXNlICYmCgkJCSF0aGlzLm1vdXNlZE92ZXJTZWcKCQkpIHsKCQkJdGhpcy5tb3VzZWRPdmVyU2VnID0gc2VnOwoJCQlpZiAodGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGUoc2VnLmV2ZW50KSkgewoJCQkJc2VnLmVsLmFkZENsYXNzKCdmYy1hbGxvdy1tb3VzZS1yZXNpemUnKTsKCQkJfQoJCQl0aGlzLnZpZXcudHJpZ2dlcignZXZlbnRNb3VzZW92ZXInLCBzZWcuZWxbMF0sIHNlZy5ldmVudCwgZXYpOwoJCX0KCX0sCgoKCS8vIFVwZGF0ZXMgaW50ZXJuYWwgc3RhdGUgYW5kIHRyaWdnZXJzIGhhbmRsZXJzIGZvciB3aGVuIGFuIGV2ZW50IGVsZW1lbnQgaXMgbW91c2VkIG91dC4KCS8vIENhbiBiZSBnaXZlbiBubyBhcmd1bWVudHMsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBtb3VzZW91dCB0aGUgc2VnbWVudCB0aGF0IHdhcyBwcmV2aW91c2x5IG1vdXNlZCBvdmVyLgoJaGFuZGxlU2VnTW91c2VvdXQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQlldiA9IGV2IHx8IHt9OyAvLyBpZiBnaXZlbiBubyBhcmdzLCBtYWtlIGEgbW9jayBtb3VzZSBldmVudAoKCQlpZiAodGhpcy5tb3VzZWRPdmVyU2VnKSB7CgkJCXNlZyA9IHNlZyB8fCB0aGlzLm1vdXNlZE92ZXJTZWc7IC8vIGlmIGdpdmVuIG5vIGFyZ3MsIHVzZSB0aGUgY3VycmVudGx5IG1vdXNlZC1vdmVyIHNlZ21lbnQKCQkJdGhpcy5tb3VzZWRPdmVyU2VnID0gbnVsbDsKCQkJaWYgKHRoaXMudmlldy5pc0V2ZW50UmVzaXphYmxlKHNlZy5ldmVudCkpIHsKCQkJCXNlZy5lbC5yZW1vdmVDbGFzcygnZmMtYWxsb3ctbW91c2UtcmVzaXplJyk7CgkJCX0KCQkJdGhpcy52aWV3LnRyaWdnZXIoJ2V2ZW50TW91c2VvdXQnLCBzZWcuZWxbMF0sIHNlZy5ldmVudCwgZXYpOwoJCX0KCX0sCgoKCWhhbmRsZVNlZ01vdXNlZG93bjogZnVuY3Rpb24oc2VnLCBldikgewoJCXZhciBpc1Jlc2l6aW5nID0gdGhpcy5zdGFydFNlZ1Jlc2l6ZShzZWcsIGV2LCB7IGRpc3RhbmNlOiA1IH0pOwoKCQlpZiAoIWlzUmVzaXppbmcgJiYgdGhpcy52aWV3LmlzRXZlbnREcmFnZ2FibGUoc2VnLmV2ZW50KSkgewoJCQl0aGlzLmJ1aWxkU2VnRHJhZ0xpc3RlbmVyKHNlZykKCQkJCS5zdGFydEludGVyYWN0aW9uKGV2LCB7CgkJCQkJZGlzdGFuY2U6IDUKCQkJCX0pOwoJCX0KCX0sCgoKCWhhbmRsZVNlZ1RvdWNoU3RhcnQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIGlzU2VsZWN0ZWQgPSB2aWV3LmlzRXZlbnRTZWxlY3RlZChldmVudCk7CgkJdmFyIGlzRHJhZ2dhYmxlID0gdmlldy5pc0V2ZW50RHJhZ2dhYmxlKGV2ZW50KTsKCQl2YXIgaXNSZXNpemFibGUgPSB2aWV3LmlzRXZlbnRSZXNpemFibGUoZXZlbnQpOwoJCXZhciBpc1Jlc2l6aW5nID0gZmFsc2U7CgkJdmFyIGRyYWdMaXN0ZW5lcjsKCgkJaWYgKGlzU2VsZWN0ZWQgJiYgaXNSZXNpemFibGUpIHsKCQkJLy8gb25seSBhbGxvdyByZXNpemluZyBvZiB0aGUgZXZlbnQgaXMgc2VsZWN0ZWQKCQkJaXNSZXNpemluZyA9IHRoaXMuc3RhcnRTZWdSZXNpemUoc2VnLCBldik7CgkJfQoKCQlpZiAoIWlzUmVzaXppbmcgJiYgKGlzRHJhZ2dhYmxlIHx8IGlzUmVzaXphYmxlKSkgeyAvLyBhbGxvd2VkIHRvIGJlIHNlbGVjdGVkPwoKCQkJZHJhZ0xpc3RlbmVyID0gaXNEcmFnZ2FibGUgPwoJCQkJdGhpcy5idWlsZFNlZ0RyYWdMaXN0ZW5lcihzZWcpIDoKCQkJCXRoaXMuYnVpbGRTZWdTZWxlY3RMaXN0ZW5lcihzZWcpOyAvLyBzZWcgaXNuJ3QgZHJhZ2dhYmxlLCBidXQgc3RpbGwgbmVlZHMgdG8gYmUgc2VsZWN0ZWQKCgkJCWRyYWdMaXN0ZW5lci5zdGFydEludGVyYWN0aW9uKGV2LCB7IC8vIHdvbid0IHN0YXJ0IGlmIGFscmVhZHkgc3RhcnRlZAoJCQkJZGVsYXk6IGlzU2VsZWN0ZWQgPyAwIDogdGhpcy52aWV3Lm9wdCgnbG9uZ1ByZXNzRGVsYXknKSAvLyBkbyBkZWxheSBpZiBub3QgYWxyZWFkeSBzZWxlY3RlZAoJCQl9KTsKCQl9CgoJCS8vIGEgbG9uZyB0YXAgc2ltdWxhdGVzIGEgbW91c2VvdmVyLiBpZ25vcmUgdGhpcyBib2d1cyBtb3VzZW92ZXIuCgkJdGhpcy50ZW1wSWdub3JlTW91c2UoKTsKCX0sCgoKCWhhbmRsZVNlZ1RvdWNoRW5kOiBmdW5jdGlvbihzZWcsIGV2KSB7CgkJLy8gdG91Y2hzdGFydCt0b3VjaGVuZCA9IGNsaWNrLCB3aGljaCBzaW11bGF0ZXMgYSBtb3VzZW92ZXIuCgkJLy8gaWdub3JlIHRoaXMgYm9ndXMgbW91c2VvdmVyLgoJCXRoaXMudGVtcElnbm9yZU1vdXNlKCk7Cgl9LAoKCgkvLyByZXR1cm5zIGJvb2xlYW4gd2hldGhlciByZXNpemluZyBhY3R1YWxseSBzdGFydGVkIG9yIG5vdC4KCS8vIGFzc3VtZXMgdGhlIHNlZyBhbGxvd3MgcmVzaXppbmcuCgkvLyBgZHJhZ09wdGlvbnNgIGFyZSBvcHRpb25hbC4KCXN0YXJ0U2VnUmVzaXplOiBmdW5jdGlvbihzZWcsIGV2LCBkcmFnT3B0aW9ucykgewoJCWlmICgkKGV2LnRhcmdldCkuaXMoJy5mYy1yZXNpemVyJykpIHsKCQkJdGhpcy5idWlsZFNlZ1Jlc2l6ZUxpc3RlbmVyKHNlZywgJChldi50YXJnZXQpLmlzKCcuZmMtc3RhcnQtcmVzaXplcicpKQoJCQkJLnN0YXJ0SW50ZXJhY3Rpb24oZXYsIGRyYWdPcHRpb25zKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0sCgoKCgkvKiBFdmVudCBEcmFnZ2luZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQnVpbGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIHRyYWNrIHVzZXItZHJhZ2dpbmcgb24gYW4gZXZlbnQgc2VnbWVudC4KCS8vIEdlbmVyaWMgZW5vdWdoIHRvIHdvcmsgd2l0aCBhbnkgdHlwZSBvZiBHcmlkLgoJLy8gSGFzIHNpZGUgZWZmZWN0IG9mIHNldHRpbmcvdW5zZXR0aW5nIGBzZWdEcmFnTGlzdGVuZXJgCglidWlsZFNlZ0RyYWdMaXN0ZW5lcjogZnVuY3Rpb24oc2VnKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgY2FsZW5kYXIgPSB2aWV3LmNhbGVuZGFyOwoJCXZhciBlbCA9IHNlZy5lbDsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIGlzRHJhZ2dpbmc7CgkJdmFyIG1vdXNlRm9sbG93ZXI7IC8vIEEgY2xvbmUgb2YgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdGhhdCB3aWxsIG1vdmUgd2l0aCB0aGUgbW91c2UKCQl2YXIgZHJvcExvY2F0aW9uOyAvLyB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMKCgkJaWYgKHRoaXMuc2VnRHJhZ0xpc3RlbmVyKSB7CgkJCXJldHVybiB0aGlzLnNlZ0RyYWdMaXN0ZW5lcjsKCQl9CgoJCS8vIFRyYWNrcyBtb3VzZSBtb3ZlbWVudCBvdmVyIHRoZSAqdmlldydzKiBjb29yZGluYXRlIG1hcC4gQWxsb3dzIGRyYWdnaW5nIGFuZCBkcm9wcGluZyBiZXR3ZWVuIHN1YmNvbXBvbmVudHMKCQkvLyBvZiB0aGUgdmlldy4KCQl2YXIgZHJhZ0xpc3RlbmVyID0gdGhpcy5zZWdEcmFnTGlzdGVuZXIgPSBuZXcgSGl0RHJhZ0xpc3RlbmVyKHZpZXcsIHsKCQkJc2Nyb2xsOiB2aWV3Lm9wdCgnZHJhZ1Njcm9sbCcpLAoJCQlzdWJqZWN0RWw6IGVsLAoJCQlzdWJqZWN0Q2VudGVyOiB0cnVlLAoJCQlpbnRlcmFjdGlvblN0YXJ0OiBmdW5jdGlvbihldikgewoJCQkJc2VnLmNvbXBvbmVudCA9IF90aGlzOyAvLyBmb3IgcmVuZGVyRHJhZwoJCQkJaXNEcmFnZ2luZyA9IGZhbHNlOwoJCQkJbW91c2VGb2xsb3dlciA9IG5ldyBNb3VzZUZvbGxvd2VyKHNlZy5lbCwgewoJCQkJCWFkZGl0aW9uYWxDbGFzczogJ2ZjLWRyYWdnaW5nJywKCQkJCQlwYXJlbnRFbDogdmlldy5lbCwKCQkJCQlvcGFjaXR5OiBkcmFnTGlzdGVuZXIuaXNUb3VjaCA/IG51bGwgOiB2aWV3Lm9wdCgnZHJhZ09wYWNpdHknKSwKCQkJCQlyZXZlcnREdXJhdGlvbjogdmlldy5vcHQoJ2RyYWdSZXZlcnREdXJhdGlvbicpLAoJCQkJCXpJbmRleDogMiAvLyBvbmUgYWJvdmUgdGhlIC5mYy12aWV3CgkJCQl9KTsKCQkJCW1vdXNlRm9sbG93ZXIuaGlkZSgpOyAvLyBkb24ndCBzaG93IHVudGlsIHdlIGtub3cgdGhpcyBpcyBhIHJlYWwgZHJhZwoJCQkJbW91c2VGb2xsb3dlci5zdGFydChldik7CgkJCX0sCgkJCWRyYWdTdGFydDogZnVuY3Rpb24oZXYpIHsKCQkJCWlmIChkcmFnTGlzdGVuZXIuaXNUb3VjaCAmJiAhdmlldy5pc0V2ZW50U2VsZWN0ZWQoZXZlbnQpKSB7CgkJCQkJLy8gaWYgbm90IHByZXZpb3VzbHkgc2VsZWN0ZWQsIHdpbGwgZmlyZSBhZnRlciBhIGRlbGF5LiB0aGVuLCBzZWxlY3QgdGhlIGV2ZW50CgkJCQkJdmlldy5zZWxlY3RFdmVudChldmVudCk7CgkJCQl9CgkJCQlpc0RyYWdnaW5nID0gdHJ1ZTsKCQkJCV90aGlzLmhhbmRsZVNlZ01vdXNlb3V0KHNlZywgZXYpOyAvLyBlbnN1cmUgYSBtb3VzZW91dCBvbiB0aGUgbWFuaXB1bGF0ZWQgZXZlbnQgaGFzIGJlZW4gcmVwb3J0ZWQKCQkJCV90aGlzLnNlZ0RyYWdTdGFydChzZWcsIGV2KTsKCQkJCXZpZXcuaGlkZUV2ZW50KGV2ZW50KTsgLy8gaGlkZSBhbGwgZXZlbnQgc2VnbWVudHMuIG91ciBtb3VzZUZvbGxvd2VyIHdpbGwgdGFrZSBvdmVyCgkJCX0sCgkJCWhpdE92ZXI6IGZ1bmN0aW9uKGhpdCwgaXNPcmlnLCBvcmlnSGl0KSB7CgkJCQl2YXIgZHJhZ0hlbHBlckVsczsKCgkJCQkvLyBzdGFydGluZyBoaXQgY291bGQgYmUgZm9yY2VkIChEYXlHcmlkLmxpbWl0KQoJCQkJaWYgKHNlZy5oaXQpIHsKCQkJCQlvcmlnSGl0ID0gc2VnLmhpdDsKCQkJCX0KCgkJCQkvLyBzaW5jZSB3ZSBhcmUgcXVlcnlpbmcgdGhlIHBhcmVudCB2aWV3LCBtaWdodCBub3QgYmVsb25nIHRvIHRoaXMgZ3JpZAoJCQkJZHJvcExvY2F0aW9uID0gX3RoaXMuY29tcHV0ZUV2ZW50RHJvcCgKCQkJCQlvcmlnSGl0LmNvbXBvbmVudC5nZXRIaXRTcGFuKG9yaWdIaXQpLAoJCQkJCWhpdC5jb21wb25lbnQuZ2V0SGl0U3BhbihoaXQpLAoJCQkJCWV2ZW50CgkJCQkpOwoKCQkJCWlmIChkcm9wTG9jYXRpb24gJiYgIWNhbGVuZGFyLmlzRXZlbnRTcGFuQWxsb3dlZChfdGhpcy5ldmVudFRvU3Bhbihkcm9wTG9jYXRpb24pLCBldmVudCkpIHsKCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJZHJvcExvY2F0aW9uID0gbnVsbDsKCQkJCX0KCgkJCQkvLyBpZiBhIHZhbGlkIGRyb3AgbG9jYXRpb24sIGhhdmUgdGhlIHN1YmNsYXNzIHJlbmRlciBhIHZpc3VhbCBpbmRpY2F0aW9uCgkJCQlpZiAoZHJvcExvY2F0aW9uICYmIChkcmFnSGVscGVyRWxzID0gdmlldy5yZW5kZXJEcmFnKGRyb3BMb2NhdGlvbiwgc2VnKSkpIHsKCgkJCQkJZHJhZ0hlbHBlckVscy5hZGRDbGFzcygnZmMtZHJhZ2dpbmcnKTsKCQkJCQlpZiAoIWRyYWdMaXN0ZW5lci5pc1RvdWNoKSB7CgkJCQkJCV90aGlzLmFwcGx5RHJhZ09wYWNpdHkoZHJhZ0hlbHBlckVscyk7CgkJCQkJfQoKCQkJCQltb3VzZUZvbGxvd2VyLmhpZGUoKTsgLy8gaWYgdGhlIHN1YmNsYXNzIGlzIGFscmVhZHkgdXNpbmcgYSBtb2NrIGV2ZW50ICJoZWxwZXIiLCBoaWRlIG91ciBvd24KCQkJCX0KCQkJCWVsc2UgewoJCQkJCW1vdXNlRm9sbG93ZXIuc2hvdygpOyAvLyBvdGhlcndpc2UsIGhhdmUgdGhlIGhlbHBlciBmb2xsb3cgdGhlIG1vdXNlIChubyBzbmFwcGluZykKCQkJCX0KCgkJCQlpZiAoaXNPcmlnKSB7CgkJCQkJZHJvcExvY2F0aW9uID0gbnVsbDsgLy8gbmVlZHMgdG8gaGF2ZSBtb3ZlZCBoaXRzIHRvIGJlIGEgdmFsaWQgZHJvcAoJCQkJfQoJCQl9LAoJCQloaXRPdXQ6IGZ1bmN0aW9uKCkgeyAvLyBjYWxsZWQgYmVmb3JlIG1vdXNlIG1vdmVzIHRvIGEgZGlmZmVyZW50IGhpdCBPUiBtb3ZlZCBvdXQgb2YgYWxsIGhpdHMKCQkJCXZpZXcudW5yZW5kZXJEcmFnKCk7IC8vIHVucmVuZGVyIHdoYXRldmVyIHdhcyBkb25lIGluIHJlbmRlckRyYWcKCQkJCW1vdXNlRm9sbG93ZXIuc2hvdygpOyAvLyBzaG93IGluIGNhc2Ugd2UgYXJlIG1vdmluZyBvdXQgb2YgYWxsIGhpdHMKCQkJCWRyb3BMb2NhdGlvbiA9IG51bGw7CgkJCX0sCgkJCWhpdERvbmU6IGZ1bmN0aW9uKCkgeyAvLyBDYWxsZWQgYWZ0ZXIgYSBoaXRPdXQgT1IgYmVmb3JlIGEgZHJhZ0VuZAoJCQkJZW5hYmxlQ3Vyc29yKCk7CgkJCX0sCgkJCWludGVyYWN0aW9uRW5kOiBmdW5jdGlvbihldikgewoJCQkJZGVsZXRlIHNlZy5jb21wb25lbnQ7IC8vIHByZXZlbnQgc2lkZSBlZmZlY3RzCgoJCQkJLy8gZG8gcmV2ZXJ0IGFuaW1hdGlvbiBpZiBoYXNuJ3QgY2hhbmdlZC4gY2FsbHMgYSBjYWxsYmFjayB3aGVuIGZpbmlzaGVkICh3aGV0aGVyIGFuaW1hdGlvbiBvciBub3QpCgkJCQltb3VzZUZvbGxvd2VyLnN0b3AoIWRyb3BMb2NhdGlvbiwgZnVuY3Rpb24oKSB7CgkJCQkJaWYgKGlzRHJhZ2dpbmcpIHsKCQkJCQkJdmlldy51bnJlbmRlckRyYWcoKTsKCQkJCQkJdmlldy5zaG93RXZlbnQoZXZlbnQpOwoJCQkJCQlfdGhpcy5zZWdEcmFnU3RvcChzZWcsIGV2KTsKCQkJCQl9CgkJCQkJaWYgKGRyb3BMb2NhdGlvbikgewoJCQkJCQl2aWV3LnJlcG9ydEV2ZW50RHJvcChldmVudCwgZHJvcExvY2F0aW9uLCB0aGlzLmxhcmdlVW5pdCwgZWwsIGV2KTsKCQkJCQl9CgkJCQl9KTsKCQkJCV90aGlzLnNlZ0RyYWdMaXN0ZW5lciA9IG51bGw7CgkJCX0KCQl9KTsKCgkJcmV0dXJuIGRyYWdMaXN0ZW5lcjsKCX0sCgoKCS8vIHNlZyBpc24ndCBkcmFnZ2FibGUsIGJ1dCBsZXQncyB1c2UgYSBnZW5lcmljIERyYWdMaXN0ZW5lcgoJLy8gc2ltcGx5IGZvciB0aGUgZGVsYXksIHNvIGl0IGNhbiBiZSBzZWxlY3RlZC4KCS8vIEhhcyBzaWRlIGVmZmVjdCBvZiBzZXR0aW5nL3Vuc2V0dGluZyBgc2VnRHJhZ0xpc3RlbmVyYAoJYnVpbGRTZWdTZWxlY3RMaXN0ZW5lcjogZnVuY3Rpb24oc2VnKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgoJCWlmICh0aGlzLnNlZ0RyYWdMaXN0ZW5lcikgewoJCQlyZXR1cm4gdGhpcy5zZWdEcmFnTGlzdGVuZXI7CgkJfQoKCQl2YXIgZHJhZ0xpc3RlbmVyID0gdGhpcy5zZWdEcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHsKCQkJZHJhZ1N0YXJ0OiBmdW5jdGlvbihldikgewoJCQkJaWYgKGRyYWdMaXN0ZW5lci5pc1RvdWNoICYmICF2aWV3LmlzRXZlbnRTZWxlY3RlZChldmVudCkpIHsKCQkJCQkvLyBpZiBub3QgcHJldmlvdXNseSBzZWxlY3RlZCwgd2lsbCBmaXJlIGFmdGVyIGEgZGVsYXkuIHRoZW4sIHNlbGVjdCB0aGUgZXZlbnQKCQkJCQl2aWV3LnNlbGVjdEV2ZW50KGV2ZW50KTsKCQkJCX0KCQkJfSwKCQkJaW50ZXJhY3Rpb25FbmQ6IGZ1bmN0aW9uKGV2KSB7CgkJCQlfdGhpcy5zZWdEcmFnTGlzdGVuZXIgPSBudWxsOwoJCQl9CgkJfSk7CgoJCXJldHVybiBkcmFnTGlzdGVuZXI7Cgl9LAoKCgkvLyBDYWxsZWQgYmVmb3JlIGV2ZW50IHNlZ21lbnQgZHJhZ2dpbmcgc3RhcnRzCglzZWdEcmFnU3RhcnQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl0aGlzLmlzRHJhZ2dpbmdTZWcgPSB0cnVlOwoJCXRoaXMudmlldy50cmlnZ2VyKCdldmVudERyYWdTdGFydCcsIHNlZy5lbFswXSwgc2VnLmV2ZW50LCBldiwge30pOyAvLyBsYXN0IGFyZ3VtZW50IGlzIGpxdWkgZHVtbXkKCX0sCgoKCS8vIENhbGxlZCBhZnRlciBldmVudCBzZWdtZW50IGRyYWdnaW5nIHN0b3BzCglzZWdEcmFnU3RvcDogZnVuY3Rpb24oc2VnLCBldikgewoJCXRoaXMuaXNEcmFnZ2luZ1NlZyA9IGZhbHNlOwoJCXRoaXMudmlldy50cmlnZ2VyKCdldmVudERyYWdTdG9wJywgc2VnLmVsWzBdLCBzZWcuZXZlbnQsIGV2LCB7fSk7IC8vIGxhc3QgYXJndW1lbnQgaXMganF1aSBkdW1teQoJfSwKCgoJLy8gR2l2ZW4gdGhlIHNwYW5zIGFuIGV2ZW50IGRyYWcgYmVnYW4sIGFuZCB0aGUgc3BhbiBldmVudCB3YXMgZHJvcHBlZCwgY2FsY3VsYXRlcyB0aGUgbmV3IHpvbmVkIHN0YXJ0L2VuZC9hbGxEYXkKCS8vIHZhbHVlcyBmb3IgdGhlIGV2ZW50LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBhbmQgc2V0IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSB1c2VkIGJ5IHJlbmRlckRyYWcuCgkvLyBBIGZhbHN5IHJldHVybmVkIHZhbHVlIGluZGljYXRlcyBhbiBpbnZhbGlkIGRyb3AuCgkvLyBET0VTIE5PVCBjb25zaWRlciBvdmVybGFwL2NvbnN0cmFpbnQuCgljb21wdXRlRXZlbnREcm9wOiBmdW5jdGlvbihzdGFydFNwYW4sIGVuZFNwYW4sIGV2ZW50KSB7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy52aWV3LmNhbGVuZGFyOwoJCXZhciBkcmFnU3RhcnQgPSBzdGFydFNwYW4uc3RhcnQ7CgkJdmFyIGRyYWdFbmQgPSBlbmRTcGFuLnN0YXJ0OwoJCXZhciBkZWx0YTsKCQl2YXIgZHJvcExvY2F0aW9uOyAvLyB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMKCgkJaWYgKGRyYWdTdGFydC5oYXNUaW1lKCkgPT09IGRyYWdFbmQuaGFzVGltZSgpKSB7CgkJCWRlbHRhID0gdGhpcy5kaWZmRGF0ZXMoZHJhZ0VuZCwgZHJhZ1N0YXJ0KTsKCgkJCS8vIGlmIGFuIGFsbC1kYXkgZXZlbnQgd2FzIGluIGEgdGltZWQgYXJlYSBhbmQgaXQgd2FzIGRyYWdnZWQgdG8gYSBkaWZmZXJlbnQgdGltZSwKCQkJLy8gZ3VhcmFudGVlIGFuIGVuZCBhbmQgYWRqdXN0IHN0YXJ0L2VuZCB0byBoYXZlIHRpbWVzCgkJCWlmIChldmVudC5hbGxEYXkgJiYgZHVyYXRpb25IYXNUaW1lKGRlbHRhKSkgewoJCQkJZHJvcExvY2F0aW9uID0gewoJCQkJCXN0YXJ0OiBldmVudC5zdGFydC5jbG9uZSgpLAoJCQkJCWVuZDogY2FsZW5kYXIuZ2V0RXZlbnRFbmQoZXZlbnQpLCAvLyB3aWxsIGJlIGFuIGFtYmlnIGRheQoJCQkJCWFsbERheTogZmFsc2UgLy8gZm9yIG5vcm1hbGl6ZUV2ZW50VGltZXMKCQkJCX07CgkJCQljYWxlbmRhci5ub3JtYWxpemVFdmVudFRpbWVzKGRyb3BMb2NhdGlvbik7CgkJCX0KCQkJLy8gb3RoZXdpc2UsIHdvcmsgb2ZmIGV4aXN0aW5nIHZhbHVlcwoJCQllbHNlIHsKCQkJCWRyb3BMb2NhdGlvbiA9IHBsdWNrRXZlbnREYXRlUHJvcHMoZXZlbnQpOwoJCQl9CgoJCQlkcm9wTG9jYXRpb24uc3RhcnQuYWRkKGRlbHRhKTsKCQkJaWYgKGRyb3BMb2NhdGlvbi5lbmQpIHsKCQkJCWRyb3BMb2NhdGlvbi5lbmQuYWRkKGRlbHRhKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gaWYgc3dpdGNoaW5nIGZyb20gZGF5IDwtPiB0aW1lZCwgc3RhcnQgc2hvdWxkIGJlIHJlc2V0IHRvIHRoZSBkcm9wcGVkIGRhdGUsIGFuZCB0aGUgZW5kIGNsZWFyZWQKCQkJZHJvcExvY2F0aW9uID0gewoJCQkJc3RhcnQ6IGRyYWdFbmQuY2xvbmUoKSwKCQkJCWVuZDogbnVsbCwgLy8gZW5kIHNob3VsZCBiZSBjbGVhcmVkCgkJCQlhbGxEYXk6ICFkcmFnRW5kLmhhc1RpbWUoKQoJCQl9OwoJCX0KCgkJcmV0dXJuIGRyb3BMb2NhdGlvbjsKCX0sCgoKCS8vIFV0aWxpdHkgZm9yIGFwcGx5IGRyYWdPcGFjaXR5IHRvIGEgalF1ZXJ5IHNldAoJYXBwbHlEcmFnT3BhY2l0eTogZnVuY3Rpb24oZWxzKSB7CgkJdmFyIG9wYWNpdHkgPSB0aGlzLnZpZXcub3B0KCdkcmFnT3BhY2l0eScpOwoKCQlpZiAob3BhY2l0eSAhPSBudWxsKSB7CgkJCWVscy5jc3MoJ29wYWNpdHknLCBvcGFjaXR5KTsKCQl9Cgl9LAoKCgkvKiBFeHRlcm5hbCBFbGVtZW50IERyYWdnaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBDYWxsZWQgd2hlbiBhIGpRdWVyeSBVSSBkcmFnIGlzIGluaXRpYXRlZCBhbnl3aGVyZSBpbiB0aGUgRE9NCglleHRlcm5hbERyYWdTdGFydDogZnVuY3Rpb24oZXYsIHVpKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGVsOwoJCXZhciBhY2NlcHQ7CgoJCWlmICh2aWV3Lm9wdCgnZHJvcHBhYmxlJykpIHsgLy8gb25seSBsaXN0ZW4gaWYgdGhpcyBzZXR0aW5nIGlzIG9uCgkJCWVsID0gJCgodWkgPyB1aS5pdGVtIDogbnVsbCkgfHwgZXYudGFyZ2V0KTsKCgkJCS8vIFRlc3QgdGhhdCB0aGUgZHJhZ2dlZCBlbGVtZW50IHBhc3NlcyB0aGUgZHJvcEFjY2VwdCBzZWxlY3RvciBvciBmaWx0ZXIgZnVuY3Rpb24uCgkJCS8vIEZZSSwgdGhlIGRlZmF1bHQgaXMgIioiIChtYXRjaGVzIGFsbCkKCQkJYWNjZXB0ID0gdmlldy5vcHQoJ2Ryb3BBY2NlcHQnKTsKCQkJaWYgKCQuaXNGdW5jdGlvbihhY2NlcHQpID8gYWNjZXB0LmNhbGwoZWxbMF0sIGVsKSA6IGVsLmlzKGFjY2VwdCkpIHsKCQkJCWlmICghdGhpcy5pc0RyYWdnaW5nRXh0ZXJuYWwpIHsgLy8gcHJldmVudCBkb3VibGUtbGlzdGVuaW5nIGlmIGZpcmVkIHR3aWNlCgkJCQkJdGhpcy5saXN0ZW5Ub0V4dGVybmFsRHJhZyhlbCwgZXYsIHVpKTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoKCS8vIENhbGxlZCB3aGVuIGEgalF1ZXJ5IFVJIGRyYWcgc3RhcnRzIGFuZCBpdCBuZWVkcyB0byBiZSBtb25pdG9yZWQgZm9yIGRyb3BwaW5nCglsaXN0ZW5Ub0V4dGVybmFsRHJhZzogZnVuY3Rpb24oZWwsIGV2LCB1aSkgewoJCXZhciBfdGhpcyA9IHRoaXM7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy52aWV3LmNhbGVuZGFyOwoJCXZhciBtZXRhID0gZ2V0RHJhZ2dlZEVsTWV0YShlbCk7IC8vIGV4dHJhIGRhdGEgYWJvdXQgZXZlbnQgZHJvcCwgaW5jbHVkaW5nIHBvc3NpYmxlIGV2ZW50IHRvIGNyZWF0ZQoJCXZhciBkcm9wTG9jYXRpb247IC8vIGEgbnVsbCB2YWx1ZSBzaWduYWxzIGFuIHVuc3VjY2Vzc2Z1bCBkcmFnCgoJCS8vIGxpc3RlbmVyIHRoYXQgdHJhY2tzIG1vdXNlIG1vdmVtZW50IG92ZXIgZGF0ZS1hc3NvY2lhdGVkIHBpeGVsIHJlZ2lvbnMKCQl2YXIgZHJhZ0xpc3RlbmVyID0gX3RoaXMuZXh0ZXJuYWxEcmFnTGlzdGVuZXIgPSBuZXcgSGl0RHJhZ0xpc3RlbmVyKHRoaXMsIHsKCQkJaW50ZXJhY3Rpb25TdGFydDogZnVuY3Rpb24oKSB7CgkJCQlfdGhpcy5pc0RyYWdnaW5nRXh0ZXJuYWwgPSB0cnVlOwoJCQl9LAoJCQloaXRPdmVyOiBmdW5jdGlvbihoaXQpIHsKCQkJCWRyb3BMb2NhdGlvbiA9IF90aGlzLmNvbXB1dGVFeHRlcm5hbERyb3AoCgkJCQkJaGl0LmNvbXBvbmVudC5nZXRIaXRTcGFuKGhpdCksIC8vIHNpbmNlIHdlIGFyZSBxdWVyeWluZyB0aGUgcGFyZW50IHZpZXcsIG1pZ2h0IG5vdCBiZWxvbmcgdG8gdGhpcyBncmlkCgkJCQkJbWV0YQoJCQkJKTsKCgkJCQlpZiAoIC8vIGludmFsaWQgaGl0PwoJCQkJCWRyb3BMb2NhdGlvbiAmJgoJCQkJCSFjYWxlbmRhci5pc0V4dGVybmFsU3BhbkFsbG93ZWQoX3RoaXMuZXZlbnRUb1NwYW4oZHJvcExvY2F0aW9uKSwgZHJvcExvY2F0aW9uLCBtZXRhLmV2ZW50UHJvcHMpCgkJCQkpIHsKCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJZHJvcExvY2F0aW9uID0gbnVsbDsKCQkJCX0KCgkJCQlpZiAoZHJvcExvY2F0aW9uKSB7CgkJCQkJX3RoaXMucmVuZGVyRHJhZyhkcm9wTG9jYXRpb24pOyAvLyBjYWxsZWQgd2l0aG91dCBhIHNlZyBwYXJhbWV0ZXIKCQkJCX0KCQkJfSwKCQkJaGl0T3V0OiBmdW5jdGlvbigpIHsKCQkJCWRyb3BMb2NhdGlvbiA9IG51bGw7IC8vIHNpZ25hbCB1bnN1Y2Nlc3NmdWwKCQkJfSwKCQkJaGl0RG9uZTogZnVuY3Rpb24oKSB7IC8vIENhbGxlZCBhZnRlciBhIGhpdE91dCBPUiBiZWZvcmUgYSBkcmFnRW5kCgkJCQllbmFibGVDdXJzb3IoKTsKCQkJCV90aGlzLnVucmVuZGVyRHJhZygpOwoJCQl9LAoJCQlpbnRlcmFjdGlvbkVuZDogZnVuY3Rpb24oZXYpIHsKCQkJCWlmIChkcm9wTG9jYXRpb24pIHsgLy8gZWxlbWVudCB3YXMgZHJvcHBlZCBvbiBhIHZhbGlkIGhpdAoJCQkJCV90aGlzLnZpZXcucmVwb3J0RXh0ZXJuYWxEcm9wKG1ldGEsIGRyb3BMb2NhdGlvbiwgZWwsIGV2LCB1aSk7CgkJCQl9CgkJCQlfdGhpcy5pc0RyYWdnaW5nRXh0ZXJuYWwgPSBmYWxzZTsKCQkJCV90aGlzLmV4dGVybmFsRHJhZ0xpc3RlbmVyID0gbnVsbDsKCQkJfQoJCX0pOwoKCQlkcmFnTGlzdGVuZXIuc3RhcnREcmFnKGV2KTsgLy8gc3RhcnQgbGlzdGVuaW5nIGltbWVkaWF0ZWx5Cgl9LAoKCgkvLyBHaXZlbiBhIGhpdCB0byBiZSBkcm9wcGVkIHVwb24sIGFuZCBtaXNjIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBqcXVpIGRyYWcgKGd1YXJhbnRlZWQgdG8gYmUgYSBwbGFpbiBvYmplY3QpLAoJLy8gcmV0dXJucyB0aGUgem9uZWQgc3RhcnQvZW5kIGRhdGVzIGZvciB0aGUgZXZlbnQgdGhhdCB3b3VsZCByZXN1bHQgZnJvbSB0aGUgaHlwb3RoZXRpY2FsIGRyb3AuIGVuZCBtaWdodCBiZSBudWxsLgoJLy8gUmV0dXJuaW5nIGEgbnVsbCB2YWx1ZSBzaWduYWxzIGFuIGludmFsaWQgZHJvcCBoaXQuCgkvLyBET0VTIE5PVCBjb25zaWRlciBvdmVybGFwL2NvbnN0cmFpbnQuCgljb21wdXRlRXh0ZXJuYWxEcm9wOiBmdW5jdGlvbihzcGFuLCBtZXRhKSB7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy52aWV3LmNhbGVuZGFyOwoJCXZhciBkcm9wTG9jYXRpb24gPSB7CgkJCXN0YXJ0OiBjYWxlbmRhci5hcHBseVRpbWV6b25lKHNwYW4uc3RhcnQpLCAvLyBzaW11bGF0ZSBhIHpvbmVkIGV2ZW50IHN0YXJ0IGRhdGUKCQkJZW5kOiBudWxsCgkJfTsKCgkJLy8gaWYgZHJvcHBlZCBvbiBhbiBhbGwtZGF5IHNwYW4sIGFuZCBlbGVtZW50J3MgbWV0YWRhdGEgc3BlY2lmaWVkIGEgdGltZSwgc2V0IGl0CgkJaWYgKG1ldGEuc3RhcnRUaW1lICYmICFkcm9wTG9jYXRpb24uc3RhcnQuaGFzVGltZSgpKSB7CgkJCWRyb3BMb2NhdGlvbi5zdGFydC50aW1lKG1ldGEuc3RhcnRUaW1lKTsKCQl9CgoJCWlmIChtZXRhLmR1cmF0aW9uKSB7CgkJCWRyb3BMb2NhdGlvbi5lbmQgPSBkcm9wTG9jYXRpb24uc3RhcnQuY2xvbmUoKS5hZGQobWV0YS5kdXJhdGlvbik7CgkJfQoKCQlyZXR1cm4gZHJvcExvY2F0aW9uOwoJfSwKCgoKCS8qIERyYWcgUmVuZGVyaW5nIChmb3IgYm90aCBldmVudHMgYW5kIGFuIGV4dGVybmFsIGVsZW1lbnRzKQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IG9yIGV4dGVybmFsIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZC4KCS8vIGBkcm9wTG9jYXRpb25gIGNvbnRhaW5zIGh5cG90aGV0aWNhbCBzdGFydC9lbmQvYWxsRGF5IHZhbHVlcyB0aGUgZXZlbnQgd291bGQgaGF2ZSBpZiBkcm9wcGVkLiBlbmQgY2FuIGJlIG51bGwuCgkvLyBgc2VnYCBpcyB0aGUgaW50ZXJuYWwgc2VnbWVudCBvYmplY3QgdGhhdCBpcyBiZWluZyBkcmFnZ2VkLiBJZiBkcmFnZ2luZyBhbiBleHRlcm5hbCBlbGVtZW50LCBgc2VnYCBpcyBudWxsLgoJLy8gQSB0cnV0aHkgcmV0dXJuZWQgdmFsdWUgaW5kaWNhdGVzIHRoaXMgbWV0aG9kIGhhcyByZW5kZXJlZCBhIGhlbHBlciBlbGVtZW50LgoJLy8gTXVzdCByZXR1cm4gZWxlbWVudHMgdXNlZCBmb3IgYW55IG1vY2sgZXZlbnRzLgoJcmVuZGVyRHJhZzogZnVuY3Rpb24oZHJvcExvY2F0aW9uLCBzZWcpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhbiBldmVudCBvciBleHRlcm5hbCBlbGVtZW50IGJlaW5nIGRyYWdnZWQKCXVucmVuZGVyRHJhZzogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLyogUmVzaXppbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENyZWF0ZXMgYSBsaXN0ZW5lciB0aGF0IHRyYWNrcyB0aGUgdXNlciBhcyB0aGV5IHJlc2l6ZSBhbiBldmVudCBzZWdtZW50LgoJLy8gR2VuZXJpYyBlbm91Z2ggdG8gd29yayB3aXRoIGFueSB0eXBlIG9mIEdyaWQuCglidWlsZFNlZ1Jlc2l6ZUxpc3RlbmVyOiBmdW5jdGlvbihzZWcsIGlzU3RhcnQpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBjYWxlbmRhciA9IHZpZXcuY2FsZW5kYXI7CgkJdmFyIGVsID0gc2VnLmVsOwoJCXZhciBldmVudCA9IHNlZy5ldmVudDsKCQl2YXIgZXZlbnRFbmQgPSBjYWxlbmRhci5nZXRFdmVudEVuZChldmVudCk7CgkJdmFyIGlzRHJhZ2dpbmc7CgkJdmFyIHJlc2l6ZUxvY2F0aW9uOyAvLyB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMuIGZhbHN5IGlmIGludmFsaWQgcmVzaXplCgoJCS8vIFRyYWNrcyBtb3VzZSBtb3ZlbWVudCBvdmVyIHRoZSAqZ3JpZCdzKiBjb29yZGluYXRlIG1hcAoJCXZhciBkcmFnTGlzdGVuZXIgPSB0aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyID0gbmV3IEhpdERyYWdMaXN0ZW5lcih0aGlzLCB7CgkJCXNjcm9sbDogdmlldy5vcHQoJ2RyYWdTY3JvbGwnKSwKCQkJc3ViamVjdEVsOiBlbCwKCQkJaW50ZXJhY3Rpb25TdGFydDogZnVuY3Rpb24oKSB7CgkJCQlpc0RyYWdnaW5nID0gZmFsc2U7CgkJCX0sCgkJCWRyYWdTdGFydDogZnVuY3Rpb24oZXYpIHsKCQkJCWlzRHJhZ2dpbmcgPSB0cnVlOwoJCQkJX3RoaXMuaGFuZGxlU2VnTW91c2VvdXQoc2VnLCBldik7IC8vIGVuc3VyZSBhIG1vdXNlb3V0IG9uIHRoZSBtYW5pcHVsYXRlZCBldmVudCBoYXMgYmVlbiByZXBvcnRlZAoJCQkJX3RoaXMuc2VnUmVzaXplU3RhcnQoc2VnLCBldik7CgkJCX0sCgkJCWhpdE92ZXI6IGZ1bmN0aW9uKGhpdCwgaXNPcmlnLCBvcmlnSGl0KSB7CgkJCQl2YXIgb3JpZ0hpdFNwYW4gPSBfdGhpcy5nZXRIaXRTcGFuKG9yaWdIaXQpOwoJCQkJdmFyIGhpdFNwYW4gPSBfdGhpcy5nZXRIaXRTcGFuKGhpdCk7CgoJCQkJcmVzaXplTG9jYXRpb24gPSBpc1N0YXJ0ID8KCQkJCQlfdGhpcy5jb21wdXRlRXZlbnRTdGFydFJlc2l6ZShvcmlnSGl0U3BhbiwgaGl0U3BhbiwgZXZlbnQpIDoKCQkJCQlfdGhpcy5jb21wdXRlRXZlbnRFbmRSZXNpemUob3JpZ0hpdFNwYW4sIGhpdFNwYW4sIGV2ZW50KTsKCgkJCQlpZiAocmVzaXplTG9jYXRpb24pIHsKCQkJCQlpZiAoIWNhbGVuZGFyLmlzRXZlbnRTcGFuQWxsb3dlZChfdGhpcy5ldmVudFRvU3BhbihyZXNpemVMb2NhdGlvbiksIGV2ZW50KSkgewoJCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJCXJlc2l6ZUxvY2F0aW9uID0gbnVsbDsKCQkJCQl9CgkJCQkJLy8gbm8gY2hhbmdlPyAoRllJLCBldmVudCBkYXRlcyBtaWdodCBoYXZlIHpvbmVzKQoJCQkJCWVsc2UgaWYgKAoJCQkJCQlyZXNpemVMb2NhdGlvbi5zdGFydC5pc1NhbWUoZXZlbnQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKSkgJiYKCQkJCQkJcmVzaXplTG9jYXRpb24uZW5kLmlzU2FtZShldmVudEVuZC5jbG9uZSgpLnN0cmlwWm9uZSgpKQoJCQkJCSkgewoJCQkJCQlyZXNpemVMb2NhdGlvbiA9IG51bGw7CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChyZXNpemVMb2NhdGlvbikgewoJCQkJCXZpZXcuaGlkZUV2ZW50KGV2ZW50KTsKCQkJCQlfdGhpcy5yZW5kZXJFdmVudFJlc2l6ZShyZXNpemVMb2NhdGlvbiwgc2VnKTsKCQkJCX0KCQkJfSwKCQkJaGl0T3V0OiBmdW5jdGlvbigpIHsgLy8gY2FsbGVkIGJlZm9yZSBtb3VzZSBtb3ZlcyB0byBhIGRpZmZlcmVudCBoaXQgT1IgbW92ZWQgb3V0IG9mIGFsbCBoaXRzCgkJCQlyZXNpemVMb2NhdGlvbiA9IG51bGw7CgkJCX0sCgkJCWhpdERvbmU6IGZ1bmN0aW9uKCkgeyAvLyByZXNldHMgdGhlIHJlbmRlcmluZyB0byBzaG93IHRoZSBvcmlnaW5hbCBldmVudAoJCQkJX3RoaXMudW5yZW5kZXJFdmVudFJlc2l6ZSgpOwoJCQkJdmlldy5zaG93RXZlbnQoZXZlbnQpOwoJCQkJZW5hYmxlQ3Vyc29yKCk7CgkJCX0sCgkJCWludGVyYWN0aW9uRW5kOiBmdW5jdGlvbihldikgewoJCQkJaWYgKGlzRHJhZ2dpbmcpIHsKCQkJCQlfdGhpcy5zZWdSZXNpemVTdG9wKHNlZywgZXYpOwoJCQkJfQoJCQkJaWYgKHJlc2l6ZUxvY2F0aW9uKSB7IC8vIHZhbGlkIGRhdGUgdG8gcmVzaXplIHRvPwoJCQkJCXZpZXcucmVwb3J0RXZlbnRSZXNpemUoZXZlbnQsIHJlc2l6ZUxvY2F0aW9uLCB0aGlzLmxhcmdlVW5pdCwgZWwsIGV2KTsKCQkJCX0KCQkJCV90aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyID0gbnVsbDsKCQkJfQoJCX0pOwoKCQlyZXR1cm4gZHJhZ0xpc3RlbmVyOwoJfSwKCgoJLy8gQ2FsbGVkIGJlZm9yZSBldmVudCBzZWdtZW50IHJlc2l6aW5nIHN0YXJ0cwoJc2VnUmVzaXplU3RhcnQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl0aGlzLmlzUmVzaXppbmdTZWcgPSB0cnVlOwoJCXRoaXMudmlldy50cmlnZ2VyKCdldmVudFJlc2l6ZVN0YXJ0Jywgc2VnLmVsWzBdLCBzZWcuZXZlbnQsIGV2LCB7fSk7IC8vIGxhc3QgYXJndW1lbnQgaXMganF1aSBkdW1teQoJfSwKCgoJLy8gQ2FsbGVkIGFmdGVyIGV2ZW50IHNlZ21lbnQgcmVzaXppbmcgc3RvcHMKCXNlZ1Jlc2l6ZVN0b3A6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl0aGlzLmlzUmVzaXppbmdTZWcgPSBmYWxzZTsKCQl0aGlzLnZpZXcudHJpZ2dlcignZXZlbnRSZXNpemVTdG9wJywgc2VnLmVsWzBdLCBzZWcuZXZlbnQsIGV2LCB7fSk7IC8vIGxhc3QgYXJndW1lbnQgaXMganF1aSBkdW1teQoJfSwKCgoJLy8gUmV0dXJucyBuZXcgZGF0ZS1pbmZvcm1hdGlvbiBmb3IgYW4gZXZlbnQgc2VnbWVudCBiZWluZyByZXNpemVkIGZyb20gaXRzIHN0YXJ0Cgljb21wdXRlRXZlbnRTdGFydFJlc2l6ZTogZnVuY3Rpb24oc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCkgewoJCXJldHVybiB0aGlzLmNvbXB1dGVFdmVudFJlc2l6ZSgnc3RhcnQnLCBzdGFydFNwYW4sIGVuZFNwYW4sIGV2ZW50KTsKCX0sCgoKCS8vIFJldHVybnMgbmV3IGRhdGUtaW5mb3JtYXRpb24gZm9yIGFuIGV2ZW50IHNlZ21lbnQgYmVpbmcgcmVzaXplZCBmcm9tIGl0cyBlbmQKCWNvbXB1dGVFdmVudEVuZFJlc2l6ZTogZnVuY3Rpb24oc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCkgewoJCXJldHVybiB0aGlzLmNvbXB1dGVFdmVudFJlc2l6ZSgnZW5kJywgc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCk7Cgl9LAoKCgkvLyBSZXR1cm5zIG5ldyB6b25lZCBkYXRlIGluZm9ybWF0aW9uIGZvciBhbiBldmVudCBzZWdtZW50IGJlaW5nIHJlc2l6ZWQgZnJvbSBpdHMgc3RhcnQgT1IgZW5kCgkvLyBgdHlwZWAgaXMgZWl0aGVyICdzdGFydCcgb3IgJ2VuZCcuCgkvLyBET0VTIE5PVCBjb25zaWRlciBvdmVybGFwL2NvbnN0cmFpbnQuCgljb21wdXRlRXZlbnRSZXNpemU6IGZ1bmN0aW9uKHR5cGUsIHN0YXJ0U3BhbiwgZW5kU3BhbiwgZXZlbnQpIHsKCQl2YXIgY2FsZW5kYXIgPSB0aGlzLnZpZXcuY2FsZW5kYXI7CgkJdmFyIGRlbHRhID0gdGhpcy5kaWZmRGF0ZXMoZW5kU3Bhblt0eXBlXSwgc3RhcnRTcGFuW3R5cGVdKTsKCQl2YXIgcmVzaXplTG9jYXRpb247IC8vIHpvbmVkIGV2ZW50IGRhdGUgcHJvcGVydGllcwoJCXZhciBkZWZhdWx0RHVyYXRpb247CgoJCS8vIGJ1aWxkIG9yaWdpbmFsIHZhbHVlcyB0byB3b3JrIGZyb20sIGd1YXJhbnRlZWluZyBhIHN0YXJ0IGFuZCBlbmQKCQlyZXNpemVMb2NhdGlvbiA9IHsKCQkJc3RhcnQ6IGV2ZW50LnN0YXJ0LmNsb25lKCksCgkJCWVuZDogY2FsZW5kYXIuZ2V0RXZlbnRFbmQoZXZlbnQpLAoJCQlhbGxEYXk6IGV2ZW50LmFsbERheQoJCX07CgoJCS8vIGlmIGFuIGFsbC1kYXkgZXZlbnQgd2FzIGluIGEgdGltZWQgYXJlYSBhbmQgd2FzIHJlc2l6ZWQgdG8gYSB0aW1lLCBhZGp1c3Qgc3RhcnQvZW5kIHRvIGhhdmUgdGltZXMKCQlpZiAocmVzaXplTG9jYXRpb24uYWxsRGF5ICYmIGR1cmF0aW9uSGFzVGltZShkZWx0YSkpIHsKCQkJcmVzaXplTG9jYXRpb24uYWxsRGF5ID0gZmFsc2U7CgkJCWNhbGVuZGFyLm5vcm1hbGl6ZUV2ZW50VGltZXMocmVzaXplTG9jYXRpb24pOwoJCX0KCgkJcmVzaXplTG9jYXRpb25bdHlwZV0uYWRkKGRlbHRhKTsgLy8gYXBwbHkgZGVsdGEgdG8gc3RhcnQgb3IgZW5kCgoJCS8vIGlmIHRoZSBldmVudCB3YXMgY29tcHJlc3NlZCB0b28gc21hbGwsIGZpbmQgYSBuZXcgcmVhc29uYWJsZSBkdXJhdGlvbiBmb3IgaXQKCQlpZiAoIXJlc2l6ZUxvY2F0aW9uLnN0YXJ0LmlzQmVmb3JlKHJlc2l6ZUxvY2F0aW9uLmVuZCkpIHsKCgkJCWRlZmF1bHREdXJhdGlvbiA9CgkJCQl0aGlzLm1pblJlc2l6ZUR1cmF0aW9uIHx8IC8vIFRPRE86IGhhY2sKCQkJCShldmVudC5hbGxEYXkgPwoJCQkJCWNhbGVuZGFyLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uIDoKCQkJCQljYWxlbmRhci5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTsKCgkJCWlmICh0eXBlID09ICdzdGFydCcpIHsgLy8gcmVzaXppbmcgdGhlIHN0YXJ0PwoJCQkJcmVzaXplTG9jYXRpb24uc3RhcnQgPSByZXNpemVMb2NhdGlvbi5lbmQuY2xvbmUoKS5zdWJ0cmFjdChkZWZhdWx0RHVyYXRpb24pOwoJCQl9CgkJCWVsc2UgeyAvLyByZXNpemluZyB0aGUgZW5kPwoJCQkJcmVzaXplTG9jYXRpb24uZW5kID0gcmVzaXplTG9jYXRpb24uc3RhcnQuY2xvbmUoKS5hZGQoZGVmYXVsdER1cmF0aW9uKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJlc2l6ZUxvY2F0aW9uOwoJfSwKCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIHJlc2l6ZWQuCgkvLyBgcmFuZ2VgIGhhcyB0aGUgdXBkYXRlZCBkYXRlcyBvZiB0aGUgZXZlbnQuIGBzZWdgIGlzIHRoZSBvcmlnaW5hbCBzZWdtZW50IG9iamVjdCBpbnZvbHZlZCBpbiB0aGUgZHJhZy4KCS8vIE11c3QgcmV0dXJuIGVsZW1lbnRzIHVzZWQgZm9yIGFueSBtb2NrIGV2ZW50cy4KCXJlbmRlckV2ZW50UmVzaXplOiBmdW5jdGlvbihyYW5nZSwgc2VnKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgYmVpbmcgcmVzaXplZC4KCXVucmVuZGVyRXZlbnRSZXNpemU6IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8qIFJlbmRlcmluZyBVdGlscwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZSB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gYW4gZXZlbnQncyBlbGVtZW50LgoJLy8gYHJhbmdlYCBjYW4gYmUgdGhlIEV2ZW50IG9iamVjdCBpdHNlbGYsIG9yIHNvbWV0aGluZyByYW5nZS1saWtlLCB3aXRoIGF0IGxlYXN0IGEgYHN0YXJ0YC4KCS8vIElmIGV2ZW50IHRpbWVzIGFyZSBkaXNhYmxlZCwgb3IgdGhlIGV2ZW50IGhhcyBubyB0aW1lLCB3aWxsIHJldHVybiBhIGJsYW5rIHN0cmluZy4KCS8vIElmIG5vdCBzcGVjaWZpZWQsIGZvcm1hdFN0ciB3aWxsIGRlZmF1bHQgdG8gdGhlIGV2ZW50VGltZUZvcm1hdCBzZXR0aW5nLAoJLy8gYW5kIGRpc3BsYXlFbmQgd2lsbCBkZWZhdWx0IHRvIHRoZSBkaXNwbGF5RXZlbnRFbmQgc2V0dGluZy4KCWdldEV2ZW50VGltZVRleHQ6IGZ1bmN0aW9uKHJhbmdlLCBmb3JtYXRTdHIsIGRpc3BsYXlFbmQpIHsKCgkJaWYgKGZvcm1hdFN0ciA9PSBudWxsKSB7CgkJCWZvcm1hdFN0ciA9IHRoaXMuZXZlbnRUaW1lRm9ybWF0OwoJCX0KCgkJaWYgKGRpc3BsYXlFbmQgPT0gbnVsbCkgewoJCQlkaXNwbGF5RW5kID0gdGhpcy5kaXNwbGF5RXZlbnRFbmQ7CgkJfQoKCQlpZiAodGhpcy5kaXNwbGF5RXZlbnRUaW1lICYmIHJhbmdlLnN0YXJ0Lmhhc1RpbWUoKSkgewoJCQlpZiAoZGlzcGxheUVuZCAmJiByYW5nZS5lbmQpIHsKCQkJCXJldHVybiB0aGlzLnZpZXcuZm9ybWF0UmFuZ2UocmFuZ2UsIGZvcm1hdFN0cik7CgkJCX0KCQkJZWxzZSB7CgkJCQlyZXR1cm4gcmFuZ2Uuc3RhcnQuZm9ybWF0KGZvcm1hdFN0cik7CgkJCX0KCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyaWMgdXRpbGl0eSBmb3IgZ2VuZXJhdGluZyB0aGUgSFRNTCBjbGFzc05hbWVzIGZvciBhbiBldmVudCBzZWdtZW50J3MgZWxlbWVudAoJZ2V0U2VnQ2xhc3NlczogZnVuY3Rpb24oc2VnLCBpc0RyYWdnYWJsZSwgaXNSZXNpemFibGUpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgY2xhc3NlcyA9IFsKCQkJJ2ZjLWV2ZW50JywKCQkJc2VnLmlzU3RhcnQgPyAnZmMtc3RhcnQnIDogJ2ZjLW5vdC1zdGFydCcsCgkJCXNlZy5pc0VuZCA/ICdmYy1lbmQnIDogJ2ZjLW5vdC1lbmQnCgkJXS5jb25jYXQodGhpcy5nZXRTZWdDdXN0b21DbGFzc2VzKHNlZykpOwoKCQlpZiAoaXNEcmFnZ2FibGUpIHsKCQkJY2xhc3Nlcy5wdXNoKCdmYy1kcmFnZ2FibGUnKTsKCQl9CgkJaWYgKGlzUmVzaXphYmxlKSB7CgkJCWNsYXNzZXMucHVzaCgnZmMtcmVzaXphYmxlJyk7CgkJfQoKCQkvLyBldmVudCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQ/IGF0dGFjaCBhIGNsYXNzTmFtZS4KCQlpZiAodmlldy5pc0V2ZW50U2VsZWN0ZWQoc2VnLmV2ZW50KSkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLXNlbGVjdGVkJyk7CgkJfQoKCQlyZXR1cm4gY2xhc3NlczsKCX0sCgoKCS8vIExpc3Qgb2YgY2xhc3NlcyB0aGF0IHdlcmUgZGVmaW5lZCBieSB0aGUgY2FsbGVyIG9mIHRoZSBBUEkgaW4gc29tZSB3YXkKCWdldFNlZ0N1c3RvbUNsYXNzZXM6IGZ1bmN0aW9uKHNlZykgewoJCXZhciBldmVudCA9IHNlZy5ldmVudDsKCgkJcmV0dXJuIFtdLmNvbmNhdCgKCQkJZXZlbnQuY2xhc3NOYW1lLCAvLyBndWFyYW50ZWVkIHRvIGJlIGFuIGFycmF5CgkJCWV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZS5jbGFzc05hbWUgOiBbXQoJCSk7Cgl9LAoKCgkvLyBVdGlsaXR5IGZvciBnZW5lcmF0aW5nIGV2ZW50IHNraW4tcmVsYXRlZCBDU1MgcHJvcGVydGllcwoJZ2V0U2VnU2tpbkNzczogZnVuY3Rpb24oc2VnKSB7CgkJcmV0dXJuIHsKCQkJJ2JhY2tncm91bmQtY29sb3InOiB0aGlzLmdldFNlZ0JhY2tncm91bmRDb2xvcihzZWcpLAoJCQknYm9yZGVyLWNvbG9yJzogdGhpcy5nZXRTZWdCb3JkZXJDb2xvcihzZWcpLAoJCQljb2xvcjogdGhpcy5nZXRTZWdUZXh0Q29sb3Ioc2VnKQoJCX07Cgl9LAoKCgkvLyBRdWVyaWVzIGZvciBjYWxsZXItc3BlY2lmaWVkIGNvbG9yLCB0aGVuIGZhbGxzIGJhY2sgdG8gZGVmYXVsdAoJZ2V0U2VnQmFja2dyb3VuZENvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQlyZXR1cm4gc2VnLmV2ZW50LmJhY2tncm91bmRDb2xvciB8fAoJCQlzZWcuZXZlbnQuY29sb3IgfHwKCQkJdGhpcy5nZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yKHNlZyk7Cgl9LAoKCglnZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgc291cmNlID0gc2VnLmV2ZW50LnNvdXJjZSB8fCB7fTsKCgkJcmV0dXJuIHNvdXJjZS5iYWNrZ3JvdW5kQ29sb3IgfHwKCQkJc291cmNlLmNvbG9yIHx8CgkJCXRoaXMudmlldy5vcHQoJ2V2ZW50QmFja2dyb3VuZENvbG9yJykgfHwKCQkJdGhpcy52aWV3Lm9wdCgnZXZlbnRDb2xvcicpOwoJfSwKCgoJLy8gUXVlcmllcyBmb3IgY2FsbGVyLXNwZWNpZmllZCBjb2xvciwgdGhlbiBmYWxscyBiYWNrIHRvIGRlZmF1bHQKCWdldFNlZ0JvcmRlckNvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQlyZXR1cm4gc2VnLmV2ZW50LmJvcmRlckNvbG9yIHx8CgkJCXNlZy5ldmVudC5jb2xvciB8fAoJCQl0aGlzLmdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvcihzZWcpOwoJfSwKCgoJZ2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgc291cmNlID0gc2VnLmV2ZW50LnNvdXJjZSB8fCB7fTsKCgkJcmV0dXJuIHNvdXJjZS5ib3JkZXJDb2xvciB8fAoJCQlzb3VyY2UuY29sb3IgfHwKCQkJdGhpcy52aWV3Lm9wdCgnZXZlbnRCb3JkZXJDb2xvcicpIHx8CgkJCXRoaXMudmlldy5vcHQoJ2V2ZW50Q29sb3InKTsKCX0sCgoKCS8vIFF1ZXJpZXMgZm9yIGNhbGxlci1zcGVjaWZpZWQgY29sb3IsIHRoZW4gZmFsbHMgYmFjayB0byBkZWZhdWx0CglnZXRTZWdUZXh0Q29sb3I6IGZ1bmN0aW9uKHNlZykgewoJCXJldHVybiBzZWcuZXZlbnQudGV4dENvbG9yIHx8CgkJCXRoaXMuZ2V0U2VnRGVmYXVsdFRleHRDb2xvcihzZWcpOwoJfSwKCgoJZ2V0U2VnRGVmYXVsdFRleHRDb2xvcjogZnVuY3Rpb24oc2VnKSB7CgkJdmFyIHNvdXJjZSA9IHNlZy5ldmVudC5zb3VyY2UgfHwge307CgoJCXJldHVybiBzb3VyY2UudGV4dENvbG9yIHx8CgkJCXRoaXMudmlldy5vcHQoJ2V2ZW50VGV4dENvbG9yJyk7Cgl9LAoKCgkvKiBDb252ZXJ0aW5nIGV2ZW50cyAtPiBldmVudFJhbmdlIC0+IGV2ZW50U3BhbiAtPiBldmVudFNlZ3MKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyBhbiBhcnJheSBvZiBzZWdtZW50cyBmb3IgdGhlIGdpdmVuIHNpbmdsZSBldmVudAoJLy8gQ2FuIGFjY2VwdCBhbiBldmVudCAibG9jYXRpb24iIGFzIHdlbGwgKHdoaWNoIG9ubHkgaGFzIHN0YXJ0L2VuZCBhbmQgbm8gYWxsRGF5KQoJZXZlbnRUb1NlZ3M6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMuZXZlbnRzVG9TZWdzKFsgZXZlbnQgXSk7Cgl9LAoKCglldmVudFRvU3BhbjogZnVuY3Rpb24oZXZlbnQpIHsKCQlyZXR1cm4gdGhpcy5ldmVudFRvU3BhbnMoZXZlbnQpWzBdOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHNwYW5zIChhbHdheXMgdW56b25lZCkgZm9yIHRoZSBnaXZlbiBldmVudC4KCS8vIERvZXMgbm90IGRvIGFueSBpbnZlcnRpbmcgZm9yIGludmVyc2UtYmFja2dyb3VuZCBldmVudHMuCgkvLyBDYW4gYWNjZXB0IGFuIGV2ZW50ICJsb2NhdGlvbiIgYXMgd2VsbCAod2hpY2ggb25seSBoYXMgc3RhcnQvZW5kIGFuZCBubyBhbGxEYXkpCglldmVudFRvU3BhbnM6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHJhbmdlID0gdGhpcy5ldmVudFRvUmFuZ2UoZXZlbnQpOwoJCXJldHVybiB0aGlzLmV2ZW50UmFuZ2VUb1NwYW5zKHJhbmdlLCBldmVudCk7Cgl9LAoKCgoJLy8gQ29udmVydHMgYW4gYXJyYXkgb2YgZXZlbnQgb2JqZWN0cyBpbnRvIGFuIGFycmF5IG9mIGV2ZW50IHNlZ21lbnQgb2JqZWN0cy4KCS8vIEEgY3VzdG9tIGBzZWdTbGljZUZ1bmNgIG1heSBiZSBnaXZlbiBmb3IgYXJiaXRyYXJpbHkgc2xpY2luZyB1cCBldmVudHMuCgkvLyBEb2Vzbid0IGd1YXJhbnRlZSBhbiBvcmRlciBmb3IgdGhlIHJlc3VsdGluZyBhcnJheS4KCWV2ZW50c1RvU2VnczogZnVuY3Rpb24oYWxsRXZlbnRzLCBzZWdTbGljZUZ1bmMpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciBldmVudHNCeUlkID0gZ3JvdXBFdmVudHNCeUlkKGFsbEV2ZW50cyk7CgkJdmFyIHNlZ3MgPSBbXTsKCgkJJC5lYWNoKGV2ZW50c0J5SWQsIGZ1bmN0aW9uKGlkLCBldmVudHMpIHsKCQkJdmFyIHJhbmdlcyA9IFtdOwoJCQl2YXIgaTsKCgkJCWZvciAoaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKCQkJCXJhbmdlcy5wdXNoKF90aGlzLmV2ZW50VG9SYW5nZShldmVudHNbaV0pKTsKCQkJfQoKCQkJLy8gaW52ZXJzZS1iYWNrZ3JvdW5kIGV2ZW50cyAodXRpbGl6ZSBvbmx5IHRoZSBmaXJzdCBldmVudCBpbiBjYWxjdWxhdGlvbnMpCgkJCWlmIChpc0ludmVyc2VCZ0V2ZW50KGV2ZW50c1swXSkpIHsKCQkJCXJhbmdlcyA9IF90aGlzLmludmVydFJhbmdlcyhyYW5nZXMpOwoKCQkJCWZvciAoaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKCQkJCQlzZWdzLnB1c2guYXBwbHkoc2VncywgLy8gYXBwZW5kIHRvCgkJCQkJCV90aGlzLmV2ZW50UmFuZ2VUb1NlZ3MocmFuZ2VzW2ldLCBldmVudHNbMF0sIHNlZ1NsaWNlRnVuYykpOwoJCQkJfQoJCQl9CgkJCS8vIG5vcm1hbCBldmVudCByYW5nZXMKCQkJZWxzZSB7CgkJCQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CgkJCQkJc2Vncy5wdXNoLmFwcGx5KHNlZ3MsIC8vIGFwcGVuZCB0bwoJCQkJCQlfdGhpcy5ldmVudFJhbmdlVG9TZWdzKHJhbmdlc1tpXSwgZXZlbnRzW2ldLCBzZWdTbGljZUZ1bmMpKTsKCQkJCX0KCQkJfQoJCX0pOwoKCQlyZXR1cm4gc2VnczsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgdW56b25lZCBzdGFydC9lbmQgZGF0ZXMgYW4gZXZlbnQgYXBwZWFycyB0byBvY2N1cHkKCS8vIENhbiBhY2NlcHQgYW4gZXZlbnQgImxvY2F0aW9uIiBhcyB3ZWxsICh3aGljaCBvbmx5IGhhcyBzdGFydC9lbmQgYW5kIG5vIGFsbERheSkKCWV2ZW50VG9SYW5nZTogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIgY2FsZW5kYXIgPSB0aGlzLnZpZXcuY2FsZW5kYXI7CgkJdmFyIHN0YXJ0ID0gZXZlbnQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKTsKCQl2YXIgZW5kID0gKAoJCQkJZXZlbnQuZW5kID8KCQkJCQlldmVudC5lbmQuY2xvbmUoKSA6CgkJCQkJLy8gZGVyaXZlIHRoZSBlbmQgZnJvbSB0aGUgc3RhcnQgYW5kIGFsbERheS4gY29tcHV0ZSBhbGxEYXkgaWYgbmVjZXNzYXJ5CgkJCQkJY2FsZW5kYXIuZ2V0RGVmYXVsdEV2ZW50RW5kKAoJCQkJCQlldmVudC5hbGxEYXkgIT0gbnVsbCA/CgkJCQkJCQlldmVudC5hbGxEYXkgOgoJCQkJCQkJIWV2ZW50LnN0YXJ0Lmhhc1RpbWUoKSwKCQkJCQkJZXZlbnQuc3RhcnQKCQkJCQkpCgkJCSkuc3RyaXBab25lKCk7CgoJCS8vIGhhY2s6IGR5bmFtaWMgbG9jYWxlIGNoYW5nZSBmb3JnZXRzIHRvIHVwYXRlIHN0b3JlZCBldmVudCBsb2NhbGVkCgkJY2FsZW5kYXIubG9jYWxpemVNb21lbnQoc3RhcnQpOwoJCWNhbGVuZGFyLmxvY2FsaXplTW9tZW50KGVuZCk7CgoJCXJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTsKCX0sCgoKCS8vIEdpdmVuIGFuIGV2ZW50J3MgcmFuZ2UgKHVuem9uZWQgc3RhcnQvZW5kKSwgYW5kIHRoZSBldmVudCBpdHNlbGYsCgkvLyBzbGljZSBpbnRvIHNlZ21lbnRzICh1c2luZyB0aGUgc2VnU2xpY2VGdW5jIGZ1bmN0aW9uIGlmIHNwZWNpZmllZCkKCWV2ZW50UmFuZ2VUb1NlZ3M6IGZ1bmN0aW9uKHJhbmdlLCBldmVudCwgc2VnU2xpY2VGdW5jKSB7CgkJdmFyIHNwYW5zID0gdGhpcy5ldmVudFJhbmdlVG9TcGFucyhyYW5nZSwgZXZlbnQpOwoJCXZhciBzZWdzID0gW107CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewoJCQlzZWdzLnB1c2guYXBwbHkoc2VncywgLy8gYXBwZW5kIHRvCgkJCQl0aGlzLmV2ZW50U3BhblRvU2VncyhzcGFuc1tpXSwgZXZlbnQsIHNlZ1NsaWNlRnVuYykpOwoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvLyBHaXZlbiBhbiBldmVudCdzIHVuem9uZWQgZGF0ZSByYW5nZSwgcmV0dXJuIGFuIGFycmF5IG9mICJzcGFuIiBvYmplY3RzLgoJLy8gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUuCglldmVudFJhbmdlVG9TcGFuczogZnVuY3Rpb24ocmFuZ2UsIGV2ZW50KSB7CgkJcmV0dXJuIFsgJC5leHRlbmQoe30sIHJhbmdlKSBdOyAvLyBjb3B5IGludG8gYSBzaW5nbGUtaXRlbSBhcnJheQoJfSwKCgoJLy8gR2l2ZW4gYW4gZXZlbnQncyBzcGFuICh1bnpvbmVkIHN0YXJ0L2VuZCBhbmQgb3RoZXIgbWlzYyBkYXRhKSwgYW5kIHRoZSBldmVudCBpdHNlbGYsCgkvLyBzbGljZXMgaW50byBzZWdtZW50cyBhbmQgYXR0YWNoZXMgZXZlbnQtZGVyaXZlZCBwcm9wZXJ0aWVzIHRvIHRoZW0uCglldmVudFNwYW5Ub1NlZ3M6IGZ1bmN0aW9uKHNwYW4sIGV2ZW50LCBzZWdTbGljZUZ1bmMpIHsKCQl2YXIgc2VncyA9IHNlZ1NsaWNlRnVuYyA/IHNlZ1NsaWNlRnVuYyhzcGFuKSA6IHRoaXMuc3BhblRvU2VncyhzcGFuKTsKCQl2YXIgaSwgc2VnOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlzZWcgPSBzZWdzW2ldOwoJCQlzZWcuZXZlbnQgPSBldmVudDsKCQkJc2VnLmV2ZW50U3RhcnRNUyA9ICtzcGFuLnN0YXJ0OyAvLyBUT0RPOiBub3QgdGhlIGJlc3QgbmFtZSBhZnRlciBtYWtpbmcgc3BhbnMgdW56b25lZAoJCQlzZWcuZXZlbnREdXJhdGlvbk1TID0gc3Bhbi5lbmQgLSBzcGFuLnN0YXJ0OwoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvLyBQcm9kdWNlcyBhIG5ldyBhcnJheSBvZiByYW5nZSBvYmplY3RzIHRoYXQgd2lsbCBjb3ZlciBhbGwgdGhlIHRpbWUgTk9UIGNvdmVyZWQgYnkgdGhlIGdpdmVuIHJhbmdlcy4KCS8vIFNJREUgRUZGRUNUOiB3aWxsIG11dGF0ZSB0aGUgZ2l2ZW4gYXJyYXkgYW5kIHdpbGwgdXNlIGl0cyBkYXRlIHJlZmVyZW5jZXMuCglpbnZlcnRSYW5nZXM6IGZ1bmN0aW9uKHJhbmdlcykgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB2aWV3U3RhcnQgPSB2aWV3LnN0YXJ0LmNsb25lKCk7IC8vIG5lZWQgYSBjb3B5CgkJdmFyIHZpZXdFbmQgPSB2aWV3LmVuZC5jbG9uZSgpOyAvLyBuZWVkIGEgY29weQoJCXZhciBpbnZlcnNlUmFuZ2VzID0gW107CgkJdmFyIHN0YXJ0ID0gdmlld1N0YXJ0OyAvLyB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyByYW5nZS4gdGhlIHN0YXJ0IG9mIHRoZSBuZXcgcmFuZ2UKCQl2YXIgaSwgcmFuZ2U7CgoJCS8vIHJhbmdlcyBuZWVkIHRvIGJlIGluIG9yZGVyLiByZXF1aXJlZCBmb3Igb3VyIGRhdGUtd2Fsa2luZyBhbGdvcml0aG0KCQlyYW5nZXMuc29ydChjb21wYXJlUmFuZ2VzKTsKCgkJZm9yIChpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewoJCQlyYW5nZSA9IHJhbmdlc1tpXTsKCgkJCS8vIGFkZCB0aGUgc3BhbiBvZiB0aW1lIGJlZm9yZSB0aGUgZXZlbnQgKGlmIHRoZXJlIGlzIGFueSkKCQkJaWYgKHJhbmdlLnN0YXJ0ID4gc3RhcnQpIHsgLy8gY29tcGFyZSBtaWxsaXNlY29uZCB0aW1lIChza2lwIGFueSBhbWJpZyBsb2dpYykKCQkJCWludmVyc2VSYW5nZXMucHVzaCh7CgkJCQkJc3RhcnQ6IHN0YXJ0LAoJCQkJCWVuZDogcmFuZ2Uuc3RhcnQKCQkJCX0pOwoJCQl9CgoJCQlzdGFydCA9IHJhbmdlLmVuZDsKCQl9CgoJCS8vIGFkZCB0aGUgc3BhbiBvZiB0aW1lIGFmdGVyIHRoZSBsYXN0IGV2ZW50IChpZiB0aGVyZSBpcyBhbnkpCgkJaWYgKHN0YXJ0IDwgdmlld0VuZCkgeyAvLyBjb21wYXJlIG1pbGxpc2Vjb25kIHRpbWUgKHNraXAgYW55IGFtYmlnIGxvZ2ljKQoJCQlpbnZlcnNlUmFuZ2VzLnB1c2goewoJCQkJc3RhcnQ6IHN0YXJ0LAoJCQkJZW5kOiB2aWV3RW5kCgkJCX0pOwoJCX0KCgkJcmV0dXJuIGludmVyc2VSYW5nZXM7Cgl9LAoKCglzb3J0RXZlbnRTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJc2Vncy5zb3J0KHByb3h5KHRoaXMsICdjb21wYXJlRXZlbnRTZWdzJykpOwoJfSwKCgoJLy8gQSBjbXAgZnVuY3Rpb24gZm9yIGRldGVybWluaW5nIHdoaWNoIHNlZ21lbnRzIHNob3VsZCB0YWtlIHZpc3VhbCBwcmlvcml0eQoJY29tcGFyZUV2ZW50U2VnczogZnVuY3Rpb24oc2VnMSwgc2VnMikgewoJCXJldHVybiBzZWcxLmV2ZW50U3RhcnRNUyAtIHNlZzIuZXZlbnRTdGFydE1TIHx8IC8vIGVhcmxpZXIgZXZlbnRzIGdvIGZpcnN0CgkJCXNlZzIuZXZlbnREdXJhdGlvbk1TIC0gc2VnMS5ldmVudER1cmF0aW9uTVMgfHwgLy8gdGllPyBsb25nZXIgZXZlbnRzIGdvIGZpcnN0CgkJCXNlZzIuZXZlbnQuYWxsRGF5IC0gc2VnMS5ldmVudC5hbGxEYXkgfHwgLy8gdGllPyBwdXQgYWxsLWRheSBldmVudHMgZmlyc3QgKGJvb2xlYW5zIGNhc3QgdG8gMC8xKQoJCQljb21wYXJlQnlGaWVsZFNwZWNzKHNlZzEuZXZlbnQsIHNlZzIuZXZlbnQsIHRoaXMudmlldy5ldmVudE9yZGVyU3BlY3MpOwoJfQoKfSk7CgoKLyogVXRpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCmZ1bmN0aW9uIHBsdWNrRXZlbnREYXRlUHJvcHMoZXZlbnQpIHsKCXJldHVybiB7CgkJc3RhcnQ6IGV2ZW50LnN0YXJ0LmNsb25lKCksCgkJZW5kOiBldmVudC5lbmQgPyBldmVudC5lbmQuY2xvbmUoKSA6IG51bGwsCgkJYWxsRGF5OiBldmVudC5hbGxEYXkgLy8ga2VlcCBpdCB0aGUgc2FtZQoJfTsKfQpGQy5wbHVja0V2ZW50RGF0ZVByb3BzID0gcGx1Y2tFdmVudERhdGVQcm9wczsKCgpmdW5jdGlvbiBpc0JnRXZlbnQoZXZlbnQpIHsgLy8gcmV0dXJucyB0cnVlIGlmIGJhY2tncm91bmQgT1IgaW52ZXJzZS1iYWNrZ3JvdW5kCgl2YXIgcmVuZGVyaW5nID0gZ2V0RXZlbnRSZW5kZXJpbmcoZXZlbnQpOwoJcmV0dXJuIHJlbmRlcmluZyA9PT0gJ2JhY2tncm91bmQnIHx8IHJlbmRlcmluZyA9PT0gJ2ludmVyc2UtYmFja2dyb3VuZCc7Cn0KRkMuaXNCZ0V2ZW50ID0gaXNCZ0V2ZW50OyAvLyBleHBvcnQKCgpmdW5jdGlvbiBpc0ludmVyc2VCZ0V2ZW50KGV2ZW50KSB7CglyZXR1cm4gZ2V0RXZlbnRSZW5kZXJpbmcoZXZlbnQpID09PSAnaW52ZXJzZS1iYWNrZ3JvdW5kJzsKfQoKCmZ1bmN0aW9uIGdldEV2ZW50UmVuZGVyaW5nKGV2ZW50KSB7CglyZXR1cm4gZmlyc3REZWZpbmVkKChldmVudC5zb3VyY2UgfHwge30pLnJlbmRlcmluZywgZXZlbnQucmVuZGVyaW5nKTsKfQoKCmZ1bmN0aW9uIGdyb3VwRXZlbnRzQnlJZChldmVudHMpIHsKCXZhciBldmVudHNCeUlkID0ge307Cgl2YXIgaSwgZXZlbnQ7CgoJZm9yIChpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewoJCWV2ZW50ID0gZXZlbnRzW2ldOwoJCShldmVudHNCeUlkW2V2ZW50Ll9pZF0gfHwgKGV2ZW50c0J5SWRbZXZlbnQuX2lkXSA9IFtdKSkucHVzaChldmVudCk7Cgl9CgoJcmV0dXJuIGV2ZW50c0J5SWQ7Cn0KCgovLyBBIGNtcCBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggbm9uLWludmVydGVkICJyYW5nZXMiIChzZWUgYWJvdmUpIGhhcHBlbiBlYXJsaWVyCmZ1bmN0aW9uIGNvbXBhcmVSYW5nZXMocmFuZ2UxLCByYW5nZTIpIHsKCXJldHVybiByYW5nZTEuc3RhcnQgLSByYW5nZTIuc3RhcnQ7IC8vIGVhcmxpZXIgcmFuZ2VzIGdvIGZpcnN0Cn0KCgovKiBFeHRlcm5hbC1EcmFnZ2luZy1FbGVtZW50IERhdGEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovLyBSZXF1aXJlIGFsbCBIVE1MNSBkYXRhLSogYXR0cmlidXRlcyB1c2VkIGJ5IEZ1bGxDYWxlbmRhciB0byBoYXZlIHRoaXMgcHJlZml4LgovLyBBIHZhbHVlIG9mICcnIHdpbGwgcXVlcnkgYXR0cmlidXRlcyBsaWtlIGRhdGEtZXZlbnQuIEEgdmFsdWUgb2YgJ2ZjJyB3aWxsIHF1ZXJ5IGF0dHJpYnV0ZXMgbGlrZSBkYXRhLWZjLWV2ZW50LgpGQy5kYXRhQXR0clByZWZpeCA9ICcnOwoKLy8gR2l2ZW4gYSBqUXVlcnkgZWxlbWVudCB0aGF0IG1pZ2h0IHJlcHJlc2VudCBhIGRyYWdnZWQgRnVsbENhbGVuZGFyIGV2ZW50LCByZXR1cm5zIGFuIGludGVybWVkaWF0ZSBkYXRhIHN0cnVjdHVyZQovLyB0byBiZSB1c2VkIGZvciBFdmVudCBPYmplY3QgY3JlYXRpb24uCi8vIEEgZGVmaW5lZCBgLmV2ZW50UHJvcHNgLCBldmVuIHdoZW4gZW1wdHksIGluZGljYXRlcyB0aGF0IGFuIGV2ZW50IHNob3VsZCBiZSBjcmVhdGVkLgpmdW5jdGlvbiBnZXREcmFnZ2VkRWxNZXRhKGVsKSB7Cgl2YXIgcHJlZml4ID0gRkMuZGF0YUF0dHJQcmVmaXg7Cgl2YXIgZXZlbnRQcm9wczsgLy8gcHJvcGVydGllcyBmb3IgY3JlYXRpbmcgdGhlIGV2ZW50LCBub3QgcmVsYXRlZCB0byBkYXRlL3RpbWUKCXZhciBzdGFydFRpbWU7IC8vIGEgRHVyYXRpb24KCXZhciBkdXJhdGlvbjsKCXZhciBzdGljazsKCglpZiAocHJlZml4KSB7IHByZWZpeCArPSAnLSc7IH0KCWV2ZW50UHJvcHMgPSBlbC5kYXRhKHByZWZpeCArICdldmVudCcpIHx8IG51bGw7CgoJaWYgKGV2ZW50UHJvcHMpIHsKCQlpZiAodHlwZW9mIGV2ZW50UHJvcHMgPT09ICdvYmplY3QnKSB7CgkJCWV2ZW50UHJvcHMgPSAkLmV4dGVuZCh7fSwgZXZlbnRQcm9wcyk7IC8vIG1ha2UgYSBjb3B5CgkJfQoJCWVsc2UgeyAvLyBzb21ldGhpbmcgbGlrZSAxIG9yIHRydWUuIHN0aWxsIHNpZ25hbCBldmVudCBjcmVhdGlvbgoJCQlldmVudFByb3BzID0ge307CgkJfQoKCQkvLyBwbHVjayBzcGVjaWFsLWNhc2VkIGRhdGUvdGltZSBwcm9wZXJ0aWVzCgkJc3RhcnRUaW1lID0gZXZlbnRQcm9wcy5zdGFydDsKCQlpZiAoc3RhcnRUaW1lID09IG51bGwpIHsgc3RhcnRUaW1lID0gZXZlbnRQcm9wcy50aW1lOyB9IC8vIGFjY2VwdCAndGltZScgYXMgd2VsbAoJCWR1cmF0aW9uID0gZXZlbnRQcm9wcy5kdXJhdGlvbjsKCQlzdGljayA9IGV2ZW50UHJvcHMuc3RpY2s7CgkJZGVsZXRlIGV2ZW50UHJvcHMuc3RhcnQ7CgkJZGVsZXRlIGV2ZW50UHJvcHMudGltZTsKCQlkZWxldGUgZXZlbnRQcm9wcy5kdXJhdGlvbjsKCQlkZWxldGUgZXZlbnRQcm9wcy5zdGljazsKCX0KCgkvLyBmYWxsYmFjayB0byBzdGFuZGFsb25lIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGRhdGUvdGltZSBwcm9wZXJ0aWVzCglpZiAoc3RhcnRUaW1lID09IG51bGwpIHsgc3RhcnRUaW1lID0gZWwuZGF0YShwcmVmaXggKyAnc3RhcnQnKTsgfQoJaWYgKHN0YXJ0VGltZSA9PSBudWxsKSB7IHN0YXJ0VGltZSA9IGVsLmRhdGEocHJlZml4ICsgJ3RpbWUnKTsgfSAvLyBhY2NlcHQgJ3RpbWUnIGFzIHdlbGwKCWlmIChkdXJhdGlvbiA9PSBudWxsKSB7IGR1cmF0aW9uID0gZWwuZGF0YShwcmVmaXggKyAnZHVyYXRpb24nKTsgfQoJaWYgKHN0aWNrID09IG51bGwpIHsgc3RpY2sgPSBlbC5kYXRhKHByZWZpeCArICdzdGljaycpOyB9CgoJLy8gbWFzc2FnZSBpbnRvIGNvcnJlY3QgZGF0YSB0eXBlcwoJc3RhcnRUaW1lID0gc3RhcnRUaW1lICE9IG51bGwgPyBtb21lbnQuZHVyYXRpb24oc3RhcnRUaW1lKSA6IG51bGw7CglkdXJhdGlvbiA9IGR1cmF0aW9uICE9IG51bGwgPyBtb21lbnQuZHVyYXRpb24oZHVyYXRpb24pIDogbnVsbDsKCXN0aWNrID0gQm9vbGVhbihzdGljayk7CgoJcmV0dXJuIHsgZXZlbnRQcm9wczogZXZlbnRQcm9wcywgc3RhcnRUaW1lOiBzdGFydFRpbWUsIGR1cmF0aW9uOiBkdXJhdGlvbiwgc3RpY2s6IHN0aWNrIH07Cn0KCgo7OwoKLyoKQSBzZXQgb2YgcmVuZGVyaW5nIGFuZCBkYXRlLXJlbGF0ZWQgbWV0aG9kcyBmb3IgYSB2aXN1YWwgY29tcG9uZW50IGNvbXByaXNlZCBvZiBvbmUgb3IgbW9yZSByb3dzIG9mIGRheSBjb2x1bW5zLgpQcmVyZXF1aXNpdGU6IHRoZSBvYmplY3QgYmVpbmcgbWl4ZWQgaW50byBuZWVkcyB0byBiZSBhICpHcmlkKgoqLwp2YXIgRGF5VGFibGVNaXhpbiA9IEZDLkRheVRhYmxlTWl4aW4gPSB7CgoJYnJlYWtPbldlZWtzOiBmYWxzZSwgLy8gc2hvdWxkIGNyZWF0ZSBhIG5ldyByb3cgZm9yIGVhY2ggd2Vlaz8KCWRheURhdGVzOiBudWxsLCAvLyB3aG9sZS1kYXkgZGF0ZXMgZm9yIGVhY2ggY29sdW1uLiBsZWZ0IHRvIHJpZ2h0CglkYXlJbmRpY2VzOiBudWxsLCAvLyBmb3IgZWFjaCBkYXkgZnJvbSBzdGFydCwgdGhlIG9mZnNldAoJZGF5c1BlclJvdzogbnVsbCwKCXJvd0NudDogbnVsbCwKCWNvbENudDogbnVsbCwKCWNvbEhlYWRGb3JtYXQ6IG51bGwsCgoKCS8vIFBvcHVsYXRlcyBpbnRlcm5hbCB2YXJpYWJsZXMgdXNlZCBmb3IgZGF0ZSBjYWxjdWxhdGlvbiBhbmQgcmVuZGVyaW5nCgl1cGRhdGVEYXlUYWJsZTogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGRhdGUgPSB0aGlzLnN0YXJ0LmNsb25lKCk7CgkJdmFyIGRheUluZGV4ID0gLTE7CgkJdmFyIGRheUluZGljZXMgPSBbXTsKCQl2YXIgZGF5RGF0ZXMgPSBbXTsKCQl2YXIgZGF5c1BlclJvdzsKCQl2YXIgZmlyc3REYXk7CgkJdmFyIHJvd0NudDsKCgkJd2hpbGUgKGRhdGUuaXNCZWZvcmUodGhpcy5lbmQpKSB7IC8vIGxvb3AgZWFjaCBkYXkgZnJvbSBzdGFydCB0byBlbmQKCQkJaWYgKHZpZXcuaXNIaWRkZW5EYXkoZGF0ZSkpIHsKCQkJCWRheUluZGljZXMucHVzaChkYXlJbmRleCArIDAuNSk7IC8vIG1hcmsgdGhhdCBpdCdzIGJldHdlZW4gaW5kaWNlcwoJCQl9CgkJCWVsc2UgewoJCQkJZGF5SW5kZXgrKzsKCQkJCWRheUluZGljZXMucHVzaChkYXlJbmRleCk7CgkJCQlkYXlEYXRlcy5wdXNoKGRhdGUuY2xvbmUoKSk7CgkJCX0KCQkJZGF0ZS5hZGQoMSwgJ2RheXMnKTsKCQl9CgoJCWlmICh0aGlzLmJyZWFrT25XZWVrcykgewoJCQkvLyBjb3VudCBjb2x1bW5zIHVudGlsIHRoZSBkYXktb2Ytd2VlayByZXBlYXRzCgkJCWZpcnN0RGF5ID0gZGF5RGF0ZXNbMF0uZGF5KCk7CgkJCWZvciAoZGF5c1BlclJvdyA9IDE7IGRheXNQZXJSb3cgPCBkYXlEYXRlcy5sZW5ndGg7IGRheXNQZXJSb3crKykgewoJCQkJaWYgKGRheURhdGVzW2RheXNQZXJSb3ddLmRheSgpID09IGZpcnN0RGF5KSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJcm93Q250ID0gTWF0aC5jZWlsKGRheURhdGVzLmxlbmd0aCAvIGRheXNQZXJSb3cpOwoJCX0KCQllbHNlIHsKCQkJcm93Q250ID0gMTsKCQkJZGF5c1BlclJvdyA9IGRheURhdGVzLmxlbmd0aDsKCQl9CgoJCXRoaXMuZGF5RGF0ZXMgPSBkYXlEYXRlczsKCQl0aGlzLmRheUluZGljZXMgPSBkYXlJbmRpY2VzOwoJCXRoaXMuZGF5c1BlclJvdyA9IGRheXNQZXJSb3c7CgkJdGhpcy5yb3dDbnQgPSByb3dDbnQ7CgkJCgkJdGhpcy51cGRhdGVEYXlUYWJsZUNvbHMoKTsKCX0sCgoKCS8vIENvbXB1dGVzIGFuZCBhc3NpZ25lZCB0aGUgY29sQ250IHByb3BlcnR5IGFuZCB1cGRhdGVzIGFueSBvcHRpb25zIHRoYXQgbWF5IGJlIGNvbXB1dGVkIGZyb20gaXQKCXVwZGF0ZURheVRhYmxlQ29sczogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb2xDbnQgPSB0aGlzLmNvbXB1dGVDb2xDbnQoKTsKCQl0aGlzLmNvbEhlYWRGb3JtYXQgPSB0aGlzLnZpZXcub3B0KCdjb2x1bW5Gb3JtYXQnKSB8fCB0aGlzLmNvbXB1dGVDb2xIZWFkRm9ybWF0KCk7Cgl9LAoKCgkvLyBEZXRlcm1pbmVzIGhvdyBtYW55IGNvbHVtbnMgdGhlcmUgc2hvdWxkIGJlIGluIHRoZSB0YWJsZQoJY29tcHV0ZUNvbENudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZGF5c1BlclJvdzsKCX0sCgoKCS8vIENvbXB1dGVzIHRoZSBhbWJpZ3VvdXNseS10aW1lZCBtb21lbnQgZm9yIHRoZSBnaXZlbiBjZWxsCglnZXRDZWxsRGF0ZTogZnVuY3Rpb24ocm93LCBjb2wpIHsKCQlyZXR1cm4gdGhpcy5kYXlEYXRlc1sKCQkJCXRoaXMuZ2V0Q2VsbERheUluZGV4KHJvdywgY29sKQoJCQldLmNsb25lKCk7Cgl9LAoKCgkvLyBDb21wdXRlcyB0aGUgYW1iaWd1b3VzbHktdGltZWQgZGF0ZSByYW5nZSBmb3IgdGhlIGdpdmVuIGNlbGwKCWdldENlbGxSYW5nZTogZnVuY3Rpb24ocm93LCBjb2wpIHsKCQl2YXIgc3RhcnQgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgY29sKTsKCQl2YXIgZW5kID0gc3RhcnQuY2xvbmUoKS5hZGQoMSwgJ2RheXMnKTsKCgkJcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9OwoJfSwKCgoJLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheSBjZWxscywgY2hyb25vbG9naWNhbGx5LCBmcm9tIHRoZSBmaXJzdCBvZiB0aGUgZ3JpZCAoMC1iYXNlZCkKCWdldENlbGxEYXlJbmRleDogZnVuY3Rpb24ocm93LCBjb2wpIHsKCQlyZXR1cm4gcm93ICogdGhpcy5kYXlzUGVyUm93ICsgdGhpcy5nZXRDb2xEYXlJbmRleChjb2wpOwoJfSwKCgoJLy8gUmV0dXJucyB0aGUgbnVtbmVyIG9mIGRheSBjZWxscywgY2hyb25vbG9naWNhbGx5LCBmcm9tIHRoZSBmaXJzdCBjZWxsIGluICphbnkgZ2l2ZW4gcm93KgoJZ2V0Q29sRGF5SW5kZXg6IGZ1bmN0aW9uKGNvbCkgewoJCWlmICh0aGlzLmlzUlRMKSB7CgkJCXJldHVybiB0aGlzLmNvbENudCAtIDEgLSBjb2w7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gY29sOwoJCX0KCX0sCgoKCS8vIEdpdmVuIGEgZGF0ZSwgcmV0dXJucyBpdHMgY2hyb25vbG9jaWFsIGNlbGwtaW5kZXggZnJvbSB0aGUgZmlyc3QgY2VsbCBvZiB0aGUgZ3JpZC4KCS8vIElmIHRoZSBkYXRlIGxpZXMgYmV0d2VlbiBjZWxscyAoYmVjYXVzZSBvZiBoaWRkZW5EYXlzKSwgcmV0dXJucyBhIGZsb2F0aW5nLXBvaW50IHZhbHVlIGJldHdlZW4gb2Zmc2V0cy4KCS8vIElmIGJlZm9yZSB0aGUgZmlyc3Qgb2Zmc2V0LCByZXR1cm5zIGEgbmVnYXRpdmUgbnVtYmVyLgoJLy8gSWYgYWZ0ZXIgdGhlIGxhc3Qgb2Zmc2V0LCByZXR1cm5zIGFuIG9mZnNldCBwYXN0IHRoZSBsYXN0IGNlbGwgb2Zmc2V0LgoJLy8gT25seSB3b3JrcyBmb3IgKnN0YXJ0KiBkYXRlcyBvZiBjZWxscy4gV2lsbCBub3Qgd29yayBmb3IgZXhjbHVzaXZlIGVuZCBkYXRlcyBmb3IgY2VsbHMuCglnZXREYXRlRGF5SW5kZXg6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgZGF5SW5kaWNlcyA9IHRoaXMuZGF5SW5kaWNlczsKCQl2YXIgZGF5T2Zmc2V0ID0gZGF0ZS5kaWZmKHRoaXMuc3RhcnQsICdkYXlzJyk7CgoJCWlmIChkYXlPZmZzZXQgPCAwKSB7CgkJCXJldHVybiBkYXlJbmRpY2VzWzBdIC0gMTsKCQl9CgkJZWxzZSBpZiAoZGF5T2Zmc2V0ID49IGRheUluZGljZXMubGVuZ3RoKSB7CgkJCXJldHVybiBkYXlJbmRpY2VzW2RheUluZGljZXMubGVuZ3RoIC0gMV0gKyAxOwoJCX0KCQllbHNlIHsKCQkJcmV0dXJuIGRheUluZGljZXNbZGF5T2Zmc2V0XTsKCQl9Cgl9LAoKCgkvKiBPcHRpb25zCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBDb21wdXRlcyBhIGRlZmF1bHQgY29sdW1uIGhlYWRlciBmb3JtYXR0aW5nIHN0cmluZyBpZiBgY29sRm9ybWF0YCBpcyBub3QgZXhwbGljaXRseSBkZWZpbmVkCgljb21wdXRlQ29sSGVhZEZvcm1hdDogZnVuY3Rpb24oKSB7CgkJLy8gaWYgbW9yZSB0aGFuIG9uZSB3ZWVrIHJvdywgb3IgaWYgdGhlcmUgYXJlIGEgbG90IG9mIGNvbHVtbnMgd2l0aCBub3QgbXVjaCBzcGFjZSwKCQkvLyBwdXQganVzdCB0aGUgZGF5IG51bWJlcnMgd2lsbCBiZSBpbiBlYWNoIGNlbGwKCQlpZiAodGhpcy5yb3dDbnQgPiAxIHx8IHRoaXMuY29sQ250ID4gMTApIHsKCQkJcmV0dXJuICdkZGQnOyAvLyAiU2F0IgoJCX0KCQkvLyBtdWx0aXBsZSBkYXlzLCBzbyBmdWxsIHNpbmdsZSBkYXRlIHN0cmluZyBXT04nVCBiZSBpbiB0aXRsZSB0ZXh0CgkJZWxzZSBpZiAodGhpcy5jb2xDbnQgPiAxKSB7CgkJCXJldHVybiB0aGlzLnZpZXcub3B0KCdkYXlPZk1vbnRoRm9ybWF0Jyk7IC8vICJTYXQgMTIvMTAiCgkJfQoJCS8vIHNpbmdsZSBkYXksIHNvIGZ1bGwgc2luZ2xlIGRhdGUgc3RyaW5nIHdpbGwgcHJvYmFibHkgYmUgaW4gdGl0bGUgdGV4dAoJCWVsc2UgewoJCQlyZXR1cm4gJ2RkZGQnOyAvLyAiU2F0dXJkYXkiCgkJfQoJfSwKCgoJLyogU2xpY2luZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gU2xpY2VzIHVwIGEgZGF0ZSByYW5nZSBpbnRvIGEgc2VnbWVudCBmb3IgZXZlcnkgd2Vlay1yb3cgaXQgaW50ZXJzZWN0cyB3aXRoCglzbGljZVJhbmdlQnlSb3c6IGZ1bmN0aW9uKHJhbmdlKSB7CgkJdmFyIGRheXNQZXJSb3cgPSB0aGlzLmRheXNQZXJSb3c7CgkJdmFyIG5vcm1hbFJhbmdlID0gdGhpcy52aWV3LmNvbXB1dGVEYXlSYW5nZShyYW5nZSk7IC8vIG1ha2Ugd2hvbGUtZGF5IHJhbmdlLCBjb25zaWRlcmluZyBuZXh0RGF5VGhyZXNob2xkCgkJdmFyIHJhbmdlRmlyc3QgPSB0aGlzLmdldERhdGVEYXlJbmRleChub3JtYWxSYW5nZS5zdGFydCk7IC8vIGluY2x1c2l2ZSBmaXJzdCBpbmRleAoJCXZhciByYW5nZUxhc3QgPSB0aGlzLmdldERhdGVEYXlJbmRleChub3JtYWxSYW5nZS5lbmQuY2xvbmUoKS5zdWJ0cmFjdCgxLCAnZGF5cycpKTsgLy8gaW5jbHVzaXZlIGxhc3QgaW5kZXgKCQl2YXIgc2VncyA9IFtdOwoJCXZhciByb3c7CgkJdmFyIHJvd0ZpcnN0LCByb3dMYXN0OyAvLyBpbmNsdXNpdmUgZGF5LWluZGV4IHJhbmdlIGZvciBjdXJyZW50IHJvdwoJCXZhciBzZWdGaXJzdCwgc2VnTGFzdDsgLy8gaW5jbHVzaXZlIGRheS1pbmRleCByYW5nZSBmb3Igc2VnbWVudAoKCQlmb3IgKHJvdyA9IDA7IHJvdyA8IHRoaXMucm93Q250OyByb3crKykgewoJCQlyb3dGaXJzdCA9IHJvdyAqIGRheXNQZXJSb3c7CgkJCXJvd0xhc3QgPSByb3dGaXJzdCArIGRheXNQZXJSb3cgLSAxOwoKCQkJLy8gaW50ZXJzZWN0IHNlZ21lbnQncyBvZmZzZXQgcmFuZ2Ugd2l0aCB0aGUgcm93J3MKCQkJc2VnRmlyc3QgPSBNYXRoLm1heChyYW5nZUZpcnN0LCByb3dGaXJzdCk7CgkJCXNlZ0xhc3QgPSBNYXRoLm1pbihyYW5nZUxhc3QsIHJvd0xhc3QpOwoKCQkJLy8gZGVhbCB3aXRoIGluLWJldHdlZW4gaW5kaWNlcwoJCQlzZWdGaXJzdCA9IE1hdGguY2VpbChzZWdGaXJzdCk7IC8vIGluLWJldHdlZW4gc3RhcnRzIHJvdW5kIHRvIG5leHQgY2VsbAoJCQlzZWdMYXN0ID0gTWF0aC5mbG9vcihzZWdMYXN0KTsgLy8gaW4tYmV0d2VlbiBlbmRzIHJvdW5kIHRvIHByZXYgY2VsbAoKCQkJaWYgKHNlZ0ZpcnN0IDw9IHNlZ0xhc3QpIHsgLy8gd2FzIHRoZXJlIGFueSBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgY3VycmVudCByb3c/CgkJCQlzZWdzLnB1c2goewoJCQkJCXJvdzogcm93LAoKCQkJCQkvLyBub3JtYWxpemUgdG8gc3RhcnQgb2Ygcm93CgkJCQkJZmlyc3RSb3dEYXlJbmRleDogc2VnRmlyc3QgLSByb3dGaXJzdCwKCQkJCQlsYXN0Um93RGF5SW5kZXg6IHNlZ0xhc3QgLSByb3dGaXJzdCwKCgkJCQkJLy8gbXVzdCBiZSBtYXRjaGluZyBpbnRlZ2VycyB0byBiZSB0aGUgc2VnbWVudCdzIHN0YXJ0L2VuZAoJCQkJCWlzU3RhcnQ6IHNlZ0ZpcnN0ID09PSByYW5nZUZpcnN0LAoJCQkJCWlzRW5kOiBzZWdMYXN0ID09PSByYW5nZUxhc3QKCQkJCX0pOwoJCQl9CgkJfQoKCQlyZXR1cm4gc2VnczsKCX0sCgoKCS8vIFNsaWNlcyB1cCBhIGRhdGUgcmFuZ2UgaW50byBhIHNlZ21lbnQgZm9yIGV2ZXJ5IGRheS1jZWxsIGl0IGludGVyc2VjdHMgd2l0aC4KCS8vIFRPRE86IG1ha2UgbW9yZSBEUlkgd2l0aCBzbGljZVJhbmdlQnlSb3cgc29tZWhvdy4KCXNsaWNlUmFuZ2VCeURheTogZnVuY3Rpb24ocmFuZ2UpIHsKCQl2YXIgZGF5c1BlclJvdyA9IHRoaXMuZGF5c1BlclJvdzsKCQl2YXIgbm9ybWFsUmFuZ2UgPSB0aGlzLnZpZXcuY29tcHV0ZURheVJhbmdlKHJhbmdlKTsgLy8gbWFrZSB3aG9sZS1kYXkgcmFuZ2UsIGNvbnNpZGVyaW5nIG5leHREYXlUaHJlc2hvbGQKCQl2YXIgcmFuZ2VGaXJzdCA9IHRoaXMuZ2V0RGF0ZURheUluZGV4KG5vcm1hbFJhbmdlLnN0YXJ0KTsgLy8gaW5jbHVzaXZlIGZpcnN0IGluZGV4CgkJdmFyIHJhbmdlTGFzdCA9IHRoaXMuZ2V0RGF0ZURheUluZGV4KG5vcm1hbFJhbmdlLmVuZC5jbG9uZSgpLnN1YnRyYWN0KDEsICdkYXlzJykpOyAvLyBpbmNsdXNpdmUgbGFzdCBpbmRleAoJCXZhciBzZWdzID0gW107CgkJdmFyIHJvdzsKCQl2YXIgcm93Rmlyc3QsIHJvd0xhc3Q7IC8vIGluY2x1c2l2ZSBkYXktaW5kZXggcmFuZ2UgZm9yIGN1cnJlbnQgcm93CgkJdmFyIGk7CgkJdmFyIHNlZ0ZpcnN0LCBzZWdMYXN0OyAvLyBpbmNsdXNpdmUgZGF5LWluZGV4IHJhbmdlIGZvciBzZWdtZW50CgoJCWZvciAocm93ID0gMDsgcm93IDwgdGhpcy5yb3dDbnQ7IHJvdysrKSB7CgkJCXJvd0ZpcnN0ID0gcm93ICogZGF5c1BlclJvdzsKCQkJcm93TGFzdCA9IHJvd0ZpcnN0ICsgZGF5c1BlclJvdyAtIDE7CgoJCQlmb3IgKGkgPSByb3dGaXJzdDsgaSA8PSByb3dMYXN0OyBpKyspIHsKCgkJCQkvLyBpbnRlcnNlY3Qgc2VnbWVudCdzIG9mZnNldCByYW5nZSB3aXRoIHRoZSByb3cncwoJCQkJc2VnRmlyc3QgPSBNYXRoLm1heChyYW5nZUZpcnN0LCBpKTsKCQkJCXNlZ0xhc3QgPSBNYXRoLm1pbihyYW5nZUxhc3QsIGkpOwoKCQkJCS8vIGRlYWwgd2l0aCBpbi1iZXR3ZWVuIGluZGljZXMKCQkJCXNlZ0ZpcnN0ID0gTWF0aC5jZWlsKHNlZ0ZpcnN0KTsgLy8gaW4tYmV0d2VlbiBzdGFydHMgcm91bmQgdG8gbmV4dCBjZWxsCgkJCQlzZWdMYXN0ID0gTWF0aC5mbG9vcihzZWdMYXN0KTsgLy8gaW4tYmV0d2VlbiBlbmRzIHJvdW5kIHRvIHByZXYgY2VsbAoKCQkJCWlmIChzZWdGaXJzdCA8PSBzZWdMYXN0KSB7IC8vIHdhcyB0aGVyZSBhbnkgaW50ZXJzZWN0aW9uIHdpdGggdGhlIGN1cnJlbnQgcm93PwoJCQkJCXNlZ3MucHVzaCh7CgkJCQkJCXJvdzogcm93LAoKCQkJCQkJLy8gbm9ybWFsaXplIHRvIHN0YXJ0IG9mIHJvdwoJCQkJCQlmaXJzdFJvd0RheUluZGV4OiBzZWdGaXJzdCAtIHJvd0ZpcnN0LAoJCQkJCQlsYXN0Um93RGF5SW5kZXg6IHNlZ0xhc3QgLSByb3dGaXJzdCwKCgkJCQkJCS8vIG11c3QgYmUgbWF0Y2hpbmcgaW50ZWdlcnMgdG8gYmUgdGhlIHNlZ21lbnQncyBzdGFydC9lbmQKCQkJCQkJaXNTdGFydDogc2VnRmlyc3QgPT09IHJhbmdlRmlyc3QsCgkJCQkJCWlzRW5kOiBzZWdMYXN0ID09PSByYW5nZUxhc3QKCQkJCQl9KTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvKiBIZWFkZXIgUmVuZGVyaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJIZWFkSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCXJldHVybiAnJyArCgkJCSc8ZGl2IGNsYXNzPSJmYy1yb3cgJyArIHZpZXcud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj4nICsKCQkJCSc8dGFibGU+JyArCgkJCQkJJzx0aGVhZD4nICsKCQkJCQkJdGhpcy5yZW5kZXJIZWFkVHJIdG1sKCkgKwoJCQkJCSc8L3RoZWFkPicgKwoJCQkJJzwvdGFibGU+JyArCgkJCSc8L2Rpdj4nOwoJfSwKCgoJcmVuZGVySGVhZEludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCk7IC8vIGZhbGwgYmFjayB0byBnZW5lcmljCgl9LAoKCglyZW5kZXJIZWFkVHJIdG1sOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gJycgKwoJCQknPHRyPicgKwoJCQkJKHRoaXMuaXNSVEwgPyAnJyA6IHRoaXMucmVuZGVySGVhZEludHJvSHRtbCgpKSArCgkJCQl0aGlzLnJlbmRlckhlYWREYXRlQ2VsbHNIdG1sKCkgKwoJCQkJKHRoaXMuaXNSVEwgPyB0aGlzLnJlbmRlckhlYWRJbnRyb0h0bWwoKSA6ICcnKSArCgkJCSc8L3RyPic7Cgl9LAoKCglyZW5kZXJIZWFkRGF0ZUNlbGxzSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIGh0bWxzID0gW107CgkJdmFyIGNvbCwgZGF0ZTsKCgkJZm9yIChjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sKyspIHsKCQkJZGF0ZSA9IHRoaXMuZ2V0Q2VsbERhdGUoMCwgY29sKTsKCQkJaHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWREYXRlQ2VsbEh0bWwoZGF0ZSkpOwoJCX0KCgkJcmV0dXJuIGh0bWxzLmpvaW4oJycpOwoJfSwKCgoJLy8gVE9ETzogd2hlbiBpbnRlcm5hbEFwaVZlcnNpb24sIGFjY2VwdCBhbiBvYmplY3QgZm9yIEhUTUwgYXR0cmlidXRlcwoJLy8gKGNvbHNwYW4gc2hvdWxkIGJlIG5vIGRpZmZlcmVudCkKCXJlbmRlckhlYWREYXRlQ2VsbEh0bWw6IGZ1bmN0aW9uKGRhdGUsIGNvbHNwYW4sIG90aGVyQXR0cnMpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCgkJcmV0dXJuICcnICsKCQkJJzx0aCBjbGFzcz0iZmMtZGF5LWhlYWRlciAnICsgdmlldy53aWRnZXRIZWFkZXJDbGFzcyArICcgZmMtJyArIGRheUlEc1tkYXRlLmRheSgpXSArICciJyArCgkJCQkodGhpcy5yb3dDbnQgPT09IDEgPwoJCQkJCScgZGF0YS1kYXRlPSInICsgZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSArICciJyA6CgkJCQkJJycpICsKCQkJCShjb2xzcGFuID4gMSA/CgkJCQkJJyBjb2xzcGFuPSInICsgY29sc3BhbiArICciJyA6CgkJCQkJJycpICsKCQkJCShvdGhlckF0dHJzID8KCQkJCQknICcgKyBvdGhlckF0dHJzIDoKCQkJCQknJykgKwoJCQkJJz4nICsKCQkJCS8vIGRvbid0IG1ha2UgYSBsaW5rIGlmIHRoZSBoZWFkaW5nIGNvdWxkIHJlcHJlc2VudCBtdWx0aXBsZSBkYXlzLCBvciBpZiB0aGVyZSdzIG9ubHkgb25lIGRheSAoZm9yY2VPZmYpCgkJCQl2aWV3LmJ1aWxkR290b0FuY2hvckh0bWwoCgkJCQkJeyBkYXRlOiBkYXRlLCBmb3JjZU9mZjogdGhpcy5yb3dDbnQgPiAxIHx8IHRoaXMuY29sQ250ID09PSAxIH0sCgkJCQkJaHRtbEVzY2FwZShkYXRlLmZvcm1hdCh0aGlzLmNvbEhlYWRGb3JtYXQpKSAvLyBpbm5lciBIVE1MCgkJCQkpICsKCQkJJzwvdGg+JzsKCX0sCgoKCS8qIEJhY2tncm91bmQgUmVuZGVyaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJCZ1RySHRtbDogZnVuY3Rpb24ocm93KSB7CgkJcmV0dXJuICcnICsKCQkJJzx0cj4nICsKCQkJCSh0aGlzLmlzUlRMID8gJycgOiB0aGlzLnJlbmRlckJnSW50cm9IdG1sKHJvdykpICsKCQkJCXRoaXMucmVuZGVyQmdDZWxsc0h0bWwocm93KSArCgkJCQkodGhpcy5pc1JUTCA/IHRoaXMucmVuZGVyQmdJbnRyb0h0bWwocm93KSA6ICcnKSArCgkJCSc8L3RyPic7Cgl9LAoKCglyZW5kZXJCZ0ludHJvSHRtbDogZnVuY3Rpb24ocm93KSB7CgkJcmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCk7IC8vIGZhbGwgYmFjayB0byBnZW5lcmljCgl9LAoKCglyZW5kZXJCZ0NlbGxzSHRtbDogZnVuY3Rpb24ocm93KSB7CgkJdmFyIGh0bWxzID0gW107CgkJdmFyIGNvbCwgZGF0ZTsKCgkJZm9yIChjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sKyspIHsKCQkJZGF0ZSA9IHRoaXMuZ2V0Q2VsbERhdGUocm93LCBjb2wpOwoJCQlodG1scy5wdXNoKHRoaXMucmVuZGVyQmdDZWxsSHRtbChkYXRlKSk7CgkJfQoKCQlyZXR1cm4gaHRtbHMuam9pbignJyk7Cgl9LAoKCglyZW5kZXJCZ0NlbGxIdG1sOiBmdW5jdGlvbihkYXRlLCBvdGhlckF0dHJzKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGNsYXNzZXMgPSB0aGlzLmdldERheUNsYXNzZXMoZGF0ZSk7CgoJCWNsYXNzZXMudW5zaGlmdCgnZmMtZGF5Jywgdmlldy53aWRnZXRDb250ZW50Q2xhc3MpOwoKCQlyZXR1cm4gJzx0ZCBjbGFzcz0iJyArIGNsYXNzZXMuam9pbignICcpICsgJyInICsKCQkJJyBkYXRhLWRhdGU9IicgKyBkYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpICsgJyInICsgLy8gaWYgZGF0ZSBoYXMgYSB0aW1lLCB3b24ndCBmb3JtYXQgaXQKCQkJKG90aGVyQXR0cnMgPwoJCQkJJyAnICsgb3RoZXJBdHRycyA6CgkJCQknJykgKwoJCQknPjwvdGQ+JzsKCX0sCgoKCS8qIEdlbmVyaWMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyB0aGUgZGVmYXVsdCBIVE1MIGludHJvIGZvciBhbnkgcm93LiBVc2VyIGNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCglyZW5kZXJJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJfSwKCgoJLy8gVE9ETzogYSBnZW5lcmljIG1ldGhvZCBmb3IgZGVhbGluZyB3aXRoIDx0cj4sIFJUTCwgaW50cm8KCS8vIHdoZW4gaW5jcmVtZW50IGludGVybmFsQXBpVmVyc2lvbgoJLy8gd3JhcFRyIChzY2hlZHVsZXIpCgoKCS8qIFV0aWxzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBBcHBsaWVzIHRoZSBnZW5lcmljICJpbnRybyIgYW5kICJvdXRybyIgSFRNTCB0byB0aGUgZ2l2ZW4gY2VsbHMuCgkvLyBJbnRybyBtZWFucyB0aGUgbGVmdG1vc3QgY2VsbCB3aGVuIHRoZSBjYWxlbmRhciBpcyBMVFIgYW5kIHRoZSByaWdodG1vc3QgY2VsbCB3aGVuIFJUTC4gVmljZS12ZXJzYSBmb3Igb3V0cm8uCglib29rZW5kQ2VsbHM6IGZ1bmN0aW9uKHRyRWwpIHsKCQl2YXIgaW50cm9IdG1sID0gdGhpcy5yZW5kZXJJbnRyb0h0bWwoKTsKCgkJaWYgKGludHJvSHRtbCkgewoJCQlpZiAodGhpcy5pc1JUTCkgewoJCQkJdHJFbC5hcHBlbmQoaW50cm9IdG1sKTsKCQkJfQoJCQllbHNlIHsKCQkJCXRyRWwucHJlcGVuZChpbnRyb0h0bWwpOwoJCQl9CgkJfQoJfQoKfTsKCjs7CgovKiBBIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgYSBncmlkIG9mIHdob2xlLWRheXMgdGhhdCBydW5zIGhvcml6b250YWxseS4gVGhlcmUgY2FuIGJlIG11bHRpcGxlIHJvd3MsIG9uZSBwZXIgd2Vlay4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgRGF5R3JpZCA9IEZDLkRheUdyaWQgPSBHcmlkLmV4dGVuZChEYXlUYWJsZU1peGluLCB7CgoJbnVtYmVyc1Zpc2libGU6IGZhbHNlLCAvLyBzaG91bGQgcmVuZGVyIGEgcm93IGZvciBkYXkvd2VlayBudW1iZXJzPyBzZXQgYnkgb3V0c2lkZSB2aWV3LiBUT0RPOiBtYWtlIGludGVybmFsCglib3R0b21Db29yZFBhZGRpbmc6IDAsIC8vIGhhY2sgZm9yIGV4dGVuZGluZyB0aGUgaGl0IGFyZWEgZm9yIHRoZSBsYXN0IHJvdyBvZiB0aGUgY29vcmRpbmF0ZSBncmlkCgoJcm93RWxzOiBudWxsLCAvLyBzZXQgb2YgZmFrZSByb3cgZWxlbWVudHMKCWNlbGxFbHM6IG51bGwsIC8vIHNldCBvZiB3aG9sZS1kYXkgZWxlbWVudHMgY29tcHJpc2luZyB0aGUgcm93J3MgYmFja2dyb3VuZAoJaGVscGVyRWxzOiBudWxsLCAvLyBzZXQgb2YgY2VsbCBza2VsZXRvbiBlbGVtZW50cyBmb3IgcmVuZGVyaW5nIHRoZSBtb2NrIGV2ZW50ICJoZWxwZXIiCgoJcm93Q29vcmRDYWNoZTogbnVsbCwKCWNvbENvb3JkQ2FjaGU6IG51bGwsCgoKCS8vIFJlbmRlcnMgdGhlIHJvd3MgYW5kIGNvbHVtbnMgaW50byB0aGUgY29tcG9uZW50J3MgYHRoaXMuZWxgLCB3aGljaCBzaG91bGQgYWxyZWFkeSBiZSBhc3NpZ25lZC4KCS8vIGlzUmlnaWQgZGV0ZXJtaW5zIHdoZXRoZXIgdGhlIGluZGl2aWR1YWwgcm93cyBzaG91bGQgaWdub3JlIHRoZSBjb250ZW50cyBhbmQgYmUgYSBjb25zdGFudCBoZWlnaHQuCgkvLyBSZWxpZXMgb24gdGhlIHZpZXcncyBjb2xDbnQgYW5kIHJvd0NudC4gSW4gdGhlIGZ1dHVyZSwgdGhpcyBjb21wb25lbnQgc2hvdWxkIHByb2JhYmx5IGJlIHNlbGYtc3VmZmljaWVudC4KCXJlbmRlckRhdGVzOiBmdW5jdGlvbihpc1JpZ2lkKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIHJvd0NudCA9IHRoaXMucm93Q250OwoJCXZhciBjb2xDbnQgPSB0aGlzLmNvbENudDsKCQl2YXIgaHRtbCA9ICcnOwoJCXZhciByb3c7CgkJdmFyIGNvbDsKCgkJZm9yIChyb3cgPSAwOyByb3cgPCByb3dDbnQ7IHJvdysrKSB7CgkJCWh0bWwgKz0gdGhpcy5yZW5kZXJEYXlSb3dIdG1sKHJvdywgaXNSaWdpZCk7CgkJfQoJCXRoaXMuZWwuaHRtbChodG1sKTsKCgkJdGhpcy5yb3dFbHMgPSB0aGlzLmVsLmZpbmQoJy5mYy1yb3cnKTsKCQl0aGlzLmNlbGxFbHMgPSB0aGlzLmVsLmZpbmQoJy5mYy1kYXknKTsKCgkJdGhpcy5yb3dDb29yZENhY2hlID0gbmV3IENvb3JkQ2FjaGUoewoJCQllbHM6IHRoaXMucm93RWxzLAoJCQlpc1ZlcnRpY2FsOiB0cnVlCgkJfSk7CgkJdGhpcy5jb2xDb29yZENhY2hlID0gbmV3IENvb3JkQ2FjaGUoewoJCQllbHM6IHRoaXMuY2VsbEVscy5zbGljZSgwLCB0aGlzLmNvbENudCksIC8vIG9ubHkgdGhlIGZpcnN0IHJvdwoJCQlpc0hvcml6b250YWw6IHRydWUKCQl9KTsKCgkJLy8gdHJpZ2dlciBkYXlSZW5kZXIgd2l0aCBlYWNoIGNlbGwncyBlbGVtZW50CgkJZm9yIChyb3cgPSAwOyByb3cgPCByb3dDbnQ7IHJvdysrKSB7CgkJCWZvciAoY29sID0gMDsgY29sIDwgY29sQ250OyBjb2wrKykgewoJCQkJdmlldy50cmlnZ2VyKAoJCQkJCSdkYXlSZW5kZXInLAoJCQkJCW51bGwsCgkJCQkJdGhpcy5nZXRDZWxsRGF0ZShyb3csIGNvbCksCgkJCQkJdGhpcy5nZXRDZWxsRWwocm93LCBjb2wpCgkJCQkpOwoJCQl9CgkJfQoJfSwKCgoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW1vdmVTZWdQb3BvdmVyKCk7Cgl9LAoKCglyZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQl2YXIgc2VncyA9IHRoaXMuYnVpbGRCdXNpbmVzc0hvdXJTZWdzKHRydWUpOyAvLyB3aG9sZURheT10cnVlCgkJdGhpcy5yZW5kZXJGaWxsKCdidXNpbmVzc0hvdXJzJywgc2VncywgJ2JnZXZlbnQnKTsKCX0sCgoKCXVucmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckZpbGwoJ2J1c2luZXNzSG91cnMnKTsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBzaW5nbGUgcm93LCB3aGljaCBpcyBhIGRpdiB0aGF0IHdyYXBzIGEgdGFibGUuCgkvLyBgcm93YCBpcyB0aGUgcm93IG51bWJlci4KCXJlbmRlckRheVJvd0h0bWw6IGZ1bmN0aW9uKHJvdywgaXNSaWdpZCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBjbGFzc2VzID0gWyAnZmMtcm93JywgJ2ZjLXdlZWsnLCB2aWV3LndpZGdldENvbnRlbnRDbGFzcyBdOwoKCQlpZiAoaXNSaWdpZCkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLXJpZ2lkJyk7CgkJfQoKCQlyZXR1cm4gJycgKwoJCQknPGRpdiBjbGFzcz0iJyArIGNsYXNzZXMuam9pbignICcpICsgJyI+JyArCgkJCQknPGRpdiBjbGFzcz0iZmMtYmciPicgKwoJCQkJCSc8dGFibGU+JyArCgkJCQkJCXRoaXMucmVuZGVyQmdUckh0bWwocm93KSArCgkJCQkJJzwvdGFibGU+JyArCgkJCQknPC9kaXY+JyArCgkJCQknPGRpdiBjbGFzcz0iZmMtY29udGVudC1za2VsZXRvbiI+JyArCgkJCQkJJzx0YWJsZT4nICsKCQkJCQkJKHRoaXMubnVtYmVyc1Zpc2libGUgPwoJCQkJCQkJJzx0aGVhZD4nICsKCQkJCQkJCQl0aGlzLnJlbmRlck51bWJlclRySHRtbChyb3cpICsKCQkJCQkJCSc8L3RoZWFkPicgOgoJCQkJCQkJJycKCQkJCQkJCSkgKwoJCQkJCSc8L3RhYmxlPicgKwoJCQkJJzwvZGl2PicgKwoJCQknPC9kaXY+JzsKCX0sCgoKCS8qIEdyaWQgTnVtYmVyIFJlbmRlcmluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyTnVtYmVyVHJIdG1sOiBmdW5jdGlvbihyb3cpIHsKCQlyZXR1cm4gJycgKwoJCQknPHRyPicgKwoJCQkJKHRoaXMuaXNSVEwgPyAnJyA6IHRoaXMucmVuZGVyTnVtYmVySW50cm9IdG1sKHJvdykpICsKCQkJCXRoaXMucmVuZGVyTnVtYmVyQ2VsbHNIdG1sKHJvdykgKwoJCQkJKHRoaXMuaXNSVEwgPyB0aGlzLnJlbmRlck51bWJlckludHJvSHRtbChyb3cpIDogJycpICsKCQkJJzwvdHI+JzsKCX0sCgoKCXJlbmRlck51bWJlckludHJvSHRtbDogZnVuY3Rpb24ocm93KSB7CgkJcmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCk7Cgl9LAoKCglyZW5kZXJOdW1iZXJDZWxsc0h0bWw6IGZ1bmN0aW9uKHJvdykgewoJCXZhciBodG1scyA9IFtdOwoJCXZhciBjb2wsIGRhdGU7CgoJCWZvciAoY29sID0gMDsgY29sIDwgdGhpcy5jb2xDbnQ7IGNvbCsrKSB7CgkJCWRhdGUgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgY29sKTsKCQkJaHRtbHMucHVzaCh0aGlzLnJlbmRlck51bWJlckNlbGxIdG1sKGRhdGUpKTsKCQl9CgoJCXJldHVybiBodG1scy5qb2luKCcnKTsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIDx0ZD5zIG9mIHRoZSAibnVtYmVyIiByb3cgaW4gdGhlIERheUdyaWQncyBjb250ZW50IHNrZWxldG9uLgoJLy8gVGhlIG51bWJlciByb3cgd2lsbCBvbmx5IGV4aXN0IGlmIGVpdGhlciBkYXkgbnVtYmVycyBvciB3ZWVrIG51bWJlcnMgYXJlIHR1cm5lZCBvbi4KCXJlbmRlck51bWJlckNlbGxIdG1sOiBmdW5jdGlvbihkYXRlKSB7CgkJdmFyIGh0bWwgPSAnJzsKCQl2YXIgY2xhc3NlczsKCQl2YXIgd2Vla0NhbGNGaXJzdERvVzsKCgkJaWYgKCF0aGlzLnZpZXcuZGF5TnVtYmVyc1Zpc2libGUgJiYgIXRoaXMudmlldy5jZWxsV2Vla051bWJlcnNWaXNpYmxlKSB7CgkJCS8vIG5vIG51bWJlcnMgaW4gZGF5IGNlbGwgKHdlZWsgbnVtYmVyIG11c3QgYmUgYWxvbmcgdGhlIHNpZGUpCgkJCXJldHVybiAnPHRkLz4nOyAvLyAgd2lsbCBjcmVhdGUgYW4gZW1wdHkgc3BhY2UgYWJvdmUgZXZlbnRzIDooCgkJfQoKCQljbGFzc2VzID0gdGhpcy5nZXREYXlDbGFzc2VzKGRhdGUpOwoJCWNsYXNzZXMudW5zaGlmdCgnZmMtZGF5LXRvcCcpOwoKCQlpZiAodGhpcy52aWV3LmNlbGxXZWVrTnVtYmVyc1Zpc2libGUpIHsKCQkJLy8gVG8gZGV0ZXJtaW5lIHRoZSBkYXkgb2Ygd2VlayBudW1iZXIgY2hhbmdlIHVuZGVyIElTTywgd2UgY2Fubm90CgkJCS8vIHJlbHkgb24gbW9tZW50LmpzIG1ldGhvZHMgc3VjaCBhcyBmaXJzdERheU9mV2VlaygpIG9yIHdlZWtkYXkoKSwKCQkJLy8gYmVjYXVzZSB0aGV5IHJlbHkgb24gdGhlIGxvY2FsZSdzIGRvdyAocG9zc2libHkgb3ZlcnJpZGRlbiBieQoJCQkvLyBvdXIgZmlyc3REYXkgb3B0aW9uKSwgd2hpY2ggbWF5IG5vdCBiZSBNb25kYXkuIFdlIGNhbm5vdCBjaGFuZ2UKCQkJLy8gZG93LCBiZWNhdXNlIHRoYXQgd291bGQgYWZmZWN0IHRoZSBjYWxlbmRhciBzdGFydCBkYXkgYXMgd2VsbC4KCQkJaWYgKGRhdGUuX2xvY2FsZS5fZnVsbENhbGVuZGFyX3dlZWtDYWxjID09PSAnSVNPJykgewoJCQkJd2Vla0NhbGNGaXJzdERvVyA9IDE7ICAvLyBNb25kYXkgYnkgSVNPIDg2MDEgZGVmaW5pdGlvbgoJCQl9CgkJCWVsc2UgewoJCQkJd2Vla0NhbGNGaXJzdERvVyA9IGRhdGUuX2xvY2FsZS5maXJzdERheU9mV2VlaygpOwoJCQl9CgkJfQoKCQlodG1sICs9ICc8dGQgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciIGRhdGEtZGF0ZT0iJyArIGRhdGUuZm9ybWF0KCkgKyAnIj4nOwoKCQlpZiAodGhpcy52aWV3LmNlbGxXZWVrTnVtYmVyc1Zpc2libGUgJiYgKGRhdGUuZGF5KCkgPT0gd2Vla0NhbGNGaXJzdERvVykpIHsKCQkJaHRtbCArPSB0aGlzLnZpZXcuYnVpbGRHb3RvQW5jaG9ySHRtbCgKCQkJCXsgZGF0ZTogZGF0ZSwgdHlwZTogJ3dlZWsnIH0sCgkJCQl7ICdjbGFzcyc6ICdmYy13ZWVrLW51bWJlcicgfSwKCQkJCWRhdGUuZm9ybWF0KCd3JykgLy8gaW5uZXIgSFRNTAoJCQkpOwoJCX0KCgkJaWYgKHRoaXMudmlldy5kYXlOdW1iZXJzVmlzaWJsZSkgewoJCQlodG1sICs9IHRoaXMudmlldy5idWlsZEdvdG9BbmNob3JIdG1sKAoJCQkJZGF0ZSwKCQkJCXsgJ2NsYXNzJzogJ2ZjLWRheS1udW1iZXInIH0sCgkJCQlkYXRlLmRhdGUoKSAvLyBpbm5lciBIVE1MCgkJCSk7CgkJfQoKCQlodG1sICs9ICc8L3RkPic7CgoJCXJldHVybiBodG1sOwoJfSwKCgoJLyogT3B0aW9ucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZXMgYSBkZWZhdWx0IGV2ZW50IHRpbWUgZm9ybWF0dGluZyBzdHJpbmcgaWYgYHRpbWVGb3JtYXRgIGlzIG5vdCBleHBsaWNpdGx5IGRlZmluZWQKCWNvbXB1dGVFdmVudFRpbWVGb3JtYXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnZpZXcub3B0KCdleHRyYVNtYWxsVGltZUZvcm1hdCcpOyAvLyBsaWtlICI2cCIgb3IgIjY6MzBwIgoJfSwKCgoJLy8gQ29tcHV0ZXMgYSBkZWZhdWx0IGBkaXNwbGF5RXZlbnRFbmRgIHZhbHVlIGlmIG9uZSBpcyBub3QgZXhwbGljbHR5IGRlZmluZWQKCWNvbXB1dGVEaXNwbGF5RXZlbnRFbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmNvbENudCA9PSAxOyAvLyB3ZSdsbCBsaWtlbHkgaGF2ZSBzcGFjZSBpZiB0aGVyZSdzIG9ubHkgb25lIGRheQoJfSwKCgoJLyogRGF0ZXMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCXJhbmdlVXBkYXRlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy51cGRhdGVEYXlUYWJsZSgpOwoJfSwKCgoJLy8gU2xpY2VzIHVwIHRoZSBnaXZlbiBzcGFuICh1bnpvbmVkIHN0YXJ0L2VuZCB3aXRoIG90aGVyIG1pc2MgZGF0YSkgaW50byBhbiBhcnJheSBvZiBzZWdtZW50cwoJc3BhblRvU2VnczogZnVuY3Rpb24oc3BhbikgewoJCXZhciBzZWdzID0gdGhpcy5zbGljZVJhbmdlQnlSb3coc3Bhbik7CgkJdmFyIGksIHNlZzsKCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCQkJaWYgKHRoaXMuaXNSVEwpIHsKCQkJCXNlZy5sZWZ0Q29sID0gdGhpcy5kYXlzUGVyUm93IC0gMSAtIHNlZy5sYXN0Um93RGF5SW5kZXg7CgkJCQlzZWcucmlnaHRDb2wgPSB0aGlzLmRheXNQZXJSb3cgLSAxIC0gc2VnLmZpcnN0Um93RGF5SW5kZXg7CgkJCX0KCQkJZWxzZSB7CgkJCQlzZWcubGVmdENvbCA9IHNlZy5maXJzdFJvd0RheUluZGV4OwoJCQkJc2VnLnJpZ2h0Q29sID0gc2VnLmxhc3RSb3dEYXlJbmRleDsKCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvKiBIaXQgU3lzdGVtCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglwcmVwYXJlSGl0czogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb2xDb29yZENhY2hlLmJ1aWxkKCk7CgkJdGhpcy5yb3dDb29yZENhY2hlLmJ1aWxkKCk7CgkJdGhpcy5yb3dDb29yZENhY2hlLmJvdHRvbXNbdGhpcy5yb3dDbnQgLSAxXSArPSB0aGlzLmJvdHRvbUNvb3JkUGFkZGluZzsgLy8gaGFjawoJfSwKCgoJcmVsZWFzZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29sQ29vcmRDYWNoZS5jbGVhcigpOwoJCXRoaXMucm93Q29vcmRDYWNoZS5jbGVhcigpOwoJfSwKCgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewoJCWlmICh0aGlzLmNvbENvb3JkQ2FjaGUuaXNMZWZ0SW5Cb3VuZHMobGVmdE9mZnNldCkgJiYgdGhpcy5yb3dDb29yZENhY2hlLmlzVG9wSW5Cb3VuZHModG9wT2Zmc2V0KSkgewoJCQl2YXIgY29sID0gdGhpcy5jb2xDb29yZENhY2hlLmdldEhvcml6b250YWxJbmRleChsZWZ0T2Zmc2V0KTsKCQkJdmFyIHJvdyA9IHRoaXMucm93Q29vcmRDYWNoZS5nZXRWZXJ0aWNhbEluZGV4KHRvcE9mZnNldCk7CgoJCQlpZiAocm93ICE9IG51bGwgJiYgY29sICE9IG51bGwpIHsKCQkJCXJldHVybiB0aGlzLmdldENlbGxIaXQocm93LCBjb2wpOwoJCQl9CgkJfQoJfSwKCgoJZ2V0SGl0U3BhbjogZnVuY3Rpb24oaGl0KSB7CgkJcmV0dXJuIHRoaXMuZ2V0Q2VsbFJhbmdlKGhpdC5yb3csIGhpdC5jb2wpOwoJfSwKCgoJZ2V0SGl0RWw6IGZ1bmN0aW9uKGhpdCkgewoJCXJldHVybiB0aGlzLmdldENlbGxFbChoaXQucm93LCBoaXQuY29sKTsKCX0sCgoKCS8qIENlbGwgU3lzdGVtCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJLy8gRllJOiB0aGUgZmlyc3QgY29sdW1uIGlzIHRoZSBsZWZ0bW9zdCBjb2x1bW4sIHJlZ2FyZGxlc3Mgb2YgZGF0ZQoKCglnZXRDZWxsSGl0OiBmdW5jdGlvbihyb3csIGNvbCkgewoJCXJldHVybiB7CgkJCXJvdzogcm93LAoJCQljb2w6IGNvbCwKCQkJY29tcG9uZW50OiB0aGlzLCAvLyBuZWVkZWQgdW5mb3J0dW5hdGVseSA6KAoJCQlsZWZ0OiB0aGlzLmNvbENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChjb2wpLAoJCQlyaWdodDogdGhpcy5jb2xDb29yZENhY2hlLmdldFJpZ2h0T2Zmc2V0KGNvbCksCgkJCXRvcDogdGhpcy5yb3dDb29yZENhY2hlLmdldFRvcE9mZnNldChyb3cpLAoJCQlib3R0b206IHRoaXMucm93Q29vcmRDYWNoZS5nZXRCb3R0b21PZmZzZXQocm93KQoJCX07Cgl9LAoKCglnZXRDZWxsRWw6IGZ1bmN0aW9uKHJvdywgY29sKSB7CgkJcmV0dXJuIHRoaXMuY2VsbEVscy5lcShyb3cgKiB0aGlzLmNvbENudCArIGNvbCk7Cgl9LAoKCgkvKiBFdmVudCBEcmFnIFZpc3VhbGl6YXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkvLyBUT0RPOiBtb3ZlIHRvIERheUdyaWQuZXZlbnQsIHNpbWlsYXIgdG8gd2hhdCB3ZSBkaWQgd2l0aCBHcmlkJ3MgZHJhZyBtZXRob2RzCgoKCS8vIFJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhbiBldmVudCBvciBleHRlcm5hbCBlbGVtZW50IGJlaW5nIGRyYWdnZWQuCgkvLyBgZXZlbnRMb2NhdGlvbmAgaGFzIHpvbmVkIHN0YXJ0IGFuZCBlbmQgKG9wdGlvbmFsKQoJcmVuZGVyRHJhZzogZnVuY3Rpb24oZXZlbnRMb2NhdGlvbiwgc2VnKSB7CgoJCS8vIGFsd2F5cyByZW5kZXIgYSBoaWdobGlnaHQgdW5kZXJuZWF0aAoJCXRoaXMucmVuZGVySGlnaGxpZ2h0KHRoaXMuZXZlbnRUb1NwYW4oZXZlbnRMb2NhdGlvbikpOwoKCQkvLyBpZiBhIHNlZ21lbnQgZnJvbSB0aGUgc2FtZSBjYWxlbmRhciBidXQgYW5vdGhlciBjb21wb25lbnQgaXMgYmVpbmcgZHJhZ2dlZCwgcmVuZGVyIGEgaGVscGVyIGV2ZW50CgkJaWYgKHNlZyAmJiBzZWcuY29tcG9uZW50ICE9PSB0aGlzKSB7CgkJCXJldHVybiB0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIoZXZlbnRMb2NhdGlvbiwgc2VnKTsgLy8gcmV0dXJucyBtb2NrIGV2ZW50IGVsZW1lbnRzCgkJfQoJfSwKCgoJLy8gVW5yZW5kZXJzIGFueSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhIGhvdmVyaW5nIGV2ZW50Cgl1bnJlbmRlckRyYWc6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKCQl0aGlzLnVucmVuZGVySGVscGVyKCk7Cgl9LAoKCgkvKiBFdmVudCBSZXNpemUgVmlzdWFsaXphdGlvbgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIHJlc2l6ZWQKCXJlbmRlckV2ZW50UmVzaXplOiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzZWcpIHsKCQl0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKGV2ZW50TG9jYXRpb24pKTsKCQlyZXR1cm4gdGhpcy5yZW5kZXJFdmVudExvY2F0aW9uSGVscGVyKGV2ZW50TG9jYXRpb24sIHNlZyk7IC8vIHJldHVybnMgbW9jayBldmVudCBlbGVtZW50cwoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgYmVpbmcgcmVzaXplZAoJdW5yZW5kZXJFdmVudFJlc2l6ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhpZ2hsaWdodCgpOwoJCXRoaXMudW5yZW5kZXJIZWxwZXIoKTsKCX0sCgoKCS8qIEV2ZW50IEhlbHBlcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIG1vY2sgImhlbHBlciIgZXZlbnQuIGBzb3VyY2VTZWdgIGlzIHRoZSBhc3NvY2lhdGVkIGludGVybmFsIHNlZ21lbnQgb2JqZWN0LiBJdCBjYW4gYmUgbnVsbC4KCXJlbmRlckhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHNvdXJjZVNlZykgewoJCXZhciBoZWxwZXJOb2RlcyA9IFtdOwoJCXZhciBzZWdzID0gdGhpcy5ldmVudFRvU2VncyhldmVudCk7CgkJdmFyIHJvd1N0cnVjdHM7CgoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MpOyAvLyBhc3NpZ25zIGVhY2ggc2VnJ3MgZWwgYW5kIHJldHVybnMgYSBzdWJzZXQgb2Ygc2VncyB0aGF0IHdlcmUgcmVuZGVyZWQKCQlyb3dTdHJ1Y3RzID0gdGhpcy5yZW5kZXJTZWdSb3dzKHNlZ3MpOwoKCQkvLyBpbmplY3QgZWFjaCBuZXcgZXZlbnQgc2tlbGV0b24gaW50byBlYWNoIGFzc29jaWF0ZWQgcm93CgkJdGhpcy5yb3dFbHMuZWFjaChmdW5jdGlvbihyb3csIHJvd05vZGUpIHsKCQkJdmFyIHJvd0VsID0gJChyb3dOb2RlKTsgLy8gdGhlIC5mYy1yb3cKCQkJdmFyIHNrZWxldG9uRWwgPSAkKCc8ZGl2IGNsYXNzPSJmYy1oZWxwZXItc2tlbGV0b24iPjx0YWJsZS8+PC9kaXY+Jyk7IC8vIHdpbGwgYmUgYWJzb2x1dGVseSBwb3NpdGlvbmVkCgkJCXZhciBza2VsZXRvblRvcDsKCgkJCS8vIElmIHRoZXJlIGlzIGFuIG9yaWdpbmFsIHNlZ21lbnQsIG1hdGNoIHRoZSB0b3AgcG9zaXRpb24uIE90aGVyd2lzZSwgcHV0IGl0IGF0IHRoZSByb3cncyB0b3AgbGV2ZWwKCQkJaWYgKHNvdXJjZVNlZyAmJiBzb3VyY2VTZWcucm93ID09PSByb3cpIHsKCQkJCXNrZWxldG9uVG9wID0gc291cmNlU2VnLmVsLnBvc2l0aW9uKCkudG9wOwoJCQl9CgkJCWVsc2UgewoJCQkJc2tlbGV0b25Ub3AgPSByb3dFbC5maW5kKCcuZmMtY29udGVudC1za2VsZXRvbiB0Ym9keScpLnBvc2l0aW9uKCkudG9wOwoJCQl9CgoJCQlza2VsZXRvbkVsLmNzcygndG9wJywgc2tlbGV0b25Ub3ApCgkJCQkuZmluZCgndGFibGUnKQoJCQkJCS5hcHBlbmQocm93U3RydWN0c1tyb3ddLnRib2R5RWwpOwoKCQkJcm93RWwuYXBwZW5kKHNrZWxldG9uRWwpOwoJCQloZWxwZXJOb2Rlcy5wdXNoKHNrZWxldG9uRWxbMF0pOwoJCX0pOwoKCQlyZXR1cm4gKCAvLyBtdXN0IHJldHVybiB0aGUgZWxlbWVudHMgcmVuZGVyZWQKCQkJdGhpcy5oZWxwZXJFbHMgPSAkKGhlbHBlck5vZGVzKSAvLyBhcnJheSAtPiBqUXVlcnkgc2V0CgkJKTsKCX0sCgoKCS8vIFVucmVuZGVycyBhbnkgdmlzdWFsIGluZGljYXRpb24gb2YgYSBtb2NrIGhlbHBlciBldmVudAoJdW5yZW5kZXJIZWxwZXI6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhlbHBlckVscykgewoJCQl0aGlzLmhlbHBlckVscy5yZW1vdmUoKTsKCQkJdGhpcy5oZWxwZXJFbHMgPSBudWxsOwoJCX0KCX0sCgoKCS8qIEZpbGwgU3lzdGVtIChoaWdobGlnaHQsIGJhY2tncm91bmQgZXZlbnRzLCBidXNpbmVzcyBob3VycykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCWZpbGxTZWdUYWc6ICd0ZCcsIC8vIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHRhZyBuYW1lCgoKCS8vIFJlbmRlcnMgYSBzZXQgb2YgcmVjdGFuZ2xlcyBvdmVyIHRoZSBnaXZlbiBzZWdtZW50cyBvZiBkYXlzLgoJLy8gT25seSByZXR1cm5zIHNlZ21lbnRzIHRoYXQgc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkLgoJcmVuZGVyRmlsbDogZnVuY3Rpb24odHlwZSwgc2VncywgY2xhc3NOYW1lKSB7CgkJdmFyIG5vZGVzID0gW107CgkJdmFyIGksIHNlZzsKCQl2YXIgc2tlbGV0b25FbDsKCgkJc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0Vscyh0eXBlLCBzZWdzKTsgLy8gYXNzaWduZXMgYC5lbGAgdG8gZWFjaCBzZWcuIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkIHNlZ3MKCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCQkJc2tlbGV0b25FbCA9IHRoaXMucmVuZGVyRmlsbFJvdyh0eXBlLCBzZWcsIGNsYXNzTmFtZSk7CgkJCXRoaXMucm93RWxzLmVxKHNlZy5yb3cpLmFwcGVuZChza2VsZXRvbkVsKTsKCQkJbm9kZXMucHVzaChza2VsZXRvbkVsWzBdKTsKCQl9CgoJCXRoaXMuZWxzQnlGaWxsW3R5cGVdID0gJChub2Rlcyk7CgoJCXJldHVybiBzZWdzOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIG5lZWRlZCBmb3Igb25lIHJvdyBvZiBhIGZpbGwuIFJlcXVpcmVzIHRoZSBzZWcncyBlbCB0byBiZSByZW5kZXJlZC4KCXJlbmRlckZpbGxSb3c6IGZ1bmN0aW9uKHR5cGUsIHNlZywgY2xhc3NOYW1lKSB7CgkJdmFyIGNvbENudCA9IHRoaXMuY29sQ250OwoJCXZhciBzdGFydENvbCA9IHNlZy5sZWZ0Q29sOwoJCXZhciBlbmRDb2wgPSBzZWcucmlnaHRDb2wgKyAxOwoJCXZhciBza2VsZXRvbkVsOwoJCXZhciB0ckVsOwoKCQljbGFzc05hbWUgPSBjbGFzc05hbWUgfHwgdHlwZS50b0xvd2VyQ2FzZSgpOwoKCQlza2VsZXRvbkVsID0gJCgKCQkJJzxkaXYgY2xhc3M9ImZjLScgKyBjbGFzc05hbWUgKyAnLXNrZWxldG9uIj4nICsKCQkJCSc8dGFibGU+PHRyLz48L3RhYmxlPicgKwoJCQknPC9kaXY+JwoJCSk7CgkJdHJFbCA9IHNrZWxldG9uRWwuZmluZCgndHInKTsKCgkJaWYgKHN0YXJ0Q29sID4gMCkgewoJCQl0ckVsLmFwcGVuZCgnPHRkIGNvbHNwYW49IicgKyBzdGFydENvbCArICciLz4nKTsKCQl9CgoJCXRyRWwuYXBwZW5kKAoJCQlzZWcuZWwuYXR0cignY29sc3BhbicsIGVuZENvbCAtIHN0YXJ0Q29sKQoJCSk7CgoJCWlmIChlbmRDb2wgPCBjb2xDbnQpIHsKCQkJdHJFbC5hcHBlbmQoJzx0ZCBjb2xzcGFuPSInICsgKGNvbENudCAtIGVuZENvbCkgKyAnIi8+Jyk7CgkJfQoKCQl0aGlzLmJvb2tlbmRDZWxscyh0ckVsKTsKCgkJcmV0dXJuIHNrZWxldG9uRWw7Cgl9Cgp9KTsKCjs7CgovKiBFdmVudC1yZW5kZXJpbmcgbWV0aG9kcyBmb3IgdGhlIERheUdyaWQgY2xhc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpEYXlHcmlkLm1peGluKHsKCglyb3dTdHJ1Y3RzOiBudWxsLCAvLyBhbiBhcnJheSBvZiBvYmplY3RzLCBlYWNoIGhvbGRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSByb3cncyBmb3JlZ3JvdW5kIGV2ZW50LXJlbmRlcmluZwoKCgkvLyBVbnJlbmRlcnMgYWxsIGV2ZW50cyBjdXJyZW50bHkgcmVuZGVyZWQgb24gdGhlIGdyaWQKCXVucmVuZGVyRXZlbnRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnJlbW92ZVNlZ1BvcG92ZXIoKTsgLy8gcmVtb3ZlcyB0aGUgIm1vcmUuLiIgZXZlbnRzIHBvcG92ZXIKCQlHcmlkLnByb3RvdHlwZS51bnJlbmRlckV2ZW50cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBjYWxscyB0aGUgc3VwZXItbWV0aG9kCgl9LAoKCgkvLyBSZXRyaWV2ZXMgYWxsIHJlbmRlcmVkIHNlZ21lbnQgb2JqZWN0cyBjdXJyZW50bHkgcmVuZGVyZWQgb24gdGhlIGdyaWQKCWdldEV2ZW50U2VnczogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIEdyaWQucHJvdG90eXBlLmdldEV2ZW50U2Vncy5jYWxsKHRoaXMpIC8vIGdldCB0aGUgc2VnbWVudHMgZnJvbSB0aGUgc3VwZXItbWV0aG9kCgkJCS5jb25jYXQodGhpcy5wb3BvdmVyU2VncyB8fCBbXSk7IC8vIGFwcGVuZCB0aGUgc2VnbWVudHMgZnJvbSB0aGUgIm1vcmUuLi4iIHBvcG92ZXIKCX0sCgoKCS8vIFJlbmRlcnMgdGhlIGdpdmVuIGJhY2tncm91bmQgZXZlbnQgc2VnbWVudHMgb250byB0aGUgZ3JpZAoJcmVuZGVyQmdTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgoJCS8vIGRvbid0IHJlbmRlciB0aW1lZCBiYWNrZ3JvdW5kIGV2ZW50cwoJCXZhciBhbGxEYXlTZWdzID0gJC5ncmVwKHNlZ3MsIGZ1bmN0aW9uKHNlZykgewoJCQlyZXR1cm4gc2VnLmV2ZW50LmFsbERheTsKCQl9KTsKCgkJcmV0dXJuIEdyaWQucHJvdG90eXBlLnJlbmRlckJnU2Vncy5jYWxsKHRoaXMsIGFsbERheVNlZ3MpOyAvLyBjYWxsIHRoZSBzdXBlci1tZXRob2QKCX0sCgoKCS8vIFJlbmRlcnMgdGhlIGdpdmVuIGZvcmVncm91bmQgZXZlbnQgc2VnbWVudHMgb250byB0aGUgZ3JpZAoJcmVuZGVyRmdTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJdmFyIHJvd1N0cnVjdHM7CgoJCS8vIHJlbmRlciBhbiBgLmVsYCBvbiBlYWNoIHNlZwoJCS8vIHJldHVybnMgYSBzdWJzZXQgb2YgdGhlIHNlZ3MuIHNlZ3MgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlbmRlcmVkCgkJc2VncyA9IHRoaXMucmVuZGVyRmdTZWdFbHMoc2Vncyk7CgoJCXJvd1N0cnVjdHMgPSB0aGlzLnJvd1N0cnVjdHMgPSB0aGlzLnJlbmRlclNlZ1Jvd3Moc2Vncyk7CgoJCS8vIGFwcGVuZCB0byBlYWNoIHJvdydzIGNvbnRlbnQgc2tlbGV0b24KCQl0aGlzLnJvd0Vscy5lYWNoKGZ1bmN0aW9uKGksIHJvd05vZGUpIHsKCQkJJChyb3dOb2RlKS5maW5kKCcuZmMtY29udGVudC1za2VsZXRvbiA+IHRhYmxlJykuYXBwZW5kKAoJCQkJcm93U3RydWN0c1tpXS50Ym9keUVsCgkJCSk7CgkJfSk7CgoJCXJldHVybiBzZWdzOyAvLyByZXR1cm4gb25seSB0aGUgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCX0sCgoKCS8vIFVucmVuZGVycyBhbGwgY3VycmVudGx5IHJlbmRlcmVkIGZvcmVncm91bmQgZXZlbnQgc2VnbWVudHMKCXVucmVuZGVyRmdTZWdzOiBmdW5jdGlvbigpIHsKCQl2YXIgcm93U3RydWN0cyA9IHRoaXMucm93U3RydWN0cyB8fCBbXTsKCQl2YXIgcm93U3RydWN0OwoKCQl3aGlsZSAoKHJvd1N0cnVjdCA9IHJvd1N0cnVjdHMucG9wKCkpKSB7CgkJCXJvd1N0cnVjdC50Ym9keUVsLnJlbW92ZSgpOwoJCX0KCgkJdGhpcy5yb3dTdHJ1Y3RzID0gbnVsbDsKCX0sCgoKCS8vIFVzZXMgdGhlIGdpdmVuIGV2ZW50cyBhcnJheSB0byBnZW5lcmF0ZSA8dGJvZHk+IGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIGVhY2ggcm93J3MgY29udGVudCBza2VsZXRvbi4KCS8vIFJldHVybnMgYW4gYXJyYXkgb2Ygcm93U3RydWN0IG9iamVjdHMgKHNlZSB0aGUgYm90dG9tIG9mIGByZW5kZXJTZWdSb3dgKS4KCS8vIFBSRUNPTkRJVElPTjogZWFjaCBzZWdtZW50IHNob3VkIGFscmVhZHkgaGF2ZSBhIHJlbmRlcmVkIGFuZCBhc3NpZ25lZCBgLmVsYAoJcmVuZGVyU2VnUm93czogZnVuY3Rpb24oc2VncykgewoJCXZhciByb3dTdHJ1Y3RzID0gW107CgkJdmFyIHNlZ1Jvd3M7CgkJdmFyIHJvdzsKCgkJc2VnUm93cyA9IHRoaXMuZ3JvdXBTZWdSb3dzKHNlZ3MpOyAvLyBncm91cCBpbnRvIG5lc3RlZCBhcnJheXMKCgkJLy8gaXRlcmF0ZSBlYWNoIHJvdyBvZiBzZWdtZW50IGdyb3VwaW5ncwoJCWZvciAocm93ID0gMDsgcm93IDwgc2VnUm93cy5sZW5ndGg7IHJvdysrKSB7CgkJCXJvd1N0cnVjdHMucHVzaCgKCQkJCXRoaXMucmVuZGVyU2VnUm93KHJvdywgc2VnUm93c1tyb3ddKQoJCQkpOwoJCX0KCgkJcmV0dXJuIHJvd1N0cnVjdHM7Cgl9LAoKCgkvLyBCdWlsZHMgdGhlIEhUTUwgdG8gYmUgdXNlZCBmb3IgdGhlIGRlZmF1bHQgZWxlbWVudCBmb3IgYW4gaW5kaXZpZHVhbCBzZWdtZW50CglmZ1NlZ0h0bWw6IGZ1bmN0aW9uKHNlZywgZGlzYWJsZVJlc2l6aW5nKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGV2ZW50ID0gc2VnLmV2ZW50OwoJCXZhciBpc0RyYWdnYWJsZSA9IHZpZXcuaXNFdmVudERyYWdnYWJsZShldmVudCk7CgkJdmFyIGlzUmVzaXphYmxlRnJvbVN0YXJ0ID0gIWRpc2FibGVSZXNpemluZyAmJiBldmVudC5hbGxEYXkgJiYKCQkJc2VnLmlzU3RhcnQgJiYgdmlldy5pc0V2ZW50UmVzaXphYmxlRnJvbVN0YXJ0KGV2ZW50KTsKCQl2YXIgaXNSZXNpemFibGVGcm9tRW5kID0gIWRpc2FibGVSZXNpemluZyAmJiBldmVudC5hbGxEYXkgJiYKCQkJc2VnLmlzRW5kICYmIHZpZXcuaXNFdmVudFJlc2l6YWJsZUZyb21FbmQoZXZlbnQpOwoJCXZhciBjbGFzc2VzID0gdGhpcy5nZXRTZWdDbGFzc2VzKHNlZywgaXNEcmFnZ2FibGUsIGlzUmVzaXphYmxlRnJvbVN0YXJ0IHx8IGlzUmVzaXphYmxlRnJvbUVuZCk7CgkJdmFyIHNraW5Dc3MgPSBjc3NUb1N0cih0aGlzLmdldFNlZ1NraW5Dc3Moc2VnKSk7CgkJdmFyIHRpbWVIdG1sID0gJyc7CgkJdmFyIHRpbWVUZXh0OwoJCXZhciB0aXRsZUh0bWw7CgoJCWNsYXNzZXMudW5zaGlmdCgnZmMtZGF5LWdyaWQtZXZlbnQnLCAnZmMtaC1ldmVudCcpOwoKCQkvLyBPbmx5IGRpc3BsYXkgYSB0aW1lZCBldmVudHMgdGltZSBpZiBpdCBpcyB0aGUgc3RhcnRpbmcgc2VnbWVudAoJCWlmIChzZWcuaXNTdGFydCkgewoJCQl0aW1lVGV4dCA9IHRoaXMuZ2V0RXZlbnRUaW1lVGV4dChldmVudCk7CgkJCWlmICh0aW1lVGV4dCkgewoJCQkJdGltZUh0bWwgPSAnPHNwYW4gY2xhc3M9ImZjLXRpbWUiPicgKyBodG1sRXNjYXBlKHRpbWVUZXh0KSArICc8L3NwYW4+JzsKCQkJfQoJCX0KCgkJdGl0bGVIdG1sID0KCQkJJzxzcGFuIGNsYXNzPSJmYy10aXRsZSI+JyArCgkJCQkoaHRtbEVzY2FwZShldmVudC50aXRsZSB8fCAnJykgfHwgJyZuYnNwOycpICsgLy8gd2UgYWx3YXlzIHdhbnQgb25lIGxpbmUgb2YgaGVpZ2h0CgkJCSc8L3NwYW4+JzsKCQkKCQlyZXR1cm4gJzxhIGNsYXNzPSInICsgY2xhc3Nlcy5qb2luKCcgJykgKyAnIicgKwoJCQkJKGV2ZW50LnVybCA/CgkJCQkJJyBocmVmPSInICsgaHRtbEVzY2FwZShldmVudC51cmwpICsgJyInIDoKCQkJCQknJwoJCQkJCSkgKwoJCQkJKHNraW5Dc3MgPwoJCQkJCScgc3R5bGU9IicgKyBza2luQ3NzICsgJyInIDoKCQkJCQknJwoJCQkJCSkgKwoJCQknPicgKwoJCQkJJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicgKwoJCQkJCSh0aGlzLmlzUlRMID8KCQkJCQkJdGl0bGVIdG1sICsgJyAnICsgdGltZUh0bWwgOiAvLyBwdXQgYSBuYXR1cmFsIHNwYWNlIGluIGJldHdlZW4KCQkJCQkJdGltZUh0bWwgKyAnICcgKyB0aXRsZUh0bWwgICAvLwoJCQkJCQkpICsKCQkJCSc8L2Rpdj4nICsKCQkJCShpc1Jlc2l6YWJsZUZyb21TdGFydCA/CgkJCQkJJzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtc3RhcnQtcmVzaXplciIgLz4nIDoKCQkJCQknJwoJCQkJCSkgKwoJCQkJKGlzUmVzaXphYmxlRnJvbUVuZCA/CgkJCQkJJzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtZW5kLXJlc2l6ZXIiIC8+JyA6CgkJCQkJJycKCQkJCQkpICsKCQkJJzwvYT4nOwoJfSwKCgoJLy8gR2l2ZW4gYSByb3cgIyBhbmQgYW4gYXJyYXkgb2Ygc2VnbWVudHMgYWxsIGluIHRoZSBzYW1lIHJvdywgcmVuZGVyIGEgPHRib2R5PiBlbGVtZW50LCBhIHNrZWxldG9uIHRoYXQgY29udGFpbnMKCS8vIHRoZSBzZWdtZW50cy4gUmV0dXJucyBvYmplY3Qgd2l0aCBhIGJ1bmNoIG9mIGludGVybmFsIGRhdGEgYWJvdXQgaG93IHRoZSByZW5kZXIgd2FzIGNhbGN1bGF0ZWQuCgkvLyBOT1RFOiBtb2RpZmllcyByb3dTZWdzCglyZW5kZXJTZWdSb3c6IGZ1bmN0aW9uKHJvdywgcm93U2VncykgewoJCXZhciBjb2xDbnQgPSB0aGlzLmNvbENudDsKCQl2YXIgc2VnTGV2ZWxzID0gdGhpcy5idWlsZFNlZ0xldmVscyhyb3dTZWdzKTsgLy8gZ3JvdXAgaW50byBzdWItYXJyYXlzIG9mIGxldmVscwoJCXZhciBsZXZlbENudCA9IE1hdGgubWF4KDEsIHNlZ0xldmVscy5sZW5ndGgpOyAvLyBlbnN1cmUgYXQgbGVhc3Qgb25lIGxldmVsCgkJdmFyIHRib2R5ID0gJCgnPHRib2R5Lz4nKTsKCQl2YXIgc2VnTWF0cml4ID0gW107IC8vIGxvb2t1cCBmb3Igd2hpY2ggc2VnbWVudHMgYXJlIHJlbmRlcmVkIGludG8gd2hpY2ggbGV2ZWwrY29sIGNlbGxzCgkJdmFyIGNlbGxNYXRyaXggPSBbXTsgLy8gbG9va3VwIGZvciBhbGwgPHRkPiBlbGVtZW50cyBvZiB0aGUgbGV2ZWwrY29sIG1hdHJpeAoJCXZhciBsb25lQ2VsbE1hdHJpeCA9IFtdOyAvLyBsb29rdXAgZm9yIDx0ZD4gZWxlbWVudHMgdGhhdCBvbmx5IHRha2UgdXAgYSBzaW5nbGUgY29sdW1uCgkJdmFyIGksIGxldmVsU2VnczsKCQl2YXIgY29sOwoJCXZhciB0cjsKCQl2YXIgaiwgc2VnOwoJCXZhciB0ZDsKCgkJLy8gcG9wdWxhdGVzIGVtcHR5IGNlbGxzIGZyb20gdGhlIGN1cnJlbnQgY29sdW1uIChgY29sYCkgdG8gYGVuZENvbGAKCQlmdW5jdGlvbiBlbXB0eUNlbGxzVW50aWwoZW5kQ29sKSB7CgkJCXdoaWxlIChjb2wgPCBlbmRDb2wpIHsKCQkJCS8vIHRyeSB0byBncmFiIGEgY2VsbCBmcm9tIHRoZSBsZXZlbCBhYm92ZSBhbmQgZXh0ZW5kIGl0cyByb3dzcGFuLiBvdGhlcndpc2UsIGNyZWF0ZSBhIGZyZXNoIGNlbGwKCQkJCXRkID0gKGxvbmVDZWxsTWF0cml4W2kgLSAxXSB8fCBbXSlbY29sXTsKCQkJCWlmICh0ZCkgewoJCQkJCXRkLmF0dHIoCgkJCQkJCSdyb3dzcGFuJywKCQkJCQkJcGFyc2VJbnQodGQuYXR0cigncm93c3BhbicpIHx8IDEsIDEwKSArIDEKCQkJCQkpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJdGQgPSAkKCc8dGQvPicpOwoJCQkJCXRyLmFwcGVuZCh0ZCk7CgkJCQl9CgkJCQljZWxsTWF0cml4W2ldW2NvbF0gPSB0ZDsKCQkJCWxvbmVDZWxsTWF0cml4W2ldW2NvbF0gPSB0ZDsKCQkJCWNvbCsrOwoJCQl9CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWxDbnQ7IGkrKykgeyAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIGxldmVscwoJCQlsZXZlbFNlZ3MgPSBzZWdMZXZlbHNbaV07CgkJCWNvbCA9IDA7CgkJCXRyID0gJCgnPHRyLz4nKTsKCgkJCXNlZ01hdHJpeC5wdXNoKFtdKTsKCQkJY2VsbE1hdHJpeC5wdXNoKFtdKTsKCQkJbG9uZUNlbGxNYXRyaXgucHVzaChbXSk7CgoJCQkvLyBsZXZlbENudCBtaWdodCBiZSAxIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSBubyBhY3R1YWwgbGV2ZWxzLiBwcm90ZWN0IGFnYWluc3QgdGhpcy4KCQkJLy8gdGhpcyBzaW5nbGUgZW1wdHkgcm93IGlzIHVzZWZ1bCBmb3Igc3R5bGluZy4KCQkJaWYgKGxldmVsU2VncykgewoJCQkJZm9yIChqID0gMDsgaiA8IGxldmVsU2Vncy5sZW5ndGg7IGorKykgeyAvLyBpdGVyYXRlIHRocm91Z2ggc2VnbWVudHMgaW4gbGV2ZWwKCQkJCQlzZWcgPSBsZXZlbFNlZ3Nbal07CgoJCQkJCWVtcHR5Q2VsbHNVbnRpbChzZWcubGVmdENvbCk7CgoJCQkJCS8vIGNyZWF0ZSBhIGNvbnRhaW5lciB0aGF0IG9jY3VwaWVzIG9yIG1vcmUgY29sdW1ucy4gYXBwZW5kIHRoZSBldmVudCBlbGVtZW50LgoJCQkJCXRkID0gJCgnPHRkIGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiLz4nKS5hcHBlbmQoc2VnLmVsKTsKCQkJCQlpZiAoc2VnLmxlZnRDb2wgIT0gc2VnLnJpZ2h0Q29sKSB7CgkJCQkJCXRkLmF0dHIoJ2NvbHNwYW4nLCBzZWcucmlnaHRDb2wgLSBzZWcubGVmdENvbCArIDEpOwoJCQkJCX0KCQkJCQllbHNlIHsgLy8gYSBzaW5nbGUtY29sdW1uIHNlZ21lbnQKCQkJCQkJbG9uZUNlbGxNYXRyaXhbaV1bY29sXSA9IHRkOwoJCQkJCX0KCgkJCQkJd2hpbGUgKGNvbCA8PSBzZWcucmlnaHRDb2wpIHsKCQkJCQkJY2VsbE1hdHJpeFtpXVtjb2xdID0gdGQ7CgkJCQkJCXNlZ01hdHJpeFtpXVtjb2xdID0gc2VnOwoJCQkJCQljb2wrKzsKCQkJCQl9CgoJCQkJCXRyLmFwcGVuZCh0ZCk7CgkJCQl9CgkJCX0KCgkJCWVtcHR5Q2VsbHNVbnRpbChjb2xDbnQpOyAvLyBmaW5pc2ggb2ZmIHRoZSByb3cKCQkJdGhpcy5ib29rZW5kQ2VsbHModHIpOwoJCQl0Ym9keS5hcHBlbmQodHIpOwoJCX0KCgkJcmV0dXJuIHsgLy8gYSAicm93U3RydWN0IgoJCQlyb3c6IHJvdywgLy8gdGhlIHJvdyBudW1iZXIKCQkJdGJvZHlFbDogdGJvZHksCgkJCWNlbGxNYXRyaXg6IGNlbGxNYXRyaXgsCgkJCXNlZ01hdHJpeDogc2VnTWF0cml4LAoJCQlzZWdMZXZlbHM6IHNlZ0xldmVscywKCQkJc2Vnczogcm93U2VncwoJCX07Cgl9LAoKCgkvLyBTdGFja3MgYSBmbGF0IGFycmF5IG9mIHNlZ21lbnRzLCB3aGljaCBhcmUgYWxsIGFzc3VtZWQgdG8gYmUgaW4gdGhlIHNhbWUgcm93LCBpbnRvIHN1YmFycmF5cyBvZiB2ZXJ0aWNhbCBsZXZlbHMuCgkvLyBOT1RFOiBtb2RpZmllcyBzZWdzCglidWlsZFNlZ0xldmVsczogZnVuY3Rpb24oc2VncykgewoJCXZhciBsZXZlbHMgPSBbXTsKCQl2YXIgaSwgc2VnOwoJCXZhciBqOwoKCQkvLyBHaXZlIHByZWZlcmVuY2UgdG8gZWxlbWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLCBzbyB0aGV5IGhhdmUKCQkvLyBhIGNoYW5jZSB0byBiZSBjbG9zZXIgdG8gdGhlIHRvcC4KCQl0aGlzLnNvcnRFdmVudFNlZ3Moc2Vncyk7CgkJCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCgkJCS8vIGxvb3AgdGhyb3VnaCBsZXZlbHMsIHN0YXJ0aW5nIHdpdGggdGhlIHRvcG1vc3QsIHVudGlsIHRoZSBzZWdtZW50IGRvZXNuJ3QgY29sbGlkZSB3aXRoIG90aGVyIHNlZ21lbnRzCgkJCWZvciAoaiA9IDA7IGogPCBsZXZlbHMubGVuZ3RoOyBqKyspIHsKCQkJCWlmICghaXNEYXlTZWdDb2xsaXNpb24oc2VnLCBsZXZlbHNbal0pKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJLy8gYGpgIG5vdyBob2xkcyB0aGUgZGVzaXJlZCBzdWJyb3cgaW5kZXgKCQkJc2VnLmxldmVsID0gajsKCgkJCS8vIGNyZWF0ZSBuZXcgbGV2ZWwgYXJyYXkgaWYgbmVlZGVkIGFuZCBhcHBlbmQgc2VnbWVudAoJCQkobGV2ZWxzW2pdIHx8IChsZXZlbHNbal0gPSBbXSkpLnB1c2goc2VnKTsKCQl9CgoJCS8vIG9yZGVyIHNlZ21lbnRzIGxlZnQtdG8tcmlnaHQuIHZlcnkgaW1wb3J0YW50IGlmIGNhbGVuZGFyIGlzIFJUTAoJCWZvciAoaiA9IDA7IGogPCBsZXZlbHMubGVuZ3RoOyBqKyspIHsKCQkJbGV2ZWxzW2pdLnNvcnQoY29tcGFyZURheVNlZ0NvbHMpOwoJCX0KCgkJcmV0dXJuIGxldmVsczsKCX0sCgoKCS8vIEdpdmVuIGEgZmxhdCBhcnJheSBvZiBzZWdtZW50cywgcmV0dXJuIGFuIGFycmF5IG9mIHN1Yi1hcnJheXMsIGdyb3VwZWQgYnkgZWFjaCBzZWdtZW50J3Mgcm93Cglncm91cFNlZ1Jvd3M6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgc2VnUm93cyA9IFtdOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgdGhpcy5yb3dDbnQ7IGkrKykgewoJCQlzZWdSb3dzLnB1c2goW10pOwoJCX0KCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnUm93c1tzZWdzW2ldLnJvd10ucHVzaChzZWdzW2ldKTsKCQl9CgoJCXJldHVybiBzZWdSb3dzOwoJfQoKfSk7CgoKLy8gQ29tcHV0ZXMgd2hldGhlciB0d28gc2VnbWVudHMnIGNvbHVtbnMgY29sbGlkZS4gVGhleSBhcmUgYXNzdW1lZCB0byBiZSBpbiB0aGUgc2FtZSByb3cuCmZ1bmN0aW9uIGlzRGF5U2VnQ29sbGlzaW9uKHNlZywgb3RoZXJTZWdzKSB7Cgl2YXIgaSwgb3RoZXJTZWc7CgoJZm9yIChpID0gMDsgaSA8IG90aGVyU2Vncy5sZW5ndGg7IGkrKykgewoJCW90aGVyU2VnID0gb3RoZXJTZWdzW2ldOwoKCQlpZiAoCgkJCW90aGVyU2VnLmxlZnRDb2wgPD0gc2VnLnJpZ2h0Q29sICYmCgkJCW90aGVyU2VnLnJpZ2h0Q29sID49IHNlZy5sZWZ0Q29sCgkJKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7Cn0KCgovLyBBIGNtcCBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgdGhlIGxlZnRtb3N0IGV2ZW50CmZ1bmN0aW9uIGNvbXBhcmVEYXlTZWdDb2xzKGEsIGIpIHsKCXJldHVybiBhLmxlZnRDb2wgLSBiLmxlZnRDb2w7Cn0KCjs7CgovKiBNZXRob2RzIHJlbGF0ZSB0byBsaW1pdGluZyB0aGUgbnVtYmVyIGV2ZW50cyBmb3IgYSBnaXZlbiBkYXkgb24gYSBEYXlHcmlkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovLyBOT1RFOiBhbGwgdGhlIHNlZ3MgYmVpbmcgcGFzc2VkIGFyb3VuZCBpbiBoZXJlIGFyZSBmb3JlZ3JvdW5kIHNlZ3MKCkRheUdyaWQubWl4aW4oewoKCXNlZ1BvcG92ZXI6IG51bGwsIC8vIHRoZSBQb3BvdmVyIHRoYXQgaG9sZHMgZXZlbnRzIHRoYXQgY2FuJ3QgZml0IGluIGEgY2VsbC4gbnVsbCB3aGVuIG5vdCB2aXNpYmxlCglwb3BvdmVyU2VnczogbnVsbCwgLy8gYW4gYXJyYXkgb2Ygc2VnbWVudCBvYmplY3RzIHRoYXQgdGhlIHNlZ1BvcG92ZXIgaG9sZHMuIG51bGwgd2hlbiBub3QgdmlzaWJsZQoKCglyZW1vdmVTZWdQb3BvdmVyOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5zZWdQb3BvdmVyKSB7CgkJCXRoaXMuc2VnUG9wb3Zlci5oaWRlKCk7IC8vIGluIGhhbmRsZXIsIHdpbGwgY2FsbCBzZWdQb3BvdmVyJ3MgcmVtb3ZlRWxlbWVudAoJCX0KCX0sCgoKCS8vIExpbWl0cyB0aGUgbnVtYmVyIG9mICJsZXZlbHMiICh2ZXJ0aWNhbGx5IHN0YWNraW5nIGxheWVycyBvZiBldmVudHMpIGZvciBlYWNoIHJvdyBvZiB0aGUgZ3JpZC4KCS8vIGBsZXZlbExpbWl0YCBjYW4gYmUgZmFsc2UgKGRvbid0IGxpbWl0KSwgYSBudW1iZXIsIG9yIHRydWUgKHNob3VsZCBiZSBjb21wdXRlZCkuCglsaW1pdFJvd3M6IGZ1bmN0aW9uKGxldmVsTGltaXQpIHsKCQl2YXIgcm93U3RydWN0cyA9IHRoaXMucm93U3RydWN0cyB8fCBbXTsKCQl2YXIgcm93OyAvLyByb3cgIwoJCXZhciByb3dMZXZlbExpbWl0OwoKCQlmb3IgKHJvdyA9IDA7IHJvdyA8IHJvd1N0cnVjdHMubGVuZ3RoOyByb3crKykgewoJCQl0aGlzLnVubGltaXRSb3cocm93KTsKCgkJCWlmICghbGV2ZWxMaW1pdCkgewoJCQkJcm93TGV2ZWxMaW1pdCA9IGZhbHNlOwoJCQl9CgkJCWVsc2UgaWYgKHR5cGVvZiBsZXZlbExpbWl0ID09PSAnbnVtYmVyJykgewoJCQkJcm93TGV2ZWxMaW1pdCA9IGxldmVsTGltaXQ7CgkJCX0KCQkJZWxzZSB7CgkJCQlyb3dMZXZlbExpbWl0ID0gdGhpcy5jb21wdXRlUm93TGV2ZWxMaW1pdChyb3cpOwoJCQl9CgoJCQlpZiAocm93TGV2ZWxMaW1pdCAhPT0gZmFsc2UpIHsKCQkJCXRoaXMubGltaXRSb3cocm93LCByb3dMZXZlbExpbWl0KTsKCQkJfQoJCX0KCX0sCgoKCS8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGEgcm93IHdpbGwgYWNjb21vZGF0ZSB3aXRob3V0IGdvaW5nIG91dHNpZGUgaXRzIGJvdW5kcy4KCS8vIEFzc3VtZXMgdGhlIHJvdyBpcyAicmlnaWQiIChtYWludGFpbnMgYSBjb25zdGFudCBoZWlnaHQgcmVnYXJkbGVzcyBvZiB3aGF0IGlzIGluc2lkZSkuCgkvLyBgcm93YCBpcyB0aGUgcm93IG51bWJlci4KCWNvbXB1dGVSb3dMZXZlbExpbWl0OiBmdW5jdGlvbihyb3cpIHsKCQl2YXIgcm93RWwgPSB0aGlzLnJvd0Vscy5lcShyb3cpOyAvLyB0aGUgY29udGFpbmluZyAiZmFrZSIgcm93IGRpdgoJCXZhciByb3dIZWlnaHQgPSByb3dFbC5oZWlnaHQoKTsgLy8gVE9ETzogY2FjaGUgc29tZWhvdz8KCQl2YXIgdHJFbHMgPSB0aGlzLnJvd1N0cnVjdHNbcm93XS50Ym9keUVsLmNoaWxkcmVuKCk7CgkJdmFyIGksIHRyRWw7CgkJdmFyIHRySGVpZ2h0OwoKCQlmdW5jdGlvbiBpdGVySW5uZXJIZWlnaHRzKGksIGNoaWxkTm9kZSkgewoJCQl0ckhlaWdodCA9IE1hdGgubWF4KHRySGVpZ2h0LCAkKGNoaWxkTm9kZSkub3V0ZXJIZWlnaHQoKSk7CgkJfQoKCQkvLyBSZXZlYWwgb25lIGxldmVsIDx0cj4gYXQgYSB0aW1lIGFuZCBzdG9wIHdoZW4gd2UgZmluZCBvbmUgb3V0IG9mIGJvdW5kcwoJCWZvciAoaSA9IDA7IGkgPCB0ckVscy5sZW5ndGg7IGkrKykgewoJCQl0ckVsID0gdHJFbHMuZXEoaSkucmVtb3ZlQ2xhc3MoJ2ZjLWxpbWl0ZWQnKTsgLy8gcmVzZXQgdG8gb3JpZ2luYWwgc3RhdGUgKHJldmVhbCkKCgkJCS8vIHdpdGggcm93c3BhbnM+MSBhbmQgSUU4LCB0ckVsLm91dGVySGVpZ2h0KCkgd291bGQgcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgY2VsbCwKCQkJLy8gc28gaW5zdGVhZCwgZmluZCB0aGUgdGFsbGVzdCBpbm5lciBjb250ZW50IGVsZW1lbnQuCgkJCXRySGVpZ2h0ID0gMDsKCQkJdHJFbC5maW5kKCc+IHRkID4gOmZpcnN0LWNoaWxkJykuZWFjaChpdGVySW5uZXJIZWlnaHRzKTsKCgkJCWlmICh0ckVsLnBvc2l0aW9uKCkudG9wICsgdHJIZWlnaHQgPiByb3dIZWlnaHQpIHsKCQkJCXJldHVybiBpOwoJCQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7IC8vIHNob3VsZCBub3QgbGltaXQgYXQgYWxsCgl9LAoKCgkvLyBMaW1pdHMgdGhlIGdpdmVuIGdyaWQgcm93IHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsZXZlbHMgYW5kIGluamVjdHMgIm1vcmUiIGxpbmtzIGlmIG5lY2Vzc2FyeS4KCS8vIGByb3dgIGlzIHRoZSByb3cgbnVtYmVyLgoJLy8gYGxldmVsTGltaXRgIGlzIGEgbnVtYmVyIGZvciB0aGUgbWF4aW11bSAoaW5jbHVzaXZlKSBudW1iZXIgb2YgbGV2ZWxzIGFsbG93ZWQuCglsaW1pdFJvdzogZnVuY3Rpb24ocm93LCBsZXZlbExpbWl0KSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgcm93U3RydWN0ID0gdGhpcy5yb3dTdHJ1Y3RzW3Jvd107CgkJdmFyIG1vcmVOb2RlcyA9IFtdOyAvLyBhcnJheSBvZiAibW9yZSIgPGE+IGxpbmtzIGFuZCA8dGQ+IERPTSBub2RlcwoJCXZhciBjb2wgPSAwOyAvLyBjb2wgIywgbGVmdC10by1yaWdodCAobm90IGNocm9ub2xvZ2ljYWxseSkKCQl2YXIgbGV2ZWxTZWdzOyAvLyBhcnJheSBvZiBzZWdtZW50IG9iamVjdHMgaW4gdGhlIGxhc3QgYWxsb3dhYmxlIGxldmVsLCBvcmRlcmVkIGxlZnQtdG8tcmlnaHQKCQl2YXIgY2VsbE1hdHJpeDsgLy8gYSBtYXRyaXggKGJ5IGxldmVsLCB0aGVuIGNvbHVtbikgb2YgYWxsIDx0ZD4galF1ZXJ5IGVsZW1lbnRzIGluIHRoZSByb3cKCQl2YXIgbGltaXRlZE5vZGVzOyAvLyBhcnJheSBvZiB0ZW1wb3JhcmlseSBoaWRkZW4gbGV2ZWwgPHRyPiBhbmQgc2VnbWVudCA8dGQ+IERPTSBub2RlcwoJCXZhciBpLCBzZWc7CgkJdmFyIHNlZ3NCZWxvdzsgLy8gYXJyYXkgb2Ygc2VnbWVudCBvYmplY3RzIGJlbG93IGBzZWdgIGluIHRoZSBjdXJyZW50IGBjb2xgCgkJdmFyIHRvdGFsU2Vnc0JlbG93OyAvLyB0b3RhbCBudW1iZXIgb2Ygc2VnbWVudHMgYmVsb3cgYHNlZ2AgaW4gYW55IG9mIHRoZSBjb2x1bW5zIGBzZWdgIG9jY3VwaWVzCgkJdmFyIGNvbFNlZ3NCZWxvdzsgLy8gYXJyYXkgb2Ygc2VnbWVudCBhcnJheXMsIGJlbG93IHNlZywgb25lIGZvciBlYWNoIGNvbHVtbiAob2Zmc2V0IGZyb20gc2VncydzIGZpcnN0IGNvbHVtbikKCQl2YXIgdGQsIHJvd3NwYW47CgkJdmFyIHNlZ01vcmVOb2RlczsgLy8gYXJyYXkgb2YgIm1vcmUiIDx0ZD4gY2VsbHMgdGhhdCB3aWxsIHN0YW5kLWluIGZvciB0aGUgY3VycmVudCBzZWcncyBjZWxsCgkJdmFyIGo7CgkJdmFyIG1vcmVUZCwgbW9yZVdyYXAsIG1vcmVMaW5rOwoKCQkvLyBJdGVyYXRlcyB0aHJvdWdoIGVtcHR5IGxldmVsIGNlbGxzIGFuZCBwbGFjZXMgIm1vcmUiIGxpbmtzIGluc2lkZSBpZiBuZWVkIGJlCgkJZnVuY3Rpb24gZW1wdHlDZWxsc1VudGlsKGVuZENvbCkgeyAvLyBnb2VzIGZyb20gY3VycmVudCBgY29sYCB0byBgZW5kQ29sYAoJCQl3aGlsZSAoY29sIDwgZW5kQ29sKSB7CgkJCQlzZWdzQmVsb3cgPSBfdGhpcy5nZXRDZWxsU2Vncyhyb3csIGNvbCwgbGV2ZWxMaW1pdCk7CgkJCQlpZiAoc2Vnc0JlbG93Lmxlbmd0aCkgewoJCQkJCXRkID0gY2VsbE1hdHJpeFtsZXZlbExpbWl0IC0gMV1bY29sXTsKCQkJCQltb3JlTGluayA9IF90aGlzLnJlbmRlck1vcmVMaW5rKHJvdywgY29sLCBzZWdzQmVsb3cpOwoJCQkJCW1vcmVXcmFwID0gJCgnPGRpdi8+JykuYXBwZW5kKG1vcmVMaW5rKTsKCQkJCQl0ZC5hcHBlbmQobW9yZVdyYXApOwoJCQkJCW1vcmVOb2Rlcy5wdXNoKG1vcmVXcmFwWzBdKTsKCQkJCX0KCQkJCWNvbCsrOwoJCQl9CgkJfQoKCQlpZiAobGV2ZWxMaW1pdCAmJiBsZXZlbExpbWl0IDwgcm93U3RydWN0LnNlZ0xldmVscy5sZW5ndGgpIHsgLy8gaXMgaXQgYWN0dWFsbHkgb3ZlciB0aGUgbGltaXQ/CgkJCWxldmVsU2VncyA9IHJvd1N0cnVjdC5zZWdMZXZlbHNbbGV2ZWxMaW1pdCAtIDFdOwoJCQljZWxsTWF0cml4ID0gcm93U3RydWN0LmNlbGxNYXRyaXg7CgoJCQlsaW1pdGVkTm9kZXMgPSByb3dTdHJ1Y3QudGJvZHlFbC5jaGlsZHJlbigpLnNsaWNlKGxldmVsTGltaXQpIC8vIGdldCBsZXZlbCA8dHI+IGVsZW1lbnRzIHBhc3QgdGhlIGxpbWl0CgkJCQkuYWRkQ2xhc3MoJ2ZjLWxpbWl0ZWQnKS5nZXQoKTsgLy8gaGlkZSBlbGVtZW50cyBhbmQgZ2V0IGEgc2ltcGxlIERPTS1ub2RlcyBhcnJheQoKCQkJLy8gaXRlcmF0ZSB0aG91Z2ggc2VnbWVudHMgaW4gdGhlIGxhc3QgYWxsb3dhYmxlIGxldmVsCgkJCWZvciAoaSA9IDA7IGkgPCBsZXZlbFNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJCXNlZyA9IGxldmVsU2Vnc1tpXTsKCQkJCWVtcHR5Q2VsbHNVbnRpbChzZWcubGVmdENvbCk7IC8vIHByb2Nlc3MgZW1wdHkgY2VsbHMgYmVmb3JlIHRoZSBzZWdtZW50CgoJCQkJLy8gZGV0ZXJtaW5lICphbGwqIHNlZ21lbnRzIGJlbG93IGBzZWdgIHRoYXQgb2NjdXB5IHRoZSBzYW1lIGNvbHVtbnMKCQkJCWNvbFNlZ3NCZWxvdyA9IFtdOwoJCQkJdG90YWxTZWdzQmVsb3cgPSAwOwoJCQkJd2hpbGUgKGNvbCA8PSBzZWcucmlnaHRDb2wpIHsKCQkJCQlzZWdzQmVsb3cgPSB0aGlzLmdldENlbGxTZWdzKHJvdywgY29sLCBsZXZlbExpbWl0KTsKCQkJCQljb2xTZWdzQmVsb3cucHVzaChzZWdzQmVsb3cpOwoJCQkJCXRvdGFsU2Vnc0JlbG93ICs9IHNlZ3NCZWxvdy5sZW5ndGg7CgkJCQkJY29sKys7CgkJCQl9CgoJCQkJaWYgKHRvdGFsU2Vnc0JlbG93KSB7IC8vIGRvIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGlzIHNlZ21lbnQgd2l0aCBvbmUgb3IgbWFueSAibW9yZSIgbGlua3M/CgkJCQkJdGQgPSBjZWxsTWF0cml4W2xldmVsTGltaXQgLSAxXVtzZWcubGVmdENvbF07IC8vIHRoZSBzZWdtZW50J3MgcGFyZW50IGNlbGwKCQkJCQlyb3dzcGFuID0gdGQuYXR0cigncm93c3BhbicpIHx8IDE7CgkJCQkJc2VnTW9yZU5vZGVzID0gW107CgoJCQkJCS8vIG1ha2UgYSByZXBsYWNlbWVudCA8dGQ+IGZvciBlYWNoIGNvbHVtbiB0aGUgc2VnbWVudCBvY2N1cGllcy4gd2lsbCBiZSBvbmUgZm9yIGVhY2ggY29sc3BhbgoJCQkJCWZvciAoaiA9IDA7IGogPCBjb2xTZWdzQmVsb3cubGVuZ3RoOyBqKyspIHsKCQkJCQkJbW9yZVRkID0gJCgnPHRkIGNsYXNzPSJmYy1tb3JlLWNlbGwiLz4nKS5hdHRyKCdyb3dzcGFuJywgcm93c3Bhbik7CgkJCQkJCXNlZ3NCZWxvdyA9IGNvbFNlZ3NCZWxvd1tqXTsKCQkJCQkJbW9yZUxpbmsgPSB0aGlzLnJlbmRlck1vcmVMaW5rKAoJCQkJCQkJcm93LAoJCQkJCQkJc2VnLmxlZnRDb2wgKyBqLAoJCQkJCQkJWyBzZWcgXS5jb25jYXQoc2Vnc0JlbG93KSAvLyBjb3VudCBzZWcgYXMgaGlkZGVuIHRvbwoJCQkJCQkpOwoJCQkJCQltb3JlV3JhcCA9ICQoJzxkaXYvPicpLmFwcGVuZChtb3JlTGluayk7CgkJCQkJCW1vcmVUZC5hcHBlbmQobW9yZVdyYXApOwoJCQkJCQlzZWdNb3JlTm9kZXMucHVzaChtb3JlVGRbMF0pOwoJCQkJCQltb3JlTm9kZXMucHVzaChtb3JlVGRbMF0pOwoJCQkJCX0KCgkJCQkJdGQuYWRkQ2xhc3MoJ2ZjLWxpbWl0ZWQnKS5hZnRlcigkKHNlZ01vcmVOb2RlcykpOyAvLyBoaWRlIG9yaWdpbmFsIDx0ZD4gYW5kIGluamVjdCByZXBsYWNlbWVudHMKCQkJCQlsaW1pdGVkTm9kZXMucHVzaCh0ZFswXSk7CgkJCQl9CgkJCX0KCgkJCWVtcHR5Q2VsbHNVbnRpbCh0aGlzLmNvbENudCk7IC8vIGZpbmlzaCBvZmYgdGhlIGxldmVsCgkJCXJvd1N0cnVjdC5tb3JlRWxzID0gJChtb3JlTm9kZXMpOyAvLyBmb3IgZWFzeSB1bmRvaW5nIGxhdGVyCgkJCXJvd1N0cnVjdC5saW1pdGVkRWxzID0gJChsaW1pdGVkTm9kZXMpOyAvLyBmb3IgZWFzeSB1bmRvaW5nIGxhdGVyCgkJfQoJfSwKCgoJLy8gUmV2ZWFscyBhbGwgbGV2ZWxzIGFuZCByZW1vdmVzIGFsbCAibW9yZSItcmVsYXRlZCBlbGVtZW50cyBmb3IgYSBncmlkJ3Mgcm93LgoJLy8gYHJvd2AgaXMgYSByb3cgbnVtYmVyLgoJdW5saW1pdFJvdzogZnVuY3Rpb24ocm93KSB7CgkJdmFyIHJvd1N0cnVjdCA9IHRoaXMucm93U3RydWN0c1tyb3ddOwoKCQlpZiAocm93U3RydWN0Lm1vcmVFbHMpIHsKCQkJcm93U3RydWN0Lm1vcmVFbHMucmVtb3ZlKCk7CgkJCXJvd1N0cnVjdC5tb3JlRWxzID0gbnVsbDsKCQl9CgoJCWlmIChyb3dTdHJ1Y3QubGltaXRlZEVscykgewoJCQlyb3dTdHJ1Y3QubGltaXRlZEVscy5yZW1vdmVDbGFzcygnZmMtbGltaXRlZCcpOwoJCQlyb3dTdHJ1Y3QubGltaXRlZEVscyA9IG51bGw7CgkJfQoJfSwKCgoJLy8gUmVuZGVycyBhbiA8YT4gZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgaGlkZGVuIGV2ZW50IGVsZW1lbnQgZm9yIGEgY2VsbC4KCS8vIFJlc3BvbnNpYmxlIGZvciBhdHRhY2hpbmcgY2xpY2sgaGFuZGxlciBhcyB3ZWxsLgoJcmVuZGVyTW9yZUxpbms6IGZ1bmN0aW9uKHJvdywgY29sLCBoaWRkZW5TZWdzKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCgkJcmV0dXJuICQoJzxhIGNsYXNzPSJmYy1tb3JlIi8+JykKCQkJLnRleHQoCgkJCQl0aGlzLmdldE1vcmVMaW5rVGV4dChoaWRkZW5TZWdzLmxlbmd0aCkKCQkJKQoJCQkub24oJ2NsaWNrJywgZnVuY3Rpb24oZXYpIHsKCQkJCXZhciBjbGlja09wdGlvbiA9IHZpZXcub3B0KCdldmVudExpbWl0Q2xpY2snKTsKCQkJCXZhciBkYXRlID0gX3RoaXMuZ2V0Q2VsbERhdGUocm93LCBjb2wpOwoJCQkJdmFyIG1vcmVFbCA9ICQodGhpcyk7CgkJCQl2YXIgZGF5RWwgPSBfdGhpcy5nZXRDZWxsRWwocm93LCBjb2wpOwoJCQkJdmFyIGFsbFNlZ3MgPSBfdGhpcy5nZXRDZWxsU2Vncyhyb3csIGNvbCk7CgoJCQkJLy8gcmVzY29wZSB0aGUgc2VnbWVudHMgdG8gYmUgd2l0aGluIHRoZSBjZWxsJ3MgZGF0ZQoJCQkJdmFyIHJlc2xpY2VkQWxsU2VncyA9IF90aGlzLnJlc2xpY2VEYXlTZWdzKGFsbFNlZ3MsIGRhdGUpOwoJCQkJdmFyIHJlc2xpY2VkSGlkZGVuU2VncyA9IF90aGlzLnJlc2xpY2VEYXlTZWdzKGhpZGRlblNlZ3MsIGRhdGUpOwoKCQkJCWlmICh0eXBlb2YgY2xpY2tPcHRpb24gPT09ICdmdW5jdGlvbicpIHsKCQkJCQkvLyB0aGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIGFuIGF0b21pYyBvcHRpb24KCQkJCQljbGlja09wdGlvbiA9IHZpZXcudHJpZ2dlcignZXZlbnRMaW1pdENsaWNrJywgbnVsbCwgewoJCQkJCQlkYXRlOiBkYXRlLAoJCQkJCQlkYXlFbDogZGF5RWwsCgkJCQkJCW1vcmVFbDogbW9yZUVsLAoJCQkJCQlzZWdzOiByZXNsaWNlZEFsbFNlZ3MsCgkJCQkJCWhpZGRlblNlZ3M6IHJlc2xpY2VkSGlkZGVuU2VncwoJCQkJCX0sIGV2KTsKCQkJCX0KCgkJCQlpZiAoY2xpY2tPcHRpb24gPT09ICdwb3BvdmVyJykgewoJCQkJCV90aGlzLnNob3dTZWdQb3BvdmVyKHJvdywgY29sLCBtb3JlRWwsIHJlc2xpY2VkQWxsU2Vncyk7CgkJCQl9CgkJCQllbHNlIGlmICh0eXBlb2YgY2xpY2tPcHRpb24gPT09ICdzdHJpbmcnKSB7IC8vIGEgdmlldyBuYW1lCgkJCQkJdmlldy5jYWxlbmRhci56b29tVG8oZGF0ZSwgY2xpY2tPcHRpb24pOwoJCQkJfQoJCQl9KTsKCX0sCgoKCS8vIFJldmVhbHMgdGhlIHBvcG92ZXIgdGhhdCBkaXNwbGF5cyBhbGwgZXZlbnRzIHdpdGhpbiBhIGNlbGwKCXNob3dTZWdQb3BvdmVyOiBmdW5jdGlvbihyb3csIGNvbCwgbW9yZUxpbmssIHNlZ3MpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBtb3JlV3JhcCA9IG1vcmVMaW5rLnBhcmVudCgpOyAvLyB0aGUgPGRpdj4gd3JhcHBlciBhcm91bmQgdGhlIDxhPgoJCXZhciB0b3BFbDsgLy8gdGhlIGVsZW1lbnQgd2Ugd2FudCB0byBtYXRjaCB0aGUgdG9wIGNvb3JkaW5hdGUgb2YKCQl2YXIgb3B0aW9uczsKCgkJaWYgKHRoaXMucm93Q250ID09IDEpIHsKCQkJdG9wRWwgPSB2aWV3LmVsOyAvLyB3aWxsIGNhdXNlIHRoZSBwb3BvdmVyIHRvIGNvdmVyIGFueSBzb3J0IG9mIGhlYWRlcgoJCX0KCQllbHNlIHsKCQkJdG9wRWwgPSB0aGlzLnJvd0Vscy5lcShyb3cpOyAvLyB3aWxsIGFsaWduIHdpdGggdG9wIG9mIHJvdwoJCX0KCgkJb3B0aW9ucyA9IHsKCQkJY2xhc3NOYW1lOiAnZmMtbW9yZS1wb3BvdmVyJywKCQkJY29udGVudDogdGhpcy5yZW5kZXJTZWdQb3BvdmVyQ29udGVudChyb3csIGNvbCwgc2VncyksCgkJCXBhcmVudEVsOiB0aGlzLnZpZXcuZWwsIC8vIGF0dGFjaCB0byByb290IG9mIHZpZXcuIGd1YXJhbnRlZXMgb3V0c2lkZSBvZiBzY3JvbGxiYXJzLgoJCQl0b3A6IHRvcEVsLm9mZnNldCgpLnRvcCwKCQkJYXV0b0hpZGU6IHRydWUsIC8vIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGVsc2V3aGVyZSwgaGlkZSB0aGUgcG9wb3ZlcgoJCQl2aWV3cG9ydENvbnN0cmFpbjogdmlldy5vcHQoJ3BvcG92ZXJWaWV3cG9ydENvbnN0cmFpbicpLAoJCQloaWRlOiBmdW5jdGlvbigpIHsKCQkJCS8vIGtpbGwgZXZlcnl0aGluZyB3aGVuIHRoZSBwb3BvdmVyIGlzIGhpZGRlbgoJCQkJX3RoaXMuc2VnUG9wb3Zlci5yZW1vdmVFbGVtZW50KCk7CgkJCQlfdGhpcy5zZWdQb3BvdmVyID0gbnVsbDsKCQkJCV90aGlzLnBvcG92ZXJTZWdzID0gbnVsbDsKCQkJfQoJCX07CgoJCS8vIERldGVybWluZSBob3Jpem9udGFsIGNvb3JkaW5hdGUuCgkJLy8gV2UgdXNlIHRoZSBtb3JlV3JhcCBpbnN0ZWFkIG9mIHRoZSA8dGQ+IHRvIGF2b2lkIGJvcmRlciBjb25mdXNpb24uCgkJaWYgKHRoaXMuaXNSVEwpIHsKCQkJb3B0aW9ucy5yaWdodCA9IG1vcmVXcmFwLm9mZnNldCgpLmxlZnQgKyBtb3JlV3JhcC5vdXRlcldpZHRoKCkgKyAxOyAvLyArMSB0byBiZSBvdmVyIGNlbGwgYm9yZGVyCgkJfQoJCWVsc2UgewoJCQlvcHRpb25zLmxlZnQgPSBtb3JlV3JhcC5vZmZzZXQoKS5sZWZ0IC0gMTsgLy8gLTEgdG8gYmUgb3ZlciBjZWxsIGJvcmRlcgoJCX0KCgkJdGhpcy5zZWdQb3BvdmVyID0gbmV3IFBvcG92ZXIob3B0aW9ucyk7CgkJdGhpcy5zZWdQb3BvdmVyLnNob3coKTsKCgkJLy8gdGhlIHBvcG92ZXIgZG9lc24ndCBsaXZlIHdpdGhpbiB0aGUgZ3JpZCdzIGNvbnRhaW5lciBlbGVtZW50LCBhbmQgdGh1cyB3b24ndCBnZXQgdGhlIGV2ZW50CgkJLy8gZGVsZWdhdGVkLWhhbmRsZXJzIGZvciBmcmVlLiBhdHRhY2ggZXZlbnQtcmVsYXRlZCBoYW5kbGVycyB0byB0aGUgcG9wb3Zlci4KCQl0aGlzLmJpbmRTZWdIYW5kbGVyc1RvRWwodGhpcy5zZWdQb3BvdmVyLmVsKTsKCX0sCgoKCS8vIEJ1aWxkcyB0aGUgaW5uZXIgRE9NIGNvbnRlbnRzIG9mIHRoZSBzZWdtZW50IHBvcG92ZXIKCXJlbmRlclNlZ1BvcG92ZXJDb250ZW50OiBmdW5jdGlvbihyb3csIGNvbCwgc2VncykgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBpc1RoZW1lID0gdmlldy5vcHQoJ3RoZW1lJyk7CgkJdmFyIHRpdGxlID0gdGhpcy5nZXRDZWxsRGF0ZShyb3csIGNvbCkuZm9ybWF0KHZpZXcub3B0KCdkYXlQb3BvdmVyRm9ybWF0JykpOwoJCXZhciBjb250ZW50ID0gJCgKCQkJJzxkaXYgY2xhc3M9ImZjLWhlYWRlciAnICsgdmlldy53aWRnZXRIZWFkZXJDbGFzcyArICciPicgKwoJCQkJJzxzcGFuIGNsYXNzPSJmYy1jbG9zZSAnICsKCQkJCQkoaXNUaGVtZSA/ICd1aS1pY29uIHVpLWljb24tY2xvc2V0aGljaycgOiAnZmMtaWNvbiBmYy1pY29uLXgnKSArCgkJCQknIj48L3NwYW4+JyArCgkJCQknPHNwYW4gY2xhc3M9ImZjLXRpdGxlIj4nICsKCQkJCQlodG1sRXNjYXBlKHRpdGxlKSArCgkJCQknPC9zcGFuPicgKwoJCQkJJzxkaXYgY2xhc3M9ImZjLWNsZWFyIi8+JyArCgkJCSc8L2Rpdj4nICsKCQkJJzxkaXYgY2xhc3M9ImZjLWJvZHkgJyArIHZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyI+JyArCgkJCQknPGRpdiBjbGFzcz0iZmMtZXZlbnQtY29udGFpbmVyIj48L2Rpdj4nICsKCQkJJzwvZGl2PicKCQkpOwoJCXZhciBzZWdDb250YWluZXIgPSBjb250ZW50LmZpbmQoJy5mYy1ldmVudC1jb250YWluZXInKTsKCQl2YXIgaTsKCgkJLy8gcmVuZGVyIGVhY2ggc2VnJ3MgYGVsYCBhbmQgb25seSByZXR1cm4gdGhlIHZpc2libGUgc2VncwoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MsIHRydWUpOyAvLyBkaXNhYmxlUmVzaXppbmc9dHJ1ZQoJCXRoaXMucG9wb3ZlclNlZ3MgPSBzZWdzOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoKCQkJLy8gYmVjYXVzZSBzZWdtZW50cyBpbiB0aGUgcG9wb3ZlciBhcmUgbm90IHBhcnQgb2YgYSBncmlkIGNvb3JkaW5hdGUgc3lzdGVtLCBwcm92aWRlIGEgaGludCB0byBhbnkKCQkJLy8gZ3JpZHMgdGhhdCB3YW50IHRvIGRvIGRyYWctbi1kcm9wIGFib3V0IHdoaWNoIGNlbGwgaXQgY2FtZSBmcm9tCgkJCXRoaXMucHJlcGFyZUhpdHMoKTsKCQkJc2Vnc1tpXS5oaXQgPSB0aGlzLmdldENlbGxIaXQocm93LCBjb2wpOwoJCQl0aGlzLnJlbGVhc2VIaXRzKCk7CgoJCQlzZWdDb250YWluZXIuYXBwZW5kKHNlZ3NbaV0uZWwpOwoJCX0KCgkJcmV0dXJuIGNvbnRlbnQ7Cgl9LAoKCgkvLyBHaXZlbiB0aGUgZXZlbnRzIHdpdGhpbiBhbiBhcnJheSBvZiBzZWdtZW50IG9iamVjdHMsIHJlc2xpY2UgdGhlbSB0byBiZSBpbiBhIHNpbmdsZSBkYXkKCXJlc2xpY2VEYXlTZWdzOiBmdW5jdGlvbihzZWdzLCBkYXlEYXRlKSB7CgoJCS8vIGJ1aWxkIGFuIGFycmF5IG9mIHRoZSBvcmlnaW5hbCBldmVudHMKCQl2YXIgZXZlbnRzID0gJC5tYXAoc2VncywgZnVuY3Rpb24oc2VnKSB7CgkJCXJldHVybiBzZWcuZXZlbnQ7CgkJfSk7CgoJCXZhciBkYXlTdGFydCA9IGRheURhdGUuY2xvbmUoKTsKCQl2YXIgZGF5RW5kID0gZGF5U3RhcnQuY2xvbmUoKS5hZGQoMSwgJ2RheXMnKTsKCQl2YXIgZGF5UmFuZ2UgPSB7IHN0YXJ0OiBkYXlTdGFydCwgZW5kOiBkYXlFbmQgfTsKCgkJLy8gc2xpY2UgdGhlIGV2ZW50cyB3aXRoIGEgY3VzdG9tIHNsaWNpbmcgZnVuY3Rpb24KCQlzZWdzID0gdGhpcy5ldmVudHNUb1NlZ3MoCgkJCWV2ZW50cywKCQkJZnVuY3Rpb24ocmFuZ2UpIHsKCQkJCXZhciBzZWcgPSBpbnRlcnNlY3RSYW5nZXMocmFuZ2UsIGRheVJhbmdlKTsgLy8gdW5kZWZpbmQgaWYgbm8gaW50ZXJzZWN0aW9uCgkJCQlyZXR1cm4gc2VnID8gWyBzZWcgXSA6IFtdOyAvLyBtdXN0IHJldHVybiBhbiBhcnJheSBvZiBzZWdtZW50cwoJCQl9CgkJKTsKCgkJLy8gZm9yY2UgYW4gb3JkZXIgYmVjYXVzZSBldmVudHNUb1NlZ3MgZG9lc24ndCBndWFyYW50ZWUgb25lCgkJdGhpcy5zb3J0RXZlbnRTZWdzKHNlZ3MpOwoKCQlyZXR1cm4gc2VnczsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBpbnNpZGUgYSAibW9yZSIgbGluaywgZ2l2ZW4gdGhlIG51bWJlciBvZiBldmVudHMgaXQgcmVwcmVzZW50cwoJZ2V0TW9yZUxpbmtUZXh0OiBmdW5jdGlvbihudW0pIHsKCQl2YXIgb3B0ID0gdGhpcy52aWV3Lm9wdCgnZXZlbnRMaW1pdFRleHQnKTsKCgkJaWYgKHR5cGVvZiBvcHQgPT09ICdmdW5jdGlvbicpIHsKCQkJcmV0dXJuIG9wdChudW0pOwoJCX0KCQllbHNlIHsKCQkJcmV0dXJuICcrJyArIG51bSArICcgJyArIG9wdDsKCQl9Cgl9LAoKCgkvLyBSZXR1cm5zIHNlZ21lbnRzIHdpdGhpbiBhIGdpdmVuIGNlbGwuCgkvLyBJZiBgc3RhcnRMZXZlbGAgaXMgc3BlY2lmaWVkLCByZXR1cm5zIG9ubHkgZXZlbnRzIGluY2x1ZGluZyBhbmQgYmVsb3cgdGhhdCBsZXZlbC4gT3RoZXJ3aXNlIHJldHVybnMgYWxsIHNlZ3MuCglnZXRDZWxsU2VnczogZnVuY3Rpb24ocm93LCBjb2wsIHN0YXJ0TGV2ZWwpIHsKCQl2YXIgc2VnTWF0cml4ID0gdGhpcy5yb3dTdHJ1Y3RzW3Jvd10uc2VnTWF0cml4OwoJCXZhciBsZXZlbCA9IHN0YXJ0TGV2ZWwgfHwgMDsKCQl2YXIgc2VncyA9IFtdOwoJCXZhciBzZWc7CgoJCXdoaWxlIChsZXZlbCA8IHNlZ01hdHJpeC5sZW5ndGgpIHsKCQkJc2VnID0gc2VnTWF0cml4W2xldmVsXVtjb2xdOwoJCQlpZiAoc2VnKSB7CgkJCQlzZWdzLnB1c2goc2VnKTsKCQkJfQoJCQlsZXZlbCsrOwoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9Cgp9KTsKCjs7CgovKiBBIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgb25lIG9yIG1vcmUgY29sdW1ucyBvZiB2ZXJ0aWNhbCB0aW1lIHNsb3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovLyBXZSBtaXhpbiBEYXlUYWJsZSwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgb25seSBhIHNpbmdsZSByb3cgb2YgZGF5cwoKdmFyIFRpbWVHcmlkID0gRkMuVGltZUdyaWQgPSBHcmlkLmV4dGVuZChEYXlUYWJsZU1peGluLCB7CgoJc2xvdER1cmF0aW9uOiBudWxsLCAvLyBkdXJhdGlvbiBvZiBhICJzbG90IiwgYSBkaXN0aW5jdCB0aW1lIHNlZ21lbnQgb24gZ2l2ZW4gZGF5LCB2aXN1YWxpemVkIGJ5IGxpbmVzCglzbmFwRHVyYXRpb246IG51bGwsIC8vIGdyYW51bGFyaXR5IG9mIHRpbWUgZm9yIGRyYWdnaW5nIGFuZCBzZWxlY3RpbmcKCXNuYXBzUGVyU2xvdDogbnVsbCwKCW1pblRpbWU6IG51bGwsIC8vIER1cmF0aW9uIG9iamVjdCB0aGF0IGRlbm90ZXMgdGhlIGZpcnN0IHZpc2libGUgdGltZSBvZiBhbnkgZ2l2ZW4gZGF5CgltYXhUaW1lOiBudWxsLCAvLyBEdXJhdGlvbiBvYmplY3QgdGhhdCBkZW5vdGVzIHRoZSBleGNsdXNpdmUgdmlzaWJsZSBlbmQgdGltZSBvZiBhbnkgZ2l2ZW4gZGF5CglsYWJlbEZvcm1hdDogbnVsbCwgLy8gZm9ybWF0dGluZyBzdHJpbmcgZm9yIHRpbWVzIHJ1bm5pbmcgYWxvbmcgdmVydGljYWwgYXhpcwoJbGFiZWxJbnRlcnZhbDogbnVsbCwgLy8gZHVyYXRpb24gb2YgaG93IG9mdGVuIGEgbGFiZWwgc2hvdWxkIGJlIGRpc3BsYXllZCBmb3IgYSBzbG90CgoJY29sRWxzOiBudWxsLCAvLyBjZWxscyBlbGVtZW50cyBpbiB0aGUgZGF5LXJvdyBiYWNrZ3JvdW5kCglzbGF0Q29udGFpbmVyRWw6IG51bGwsIC8vIGRpdiB0aGF0IHdyYXBzIGFsbCB0aGUgc2xhdCByb3dzCglzbGF0RWxzOiBudWxsLCAvLyBlbGVtZW50cyBydW5uaW5nIGhvcml6b250YWxseSBhY3Jvc3MgYWxsIGNvbHVtbnMKCW5vd0luZGljYXRvckVsczogbnVsbCwKCgljb2xDb29yZENhY2hlOiBudWxsLAoJc2xhdENvb3JkQ2FjaGU6IG51bGwsCgoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHsKCQlHcmlkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLWNvbnN0cnVjdG9yCgoJCXRoaXMucHJvY2Vzc09wdGlvbnMoKTsKCX0sCgoKCS8vIFJlbmRlcnMgdGhlIHRpbWUgZ3JpZCBpbnRvIGB0aGlzLmVsYCwgd2hpY2ggc2hvdWxkIGFscmVhZHkgYmUgYXNzaWduZWQuCgkvLyBSZWxpZXMgb24gdGhlIHZpZXcncyBjb2xDbnQuIEluIHRoZSBmdXR1cmUsIHRoaXMgY29tcG9uZW50IHNob3VsZCBwcm9iYWJseSBiZSBzZWxmLXN1ZmZpY2llbnQuCglyZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbC5odG1sKHRoaXMucmVuZGVySHRtbCgpKTsKCQl0aGlzLmNvbEVscyA9IHRoaXMuZWwuZmluZCgnLmZjLWRheScpOwoJCXRoaXMuc2xhdENvbnRhaW5lckVsID0gdGhpcy5lbC5maW5kKCcuZmMtc2xhdHMnKTsKCQl0aGlzLnNsYXRFbHMgPSB0aGlzLnNsYXRDb250YWluZXJFbC5maW5kKCd0cicpOwoKCQl0aGlzLmNvbENvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CgkJCWVsczogdGhpcy5jb2xFbHMsCgkJCWlzSG9yaXpvbnRhbDogdHJ1ZQoJCX0pOwoJCXRoaXMuc2xhdENvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CgkJCWVsczogdGhpcy5zbGF0RWxzLAoJCQlpc1ZlcnRpY2FsOiB0cnVlCgkJfSk7CgoJCXRoaXMucmVuZGVyQ29udGVudFNrZWxldG9uKCk7Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSBiYXNpYyBIVE1MIHNrZWxldG9uIGZvciB0aGUgZ3JpZAoJcmVuZGVySHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICcnICsKCQkJJzxkaXYgY2xhc3M9ImZjLWJnIj4nICsKCQkJCSc8dGFibGU+JyArCgkJCQkJdGhpcy5yZW5kZXJCZ1RySHRtbCgwKSArIC8vIHJvdz0wCgkJCQknPC90YWJsZT4nICsKCQkJJzwvZGl2PicgKwoJCQknPGRpdiBjbGFzcz0iZmMtc2xhdHMiPicgKwoJCQkJJzx0YWJsZT4nICsKCQkJCQl0aGlzLnJlbmRlclNsYXRSb3dIdG1sKCkgKwoJCQkJJzwvdGFibGU+JyArCgkJCSc8L2Rpdj4nOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIGZvciB0aGUgaG9yaXpvbnRhbCAic2xhdHMiIHRoYXQgcnVuIHdpZHRoLXdpc2UuIEhhcyBhIHRpbWUgYXhpcyBvbiBhIHNpZGUuIERlcGVuZHMgb24gUlRMLgoJcmVuZGVyU2xhdFJvd0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBpc1JUTCA9IHRoaXMuaXNSVEw7CgkJdmFyIGh0bWwgPSAnJzsKCQl2YXIgc2xvdFRpbWUgPSBtb21lbnQuZHVyYXRpb24oK3RoaXMubWluVGltZSk7IC8vIHdpc2ggdGhlcmUgd2FzIC5jbG9uZSgpIGZvciBkdXJhdGlvbnMKCQl2YXIgc2xvdERhdGU7IC8vIHdpbGwgYmUgb24gdGhlIHZpZXcncyBmaXJzdCBkYXksIGJ1dCB3ZSBvbmx5IGNhcmUgYWJvdXQgaXRzIHRpbWUKCQl2YXIgaXNMYWJlbGVkOwoJCXZhciBheGlzSHRtbDsKCgkJLy8gQ2FsY3VsYXRlIHRoZSB0aW1lIGZvciBlYWNoIHNsb3QKCQl3aGlsZSAoc2xvdFRpbWUgPCB0aGlzLm1heFRpbWUpIHsKCQkJc2xvdERhdGUgPSB0aGlzLnN0YXJ0LmNsb25lKCkudGltZShzbG90VGltZSk7CgkJCWlzTGFiZWxlZCA9IGlzSW50KGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihzbG90VGltZSwgdGhpcy5sYWJlbEludGVydmFsKSk7CgoJCQlheGlzSHRtbCA9CgkJCQknPHRkIGNsYXNzPSJmYy1heGlzIGZjLXRpbWUgJyArIHZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz4nICsKCQkJCQkoaXNMYWJlbGVkID8KCQkJCQkJJzxzcGFuPicgKyAvLyBmb3IgbWF0Y2hDZWxsV2lkdGhzCgkJCQkJCQlodG1sRXNjYXBlKHNsb3REYXRlLmZvcm1hdCh0aGlzLmxhYmVsRm9ybWF0KSkgKwoJCQkJCQknPC9zcGFuPicgOgoJCQkJCQknJwoJCQkJCQkpICsKCQkJCSc8L3RkPic7CgoJCQlodG1sICs9CgkJCQknPHRyIGRhdGEtdGltZT0iJyArIHNsb3REYXRlLmZvcm1hdCgnSEg6bW06c3MnKSArICciJyArCgkJCQkJKGlzTGFiZWxlZCA/ICcnIDogJyBjbGFzcz0iZmMtbWlub3IiJykgKwoJCQkJCSc+JyArCgkJCQkJKCFpc1JUTCA/IGF4aXNIdG1sIDogJycpICsKCQkJCQknPHRkIGNsYXNzPSInICsgdmlldy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIi8+JyArCgkJCQkJKGlzUlRMID8gYXhpc0h0bWwgOiAnJykgKwoJCQkJIjwvdHI+IjsKCgkJCXNsb3RUaW1lLmFkZCh0aGlzLnNsb3REdXJhdGlvbik7CgkJfQoKCQlyZXR1cm4gaHRtbDsKCX0sCgoKCS8qIE9wdGlvbnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFBhcnNlcyB2YXJpb3VzIG9wdGlvbnMgaW50byBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0Cglwcm9jZXNzT3B0aW9uczogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIHNsb3REdXJhdGlvbiA9IHZpZXcub3B0KCdzbG90RHVyYXRpb24nKTsKCQl2YXIgc25hcER1cmF0aW9uID0gdmlldy5vcHQoJ3NuYXBEdXJhdGlvbicpOwoJCXZhciBpbnB1dDsKCgkJc2xvdER1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKHNsb3REdXJhdGlvbik7CgkJc25hcER1cmF0aW9uID0gc25hcER1cmF0aW9uID8gbW9tZW50LmR1cmF0aW9uKHNuYXBEdXJhdGlvbikgOiBzbG90RHVyYXRpb247CgoJCXRoaXMuc2xvdER1cmF0aW9uID0gc2xvdER1cmF0aW9uOwoJCXRoaXMuc25hcER1cmF0aW9uID0gc25hcER1cmF0aW9uOwoJCXRoaXMuc25hcHNQZXJTbG90ID0gc2xvdER1cmF0aW9uIC8gc25hcER1cmF0aW9uOyAvLyBUT0RPOiBlbnN1cmUgYW4gaW50ZWdlciBtdWx0aXBsZT8KCgkJdGhpcy5taW5SZXNpemVEdXJhdGlvbiA9IHNuYXBEdXJhdGlvbjsgLy8gaGFjawoKCQl0aGlzLm1pblRpbWUgPSBtb21lbnQuZHVyYXRpb24odmlldy5vcHQoJ21pblRpbWUnKSk7CgkJdGhpcy5tYXhUaW1lID0gbW9tZW50LmR1cmF0aW9uKHZpZXcub3B0KCdtYXhUaW1lJykpOwoKCQkvLyBtaWdodCBiZSBhbiBhcnJheSB2YWx1ZSAoZm9yIFRpbWVsaW5lVmlldykuCgkJLy8gaWYgc28sIGdldHRpbmcgdGhlIG1vc3QgZ3JhbnVsYXIgZW50cnkgKHRoZSBsYXN0IG9uZSBwcm9iYWJseSkuCgkJaW5wdXQgPSB2aWV3Lm9wdCgnc2xvdExhYmVsRm9ybWF0Jyk7CgkJaWYgKCQuaXNBcnJheShpbnB1dCkpIHsKCQkJaW5wdXQgPSBpbnB1dFtpbnB1dC5sZW5ndGggLSAxXTsKCQl9CgoJCXRoaXMubGFiZWxGb3JtYXQgPQoJCQlpbnB1dCB8fAoJCQl2aWV3Lm9wdCgnc21hbGxUaW1lRm9ybWF0Jyk7IC8vIHRoZSBjb21wdXRlZCBkZWZhdWx0CgoJCWlucHV0ID0gdmlldy5vcHQoJ3Nsb3RMYWJlbEludGVydmFsJyk7CgkJdGhpcy5sYWJlbEludGVydmFsID0gaW5wdXQgPwoJCQltb21lbnQuZHVyYXRpb24oaW5wdXQpIDoKCQkJdGhpcy5jb21wdXRlTGFiZWxJbnRlcnZhbChzbG90RHVyYXRpb24pOwoJfSwKCgoJLy8gQ29tcHV0ZXMgYW4gYXV0b21hdGljIHZhbHVlIGZvciBzbG90TGFiZWxJbnRlcnZhbAoJY29tcHV0ZUxhYmVsSW50ZXJ2YWw6IGZ1bmN0aW9uKHNsb3REdXJhdGlvbikgewoJCXZhciBpOwoJCXZhciBsYWJlbEludGVydmFsOwoJCXZhciBzbG90c1BlckxhYmVsOwoKCQkvLyBmaW5kIHRoZSBzbWFsbGVzdCBzdG9jayBsYWJlbCBpbnRlcnZhbCB0aGF0IHJlc3VsdHMgaW4gbW9yZSB0aGFuIG9uZSBzbG90cy1wZXItbGFiZWwKCQlmb3IgKGkgPSBBR0VOREFfU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQlsYWJlbEludGVydmFsID0gbW9tZW50LmR1cmF0aW9uKEFHRU5EQV9TVE9DS19TVUJfRFVSQVRJT05TW2ldKTsKCQkJc2xvdHNQZXJMYWJlbCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihsYWJlbEludGVydmFsLCBzbG90RHVyYXRpb24pOwoJCQlpZiAoaXNJbnQoc2xvdHNQZXJMYWJlbCkgJiYgc2xvdHNQZXJMYWJlbCA+IDEpIHsKCQkJCXJldHVybiBsYWJlbEludGVydmFsOwoJCQl9CgkJfQoKCQlyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHNsb3REdXJhdGlvbik7IC8vIGZhbGwgYmFjay4gY2xvbmUKCX0sCgoKCS8vIENvbXB1dGVzIGEgZGVmYXVsdCBldmVudCB0aW1lIGZvcm1hdHRpbmcgc3RyaW5nIGlmIGB0aW1lRm9ybWF0YCBpcyBub3QgZXhwbGljaXRseSBkZWZpbmVkCgljb21wdXRlRXZlbnRUaW1lRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy52aWV3Lm9wdCgnbm9NZXJpZGllbVRpbWVGb3JtYXQnKTsgLy8gbGlrZSAiNjozMCIgKG5vIEFNL1BNKQoJfSwKCgoJLy8gQ29tcHV0ZXMgYSBkZWZhdWx0IGBkaXNwbGF5RXZlbnRFbmRgIHZhbHVlIGlmIG9uZSBpcyBub3QgZXhwbGljbHR5IGRlZmluZWQKCWNvbXB1dGVEaXNwbGF5RXZlbnRFbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0cnVlOwoJfSwKCgoJLyogSGl0IFN5c3RlbQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcHJlcGFyZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29sQ29vcmRDYWNoZS5idWlsZCgpOwoJCXRoaXMuc2xhdENvb3JkQ2FjaGUuYnVpbGQoKTsKCX0sCgoKCXJlbGVhc2VIaXRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLmNvbENvb3JkQ2FjaGUuY2xlYXIoKTsKCQkvLyBOT1RFOiBkb24ndCBjbGVhciBzbGF0Q29vcmRDYWNoZSBiZWNhdXNlIHdlIHJlbHkgb24gaXQgZm9yIGNvbXB1dGVUaW1lVG9wCgl9LAoKCglxdWVyeUhpdDogZnVuY3Rpb24obGVmdE9mZnNldCwgdG9wT2Zmc2V0KSB7CgkJdmFyIHNuYXBzUGVyU2xvdCA9IHRoaXMuc25hcHNQZXJTbG90OwoJCXZhciBjb2xDb29yZENhY2hlID0gdGhpcy5jb2xDb29yZENhY2hlOwoJCXZhciBzbGF0Q29vcmRDYWNoZSA9IHRoaXMuc2xhdENvb3JkQ2FjaGU7CgoJCWlmIChjb2xDb29yZENhY2hlLmlzTGVmdEluQm91bmRzKGxlZnRPZmZzZXQpICYmIHNsYXRDb29yZENhY2hlLmlzVG9wSW5Cb3VuZHModG9wT2Zmc2V0KSkgewoJCQl2YXIgY29sSW5kZXggPSBjb2xDb29yZENhY2hlLmdldEhvcml6b250YWxJbmRleChsZWZ0T2Zmc2V0KTsKCQkJdmFyIHNsYXRJbmRleCA9IHNsYXRDb29yZENhY2hlLmdldFZlcnRpY2FsSW5kZXgodG9wT2Zmc2V0KTsKCgkJCWlmIChjb2xJbmRleCAhPSBudWxsICYmIHNsYXRJbmRleCAhPSBudWxsKSB7CgkJCQl2YXIgc2xhdFRvcCA9IHNsYXRDb29yZENhY2hlLmdldFRvcE9mZnNldChzbGF0SW5kZXgpOwoJCQkJdmFyIHNsYXRIZWlnaHQgPSBzbGF0Q29vcmRDYWNoZS5nZXRIZWlnaHQoc2xhdEluZGV4KTsKCQkJCXZhciBwYXJ0aWFsID0gKHRvcE9mZnNldCAtIHNsYXRUb3ApIC8gc2xhdEhlaWdodDsgLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgMQoJCQkJdmFyIGxvY2FsU25hcEluZGV4ID0gTWF0aC5mbG9vcihwYXJ0aWFsICogc25hcHNQZXJTbG90KTsgLy8gdGhlIHNuYXAgIyByZWxhdGl2ZSB0byBzdGFydCBvZiBzbGF0CgkJCQl2YXIgc25hcEluZGV4ID0gc2xhdEluZGV4ICogc25hcHNQZXJTbG90ICsgbG9jYWxTbmFwSW5kZXg7CgkJCQl2YXIgc25hcFRvcCA9IHNsYXRUb3AgKyAobG9jYWxTbmFwSW5kZXggLyBzbmFwc1BlclNsb3QpICogc2xhdEhlaWdodDsKCQkJCXZhciBzbmFwQm90dG9tID0gc2xhdFRvcCArICgobG9jYWxTbmFwSW5kZXggKyAxKSAvIHNuYXBzUGVyU2xvdCkgKiBzbGF0SGVpZ2h0OwoKCQkJCXJldHVybiB7CgkJCQkJY29sOiBjb2xJbmRleCwKCQkJCQlzbmFwOiBzbmFwSW5kZXgsCgkJCQkJY29tcG9uZW50OiB0aGlzLCAvLyBuZWVkZWQgdW5mb3J0dW5hdGVseSA6KAoJCQkJCWxlZnQ6IGNvbENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChjb2xJbmRleCksCgkJCQkJcmlnaHQ6IGNvbENvb3JkQ2FjaGUuZ2V0UmlnaHRPZmZzZXQoY29sSW5kZXgpLAoJCQkJCXRvcDogc25hcFRvcCwKCQkJCQlib3R0b206IHNuYXBCb3R0b20KCQkJCX07CgkJCX0KCQl9Cgl9LAoKCglnZXRIaXRTcGFuOiBmdW5jdGlvbihoaXQpIHsKCQl2YXIgc3RhcnQgPSB0aGlzLmdldENlbGxEYXRlKDAsIGhpdC5jb2wpOyAvLyByb3c9MAoJCXZhciB0aW1lID0gdGhpcy5jb21wdXRlU25hcFRpbWUoaGl0LnNuYXApOyAvLyBwYXNzIGluIHRoZSBzbmFwLWluZGV4CgkJdmFyIGVuZDsKCgkJc3RhcnQudGltZSh0aW1lKTsKCQllbmQgPSBzdGFydC5jbG9uZSgpLmFkZCh0aGlzLnNuYXBEdXJhdGlvbik7CgoJCXJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTsKCX0sCgoKCWdldEhpdEVsOiBmdW5jdGlvbihoaXQpIHsKCQlyZXR1cm4gdGhpcy5jb2xFbHMuZXEoaGl0LmNvbCk7Cgl9LAoKCgkvKiBEYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmFuZ2VVcGRhdGVkOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVwZGF0ZURheVRhYmxlKCk7Cgl9LAoKCgkvLyBHaXZlbiBhIHJvdyBudW1iZXIgb2YgdGhlIGdyaWQsIHJlcHJlc2VudGluZyBhICJzbmFwIiwgcmV0dXJucyBhIHRpbWUgKER1cmF0aW9uKSBmcm9tIGl0cyBzdGFydC1vZi1kYXkKCWNvbXB1dGVTbmFwVGltZTogZnVuY3Rpb24oc25hcEluZGV4KSB7CgkJcmV0dXJuIG1vbWVudC5kdXJhdGlvbih0aGlzLm1pblRpbWUgKyB0aGlzLnNuYXBEdXJhdGlvbiAqIHNuYXBJbmRleCk7Cgl9LAoKCgkvLyBTbGljZXMgdXAgdGhlIGdpdmVuIHNwYW4gKHVuem9uZWQgc3RhcnQvZW5kIHdpdGggb3RoZXIgbWlzYyBkYXRhKSBpbnRvIGFuIGFycmF5IG9mIHNlZ21lbnRzCglzcGFuVG9TZWdzOiBmdW5jdGlvbihzcGFuKSB7CgkJdmFyIHNlZ3MgPSB0aGlzLnNsaWNlUmFuZ2VCeVRpbWVzKHNwYW4pOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlpZiAodGhpcy5pc1JUTCkgewoJCQkJc2Vnc1tpXS5jb2wgPSB0aGlzLmRheXNQZXJSb3cgLSAxIC0gc2Vnc1tpXS5kYXlJbmRleDsKCQkJfQoJCQllbHNlIHsKCQkJCXNlZ3NbaV0uY29sID0gc2Vnc1tpXS5kYXlJbmRleDsKCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCglzbGljZVJhbmdlQnlUaW1lczogZnVuY3Rpb24ocmFuZ2UpIHsKCQl2YXIgc2VncyA9IFtdOwoJCXZhciBzZWc7CgkJdmFyIGRheUluZGV4OwoJCXZhciBkYXlEYXRlOwoJCXZhciBkYXlSYW5nZTsKCgkJZm9yIChkYXlJbmRleCA9IDA7IGRheUluZGV4IDwgdGhpcy5kYXlzUGVyUm93OyBkYXlJbmRleCsrKSB7CgkJCWRheURhdGUgPSB0aGlzLmRheURhdGVzW2RheUluZGV4XS5jbG9uZSgpOyAvLyBUT0RPOiBiZXR0ZXIgQVBJIGZvciB0aGlzPwoJCQlkYXlSYW5nZSA9IHsKCQkJCXN0YXJ0OiBkYXlEYXRlLmNsb25lKCkudGltZSh0aGlzLm1pblRpbWUpLAoJCQkJZW5kOiBkYXlEYXRlLmNsb25lKCkudGltZSh0aGlzLm1heFRpbWUpCgkJCX07CgkJCXNlZyA9IGludGVyc2VjdFJhbmdlcyhyYW5nZSwgZGF5UmFuZ2UpOyAvLyBib3RoIHdpbGwgYmUgYW1iaWcgdGltZXpvbmUKCQkJaWYgKHNlZykgewoJCQkJc2VnLmRheUluZGV4ID0gZGF5SW5kZXg7CgkJCQlzZWdzLnB1c2goc2VnKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvKiBDb29yZGluYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJdXBkYXRlU2l6ZTogZnVuY3Rpb24oaXNSZXNpemUpIHsgLy8gTk9UIGEgc3RhbmRhcmQgR3JpZCBtZXRob2QKCQl0aGlzLnNsYXRDb29yZENhY2hlLmJ1aWxkKCk7CgoJCWlmIChpc1Jlc2l6ZSkgewoJCQl0aGlzLnVwZGF0ZVNlZ1ZlcnRpY2FscygKCQkJCVtdLmNvbmNhdCh0aGlzLmZnU2VncyB8fCBbXSwgdGhpcy5iZ1NlZ3MgfHwgW10sIHRoaXMuYnVzaW5lc3NTZWdzIHx8IFtdKQoJCQkpOwoJCX0KCX0sCgoKCWdldFRvdGFsU2xhdEhlaWdodDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuc2xhdENvbnRhaW5lckVsLm91dGVySGVpZ2h0KCk7Cgl9LAoKCgkvLyBDb21wdXRlcyB0aGUgdG9wIGNvb3JkaW5hdGUsIHJlbGF0aXZlIHRvIHRoZSBib3VuZHMgb2YgdGhlIGdyaWQsIG9mIHRoZSBnaXZlbiBkYXRlLgoJLy8gQSBgc3RhcnRPZkRheURhdGVgIG11c3QgYmUgZ2l2ZW4gZm9yIGF2b2lkaW5nIGFtYmlndWl0eSBvdmVyIGhvdyB0byB0cmVhdCBtaWRuaWdodC4KCWNvbXB1dGVEYXRlVG9wOiBmdW5jdGlvbihkYXRlLCBzdGFydE9mRGF5RGF0ZSkgewoJCXJldHVybiB0aGlzLmNvbXB1dGVUaW1lVG9wKAoJCQltb21lbnQuZHVyYXRpb24oCgkJCQlkYXRlIC0gc3RhcnRPZkRheURhdGUuY2xvbmUoKS5zdHJpcFRpbWUoKQoJCQkpCgkJKTsKCX0sCgoKCS8vIENvbXB1dGVzIHRoZSB0b3AgY29vcmRpbmF0ZSwgcmVsYXRpdmUgdG8gdGhlIGJvdW5kcyBvZiB0aGUgZ3JpZCwgb2YgdGhlIGdpdmVuIHRpbWUgKGEgRHVyYXRpb24pLgoJY29tcHV0ZVRpbWVUb3A6IGZ1bmN0aW9uKHRpbWUpIHsKCQl2YXIgbGVuID0gdGhpcy5zbGF0RWxzLmxlbmd0aDsKCQl2YXIgc2xhdENvdmVyYWdlID0gKHRpbWUgLSB0aGlzLm1pblRpbWUpIC8gdGhpcy5zbG90RHVyYXRpb247IC8vIGZsb2F0aW5nLXBvaW50IHZhbHVlIG9mICMgb2Ygc2xvdHMgY292ZXJlZAoJCXZhciBzbGF0SW5kZXg7CgkJdmFyIHNsYXRSZW1haW5kZXI7CgoJCS8vIGNvbXB1dGUgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgZm9yIGhvdyBtYW55IHNsYXRzIHNob3VsZCBiZSBwcm9ncmVzc2VkIHRocm91Z2guCgkJLy8gZnJvbSAwIHRvIG51bWJlciBvZiBzbGF0cyAoaW5jbHVzaXZlKQoJCS8vIGNvbnN0cmFpbmVkIGJlY2F1c2UgbWluVGltZS9tYXhUaW1lIG1pZ2h0IGJlIGN1c3RvbWl6ZWQuCgkJc2xhdENvdmVyYWdlID0gTWF0aC5tYXgoMCwgc2xhdENvdmVyYWdlKTsKCQlzbGF0Q292ZXJhZ2UgPSBNYXRoLm1pbihsZW4sIHNsYXRDb3ZlcmFnZSk7CgoJCS8vIGFuIGludGVnZXIgaW5kZXggb2YgdGhlIGZ1cnRoZXN0IHdob2xlIHNsYXQKCQkvLyBmcm9tIDAgdG8gbnVtYmVyIHNsYXRzICgqZXhjbHVzaXZlKiwgc28gbGVuLTEpCgkJc2xhdEluZGV4ID0gTWF0aC5mbG9vcihzbGF0Q292ZXJhZ2UpOwoJCXNsYXRJbmRleCA9IE1hdGgubWluKHNsYXRJbmRleCwgbGVuIC0gMSk7CgoJCS8vIGhvdyBtdWNoIGZ1cnRoZXIgdGhyb3VnaCB0aGUgc2xhdEluZGV4IHNsYXQgKGZyb20gMC4wLTEuMCkgbXVzdCBiZSBjb3ZlcmVkIGluIGFkZGl0aW9uLgoJCS8vIGNvdWxkIGJlIDEuMCBpZiBzbGF0Q292ZXJhZ2UgaXMgY292ZXJpbmcgKmFsbCogdGhlIHNsb3RzCgkJc2xhdFJlbWFpbmRlciA9IHNsYXRDb3ZlcmFnZSAtIHNsYXRJbmRleDsKCgkJcmV0dXJuIHRoaXMuc2xhdENvb3JkQ2FjaGUuZ2V0VG9wUG9zaXRpb24oc2xhdEluZGV4KSArCgkJCXRoaXMuc2xhdENvb3JkQ2FjaGUuZ2V0SGVpZ2h0KHNsYXRJbmRleCkgKiBzbGF0UmVtYWluZGVyOwoJfSwKCgoKCS8qIEV2ZW50IERyYWcgVmlzdWFsaXphdGlvbgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIGRyYWdnZWQgb3ZlciB0aGUgc3BlY2lmaWVkIGRhdGUocykuCgkvLyBBIHJldHVybmVkIHZhbHVlIG9mIGB0cnVlYCBzaWduYWxzIHRoYXQgYSBtb2NrICJoZWxwZXIiIGV2ZW50IGhhcyBiZWVuIHJlbmRlcmVkLgoJcmVuZGVyRHJhZzogZnVuY3Rpb24oZXZlbnRMb2NhdGlvbiwgc2VnKSB7CgoJCWlmIChzZWcpIHsgLy8gaWYgdGhlcmUgaXMgZXZlbnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgZHJhZywgcmVuZGVyIGEgaGVscGVyIGV2ZW50CgoJCQkvLyByZXR1cm5zIG1vY2sgZXZlbnQgZWxlbWVudHMKCQkJLy8gc2lnbmFsIHRoYXQgYSBoZWxwZXIgaGFzIGJlZW4gcmVuZGVyZWQKCQkJcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcihldmVudExvY2F0aW9uLCBzZWcpOwoJCX0KCQllbHNlIHsKCQkJLy8gb3RoZXJ3aXNlLCBqdXN0IHJlbmRlciBhIGhpZ2hsaWdodAoJCQl0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKGV2ZW50TG9jYXRpb24pKTsKCQl9Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYW55IHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIGRyYWdnZWQKCXVucmVuZGVyRHJhZzogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhlbHBlcigpOwoJCXRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKCX0sCgoKCS8qIEV2ZW50IFJlc2l6ZSBWaXN1YWxpemF0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgYmVpbmcgcmVzaXplZAoJcmVuZGVyRXZlbnRSZXNpemU6IGZ1bmN0aW9uKGV2ZW50TG9jYXRpb24sIHNlZykgewoJCXJldHVybiB0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIoZXZlbnRMb2NhdGlvbiwgc2VnKTsgLy8gcmV0dXJucyBtb2NrIGV2ZW50IGVsZW1lbnRzCgl9LAoKCgkvLyBVbnJlbmRlcnMgYW55IHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIHJlc2l6ZWQKCXVucmVuZGVyRXZlbnRSZXNpemU6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJIZWxwZXIoKTsKCX0sCgoKCS8qIEV2ZW50IEhlbHBlcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIG1vY2sgImhlbHBlciIgZXZlbnQuIGBzb3VyY2VTZWdgIGlzIHRoZSBvcmlnaW5hbCBzZWdtZW50IG9iamVjdCBhbmQgbWlnaHQgYmUgbnVsbCAoYW4gZXh0ZXJuYWwgZHJhZykKCXJlbmRlckhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHNvdXJjZVNlZykgewoJCXJldHVybiB0aGlzLnJlbmRlckhlbHBlclNlZ3ModGhpcy5ldmVudFRvU2VncyhldmVudCksIHNvdXJjZVNlZyk7IC8vIHJldHVybnMgbW9jayBldmVudCBlbGVtZW50cwoJfSwKCgoJLy8gVW5yZW5kZXJzIGFueSBtb2NrIGhlbHBlciBldmVudAoJdW5yZW5kZXJIZWxwZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJIZWxwZXJTZWdzKCk7Cgl9LAoKCgkvKiBCdXNpbmVzcyBIb3VycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW5kZXJCdXNpbmVzc1NlZ3MoCgkJCXRoaXMuYnVpbGRCdXNpbmVzc0hvdXJTZWdzKCkKCQkpOwoJfSwKCgoJdW5yZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVyQnVzaW5lc3NTZWdzKCk7Cgl9LAoKCgkvKiBOb3cgSW5kaWNhdG9yCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglnZXROb3dJbmRpY2F0b3JVbml0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gJ21pbnV0ZSc7IC8vIHdpbGwgcmVmcmVzaCBvbiB0aGUgbWludXRlCgl9LAoKCglyZW5kZXJOb3dJbmRpY2F0b3I6IGZ1bmN0aW9uKGRhdGUpIHsKCQkvLyBzZWcgc3lzdGVtIG1pZ2h0IGJlIG92ZXJraWxsLCBidXQgaXQgaGFuZGxlcyBzY2VuYXJpbyB3aGVyZSBsaW5lIG5lZWRzIHRvIGJlIHJlbmRlcmVkCgkJLy8gIG1vcmUgdGhhbiBvbmNlIGJlY2F1c2Ugb2YgY29sdW1ucyB3aXRoIHRoZSBzYW1lIGRhdGUgKHJlc291cmNlcyBjb2x1bW5zIGZvciBleGFtcGxlKQoJCXZhciBzZWdzID0gdGhpcy5zcGFuVG9TZWdzKHsgc3RhcnQ6IGRhdGUsIGVuZDogZGF0ZSB9KTsKCQl2YXIgdG9wID0gdGhpcy5jb21wdXRlRGF0ZVRvcChkYXRlLCBkYXRlKTsKCQl2YXIgbm9kZXMgPSBbXTsKCQl2YXIgaTsKCgkJLy8gcmVuZGVyIGxpbmVzIHdpdGhpbiB0aGUgY29sdW1ucwoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCW5vZGVzLnB1c2goJCgnPGRpdiBjbGFzcz0iZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWxpbmUiPjwvZGl2PicpCgkJCQkuY3NzKCd0b3AnLCB0b3ApCgkJCQkuYXBwZW5kVG8odGhpcy5jb2xDb250YWluZXJFbHMuZXEoc2Vnc1tpXS5jb2wpKVswXSk7CgkJfQoKCQkvLyByZW5kZXIgYW4gYXJyb3cgb3ZlciB0aGUgYXhpcwoJCWlmIChzZWdzLmxlbmd0aCA+IDApIHsgLy8gaXMgdGhlIGN1cnJlbnQgdGltZSBpbiB2aWV3PwoJCQlub2Rlcy5wdXNoKCQoJzxkaXYgY2xhc3M9ImZjLW5vdy1pbmRpY2F0b3IgZmMtbm93LWluZGljYXRvci1hcnJvdyI+PC9kaXY+JykKCQkJCS5jc3MoJ3RvcCcsIHRvcCkKCQkJCS5hcHBlbmRUbyh0aGlzLmVsLmZpbmQoJy5mYy1jb250ZW50LXNrZWxldG9uJykpWzBdKTsKCQl9CgoJCXRoaXMubm93SW5kaWNhdG9yRWxzID0gJChub2Rlcyk7Cgl9LAoKCgl1bnJlbmRlck5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMubm93SW5kaWNhdG9yRWxzKSB7CgkJCXRoaXMubm93SW5kaWNhdG9yRWxzLnJlbW92ZSgpOwoJCQl0aGlzLm5vd0luZGljYXRvckVscyA9IG51bGw7CgkJfQoJfSwKCgoJLyogU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYSBzZWxlY3Rpb24uIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCwgd2hpY2ggd2FzIHRvIHNpbXBseSByZW5kZXIgYSBoaWdobGlnaHQuCglyZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKHNwYW4pIHsKCQlpZiAodGhpcy52aWV3Lm9wdCgnc2VsZWN0SGVscGVyJykpIHsgLy8gdGhpcyBzZXR0aW5nIHNpZ25hbHMgdGhhdCBhIG1vY2sgaGVscGVyIGV2ZW50IHNob3VsZCBiZSByZW5kZXJlZAoKCQkJLy8gbm9ybWFsbHkgYWNjZXBzIGFuIGV2ZW50TG9jYXRpb24sIHNwYW4gaGFzIGEgc3RhcnQvZW5kLCB3aGljaCBpcyBnb29kIGVub3VnaAoJCQl0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIoc3Bhbik7CgkJfQoJCWVsc2UgewoJCQl0aGlzLnJlbmRlckhpZ2hsaWdodChzcGFuKTsKCQl9Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYW55IHZpc3VhbCBpbmRpY2F0aW9uIG9mIGEgc2VsZWN0aW9uCgl1bnJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhlbHBlcigpOwoJCXRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKCX0sCgoKCS8qIEhpZ2hsaWdodAoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVySGlnaGxpZ2h0OiBmdW5jdGlvbihzcGFuKSB7CgkJdGhpcy5yZW5kZXJIaWdobGlnaHRTZWdzKHRoaXMuc3BhblRvU2VncyhzcGFuKSk7Cgl9LAoKCgl1bnJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhpZ2hsaWdodFNlZ3MoKTsKCX0KCn0pOwoKOzsKCi8qIE1ldGhvZHMgZm9yIHJlbmRlcmluZyBTRUdNRU5UUywgcGllY2VzIG9mIGNvbnRlbnQgdGhhdCBsaXZlIG9uIHRoZSB2aWV3CiAoIHRoaXMgZmlsZSBpcyBubyBsb25nZXIganVzdCBmb3IgZXZlbnRzICkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpUaW1lR3JpZC5taXhpbih7CgoJY29sQ29udGFpbmVyRWxzOiBudWxsLCAvLyBjb250YWluZXJzIGZvciBlYWNoIGNvbHVtbgoKCS8vIGlubmVyLWNvbnRhaW5lcnMgZm9yIGVhY2ggY29sdW1uIHdoZXJlIGRpZmZlcmVudCB0eXBlcyBvZiBzZWdzIGxpdmUKCWZnQ29udGFpbmVyRWxzOiBudWxsLAoJYmdDb250YWluZXJFbHM6IG51bGwsCgloZWxwZXJDb250YWluZXJFbHM6IG51bGwsCgloaWdobGlnaHRDb250YWluZXJFbHM6IG51bGwsCglidXNpbmVzc0NvbnRhaW5lckVsczogbnVsbCwKCgkvLyBhcnJheXMgb2YgZGlmZmVyZW50IHR5cGVzIG9mIGRpc3BsYXllZCBzZWdtZW50cwoJZmdTZWdzOiBudWxsLAoJYmdTZWdzOiBudWxsLAoJaGVscGVyU2VnczogbnVsbCwKCWhpZ2hsaWdodFNlZ3M6IG51bGwsCglidXNpbmVzc1NlZ3M6IG51bGwsCgoKCS8vIFJlbmRlcnMgdGhlIERPTSB0aGF0IHRoZSB2aWV3J3MgY29udGVudCB3aWxsIGxpdmUgaW4KCXJlbmRlckNvbnRlbnRTa2VsZXRvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGNlbGxIdG1sID0gJyc7CgkJdmFyIGk7CgkJdmFyIHNrZWxldG9uRWw7CgoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmNvbENudDsgaSsrKSB7CgkJCWNlbGxIdG1sICs9CgkJCQknPHRkPicgKwoJCQkJCSc8ZGl2IGNsYXNzPSJmYy1jb250ZW50LWNvbCI+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIgZmMtaGVscGVyLWNvbnRhaW5lciI+PC9kaXY+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiPjwvZGl2PicgKwoJCQkJCQknPGRpdiBjbGFzcz0iZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciI+PC9kaXY+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1iZ2V2ZW50LWNvbnRhaW5lciI+PC9kaXY+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1idXNpbmVzcy1jb250YWluZXIiPjwvZGl2PicgKwoJCQkJCSc8L2Rpdj4nICsKCQkJCSc8L3RkPic7CgkJfQoKCQlza2VsZXRvbkVsID0gJCgKCQkJJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQtc2tlbGV0b24iPicgKwoJCQkJJzx0YWJsZT4nICsKCQkJCQknPHRyPicgKyBjZWxsSHRtbCArICc8L3RyPicgKwoJCQkJJzwvdGFibGU+JyArCgkJCSc8L2Rpdj4nCgkJKTsKCgkJdGhpcy5jb2xDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1jb250ZW50LWNvbCcpOwoJCXRoaXMuaGVscGVyQ29udGFpbmVyRWxzID0gc2tlbGV0b25FbC5maW5kKCcuZmMtaGVscGVyLWNvbnRhaW5lcicpOwoJCXRoaXMuZmdDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1ldmVudC1jb250YWluZXI6bm90KC5mYy1oZWxwZXItY29udGFpbmVyKScpOwoJCXRoaXMuYmdDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1iZ2V2ZW50LWNvbnRhaW5lcicpOwoJCXRoaXMuaGlnaGxpZ2h0Q29udGFpbmVyRWxzID0gc2tlbGV0b25FbC5maW5kKCcuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lcicpOwoJCXRoaXMuYnVzaW5lc3NDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1idXNpbmVzcy1jb250YWluZXInKTsKCgkJdGhpcy5ib29rZW5kQ2VsbHMoc2tlbGV0b25FbC5maW5kKCd0cicpKTsgLy8gVE9ETzogZG8gdGhpcyBvbiBzdHJpbmcgbGV2ZWwKCQl0aGlzLmVsLmFwcGVuZChza2VsZXRvbkVsKTsKCX0sCgoKCS8qIEZvcmVncm91bmQgRXZlbnRzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJGZ1NlZ3M6IGZ1bmN0aW9uKHNlZ3MpIHsKCQlzZWdzID0gdGhpcy5yZW5kZXJGZ1NlZ3NJbnRvQ29udGFpbmVycyhzZWdzLCB0aGlzLmZnQ29udGFpbmVyRWxzKTsKCQl0aGlzLmZnU2VncyA9IHNlZ3M7CgkJcmV0dXJuIHNlZ3M7IC8vIG5lZWRlZCBmb3IgR3JpZDo6cmVuZGVyRXZlbnRzCgl9LAoKCgl1bnJlbmRlckZnU2VnczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlck5hbWVkU2VncygnZmdTZWdzJyk7Cgl9LAoKCgkvKiBGb3JlZ3JvdW5kIEhlbHBlciBFdmVudHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCXJlbmRlckhlbHBlclNlZ3M6IGZ1bmN0aW9uKHNlZ3MsIHNvdXJjZVNlZykgewoJCXZhciBoZWxwZXJFbHMgPSBbXTsKCQl2YXIgaSwgc2VnOwoJCXZhciBzb3VyY2VFbDsKCgkJc2VncyA9IHRoaXMucmVuZGVyRmdTZWdzSW50b0NvbnRhaW5lcnMoc2VncywgdGhpcy5oZWxwZXJDb250YWluZXJFbHMpOwoKCQkvLyBUcnkgdG8gbWFrZSB0aGUgc2VnbWVudCB0aGF0IGlzIGluIHRoZSBzYW1lIHJvdyBhcyBzb3VyY2VTZWcgbG9vayB0aGUgc2FtZQoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCXNlZyA9IHNlZ3NbaV07CgkJCWlmIChzb3VyY2VTZWcgJiYgc291cmNlU2VnLmNvbCA9PT0gc2VnLmNvbCkgewoJCQkJc291cmNlRWwgPSBzb3VyY2VTZWcuZWw7CgkJCQlzZWcuZWwuY3NzKHsKCQkJCQlsZWZ0OiBzb3VyY2VFbC5jc3MoJ2xlZnQnKSwKCQkJCQlyaWdodDogc291cmNlRWwuY3NzKCdyaWdodCcpLAoJCQkJCSdtYXJnaW4tbGVmdCc6IHNvdXJjZUVsLmNzcygnbWFyZ2luLWxlZnQnKSwKCQkJCQknbWFyZ2luLXJpZ2h0Jzogc291cmNlRWwuY3NzKCdtYXJnaW4tcmlnaHQnKQoJCQkJfSk7CgkJCX0KCQkJaGVscGVyRWxzLnB1c2goc2VnLmVsWzBdKTsKCQl9CgoJCXRoaXMuaGVscGVyU2VncyA9IHNlZ3M7CgoJCXJldHVybiAkKGhlbHBlckVscyk7IC8vIG11c3QgcmV0dXJuIHJlbmRlcmVkIGhlbHBlcnMKCX0sCgoKCXVucmVuZGVySGVscGVyU2VnczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlck5hbWVkU2VncygnaGVscGVyU2VncycpOwoJfSwKCgoJLyogQmFja2dyb3VuZCBFdmVudHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCXJlbmRlckJnU2VnczogZnVuY3Rpb24oc2VncykgewoJCXNlZ3MgPSB0aGlzLnJlbmRlckZpbGxTZWdFbHMoJ2JnRXZlbnQnLCBzZWdzKTsgLy8gVE9ETzogb2xkIGZpbGwgc3lzdGVtCgkJdGhpcy51cGRhdGVTZWdWZXJ0aWNhbHMoc2Vncyk7CgkJdGhpcy5hdHRhY2hTZWdzQnlDb2wodGhpcy5ncm91cFNlZ3NCeUNvbChzZWdzKSwgdGhpcy5iZ0NvbnRhaW5lckVscyk7CgkJdGhpcy5iZ1NlZ3MgPSBzZWdzOwoJCXJldHVybiBzZWdzOyAvLyBuZWVkZWQgZm9yIEdyaWQ6OnJlbmRlckV2ZW50cwoJfSwKCgoJdW5yZW5kZXJCZ1NlZ3M6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJOYW1lZFNlZ3MoJ2JnU2VncycpOwoJfSwKCgoJLyogSGlnaGxpZ2h0CgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJIaWdobGlnaHRTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0VscygnaGlnaGxpZ2h0Jywgc2Vncyk7IC8vIFRPRE86IG9sZCBmaWxsIHN5c3RlbQoJCXRoaXMudXBkYXRlU2VnVmVydGljYWxzKHNlZ3MpOwoJCXRoaXMuYXR0YWNoU2Vnc0J5Q29sKHRoaXMuZ3JvdXBTZWdzQnlDb2woc2VncyksIHRoaXMuaGlnaGxpZ2h0Q29udGFpbmVyRWxzKTsKCQl0aGlzLmhpZ2hsaWdodFNlZ3MgPSBzZWdzOwoJfSwKCgoJdW5yZW5kZXJIaWdobGlnaHRTZWdzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCdoaWdobGlnaHRTZWdzJyk7Cgl9LAoKCgkvKiBCdXNpbmVzcyBIb3VycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyQnVzaW5lc3NTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0VscygnYnVzaW5lc3NIb3VycycsIHNlZ3MpOyAvLyBUT0RPOiBvbGQgZmlsbCBzeXN0ZW0KCQl0aGlzLnVwZGF0ZVNlZ1ZlcnRpY2FscyhzZWdzKTsKCQl0aGlzLmF0dGFjaFNlZ3NCeUNvbCh0aGlzLmdyb3VwU2Vnc0J5Q29sKHNlZ3MpLCB0aGlzLmJ1c2luZXNzQ29udGFpbmVyRWxzKTsKCQl0aGlzLmJ1c2luZXNzU2VncyA9IHNlZ3M7Cgl9LAoKCgl1bnJlbmRlckJ1c2luZXNzU2VnczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlck5hbWVkU2VncygnYnVzaW5lc3NTZWdzJyk7Cgl9LAoKCgkvKiBTZWcgUmVuZGVyaW5nIFV0aWxzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBHaXZlbiBhIGZsYXQgYXJyYXkgb2Ygc2VnbWVudHMsIHJldHVybiBhbiBhcnJheSBvZiBzdWItYXJyYXlzLCBncm91cGVkIGJ5IGVhY2ggc2VnbWVudCdzIGNvbAoJZ3JvdXBTZWdzQnlDb2w6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgc2Vnc0J5Q29sID0gW107CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmNvbENudDsgaSsrKSB7CgkJCXNlZ3NCeUNvbC5wdXNoKFtdKTsKCQl9CgoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCXNlZ3NCeUNvbFtzZWdzW2ldLmNvbF0ucHVzaChzZWdzW2ldKTsKCQl9CgoJCXJldHVybiBzZWdzQnlDb2w7Cgl9LAoKCgkvLyBHaXZlbiBzZWdtZW50cyBncm91cGVkIGJ5IGNvbHVtbiwgaW5zZXJ0IHRoZSBzZWdtZW50cycgZWxlbWVudHMgaW50byBhIHBhcmFsbGVsIGFycmF5IG9mIGNvbnRhaW5lcgoJLy8gZWxlbWVudHMsIGVhY2ggbGl2aW5nIHdpdGhpbiBhIGNvbHVtbi4KCWF0dGFjaFNlZ3NCeUNvbDogZnVuY3Rpb24oc2Vnc0J5Q29sLCBjb250YWluZXJFbHMpIHsKCQl2YXIgY29sOwoJCXZhciBzZWdzOwoJCXZhciBpOwoKCQlmb3IgKGNvbCA9IDA7IGNvbCA8IHRoaXMuY29sQ250OyBjb2wrKykgeyAvLyBpdGVyYXRlIGVhY2ggY29sdW1uIGdyb3VwaW5nCgkJCXNlZ3MgPSBzZWdzQnlDb2xbY29sXTsKCgkJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCQljb250YWluZXJFbHMuZXEoY29sKS5hcHBlbmQoc2Vnc1tpXS5lbCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBHaXZlbiB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IG9mIGB0aGlzYCBvYmplY3QsIGFzc3VtZWQgdG8gYmUgYW4gYXJyYXkgb2Ygc2VnbWVudHMsCgkvLyBsb29wcyB0aHJvdWdoIGVhY2ggc2VnbWVudCBhbmQgcmVtb3ZlcyBmcm9tIERPTS4gV2lsbCBudWxsLW91dCB0aGUgcHJvcGVydHkgYWZ0ZXJ3YXJkcy4KCXVucmVuZGVyTmFtZWRTZWdzOiBmdW5jdGlvbihwcm9wTmFtZSkgewoJCXZhciBzZWdzID0gdGhpc1twcm9wTmFtZV07CgkJdmFyIGk7CgoJCWlmIChzZWdzKSB7CgkJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCQlzZWdzW2ldLmVsLnJlbW92ZSgpOwoJCQl9CgkJCXRoaXNbcHJvcE5hbWVdID0gbnVsbDsKCQl9Cgl9LAoKCgoJLyogRm9yZWdyb3VuZCBFdmVudCBSZW5kZXJpbmcgVXRpbHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdpdmVuIGFuIGFycmF5IG9mIGZvcmVncm91bmQgc2VnbWVudHMsIHJlbmRlciBhIERPTSBlbGVtZW50IGZvciBlYWNoLCBjb21wdXRlcyBwb3NpdGlvbiwKCS8vIGFuZCBhdHRhY2hlcyB0byB0aGUgY29sdW1uIGlubmVyLWNvbnRhaW5lciBlbGVtZW50cy4KCXJlbmRlckZnU2Vnc0ludG9Db250YWluZXJzOiBmdW5jdGlvbihzZWdzLCBjb250YWluZXJFbHMpIHsKCQl2YXIgc2Vnc0J5Q29sOwoJCXZhciBjb2w7CgoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MpOyAvLyB3aWxsIGNhbGwgZmdTZWdIdG1sCgkJc2Vnc0J5Q29sID0gdGhpcy5ncm91cFNlZ3NCeUNvbChzZWdzKTsKCgkJZm9yIChjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sKyspIHsKCQkJdGhpcy51cGRhdGVGZ1NlZ0Nvb3JkcyhzZWdzQnlDb2xbY29sXSk7CgkJfQoKCQl0aGlzLmF0dGFjaFNlZ3NCeUNvbChzZWdzQnlDb2wsIGNvbnRhaW5lckVscyk7CgoJCXJldHVybiBzZWdzOwoJfSwKCgoJLy8gUmVuZGVycyB0aGUgSFRNTCBmb3IgYSBzaW5nbGUgZXZlbnQgc2VnbWVudCdzIGRlZmF1bHQgcmVuZGVyaW5nCglmZ1NlZ0h0bWw6IGZ1bmN0aW9uKHNlZywgZGlzYWJsZVJlc2l6aW5nKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGV2ZW50ID0gc2VnLmV2ZW50OwoJCXZhciBpc0RyYWdnYWJsZSA9IHZpZXcuaXNFdmVudERyYWdnYWJsZShldmVudCk7CgkJdmFyIGlzUmVzaXphYmxlRnJvbVN0YXJ0ID0gIWRpc2FibGVSZXNpemluZyAmJiBzZWcuaXNTdGFydCAmJiB2aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQoZXZlbnQpOwoJCXZhciBpc1Jlc2l6YWJsZUZyb21FbmQgPSAhZGlzYWJsZVJlc2l6aW5nICYmIHNlZy5pc0VuZCAmJiB2aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tRW5kKGV2ZW50KTsKCQl2YXIgY2xhc3NlcyA9IHRoaXMuZ2V0U2VnQ2xhc3NlcyhzZWcsIGlzRHJhZ2dhYmxlLCBpc1Jlc2l6YWJsZUZyb21TdGFydCB8fCBpc1Jlc2l6YWJsZUZyb21FbmQpOwoJCXZhciBza2luQ3NzID0gY3NzVG9TdHIodGhpcy5nZXRTZWdTa2luQ3NzKHNlZykpOwoJCXZhciB0aW1lVGV4dDsKCQl2YXIgZnVsbFRpbWVUZXh0OyAvLyBtb3JlIHZlcmJvc2UgdGltZSB0ZXh0LiBmb3IgdGhlIHByaW50IHN0eWxlc2hlZXQKCQl2YXIgc3RhcnRUaW1lVGV4dDsgLy8ganVzdCB0aGUgc3RhcnQgdGltZSB0ZXh0CgoJCWNsYXNzZXMudW5zaGlmdCgnZmMtdGltZS1ncmlkLWV2ZW50JywgJ2ZjLXYtZXZlbnQnKTsKCgkJaWYgKHZpZXcuaXNNdWx0aURheUV2ZW50KGV2ZW50KSkgeyAvLyBpZiB0aGUgZXZlbnQgYXBwZWFycyB0byBzcGFuIG1vcmUgdGhhbiBvbmUgZGF5Li4uCgkJCS8vIERvbid0IGRpc3BsYXkgdGltZSB0ZXh0IG9uIHNlZ21lbnRzIHRoYXQgcnVuIGVudGlyZWx5IHRocm91Z2ggYSBkYXkuCgkJCS8vIFRoYXQgd291bGQgYXBwZWFyIGFzIG1pZG5pZ2h0LW1pZG5pZ2h0IGFuZCB3b3VsZCBsb29rIGR1bWIuCgkJCS8vIE90aGVyd2lzZSwgZGlzcGxheSB0aGUgdGltZSB0ZXh0IGZvciB0aGUgKnNlZ21lbnQncyogdGltZXMgKGxpa2UgNnBtLW1pZG5pZ2h0IG9yIG1pZG5pZ2h0LTEwYW0pCgkJCWlmIChzZWcuaXNTdGFydCB8fCBzZWcuaXNFbmQpIHsKCQkJCXRpbWVUZXh0ID0gdGhpcy5nZXRFdmVudFRpbWVUZXh0KHNlZyk7CgkJCQlmdWxsVGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoc2VnLCAnTFQnKTsKCQkJCXN0YXJ0VGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoc2VnLCBudWxsLCBmYWxzZSk7IC8vIGRpc3BsYXlFbmQ9ZmFsc2UKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIERpc3BsYXkgdGhlIG5vcm1hbCB0aW1lIHRleHQgZm9yIHRoZSAqZXZlbnQncyogdGltZXMKCQkJdGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoZXZlbnQpOwoJCQlmdWxsVGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoZXZlbnQsICdMVCcpOwoJCQlzdGFydFRpbWVUZXh0ID0gdGhpcy5nZXRFdmVudFRpbWVUZXh0KGV2ZW50LCBudWxsLCBmYWxzZSk7IC8vIGRpc3BsYXlFbmQ9ZmFsc2UKCQl9CgoJCXJldHVybiAnPGEgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciJyArCgkJCShldmVudC51cmwgPwoJCQkJJyBocmVmPSInICsgaHRtbEVzY2FwZShldmVudC51cmwpICsgJyInIDoKCQkJCScnCgkJCQkpICsKCQkJKHNraW5Dc3MgPwoJCQkJJyBzdHlsZT0iJyArIHNraW5Dc3MgKyAnIicgOgoJCQkJJycKCQkJCSkgKwoJCQknPicgKwoJCQkJJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicgKwoJCQkJCSh0aW1lVGV4dCA/CgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy10aW1lIicgKwoJCQkJCQknIGRhdGEtc3RhcnQ9IicgKyBodG1sRXNjYXBlKHN0YXJ0VGltZVRleHQpICsgJyInICsKCQkJCQkJJyBkYXRhLWZ1bGw9IicgKyBodG1sRXNjYXBlKGZ1bGxUaW1lVGV4dCkgKyAnIicgKwoJCQkJCQknPicgKwoJCQkJCQkJJzxzcGFuPicgKyBodG1sRXNjYXBlKHRpbWVUZXh0KSArICc8L3NwYW4+JyArCgkJCQkJCSc8L2Rpdj4nIDoKCQkJCQkJJycKCQkJCQkJKSArCgkJCQkJKGV2ZW50LnRpdGxlID8KCQkJCQkJJzxkaXYgY2xhc3M9ImZjLXRpdGxlIj4nICsKCQkJCQkJCWh0bWxFc2NhcGUoZXZlbnQudGl0bGUpICsKCQkJCQkJJzwvZGl2PicgOgoJCQkJCQknJwoJCQkJCQkpICsKCQkJCSc8L2Rpdj4nICsKCQkJCSc8ZGl2IGNsYXNzPSJmYy1iZyIvPicgKwoJCQkJLyogVE9ETzogd3JpdGUgQ1NTIGZvciB0aGlzCgkJCQkoaXNSZXNpemFibGVGcm9tU3RhcnQgPwoJCQkJCSc8ZGl2IGNsYXNzPSJmYy1yZXNpemVyIGZjLXN0YXJ0LXJlc2l6ZXIiIC8+JyA6CgkJCQkJJycKCQkJCQkpICsKCQkJCSovCgkJCQkoaXNSZXNpemFibGVGcm9tRW5kID8KCQkJCQknPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1lbmQtcmVzaXplciIgLz4nIDoKCQkJCQknJwoJCQkJCSkgKwoJCQknPC9hPic7Cgl9LAoKCgkvKiBTZWcgUG9zaXRpb24gVXRpbHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlZnJlc2hlcyB0aGUgQ1NTIHRvcC9ib3R0b20gY29vcmRpbmF0ZXMgZm9yIGVhY2ggc2VnbWVudCBlbGVtZW50LgoJLy8gV29ya3Mgd2hlbiBjYWxsZWQgYWZ0ZXIgaW5pdGlhbCByZW5kZXIsIGFmdGVyIGEgd2luZG93IHJlc2l6ZS96b29tIGZvciBleGFtcGxlLgoJdXBkYXRlU2VnVmVydGljYWxzOiBmdW5jdGlvbihzZWdzKSB7CgkJdGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHNlZ3MpOwoJCXRoaXMuYXNzaWduU2VnVmVydGljYWxzKHNlZ3MpOwoJfSwKCgoJLy8gRm9yIGVhY2ggc2VnbWVudCBpbiBhbiBhcnJheSwgY29tcHV0ZXMgYW5kIGFzc2lnbnMgaXRzIHRvcCBhbmQgYm90dG9tIHByb3BlcnRpZXMKCWNvbXB1dGVTZWdWZXJ0aWNhbHM6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgaSwgc2VnOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlzZWcgPSBzZWdzW2ldOwoJCQlzZWcudG9wID0gdGhpcy5jb21wdXRlRGF0ZVRvcChzZWcuc3RhcnQsIHNlZy5zdGFydCk7CgkJCXNlZy5ib3R0b20gPSB0aGlzLmNvbXB1dGVEYXRlVG9wKHNlZy5lbmQsIHNlZy5zdGFydCk7CgkJfQoJfSwKCgoJLy8gR2l2ZW4gc2VnbWVudHMgdGhhdCBhbHJlYWR5IGhhdmUgdGhlaXIgdG9wL2JvdHRvbSBwcm9wZXJ0aWVzIGNvbXB1dGVkLCBhcHBsaWVzIHRob3NlIHZhbHVlcyB0bwoJLy8gdGhlIHNlZ21lbnRzJyBlbGVtZW50cy4KCWFzc2lnblNlZ1ZlcnRpY2FsczogZnVuY3Rpb24oc2VncykgewoJCXZhciBpLCBzZWc7CgoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCXNlZyA9IHNlZ3NbaV07CgkJCXNlZy5lbC5jc3ModGhpcy5nZW5lcmF0ZVNlZ1ZlcnRpY2FsQ3NzKHNlZykpOwoJCX0KCX0sCgoKCS8vIEdlbmVyYXRlcyBhbiBvYmplY3Qgd2l0aCBDU1MgcHJvcGVydGllcyBmb3IgdGhlIHRvcC9ib3R0b20gY29vcmRpbmF0ZXMgb2YgYSBzZWdtZW50IGVsZW1lbnQKCWdlbmVyYXRlU2VnVmVydGljYWxDc3M6IGZ1bmN0aW9uKHNlZykgewoJCXJldHVybiB7CgkJCXRvcDogc2VnLnRvcCwKCQkJYm90dG9tOiAtc2VnLmJvdHRvbSAvLyBmbGlwcGVkIGJlY2F1c2UgbmVlZHMgdG8gYmUgc3BhY2UgYmV5b25kIGJvdHRvbSBlZGdlIG9mIGV2ZW50IGNvbnRhaW5lcgoJCX07Cgl9LAoKCgkvKiBGb3JlZ3JvdW5kIEV2ZW50IFBvc2l0aW9uaW5nIFV0aWxzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBHaXZlbiBzZWdtZW50cyB0aGF0IGFyZSBhc3N1bWVkIHRvIGFsbCBsaXZlIGluIHRoZSAqc2FtZSBjb2x1bW4qLAoJLy8gY29tcHV0ZSB0aGVpciB2ZXJpY2FsL2hvcml6b250YWwgY29vcmRpbmF0ZXMgYW5kIGFzc2lnbiB0byB0aGVpciBlbGVtZW50cy4KCXVwZGF0ZUZnU2VnQ29vcmRzOiBmdW5jdGlvbihzZWdzKSB7CgkJdGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHNlZ3MpOyAvLyBob3Jpem9udGFscyByZWxpZXMgb24gdGhpcwoJCXRoaXMuY29tcHV0ZUZnU2VnSG9yaXpvbnRhbHMoc2Vncyk7IC8vIGNvbXB1dGUgaG9yaXpvbnRhbCBjb29yZGluYXRlcywgei1pbmRleCdzLCBhbmQgcmVvcmRlciB0aGUgYXJyYXkKCQl0aGlzLmFzc2lnblNlZ1ZlcnRpY2FscyhzZWdzKTsKCQl0aGlzLmFzc2lnbkZnU2VnSG9yaXpvbnRhbHMoc2Vncyk7Cgl9LAoKCgkvLyBHaXZlbiBhbiBhcnJheSBvZiBzZWdtZW50cyB0aGF0IGFyZSBhbGwgaW4gdGhlIHNhbWUgY29sdW1uLCBzZXRzIHRoZSBiYWNrd2FyZENvb3JkIGFuZCBmb3J3YXJkQ29vcmQgb24gZWFjaC4KCS8vIE5PVEU6IEFsc28gcmVvcmRlcnMgdGhlIGdpdmVuIGFycmF5IGJ5IGRhdGUhCgljb21wdXRlRmdTZWdIb3Jpem9udGFsczogZnVuY3Rpb24oc2VncykgewoJCXZhciBsZXZlbHM7CgkJdmFyIGxldmVsMDsKCQl2YXIgaTsKCgkJdGhpcy5zb3J0RXZlbnRTZWdzKHNlZ3MpOyAvLyBvcmRlciBieSBjZXJ0YWluIGNyaXRlcmlhCgkJbGV2ZWxzID0gYnVpbGRTbG90U2VnTGV2ZWxzKHNlZ3MpOwoJCWNvbXB1dGVGb3J3YXJkU2xvdFNlZ3MobGV2ZWxzKTsKCgkJaWYgKChsZXZlbDAgPSBsZXZlbHNbMF0pKSB7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWwwLmxlbmd0aDsgaSsrKSB7CgkJCQljb21wdXRlU2xvdFNlZ1ByZXNzdXJlcyhsZXZlbDBbaV0pOwoJCQl9CgoJCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWwwLmxlbmd0aDsgaSsrKSB7CgkJCQl0aGlzLmNvbXB1dGVGZ1NlZ0ZvcndhcmRCYWNrKGxldmVsMFtpXSwgMCwgMCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBDYWxjdWxhdGUgc2VnLmZvcndhcmRDb29yZCBhbmQgc2VnLmJhY2t3YXJkQ29vcmQgZm9yIHRoZSBzZWdtZW50LCB3aGVyZSBib3RoIHZhbHVlcyByYW5nZQoJLy8gZnJvbSAwIHRvIDEuIElmIHRoZSBjYWxlbmRhciBpcyBsZWZ0LXRvLXJpZ2h0LCB0aGUgc2VnLmJhY2t3YXJkQ29vcmQgbWFwcyB0byAibGVmdCIgYW5kCgkvLyBzZWcuZm9yd2FyZENvb3JkIG1hcHMgdG8gInJpZ2h0IiAodmlhIHBlcmNlbnRhZ2UpLiBWaWNlLXZlcnNhIGlmIHRoZSBjYWxlbmRhciBpcyByaWdodC10by1sZWZ0LgoJLy8KCS8vIFRoZSBzZWdtZW50IG1pZ2h0IGJlIHBhcnQgb2YgYSAic2VyaWVzIiwgd2hpY2ggbWVhbnMgY29uc2VjdXRpdmUgc2VnbWVudHMgd2l0aCB0aGUgc2FtZSBwcmVzc3VyZQoJLy8gd2hvJ3Mgd2lkdGggaXMgdW5rbm93biB1bnRpbCBhbiBlZGdlIGhhcyBiZWVuIGhpdC4gYHNlcmllc0JhY2t3YXJkUHJlc3N1cmVgIGlzIHRoZSBudW1iZXIgb2YKCS8vIHNlZ21lbnRzIGJlaGluZCB0aGlzIG9uZSBpbiB0aGUgY3VycmVudCBzZXJpZXMsIGFuZCBgc2VyaWVzQmFja3dhcmRDb29yZGAgaXMgdGhlIHN0YXJ0aW5nCgkvLyBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBzZWdtZW50IGluIHRoZSBzZXJpZXMuCgljb21wdXRlRmdTZWdGb3J3YXJkQmFjazogZnVuY3Rpb24oc2VnLCBzZXJpZXNCYWNrd2FyZFByZXNzdXJlLCBzZXJpZXNCYWNrd2FyZENvb3JkKSB7CgkJdmFyIGZvcndhcmRTZWdzID0gc2VnLmZvcndhcmRTZWdzOwoJCXZhciBpOwoKCQlpZiAoc2VnLmZvcndhcmRDb29yZCA9PT0gdW5kZWZpbmVkKSB7IC8vIG5vdCBhbHJlYWR5IGNvbXB1dGVkCgoJCQlpZiAoIWZvcndhcmRTZWdzLmxlbmd0aCkgewoKCQkJCS8vIGlmIHRoZXJlIGFyZSBubyBmb3J3YXJkIHNlZ21lbnRzLCB0aGlzIHNlZ21lbnQgc2hvdWxkIGJ1dHQgdXAgYWdhaW5zdCB0aGUgZWRnZQoJCQkJc2VnLmZvcndhcmRDb29yZCA9IDE7CgkJCX0KCQkJZWxzZSB7CgoJCQkJLy8gc29ydCBoaWdoZXN0IHByZXNzdXJlIGZpcnN0CgkJCQl0aGlzLnNvcnRGb3J3YXJkU2Vncyhmb3J3YXJkU2Vncyk7CgoJCQkJLy8gdGhpcyBzZWdtZW50J3MgZm9yd2FyZENvb3JkIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBiYWNrd2FyZENvb3JkIG9mIHRoZQoJCQkJLy8gaGlnaGVzdC1wcmVzc3VyZSBmb3J3YXJkIHNlZ21lbnQuCgkJCQl0aGlzLmNvbXB1dGVGZ1NlZ0ZvcndhcmRCYWNrKGZvcndhcmRTZWdzWzBdLCBzZXJpZXNCYWNrd2FyZFByZXNzdXJlICsgMSwgc2VyaWVzQmFja3dhcmRDb29yZCk7CgkJCQlzZWcuZm9yd2FyZENvb3JkID0gZm9yd2FyZFNlZ3NbMF0uYmFja3dhcmRDb29yZDsKCQkJfQoKCQkJLy8gY2FsY3VsYXRlIHRoZSBiYWNrd2FyZENvb3JkIGZyb20gdGhlIGZvcndhcmRDb29yZC4gY29uc2lkZXIgdGhlIHNlcmllcwoJCQlzZWcuYmFja3dhcmRDb29yZCA9IHNlZy5mb3J3YXJkQ29vcmQgLQoJCQkJKHNlZy5mb3J3YXJkQ29vcmQgLSBzZXJpZXNCYWNrd2FyZENvb3JkKSAvIC8vIGF2YWlsYWJsZSB3aWR0aCBmb3Igc2VyaWVzCgkJCQkoc2VyaWVzQmFja3dhcmRQcmVzc3VyZSArIDEpOyAvLyAjIG9mIHNlZ21lbnRzIGluIHRoZSBzZXJpZXMKCgkJCS8vIHVzZSB0aGlzIHNlZ21lbnQncyBjb29yZGluYXRlcyB0byBjb21wdXRlZCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGxlc3MtcHJlc3N1cml6ZWQKCQkJLy8gZm9yd2FyZCBzZWdtZW50cwoJCQlmb3IgKGk9MDsgaTxmb3J3YXJkU2Vncy5sZW5ndGg7IGkrKykgewoJCQkJdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhmb3J3YXJkU2Vnc1tpXSwgMCwgc2VnLmZvcndhcmRDb29yZCk7CgkJCX0KCQl9Cgl9LAoKCglzb3J0Rm9yd2FyZFNlZ3M6IGZ1bmN0aW9uKGZvcndhcmRTZWdzKSB7CgkJZm9yd2FyZFNlZ3Muc29ydChwcm94eSh0aGlzLCAnY29tcGFyZUZvcndhcmRTZWdzJykpOwoJfSwKCgoJLy8gQSBjbXAgZnVuY3Rpb24gZm9yIGRldGVybWluaW5nIHdoaWNoIGZvcndhcmQgc2VnbWVudCB0byByZWx5IG9uIG1vcmUgd2hlbiBjb21wdXRpbmcgY29vcmRpbmF0ZXMuCgljb21wYXJlRm9yd2FyZFNlZ3M6IGZ1bmN0aW9uKHNlZzEsIHNlZzIpIHsKCQkvLyBwdXQgaGlnaGVyLXByZXNzdXJlIGZpcnN0CgkJcmV0dXJuIHNlZzIuZm9yd2FyZFByZXNzdXJlIC0gc2VnMS5mb3J3YXJkUHJlc3N1cmUgfHwKCQkJLy8gcHV0IHNlZ21lbnRzIHRoYXQgYXJlIGNsb3NlciB0byBpbml0aWFsIGVkZ2UgZmlyc3QgKGFuZCBmYXZvciBvbmVzIHdpdGggbm8gY29vcmRzIHlldCkKCQkJKHNlZzEuYmFja3dhcmRDb29yZCB8fCAwKSAtIChzZWcyLmJhY2t3YXJkQ29vcmQgfHwgMCkgfHwKCQkJLy8gZG8gbm9ybWFsIHNvcnRpbmcuLi4KCQkJdGhpcy5jb21wYXJlRXZlbnRTZWdzKHNlZzEsIHNlZzIpOwoJfSwKCgoJLy8gR2l2ZW4gZm9yZWdyb3VuZCBldmVudCBzZWdtZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBoYWQgdGhlaXIgcG9zaXRpb24gY29vcmRpbmF0ZXMgY29tcHV0ZWQsCgkvLyBhc3NpZ25zIHBvc2l0aW9uLXJlbGF0ZWQgQ1NTIHZhbHVlcyB0byB0aGVpciBlbGVtZW50cy4KCWFzc2lnbkZnU2VnSG9yaXpvbnRhbHM6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgaSwgc2VnOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlzZWcgPSBzZWdzW2ldOwoJCQlzZWcuZWwuY3NzKHRoaXMuZ2VuZXJhdGVGZ1NlZ0hvcml6b250YWxDc3Moc2VnKSk7CgoJCQkvLyBpZiB0aGUgaGVpZ2h0IGlzIHNob3J0LCBhZGQgYSBjbGFzc05hbWUgZm9yIGFsdGVybmF0ZSBzdHlsaW5nCgkJCWlmIChzZWcuYm90dG9tIC0gc2VnLnRvcCA8IDMwKSB7CgkJCQlzZWcuZWwuYWRkQ2xhc3MoJ2ZjLXNob3J0Jyk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgYW4gb2JqZWN0IHdpdGggQ1NTIHByb3BlcnRpZXMvdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gYW4gZXZlbnQgc2VnbWVudCBlbGVtZW50LgoJLy8gQ29udGFpbnMgaW1wb3J0YW50IHBvc2l0aW9uaW5nLXJlbGF0ZWQgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIGFueSBldmVudCBlbGVtZW50LCBjdXN0b21pemVkIG9yIG5vdC4KCWdlbmVyYXRlRmdTZWdIb3Jpem9udGFsQ3NzOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgc2hvdWxkT3ZlcmxhcCA9IHRoaXMudmlldy5vcHQoJ3Nsb3RFdmVudE92ZXJsYXAnKTsKCQl2YXIgYmFja3dhcmRDb29yZCA9IHNlZy5iYWNrd2FyZENvb3JkOyAvLyB0aGUgbGVmdCBzaWRlIGlmIExUUi4gdGhlIHJpZ2h0IHNpZGUgaWYgUlRMLiBmbG9hdGluZy1wb2ludAoJCXZhciBmb3J3YXJkQ29vcmQgPSBzZWcuZm9yd2FyZENvb3JkOyAvLyB0aGUgcmlnaHQgc2lkZSBpZiBMVFIuIHRoZSBsZWZ0IHNpZGUgaWYgUlRMLiBmbG9hdGluZy1wb2ludAoJCXZhciBwcm9wcyA9IHRoaXMuZ2VuZXJhdGVTZWdWZXJ0aWNhbENzcyhzZWcpOyAvLyBnZXQgdG9wL2JvdHRvbSBmaXJzdAoJCXZhciBsZWZ0OyAvLyBhbW91bnQgb2Ygc3BhY2UgZnJvbSBsZWZ0IGVkZ2UsIGEgZnJhY3Rpb24gb2YgdGhlIHRvdGFsIHdpZHRoCgkJdmFyIHJpZ2h0OyAvLyBhbW91bnQgb2Ygc3BhY2UgZnJvbSByaWdodCBlZGdlLCBhIGZyYWN0aW9uIG9mIHRoZSB0b3RhbCB3aWR0aAoKCQlpZiAoc2hvdWxkT3ZlcmxhcCkgewoJCQkvLyBkb3VibGUgdGhlIHdpZHRoLCBidXQgZG9uJ3QgZ28gYmV5b25kIHRoZSBtYXhpbXVtIGZvcndhcmQgY29vcmRpbmF0ZSAoMS4wKQoJCQlmb3J3YXJkQ29vcmQgPSBNYXRoLm1pbigxLCBiYWNrd2FyZENvb3JkICsgKGZvcndhcmRDb29yZCAtIGJhY2t3YXJkQ29vcmQpICogMik7CgkJfQoKCQlpZiAodGhpcy5pc1JUTCkgewoJCQlsZWZ0ID0gMSAtIGZvcndhcmRDb29yZDsKCQkJcmlnaHQgPSBiYWNrd2FyZENvb3JkOwoJCX0KCQllbHNlIHsKCQkJbGVmdCA9IGJhY2t3YXJkQ29vcmQ7CgkJCXJpZ2h0ID0gMSAtIGZvcndhcmRDb29yZDsKCQl9CgoJCXByb3BzLnpJbmRleCA9IHNlZy5sZXZlbCArIDE7IC8vIGNvbnZlcnQgZnJvbSAwLWJhc2UgdG8gMS1iYXNlZAoJCXByb3BzLmxlZnQgPSBsZWZ0ICogMTAwICsgJyUnOwoJCXByb3BzLnJpZ2h0ID0gcmlnaHQgKiAxMDAgKyAnJSc7CgoJCWlmIChzaG91bGRPdmVybGFwICYmIHNlZy5mb3J3YXJkUHJlc3N1cmUpIHsKCQkJLy8gYWRkIHBhZGRpbmcgdG8gdGhlIGVkZ2Ugc28gdGhhdCBmb3J3YXJkIHN0YWNrZWQgZXZlbnRzIGRvbid0IGNvdmVyIHRoZSByZXNpemVyJ3MgaWNvbgoJCQlwcm9wc1t0aGlzLmlzUlRMID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0J10gPSAxMCAqIDI7IC8vIDEwIGlzIGEgZ3Vlc3N0aW1hdGUgb2YgdGhlIGljb24ncyB3aWR0aAoJCX0KCgkJcmV0dXJuIHByb3BzOwoJfQoKfSk7CgoKLy8gQnVpbGRzIGFuIGFycmF5IG9mIHNlZ21lbnRzICJsZXZlbHMiLiBUaGUgZmlyc3QgbGV2ZWwgd2lsbCBiZSB0aGUgbGVmdG1vc3QgdGllciBvZiBzZWdtZW50cyBpZiB0aGUgY2FsZW5kYXIgaXMKLy8gbGVmdC10by1yaWdodCwgb3IgdGhlIHJpZ2h0bW9zdCBpZiB0aGUgY2FsZW5kYXIgaXMgcmlnaHQtdG8tbGVmdC4gQXNzdW1lcyB0aGUgc2VnbWVudHMgYXJlIGFscmVhZHkgb3JkZXJlZCBieSBkYXRlLgpmdW5jdGlvbiBidWlsZFNsb3RTZWdMZXZlbHMoc2VncykgewoJdmFyIGxldmVscyA9IFtdOwoJdmFyIGksIHNlZzsKCXZhciBqOwoKCWZvciAoaT0wOyBpPHNlZ3MubGVuZ3RoOyBpKyspIHsKCQlzZWcgPSBzZWdzW2ldOwoKCQkvLyBnbyB0aHJvdWdoIGFsbCB0aGUgbGV2ZWxzIGFuZCBzdG9wIG9uIHRoZSBmaXJzdCBsZXZlbCB3aGVyZSB0aGVyZSBhcmUgbm8gY29sbGlzaW9ucwoJCWZvciAoaj0wOyBqPGxldmVscy5sZW5ndGg7IGorKykgewoJCQlpZiAoIWNvbXB1dGVTbG90U2VnQ29sbGlzaW9ucyhzZWcsIGxldmVsc1tqXSkubGVuZ3RoKSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJc2VnLmxldmVsID0gajsKCgkJKGxldmVsc1tqXSB8fCAobGV2ZWxzW2pdID0gW10pKS5wdXNoKHNlZyk7Cgl9CgoJcmV0dXJuIGxldmVsczsKfQoKCi8vIEZvciBldmVyeSBzZWdtZW50LCBmaWd1cmUgb3V0IHRoZSBvdGhlciBzZWdtZW50cyB0aGF0IGFyZSBpbiBzdWJzZXF1ZW50Ci8vIGxldmVscyB0aGF0IGFsc28gb2NjdXB5IHRoZSBzYW1lIHZlcnRpY2FsIHNwYWNlLiBBY2N1bXVsYXRlIGluIHNlZy5mb3J3YXJkU2VncwpmdW5jdGlvbiBjb21wdXRlRm9yd2FyZFNsb3RTZWdzKGxldmVscykgewoJdmFyIGksIGxldmVsOwoJdmFyIGosIHNlZzsKCXZhciBrOwoKCWZvciAoaT0wOyBpPGxldmVscy5sZW5ndGg7IGkrKykgewoJCWxldmVsID0gbGV2ZWxzW2ldOwoKCQlmb3IgKGo9MDsgajxsZXZlbC5sZW5ndGg7IGorKykgewoJCQlzZWcgPSBsZXZlbFtqXTsKCgkJCXNlZy5mb3J3YXJkU2VncyA9IFtdOwoJCQlmb3IgKGs9aSsxOyBrPGxldmVscy5sZW5ndGg7IGsrKykgewoJCQkJY29tcHV0ZVNsb3RTZWdDb2xsaXNpb25zKHNlZywgbGV2ZWxzW2tdLCBzZWcuZm9yd2FyZFNlZ3MpOwoJCQl9CgkJfQoJfQp9CgoKLy8gRmlndXJlIG91dCB3aGljaCBwYXRoIGZvcndhcmQgKHZpYSBzZWcuZm9yd2FyZFNlZ3MpIHJlc3VsdHMgaW4gdGhlIGxvbmdlc3QgcGF0aCB1bnRpbAovLyB0aGUgZnVydGhlc3QgZWRnZSBpcyByZWFjaGVkLiBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoaXMgcGF0aCB3aWxsIGJlIHNlZy5mb3J3YXJkUHJlc3N1cmUKZnVuY3Rpb24gY29tcHV0ZVNsb3RTZWdQcmVzc3VyZXMoc2VnKSB7Cgl2YXIgZm9yd2FyZFNlZ3MgPSBzZWcuZm9yd2FyZFNlZ3M7Cgl2YXIgZm9yd2FyZFByZXNzdXJlID0gMDsKCXZhciBpLCBmb3J3YXJkU2VnOwoKCWlmIChzZWcuZm9yd2FyZFByZXNzdXJlID09PSB1bmRlZmluZWQpIHsgLy8gbm90IGFscmVhZHkgY29tcHV0ZWQKCgkJZm9yIChpPTA7IGk8Zm9yd2FyZFNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJZm9yd2FyZFNlZyA9IGZvcndhcmRTZWdzW2ldOwoKCQkJLy8gZmlndXJlIG91dCB0aGUgY2hpbGQncyBtYXhpbXVtIGZvcndhcmQgcGF0aAoJCQljb21wdXRlU2xvdFNlZ1ByZXNzdXJlcyhmb3J3YXJkU2VnKTsKCgkJCS8vIGVpdGhlciB1c2UgdGhlIGV4aXN0aW5nIG1heGltdW0sIG9yIHVzZSB0aGUgY2hpbGQncyBmb3J3YXJkIHByZXNzdXJlCgkJCS8vIHBsdXMgb25lIChmb3IgdGhlIGZvcndhcmRTZWcgaXRzZWxmKQoJCQlmb3J3YXJkUHJlc3N1cmUgPSBNYXRoLm1heCgKCQkJCWZvcndhcmRQcmVzc3VyZSwKCQkJCTEgKyBmb3J3YXJkU2VnLmZvcndhcmRQcmVzc3VyZQoJCQkpOwoJCX0KCgkJc2VnLmZvcndhcmRQcmVzc3VyZSA9IGZvcndhcmRQcmVzc3VyZTsKCX0KfQoKCi8vIEZpbmQgYWxsIHRoZSBzZWdtZW50cyBpbiBgb3RoZXJTZWdzYCB0aGF0IHZlcnRpY2FsbHkgY29sbGlkZSB3aXRoIGBzZWdgLgovLyBBcHBlbmQgaW50byBhbiBvcHRpb25hbGx5LXN1cHBsaWVkIGByZXN1bHRzYCBhcnJheSBhbmQgcmV0dXJuLgpmdW5jdGlvbiBjb21wdXRlU2xvdFNlZ0NvbGxpc2lvbnMoc2VnLCBvdGhlclNlZ3MsIHJlc3VsdHMpIHsKCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwoKCWZvciAodmFyIGk9MDsgaTxvdGhlclNlZ3MubGVuZ3RoOyBpKyspIHsKCQlpZiAoaXNTbG90U2VnQ29sbGlzaW9uKHNlZywgb3RoZXJTZWdzW2ldKSkgewoJCQlyZXN1bHRzLnB1c2gob3RoZXJTZWdzW2ldKTsKCQl9Cgl9CgoJcmV0dXJuIHJlc3VsdHM7Cn0KCgovLyBEbyB0aGVzZSBzZWdtZW50cyBvY2N1cHkgdGhlIHNhbWUgdmVydGljYWwgc3BhY2U/CmZ1bmN0aW9uIGlzU2xvdFNlZ0NvbGxpc2lvbihzZWcxLCBzZWcyKSB7CglyZXR1cm4gc2VnMS5ib3R0b20gPiBzZWcyLnRvcCAmJiBzZWcxLnRvcCA8IHNlZzIuYm90dG9tOwp9Cgo7OwoKLyogQW4gYWJzdHJhY3QgY2xhc3MgZnJvbSB3aGljaCBvdGhlciB2aWV3cyBpbmhlcml0IGZyb20KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgVmlldyA9IEZDLlZpZXcgPSBDbGFzcy5leHRlbmQoRW1pdHRlck1peGluLCBMaXN0ZW5lck1peGluLCB7CgoJdHlwZTogbnVsbCwgLy8gc3ViY2xhc3MnIHZpZXcgbmFtZSAoc3RyaW5nKQoJbmFtZTogbnVsbCwgLy8gZGVwcmVjYXRlZC4gdXNlIGB0eXBlYCBpbnN0ZWFkCgl0aXRsZTogbnVsbCwgLy8gdGhlIHRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyJ3MgdGl0bGUKCgljYWxlbmRhcjogbnVsbCwgLy8gb3duZXIgQ2FsZW5kYXIgb2JqZWN0CglvcHRpb25zOiBudWxsLCAvLyBoYXNoIGNvbnRhaW5pbmcgYWxsIG9wdGlvbnMuIGFscmVhZHkgbWVyZ2VkIHdpdGggdmlldy1zcGVjaWZpYy1vcHRpb25zCgllbDogbnVsbCwgLy8gdGhlIHZpZXcncyBjb250YWluaW5nIGVsZW1lbnQuIHNldCBieSBDYWxlbmRhcgoKCWRpc3BsYXlpbmc6IG51bGwsIC8vIGEgcHJvbWlzZSByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHJlbmRlcmluZy4gbnVsbCBpZiBubyByZW5kZXIgcmVxdWVzdGVkCglpc1NrZWxldG9uUmVuZGVyZWQ6IGZhbHNlLAoJaXNFdmVudHNSZW5kZXJlZDogZmFsc2UsCgoJLy8gcmFuZ2UgdGhlIHZpZXcgaXMgYWN0dWFsbHkgZGlzcGxheWluZyAobW9tZW50cykKCXN0YXJ0OiBudWxsLAoJZW5kOiBudWxsLCAvLyBleGNsdXNpdmUKCgkvLyByYW5nZSB0aGUgdmlldyBpcyBmb3JtYWxseSByZXNwb25zaWJsZSBmb3IgKG1vbWVudHMpCgkvLyBtYXkgYmUgZGlmZmVyZW50IGZyb20gc3RhcnQvZW5kLiBmb3IgZXhhbXBsZSwgYSBtb250aCB2aWV3IG1pZ2h0IGhhdmUgMXN0LTMxc3QsIGV4Y2x1ZGluZyBwYWRkZWQgZGF0ZXMKCWludGVydmFsU3RhcnQ6IG51bGwsCglpbnRlcnZhbEVuZDogbnVsbCwgLy8gZXhjbHVzaXZlCglpbnRlcnZhbER1cmF0aW9uOiBudWxsLAoJaW50ZXJ2YWxVbml0OiBudWxsLCAvLyBuYW1lIG9mIGxhcmdlc3QgdW5pdCBiZWluZyBkaXNwbGF5ZWQsIGxpa2UgIm1vbnRoIiBvciAid2VlayIKCglpc1JUTDogZmFsc2UsCglpc1NlbGVjdGVkOiBmYWxzZSwgLy8gYm9vbGVhbiB3aGV0aGVyIGEgcmFuZ2Ugb2YgdGltZSBpcyB1c2VyLXNlbGVjdGVkIG9yIG5vdAoJc2VsZWN0ZWRFdmVudDogbnVsbCwKCglldmVudE9yZGVyU3BlY3M6IG51bGwsIC8vIGNyaXRlcmlhIGZvciBvcmRlcmluZyBldmVudHMgd2hlbiB0aGV5IGhhdmUgc2FtZSBkYXRlL3RpbWUKCgkvLyBjbGFzc05hbWVzIHN0eWxlZCBieSBqcXVpIHRoZW1lcwoJd2lkZ2V0SGVhZGVyQ2xhc3M6IG51bGwsCgl3aWRnZXRDb250ZW50Q2xhc3M6IG51bGwsCgloaWdobGlnaHRTdGF0ZUNsYXNzOiBudWxsLAoKCS8vIGZvciBkYXRlIHV0aWxzLCBjb21wdXRlZCBmcm9tIG9wdGlvbnMKCW5leHREYXlUaHJlc2hvbGQ6IG51bGwsCglpc0hpZGRlbkRheUhhc2g6IG51bGwsCgoJLy8gbm93IGluZGljYXRvcgoJaXNOb3dJbmRpY2F0b3JSZW5kZXJlZDogbnVsbCwKCWluaXRpYWxOb3dEYXRlOiBudWxsLCAvLyByZXN1bHQgZmlyc3QgZ2V0Tm93IGNhbGwKCWluaXRpYWxOb3dRdWVyaWVkTXM6IG51bGwsIC8vIG1zIHRpbWUgdGhlIGdldE5vdyB3YXMgY2FsbGVkCglub3dJbmRpY2F0b3JUaW1lb3V0SUQ6IG51bGwsIC8vIGZvciByZWZyZXNoIHRpbWluZyBvZiBub3cgaW5kaWNhdG9yCglub3dJbmRpY2F0b3JJbnRlcnZhbElEOiBudWxsLCAvLyAiCgoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihjYWxlbmRhciwgdHlwZSwgb3B0aW9ucywgaW50ZXJ2YWxEdXJhdGlvbikgewoKCQl0aGlzLmNhbGVuZGFyID0gY2FsZW5kYXI7CgkJdGhpcy50eXBlID0gdGhpcy5uYW1lID0gdHlwZTsgLy8gLm5hbWUgaXMgZGVwcmVjYXRlZAoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5pbnRlcnZhbER1cmF0aW9uID0gaW50ZXJ2YWxEdXJhdGlvbiB8fCBtb21lbnQuZHVyYXRpb24oMSwgJ2RheScpOwoKCQl0aGlzLm5leHREYXlUaHJlc2hvbGQgPSBtb21lbnQuZHVyYXRpb24odGhpcy5vcHQoJ25leHREYXlUaHJlc2hvbGQnKSk7CgkJdGhpcy5pbml0VGhlbWluZ1Byb3BzKCk7CgkJdGhpcy5pbml0SGlkZGVuRGF5cygpOwoJCXRoaXMuaXNSVEwgPSB0aGlzLm9wdCgnaXNSVEwnKTsKCgkJdGhpcy5ldmVudE9yZGVyU3BlY3MgPSBwYXJzZUZpZWxkU3BlY3ModGhpcy5vcHQoJ2V2ZW50T3JkZXInKSk7CgoJCXRoaXMuaW5pdGlhbGl6ZSgpOwoJfSwKCgoJLy8gQSBnb29kIHBsYWNlIGZvciBzdWJjbGFzc2VzIHRvIGluaXRpYWxpemUgbWVtYmVyIHZhcmlhYmxlcwoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBjYW4gaW1wbGVtZW50Cgl9LAoKCgkvLyBSZXRyaWV2ZXMgYW4gb3B0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUKCW9wdDogZnVuY3Rpb24obmFtZSkgewoJCXJldHVybiB0aGlzLm9wdGlvbnNbbmFtZV07Cgl9LAoKCgkvLyBUcmlnZ2VycyBoYW5kbGVycyB0aGF0IGFyZSB2aWV3LXJlbGF0ZWQuIE1vZGlmaWVzIGFyZ3MgYmVmb3JlIHBhc3NpbmcgdG8gY2FsZW5kYXIuCgl0cmlnZ2VyOiBmdW5jdGlvbihuYW1lLCB0aGlzT2JqKSB7IC8vIGFyZ3VtZW50cyBiZXlvbmQgdGhpc09iaiBhcmUgcGFzc2VkIGFsb25nCgkJdmFyIGNhbGVuZGFyID0gdGhpcy5jYWxlbmRhcjsKCgkJcmV0dXJuIGNhbGVuZGFyLnRyaWdnZXIuYXBwbHkoCgkJCWNhbGVuZGFyLAoJCQlbbmFtZSwgdGhpc09iaiB8fCB0aGlzXS5jb25jYXQoCgkJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLCAvLyBhcmd1bWVudHMgYmV5b25kIHRoaXNPYmoKCQkJCVsgdGhpcyBdIC8vIGFsd2F5cyBtYWtlIHRoZSBsYXN0IGFyZ3VtZW50IGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3LiBUT0RPOiBkZXByZWNhdGUKCQkJKQoJCSk7Cgl9LAoKCgkvKiBEYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gVXBkYXRlcyBhbGwgaW50ZXJuYWwgZGF0ZXMgdG8gY2VudGVyIGFyb3VuZCB0aGUgZ2l2ZW4gY3VycmVudCB1bnpvbmVkIGRhdGUuCglzZXREYXRlOiBmdW5jdGlvbihkYXRlKSB7CgkJdGhpcy5zZXRSYW5nZSh0aGlzLmNvbXB1dGVSYW5nZShkYXRlKSk7Cgl9LAoKCgkvLyBVcGRhdGVzIGFsbCBpbnRlcm5hbCBkYXRlcyBmb3IgZGlzcGxheWluZyB0aGUgZ2l2ZW4gdW56b25lZCByYW5nZS4KCXNldFJhbmdlOiBmdW5jdGlvbihyYW5nZSkgewoJCSQuZXh0ZW5kKHRoaXMsIHJhbmdlKTsgLy8gYXNzaWducyBldmVyeSBwcm9wZXJ0eSB0byB0aGlzIG9iamVjdCdzIG1lbWJlciB2YXJpYWJsZXMKCQl0aGlzLnVwZGF0ZVRpdGxlKCk7Cgl9LAoKCgkvLyBHaXZlbiBhIHNpbmdsZSBjdXJyZW50IHVuem9uZWQgZGF0ZSwgcHJvZHVjZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHJhbmdlIHRvIGRpc3BsYXkuCgkvLyBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZS4gTXVzdCByZXR1cm4gYWxsIHByb3BlcnRpZXMuCgljb21wdXRlUmFuZ2U6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgaW50ZXJ2YWxVbml0ID0gY29tcHV0ZUludGVydmFsVW5pdCh0aGlzLmludGVydmFsRHVyYXRpb24pOwoJCXZhciBpbnRlcnZhbFN0YXJ0ID0gZGF0ZS5jbG9uZSgpLnN0YXJ0T2YoaW50ZXJ2YWxVbml0KTsKCQl2YXIgaW50ZXJ2YWxFbmQgPSBpbnRlcnZhbFN0YXJ0LmNsb25lKCkuYWRkKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbik7CgkJdmFyIHN0YXJ0LCBlbmQ7CgoJCS8vIG5vcm1hbGl6ZSB0aGUgcmFuZ2UncyB0aW1lLWFtYmlndWl0eQoJCWlmICgveWVhcnxtb250aHx3ZWVrfGRheS8udGVzdChpbnRlcnZhbFVuaXQpKSB7IC8vIHdob2xlLWRheXM/CgkJCWludGVydmFsU3RhcnQuc3RyaXBUaW1lKCk7CgkJCWludGVydmFsRW5kLnN0cmlwVGltZSgpOwoJCX0KCQllbHNlIHsgLy8gbmVlZHMgdG8gaGF2ZSBhIHRpbWU/CgkJCWlmICghaW50ZXJ2YWxTdGFydC5oYXNUaW1lKCkpIHsKCQkJCWludGVydmFsU3RhcnQgPSB0aGlzLmNhbGVuZGFyLnRpbWUoMCk7IC8vIGdpdmUgMDA6MDAgdGltZQoJCQl9CgkJCWlmICghaW50ZXJ2YWxFbmQuaGFzVGltZSgpKSB7CgkJCQlpbnRlcnZhbEVuZCA9IHRoaXMuY2FsZW5kYXIudGltZSgwKTsgLy8gZ2l2ZSAwMDowMCB0aW1lCgkJCX0KCQl9CgoJCXN0YXJ0ID0gaW50ZXJ2YWxTdGFydC5jbG9uZSgpOwoJCXN0YXJ0ID0gdGhpcy5za2lwSGlkZGVuRGF5cyhzdGFydCk7CgkJZW5kID0gaW50ZXJ2YWxFbmQuY2xvbmUoKTsKCQllbmQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKGVuZCwgLTEsIHRydWUpOyAvLyBleGNsdXNpdmVseSBtb3ZlIGJhY2t3YXJkcwoKCQlyZXR1cm4gewoJCQlpbnRlcnZhbFVuaXQ6IGludGVydmFsVW5pdCwKCQkJaW50ZXJ2YWxTdGFydDogaW50ZXJ2YWxTdGFydCwKCQkJaW50ZXJ2YWxFbmQ6IGludGVydmFsRW5kLAoJCQlzdGFydDogc3RhcnQsCgkJCWVuZDogZW5kCgkJfTsKCX0sCgoKCS8vIENvbXB1dGVzIHRoZSBuZXcgZGF0ZSB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlIHByZXYgYnV0dG9uLCBnaXZlbiB0aGUgY3VycmVudCBkYXRlCgljb21wdXRlUHJldkRhdGU6IGZ1bmN0aW9uKGRhdGUpIHsKCQlyZXR1cm4gdGhpcy5tYXNzYWdlQ3VycmVudERhdGUoCgkJCWRhdGUuY2xvbmUoKS5zdGFydE9mKHRoaXMuaW50ZXJ2YWxVbml0KS5zdWJ0cmFjdCh0aGlzLmludGVydmFsRHVyYXRpb24pLCAtMQoJCSk7Cgl9LAoKCgkvLyBDb21wdXRlcyB0aGUgbmV3IGRhdGUgd2hlbiB0aGUgdXNlciBoaXRzIHRoZSBuZXh0IGJ1dHRvbiwgZ2l2ZW4gdGhlIGN1cnJlbnQgZGF0ZQoJY29tcHV0ZU5leHREYXRlOiBmdW5jdGlvbihkYXRlKSB7CgkJcmV0dXJuIHRoaXMubWFzc2FnZUN1cnJlbnREYXRlKAoJCQlkYXRlLmNsb25lKCkuc3RhcnRPZih0aGlzLmludGVydmFsVW5pdCkuYWRkKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbikKCQkpOwoJfSwKCgoJLy8gR2l2ZW4gYW4gYXJiaXRyYXJpbHkgY2FsY3VsYXRlZCBjdXJyZW50IGRhdGUgb2YgdGhlIGNhbGVuZGFyLCByZXR1cm5zIGEgZGF0ZSB0aGF0IGlzIGVuc3VyZWQgdG8gYmUgY29tcGxldGVseQoJLy8gdmlzaWJsZS4gYGRpcmVjdGlvbmAgaXMgb3B0aW9uYWwgYW5kIGluZGljYXRlcyB3aGljaCBkaXJlY3Rpb24gdGhlIGN1cnJlbnQgZGF0ZSB3YXMgYmVpbmcKCS8vIGluY3JlbWVudGVkIG9yIGRlY3JlbWVudGVkICgxIG9yIC0xKS4KCW1hc3NhZ2VDdXJyZW50RGF0ZTogZnVuY3Rpb24oZGF0ZSwgZGlyZWN0aW9uKSB7CgkJaWYgKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbi5hcygnZGF5cycpIDw9IDEpIHsgLy8gaWYgdGhlIHZpZXcgZGlzcGxheXMgYSBzaW5nbGUgZGF5IG9yIHNtYWxsZXIKCQkJaWYgKHRoaXMuaXNIaWRkZW5EYXkoZGF0ZSkpIHsKCQkJCWRhdGUgPSB0aGlzLnNraXBIaWRkZW5EYXlzKGRhdGUsIGRpcmVjdGlvbik7CgkJCQlkYXRlLnN0YXJ0T2YoJ2RheScpOwoJCQl9CgkJfQoKCQlyZXR1cm4gZGF0ZTsKCX0sCgoKCS8qIFRpdGxlIGFuZCBEYXRlIEZvcm1hdHRpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFNldHMgdGhlIHZpZXcncyB0aXRsZSBwcm9wZXJ0eSB0byB0aGUgbW9zdCB1cGRhdGVkIGNvbXB1dGVkIHZhbHVlCgl1cGRhdGVUaXRsZTogZnVuY3Rpb24oKSB7CgkJdGhpcy50aXRsZSA9IHRoaXMuY29tcHV0ZVRpdGxlKCk7Cgl9LAoKCgkvLyBDb21wdXRlcyB3aGF0IHRoZSB0aXRsZSBhdCB0aGUgdG9wIG9mIHRoZSBjYWxlbmRhciBzaG91bGQgYmUgZm9yIHRoaXMgdmlldwoJY29tcHV0ZVRpdGxlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5mb3JtYXRSYW5nZSgKCQkJewoJCQkJLy8gaW4gY2FzZSBpbnRlcnZhbFN0YXJ0L0VuZCBoYXMgYSB0aW1lLCBtYWtlIHN1cmUgdGltZXpvbmUgaXMgY29ycmVjdAoJCQkJc3RhcnQ6IHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0aGlzLmludGVydmFsU3RhcnQpLAoJCQkJZW5kOiB0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUodGhpcy5pbnRlcnZhbEVuZCkKCQkJfSwKCQkJdGhpcy5vcHQoJ3RpdGxlRm9ybWF0JykgfHwgdGhpcy5jb21wdXRlVGl0bGVGb3JtYXQoKSwKCQkJdGhpcy5vcHQoJ3RpdGxlUmFuZ2VTZXBhcmF0b3InKQoJCSk7Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgdGhlIGZvcm1hdCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGl0bGUgZm9yIHRoZSBjdXJyZW50IGRhdGUgcmFuZ2UuCgkvLyBBdHRlbXB0cyB0byBjb21wdXRlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGZvcm1hdCBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgd2l0aCBgdGl0bGVGb3JtYXRgLgoJY29tcHV0ZVRpdGxlRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5pbnRlcnZhbFVuaXQgPT0gJ3llYXInKSB7CgkJCXJldHVybiAnWVlZWSc7CgkJfQoJCWVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxVbml0ID09ICdtb250aCcpIHsKCQkJcmV0dXJuIHRoaXMub3B0KCdtb250aFllYXJGb3JtYXQnKTsgLy8gbGlrZSAiU2VwdGVtYmVyIDIwMTQiCgkJfQoJCWVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbi5hcygnZGF5cycpID4gMSkgewoJCQlyZXR1cm4gJ2xsJzsgLy8gbXVsdGktZGF5IHJhbmdlLiBzaG9ydGVyLCBsaWtlICJTZXAgOSAtIDEwIDIwMTQiCgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gJ0xMJzsgLy8gb25lIGRheS4gbG9uZ2VyLCBsaWtlICJTZXB0ZW1iZXIgOSAyMDE0IgoJCX0KCX0sCgoKCS8vIFV0aWxpdHkgZm9yIGZvcm1hdHRpbmcgYSByYW5nZS4gQWNjZXB0cyBhIHJhbmdlIG9iamVjdCwgZm9ybWF0dGluZyBzdHJpbmcsIGFuZCBvcHRpb25hbCBzZXBhcmF0b3IuCgkvLyBEaXNwbGF5cyBhbGwtZGF5IHJhbmdlcyBuYXR1cmFsbHksIHdpdGggYW4gaW5jbHVzaXZlIGVuZC4gVGFrZXMgdGhlIGN1cnJlbnQgaXNSVEwgaW50byBhY2NvdW50LgoJLy8gVGhlIHRpbWV6b25lcyBvZiB0aGUgZGF0ZXMgd2l0aGluIGByYW5nZWAgd2lsbCBiZSByZXNwZWN0ZWQuCglmb3JtYXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UsIGZvcm1hdFN0ciwgc2VwYXJhdG9yKSB7CgkJdmFyIGVuZCA9IHJhbmdlLmVuZDsKCgkJaWYgKCFlbmQuaGFzVGltZSgpKSB7IC8vIGFsbC1kYXk/CgkJCWVuZCA9IGVuZC5jbG9uZSgpLnN1YnRyYWN0KDEpOyAvLyBjb252ZXJ0IHRvIGluY2x1c2l2ZS4gbGFzdCBtcyBvZiBwcmV2aW91cyBkYXkKCQl9CgoJCXJldHVybiBmb3JtYXRSYW5nZShyYW5nZS5zdGFydCwgZW5kLCBmb3JtYXRTdHIsIHNlcGFyYXRvciwgdGhpcy5vcHQoJ2lzUlRMJykpOwoJfSwKCgoJZ2V0QWxsRGF5SHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMub3B0KCdhbGxEYXlIdG1sJykgfHwgaHRtbEVzY2FwZSh0aGlzLm9wdCgnYWxsRGF5VGV4dCcpKTsKCX0sCgoKCS8qIE5hdmlnYXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyBIVE1MIGZvciBhbiBhbmNob3IgdG8gYW5vdGhlciB2aWV3IGludG8gdGhlIGNhbGVuZGFyLgoJLy8gV2lsbCBlaXRoZXIgZ2VuZXJhdGUgYW4gPGE+IHRhZyBvciBhIG5vbi1jbGlja2FibGUgPHNwYW4+IHRhZywgZGVwZW5kaW5nIG9uIGVuYWJsZWQgc2V0dGluZ3MuCgkvLyBgZ290b09wdGlvbnNgIGNhbiBlaXRoZXIgYmUgYSBtb21lbnQgaW5wdXQsIG9yIGFuIG9iamVjdCB3aXRoIHRoZSBmb3JtOgoJLy8geyBkYXRlLCB0eXBlLCBmb3JjZU9mZiB9CgkvLyBgdHlwZWAgaXMgYSB2aWV3LXR5cGUgbGlrZSAiZGF5IiBvciAid2VlayIuIGRlZmF1bHQgdmFsdWUgaXMgImRheSIuCgkvLyBgYXR0cnNgIGFuZCBgaW5uZXJIdG1sYCBhcmUgdXNlIHRvIGdlbmVyYXRlIHRoZSByZXN0IG9mIHRoZSBIVE1MIHRhZy4KCWJ1aWxkR290b0FuY2hvckh0bWw6IGZ1bmN0aW9uKGdvdG9PcHRpb25zLCBhdHRycywgaW5uZXJIdG1sKSB7CgkJdmFyIGRhdGUsIHR5cGUsIGZvcmNlT2ZmOwoJCXZhciBmaW5hbE9wdGlvbnM7CgoJCWlmICgkLmlzUGxhaW5PYmplY3QoZ290b09wdGlvbnMpKSB7CgkJCWRhdGUgPSBnb3RvT3B0aW9ucy5kYXRlOwoJCQl0eXBlID0gZ290b09wdGlvbnMudHlwZTsKCQkJZm9yY2VPZmYgPSBnb3RvT3B0aW9ucy5mb3JjZU9mZjsKCQl9CgkJZWxzZSB7CgkJCWRhdGUgPSBnb3RvT3B0aW9uczsgLy8gYSBzaW5nbGUgbW9tZW50IGlucHV0CgkJfQoJCWRhdGUgPSBGQy5tb21lbnQoZGF0ZSk7IC8vIGlmIGEgc3RyaW5nLCBwYXJzZSBpdAoKCQlmaW5hbE9wdGlvbnMgPSB7IC8vIGZvciBzZXJpYWxpemF0aW9uIGludG8gdGhlIGxpbmsKCQkJZGF0ZTogZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSwKCQkJdHlwZTogdHlwZSB8fCAnZGF5JwoJCX07CgoJCWlmICh0eXBlb2YgYXR0cnMgPT09ICdzdHJpbmcnKSB7CgkJCWlubmVySHRtbCA9IGF0dHJzOwoJCQlhdHRycyA9IG51bGw7CgkJfQoKCQlhdHRycyA9IGF0dHJzID8gJyAnICsgYXR0cnNUb1N0cihhdHRycykgOiAnJzsgLy8gd2lsbCBoYXZlIGEgbGVhZGluZyBzcGFjZQoJCWlubmVySHRtbCA9IGlubmVySHRtbCB8fCAnJzsKCgkJaWYgKCFmb3JjZU9mZiAmJiB0aGlzLm9wdCgnbmF2TGlua3MnKSkgewoJCQlyZXR1cm4gJzxhJyArIGF0dHJzICsKCQkJCScgZGF0YS1nb3RvPSInICsgaHRtbEVzY2FwZShKU09OLnN0cmluZ2lmeShmaW5hbE9wdGlvbnMpKSArICciPicgKwoJCQkJaW5uZXJIdG1sICsKCQkJCSc8L2E+JzsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiAnPHNwYW4nICsgYXR0cnMgKyAnPicgKwoJCQkJaW5uZXJIdG1sICsKCQkJCSc8L3NwYW4+JzsKCQl9Cgl9LAoKCgkvKiBSZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFNldHMgdGhlIGNvbnRhaW5lciBlbGVtZW50IHRoYXQgdGhlIHZpZXcgc2hvdWxkIHJlbmRlciBpbnNpZGUgb2YuCgkvLyBEb2VzIG90aGVyIERPTS1yZWxhdGVkIGluaXRpYWxpemF0aW9ucy4KCXNldEVsZW1lbnQ6IGZ1bmN0aW9uKGVsKSB7CgkJdGhpcy5lbCA9IGVsOwoJCXRoaXMuYmluZEdsb2JhbEhhbmRsZXJzKCk7Cgl9LAoKCgkvLyBSZW1vdmVzIHRoZSB2aWV3J3MgY29udGFpbmVyIGVsZW1lbnQgZnJvbSB0aGUgRE9NLCBjbGVhcmluZyBhbnkgY29udGVudCBiZWZvcmVoYW5kLgoJLy8gVW5kb2VzIGFueSBvdGhlciBET00tcmVsYXRlZCBhdHRhY2htZW50cy4KCXJlbW92ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY2xlYXIoKTsgLy8gY2xlYXJzIGFsbCBjb250ZW50CgoJCS8vIGNsZWFuIHVwIHRoZSBza2VsZXRvbgoJCWlmICh0aGlzLmlzU2tlbGV0b25SZW5kZXJlZCkgewoJCQl0aGlzLnVucmVuZGVyU2tlbGV0b24oKTsKCQkJdGhpcy5pc1NrZWxldG9uUmVuZGVyZWQgPSBmYWxzZTsKCQl9CgoJCXRoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKTsKCgkJdGhpcy5lbC5yZW1vdmUoKTsKCgkJLy8gTk9URTogZG9uJ3QgbnVsbC1vdXQgdGhpcy5lbCBpbiBjYXNlIHRoZSBWaWV3IHdhcyBkZXN0cm95ZWQgd2l0aGluIGFuIEFQSSBjYWxsYmFjay4KCQkvLyBXZSBkb24ndCBudWxsLW91dCB0aGUgVmlldydzIG90aGVyIGpRdWVyeSBlbGVtZW50IHJlZmVyZW5jZXMgdXBvbiBkZXN0cm95LAoJCS8vICBzbyB3ZSBzaG91bGRuJ3Qga2lsbCB0aGlzLmVsIGVpdGhlci4KCX0sCgoKCS8vIERvZXMgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gZGlzcGxheSB0aGUgdmlldyBjZW50ZXJlZCBhcm91bmQgdGhlIGdpdmVuIHVuem9uZWQgZGF0ZS4KCS8vIERvZXMgZXZlcnkgdHlwZSBvZiByZW5kZXJpbmcgRVhDRVBUIHJlbmRlcmluZyBldmVudHMuCgkvLyBJcyBhc3ljaHJvbm91cyBhbmQgcmV0dXJucyBhIHByb21pc2UuCglkaXNwbGF5OiBmdW5jdGlvbihkYXRlLCBleHBsaWNpdFNjcm9sbFN0YXRlKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgcHJldlNjcm9sbFN0YXRlID0gbnVsbDsKCgkJaWYgKGV4cGxpY2l0U2Nyb2xsU3RhdGUgIT0gbnVsbCAmJiB0aGlzLmRpc3BsYXlpbmcpIHsgLy8gZG9uJ3QgbmVlZCBwcmV2U2Nyb2xsU3RhdGUgaWYgZXhwbGljaXRTY3JvbGxTdGF0ZQoJCQlwcmV2U2Nyb2xsU3RhdGUgPSB0aGlzLnF1ZXJ5U2Nyb2xsKCk7CgkJfQoKCQl0aGlzLmNhbGVuZGFyLmZyZWV6ZUNvbnRlbnRIZWlnaHQoKTsKCgkJcmV0dXJuIHN5bmNUaGVuKHRoaXMuY2xlYXIoKSwgZnVuY3Rpb24oKSB7IC8vIGNsZWFyIHRoZSBjb250ZW50IGZpcnN0CgkJCXJldHVybiAoCgkJCQlfdGhpcy5kaXNwbGF5aW5nID0KCQkJCQlzeW5jVGhlbihfdGhpcy5kaXNwbGF5VmlldyhkYXRlKSwgZnVuY3Rpb24oKSB7IC8vIGRpc3BsYXlWaWV3IG1pZ2h0IHJldHVybiBhIHByb21pc2UKCgkJCQkJCS8vIGNhbGxlciBvZiBkaXNwbGF5KCkgd2FudHMgYSBzcGVjaWZpYyBzY3JvbGwgc3RhdGU/CgkJCQkJCWlmIChleHBsaWNpdFNjcm9sbFN0YXRlICE9IG51bGwpIHsKCQkJCQkJCS8vIHdlIG1ha2UgYW4gYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgTk9UIHRoZSBpbml0aWFsIHJlbmRlciwKCQkJCQkJCS8vIGFuZCB0aHVzIGRvbid0IG5lZWQgZm9yY2VTY3JvbGwgKGlzIGluY29udmVuaWVudGx5IGFzeW5jaHJvbm91cykKCQkJCQkJCV90aGlzLnNldFNjcm9sbChleHBsaWNpdFNjcm9sbFN0YXRlKTsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCV90aGlzLmZvcmNlU2Nyb2xsKF90aGlzLmNvbXB1dGVJbml0aWFsU2Nyb2xsKHByZXZTY3JvbGxTdGF0ZSkpOwoJCQkJCQl9CgoJCQkJCQlfdGhpcy5jYWxlbmRhci51bmZyZWV6ZUNvbnRlbnRIZWlnaHQoKTsKCQkJCQkJX3RoaXMudHJpZ2dlclJlbmRlcigpOwoJCQkJCX0pCgkJCSk7CgkJfSk7Cgl9LAoKCgkvLyBEb2VzIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGNsZWFyIHRoZSBjb250ZW50IG9mIHRoZSB2aWV3LgoJLy8gQ2xlYXJzIGRhdGVzIGFuZCBldmVudHMuIERvZXMgbm90IGNsZWFyIHRoZSBza2VsZXRvbi4KCS8vIElzIGFzeWNocm9ub3VzIGFuZCByZXR1cm5zIGEgcHJvbWlzZS4KCWNsZWFyOiBmdW5jdGlvbigpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciBkaXNwbGF5aW5nID0gdGhpcy5kaXNwbGF5aW5nOwoKCQlpZiAoZGlzcGxheWluZykgeyAvLyBwcmV2aW91c2x5IGRpc3BsYXllZCwgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcGxheWVkPwoJCQlyZXR1cm4gc3luY1RoZW4oZGlzcGxheWluZywgZnVuY3Rpb24oKSB7IC8vIHdhaXQgZm9yIHRoZSBkaXNwbGF5IHRvIGZpbmlzaAoJCQkJX3RoaXMuZGlzcGxheWluZyA9IG51bGw7CgkJCQlfdGhpcy5jbGVhckV2ZW50cygpOwoJCQkJcmV0dXJuIF90aGlzLmNsZWFyVmlldygpOyAvLyBtaWdodCByZXR1cm4gYSBwcm9taXNlLiBjaGFpbiBpdAoJCQl9KTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiAkLndoZW4oKTsgLy8gYW4gaW1tZWRpYXRlbHktcmVzb2x2ZWQgcHJvbWlzZQoJCX0KCX0sCgoKCS8vIERpc3BsYXlzIHRoZSB2aWV3J3Mgbm9uLWV2ZW50IGNvbnRlbnQsIHN1Y2ggYXMgZGF0ZS1yZWxhdGVkIGNvbnRlbnQgb3IgYW55dGhpbmcgcmVxdWlyZWQgYnkgZXZlbnRzLgoJLy8gUmVuZGVycyB0aGUgdmlldydzIG5vbi1jb250ZW50IHNrZWxldG9uIGlmIG5lY2Vzc2FyeS4KCS8vIENhbiBiZSBhc3luY2hyb25vdXMgYW5kIHJldHVybiBhIHByb21pc2UuCglkaXNwbGF5VmlldzogZnVuY3Rpb24oZGF0ZSkgewoJCWlmICghdGhpcy5pc1NrZWxldG9uUmVuZGVyZWQpIHsKCQkJdGhpcy5yZW5kZXJTa2VsZXRvbigpOwoJCQl0aGlzLmlzU2tlbGV0b25SZW5kZXJlZCA9IHRydWU7CgkJfQoJCWlmIChkYXRlKSB7CgkJCXRoaXMuc2V0RGF0ZShkYXRlKTsKCQl9CgkJaWYgKHRoaXMucmVuZGVyKSB7CgkJCXRoaXMucmVuZGVyKCk7IC8vIFRPRE86IGRlcHJlY2F0ZQoJCX0KCQl0aGlzLnJlbmRlckRhdGVzKCk7CgkJdGhpcy51cGRhdGVTaXplKCk7CgkJdGhpcy5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7IC8vIG1pZ2h0IG5lZWQgY29vcmRpbmF0ZXMsIHNvIHNob3VsZCBnbyBhZnRlciB1cGRhdGVTaXplKCkKCQl0aGlzLnN0YXJ0Tm93SW5kaWNhdG9yKCk7Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIHZpZXcgY29udGVudCB0aGF0IHdhcyByZW5kZXJlZCBpbiBkaXNwbGF5Vmlldy4KCS8vIENhbiBiZSBhc3luY2hyb25vdXMgYW5kIHJldHVybiBhIHByb21pc2UuCgljbGVhclZpZXc6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5zZWxlY3QoKTsKCQl0aGlzLnN0b3BOb3dJbmRpY2F0b3IoKTsKCQl0aGlzLnRyaWdnZXJVbnJlbmRlcigpOwoJCXRoaXMudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CgkJdGhpcy51bnJlbmRlckRhdGVzKCk7CgkJaWYgKHRoaXMuZGVzdHJveSkgewoJCQl0aGlzLmRlc3Ryb3koKTsgLy8gVE9ETzogZGVwcmVjYXRlCgkJfQoJfSwKCgoJLy8gUmVuZGVycyB0aGUgYmFzaWMgc3RydWN0dXJlIG9mIHRoZSB2aWV3IGJlZm9yZSBhbnkgY29udGVudCBpcyByZW5kZXJlZAoJcmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLy8gVW5yZW5kZXJzIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgdGhlIHZpZXcKCXVucmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLy8gUmVuZGVycyB0aGUgdmlldydzIGRhdGUtcmVsYXRlZCBjb250ZW50LgoJLy8gQXNzdW1lcyBzZXRSYW5nZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbmQgdGhlIHNrZWxldG9uIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIHZpZXcncyBkYXRlLXJlbGF0ZWQgY29udGVudAoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUKCX0sCgoKCS8vIFNpZ25hbHMgdGhhdCB0aGUgdmlldydzIGNvbnRlbnQgaGFzIGJlZW4gcmVuZGVyZWQKCXRyaWdnZXJSZW5kZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudHJpZ2dlcigndmlld1JlbmRlcicsIHRoaXMsIHRoaXMsIHRoaXMuZWwpOwoJfSwKCgoJLy8gU2lnbmFscyB0aGF0IHRoZSB2aWV3J3MgY29udGVudCBpcyBhYm91dCB0byBiZSB1bnJlbmRlcmVkCgl0cmlnZ2VyVW5yZW5kZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudHJpZ2dlcigndmlld0Rlc3Ryb3knLCB0aGlzLCB0aGlzLCB0aGlzLmVsKTsKCX0sCgoKCS8vIEJpbmRzIERPTSBoYW5kbGVycyB0byBlbGVtZW50cyB0aGF0IHJlc2lkZSBvdXRzaWRlIHRoZSB2aWV3IGNvbnRhaW5lciwgc3VjaCBhcyB0aGUgZG9jdW1lbnQKCWJpbmRHbG9iYWxIYW5kbGVyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5saXN0ZW5UbygkKGRvY3VtZW50KSwgJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZWRvd24pOwoJCXRoaXMubGlzdGVuVG8oJChkb2N1bWVudCksICd0b3VjaHN0YXJ0JywgdGhpcy5wcm9jZXNzVW5zZWxlY3QpOwoJfSwKCgoJLy8gVW5iaW5kcyBET00gaGFuZGxlcnMgZnJvbSBlbGVtZW50cyB0aGF0IHJlc2lkZSBvdXRzaWRlIHRoZSB2aWV3IGNvbnRhaW5lcgoJdW5iaW5kR2xvYmFsSGFuZGxlcnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3RvcExpc3RlbmluZ1RvKCQoZG9jdW1lbnQpKTsKCX0sCgoKCS8vIEluaXRpYWxpemVzIGludGVybmFsIHZhcmlhYmxlcyByZWxhdGVkIHRvIHRoZW1pbmcKCWluaXRUaGVtaW5nUHJvcHM6IGZ1bmN0aW9uKCkgewoJCXZhciB0bSA9IHRoaXMub3B0KCd0aGVtZScpID8gJ3VpJyA6ICdmYyc7CgoJCXRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgPSB0bSArICctd2lkZ2V0LWhlYWRlcic7CgkJdGhpcy53aWRnZXRDb250ZW50Q2xhc3MgPSB0bSArICctd2lkZ2V0LWNvbnRlbnQnOwoJCXRoaXMuaGlnaGxpZ2h0U3RhdGVDbGFzcyA9IHRtICsgJy1zdGF0ZS1oaWdobGlnaHQnOwoJfSwKCgoJLyogQnVzaW5lc3MgSG91cnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgYnVzaW5lc3MtaG91cnMgb250byB0aGUgdmlldy4gQXNzdW1lcyB1cGRhdGVTaXplIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgcHJldmlvdXNseS1yZW5kZXJlZCBidXNpbmVzcy1ob3VycwoJdW5yZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8qIE5vdyBJbmRpY2F0b3IKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEltbWVkaWF0ZWx5IHJlbmRlciB0aGUgY3VycmVudCB0aW1lIGluZGljYXRvciBhbmQgYmVnaW5zIHJlLXJlbmRlcmluZyBpdCBhdCBhbiBpbnRlcnZhbCwKCS8vIHdoaWNoIGlzIGRlZmluZWQgYnkgdGhpcy5nZXROb3dJbmRpY2F0b3JVbml0KCkuCgkvLyBUT0RPOiBzb21laG93IGRvIHRoaXMgZm9yIHRoZSBjdXJyZW50IHdob2xlIGRheSdzIGJhY2tncm91bmQgdG9vCglzdGFydE5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdW5pdDsKCQl2YXIgdXBkYXRlOwoJCXZhciBkZWxheTsgLy8gbXMgd2FpdCB2YWx1ZQoKCQlpZiAodGhpcy5vcHQoJ25vd0luZGljYXRvcicpKSB7CgkJCXVuaXQgPSB0aGlzLmdldE5vd0luZGljYXRvclVuaXQoKTsKCQkJaWYgKHVuaXQpIHsKCQkJCXVwZGF0ZSA9IHByb3h5KHRoaXMsICd1cGRhdGVOb3dJbmRpY2F0b3InKTsgLy8gYmluZCB0byBgdGhpc2AKCgkJCQl0aGlzLmluaXRpYWxOb3dEYXRlID0gdGhpcy5jYWxlbmRhci5nZXROb3coKTsKCQkJCXRoaXMuaW5pdGlhbE5vd1F1ZXJpZWRNcyA9ICtuZXcgRGF0ZSgpOwoJCQkJdGhpcy5yZW5kZXJOb3dJbmRpY2F0b3IodGhpcy5pbml0aWFsTm93RGF0ZSk7CgkJCQl0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQgPSB0cnVlOwoKCQkJCS8vIHdhaXQgdW50aWwgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpbnRlcnZhbAoJCQkJZGVsYXkgPSB0aGlzLmluaXRpYWxOb3dEYXRlLmNsb25lKCkuc3RhcnRPZih1bml0KS5hZGQoMSwgdW5pdCkgLSB0aGlzLmluaXRpYWxOb3dEYXRlOwoJCQkJdGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJCV90aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRCA9IG51bGw7CgkJCQkJdXBkYXRlKCk7CgkJCQkJZGVsYXkgPSArbW9tZW50LmR1cmF0aW9uKDEsIHVuaXQpOwoJCQkJCWRlbGF5ID0gTWF0aC5tYXgoMTAwLCBkZWxheSk7IC8vIHByZXZlbnQgdG9vIGZyZXF1ZW50CgkJCQkJX3RoaXMubm93SW5kaWNhdG9ySW50ZXJ2YWxJRCA9IHNldEludGVydmFsKHVwZGF0ZSwgZGVsYXkpOyAvLyB1cGRhdGUgZXZlcnkgaW50ZXJ2YWwKCQkJCX0sIGRlbGF5KTsKCQkJfQoJCX0KCX0sCgoKCS8vIHJlcmVuZGVycyB0aGUgbm93IGluZGljYXRvciwgY29tcHV0aW5nIHRoZSBuZXcgY3VycmVudCB0aW1lIGZyb20gdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgaGFzIHBhc3NlZAoJLy8gc2luY2UgdGhlIGluaXRpYWwgZ2V0Tm93IGNhbGwuCgl1cGRhdGVOb3dJbmRpY2F0b3I6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQpIHsKCQkJdGhpcy51bnJlbmRlck5vd0luZGljYXRvcigpOwoJCQl0aGlzLnJlbmRlck5vd0luZGljYXRvcigKCQkJCXRoaXMuaW5pdGlhbE5vd0RhdGUuY2xvbmUoKS5hZGQobmV3IERhdGUoKSAtIHRoaXMuaW5pdGlhbE5vd1F1ZXJpZWRNcykgLy8gYWRkIG1zCgkJCSk7CgkJfQoJfSwKCgoJLy8gSW1tZWRpYXRlbHkgdW5yZW5kZXJzIHRoZSB2aWV3J3MgY3VycmVudCB0aW1lIGluZGljYXRvciBhbmQgc3RvcHMgYW55IHJlLXJlbmRlcmluZyB0aW1lcnMuCgkvLyBXb24ndCBjYXVzZSBzaWRlIGVmZmVjdHMgaWYgaW5kaWNhdG9yIGlzbid0IHJlbmRlcmVkLgoJc3RvcE5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNOb3dJbmRpY2F0b3JSZW5kZXJlZCkgewoKCQkJaWYgKHRoaXMubm93SW5kaWNhdG9yVGltZW91dElEKSB7CgkJCQljbGVhclRpbWVvdXQodGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQpOwoJCQkJdGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQgPSBudWxsOwoJCQl9CgkJCWlmICh0aGlzLm5vd0luZGljYXRvckludGVydmFsSUQpIHsKCQkJCWNsZWFyVGltZW91dCh0aGlzLm5vd0luZGljYXRvckludGVydmFsSUQpOwoJCQkJdGhpcy5ub3dJbmRpY2F0b3JJbnRlcnZhbElEID0gbnVsbDsKCQkJfQoKCQkJdGhpcy51bnJlbmRlck5vd0luZGljYXRvcigpOwoJCQl0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQgPSBmYWxzZTsKCQl9Cgl9LAoKCgkvLyBSZXR1cm5zIGEgc3RyaW5nIHVuaXQsIGxpa2UgJ3NlY29uZCcgb3IgJ21pbnV0ZScgdGhhdCBkZWZpbmVkIGhvdyBvZnRlbiB0aGUgY3VycmVudCB0aW1lIGluZGljYXRvcgoJLy8gc2hvdWxkIGJlIHJlZnJlc2hlZC4gSWYgc29tZXRoaW5nIGZhbHN5IGlzIHJldHVybmVkLCBubyB0aW1lIGluZGljYXRvciBpcyByZW5kZXJlZCBhdCBhbGwuCglnZXROb3dJbmRpY2F0b3JVbml0OiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8vIFJlbmRlcnMgYSBjdXJyZW50IHRpbWUgaW5kaWNhdG9yIGF0IHRoZSBnaXZlbiBkYXRldGltZQoJcmVuZGVyTm93SW5kaWNhdG9yOiBmdW5jdGlvbihkYXRlKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbmRvZXMgdGhlIHJlbmRlcmluZyBhY3Rpb25zIGZyb20gcmVuZGVyTm93SW5kaWNhdG9yCgl1bnJlbmRlck5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvKiBEaW1lbnNpb25zCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZWZyZXNoZXMgYW55dGhpbmcgZGVwZW5kYW50IHVwb24gc2l6aW5nIG9mIHRoZSBjb250YWluZXIgZWxlbWVudCBvZiB0aGUgZ3JpZAoJdXBkYXRlU2l6ZTogZnVuY3Rpb24oaXNSZXNpemUpIHsKCQl2YXIgc2Nyb2xsU3RhdGU7CgoJCWlmIChpc1Jlc2l6ZSkgewoJCQlzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKCQl9CgoJCXRoaXMudXBkYXRlSGVpZ2h0KGlzUmVzaXplKTsKCQl0aGlzLnVwZGF0ZVdpZHRoKGlzUmVzaXplKTsKCQl0aGlzLnVwZGF0ZU5vd0luZGljYXRvcigpOwoKCQlpZiAoaXNSZXNpemUpIHsKCQkJdGhpcy5zZXRTY3JvbGwoc2Nyb2xsU3RhdGUpOwoJCX0KCX0sCgoKCS8vIFJlZnJlc2hlcyB0aGUgaG9yaXpvbnRhbCBkaW1lbnNpb25zIG9mIHRoZSBjYWxlbmRhcgoJdXBkYXRlV2lkdGg6IGZ1bmN0aW9uKGlzUmVzaXplKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBSZWZyZXNoZXMgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIGNhbGVuZGFyCgl1cGRhdGVIZWlnaHQ6IGZ1bmN0aW9uKGlzUmVzaXplKSB7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy5jYWxlbmRhcjsgLy8gd2UgcG9sbCB0aGUgY2FsZW5kYXIgZm9yIGhlaWdodCBpbmZvcm1hdGlvbgoKCQl0aGlzLnNldEhlaWdodCgKCQkJY2FsZW5kYXIuZ2V0U3VnZ2VzdGVkVmlld0hlaWdodCgpLAoJCQljYWxlbmRhci5pc0hlaWdodEF1dG8oKQoJCSk7Cgl9LAoKCgkvLyBVcGRhdGVzIHRoZSB2ZXJ0aWNhbCBkaW1lbnNpb25zIG9mIHRoZSBjYWxlbmRhciB0byB0aGUgc3BlY2lmaWVkIGhlaWdodC4KCS8vIGlmIGBpc0F1dG9gIGlzIHNldCB0byB0cnVlLCBoZWlnaHQgYmVjb21lcyBtZXJlbHkgYSBzdWdnZXN0aW9uIGFuZCB0aGUgdmlldyBzaG91bGQgdXNlIGl0cyAibmF0dXJhbCIgaGVpZ2h0LgoJc2V0SGVpZ2h0OiBmdW5jdGlvbihoZWlnaHQsIGlzQXV0bykgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLyogU2Nyb2xsZXIKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENvbXB1dGVzIHRoZSBpbml0aWFsIHByZS1jb25maWd1cmVkIHNjcm9sbCBzdGF0ZSBwcmlvciB0byBhbGxvd2luZyB0aGUgdXNlciB0byBjaGFuZ2UgaXQuCgkvLyBHaXZlbiB0aGUgc2Nyb2xsIHN0YXRlIGZyb20gdGhlIHByZXZpb3VzIHJlbmRlcmluZy4gSWYgZmlyc3QgdGltZSByZW5kZXJpbmcsIGdpdmVuIG51bGwuCgljb21wdXRlSW5pdGlhbFNjcm9sbDogZnVuY3Rpb24ocHJldmlvdXNTY3JvbGxTdGF0ZSkgewoJCXJldHVybiAwOwoJfSwKCgoJLy8gUmV0cmlldmVzIHRoZSB2aWV3J3MgY3VycmVudCBuYXR1cmFsIHNjcm9sbCBzdGF0ZS4gQ2FuIHJldHVybiBhbiBhcmJpdHJhcnkgZm9ybWF0LgoJcXVlcnlTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8vIFNldHMgdGhlIHZpZXcncyBzY3JvbGwgc3RhdGUuIFdpbGwgYWNjZXB0IHRoZSBzYW1lIGZvcm1hdCBjb21wdXRlSW5pdGlhbFNjcm9sbCBhbmQgcXVlcnlTY3JvbGwgcHJvZHVjZS4KCXNldFNjcm9sbDogZnVuY3Rpb24oc2Nyb2xsU3RhdGUpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBTZXRzIHRoZSBzY3JvbGwgc3RhdGUsIG1ha2luZyBzdXJlIHRvIG92ZXJjb21lIGFueSBwcmVkZWZpbmVkIHNjcm9sbCB2YWx1ZSB0aGUgYnJvd3NlciBoYXMgaW4gbWluZAoJZm9yY2VTY3JvbGw6IGZ1bmN0aW9uKHNjcm9sbFN0YXRlKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCgkJdGhpcy5zZXRTY3JvbGwoc2Nyb2xsU3RhdGUpOwoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCV90aGlzLnNldFNjcm9sbChzY3JvbGxTdGF0ZSk7CgkJfSwgMCk7Cgl9LAoKCgkvKiBFdmVudCBFbGVtZW50cyAvIFNlZ21lbnRzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBEb2VzIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGRpc3BsYXkgdGhlIGdpdmVuIGV2ZW50cyBvbnRvIHRoZSBjdXJyZW50IHZpZXcKCWRpc3BsYXlFdmVudHM6IGZ1bmN0aW9uKGV2ZW50cykgewoJCXZhciBzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKCgkJdGhpcy5jbGVhckV2ZW50cygpOwoJCXRoaXMucmVuZGVyRXZlbnRzKGV2ZW50cyk7CgkJdGhpcy5pc0V2ZW50c1JlbmRlcmVkID0gdHJ1ZTsKCQl0aGlzLnNldFNjcm9sbChzY3JvbGxTdGF0ZSk7CgkJdGhpcy50cmlnZ2VyRXZlbnRSZW5kZXIoKTsKCX0sCgoKCS8vIERvZXMgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gY2xlYXIgdGhlIHZpZXcncyBjdXJyZW50bHktcmVuZGVyZWQgZXZlbnRzCgljbGVhckV2ZW50czogZnVuY3Rpb24oKSB7CgkJdmFyIHNjcm9sbFN0YXRlOwoKCQlpZiAodGhpcy5pc0V2ZW50c1JlbmRlcmVkKSB7CgoJCQkvLyBUT0RPOiBvcHRpbWl6ZTogaWYgd2Uga25vdyB0aGlzIGlzIHBhcnQgb2YgYSBkaXNwbGF5RXZlbnRzIGNhbGwsIGRvbid0IHF1ZXJ5U2Nyb2xsL3NldFNjcm9sbAoJCQlzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKCgkJCXRoaXMudHJpZ2dlckV2ZW50VW5yZW5kZXIoKTsKCQkJaWYgKHRoaXMuZGVzdHJveUV2ZW50cykgewoJCQkJdGhpcy5kZXN0cm95RXZlbnRzKCk7IC8vIFRPRE86IGRlcHJlY2F0ZQoJCQl9CgkJCXRoaXMudW5yZW5kZXJFdmVudHMoKTsKCQkJdGhpcy5zZXRTY3JvbGwoc2Nyb2xsU3RhdGUpOwoJCQl0aGlzLmlzRXZlbnRzUmVuZGVyZWQgPSBmYWxzZTsKCQl9Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSBldmVudHMgb250byB0aGUgdmlldy4KCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBSZW1vdmVzIGV2ZW50IGVsZW1lbnRzIGZyb20gdGhlIHZpZXcuCgl1bnJlbmRlckV2ZW50czogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBTaWduYWxzIHRoYXQgYWxsIGV2ZW50cyBoYXZlIGJlZW4gcmVuZGVyZWQKCXRyaWdnZXJFdmVudFJlbmRlcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJdGhpcy50cmlnZ2VyKCdldmVudEFmdGVyUmVuZGVyJywgc2VnLmV2ZW50LCBzZWcuZXZlbnQsIHNlZy5lbCk7CgkJfSk7CgkJdGhpcy50cmlnZ2VyKCdldmVudEFmdGVyQWxsUmVuZGVyJyk7Cgl9LAoKCgkvLyBTaWduYWxzIHRoYXQgYWxsIGV2ZW50IGVsZW1lbnRzIGFyZSBhYm91dCB0byBiZSByZW1vdmVkCgl0cmlnZ2VyRXZlbnRVbnJlbmRlcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJdGhpcy50cmlnZ2VyKCdldmVudERlc3Ryb3knLCBzZWcuZXZlbnQsIHNlZy5ldmVudCwgc2VnLmVsKTsKCQl9KTsKCX0sCgoKCS8vIEdpdmVuIGFuIGV2ZW50IGFuZCB0aGUgZGVmYXVsdCBlbGVtZW50IHVzZWQgZm9yIHJlbmRlcmluZywgcmV0dXJucyB0aGUgZWxlbWVudCB0aGF0IHNob3VsZCBhY3R1YWxseSBiZSB1c2VkLgoJLy8gQmFzaWNhbGx5IHJ1bnMgZXZlbnRzIGFuZCBlbGVtZW50cyB0aHJvdWdoIHRoZSBldmVudFJlbmRlciBob29rLgoJcmVzb2x2ZUV2ZW50RWw6IGZ1bmN0aW9uKGV2ZW50LCBlbCkgewoJCXZhciBjdXN0b20gPSB0aGlzLnRyaWdnZXIoJ2V2ZW50UmVuZGVyJywgZXZlbnQsIGV2ZW50LCBlbCk7CgoJCWlmIChjdXN0b20gPT09IGZhbHNlKSB7IC8vIG1lYW5zIGRvbid0IHJlbmRlciBhdCBhbGwKCQkJZWwgPSBudWxsOwoJCX0KCQllbHNlIGlmIChjdXN0b20gJiYgY3VzdG9tICE9PSB0cnVlKSB7CgkJCWVsID0gJChjdXN0b20pOwoJCX0KCgkJcmV0dXJuIGVsOwoJfSwKCgoJLy8gSGlkZXMgYWxsIHJlbmRlcmVkIGV2ZW50IHNlZ21lbnRzIGxpbmtlZCB0byB0aGUgZ2l2ZW4gZXZlbnQKCXNob3dFdmVudDogZnVuY3Rpb24oZXZlbnQpIHsKCQl0aGlzLnJlbmRlcmVkRXZlbnRTZWdFYWNoKGZ1bmN0aW9uKHNlZykgewoJCQlzZWcuZWwuY3NzKCd2aXNpYmlsaXR5JywgJycpOwoJCX0sIGV2ZW50KTsKCX0sCgoKCS8vIFNob3dzIGFsbCByZW5kZXJlZCBldmVudCBzZWdtZW50cyBsaW5rZWQgdG8gdGhlIGdpdmVuIGV2ZW50CgloaWRlRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJc2VnLmVsLmNzcygndmlzaWJpbGl0eScsICdoaWRkZW4nKTsKCQl9LCBldmVudCk7Cgl9LAoKCgkvLyBJdGVyYXRlcyB0aHJvdWdoIGV2ZW50IHNlZ21lbnRzIHRoYXQgaGF2ZSBiZWVuIHJlbmRlcmVkIChoYXZlIGFuIGVsKS4gR29lcyB0aHJvdWdoIGFsbCBieSBkZWZhdWx0LgoJLy8gSWYgdGhlIG9wdGlvbmFsIGBldmVudGAgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBvbmx5IGl0ZXJhdGVzIHRocm91Z2ggc2VnbWVudHMgbGlua2VkIHRvIHRoYXQgZXZlbnQuCgkvLyBUaGUgYHRoaXNgIHZhbHVlIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIHRoZSB2aWV3LgoJcmVuZGVyZWRFdmVudFNlZ0VhY2g6IGZ1bmN0aW9uKGZ1bmMsIGV2ZW50KSB7CgkJdmFyIHNlZ3MgPSB0aGlzLmdldEV2ZW50U2VncygpOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlpZiAoIWV2ZW50IHx8IHNlZ3NbaV0uZXZlbnQuX2lkID09PSBldmVudC5faWQpIHsKCQkJCWlmIChzZWdzW2ldLmVsKSB7CgkJCQkJZnVuYy5jYWxsKHRoaXMsIHNlZ3NbaV0pOwoJCQkJfQoJCQl9CgkJfQoJfSwKCgoJLy8gUmV0cmlldmVzIGFsbCB0aGUgcmVuZGVyZWQgc2VnbWVudCBvYmplY3RzIGZvciB0aGUgdmlldwoJZ2V0RXZlbnRTZWdzOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50CgkJcmV0dXJuIFtdOwoJfSwKCgoJLyogRXZlbnQgRHJhZy1uLURyb3AKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENvbXB1dGVzIGlmIHRoZSBnaXZlbiBldmVudCBpcyBhbGxvd2VkIHRvIGJlIGRyYWdnZWQgYnkgdGhlIHVzZXIKCWlzRXZlbnREcmFnZ2FibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMuaXNFdmVudFN0YXJ0RWRpdGFibGUoZXZlbnQpOwoJfSwKCgoJaXNFdmVudFN0YXJ0RWRpdGFibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIGZpcnN0RGVmaW5lZCgKCQkJZXZlbnQuc3RhcnRFZGl0YWJsZSwKCQkJKGV2ZW50LnNvdXJjZSB8fCB7fSkuc3RhcnRFZGl0YWJsZSwKCQkJdGhpcy5vcHQoJ2V2ZW50U3RhcnRFZGl0YWJsZScpLAoJCQl0aGlzLmlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZShldmVudCkKCQkpOwoJfSwKCgoJaXNFdmVudEdlbmVyYWxseUVkaXRhYmxlOiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiBmaXJzdERlZmluZWQoCgkJCWV2ZW50LmVkaXRhYmxlLAoJCQkoZXZlbnQuc291cmNlIHx8IHt9KS5lZGl0YWJsZSwKCQkJdGhpcy5vcHQoJ2VkaXRhYmxlJykKCQkpOwoJfSwKCgoJLy8gTXVzdCBiZSBjYWxsZWQgd2hlbiBhbiBldmVudCBpbiB0aGUgdmlldyBpcyBkcm9wcGVkIG9udG8gbmV3IGxvY2F0aW9uLgoJLy8gYGRyb3BMb2NhdGlvbmAgaXMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIG5ldyB6b25lZCBzdGFydC9lbmQvYWxsRGF5IHZhbHVlcyBmb3IgdGhlIGV2ZW50LgoJcmVwb3J0RXZlbnREcm9wOiBmdW5jdGlvbihldmVudCwgZHJvcExvY2F0aW9uLCBsYXJnZVVuaXQsIGVsLCBldikgewoJCXZhciBjYWxlbmRhciA9IHRoaXMuY2FsZW5kYXI7CgkJdmFyIG11dGF0ZVJlc3VsdCA9IGNhbGVuZGFyLm11dGF0ZUV2ZW50KGV2ZW50LCBkcm9wTG9jYXRpb24sIGxhcmdlVW5pdCk7CgkJdmFyIHVuZG9GdW5jID0gZnVuY3Rpb24oKSB7CgkJCW11dGF0ZVJlc3VsdC51bmRvKCk7CgkJCWNhbGVuZGFyLnJlcG9ydEV2ZW50Q2hhbmdlKCk7CgkJfTsKCgkJdGhpcy50cmlnZ2VyRXZlbnREcm9wKGV2ZW50LCBtdXRhdGVSZXN1bHQuZGF0ZURlbHRhLCB1bmRvRnVuYywgZWwsIGV2KTsKCQljYWxlbmRhci5yZXBvcnRFdmVudENoYW5nZSgpOyAvLyB3aWxsIHJlcmVuZGVyIGV2ZW50cwoJfSwKCgoJLy8gVHJpZ2dlcnMgZXZlbnQtZHJvcCBoYW5kbGVycyB0aGF0IGhhdmUgc3Vic2NyaWJlZCB2aWEgdGhlIEFQSQoJdHJpZ2dlckV2ZW50RHJvcDogZnVuY3Rpb24oZXZlbnQsIGRhdGVEZWx0YSwgdW5kb0Z1bmMsIGVsLCBldikgewoJCXRoaXMudHJpZ2dlcignZXZlbnREcm9wJywgZWxbMF0sIGV2ZW50LCBkYXRlRGVsdGEsIHVuZG9GdW5jLCBldiwge30pOyAvLyB7fSA9IGpxdWkgZHVtbXkKCX0sCgoKCS8qIEV4dGVybmFsIEVsZW1lbnQgRHJhZy1uLURyb3AKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIE11c3QgYmUgY2FsbGVkIHdoZW4gYW4gZXh0ZXJuYWwgZWxlbWVudCwgdmlhIGpRdWVyeSBVSSwgaGFzIGJlZW4gZHJvcHBlZCBvbnRvIHRoZSBjYWxlbmRhci4KCS8vIGBtZXRhYCBpcyB0aGUgcGFyc2VkIGRhdGEgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbnRvIHRoZSBkcmFnZ2luZyBldmVudC4KCS8vIGBkcm9wTG9jYXRpb25gIGlzIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBuZXcgem9uZWQgc3RhcnQvZW5kL2FsbERheSB2YWx1ZXMgZm9yIHRoZSBldmVudC4KCXJlcG9ydEV4dGVybmFsRHJvcDogZnVuY3Rpb24obWV0YSwgZHJvcExvY2F0aW9uLCBlbCwgZXYsIHVpKSB7CgkJdmFyIGV2ZW50UHJvcHMgPSBtZXRhLmV2ZW50UHJvcHM7CgkJdmFyIGV2ZW50SW5wdXQ7CgkJdmFyIGV2ZW50OwoKCQkvLyBUcnkgdG8gYnVpbGQgYW4gZXZlbnQgb2JqZWN0IGFuZCByZW5kZXIgaXQuIFRPRE86IGRlY291cGxlIHRoZSB0d28KCQlpZiAoZXZlbnRQcm9wcykgewoJCQlldmVudElucHV0ID0gJC5leHRlbmQoe30sIGV2ZW50UHJvcHMsIGRyb3BMb2NhdGlvbik7CgkJCWV2ZW50ID0gdGhpcy5jYWxlbmRhci5yZW5kZXJFdmVudChldmVudElucHV0LCBtZXRhLnN0aWNrKVswXTsgLy8gcmVuZGVyRXZlbnQgcmV0dXJucyBhbiBhcnJheQoJCX0KCgkJdGhpcy50cmlnZ2VyRXh0ZXJuYWxEcm9wKGV2ZW50LCBkcm9wTG9jYXRpb24sIGVsLCBldiwgdWkpOwoJfSwKCgoJLy8gVHJpZ2dlcnMgZXh0ZXJuYWwtZHJvcCBoYW5kbGVycyB0aGF0IGhhdmUgc3Vic2NyaWJlZCB2aWEgdGhlIEFQSQoJdHJpZ2dlckV4dGVybmFsRHJvcDogZnVuY3Rpb24oZXZlbnQsIGRyb3BMb2NhdGlvbiwgZWwsIGV2LCB1aSkgewoKCQkvLyB0cmlnZ2VyICdkcm9wJyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgZWxlbWVudCByZXByZXNlbnRzIGFuIGV2ZW50CgkJdGhpcy50cmlnZ2VyKCdkcm9wJywgZWxbMF0sIGRyb3BMb2NhdGlvbi5zdGFydCwgZXYsIHVpKTsKCgkJaWYgKGV2ZW50KSB7CgkJCXRoaXMudHJpZ2dlcignZXZlbnRSZWNlaXZlJywgbnVsbCwgZXZlbnQpOyAvLyBzaWduYWwgYW4gZXh0ZXJuYWwgZXZlbnQgbGFuZGVkCgkJfQoJfSwKCgoJLyogRHJhZy1uLURyb3AgUmVuZGVyaW5nIChmb3IgYm90aCBldmVudHMgYW5kIGV4dGVybmFsIGVsZW1lbnRzKQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGEgZXZlbnQgb3IgZXh0ZXJuYWwtZWxlbWVudCBkcmFnIG92ZXIgdGhlIGdpdmVuIGRyb3Agem9uZS4KCS8vIElmIGFuIGV4dGVybmFsLWVsZW1lbnQsIHNlZyB3aWxsIGJlIGBudWxsYC4KCS8vIE11c3QgcmV0dXJuIGVsZW1lbnRzIHVzZWQgZm9yIGFueSBtb2NrIGV2ZW50cy4KCXJlbmRlckRyYWc6IGZ1bmN0aW9uKGRyb3BMb2NhdGlvbiwgc2VnKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgb3IgZXh0ZXJuYWwtZWxlbWVudCBiZWluZyBkcmFnZ2VkLgoJdW5yZW5kZXJEcmFnOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvKiBFdmVudCBSZXNpemluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZXMgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIGFsbG93ZWQgdG8gYmUgcmVzaXplZCBmcm9tIGl0cyBzdGFydGluZyBlZGdlCglpc0V2ZW50UmVzaXphYmxlRnJvbVN0YXJ0OiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiB0aGlzLm9wdCgnZXZlbnRSZXNpemFibGVGcm9tU3RhcnQnKSAmJiB0aGlzLmlzRXZlbnRSZXNpemFibGUoZXZlbnQpOwoJfSwKCgoJLy8gQ29tcHV0ZXMgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIGFsbG93ZWQgdG8gYmUgcmVzaXplZCBmcm9tIGl0cyBlbmRpbmcgZWRnZQoJaXNFdmVudFJlc2l6YWJsZUZyb21FbmQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMuaXNFdmVudFJlc2l6YWJsZShldmVudCk7Cgl9LAoKCgkvLyBDb21wdXRlcyBpZiB0aGUgZ2l2ZW4gZXZlbnQgaXMgYWxsb3dlZCB0byBiZSByZXNpemVkIGJ5IHRoZSB1c2VyIGF0IGFsbAoJaXNFdmVudFJlc2l6YWJsZTogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIgc291cmNlID0gZXZlbnQuc291cmNlIHx8IHt9OwoKCQlyZXR1cm4gZmlyc3REZWZpbmVkKAoJCQlldmVudC5kdXJhdGlvbkVkaXRhYmxlLAoJCQlzb3VyY2UuZHVyYXRpb25FZGl0YWJsZSwKCQkJdGhpcy5vcHQoJ2V2ZW50RHVyYXRpb25FZGl0YWJsZScpLAoJCQlldmVudC5lZGl0YWJsZSwKCQkJc291cmNlLmVkaXRhYmxlLAoJCQl0aGlzLm9wdCgnZWRpdGFibGUnKQoJCSk7Cgl9LAoKCgkvLyBNdXN0IGJlIGNhbGxlZCB3aGVuIGFuIGV2ZW50IGluIHRoZSB2aWV3IGhhcyBiZWVuIHJlc2l6ZWQgdG8gYSBuZXcgbGVuZ3RoCglyZXBvcnRFdmVudFJlc2l6ZTogZnVuY3Rpb24oZXZlbnQsIHJlc2l6ZUxvY2F0aW9uLCBsYXJnZVVuaXQsIGVsLCBldikgewoJCXZhciBjYWxlbmRhciA9IHRoaXMuY2FsZW5kYXI7CgkJdmFyIG11dGF0ZVJlc3VsdCA9IGNhbGVuZGFyLm11dGF0ZUV2ZW50KGV2ZW50LCByZXNpemVMb2NhdGlvbiwgbGFyZ2VVbml0KTsKCQl2YXIgdW5kb0Z1bmMgPSBmdW5jdGlvbigpIHsKCQkJbXV0YXRlUmVzdWx0LnVuZG8oKTsKCQkJY2FsZW5kYXIucmVwb3J0RXZlbnRDaGFuZ2UoKTsKCQl9OwoKCQl0aGlzLnRyaWdnZXJFdmVudFJlc2l6ZShldmVudCwgbXV0YXRlUmVzdWx0LmR1cmF0aW9uRGVsdGEsIHVuZG9GdW5jLCBlbCwgZXYpOwoJCWNhbGVuZGFyLnJlcG9ydEV2ZW50Q2hhbmdlKCk7IC8vIHdpbGwgcmVyZW5kZXIgZXZlbnRzCgl9LAoKCgkvLyBUcmlnZ2VycyBldmVudC1yZXNpemUgaGFuZGxlcnMgdGhhdCBoYXZlIHN1YnNjcmliZWQgdmlhIHRoZSBBUEkKCXRyaWdnZXJFdmVudFJlc2l6ZTogZnVuY3Rpb24oZXZlbnQsIGR1cmF0aW9uRGVsdGEsIHVuZG9GdW5jLCBlbCwgZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2V2ZW50UmVzaXplJywgZWxbMF0sIGV2ZW50LCBkdXJhdGlvbkRlbHRhLCB1bmRvRnVuYywgZXYsIHt9KTsgLy8ge30gPSBqcXVpIGR1bW15Cgl9LAoKCgkvKiBTZWxlY3Rpb24gKHRpbWUgcmFuZ2UpCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBTZWxlY3RzIGEgZGF0ZSBzcGFuIG9uIHRoZSB2aWV3LiBgc3RhcnRgIGFuZCBgZW5kYCBhcmUgYm90aCBNb21lbnRzLgoJLy8gYGV2YCBpcyB0aGUgbmF0aXZlIG1vdXNlIGV2ZW50IHRoYXQgYmVnaW4gdGhlIGludGVyYWN0aW9uLgoJc2VsZWN0OiBmdW5jdGlvbihzcGFuLCBldikgewoJCXRoaXMudW5zZWxlY3QoZXYpOwoJCXRoaXMucmVuZGVyU2VsZWN0aW9uKHNwYW4pOwoJCXRoaXMucmVwb3J0U2VsZWN0aW9uKHNwYW4sIGV2KTsKCX0sCgoKCS8vIFJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiB0aGUgc2VsZWN0aW9uCglyZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKHNwYW4pIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8vIENhbGxlZCB3aGVuIGEgbmV3IHNlbGVjdGlvbiBpcyBtYWRlLiBVcGRhdGVzIGludGVybmFsIHN0YXRlIGFuZCB0cmlnZ2VycyBoYW5kbGVycy4KCXJlcG9ydFNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbiwgZXYpIHsKCQl0aGlzLmlzU2VsZWN0ZWQgPSB0cnVlOwoJCXRoaXMudHJpZ2dlclNlbGVjdChzcGFuLCBldik7Cgl9LAoKCgkvLyBUcmlnZ2VycyBoYW5kbGVycyB0byAnc2VsZWN0JwoJdHJpZ2dlclNlbGVjdDogZnVuY3Rpb24oc3BhbiwgZXYpIHsKCQl0aGlzLnRyaWdnZXIoCgkJCSdzZWxlY3QnLAoJCQludWxsLAoJCQl0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUoc3Bhbi5zdGFydCksIC8vIGNvbnZlcnQgdG8gY2FsZW5kYXIncyB0eiBmb3IgZXh0ZXJuYWwgQVBJCgkJCXRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZShzcGFuLmVuZCksIC8vICIKCQkJZXYKCQkpOwoJfSwKCgoJLy8gVW5kb2VzIGEgc2VsZWN0aW9uLiB1cGRhdGVzIGluIHRoZSBpbnRlcm5hbCBzdGF0ZSBhbmQgdHJpZ2dlcnMgaGFuZGxlcnMuCgkvLyBgZXZgIGlzIHRoZSBuYXRpdmUgbW91c2UgZXZlbnQgdGhhdCBiZWdhbiB0aGUgaW50ZXJhY3Rpb24uCgl1bnNlbGVjdDogZnVuY3Rpb24oZXYpIHsKCQlpZiAodGhpcy5pc1NlbGVjdGVkKSB7CgkJCXRoaXMuaXNTZWxlY3RlZCA9IGZhbHNlOwoJCQlpZiAodGhpcy5kZXN0cm95U2VsZWN0aW9uKSB7CgkJCQl0aGlzLmRlc3Ryb3lTZWxlY3Rpb24oKTsgLy8gVE9ETzogZGVwcmVjYXRlCgkJCX0KCQkJdGhpcy51bnJlbmRlclNlbGVjdGlvbigpOwoJCQl0aGlzLnRyaWdnZXIoJ3Vuc2VsZWN0JywgbnVsbCwgZXYpOwoJCX0KCX0sCgoKCS8vIFVucmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIHNlbGVjdGlvbgoJdW5yZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLyogRXZlbnQgU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglzZWxlY3RFdmVudDogZnVuY3Rpb24oZXZlbnQpIHsKCQlpZiAoIXRoaXMuc2VsZWN0ZWRFdmVudCB8fCB0aGlzLnNlbGVjdGVkRXZlbnQgIT09IGV2ZW50KSB7CgkJCXRoaXMudW5zZWxlY3RFdmVudCgpOwoJCQl0aGlzLnJlbmRlcmVkRXZlbnRTZWdFYWNoKGZ1bmN0aW9uKHNlZykgewoJCQkJc2VnLmVsLmFkZENsYXNzKCdmYy1zZWxlY3RlZCcpOwoJCQl9LCBldmVudCk7CgkJCXRoaXMuc2VsZWN0ZWRFdmVudCA9IGV2ZW50OwoJCX0KCX0sCgoKCXVuc2VsZWN0RXZlbnQ6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLnNlbGVjdGVkRXZlbnQpIHsKCQkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJCXNlZy5lbC5yZW1vdmVDbGFzcygnZmMtc2VsZWN0ZWQnKTsKCQkJfSwgdGhpcy5zZWxlY3RlZEV2ZW50KTsKCQkJdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDsKCQl9Cgl9LAoKCglpc0V2ZW50U2VsZWN0ZWQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy8gZXZlbnQgcmVmZXJlbmNlcyBtaWdodCBjaGFuZ2Ugb24gcmVmZXRjaEV2ZW50cygpLCB3aGlsZSBzZWxlY3RlZEV2ZW50IGRvZXNuJ3QsCgkJLy8gc28gY29tcGFyZSBJRHMKCQlyZXR1cm4gdGhpcy5zZWxlY3RlZEV2ZW50ICYmIHRoaXMuc2VsZWN0ZWRFdmVudC5faWQgPT09IGV2ZW50Ll9pZDsKCX0sCgoKCS8qIE1vdXNlIC8gVG91Y2ggVW5zZWxlY3RpbmcgKHRpbWUgcmFuZ2UgJiBldmVudCB1bnNlbGVjdGlvbikKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkvLyBUT0RPOiBtb3ZlIGNvbnNpc3RlbnRseSB0byBkb3duL3N0YXJ0IG9yIHVwL2VuZD8KCS8vIFRPRE86IGRvbid0IGtpbGwgcHJldmlvdXMgc2VsZWN0aW9uIGlmIHRvdWNoIHNjcm9sbGluZwoKCgloYW5kbGVEb2N1bWVudE1vdXNlZG93bjogZnVuY3Rpb24oZXYpIHsKCQlpZiAoaXNQcmltYXJ5TW91c2VCdXR0b24oZXYpKSB7CgkJCXRoaXMucHJvY2Vzc1Vuc2VsZWN0KGV2KTsKCQl9Cgl9LAoKCglwcm9jZXNzVW5zZWxlY3Q6IGZ1bmN0aW9uKGV2KSB7CgkJdGhpcy5wcm9jZXNzUmFuZ2VVbnNlbGVjdChldik7CgkJdGhpcy5wcm9jZXNzRXZlbnRVbnNlbGVjdChldik7Cgl9LAoKCglwcm9jZXNzUmFuZ2VVbnNlbGVjdDogZnVuY3Rpb24oZXYpIHsKCQl2YXIgaWdub3JlOwoKCQkvLyBpcyB0aGVyZSBhIHRpbWUtcmFuZ2Ugc2VsZWN0aW9uPwoJCWlmICh0aGlzLmlzU2VsZWN0ZWQgJiYgdGhpcy5vcHQoJ3Vuc2VsZWN0QXV0bycpKSB7CgkJCS8vIG9ubHkgdW5zZWxlY3QgaWYgdGhlIGNsaWNrZWQgZWxlbWVudCBpcyBub3QgaWRlbnRpY2FsIHRvIG9yIGluc2lkZSBvZiBhbiAndW5zZWxlY3RDYW5jZWwnIGVsZW1lbnQKCQkJaWdub3JlID0gdGhpcy5vcHQoJ3Vuc2VsZWN0Q2FuY2VsJyk7CgkJCWlmICghaWdub3JlIHx8ICEkKGV2LnRhcmdldCkuY2xvc2VzdChpZ25vcmUpLmxlbmd0aCkgewoJCQkJdGhpcy51bnNlbGVjdChldik7CgkJCX0KCQl9Cgl9LAoKCglwcm9jZXNzRXZlbnRVbnNlbGVjdDogZnVuY3Rpb24oZXYpIHsKCQlpZiAodGhpcy5zZWxlY3RlZEV2ZW50KSB7CgkJCWlmICghJChldi50YXJnZXQpLmNsb3Nlc3QoJy5mYy1zZWxlY3RlZCcpLmxlbmd0aCkgewoJCQkJdGhpcy51bnNlbGVjdEV2ZW50KCk7CgkJCX0KCQl9Cgl9LAoKCgkvKiBEYXkgQ2xpY2sKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFRyaWdnZXJzIGhhbmRsZXJzIHRvICdkYXlDbGljaycKCS8vIFNwYW4gaGFzIHN0YXJ0L2VuZCBvZiB0aGUgY2xpY2tlZCBhcmVhLiBPbmx5IHRoZSBzdGFydCBpcyB1c2VmdWwuCgl0cmlnZ2VyRGF5Q2xpY2s6IGZ1bmN0aW9uKHNwYW4sIGRheUVsLCBldikgewoJCXRoaXMudHJpZ2dlcigKCQkJJ2RheUNsaWNrJywKCQkJZGF5RWwsCgkJCXRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZShzcGFuLnN0YXJ0KSwgLy8gY29udmVydCB0byBjYWxlbmRhcidzIHRpbWV6b25lIGZvciBleHRlcm5hbCBBUEkKCQkJZXYKCQkpOwoJfSwKCgoJLyogRGF0ZSBVdGlscwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gSW5pdGlhbGl6ZXMgaW50ZXJuYWwgdmFyaWFibGVzIHJlbGF0ZWQgdG8gY2FsY3VsYXRpbmcgaGlkZGVuIGRheXMtb2Ytd2VlawoJaW5pdEhpZGRlbkRheXM6IGZ1bmN0aW9uKCkgewoJCXZhciBoaWRkZW5EYXlzID0gdGhpcy5vcHQoJ2hpZGRlbkRheXMnKSB8fCBbXTsgLy8gYXJyYXkgb2YgZGF5LW9mLXdlZWsgaW5kaWNlcyB0aGF0IGFyZSBoaWRkZW4KCQl2YXIgaXNIaWRkZW5EYXlIYXNoID0gW107IC8vIGlzIHRoZSBkYXktb2Ytd2VlayBoaWRkZW4/IChoYXNoIHdpdGggZGF5LW9mLXdlZWstaW5kZXggLT4gYm9vbCkKCQl2YXIgZGF5Q250ID0gMDsKCQl2YXIgaTsKCgkJaWYgKHRoaXMub3B0KCd3ZWVrZW5kcycpID09PSBmYWxzZSkgewoJCQloaWRkZW5EYXlzLnB1c2goMCwgNik7IC8vIDA9c3VuZGF5LCA2PXNhdHVyZGF5CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CgkJCWlmICgKCQkJCSEoaXNIaWRkZW5EYXlIYXNoW2ldID0gJC5pbkFycmF5KGksIGhpZGRlbkRheXMpICE9PSAtMSkKCQkJKSB7CgkJCQlkYXlDbnQrKzsKCQkJfQoJCX0KCgkJaWYgKCFkYXlDbnQpIHsKCQkJdGhyb3cgJ2ludmFsaWQgaGlkZGVuRGF5cyc7IC8vIGFsbCBkYXlzIHdlcmUgaGlkZGVuPyBiYWQuCgkJfQoKCQl0aGlzLmlzSGlkZGVuRGF5SGFzaCA9IGlzSGlkZGVuRGF5SGFzaDsKCX0sCgoKCS8vIElzIHRoZSBjdXJyZW50IGRheSBoaWRkZW4/CgkvLyBgZGF5YCBpcyBhIGRheS1vZi13ZWVrIGluZGV4ICgwLTYpLCBvciBhIE1vbWVudAoJaXNIaWRkZW5EYXk6IGZ1bmN0aW9uKGRheSkgewoJCWlmIChtb21lbnQuaXNNb21lbnQoZGF5KSkgewoJCQlkYXkgPSBkYXkuZGF5KCk7CgkJfQoJCXJldHVybiB0aGlzLmlzSGlkZGVuRGF5SGFzaFtkYXldOwoJfSwKCgoJLy8gSW5jcmVtZW50aW5nIHRoZSBjdXJyZW50IGRheSB1bnRpbCBpdCBpcyBubyBsb25nZXIgYSBoaWRkZW4gZGF5LCByZXR1cm5pbmcgYSBjb3B5LgoJLy8gSWYgdGhlIGluaXRpYWwgdmFsdWUgb2YgYGRhdGVgIGlzIG5vdCBhIGhpZGRlbiBkYXksIGRvbid0IGRvIGFueXRoaW5nLgoJLy8gUGFzcyBgaXNFeGNsdXNpdmVgIGFzIGB0cnVlYCBpZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBhbiBlbmQgZGF0ZS4KCS8vIGBpbmNgIGRlZmF1bHRzIHRvIGAxYCAoaW5jcmVtZW50IG9uZSBkYXkgZm9yd2FyZCBlYWNoIHRpbWUpCglza2lwSGlkZGVuRGF5czogZnVuY3Rpb24oZGF0ZSwgaW5jLCBpc0V4Y2x1c2l2ZSkgewoJCXZhciBvdXQgPSBkYXRlLmNsb25lKCk7CgkJaW5jID0gaW5jIHx8IDE7CgkJd2hpbGUgKAoJCQl0aGlzLmlzSGlkZGVuRGF5SGFzaFsob3V0LmRheSgpICsgKGlzRXhjbHVzaXZlID8gaW5jIDogMCkgKyA3KSAlIDddCgkJKSB7CgkJCW91dC5hZGQoaW5jLCAnZGF5cycpOwoJCX0KCQlyZXR1cm4gb3V0OwoJfSwKCgoJLy8gUmV0dXJucyB0aGUgZGF0ZSByYW5nZSBvZiB0aGUgZnVsbCBkYXlzIHRoZSBnaXZlbiByYW5nZSB2aXN1YWxseSBhcHBlYXJzIHRvIG9jY3VweS4KCS8vIFJldHVybnMgYSBuZXcgcmFuZ2Ugb2JqZWN0LgoJY29tcHV0ZURheVJhbmdlOiBmdW5jdGlvbihyYW5nZSkgewoJCXZhciBzdGFydERheSA9IHJhbmdlLnN0YXJ0LmNsb25lKCkuc3RyaXBUaW1lKCk7IC8vIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRheSB0aGUgcmFuZ2Ugc3RhcnRzCgkJdmFyIGVuZCA9IHJhbmdlLmVuZDsKCQl2YXIgZW5kRGF5ID0gbnVsbDsKCQl2YXIgZW5kVGltZU1TOwoKCQlpZiAoZW5kKSB7CgkJCWVuZERheSA9IGVuZC5jbG9uZSgpLnN0cmlwVGltZSgpOyAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXkgdGhlIHJhbmdlIGV4Y2x1c2l2ZWx5IGVuZHMKCQkJZW5kVGltZU1TID0gK2VuZC50aW1lKCk7IC8vICMgb2YgbWlsbGlzZWNvbmRzIGludG8gYGVuZERheWAKCgkJCS8vIElmIHRoZSBlbmQgdGltZSBpcyBhY3R1YWxseSBpbmNsdXNpdmVseSBwYXJ0IG9mIHRoZSBuZXh0IGRheSBhbmQgaXMgZXF1YWwgdG8gb3IKCQkJLy8gYmV5b25kIHRoZSBuZXh0IGRheSB0aHJlc2hvbGQsIGFkanVzdCB0aGUgZW5kIHRvIGJlIHRoZSBleGNsdXNpdmUgZW5kIG9mIGBlbmREYXlgLgoJCQkvLyBPdGhlcndpc2UsIGxlYXZpbmcgaXQgYXMgaW5jbHVzaXZlIHdpbGwgY2F1c2UgaXQgdG8gZXhjbHVkZSBgZW5kRGF5YC4KCQkJaWYgKGVuZFRpbWVNUyAmJiBlbmRUaW1lTVMgPj0gdGhpcy5uZXh0RGF5VGhyZXNob2xkKSB7CgkJCQllbmREYXkuYWRkKDEsICdkYXlzJyk7CgkJCX0KCQl9CgoJCS8vIElmIG5vIGVuZCB3YXMgc3BlY2lmaWVkLCBvciBpZiBpdCBpcyB3aXRoaW4gYHN0YXJ0RGF5YCBidXQgbm90IHBhc3QgbmV4dERheVRocmVzaG9sZCwKCQkvLyBhc3NpZ24gdGhlIGRlZmF1bHQgZHVyYXRpb24gb2Ygb25lIGRheS4KCQlpZiAoIWVuZCB8fCBlbmREYXkgPD0gc3RhcnREYXkpIHsKCQkJZW5kRGF5ID0gc3RhcnREYXkuY2xvbmUoKS5hZGQoMSwgJ2RheXMnKTsKCQl9CgoJCXJldHVybiB7IHN0YXJ0OiBzdGFydERheSwgZW5kOiBlbmREYXkgfTsKCX0sCgoKCS8vIERvZXMgdGhlIGdpdmVuIGV2ZW50IHZpc3VhbGx5IGFwcGVhciB0byBvY2N1cHkgbW9yZSB0aGFuIG9uZSBkYXk/Cglpc011bHRpRGF5RXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHJhbmdlID0gdGhpcy5jb21wdXRlRGF5UmFuZ2UoZXZlbnQpOyAvLyBldmVudCBpcyByYW5nZS1pc2gKCgkJcmV0dXJuIHJhbmdlLmVuZC5kaWZmKHJhbmdlLnN0YXJ0LCAnZGF5cycpID4gMTsKCX0KCn0pOwoKOzsKCi8qCkVtYm9kaWVzIGEgZGl2IHRoYXQgaGFzIHBvdGVudGlhbCBzY3JvbGxiYXJzCiovCnZhciBTY3JvbGxlciA9IEZDLlNjcm9sbGVyID0gQ2xhc3MuZXh0ZW5kKHsKCgllbDogbnVsbCwgLy8gdGhlIGd1YXJhbnRlZWQgb3V0ZXIgZWxlbWVudAoJc2Nyb2xsRWw6IG51bGwsIC8vIHRoZSBlbGVtZW50IHdpdGggdGhlIHNjcm9sbGJhcnMKCW92ZXJmbG93WDogbnVsbCwKCW92ZXJmbG93WTogbnVsbCwKCgoJY29uc3RydWN0b3I6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCQl0aGlzLm92ZXJmbG93WCA9IG9wdGlvbnMub3ZlcmZsb3dYIHx8IG9wdGlvbnMub3ZlcmZsb3cgfHwgJ2F1dG8nOwoJCXRoaXMub3ZlcmZsb3dZID0gb3B0aW9ucy5vdmVyZmxvd1kgfHwgb3B0aW9ucy5vdmVyZmxvdyB8fCAnYXV0byc7Cgl9LAoKCglyZW5kZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWwgPSB0aGlzLnJlbmRlckVsKCk7CgkJdGhpcy5hcHBseU92ZXJmbG93KCk7Cgl9LAoKCglyZW5kZXJFbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICh0aGlzLnNjcm9sbEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtc2Nyb2xsZXIiPjwvZGl2PicpKTsKCX0sCgoKCS8vIHNldHMgdG8gbmF0dXJhbCBoZWlnaHQsIHVubG9ja3Mgb3ZlcmZsb3cKCWNsZWFyOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldEhlaWdodCgnYXV0bycpOwoJCXRoaXMuYXBwbHlPdmVyZmxvdygpOwoJfSwKCgoJZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbC5yZW1vdmUoKTsKCX0sCgoKCS8vIE92ZXJmbG93CgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCglhcHBseU92ZXJmbG93OiBmdW5jdGlvbigpIHsKCQl0aGlzLnNjcm9sbEVsLmNzcyh7CgkJCSdvdmVyZmxvdy14JzogdGhpcy5vdmVyZmxvd1gsCgkJCSdvdmVyZmxvdy15JzogdGhpcy5vdmVyZmxvd1kKCQl9KTsKCX0sCgoKCS8vIENhdXNlcyBhbnkgJ2F1dG8nIG92ZXJmbG93IHZhbHVlcyB0byByZXNvbHZlcyB0byAnc2Nyb2xsJyBvciAnaGlkZGVuJy4KCS8vIFVzZWZ1bCBmb3IgcHJlc2VydmluZyBzY3JvbGxiYXIgd2lkdGhzIHJlZ2FyZGxlc3Mgb2YgZnV0dXJlIHJlc2l6ZXMuCgkvLyBDYW4gcGFzcyBpbiBzY3JvbGxiYXJXaWR0aHMgZm9yIG9wdGltaXphdGlvbi4KCWxvY2tPdmVyZmxvdzogZnVuY3Rpb24oc2Nyb2xsYmFyV2lkdGhzKSB7CgkJdmFyIG92ZXJmbG93WCA9IHRoaXMub3ZlcmZsb3dYOwoJCXZhciBvdmVyZmxvd1kgPSB0aGlzLm92ZXJmbG93WTsKCgkJc2Nyb2xsYmFyV2lkdGhzID0gc2Nyb2xsYmFyV2lkdGhzIHx8IHRoaXMuZ2V0U2Nyb2xsYmFyV2lkdGhzKCk7CgoJCWlmIChvdmVyZmxvd1ggPT09ICdhdXRvJykgewoJCQlvdmVyZmxvd1ggPSAoCgkJCQkJc2Nyb2xsYmFyV2lkdGhzLnRvcCB8fCBzY3JvbGxiYXJXaWR0aHMuYm90dG9tIHx8IC8vIGhvcml6b250YWwgc2Nyb2xsYmFycz8KCQkJCQkvLyBPUiBzY3JvbGxpbmcgcGFuZSB3aXRoIG1hc3NsZXNzIHNjcm9sbGJhcnM/CgkJCQkJdGhpcy5zY3JvbGxFbFswXS5zY3JvbGxXaWR0aCAtIDEgPiB0aGlzLnNjcm9sbEVsWzBdLmNsaWVudFdpZHRoCgkJCQkJCS8vIHN1YnRyYWN0IDEgYmVjYXVzZSBvZiBJRSBvZmYtYnktb25lIGlzc3VlCgkJCQkpID8gJ3Njcm9sbCcgOiAnaGlkZGVuJzsKCQl9CgoJCWlmIChvdmVyZmxvd1kgPT09ICdhdXRvJykgewoJCQlvdmVyZmxvd1kgPSAoCgkJCQkJc2Nyb2xsYmFyV2lkdGhzLmxlZnQgfHwgc2Nyb2xsYmFyV2lkdGhzLnJpZ2h0IHx8IC8vIHZlcnRpY2FsIHNjcm9sbGJhcnM/CgkJCQkJLy8gT1Igc2Nyb2xsaW5nIHBhbmUgd2l0aCBtYXNzbGVzcyBzY3JvbGxiYXJzPwoJCQkJCXRoaXMuc2Nyb2xsRWxbMF0uc2Nyb2xsSGVpZ2h0IC0gMSA+IHRoaXMuc2Nyb2xsRWxbMF0uY2xpZW50SGVpZ2h0CgkJCQkJCS8vIHN1YnRyYWN0IDEgYmVjYXVzZSBvZiBJRSBvZmYtYnktb25lIGlzc3VlCgkJCQkpID8gJ3Njcm9sbCcgOiAnaGlkZGVuJzsKCQl9CgoJCXRoaXMuc2Nyb2xsRWwuY3NzKHsgJ292ZXJmbG93LXgnOiBvdmVyZmxvd1gsICdvdmVyZmxvdy15Jzogb3ZlcmZsb3dZIH0pOwoJfSwKCgoJLy8gR2V0dGVycyAvIFNldHRlcnMKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCXNldEhlaWdodDogZnVuY3Rpb24oaGVpZ2h0KSB7CgkJdGhpcy5zY3JvbGxFbC5oZWlnaHQoaGVpZ2h0KTsKCX0sCgoKCWdldFNjcm9sbFRvcDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuc2Nyb2xsRWwuc2Nyb2xsVG9wKCk7Cgl9LAoKCglzZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKHRvcCkgewoJCXRoaXMuc2Nyb2xsRWwuc2Nyb2xsVG9wKHRvcCk7Cgl9LAoKCglnZXRDbGllbnRXaWR0aDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuc2Nyb2xsRWxbMF0uY2xpZW50V2lkdGg7Cgl9LAoKCglnZXRDbGllbnRIZWlnaHQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnNjcm9sbEVsWzBdLmNsaWVudEhlaWdodDsKCX0sCgoKCWdldFNjcm9sbGJhcldpZHRoczogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGdldFNjcm9sbGJhcldpZHRocyh0aGlzLnNjcm9sbEVsKTsKCX0KCn0pOwoKOzsKCnZhciBDYWxlbmRhciA9IEZDLkNhbGVuZGFyID0gQ2xhc3MuZXh0ZW5kKHsKCglkaXJEZWZhdWx0czogbnVsbCwgLy8gb3B0aW9uIGRlZmF1bHRzIHJlbGF0ZWQgdG8gTFRSIG9yIFJUTAoJbG9jYWxlRGVmYXVsdHM6IG51bGwsIC8vIG9wdGlvbiBkZWZhdWx0cyByZWxhdGVkIHRvIGN1cnJlbnQgbG9jYWxlCglvdmVycmlkZXM6IG51bGwsIC8vIG9wdGlvbiBvdmVycmlkZXMgZ2l2ZW4gdG8gdGhlIGZ1bGxDYWxlbmRhciBjb25zdHJ1Y3RvcgoJZHluYW1pY092ZXJyaWRlczogbnVsbCwgLy8gb3B0aW9ucyBzZXQgd2l0aCBkeW5hbWljIHNldHRlciBtZXRob2QuIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gdmlldyBvdmVycmlkZXMuCglvcHRpb25zOiBudWxsLCAvLyBhbGwgZGVmYXVsdHMgY29tYmluZWQgd2l0aCBvdmVycmlkZXMKCXZpZXdTcGVjQ2FjaGU6IG51bGwsIC8vIGNhY2hlIG9mIHZpZXcgZGVmaW5pdGlvbnMKCXZpZXc6IG51bGwsIC8vIGN1cnJlbnQgVmlldyBvYmplY3QKCWhlYWRlcjogbnVsbCwKCWxvYWRpbmdMZXZlbDogMCwgLy8gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBsb2FkaW5nIHRhc2tzCgoKCS8vIGEgbG90IG9mIHRoaXMgY2xhc3MnIE9PUCBsb2dpYyBpcyBzY29wZWQgd2l0aGluIHRoaXMgY29uc3RydWN0b3IgZnVuY3Rpb24sCgkvLyBidXQgaW4gdGhlIGZ1dHVyZSwgd3JpdGUgaW5kaXZpZHVhbCBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUuCgljb25zdHJ1Y3RvcjogQ2FsZW5kYXJfY29uc3RydWN0b3IsCgoKCS8vIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgZm9yIGluaXRpYWxpemF0aW9uIGxvZ2ljIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMgYmVlbiBjYWxsZWQKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJfSwKCgoJLy8gQ29tcHV0ZXMgdGhlIGZsYXR0ZW5lZCBvcHRpb25zIGhhc2ggZm9yIHRoZSBjYWxlbmRhciBhbmQgYXNzaWducyB0byBgdGhpcy5vcHRpb25zYC4KCS8vIEFzc3VtZXMgdGhpcy5vdmVycmlkZXMgYW5kIHRoaXMuZHluYW1pY092ZXJyaWRlcyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KCXBvcHVsYXRlT3B0aW9uc0hhc2g6IGZ1bmN0aW9uKCkgewoJCXZhciBsb2NhbGUsIGxvY2FsZURlZmF1bHRzOwoJCXZhciBpc1JUTCwgZGlyRGVmYXVsdHM7CgoJCWxvY2FsZSA9IGZpcnN0RGVmaW5lZCggLy8gZXhwbGljaXQgbG9jYWxlIG9wdGlvbiBnaXZlbj8KCQkJdGhpcy5keW5hbWljT3ZlcnJpZGVzLmxvY2FsZSwKCQkJdGhpcy5vdmVycmlkZXMubG9jYWxlCgkJKTsKCQlsb2NhbGVEZWZhdWx0cyA9IGxvY2FsZU9wdGlvbkhhc2hbbG9jYWxlXTsKCQlpZiAoIWxvY2FsZURlZmF1bHRzKSB7IC8vIGV4cGxpY2l0IGxvY2FsZSBvcHRpb24gbm90IGdpdmVuIG9yIGludmFsaWQ/CgkJCWxvY2FsZSA9IENhbGVuZGFyLmRlZmF1bHRzLmxvY2FsZTsKCQkJbG9jYWxlRGVmYXVsdHMgPSBsb2NhbGVPcHRpb25IYXNoW2xvY2FsZV0gfHwge307CgkJfQoKCQlpc1JUTCA9IGZpcnN0RGVmaW5lZCggLy8gYmFzZWQgb24gb3B0aW9ucyBjb21wdXRlZCBzbyBmYXIsIGlzIGRpcmVjdGlvbiBSVEw/CgkJCXRoaXMuZHluYW1pY092ZXJyaWRlcy5pc1JUTCwKCQkJdGhpcy5vdmVycmlkZXMuaXNSVEwsCgkJCWxvY2FsZURlZmF1bHRzLmlzUlRMLAoJCQlDYWxlbmRhci5kZWZhdWx0cy5pc1JUTAoJCSk7CgkJZGlyRGVmYXVsdHMgPSBpc1JUTCA/IENhbGVuZGFyLnJ0bERlZmF1bHRzIDoge307CgoJCXRoaXMuZGlyRGVmYXVsdHMgPSBkaXJEZWZhdWx0czsKCQl0aGlzLmxvY2FsZURlZmF1bHRzID0gbG9jYWxlRGVmYXVsdHM7CgkJdGhpcy5vcHRpb25zID0gbWVyZ2VPcHRpb25zKFsgLy8gbWVyZ2UgZGVmYXVsdHMgYW5kIG92ZXJyaWRlcy4gbG93ZXN0IHRvIGhpZ2hlc3QgcHJlY2VkZW5jZQoJCQlDYWxlbmRhci5kZWZhdWx0cywgLy8gZ2xvYmFsIGRlZmF1bHRzCgkJCWRpckRlZmF1bHRzLAoJCQlsb2NhbGVEZWZhdWx0cywKCQkJdGhpcy5vdmVycmlkZXMsCgkJCXRoaXMuZHluYW1pY092ZXJyaWRlcwoJCV0pOwoJCXBvcHVsYXRlSW5zdGFuY2VDb21wdXRhYmxlT3B0aW9ucyh0aGlzLm9wdGlvbnMpOyAvLyBmaWxsIGluIGdhcHMgd2l0aCBjb21wdXRlZCBvcHRpb25zCgl9LAoKCgkvLyBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjcmVhdGUgYSB2aWV3LiBXaWxsIHVzZSBhIGNhY2hlLgoJZ2V0Vmlld1NwZWM6IGZ1bmN0aW9uKHZpZXdUeXBlKSB7CgkJdmFyIGNhY2hlID0gdGhpcy52aWV3U3BlY0NhY2hlOwoKCQlyZXR1cm4gY2FjaGVbdmlld1R5cGVdIHx8IChjYWNoZVt2aWV3VHlwZV0gPSB0aGlzLmJ1aWxkVmlld1NwZWModmlld1R5cGUpKTsKCX0sCgoKCS8vIEdpdmVuIGEgZHVyYXRpb24gc2luZ3VsYXIgdW5pdCwgbGlrZSAid2VlayIgb3IgImRheSIsIGZpbmRzIGEgbWF0Y2hpbmcgdmlldyBzcGVjLgoJLy8gUHJlZmVyZW5jZSBpcyBnaXZlbiB0byB2aWV3cyB0aGF0IGhhdmUgY29ycmVzcG9uZGluZyBidXR0b25zLgoJZ2V0VW5pdFZpZXdTcGVjOiBmdW5jdGlvbih1bml0KSB7CgkJdmFyIHZpZXdUeXBlczsKCQl2YXIgaTsKCQl2YXIgc3BlYzsKCgkJaWYgKCQuaW5BcnJheSh1bml0LCBpbnRlcnZhbFVuaXRzKSAhPSAtMSkgewoKCQkJLy8gcHV0IHZpZXdzIHRoYXQgaGF2ZSBidXR0b25zIGZpcnN0LiB0aGVyZSB3aWxsIGJlIGR1cGxpY2F0ZXMsIGJ1dCBvaCB3ZWxsCgkJCXZpZXdUeXBlcyA9IHRoaXMuaGVhZGVyLmdldFZpZXdzV2l0aEJ1dHRvbnMoKTsKCQkJJC5lYWNoKEZDLnZpZXdzLCBmdW5jdGlvbih2aWV3VHlwZSkgeyAvLyBhbGwgdmlld3MKCQkJCXZpZXdUeXBlcy5wdXNoKHZpZXdUeXBlKTsKCQkJfSk7CgoJCQlmb3IgKGkgPSAwOyBpIDwgdmlld1R5cGVzLmxlbmd0aDsgaSsrKSB7CgkJCQlzcGVjID0gdGhpcy5nZXRWaWV3U3BlYyh2aWV3VHlwZXNbaV0pOwoJCQkJaWYgKHNwZWMpIHsKCQkJCQlpZiAoc3BlYy5zaW5nbGVVbml0ID09IHVuaXQpIHsKCQkJCQkJcmV0dXJuIHNwZWM7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfSwKCgoJLy8gQnVpbGRzIGFuIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjcmVhdGUgYSBnaXZlbiB2aWV3CglidWlsZFZpZXdTcGVjOiBmdW5jdGlvbihyZXF1ZXN0ZWRWaWV3VHlwZSkgewoJCXZhciB2aWV3T3ZlcnJpZGVzID0gdGhpcy5vdmVycmlkZXMudmlld3MgfHwge307CgkJdmFyIHNwZWNDaGFpbiA9IFtdOyAvLyBmb3IgdGhlIHZpZXcuIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5CgkJdmFyIGRlZmF1bHRzQ2hhaW4gPSBbXTsgLy8gZm9yIHRoZSB2aWV3LiBsb3dlc3QgdG8gaGlnaGVzdCBwcmlvcml0eQoJCXZhciBvdmVycmlkZXNDaGFpbiA9IFtdOyAvLyBmb3IgdGhlIHZpZXcuIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5CgkJdmFyIHZpZXdUeXBlID0gcmVxdWVzdGVkVmlld1R5cGU7CgkJdmFyIHNwZWM7IC8vIGZvciB0aGUgdmlldwoJCXZhciBvdmVycmlkZXM7IC8vIGZvciB0aGUgdmlldwoJCXZhciBkdXJhdGlvbjsKCQl2YXIgdW5pdDsKCgkJLy8gaXRlcmF0ZSBmcm9tIHRoZSBzcGVjaWZpYyB2aWV3IGRlZmluaXRpb24gdG8gYSBtb3JlIGdlbmVyYWwgb25lIHVudGlsIHdlIGhpdCBhbiBhY3R1YWwgVmlldyBjbGFzcwoJCXdoaWxlICh2aWV3VHlwZSkgewoJCQlzcGVjID0gZmNWaWV3c1t2aWV3VHlwZV07CgkJCW92ZXJyaWRlcyA9IHZpZXdPdmVycmlkZXNbdmlld1R5cGVdOwoJCQl2aWV3VHlwZSA9IG51bGw7IC8vIGNsZWFyLiBtaWdodCByZXBvcHVsYXRlIGZvciBhbm90aGVyIGl0ZXJhdGlvbgoKCQkJaWYgKHR5cGVvZiBzcGVjID09PSAnZnVuY3Rpb24nKSB7IC8vIFRPRE86IGRlcHJlY2F0ZQoJCQkJc3BlYyA9IHsgJ2NsYXNzJzogc3BlYyB9OwoJCQl9CgoJCQlpZiAoc3BlYykgewoJCQkJc3BlY0NoYWluLnVuc2hpZnQoc3BlYyk7CgkJCQlkZWZhdWx0c0NoYWluLnVuc2hpZnQoc3BlYy5kZWZhdWx0cyB8fCB7fSk7CgkJCQlkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IHNwZWMuZHVyYXRpb247CgkJCQl2aWV3VHlwZSA9IHZpZXdUeXBlIHx8IHNwZWMudHlwZTsKCQkJfQoKCQkJaWYgKG92ZXJyaWRlcykgewoJCQkJb3ZlcnJpZGVzQ2hhaW4udW5zaGlmdChvdmVycmlkZXMpOyAvLyB2aWV3LXNwZWNpZmljIG9wdGlvbiBoYXNoZXMgaGF2ZSBvcHRpb25zIGF0IHplcm8tbGV2ZWwKCQkJCWR1cmF0aW9uID0gZHVyYXRpb24gfHwgb3ZlcnJpZGVzLmR1cmF0aW9uOwoJCQkJdmlld1R5cGUgPSB2aWV3VHlwZSB8fCBvdmVycmlkZXMudHlwZTsKCQkJfQoJCX0KCgkJc3BlYyA9IG1lcmdlUHJvcHMoc3BlY0NoYWluKTsKCQlzcGVjLnR5cGUgPSByZXF1ZXN0ZWRWaWV3VHlwZTsKCQlpZiAoIXNwZWNbJ2NsYXNzJ10pIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKGR1cmF0aW9uKSB7CgkJCWR1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKGR1cmF0aW9uKTsKCQkJaWYgKGR1cmF0aW9uLnZhbHVlT2YoKSkgeyAvLyB2YWxpZD8KCQkJCXNwZWMuZHVyYXRpb24gPSBkdXJhdGlvbjsKCQkJCXVuaXQgPSBjb21wdXRlSW50ZXJ2YWxVbml0KGR1cmF0aW9uKTsKCgkJCQkvLyB2aWV3IGlzIGEgc2luZ2xlLXVuaXQgZHVyYXRpb24sIGxpa2UgIndlZWsiIG9yICJkYXkiCgkJCQkvLyBpbmNvcnBvcmF0ZSBvcHRpb25zIGZvciB0aGlzLiBsb3dlc3QgcHJpb3JpdHkKCQkJCWlmIChkdXJhdGlvbi5hcyh1bml0KSA9PT0gMSkgewoJCQkJCXNwZWMuc2luZ2xlVW5pdCA9IHVuaXQ7CgkJCQkJb3ZlcnJpZGVzQ2hhaW4udW5zaGlmdCh2aWV3T3ZlcnJpZGVzW3VuaXRdIHx8IHt9KTsKCQkJCX0KCQkJfQoJCX0KCgkJc3BlYy5kZWZhdWx0cyA9IG1lcmdlT3B0aW9ucyhkZWZhdWx0c0NoYWluKTsKCQlzcGVjLm92ZXJyaWRlcyA9IG1lcmdlT3B0aW9ucyhvdmVycmlkZXNDaGFpbik7CgoJCXRoaXMuYnVpbGRWaWV3U3BlY09wdGlvbnMoc3BlYyk7CgkJdGhpcy5idWlsZFZpZXdTcGVjQnV0dG9uVGV4dChzcGVjLCByZXF1ZXN0ZWRWaWV3VHlwZSk7CgoJCXJldHVybiBzcGVjOwoJfSwKCgoJLy8gQnVpbGRzIGFuZCBhc3NpZ25zIGEgdmlldyBzcGVjJ3Mgb3B0aW9ucyBvYmplY3QgZnJvbSBpdHMgYWxyZWFkeS1hc3NpZ25lZCBkZWZhdWx0cyBhbmQgb3ZlcnJpZGVzCglidWlsZFZpZXdTcGVjT3B0aW9uczogZnVuY3Rpb24oc3BlYykgewoJCXNwZWMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhbIC8vIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5CgkJCUNhbGVuZGFyLmRlZmF1bHRzLCAvLyBnbG9iYWwgZGVmYXVsdHMKCQkJc3BlYy5kZWZhdWx0cywgLy8gdmlldydzIGRlZmF1bHRzIChmcm9tIFZpZXdTdWJjbGFzcy5kZWZhdWx0cykKCQkJdGhpcy5kaXJEZWZhdWx0cywKCQkJdGhpcy5sb2NhbGVEZWZhdWx0cywgLy8gbG9jYWxlIGFuZCBkaXIgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdmlldydzIGRlZmF1bHRzIQoJCQl0aGlzLm92ZXJyaWRlcywgLy8gY2FsZW5kYXIncyBvdmVycmlkZXMgKG9wdGlvbnMgZ2l2ZW4gdG8gY29uc3RydWN0b3IpCgkJCXNwZWMub3ZlcnJpZGVzLCAvLyB2aWV3J3Mgb3ZlcnJpZGVzICh2aWV3LXNwZWNpZmljIG9wdGlvbnMpCgkJCXRoaXMuZHluYW1pY092ZXJyaWRlcyAvLyBkeW5hbWljYWxseSBzZXQgdmlhIHNldHRlci4gaGlnaGVzdCBwcmVjZWRlbmNlCgkJXSk7CgkJcG9wdWxhdGVJbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zKHNwZWMub3B0aW9ucyk7Cgl9LAoKCgkvLyBDb21wdXRlcyBhbmQgYXNzaWducyBhIHZpZXcgc3BlYydzIGJ1dHRvblRleHQtcmVsYXRlZCBvcHRpb25zCglidWlsZFZpZXdTcGVjQnV0dG9uVGV4dDogZnVuY3Rpb24oc3BlYywgcmVxdWVzdGVkVmlld1R5cGUpIHsKCgkJLy8gZ2l2ZW4gYW4gb3B0aW9ucyBvYmplY3Qgd2l0aCBhIHBvc3NpYmxlIGBidXR0b25UZXh0YCBoYXNoLCBsb29rdXAgdGhlIGJ1dHRvblRleHQgZm9yIHRoZQoJCS8vIHJlcXVlc3RlZCB2aWV3LCBmYWxsaW5nIGJhY2sgdG8gYSBnZW5lcmljIHVuaXQgZW50cnkgbGlrZSAid2VlayIgb3IgImRheSIKCQlmdW5jdGlvbiBxdWVyeUJ1dHRvblRleHQob3B0aW9ucykgewoJCQl2YXIgYnV0dG9uVGV4dCA9IG9wdGlvbnMuYnV0dG9uVGV4dCB8fCB7fTsKCQkJcmV0dXJuIGJ1dHRvblRleHRbcmVxdWVzdGVkVmlld1R5cGVdIHx8CgkJCQkvLyB2aWV3IGNhbiBkZWNpZGUgdG8gbG9vayB1cCBhIGNlcnRhaW4ga2V5CgkJCQkoc3BlYy5idXR0b25UZXh0S2V5ID8gYnV0dG9uVGV4dFtzcGVjLmJ1dHRvblRleHRLZXldIDogbnVsbCkgfHwKCQkJCS8vIGEga2V5IGxpa2UgIm1vbnRoIgoJCQkJKHNwZWMuc2luZ2xlVW5pdCA/IGJ1dHRvblRleHRbc3BlYy5zaW5nbGVVbml0XSA6IG51bGwpOwoJCX0KCgkJLy8gaGlnaGVzdCB0byBsb3dlc3QgcHJpb3JpdHkKCQlzcGVjLmJ1dHRvblRleHRPdmVycmlkZSA9CgkJCXF1ZXJ5QnV0dG9uVGV4dCh0aGlzLmR5bmFtaWNPdmVycmlkZXMpIHx8CgkJCXF1ZXJ5QnV0dG9uVGV4dCh0aGlzLm92ZXJyaWRlcykgfHwgLy8gY29uc3RydWN0b3Itc3BlY2lmaWVkIGJ1dHRvblRleHQgbG9va3VwIGhhc2ggdGFrZXMgcHJlY2VkZW5jZQoJCQlzcGVjLm92ZXJyaWRlcy5idXR0b25UZXh0OyAvLyBgYnV0dG9uVGV4dGAgZm9yIHZpZXctc3BlY2lmaWMgb3B0aW9ucyBpcyBhIHN0cmluZwoKCQkvLyBoaWdoZXN0IHRvIGxvd2VzdCBwcmlvcml0eS4gbWlycm9ycyBidWlsZFZpZXdTcGVjT3B0aW9ucwoJCXNwZWMuYnV0dG9uVGV4dERlZmF1bHQgPQoJCQlxdWVyeUJ1dHRvblRleHQodGhpcy5sb2NhbGVEZWZhdWx0cykgfHwKCQkJcXVlcnlCdXR0b25UZXh0KHRoaXMuZGlyRGVmYXVsdHMpIHx8CgkJCXNwZWMuZGVmYXVsdHMuYnV0dG9uVGV4dCB8fCAvLyBhIHNpbmdsZSBzdHJpbmcuIGZyb20gVmlld1N1YmNsYXNzLmRlZmF1bHRzCgkJCXF1ZXJ5QnV0dG9uVGV4dChDYWxlbmRhci5kZWZhdWx0cykgfHwKCQkJKHNwZWMuZHVyYXRpb24gPyB0aGlzLmh1bWFuaXplRHVyYXRpb24oc3BlYy5kdXJhdGlvbikgOiBudWxsKSB8fCAvLyBsaWtlICIzIGRheXMiCgkJCXJlcXVlc3RlZFZpZXdUeXBlOyAvLyBmYWxsIGJhY2sgdG8gZ2l2ZW4gdmlldyBuYW1lCgl9LAoKCgkvLyBHaXZlbiBhIHZpZXcgbmFtZSBmb3IgYSBjdXN0b20gdmlldyBvciBhIHN0YW5kYXJkIHZpZXcsIGNyZWF0ZXMgYSByZWFkeS10by1nbyBWaWV3IG9iamVjdAoJaW5zdGFudGlhdGVWaWV3OiBmdW5jdGlvbih2aWV3VHlwZSkgewoJCXZhciBzcGVjID0gdGhpcy5nZXRWaWV3U3BlYyh2aWV3VHlwZSk7CgoJCXJldHVybiBuZXcgc3BlY1snY2xhc3MnXSh0aGlzLCB2aWV3VHlwZSwgc3BlYy5vcHRpb25zLCBzcGVjLmR1cmF0aW9uKTsKCX0sCgoKCS8vIFJldHVybnMgYSBib29sZWFuIGFib3V0IHdoZXRoZXIgdGhlIHZpZXcgaXMgb2theSB0byBpbnN0YW50aWF0ZSBhdCBzb21lIHBvaW50Cglpc1ZhbGlkVmlld1R5cGU6IGZ1bmN0aW9uKHZpZXdUeXBlKSB7CgkJcmV0dXJuIEJvb2xlYW4odGhpcy5nZXRWaWV3U3BlYyh2aWV3VHlwZSkpOwoJfSwKCgoJLy8gU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGFueSB0eXBlIG9mIGFzeW5jIGRhdGEgZmV0Y2hpbmcgYmVnaW5zCglwdXNoTG9hZGluZzogZnVuY3Rpb24oKSB7CgkJaWYgKCEodGhpcy5sb2FkaW5nTGV2ZWwrKykpIHsKCQkJdGhpcy50cmlnZ2VyKCdsb2FkaW5nJywgbnVsbCwgdHJ1ZSwgdGhpcy52aWV3KTsKCQl9Cgl9LAoKCgkvLyBTaG91bGQgYmUgY2FsbGVkIHdoZW4gYW55IHR5cGUgb2YgYXN5bmMgZGF0YSBmZXRjaGluZyBjb21wbGV0ZXMKCXBvcExvYWRpbmc6IGZ1bmN0aW9uKCkgewoJCWlmICghKC0tdGhpcy5sb2FkaW5nTGV2ZWwpKSB7CgkJCXRoaXMudHJpZ2dlcignbG9hZGluZycsIG51bGwsIGZhbHNlLCB0aGlzLnZpZXcpOwoJCX0KCX0sCgoKCS8vIEdpdmVuIGFyZ3VtZW50cyB0byB0aGUgc2VsZWN0IG1ldGhvZCBpbiB0aGUgQVBJLCByZXR1cm5zIGEgc3BhbiAodW56b25lZCBzdGFydC9lbmQgYW5kIG90aGVyIGluZm8pCglidWlsZFNlbGVjdFNwYW46IGZ1bmN0aW9uKHpvbmVkU3RhcnRJbnB1dCwgem9uZWRFbmRJbnB1dCkgewoJCXZhciBzdGFydCA9IHRoaXMubW9tZW50KHpvbmVkU3RhcnRJbnB1dCkuc3RyaXBab25lKCk7CgkJdmFyIGVuZDsKCgkJaWYgKHpvbmVkRW5kSW5wdXQpIHsKCQkJZW5kID0gdGhpcy5tb21lbnQoem9uZWRFbmRJbnB1dCkuc3RyaXBab25lKCk7CgkJfQoJCWVsc2UgaWYgKHN0YXJ0Lmhhc1RpbWUoKSkgewoJCQllbmQgPSBzdGFydC5jbG9uZSgpLmFkZCh0aGlzLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pOwoJCX0KCQllbHNlIHsKCQkJZW5kID0gc3RhcnQuY2xvbmUoKS5hZGQodGhpcy5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbik7CgkJfQoKCQlyZXR1cm4geyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH07Cgl9Cgp9KTsKCgpDYWxlbmRhci5taXhpbihFbWl0dGVyTWl4aW4pOwoKCmZ1bmN0aW9uIENhbGVuZGFyX2NvbnN0cnVjdG9yKGVsZW1lbnQsIG92ZXJyaWRlcykgewoJdmFyIHQgPSB0aGlzOwoKCgkvLyBFeHBvcnRzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCXQucmVuZGVyID0gcmVuZGVyOwoJdC5kZXN0cm95ID0gZGVzdHJveTsKCXQucmVmZXRjaEV2ZW50cyA9IHJlZmV0Y2hFdmVudHM7Cgl0LnJlZmV0Y2hFdmVudFNvdXJjZXMgPSByZWZldGNoRXZlbnRTb3VyY2VzOwoJdC5yZXBvcnRFdmVudHMgPSByZXBvcnRFdmVudHM7Cgl0LnJlcG9ydEV2ZW50Q2hhbmdlID0gcmVwb3J0RXZlbnRDaGFuZ2U7Cgl0LnJlcmVuZGVyRXZlbnRzID0gcmVuZGVyRXZlbnRzOyAvLyBgcmVuZGVyRXZlbnRzYCBzZXJ2ZXMgYXMgYSByZXJlbmRlci4gYW4gQVBJIG1ldGhvZAoJdC5jaGFuZ2VWaWV3ID0gcmVuZGVyVmlldzsgLy8gYHJlbmRlclZpZXdgIHdpbGwgc3dpdGNoIHRvIGFub3RoZXIgdmlldwoJdC5zZWxlY3QgPSBzZWxlY3Q7Cgl0LnVuc2VsZWN0ID0gdW5zZWxlY3Q7Cgl0LnByZXYgPSBwcmV2OwoJdC5uZXh0ID0gbmV4dDsKCXQucHJldlllYXIgPSBwcmV2WWVhcjsKCXQubmV4dFllYXIgPSBuZXh0WWVhcjsKCXQudG9kYXkgPSB0b2RheTsKCXQuZ290b0RhdGUgPSBnb3RvRGF0ZTsKCXQuaW5jcmVtZW50RGF0ZSA9IGluY3JlbWVudERhdGU7Cgl0Lnpvb21UbyA9IHpvb21UbzsKCXQuZ2V0RGF0ZSA9IGdldERhdGU7Cgl0LmdldENhbGVuZGFyID0gZ2V0Q2FsZW5kYXI7Cgl0LmdldFZpZXcgPSBnZXRWaWV3OwoJdC5vcHRpb24gPSBvcHRpb247IC8vIGdldHRlci9zZXR0ZXIgbWV0aG9kCgl0LnRyaWdnZXIgPSB0cmlnZ2VyOwoKCgkvLyBPcHRpb25zCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCXQuZHluYW1pY092ZXJyaWRlcyA9IHt9OwoJdC52aWV3U3BlY0NhY2hlID0ge307Cgl0Lm9wdGlvbkhhbmRsZXJzID0ge307IC8vIGZvciBDYWxlbmRhci5vcHRpb25zLmpzCgl0Lm92ZXJyaWRlcyA9ICQuZXh0ZW5kKHt9LCBvdmVycmlkZXMpOyAvLyBtYWtlIGEgY29weQoKCXQucG9wdWxhdGVPcHRpb25zSGFzaCgpOyAvLyBzZXRzIHRoaXMub3B0aW9ucwoKCgoJLy8gTG9jYWxlLWRhdGEgSW50ZXJuYWxzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gQXBwbHkgb3ZlcnJpZGVzIHRvIHRoZSBjdXJyZW50IGxvY2FsZSdzIGRhdGEKCgl2YXIgbG9jYWxlRGF0YTsKCgkvLyBDYWxsZWQgaW1tZWRpYXRlbHksIGFuZCB3aGVuIGFueSBvZiB0aGUgb3B0aW9ucyBjaGFuZ2UuCgkvLyBIYXBwZW5zIGJlZm9yZSBhbnkgaW50ZXJuYWwgb2JqZWN0cyByZWJ1aWxkIG9yIHJlcmVuZGVyLCBiZWNhdXNlIHRoaXMgaXMgdmVyeSBjb3JlLgoJdC5iaW5kT3B0aW9ucyhbCgkJJ2xvY2FsZScsICdtb250aE5hbWVzJywgJ21vbnRoTmFtZXNTaG9ydCcsICdkYXlOYW1lcycsICdkYXlOYW1lc1Nob3J0JywgJ2ZpcnN0RGF5JywgJ3dlZWtOdW1iZXJDYWxjdWxhdGlvbicKCV0sIGZ1bmN0aW9uKGxvY2FsZSwgbW9udGhOYW1lcywgbW9udGhOYW1lc1Nob3J0LCBkYXlOYW1lcywgZGF5TmFtZXNTaG9ydCwgZmlyc3REYXksIHdlZWtOdW1iZXJDYWxjdWxhdGlvbikgewoKCQkvLyBub3JtYWxpemUKCQlpZiAod2Vla051bWJlckNhbGN1bGF0aW9uID09PSAnaXNvJykgewoJCQl3ZWVrTnVtYmVyQ2FsY3VsYXRpb24gPSAnSVNPJzsgLy8gbm9ybWFsaXplCgkJfQoKCQlsb2NhbGVEYXRhID0gY3JlYXRlT2JqZWN0KCAvLyBtYWtlIGEgY2hlYXAgY29weQoJCQlnZXRNb21lbnRMb2NhbGVEYXRhKGxvY2FsZSkgLy8gd2lsbCBmYWxsIGJhY2sgdG8gZW4KCQkpOwoKCQlpZiAobW9udGhOYW1lcykgewoJCQlsb2NhbGVEYXRhLl9tb250aHMgPSBtb250aE5hbWVzOwoJCX0KCQlpZiAobW9udGhOYW1lc1Nob3J0KSB7CgkJCWxvY2FsZURhdGEuX21vbnRoc1Nob3J0ID0gbW9udGhOYW1lc1Nob3J0OwoJCX0KCQlpZiAoZGF5TmFtZXMpIHsKCQkJbG9jYWxlRGF0YS5fd2Vla2RheXMgPSBkYXlOYW1lczsKCQl9CgkJaWYgKGRheU5hbWVzU2hvcnQpIHsKCQkJbG9jYWxlRGF0YS5fd2Vla2RheXNTaG9ydCA9IGRheU5hbWVzU2hvcnQ7CgkJfQoKCQlpZiAoZmlyc3REYXkgPT0gbnVsbCAmJiB3ZWVrTnVtYmVyQ2FsY3VsYXRpb24gPT09ICdJU08nKSB7CgkJCWZpcnN0RGF5ID0gMTsKCQl9CgkJaWYgKGZpcnN0RGF5ICE9IG51bGwpIHsKCQkJdmFyIF93ZWVrID0gY3JlYXRlT2JqZWN0KGxvY2FsZURhdGEuX3dlZWspOyAvLyBfd2VlazogeyBkb3c6ICMgfQoJCQlfd2Vlay5kb3cgPSBmaXJzdERheTsKCQkJbG9jYWxlRGF0YS5fd2VlayA9IF93ZWVrOwoJCX0KCgkJaWYgKCAvLyB3aGl0ZWxpc3QgY2VydGFpbiBraW5kcyBvZiBpbnB1dAoJCQl3ZWVrTnVtYmVyQ2FsY3VsYXRpb24gPT09ICdJU08nIHx8CgkJCXdlZWtOdW1iZXJDYWxjdWxhdGlvbiA9PT0gJ2xvY2FsJyB8fAoJCQl0eXBlb2Ygd2Vla051bWJlckNhbGN1bGF0aW9uID09PSAnZnVuY3Rpb24nCgkJKSB7CgkJCWxvY2FsZURhdGEuX2Z1bGxDYWxlbmRhcl93ZWVrQ2FsYyA9IHdlZWtOdW1iZXJDYWxjdWxhdGlvbjsgLy8gbW9tZW50LWV4dCB3aWxsIGtub3cgd2hhdCB0byBkbyB3aXRoIGl0CgkJfQoKCQkvLyBJZiB0aGUgaW50ZXJuYWwgY3VycmVudCBkYXRlIG9iamVjdCBhbHJlYWR5IGV4aXN0cywgbW92ZSB0byBuZXcgbG9jYWxlLgoJCS8vIFdlIGRvIE5PVCBuZWVkIHRvIGRvIHRoaXMgdGVjaG5pcXVlIGZvciBldmVudCBkYXRlcywgYmVjYXVzZSB0aGlzIGhhcHBlbnMgd2hlbiBjb252ZXJ0aW5nIHRvICJzZWdtZW50cyIuCgkJaWYgKGRhdGUpIHsKCQkJbG9jYWxpemVNb21lbnQoZGF0ZSk7IC8vIHNldHMgdG8gbG9jYWxlRGF0YQoJCX0KCX0pOwoKCgkvLyBDYWxlbmRhci1zcGVjaWZpYyBEYXRlIFV0aWxpdGllcwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoJdC5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbiA9IG1vbWVudC5kdXJhdGlvbih0Lm9wdGlvbnMuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pOwoJdC5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKHQub3B0aW9ucy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTsKCgoJLy8gQnVpbGRzIGEgbW9tZW50IHVzaW5nIHRoZSBzZXR0aW5ncyBvZiB0aGUgY3VycmVudCBjYWxlbmRhcjogdGltZXpvbmUgYW5kIGxvY2FsZS4KCS8vIEFjY2VwdHMgYW55dGhpbmcgdGhlIHZhbmlsbGEgbW9tZW50KCkgY29uc3RydWN0b3IgYWNjZXB0cy4KCXQubW9tZW50ID0gZnVuY3Rpb24oKSB7CgkJdmFyIG1vbTsKCgkJaWYgKHQub3B0aW9ucy50aW1lem9uZSA9PT0gJ2xvY2FsJykgewoJCQltb20gPSBGQy5tb21lbnQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKCgkJCS8vIEZvcmNlIHRoZSBtb21lbnQgdG8gYmUgbG9jYWwsIGJlY2F1c2UgRkMubW9tZW50IGRvZXNuJ3QgZ3VhcmFudGVlIGl0LgoJCQlpZiAobW9tLmhhc1RpbWUoKSkgeyAvLyBkb24ndCBnaXZlIGFtYmlndW91c2x5LXRpbWVkIG1vbWVudHMgYSBsb2NhbCB6b25lCgkJCQltb20ubG9jYWwoKTsKCQkJfQoJCX0KCQllbHNlIGlmICh0Lm9wdGlvbnMudGltZXpvbmUgPT09ICdVVEMnKSB7CgkJCW1vbSA9IEZDLm1vbWVudC51dGMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgLy8gcHJvY2VzcyBhcyBVVEMKCQl9CgkJZWxzZSB7CgkJCW1vbSA9IEZDLm1vbWVudC5wYXJzZVpvbmUuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgLy8gbGV0IHRoZSBpbnB1dCBkZWNpZGUgdGhlIHpvbmUKCQl9CgoJCWxvY2FsaXplTW9tZW50KG1vbSk7CgoJCXJldHVybiBtb207Cgl9OwoKCgkvLyBVcGRhdGVzIHRoZSBnaXZlbiBtb21lbnQncyBsb2NhbGUgc2V0dGluZ3MgdG8gdGhlIGN1cnJlbnQgY2FsZW5kYXIgbG9jYWxlIHNldHRpbmdzLgoJZnVuY3Rpb24gbG9jYWxpemVNb21lbnQobW9tKSB7CgkJbW9tLl9sb2NhbGUgPSBsb2NhbGVEYXRhOwoJfQoJdC5sb2NhbGl6ZU1vbWVudCA9IGxvY2FsaXplTW9tZW50OwoKCgkvLyBSZXR1cm5zIGEgYm9vbGVhbiBhYm91dCB3aGV0aGVyIG9yIG5vdCB0aGUgY2FsZW5kYXIga25vd3MgaG93IHRvIGNhbGN1bGF0ZQoJLy8gdGhlIHRpbWV6b25lIG9mZnNldCBvZiBhcmJpdHJhcnkgZGF0ZXMgaW4gdGhlIGN1cnJlbnQgdGltZXpvbmUuCgl0LmdldElzQW1iaWdUaW1lem9uZSA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0Lm9wdGlvbnMudGltZXpvbmUgIT09ICdsb2NhbCcgJiYgdC5vcHRpb25zLnRpbWV6b25lICE9PSAnVVRDJzsKCX07CgoKCS8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBnaXZlbiBkYXRlIGluIHRoZSBjdXJyZW50IHRpbWV6b25lLiBIYXMgbm8gZWZmZWN0IG9uIGRhdGVzIHdpdGhvdXQgdGltZXMuCgl0LmFwcGx5VGltZXpvbmUgPSBmdW5jdGlvbihkYXRlKSB7CgkJaWYgKCFkYXRlLmhhc1RpbWUoKSkgewoJCQlyZXR1cm4gZGF0ZS5jbG9uZSgpOwoJCX0KCgkJdmFyIHpvbmVkRGF0ZSA9IHQubW9tZW50KGRhdGUudG9BcnJheSgpKTsKCQl2YXIgdGltZUFkanVzdCA9IGRhdGUudGltZSgpIC0gem9uZWREYXRlLnRpbWUoKTsKCQl2YXIgYWRqdXN0ZWRab25lZERhdGU7CgoJCS8vIFNhZmFyaSBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhpcyBjb2Vyc2lvbiB3aGVuIG5lYXIgRFNULiBBZGp1c3QgaWYgbmVjZXNzYXJ5LiAoYnVnICMyMzk2KQoJCWlmICh0aW1lQWRqdXN0KSB7IC8vIGlzIHRoZSB0aW1lIHJlc3VsdCBkaWZmZXJlbnQgdGhhbiBleHBlY3RlZD8KCQkJYWRqdXN0ZWRab25lZERhdGUgPSB6b25lZERhdGUuY2xvbmUoKS5hZGQodGltZUFkanVzdCk7IC8vIGFkZCBtaWxsaXNlY29uZHMKCQkJaWYgKGRhdGUudGltZSgpIC0gYWRqdXN0ZWRab25lZERhdGUudGltZSgpID09PSAwKSB7IC8vIGRvZXMgaXQgbWF0Y2ggcGVyZmVjdGx5IG5vdz8KCQkJCXpvbmVkRGF0ZSA9IGFkanVzdGVkWm9uZWREYXRlOwoJCQl9CgkJfQoKCQlyZXR1cm4gem9uZWREYXRlOwoJfTsKCgoJLy8gUmV0dXJucyBhIG1vbWVudCBmb3IgdGhlIGN1cnJlbnQgZGF0ZSwgYXMgZGVmaW5lZCBieSB0aGUgY2xpZW50J3MgY29tcHV0ZXIgb3IgZnJvbSB0aGUgYG5vd2Agb3B0aW9uLgoJLy8gV2lsbCByZXR1cm4gYW4gbW9tZW50IHdpdGggYW4gYW1iaWd1b3VzIHRpbWV6b25lLgoJdC5nZXROb3cgPSBmdW5jdGlvbigpIHsKCQl2YXIgbm93ID0gdC5vcHRpb25zLm5vdzsKCQlpZiAodHlwZW9mIG5vdyA9PT0gJ2Z1bmN0aW9uJykgewoJCQlub3cgPSBub3coKTsKCQl9CgkJcmV0dXJuIHQubW9tZW50KG5vdykuc3RyaXBab25lKCk7Cgl9OwoKCgkvLyBHZXQgYW4gZXZlbnQncyBub3JtYWxpemVkIGVuZCBkYXRlLiBJZiBub3QgcHJlc2VudCwgY2FsY3VsYXRlIGl0IGZyb20gdGhlIGRlZmF1bHRzLgoJdC5nZXRFdmVudEVuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkJaWYgKGV2ZW50LmVuZCkgewoJCQlyZXR1cm4gZXZlbnQuZW5kLmNsb25lKCk7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gdC5nZXREZWZhdWx0RXZlbnRFbmQoZXZlbnQuYWxsRGF5LCBldmVudC5zdGFydCk7CgkJfQoJfTsKCgoJLy8gR2l2ZW4gYW4gZXZlbnQncyBhbGxEYXkgc3RhdHVzIGFuZCBzdGFydCBkYXRlLCByZXR1cm4gd2hhdCBpdHMgZmFsbGJhY2sgZW5kIGRhdGUgc2hvdWxkIGJlLgoJLy8gVE9ETzogcmVuYW1lIHRvIGNvbXB1dGVEZWZhdWx0RXZlbnRFbmQKCXQuZ2V0RGVmYXVsdEV2ZW50RW5kID0gZnVuY3Rpb24oYWxsRGF5LCB6b25lZFN0YXJ0KSB7CgkJdmFyIGVuZCA9IHpvbmVkU3RhcnQuY2xvbmUoKTsKCgkJaWYgKGFsbERheSkgewoJCQllbmQuc3RyaXBUaW1lKCkuYWRkKHQuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pOwoJCX0KCQllbHNlIHsKCQkJZW5kLmFkZCh0LmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pOwoJCX0KCgkJaWYgKHQuZ2V0SXNBbWJpZ1RpbWV6b25lKCkpIHsKCQkJZW5kLnN0cmlwWm9uZSgpOyAvLyB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHR6byBzaG91bGQgYmUKCQl9CgoJCXJldHVybiBlbmQ7Cgl9OwoKCgkvLyBQcm9kdWNlcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgdGhlIGdpdmVuIGR1cmF0aW9uLgoJLy8gU2lkZS1lZmZlY3Q6IGNoYW5nZXMgdGhlIGxvY2FsZSBvZiB0aGUgZ2l2ZW4gZHVyYXRpb24uCgl0Lmh1bWFuaXplRHVyYXRpb24gPSBmdW5jdGlvbihkdXJhdGlvbikgewoJCXJldHVybiBkdXJhdGlvbi5sb2NhbGUodC5vcHRpb25zLmxvY2FsZSkuaHVtYW5pemUoKTsKCX07CgoKCQoJLy8gSW1wb3J0cwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoJRXZlbnRNYW5hZ2VyLmNhbGwodCk7Cgl2YXIgaXNGZXRjaE5lZWRlZCA9IHQuaXNGZXRjaE5lZWRlZDsKCXZhciBmZXRjaEV2ZW50cyA9IHQuZmV0Y2hFdmVudHM7Cgl2YXIgZmV0Y2hFdmVudFNvdXJjZXMgPSB0LmZldGNoRXZlbnRTb3VyY2VzOwoKCgoJLy8gTG9jYWxzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgl2YXIgX2VsZW1lbnQgPSBlbGVtZW50WzBdOwoJdmFyIGhlYWRlcjsKCXZhciBjb250ZW50OwoJdmFyIHRtOyAvLyBmb3IgbWFraW5nIHRoZW1lIGNsYXNzZXMKCXZhciBjdXJyZW50VmlldzsgLy8gTk9URToga2VlcCB0aGlzIGluIHN5bmMgd2l0aCB0aGlzLnZpZXcKCXZhciB2aWV3c0J5VHlwZSA9IHt9OyAvLyBob2xkcyBhbGwgaW5zdGFudGlhdGVkIHZpZXcgaW5zdGFuY2VzLCBjdXJyZW50IG9yIG5vdAoJdmFyIHN1Z2dlc3RlZFZpZXdIZWlnaHQ7Cgl2YXIgd2luZG93UmVzaXplUHJveHk7IC8vIHdyYXBzIHRoZSB3aW5kb3dSZXNpemUgZnVuY3Rpb24KCXZhciBpZ25vcmVXaW5kb3dSZXNpemUgPSAwOwoJdmFyIGV2ZW50cyA9IFtdOwoJdmFyIGRhdGU7IC8vIHVuem9uZWQKCQoJCgkKCS8vIE1haW4gUmVuZGVyaW5nCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgkvLyBjb21wdXRlIHRoZSBpbml0aWFsIGFtYmlnLXRpbWV6b25lIGRhdGUKCWlmICh0Lm9wdGlvbnMuZGVmYXVsdERhdGUgIT0gbnVsbCkgewoJCWRhdGUgPSB0Lm1vbWVudCh0Lm9wdGlvbnMuZGVmYXVsdERhdGUpLnN0cmlwWm9uZSgpOwoJfQoJZWxzZSB7CgkJZGF0ZSA9IHQuZ2V0Tm93KCk7IC8vIGdldE5vdyBhbHJlYWR5IHJldHVybnMgdW56b25lZAoJfQoJCgkKCWZ1bmN0aW9uIHJlbmRlcigpIHsKCQlpZiAoIWNvbnRlbnQpIHsKCQkJaW5pdGlhbFJlbmRlcigpOwoJCX0KCQllbHNlIGlmIChlbGVtZW50VmlzaWJsZSgpKSB7CgkJCS8vIG1haW5seSBmb3IgdGhlIHB1YmxpYyBBUEkKCQkJY2FsY1NpemUoKTsKCQkJcmVuZGVyVmlldygpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBpbml0aWFsUmVuZGVyKCkgewoJCWVsZW1lbnQuYWRkQ2xhc3MoJ2ZjJyk7CgoJCS8vIGV2ZW50IGRlbGVnYXRpb24gZm9yIG5hdiBsaW5rcwoJCWVsZW1lbnQub24oJ2NsaWNrLmZjJywgJ2FbZGF0YS1nb3RvXScsIGZ1bmN0aW9uKGV2KSB7CgkJCXZhciBhbmNob3JFbCA9ICQodGhpcyk7CgkJCXZhciBnb3RvT3B0aW9ucyA9IGFuY2hvckVsLmRhdGEoJ2dvdG8nKTsgLy8gd2lsbCBhdXRvbWF0aWNhbGx5IHBhcnNlIEpTT04KCQkJdmFyIGRhdGUgPSB0Lm1vbWVudChnb3RvT3B0aW9ucy5kYXRlKTsKCQkJdmFyIHZpZXdUeXBlID0gZ290b09wdGlvbnMudHlwZTsKCgkJCS8vIHByb3BlcnR5IGxpa2UgIm5hdkxpbmtEYXlDbGljayIuIG1pZ2h0IGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24KCQkJdmFyIGN1c3RvbUFjdGlvbiA9IGN1cnJlbnRWaWV3Lm9wdCgnbmF2TGluaycgKyBjYXBpdGFsaXNlRmlyc3RMZXR0ZXIodmlld1R5cGUpICsgJ0NsaWNrJyk7CgoJCQlpZiAodHlwZW9mIGN1c3RvbUFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgewoJCQkJY3VzdG9tQWN0aW9uKGRhdGUsIGV2KTsKCQkJfQoJCQllbHNlIHsKCQkJCWlmICh0eXBlb2YgY3VzdG9tQWN0aW9uID09PSAnc3RyaW5nJykgewoJCQkJCXZpZXdUeXBlID0gY3VzdG9tQWN0aW9uOwoJCQkJfQoJCQkJem9vbVRvKGRhdGUsIHZpZXdUeXBlKTsKCQkJfQoJCX0pOwoKCQkvLyBjYWxsZWQgaW1tZWRpYXRlbHksIGFuZCB1cG9uIG9wdGlvbiBjaGFuZ2UKCQl0LmJpbmRPcHRpb24oJ3RoZW1lJywgZnVuY3Rpb24odGhlbWUpIHsKCQkJdG0gPSB0aGVtZSA/ICd1aScgOiAnZmMnOyAvLyBhZmZlY3RzIGEgbGFyZ2VyIHNjb3BlCgkJCWVsZW1lbnQudG9nZ2xlQ2xhc3MoJ3VpLXdpZGdldCcsIHRoZW1lKTsKCQkJZWxlbWVudC50b2dnbGVDbGFzcygnZmMtdW50aGVtZWQnLCAhdGhlbWUpOwoJCX0pOwoKCQkvLyBjYWxsZWQgaW1tZWRpYXRlbHksIGFuZCB1cG9uIG9wdGlvbiBjaGFuZ2UuCgkJLy8gSEFDSzogbG9jYWxlIG9mdGVuIGFmZmVjdHMgaXNSVEwsIHNvIHdlIGV4cGxpY2l0bHkgbGlzdGVuIHRvIHRoYXQgdG9vLgoJCXQuYmluZE9wdGlvbnMoWyAnaXNSVEwnLCAnbG9jYWxlJyBdLCBmdW5jdGlvbihpc1JUTCkgewoJCQllbGVtZW50LnRvZ2dsZUNsYXNzKCdmYy1sdHInLCAhaXNSVEwpOwoJCQllbGVtZW50LnRvZ2dsZUNsYXNzKCdmYy1ydGwnLCBpc1JUTCk7CgkJfSk7CgoJCWNvbnRlbnQgPSAkKCI8ZGl2IGNsYXNzPSdmYy12aWV3LWNvbnRhaW5lcicvPiIpLnByZXBlbmRUbyhlbGVtZW50KTsKCgkJaGVhZGVyID0gdC5oZWFkZXIgPSBuZXcgSGVhZGVyKHQpOwoJCXJlbmRlckhlYWRlcigpOwoKCQlyZW5kZXJWaWV3KHQub3B0aW9ucy5kZWZhdWx0Vmlldyk7CgoJCWlmICh0Lm9wdGlvbnMuaGFuZGxlV2luZG93UmVzaXplKSB7CgkJCXdpbmRvd1Jlc2l6ZVByb3h5ID0gZGVib3VuY2Uod2luZG93UmVzaXplLCB0Lm9wdGlvbnMud2luZG93UmVzaXplRGVsYXkpOyAvLyBwcmV2ZW50cyByYXBpZCBjYWxscwoJCQkkKHdpbmRvdykucmVzaXplKHdpbmRvd1Jlc2l6ZVByb3h5KTsKCQl9Cgl9CgoKCS8vIGNhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSBhbmQgSGVhZGVyIHdpbGwgcmVyZW5kZXIKCWZ1bmN0aW9uIHJlbmRlckhlYWRlcigpIHsKCQloZWFkZXIucmVuZGVyKCk7CgkJaWYgKGhlYWRlci5lbCkgewoJCQllbGVtZW50LnByZXBlbmQoaGVhZGVyLmVsKTsKCQl9Cgl9CgkKCQoJZnVuY3Rpb24gZGVzdHJveSgpIHsKCgkJaWYgKGN1cnJlbnRWaWV3KSB7CgkJCWN1cnJlbnRWaWV3LnJlbW92ZUVsZW1lbnQoKTsKCgkJCS8vIE5PVEU6IGRvbid0IG51bGwtb3V0IGN1cnJlbnRWaWV3L3QudmlldyBpbiBjYXNlIEFQSSBtZXRob2RzIGFyZSBjYWxsZWQgYWZ0ZXIgZGVzdHJveS4KCQkJLy8gSXQgaXMgc3RpbGwgdGhlICJjdXJyZW50IiB2aWV3LCBqdXN0IG5vdCByZW5kZXJlZC4KCQl9CgoJCWhlYWRlci5yZW1vdmVFbGVtZW50KCk7CgkJY29udGVudC5yZW1vdmUoKTsKCQllbGVtZW50LnJlbW92ZUNsYXNzKCdmYyBmYy1sdHIgZmMtcnRsIGZjLXVudGhlbWVkIHVpLXdpZGdldCcpOwoKCQllbGVtZW50Lm9mZignLmZjJyk7IC8vIHVuYmluZCBuYXYgbGluayBoYW5kbGVycwoKCQlpZiAod2luZG93UmVzaXplUHJveHkpIHsKCQkJJCh3aW5kb3cpLnVuYmluZCgncmVzaXplJywgd2luZG93UmVzaXplUHJveHkpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBlbGVtZW50VmlzaWJsZSgpIHsKCQlyZXR1cm4gZWxlbWVudC5pcygnOnZpc2libGUnKTsKCX0KCQoJCgoJLy8gVmlldyBSZW5kZXJpbmcKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCS8vIFJlbmRlcnMgYSB2aWV3IGJlY2F1c2Ugb2YgYSBkYXRlIGNoYW5nZSwgdmlldy10eXBlIGNoYW5nZSwgb3IgZm9yIHRoZSBmaXJzdCB0aW1lLgoJLy8gSWYgbm90IGdpdmVuIGEgdmlld1R5cGUsIGtlZXAgdGhlIGN1cnJlbnQgdmlldyBidXQgcmVuZGVyIGRpZmZlcmVudCBkYXRlcy4KCS8vIEFjY2VwdHMgYW4gb3B0aW9uYWwgc2Nyb2xsIHN0YXRlIHRvIHJlc3RvcmUgdG8uCglmdW5jdGlvbiByZW5kZXJWaWV3KHZpZXdUeXBlLCBleHBsaWNpdFNjcm9sbFN0YXRlKSB7CgkJaWdub3JlV2luZG93UmVzaXplKys7CgoJCS8vIGlmIHZpZXdUeXBlIGlzIGNoYW5naW5nLCByZW1vdmUgdGhlIG9sZCB2aWV3J3MgcmVuZGVyaW5nCgkJaWYgKGN1cnJlbnRWaWV3ICYmIHZpZXdUeXBlICYmIGN1cnJlbnRWaWV3LnR5cGUgIT09IHZpZXdUeXBlKSB7CgkJCWZyZWV6ZUNvbnRlbnRIZWlnaHQoKTsgLy8gcHJldmVudCBhIHNjcm9sbCBqdW1wIHdoZW4gdmlldyBlbGVtZW50IGlzIHJlbW92ZWQKCQkJY2xlYXJWaWV3KCk7CgkJfQoKCQkvLyBpZiB2aWV3VHlwZSBjaGFuZ2VkLCBvciB0aGUgdmlldyB3YXMgbmV2ZXIgY3JlYXRlZCwgY3JlYXRlIGEgZnJlc2ggdmlldwoJCWlmICghY3VycmVudFZpZXcgJiYgdmlld1R5cGUpIHsKCQkJY3VycmVudFZpZXcgPSB0LnZpZXcgPQoJCQkJdmlld3NCeVR5cGVbdmlld1R5cGVdIHx8CgkJCQkodmlld3NCeVR5cGVbdmlld1R5cGVdID0gdC5pbnN0YW50aWF0ZVZpZXcodmlld1R5cGUpKTsKCgkJCWN1cnJlbnRWaWV3LnNldEVsZW1lbnQoCgkJCQkkKCI8ZGl2IGNsYXNzPSdmYy12aWV3IGZjLSIgKyB2aWV3VHlwZSArICItdmlldycgLz4iKS5hcHBlbmRUbyhjb250ZW50KQoJCQkpOwoJCQloZWFkZXIuYWN0aXZhdGVCdXR0b24odmlld1R5cGUpOwoJCX0KCgkJaWYgKGN1cnJlbnRWaWV3KSB7CgoJCQkvLyBpbiBjYXNlIHRoZSB2aWV3IHNob3VsZCByZW5kZXIgYSBwZXJpb2Qgb2YgdGltZSB0aGF0IGlzIGNvbXBsZXRlbHkgaGlkZGVuCgkJCWRhdGUgPSBjdXJyZW50Vmlldy5tYXNzYWdlQ3VycmVudERhdGUoZGF0ZSk7CgoJCQkvLyByZW5kZXIgb3IgcmVyZW5kZXIgdGhlIHZpZXcKCQkJaWYgKAoJCQkJIWN1cnJlbnRWaWV3LmRpc3BsYXlpbmcgfHwKCQkJCSEoIC8vIE5PVCB3aXRoaW4gaW50ZXJ2YWwgcmFuZ2Ugc2lnbmFscyBhbiBpbXBsaWNpdCBkYXRlIHdpbmRvdyBjaGFuZ2UKCQkJCQlkYXRlID49IGN1cnJlbnRWaWV3LmludGVydmFsU3RhcnQgJiYKCQkJCQlkYXRlIDwgY3VycmVudFZpZXcuaW50ZXJ2YWxFbmQKCQkJCSkKCQkJKSB7CgkJCQlpZiAoZWxlbWVudFZpc2libGUoKSkgewoKCQkJCQljdXJyZW50Vmlldy5kaXNwbGF5KGRhdGUsIGV4cGxpY2l0U2Nyb2xsU3RhdGUpOyAvLyB3aWxsIGNhbGwgZnJlZXplQ29udGVudEhlaWdodAoJCQkJCXVuZnJlZXplQ29udGVudEhlaWdodCgpOyAvLyBpbW1lZGlhdGVseSB1bmZyZWV6ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgZGlzcGxheSBpcyBhc3luYwoKCQkJCQkvLyBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgVmlldzo6cmVuZGVyLCBzbyBkYXRlcyBhcmUgY2FsY3VsYXRlZAoJCQkJCXVwZGF0ZUhlYWRlclRpdGxlKCk7CgkJCQkJdXBkYXRlVG9kYXlCdXR0b24oKTsKCgkJCQkJZ2V0QW5kUmVuZGVyRXZlbnRzKCk7CgkJCQl9CgkJCX0KCQl9CgoJCXVuZnJlZXplQ29udGVudEhlaWdodCgpOyAvLyB1bmRvIGFueSBsb25lIGZyZWV6ZUNvbnRlbnRIZWlnaHQgY2FsbHMKCQlpZ25vcmVXaW5kb3dSZXNpemUtLTsKCX0KCgoJLy8gVW5yZW5kZXJzIHRoZSBjdXJyZW50IHZpZXcgYW5kIHJlZmxlY3RzIHRoaXMgY2hhbmdlIGluIHRoZSBIZWFkZXIuCgkvLyBVbnJlZ3NpdGVycyB0aGUgYGN1cnJlbnRWaWV3YCwgYnV0IGRvZXMgbm90IHJlbW92ZSBmcm9tIHZpZXdCeVR5cGUgaGFzaC4KCWZ1bmN0aW9uIGNsZWFyVmlldygpIHsKCQloZWFkZXIuZGVhY3RpdmF0ZUJ1dHRvbihjdXJyZW50Vmlldy50eXBlKTsKCQljdXJyZW50Vmlldy5yZW1vdmVFbGVtZW50KCk7CgkJY3VycmVudFZpZXcgPSB0LnZpZXcgPSBudWxsOwoJfQoKCgkvLyBEZXN0cm95cyB0aGUgdmlldywgaW5jbHVkaW5nIHRoZSB2aWV3IG9iamVjdC4gVGhlbiwgcmUtaW5zdGFudGlhdGVzIGl0IGFuZCByZW5kZXJzIGl0LgoJLy8gTWFpbnRhaW5zIHRoZSBzYW1lIHNjcm9sbCBzdGF0ZS4KCS8vIFRPRE86IG1haW50YWluIGFueSBvdGhlciB1c2VyLW1hbmlwdWxhdGVkIHN0YXRlLgoJZnVuY3Rpb24gcmVpbml0VmlldygpIHsKCQlpZ25vcmVXaW5kb3dSZXNpemUrKzsKCQlmcmVlemVDb250ZW50SGVpZ2h0KCk7CgoJCXZhciB2aWV3VHlwZSA9IGN1cnJlbnRWaWV3LnR5cGU7CgkJdmFyIHNjcm9sbFN0YXRlID0gY3VycmVudFZpZXcucXVlcnlTY3JvbGwoKTsKCQljbGVhclZpZXcoKTsKCQlyZW5kZXJWaWV3KHZpZXdUeXBlLCBzY3JvbGxTdGF0ZSk7CgoJCXVuZnJlZXplQ29udGVudEhlaWdodCgpOwoJCWlnbm9yZVdpbmRvd1Jlc2l6ZS0tOwoJfQoKCQoKCS8vIFJlc2l6aW5nCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgl0LmdldFN1Z2dlc3RlZFZpZXdIZWlnaHQgPSBmdW5jdGlvbigpIHsKCQlpZiAoc3VnZ2VzdGVkVmlld0hlaWdodCA9PT0gdW5kZWZpbmVkKSB7CgkJCWNhbGNTaXplKCk7CgkJfQoJCXJldHVybiBzdWdnZXN0ZWRWaWV3SGVpZ2h0OwoJfTsKCgoJdC5pc0hlaWdodEF1dG8gPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdC5vcHRpb25zLmNvbnRlbnRIZWlnaHQgPT09ICdhdXRvJyB8fCB0Lm9wdGlvbnMuaGVpZ2h0ID09PSAnYXV0byc7Cgl9OwoJCgkKCWZ1bmN0aW9uIHVwZGF0ZVNpemUoc2hvdWxkUmVjYWxjKSB7CgkJaWYgKGVsZW1lbnRWaXNpYmxlKCkpIHsKCgkJCWlmIChzaG91bGRSZWNhbGMpIHsKCQkJCV9jYWxjU2l6ZSgpOwoJCQl9CgoJCQlpZ25vcmVXaW5kb3dSZXNpemUrKzsKCQkJY3VycmVudFZpZXcudXBkYXRlU2l6ZSh0cnVlKTsgLy8gaXNSZXNpemU9dHJ1ZS4gd2lsbCBwb2xsIGdldFN1Z2dlc3RlZFZpZXdIZWlnaHQoKSBhbmQgaXNIZWlnaHRBdXRvKCkKCQkJaWdub3JlV2luZG93UmVzaXplLS07CgoJCQlyZXR1cm4gdHJ1ZTsgLy8gc2lnbmFsIHN1Y2Nlc3MKCQl9Cgl9CgoKCWZ1bmN0aW9uIGNhbGNTaXplKCkgewoJCWlmIChlbGVtZW50VmlzaWJsZSgpKSB7CgkJCV9jYWxjU2l6ZSgpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBfY2FsY1NpemUoKSB7IC8vIGFzc3VtZXMgZWxlbWVudFZpc2libGUKCQl2YXIgY29udGVudEhlaWdodElucHV0ID0gdC5vcHRpb25zLmNvbnRlbnRIZWlnaHQ7CgkJdmFyIGhlaWdodElucHV0ID0gdC5vcHRpb25zLmhlaWdodDsKCgkJaWYgKHR5cGVvZiBjb250ZW50SGVpZ2h0SW5wdXQgPT09ICdudW1iZXInKSB7IC8vIGV4aXN0cyBhbmQgbm90ICdhdXRvJwoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gY29udGVudEhlaWdodElucHV0OwoJCX0KCQllbHNlIGlmICh0eXBlb2YgY29udGVudEhlaWdodElucHV0ID09PSAnZnVuY3Rpb24nKSB7IC8vIGV4aXN0cyBhbmQgaXMgYSBmdW5jdGlvbgoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gY29udGVudEhlaWdodElucHV0KCk7CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBoZWlnaHRJbnB1dCA9PT0gJ251bWJlcicpIHsgLy8gZXhpc3RzIGFuZCBub3QgJ2F1dG8nCgkJCXN1Z2dlc3RlZFZpZXdIZWlnaHQgPSBoZWlnaHRJbnB1dCAtIHF1ZXJ5SGVhZGVySGVpZ2h0KCk7CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBoZWlnaHRJbnB1dCA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBleGlzdHMgYW5kIGlzIGEgZnVuY3Rpb24KCQkJc3VnZ2VzdGVkVmlld0hlaWdodCA9IGhlaWdodElucHV0KCkgLSBxdWVyeUhlYWRlckhlaWdodCgpOwoJCX0KCQllbHNlIGlmIChoZWlnaHRJbnB1dCA9PT0gJ3BhcmVudCcpIHsgLy8gc2V0IHRvIGhlaWdodCBvZiBwYXJlbnQgZWxlbWVudAoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gZWxlbWVudC5wYXJlbnQoKS5oZWlnaHQoKSAtIHF1ZXJ5SGVhZGVySGVpZ2h0KCk7CgkJfQoJCWVsc2UgewoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gTWF0aC5yb3VuZChjb250ZW50LndpZHRoKCkgLyBNYXRoLm1heCh0Lm9wdGlvbnMuYXNwZWN0UmF0aW8sIC41KSk7CgkJfQoJfQoKCglmdW5jdGlvbiBxdWVyeUhlYWRlckhlaWdodCgpIHsKCQlyZXR1cm4gaGVhZGVyLmVsID8gaGVhZGVyLmVsLm91dGVySGVpZ2h0KHRydWUpIDogMDsgLy8gaW5jbHVkZXMgbWFyZ2luCgl9CgkKCQoJZnVuY3Rpb24gd2luZG93UmVzaXplKGV2KSB7CgkJaWYgKAoJCQkhaWdub3JlV2luZG93UmVzaXplICYmCgkJCWV2LnRhcmdldCA9PT0gd2luZG93ICYmIC8vIHNvIHdlIGRvbid0IHByb2Nlc3MganF1aSAicmVzaXplIiBldmVudHMgdGhhdCBoYXZlIGJ1YmJsZWQgdXAKCQkJY3VycmVudFZpZXcuc3RhcnQgLy8gdmlldyBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkCgkJKSB7CgkJCWlmICh1cGRhdGVTaXplKHRydWUpKSB7CgkJCQljdXJyZW50Vmlldy50cmlnZ2VyKCd3aW5kb3dSZXNpemUnLCBfZWxlbWVudCk7CgkJCX0KCQl9Cgl9CgkKCQoJCgkvKiBFdmVudCBGZXRjaGluZy9SZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCS8vIFRPRE86IGdvaW5nIGZvcndhcmQsIG1vc3Qgb2YgdGhpcyBzdHVmZiBzaG91bGQgYmUgZGlyZWN0bHkgaGFuZGxlZCBieSB0aGUgdmlldwoKCglmdW5jdGlvbiByZWZldGNoRXZlbnRzKCkgeyAvLyBjYW4gYmUgY2FsbGVkIGFzIGFuIEFQSSBtZXRob2QKCQlmZXRjaEFuZFJlbmRlckV2ZW50cygpOwoJfQoKCgkvLyBUT0RPOiBtb3ZlIHRoaXMgaW50byBFdmVudE1hbmFnZXI/CglmdW5jdGlvbiByZWZldGNoRXZlbnRTb3VyY2VzKG1hdGNoSW5wdXRzKSB7CgkJZmV0Y2hFdmVudFNvdXJjZXModC5nZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXkobWF0Y2hJbnB1dHMpKTsKCX0KCgoJZnVuY3Rpb24gcmVuZGVyRXZlbnRzKCkgeyAvLyBkZXN0cm95cyBvbGQgZXZlbnRzIGlmIHByZXZpb3VzbHkgcmVuZGVyZWQKCQlpZiAoZWxlbWVudFZpc2libGUoKSkgewoJCQlmcmVlemVDb250ZW50SGVpZ2h0KCk7CgkJCWN1cnJlbnRWaWV3LmRpc3BsYXlFdmVudHMoZXZlbnRzKTsKCQkJdW5mcmVlemVDb250ZW50SGVpZ2h0KCk7CgkJfQoJfQoJCgoJZnVuY3Rpb24gZ2V0QW5kUmVuZGVyRXZlbnRzKCkgewoJCWlmICghdC5vcHRpb25zLmxhenlGZXRjaGluZyB8fCBpc0ZldGNoTmVlZGVkKGN1cnJlbnRWaWV3LnN0YXJ0LCBjdXJyZW50Vmlldy5lbmQpKSB7CgkJCWZldGNoQW5kUmVuZGVyRXZlbnRzKCk7CgkJfQoJCWVsc2UgewoJCQlyZW5kZXJFdmVudHMoKTsKCQl9Cgl9CgoKCWZ1bmN0aW9uIGZldGNoQW5kUmVuZGVyRXZlbnRzKCkgewoJCWZldGNoRXZlbnRzKGN1cnJlbnRWaWV3LnN0YXJ0LCBjdXJyZW50Vmlldy5lbmQpOwoJCQkvLyAuLi4gd2lsbCBjYWxsIHJlcG9ydEV2ZW50cwoJCQkvLyAuLi4gd2hpY2ggd2lsbCBjYWxsIHJlbmRlckV2ZW50cwoJfQoKCQoJLy8gY2FsbGVkIHdoZW4gZXZlbnQgZGF0YSBhcnJpdmVzCglmdW5jdGlvbiByZXBvcnRFdmVudHMoX2V2ZW50cykgewoJCWV2ZW50cyA9IF9ldmVudHM7CgkJcmVuZGVyRXZlbnRzKCk7Cgl9CgoKCS8vIGNhbGxlZCB3aGVuIGEgc2luZ2xlIGV2ZW50J3MgZGF0YSBoYXMgYmVlbiBjaGFuZ2VkCglmdW5jdGlvbiByZXBvcnRFdmVudENoYW5nZSgpIHsKCQlyZW5kZXJFdmVudHMoKTsKCX0KCgoKCS8qIEhlYWRlciBVcGRhdGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglmdW5jdGlvbiB1cGRhdGVIZWFkZXJUaXRsZSgpIHsKCQloZWFkZXIudXBkYXRlVGl0bGUoY3VycmVudFZpZXcudGl0bGUpOwoJfQoKCglmdW5jdGlvbiB1cGRhdGVUb2RheUJ1dHRvbigpIHsKCQl2YXIgbm93ID0gdC5nZXROb3coKTsKCgkJaWYgKG5vdyA+PSBjdXJyZW50Vmlldy5pbnRlcnZhbFN0YXJ0ICYmIG5vdyA8IGN1cnJlbnRWaWV3LmludGVydmFsRW5kKSB7CgkJCWhlYWRlci5kaXNhYmxlQnV0dG9uKCd0b2RheScpOwoJCX0KCQllbHNlIHsKCQkJaGVhZGVyLmVuYWJsZUJ1dHRvbigndG9kYXknKTsKCQl9Cgl9CgkKCgoJLyogU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkKCgkvLyB0aGlzIHB1YmxpYyBtZXRob2QgcmVjZWl2ZXMgc3RhcnQvZW5kIGRhdGVzIGluIGFueSBmb3JtYXQsIHdpdGggYW55IHRpbWV6b25lCglmdW5jdGlvbiBzZWxlY3Qoem9uZWRTdGFydElucHV0LCB6b25lZEVuZElucHV0KSB7CgkJY3VycmVudFZpZXcuc2VsZWN0KAoJCQl0LmJ1aWxkU2VsZWN0U3Bhbi5hcHBseSh0LCBhcmd1bWVudHMpCgkJKTsKCX0KCQoKCWZ1bmN0aW9uIHVuc2VsZWN0KCkgeyAvLyBzYWZlIHRvIGJlIGNhbGxlZCBiZWZvcmUgcmVuZGVyVmlldwoJCWlmIChjdXJyZW50VmlldykgewoJCQljdXJyZW50Vmlldy51bnNlbGVjdCgpOwoJCX0KCX0KCQoJCgkKCS8qIERhdGUKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCQoJCglmdW5jdGlvbiBwcmV2KCkgewoJCWRhdGUgPSBjdXJyZW50Vmlldy5jb21wdXRlUHJldkRhdGUoZGF0ZSk7CgkJcmVuZGVyVmlldygpOwoJfQoJCgkKCWZ1bmN0aW9uIG5leHQoKSB7CgkJZGF0ZSA9IGN1cnJlbnRWaWV3LmNvbXB1dGVOZXh0RGF0ZShkYXRlKTsKCQlyZW5kZXJWaWV3KCk7Cgl9CgkKCQoJZnVuY3Rpb24gcHJldlllYXIoKSB7CgkJZGF0ZS5hZGQoLTEsICd5ZWFycycpOwoJCXJlbmRlclZpZXcoKTsKCX0KCQoJCglmdW5jdGlvbiBuZXh0WWVhcigpIHsKCQlkYXRlLmFkZCgxLCAneWVhcnMnKTsKCQlyZW5kZXJWaWV3KCk7Cgl9CgkKCQoJZnVuY3Rpb24gdG9kYXkoKSB7CgkJZGF0ZSA9IHQuZ2V0Tm93KCk7CgkJcmVuZGVyVmlldygpOwoJfQoJCgkKCWZ1bmN0aW9uIGdvdG9EYXRlKHpvbmVkRGF0ZUlucHV0KSB7CgkJZGF0ZSA9IHQubW9tZW50KHpvbmVkRGF0ZUlucHV0KS5zdHJpcFpvbmUoKTsKCQlyZW5kZXJWaWV3KCk7Cgl9CgkKCQoJZnVuY3Rpb24gaW5jcmVtZW50RGF0ZShkZWx0YSkgewoJCWRhdGUuYWRkKG1vbWVudC5kdXJhdGlvbihkZWx0YSkpOwoJCXJlbmRlclZpZXcoKTsKCX0KCgoJLy8gRm9yY2VzIG5hdmlnYXRpb24gdG8gYSB2aWV3IGZvciB0aGUgZ2l2ZW4gZGF0ZS4KCS8vIGB2aWV3VHlwZWAgY2FuIGJlIGEgc3BlY2lmaWMgdmlldyBuYW1lIG9yIGEgZ2VuZXJpYyBvbmUgbGlrZSAid2VlayIgb3IgImRheSIuCglmdW5jdGlvbiB6b29tVG8obmV3RGF0ZSwgdmlld1R5cGUpIHsKCQl2YXIgc3BlYzsKCgkJdmlld1R5cGUgPSB2aWV3VHlwZSB8fCAnZGF5JzsgLy8gZGF5IGlzIGRlZmF1bHQgem9vbQoJCXNwZWMgPSB0LmdldFZpZXdTcGVjKHZpZXdUeXBlKSB8fCB0LmdldFVuaXRWaWV3U3BlYyh2aWV3VHlwZSk7CgoJCWRhdGUgPSBuZXdEYXRlLmNsb25lKCk7CgkJcmVuZGVyVmlldyhzcGVjID8gc3BlYy50eXBlIDogbnVsbCk7Cgl9CgkKCQoJLy8gZm9yIGV4dGVybmFsIEFQSQoJZnVuY3Rpb24gZ2V0RGF0ZSgpIHsKCQlyZXR1cm4gdC5hcHBseVRpbWV6b25lKGRhdGUpOyAvLyBpbmZ1c2UgdGhlIGNhbGVuZGFyJ3MgdGltZXpvbmUKCX0KCgoKCS8qIEhlaWdodCAiRnJlZXppbmciCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkvLyBUT0RPOiBtb3ZlIHRoaXMgaW50byB0aGUgdmlldwoKCXQuZnJlZXplQ29udGVudEhlaWdodCA9IGZyZWV6ZUNvbnRlbnRIZWlnaHQ7Cgl0LnVuZnJlZXplQ29udGVudEhlaWdodCA9IHVuZnJlZXplQ29udGVudEhlaWdodDsKCgoJZnVuY3Rpb24gZnJlZXplQ29udGVudEhlaWdodCgpIHsKCQljb250ZW50LmNzcyh7CgkJCXdpZHRoOiAnMTAwJScsCgkJCWhlaWdodDogY29udGVudC5oZWlnaHQoKSwKCQkJb3ZlcmZsb3c6ICdoaWRkZW4nCgkJfSk7Cgl9CgoKCWZ1bmN0aW9uIHVuZnJlZXplQ29udGVudEhlaWdodCgpIHsKCQljb250ZW50LmNzcyh7CgkJCXdpZHRoOiAnJywKCQkJaGVpZ2h0OiAnJywKCQkJb3ZlcmZsb3c6ICcnCgkJfSk7Cgl9CgkKCQoJCgkvKiBNaXNjCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkKCglmdW5jdGlvbiBnZXRDYWxlbmRhcigpIHsKCQlyZXR1cm4gdDsKCX0KCgkKCWZ1bmN0aW9uIGdldFZpZXcoKSB7CgkJcmV0dXJuIGN1cnJlbnRWaWV3OwoJfQoJCgkKCWZ1bmN0aW9uIG9wdGlvbihuYW1lLCB2YWx1ZSkgewoJCXZhciBuZXdPcHRpb25IYXNoOwoKCQlpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7CgkJCWlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IC8vIGdldHRlcgoJCQkJcmV0dXJuIHQub3B0aW9uc1tuYW1lXTsKCQkJfQoJCQllbHNlIHsgLy8gc2V0dGVyIGZvciBpbmRpdmlkdWFsIG9wdGlvbgoJCQkJbmV3T3B0aW9uSGFzaCA9IHt9OwoJCQkJbmV3T3B0aW9uSGFzaFtuYW1lXSA9IHZhbHVlOwoJCQkJc2V0T3B0aW9ucyhuZXdPcHRpb25IYXNoKTsKCQkJfQoJCX0KCQllbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHsgLy8gY29tcG91bmQgc2V0dGVyIHdpdGggb2JqZWN0IGlucHV0CgkJCXNldE9wdGlvbnMobmFtZSk7CgkJfQoJfQoKCglmdW5jdGlvbiBzZXRPcHRpb25zKG5ld09wdGlvbkhhc2gpIHsKCQl2YXIgb3B0aW9uQ250ID0gMDsKCQl2YXIgb3B0aW9uTmFtZTsKCgkJZm9yIChvcHRpb25OYW1lIGluIG5ld09wdGlvbkhhc2gpIHsKCQkJdC5keW5hbWljT3ZlcnJpZGVzW29wdGlvbk5hbWVdID0gbmV3T3B0aW9uSGFzaFtvcHRpb25OYW1lXTsKCQl9CgoJCXQudmlld1NwZWNDYWNoZSA9IHt9OyAvLyB0aGUgZHluYW1pYyBvdmVycmlkZSBpbnZhbGlkYXRlcyB0aGUgb3B0aW9ucyBpbiB0aGlzIGNhY2hlLCBzbyBqdXN0IGNsZWFyIGl0CgkJdC5wb3B1bGF0ZU9wdGlvbnNIYXNoKCk7IC8vIHRoaXMub3B0aW9ucyBuZWVkcyB0byBiZSByZWNvbXB1dGVkIGFmdGVyIHRoZSBkeW5hbWljIG92ZXJyaWRlCgoJCS8vIHRyaWdnZXIgaGFuZGxlcnMgYWZ0ZXIgdGhpcy5vcHRpb25zIGhhcyBiZWVuIHVwZGF0ZWQKCQlmb3IgKG9wdGlvbk5hbWUgaW4gbmV3T3B0aW9uSGFzaCkgewoJCQl0LnRyaWdnZXJPcHRpb25IYW5kbGVycyhvcHRpb25OYW1lKTsgLy8gcmVjYWxsIGJpbmRPcHRpb24vYmluZE9wdGlvbnMKCQkJb3B0aW9uQ250Kys7CgkJfQoKCQkvLyBzcGVjaWFsLWNhc2UgaGFuZGxpbmcgb2Ygc2luZ2xlIG9wdGlvbiBjaGFuZ2UuCgkJLy8gaWYgb25seSBvbmUgb3B0aW9uIGNoYW5nZSwgYG9wdGlvbk5hbWVgIHdpbGwgYmUgaXRzIG5hbWUuCgkJaWYgKG9wdGlvbkNudCA9PT0gMSkgewoJCQlpZiAob3B0aW9uTmFtZSA9PT0gJ2hlaWdodCcgfHwgb3B0aW9uTmFtZSA9PT0gJ2NvbnRlbnRIZWlnaHQnIHx8IG9wdGlvbk5hbWUgPT09ICdhc3BlY3RSYXRpbycpIHsKCQkJCXVwZGF0ZVNpemUodHJ1ZSk7IC8vIHRydWUgPSBhbGxvdyByZWNhbGN1bGF0aW9uIG9mIGhlaWdodAoJCQkJcmV0dXJuOwoJCQl9CgkJCWVsc2UgaWYgKG9wdGlvbk5hbWUgPT09ICdkZWZhdWx0RGF0ZScpIHsKCQkJCXJldHVybjsgLy8gY2FuJ3QgY2hhbmdlIGRhdGUgdGhpcyB3YXkuIHVzZSBnb3RvRGF0ZSBpbnN0ZWFkCgkJCX0KCQkJZWxzZSBpZiAob3B0aW9uTmFtZSA9PT0gJ2J1c2luZXNzSG91cnMnKSB7CgkJCQlpZiAoY3VycmVudFZpZXcpIHsKCQkJCQljdXJyZW50Vmlldy51bnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCQkJCQljdXJyZW50Vmlldy5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CgkJCQl9CgkJCQlyZXR1cm47CgkJCX0KCQkJZWxzZSBpZiAob3B0aW9uTmFtZSA9PT0gJ3RpbWV6b25lJykgewoJCQkJdC5yZXpvbmVBcnJheUV2ZW50U291cmNlcygpOwoJCQkJcmVmZXRjaEV2ZW50cygpOwoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQkvLyBjYXRjaC1hbGwuIHJlcmVuZGVyIHRoZSBoZWFkZXIgYW5kIHJlYnVpbGQvcmVyZW5kZXIgdGhlIGN1cnJlbnQgdmlldwoJCXJlbmRlckhlYWRlcigpOwoJCXZpZXdzQnlUeXBlID0ge307IC8vIGV2ZW4gbm9uLWN1cnJlbnQgdmlld3Mgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGlzIG9wdGlvbiBjaGFuZ2UuIGRvIGJlZm9yZSByZXJlbmRlcgoJCXJlaW5pdFZpZXcoKTsKCX0KCQoJCglmdW5jdGlvbiB0cmlnZ2VyKG5hbWUsIHRoaXNPYmopIHsgLy8gb3ZlcnJpZGVzIHRoZSBFbWl0dGVyJ3MgdHJpZ2dlciBtZXRob2QgOigKCQl2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CgoJCXRoaXNPYmogPSB0aGlzT2JqIHx8IF9lbGVtZW50OwoJCXRoaXMudHJpZ2dlcldpdGgobmFtZSwgdGhpc09iaiwgYXJncyk7IC8vIEVtaXR0ZXIncyBtZXRob2QKCgkJaWYgKHQub3B0aW9uc1tuYW1lXSkgewoJCQlyZXR1cm4gdC5vcHRpb25zW25hbWVdLmFwcGx5KHRoaXNPYmosIGFyZ3MpOwoJCX0KCX0KCgl0LmluaXRpYWxpemUoKTsKfQoKOzsKLyoKT3B0aW9ucyBiaW5kaW5nL3RyaWdnZXJpbmcgc3lzdGVtLgoqLwpDYWxlbmRhci5taXhpbih7CgoJLy8gQSBtYXAgb2Ygb3B0aW9uIG5hbWVzIHRvIGFycmF5cyBvZiBoYW5kbGVyIG9iamVjdHMuIEluaXRpYWxpemVkIHRvIHt9IGluIENhbGVuZGFyLgoJLy8gRm9ybWF0IGZvciBhIGhhbmRsZXIgb2JqZWN0OgoJLy8gewoJLy8gICBmdW5jIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB1cG9uIGNoYW5nZQoJLy8gICBuYW1lcyAvLyBvcHRpb24gbmFtZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBnaXZlbiB0byBmdW5jCgkvLyB9CglvcHRpb25IYW5kbGVyczogbnVsbCwgCgoJLy8gQ2FsbHMgaGFuZGxlckZ1bmMgaW1tZWRpYXRlbHksIGFuZCB3aGVuIHRoZSBnaXZlbiBvcHRpb24gaGFzIGNoYW5nZWQuCgkvLyBoYW5kbGVyRnVuYyB3aWxsIGJlIGdpdmVuIHRoZSBvcHRpb24gdmFsdWUuCgliaW5kT3B0aW9uOiBmdW5jdGlvbihvcHRpb25OYW1lLCBoYW5kbGVyRnVuYykgewoJCXRoaXMuYmluZE9wdGlvbnMoWyBvcHRpb25OYW1lIF0sIGhhbmRsZXJGdW5jKTsKCX0sCgoJLy8gQ2FsbHMgaGFuZGxlckZ1bmMgaW1tZWRpYXRlbHksIGFuZCB3aGVuIGFueSBvZiB0aGUgZ2l2ZW4gb3B0aW9ucyBjaGFuZ2UuCgkvLyBoYW5kbGVyRnVuYyB3aWxsIGJlIGdpdmVuIGVhY2ggb3B0aW9uIHZhbHVlIGFzIG9yZGVyZWQgZnVuY3Rpb24gYXJndW1lbnRzLgoJYmluZE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbk5hbWVzLCBoYW5kbGVyRnVuYykgewoJCXZhciBoYW5kbGVyT2JqID0geyBmdW5jOiBoYW5kbGVyRnVuYywgbmFtZXM6IG9wdGlvbk5hbWVzIH07CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBvcHRpb25OYW1lcy5sZW5ndGg7IGkrKykgewoJCQl0aGlzLnJlZ2lzdGVyT3B0aW9uSGFuZGxlck9iaihvcHRpb25OYW1lc1tpXSwgaGFuZGxlck9iaik7CgkJfQoKCQl0aGlzLnRyaWdnZXJPcHRpb25IYW5kbGVyT2JqKGhhbmRsZXJPYmopOwoJfSwKCgkvLyBQdXRzIHRoZSBnaXZlbiBoYW5kbGVyIG9iamVjdCBpbnRvIHRoZSBpbnRlcm5hbCBoYXNoCglyZWdpc3Rlck9wdGlvbkhhbmRsZXJPYmo6IGZ1bmN0aW9uKG9wdGlvbk5hbWUsIGhhbmRsZXJPYmopIHsKCQkodGhpcy5vcHRpb25IYW5kbGVyc1tvcHRpb25OYW1lXSB8fCAodGhpcy5vcHRpb25IYW5kbGVyc1tvcHRpb25OYW1lXSA9IFtdKSkKCQkJLnB1c2goaGFuZGxlck9iaik7Cgl9LAoKCS8vIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gb3B0aW9uIGhhcyBjaGFuZ2VkLCBhbmQgY2FsbHMgYWxsIGFwcHJvcHJpYXRlIGhhbmRsZXJzLgoJdHJpZ2dlck9wdGlvbkhhbmRsZXJzOiBmdW5jdGlvbihvcHRpb25OYW1lKSB7CgkJdmFyIGhhbmRsZXJPYmpzID0gdGhpcy5vcHRpb25IYW5kbGVyc1tvcHRpb25OYW1lXSB8fCBbXTsKCQl2YXIgaTsKCgkJZm9yIChpID0gMDsgaSA8IGhhbmRsZXJPYmpzLmxlbmd0aDsgaSsrKSB7CgkJCXRoaXMudHJpZ2dlck9wdGlvbkhhbmRsZXJPYmooaGFuZGxlck9ianNbaV0pOwoJCX0KCX0sCgoJLy8gQ2FsbHMgdGhlIGNhbGxiYWNrIGZvciBhIHNwZWNpZmljIGhhbmRsZXIgb2JqZWN0LCBwYXNzaW5nIGluIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCgl0cmlnZ2VyT3B0aW9uSGFuZGxlck9iajogZnVuY3Rpb24oaGFuZGxlck9iaikgewoJCXZhciBvcHRpb25OYW1lcyA9IGhhbmRsZXJPYmoubmFtZXM7CgkJdmFyIG9wdGlvblZhbHVlcyA9IFtdOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9uTmFtZXMubGVuZ3RoOyBpKyspIHsKCQkJb3B0aW9uVmFsdWVzLnB1c2godGhpcy5vcHRpb25zW29wdGlvbk5hbWVzW2ldXSk7CgkJfQoKCQloYW5kbGVyT2JqLmZ1bmMuYXBwbHkodGhpcywgb3B0aW9uVmFsdWVzKTsgLy8gbWFpbnRhaW4gdGhlIENhbGVuZGFyJ3MgYHRoaXNgIGNvbnRleHQKCX0KCn0pOwoKOzsKCkNhbGVuZGFyLmRlZmF1bHRzID0gewoKCXRpdGxlUmFuZ2VTZXBhcmF0b3I6ICcgXHUyMDEzICcsIC8vIGVuIGRhc2gKCW1vbnRoWWVhckZvcm1hdDogJ01NTU0gWVlZWScsIC8vIHJlcXVpcmVkIGZvciBlbi4gb3RoZXIgbG9jYWxlcyByZWx5IG9uIGRhdGVwaWNrZXIgY29tcHV0YWJsZSBvcHRpb24KCglkZWZhdWx0VGltZWRFdmVudER1cmF0aW9uOiAnMDI6MDA6MDAnLAoJZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb246IHsgZGF5czogMSB9LAoJZm9yY2VFdmVudER1cmF0aW9uOiBmYWxzZSwKCW5leHREYXlUaHJlc2hvbGQ6ICcwOTowMDowMCcsIC8vIDlhbQoKCS8vIGRpc3BsYXkKCWRlZmF1bHRWaWV3OiAnbW9udGgnLAoJYXNwZWN0UmF0aW86IDEuMzUsCgloZWFkZXI6IHsKCQlsZWZ0OiAndGl0bGUnLAoJCWNlbnRlcjogJycsCgkJcmlnaHQ6ICd0b2RheSBwcmV2LG5leHQnCgl9LAoJd2Vla2VuZHM6IHRydWUsCgl3ZWVrTnVtYmVyczogZmFsc2UsCgoJd2Vla051bWJlclRpdGxlOiAnVycsCgl3ZWVrTnVtYmVyQ2FsY3VsYXRpb246ICdsb2NhbCcsCgkKCS8vZWRpdGFibGU6IGZhbHNlLAoKCS8vbm93SW5kaWNhdG9yOiBmYWxzZSwKCglzY3JvbGxUaW1lOiAnMDY6MDA6MDAnLAoJCgkvLyBldmVudCBhamF4CglsYXp5RmV0Y2hpbmc6IHRydWUsCglzdGFydFBhcmFtOiAnc3RhcnQnLAoJZW5kUGFyYW06ICdlbmQnLAoJdGltZXpvbmVQYXJhbTogJ3RpbWV6b25lJywKCgl0aW1lem9uZTogZmFsc2UsCgoJLy9hbGxEYXlEZWZhdWx0OiB1bmRlZmluZWQsCgoJLy8gbG9jYWxlCglpc1JUTDogZmFsc2UsCglidXR0b25UZXh0OiB7CgkJcHJldjogInByZXYiLAoJCW5leHQ6ICJuZXh0IiwKCQlwcmV2WWVhcjogInByZXYgeWVhciIsCgkJbmV4dFllYXI6ICJuZXh0IHllYXIiLAoJCXllYXI6ICd5ZWFyJywgLy8gVE9ETzogbG9jYWxlIGZpbGVzIG5lZWQgdG8gc3BlY2lmeSB0aGlzCgkJdG9kYXk6ICd0b2RheScsCgkJbW9udGg6ICdtb250aCcsCgkJd2VlazogJ3dlZWsnLAoJCWRheTogJ2RheScKCX0sCgoJYnV0dG9uSWNvbnM6IHsKCQlwcmV2OiAnbGVmdC1zaW5nbGUtYXJyb3cnLAoJCW5leHQ6ICdyaWdodC1zaW5nbGUtYXJyb3cnLAoJCXByZXZZZWFyOiAnbGVmdC1kb3VibGUtYXJyb3cnLAoJCW5leHRZZWFyOiAncmlnaHQtZG91YmxlLWFycm93JwoJfSwKCglhbGxEYXlUZXh0OiAnYWxsLWRheScsCgkKCS8vIGpxdWVyeS11aSB0aGVtaW5nCgl0aGVtZTogZmFsc2UsCgl0aGVtZUJ1dHRvbkljb25zOiB7CgkJcHJldjogJ2NpcmNsZS10cmlhbmdsZS13JywKCQluZXh0OiAnY2lyY2xlLXRyaWFuZ2xlLWUnLAoJCXByZXZZZWFyOiAnc2Vlay1wcmV2JywKCQluZXh0WWVhcjogJ3NlZWstbmV4dCcKCX0sCgoJLy9ldmVudFJlc2l6YWJsZUZyb21TdGFydDogZmFsc2UsCglkcmFnT3BhY2l0eTogLjc1LAoJZHJhZ1JldmVydER1cmF0aW9uOiA1MDAsCglkcmFnU2Nyb2xsOiB0cnVlLAoJCgkvL3NlbGVjdGFibGU6IGZhbHNlLAoJdW5zZWxlY3RBdXRvOiB0cnVlLAoJCglkcm9wQWNjZXB0OiAnKicsCgoJZXZlbnRPcmRlcjogJ3RpdGxlJywKCglldmVudExpbWl0OiBmYWxzZSwKCWV2ZW50TGltaXRUZXh0OiAnbW9yZScsCglldmVudExpbWl0Q2xpY2s6ICdwb3BvdmVyJywKCWRheVBvcG92ZXJGb3JtYXQ6ICdMTCcsCgkKCWhhbmRsZVdpbmRvd1Jlc2l6ZTogdHJ1ZSwKCXdpbmRvd1Jlc2l6ZURlbGF5OiAxMDAsIC8vIG1pbGxpc2Vjb25kcyBiZWZvcmUgYW4gdXBkYXRlU2l6ZSBoYXBwZW5zCgoJbG9uZ1ByZXNzRGVsYXk6IDEwMDAKCQp9OwoKCkNhbGVuZGFyLmVuZ2xpc2hEZWZhdWx0cyA9IHsgLy8gdXNlZCBieSBsb2NhbGUuanMKCWRheVBvcG92ZXJGb3JtYXQ6ICdkZGRkLCBNTU1NIEQnCn07CgoKQ2FsZW5kYXIucnRsRGVmYXVsdHMgPSB7IC8vIHJpZ2h0LXRvLWxlZnQgZGVmYXVsdHMKCWhlYWRlcjogeyAvLyBUT0RPOiBzbWFydGVyIHNvbHV0aW9uIChmaXJzdC9jZW50ZXIvbGFzdCA/KQoJCWxlZnQ6ICduZXh0LHByZXYgdG9kYXknLAoJCWNlbnRlcjogJycsCgkJcmlnaHQ6ICd0aXRsZScKCX0sCglidXR0b25JY29uczogewoJCXByZXY6ICdyaWdodC1zaW5nbGUtYXJyb3cnLAoJCW5leHQ6ICdsZWZ0LXNpbmdsZS1hcnJvdycsCgkJcHJldlllYXI6ICdyaWdodC1kb3VibGUtYXJyb3cnLAoJCW5leHRZZWFyOiAnbGVmdC1kb3VibGUtYXJyb3cnCgl9LAoJdGhlbWVCdXR0b25JY29uczogewoJCXByZXY6ICdjaXJjbGUtdHJpYW5nbGUtZScsCgkJbmV4dDogJ2NpcmNsZS10cmlhbmdsZS13JywKCQluZXh0WWVhcjogJ3NlZWstcHJldicsCgkJcHJldlllYXI6ICdzZWVrLW5leHQnCgl9Cn07Cgo7OwoKdmFyIGxvY2FsZU9wdGlvbkhhc2ggPSBGQy5sb2NhbGVzID0ge307IC8vIGluaXRpYWxpemUgYW5kIGV4cG9zZQoKCi8vIFRPRE86IGRvY3VtZW50IHRoZSBzdHJ1Y3R1cmUgYW5kIG9yZGVyaW5nIG9mIGEgRnVsbENhbGVuZGFyIGxvY2FsZSBmaWxlCgoKLy8gSW5pdGlhbGl6ZSBqUXVlcnkgVUkgZGF0ZXBpY2tlciB0cmFuc2xhdGlvbnMgd2hpbGUgdXNpbmcgc29tZSBvZiB0aGUgdHJhbnNsYXRpb25zCi8vIFdpbGwgc2V0IHRoaXMgYXMgdGhlIGRlZmF1bHQgbG9jYWxlcyBmb3IgZGF0ZXBpY2tlci4KRkMuZGF0ZXBpY2tlckxvY2FsZSA9IGZ1bmN0aW9uKGxvY2FsZUNvZGUsIGRwTG9jYWxlQ29kZSwgZHBPcHRpb25zKSB7CgoJLy8gZ2V0IHRoZSBGdWxsQ2FsZW5kYXIgaW50ZXJuYWwgb3B0aW9uIGhhc2ggZm9yIHRoaXMgbG9jYWxlLiBjcmVhdGUgaWYgbmVjZXNzYXJ5Cgl2YXIgZmNPcHRpb25zID0gbG9jYWxlT3B0aW9uSGFzaFtsb2NhbGVDb2RlXSB8fCAobG9jYWxlT3B0aW9uSGFzaFtsb2NhbGVDb2RlXSA9IHt9KTsKCgkvLyB0cmFuc2ZlciBzb21lIHNpbXBsZSBvcHRpb25zIGZyb20gZGF0ZXBpY2tlciB0byBmYwoJZmNPcHRpb25zLmlzUlRMID0gZHBPcHRpb25zLmlzUlRMOwoJZmNPcHRpb25zLndlZWtOdW1iZXJUaXRsZSA9IGRwT3B0aW9ucy53ZWVrSGVhZGVyOwoKCS8vIGNvbXB1dGUgc29tZSBtb3JlIGNvbXBsZXggb3B0aW9ucyBmcm9tIGRhdGVwaWNrZXIKCSQuZWFjaChkcENvbXB1dGFibGVPcHRpb25zLCBmdW5jdGlvbihuYW1lLCBmdW5jKSB7CgkJZmNPcHRpb25zW25hbWVdID0gZnVuYyhkcE9wdGlvbnMpOwoJfSk7CgoJLy8gaXMgalF1ZXJ5IFVJIERhdGVwaWNrZXIgaXMgb24gdGhlIHBhZ2U/CglpZiAoJC5kYXRlcGlja2VyKSB7CgoJCS8vIFJlZ2lzdGVyIHRoZSBsb2NhbGUgZGF0YS4KCQkvLyBGdWxsQ2FsZW5kYXIgYW5kIE1vbWVudEpTIHVzZSBsb2NhbGUgY29kZXMgbGlrZSAicHQtYnIiIGJ1dCBEYXRlcGlja2VyCgkJLy8gZG9lcyBpdCBsaWtlICJwdC1CUiIgb3IgaWYgaXQgZG9lc24ndCBoYXZlIHRoZSBsb2NhbGUsIG1heWJlIGp1c3QgInB0Ii4KCQkvLyBNYWtlIGFuIGFsaWFzIHNvIHRoZSBsb2NhbGUgY2FuIGJlIHJlZmVyZW5jZWQgZWl0aGVyIHdheS4KCQkkLmRhdGVwaWNrZXIucmVnaW9uYWxbZHBMb2NhbGVDb2RlXSA9CgkJCSQuZGF0ZXBpY2tlci5yZWdpb25hbFtsb2NhbGVDb2RlXSA9IC8vIGFsaWFzCgkJCQlkcE9wdGlvbnM7CgoJCS8vIEFsaWFzICdlbicgdG8gdGhlIGRlZmF1bHQgbG9jYWxlIGRhdGEuIERvIHRoaXMgZXZlcnkgdGltZS4KCQkkLmRhdGVwaWNrZXIucmVnaW9uYWwuZW4gPSAkLmRhdGVwaWNrZXIucmVnaW9uYWxbJyddOwoKCQkvLyBTZXQgYXMgRGF0ZXBpY2tlcidzIGdsb2JhbCBkZWZhdWx0cy4KCQkkLmRhdGVwaWNrZXIuc2V0RGVmYXVsdHMoZHBPcHRpb25zKTsKCX0KfTsKCgovLyBTZXRzIEZ1bGxDYWxlbmRhci1zcGVjaWZpYyB0cmFuc2xhdGlvbnMuIFdpbGwgc2V0IHRoZSBsb2NhbGVzIGFzIHRoZSBnbG9iYWwgZGVmYXVsdC4KRkMubG9jYWxlID0gZnVuY3Rpb24obG9jYWxlQ29kZSwgbmV3RmNPcHRpb25zKSB7Cgl2YXIgZmNPcHRpb25zOwoJdmFyIG1vbU9wdGlvbnM7CgoJLy8gZ2V0IHRoZSBGdWxsQ2FsZW5kYXIgaW50ZXJuYWwgb3B0aW9uIGhhc2ggZm9yIHRoaXMgbG9jYWxlLiBjcmVhdGUgaWYgbmVjZXNzYXJ5CglmY09wdGlvbnMgPSBsb2NhbGVPcHRpb25IYXNoW2xvY2FsZUNvZGVdIHx8IChsb2NhbGVPcHRpb25IYXNoW2xvY2FsZUNvZGVdID0ge30pOwoKCS8vIHByb3ZpZGVkIG5ldyBvcHRpb25zIGZvciB0aGlzIGxvY2FsZXM/IG1lcmdlIHRoZW0gaW4KCWlmIChuZXdGY09wdGlvbnMpIHsKCQlmY09wdGlvbnMgPSBsb2NhbGVPcHRpb25IYXNoW2xvY2FsZUNvZGVdID0gbWVyZ2VPcHRpb25zKFsgZmNPcHRpb25zLCBuZXdGY09wdGlvbnMgXSk7Cgl9CgoJLy8gY29tcHV0ZSBsb2NhbGUgb3B0aW9ucyB0aGF0IHdlcmVuJ3QgZGVmaW5lZC4KCS8vIGFsd2F5cyBkbyB0aGlzLiBuZXdGY09wdGlvbnMgY2FuIGJlIHVuZGVmaW5lZCB3aGVuIGluaXRpYWxpemluZyBmcm9tIGkxOG4gZmlsZSwKCS8vIHNvIG5vIHdheSB0byB0ZWxsIGlmIHRoaXMgaXMgYW4gaW5pdGlhbGl6YXRpb24gb3IgYSBkZWZhdWx0LXNldHRpbmcuCgltb21PcHRpb25zID0gZ2V0TW9tZW50TG9jYWxlRGF0YShsb2NhbGVDb2RlKTsgLy8gd2lsbCBmYWxsIGJhY2sgdG8gZW4KCSQuZWFjaChtb21Db21wdXRhYmxlT3B0aW9ucywgZnVuY3Rpb24obmFtZSwgZnVuYykgewoJCWlmIChmY09wdGlvbnNbbmFtZV0gPT0gbnVsbCkgewoJCQlmY09wdGlvbnNbbmFtZV0gPSBmdW5jKG1vbU9wdGlvbnMsIGZjT3B0aW9ucyk7CgkJfQoJfSk7CgoJLy8gc2V0IGl0IGFzIHRoZSBkZWZhdWx0IGxvY2FsZSBmb3IgRnVsbENhbGVuZGFyCglDYWxlbmRhci5kZWZhdWx0cy5sb2NhbGUgPSBsb2NhbGVDb2RlOwp9OwoKCi8vIE5PVEU6IGNhbid0IGd1YXJhbnRlZSBhbnkgb2YgdGhlc2UgY29tcHV0YXRpb25zIHdpbGwgcnVuIGJlY2F1c2Ugbm90IGV2ZXJ5IGxvY2FsZSBoYXMgZGF0ZXBpY2tlcgovLyBjb25maWdzLCBzbyBtYWtlIHN1cmUgdGhlcmUgYXJlIEVuZ2xpc2ggZmFsbGJhY2tzIGZvciB0aGVzZSBpbiB0aGUgZGVmYXVsdHMgZmlsZS4KdmFyIGRwQ29tcHV0YWJsZU9wdGlvbnMgPSB7CgoJYnV0dG9uVGV4dDogZnVuY3Rpb24oZHBPcHRpb25zKSB7CgkJcmV0dXJuIHsKCQkJLy8gdGhlIHRyYW5zbGF0aW9ucyBzb21ldGltZXMgd3JvbmdseSBjb250YWluIEhUTUwgZW50aXRpZXMKCQkJcHJldjogc3RyaXBIdG1sRW50aXRpZXMoZHBPcHRpb25zLnByZXZUZXh0KSwKCQkJbmV4dDogc3RyaXBIdG1sRW50aXRpZXMoZHBPcHRpb25zLm5leHRUZXh0KSwKCQkJdG9kYXk6IHN0cmlwSHRtbEVudGl0aWVzKGRwT3B0aW9ucy5jdXJyZW50VGV4dCkKCQl9OwoJfSwKCgkvLyBQcm9kdWNlcyBmb3JtYXQgc3RyaW5ncyBsaWtlICJNTU1NIFlZWVkiIC0+ICJTZXB0ZW1iZXIgMjAxNCIKCW1vbnRoWWVhckZvcm1hdDogZnVuY3Rpb24oZHBPcHRpb25zKSB7CgkJcmV0dXJuIGRwT3B0aW9ucy5zaG93TW9udGhBZnRlclllYXIgPwoJCQknWVlZWVsnICsgZHBPcHRpb25zLnllYXJTdWZmaXggKyAnXSBNTU1NJyA6CgkJCSdNTU1NIFlZWVlbJyArIGRwT3B0aW9ucy55ZWFyU3VmZml4ICsgJ10nOwoJfQoKfTsKCnZhciBtb21Db21wdXRhYmxlT3B0aW9ucyA9IHsKCgkvLyBQcm9kdWNlcyBmb3JtYXQgc3RyaW5ncyBsaWtlICJkZGQgTS9EIiAtPiAiRnJpIDkvMTUiCglkYXlPZk1vbnRoRm9ybWF0OiBmdW5jdGlvbihtb21PcHRpb25zLCBmY09wdGlvbnMpIHsKCQl2YXIgZm9ybWF0ID0gbW9tT3B0aW9ucy5sb25nRGF0ZUZvcm1hdCgnbCcpOyAvLyBmb3IgdGhlIGZvcm1hdCBsaWtlICJNL0QvWVlZWSIKCgkJLy8gc3RyaXAgdGhlIHllYXIgb2ZmIHRoZSBlZGdlLCBhcyB3ZWxsIGFzIG90aGVyIG1pc2Mgbm9uLXdoaXRlc3BhY2UgY2hhcnMKCQlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvXlkrW15cd1xzXSp8W15cd1xzXSpZKyQvZywgJycpOwoKCQlpZiAoZmNPcHRpb25zLmlzUlRMKSB7CgkJCWZvcm1hdCArPSAnIGRkZCc7IC8vIGZvciBSVEwsIGFkZCBkYXktb2Ytd2VlayB0byBlbmQKCQl9CgkJZWxzZSB7CgkJCWZvcm1hdCA9ICdkZGQgJyArIGZvcm1hdDsgLy8gZm9yIExUUiwgYWRkIGRheS1vZi13ZWVrIHRvIGJlZ2lubmluZwoJCX0KCQlyZXR1cm4gZm9ybWF0OwoJfSwKCgkvLyBQcm9kdWNlcyBmb3JtYXQgc3RyaW5ncyBsaWtlICJoOm1tYSIgLT4gIjY6MDBwbSIKCW1lZGl1bVRpbWVGb3JtYXQ6IGZ1bmN0aW9uKG1vbU9wdGlvbnMpIHsgLy8gY2FuJ3QgYmUgY2FsbGVkIGB0aW1lRm9ybWF0YCBiZWNhdXNlIGNvbGxpZGVzIHdpdGggb3B0aW9uCgkJcmV0dXJuIG1vbU9wdGlvbnMubG9uZ0RhdGVGb3JtYXQoJ0xUJykKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICdhJyk7IC8vIGNvbnZlcnQgQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlLiByZW1vdmUgYW55IHNwYWNlcyBiZWZvcmVoYW5kCgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGxpa2UgImgoOm1tKWEiIC0+ICI2cG0iIC8gIjY6MzBwbSIKCXNtYWxsVGltZUZvcm1hdDogZnVuY3Rpb24obW9tT3B0aW9ucykgewoJCXJldHVybiBtb21PcHRpb25zLmxvbmdEYXRlRm9ybWF0KCdMVCcpCgkJCS5yZXBsYWNlKCc6bW0nLCAnKDptbSknKQoJCQkucmVwbGFjZSgvKFxXbW0pJC8sICcoJDEpJykgLy8gbGlrZSBhYm92ZSwgYnV0IGZvciBmb3JlaWduIGxvY2FsZXMKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICdhJyk7IC8vIGNvbnZlcnQgQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlLiByZW1vdmUgYW55IHNwYWNlcyBiZWZvcmVoYW5kCgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGxpa2UgImgoOm1tKXQiIC0+ICI2cCIgLyAiNjozMHAiCglleHRyYVNtYWxsVGltZUZvcm1hdDogZnVuY3Rpb24obW9tT3B0aW9ucykgewoJCXJldHVybiBtb21PcHRpb25zLmxvbmdEYXRlRm9ybWF0KCdMVCcpCgkJCS5yZXBsYWNlKCc6bW0nLCAnKDptbSknKQoJCQkucmVwbGFjZSgvKFxXbW0pJC8sICcoJDEpJykgLy8gbGlrZSBhYm92ZSwgYnV0IGZvciBmb3JlaWduIGxvY2FsZXMKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICd0Jyk7IC8vIGNvbnZlcnQgdG8gQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlIG9uZS1sZXR0ZXIuIHJlbW92ZSBhbnkgc3BhY2VzIGJlZm9yZWhhbmQKCX0sCgoJLy8gUHJvZHVjZXMgZm9ybWF0IHN0cmluZ3MgbGlrZSAiaGEiIC8gIkgiIC0+ICI2cG0iIC8gIjE4IgoJaG91ckZvcm1hdDogZnVuY3Rpb24obW9tT3B0aW9ucykgewoJCXJldHVybiBtb21PcHRpb25zLmxvbmdEYXRlRm9ybWF0KCdMVCcpCgkJCS5yZXBsYWNlKCc6bW0nLCAnJykKCQkJLnJlcGxhY2UoLyhcV21tKSQvLCAnJykgLy8gbGlrZSBhYm92ZSwgYnV0IGZvciBmb3JlaWduIGxvY2FsZXMKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICdhJyk7IC8vIGNvbnZlcnQgQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlLiByZW1vdmUgYW55IHNwYWNlcyBiZWZvcmVoYW5kCgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGxpa2UgImg6bW0iIC0+ICI2OjMwIiAod2l0aCBubyBBTS9QTSkKCW5vTWVyaWRpZW1UaW1lRm9ybWF0OiBmdW5jdGlvbihtb21PcHRpb25zKSB7CgkJcmV0dXJuIG1vbU9wdGlvbnMubG9uZ0RhdGVGb3JtYXQoJ0xUJykKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICcnKTsgLy8gcmVtb3ZlIHRyYWlsaW5nIEFNL1BNCgl9Cgp9OwoKCi8vIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgY29tcHV0ZWQgb2ZmIGxpdmUgY2FsZW5kYXIgb3B0aW9ucyAoY29uc2lkZXJzIG92ZXJyaWRlIG9wdGlvbnMpCi8vIFRPRE86IGJlc3QgcGxhY2UgZm9yIHRoaXM/IHJlbGF0ZWQgdG8gbG9jYWxlPwovLyBUT0RPOiBmbGlwcGluZyB0ZXh0IGJhc2VkIG9uIGlzUlRMIGlzIGEgYmFkIGlkZWEgYmVjYXVzZSB0aGUgQ1NTIGBkaXJlY3Rpb25gIG1pZ2h0IHdhbnQgdG8gaGFuZGxlIGl0CnZhciBpbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zID0gewoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGZvciByZXN1bHRzIGxpa2UgIk1vIDE2IgoJc21hbGxEYXlEYXRlRm9ybWF0OiBmdW5jdGlvbihvcHRpb25zKSB7CgkJcmV0dXJuIG9wdGlvbnMuaXNSVEwgPwoJCQknRCBkZCcgOgoJCQknZGQgRCc7Cgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGZvciByZXN1bHRzIGxpa2UgIldrIDUiCgl3ZWVrRm9ybWF0OiBmdW5jdGlvbihvcHRpb25zKSB7CgkJcmV0dXJuIG9wdGlvbnMuaXNSVEwgPwoJCQknd1sgJyArIG9wdGlvbnMud2Vla051bWJlclRpdGxlICsgJ10nIDoKCQkJJ1snICsgb3B0aW9ucy53ZWVrTnVtYmVyVGl0bGUgKyAnIF13JzsKCX0sCgoJLy8gUHJvZHVjZXMgZm9ybWF0IHN0cmluZ3MgZm9yIHJlc3VsdHMgbGlrZSAiV2s1IgoJc21hbGxXZWVrRm9ybWF0OiBmdW5jdGlvbihvcHRpb25zKSB7CgkJcmV0dXJuIG9wdGlvbnMuaXNSVEwgPwoJCQknd1snICsgb3B0aW9ucy53ZWVrTnVtYmVyVGl0bGUgKyAnXScgOgoJCQknWycgKyBvcHRpb25zLndlZWtOdW1iZXJUaXRsZSArICdddyc7Cgl9Cgp9OwoKZnVuY3Rpb24gcG9wdWxhdGVJbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zKG9wdGlvbnMpIHsKCSQuZWFjaChpbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zLCBmdW5jdGlvbihuYW1lLCBmdW5jKSB7CgkJaWYgKG9wdGlvbnNbbmFtZV0gPT0gbnVsbCkgewoJCQlvcHRpb25zW25hbWVdID0gZnVuYyhvcHRpb25zKTsKCQl9Cgl9KTsKfQoKCi8vIFJldHVybnMgbW9tZW50J3MgaW50ZXJuYWwgbG9jYWxlIGRhdGEuIElmIGRvZXNuJ3QgZXhpc3QsIHJldHVybnMgRW5nbGlzaC4KZnVuY3Rpb24gZ2V0TW9tZW50TG9jYWxlRGF0YShsb2NhbGVDb2RlKSB7CglyZXR1cm4gbW9tZW50LmxvY2FsZURhdGEobG9jYWxlQ29kZSkgfHwgbW9tZW50LmxvY2FsZURhdGEoJ2VuJyk7Cn0KCgovLyBJbml0aWFsaXplIEVuZ2xpc2ggYnkgZm9yY2luZyBjb21wdXRhdGlvbiBvZiBtb21lbnQtZGVyaXZlZCBvcHRpb25zLgovLyBBbHNvLCBzZXRzIGl0IGFzIHRoZSBkZWZhdWx0LgpGQy5sb2NhbGUoJ2VuJywgQ2FsZW5kYXIuZW5nbGlzaERlZmF1bHRzKTsKCjs7CgovKiBUb3AgdG9vbGJhciBhcmVhIHdpdGggYnV0dG9ucyBhbmQgdGl0bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8vIFRPRE86IHJlbmFtZSBhbGwgaGVhZGVyLXJlbGF0ZWQgdGhpbmdzIHRvICJ0b29sYmFyIgoKZnVuY3Rpb24gSGVhZGVyKGNhbGVuZGFyKSB7Cgl2YXIgdCA9IHRoaXM7CgkKCS8vIGV4cG9ydHMKCXQucmVuZGVyID0gcmVuZGVyOwoJdC5yZW1vdmVFbGVtZW50ID0gcmVtb3ZlRWxlbWVudDsKCXQudXBkYXRlVGl0bGUgPSB1cGRhdGVUaXRsZTsKCXQuYWN0aXZhdGVCdXR0b24gPSBhY3RpdmF0ZUJ1dHRvbjsKCXQuZGVhY3RpdmF0ZUJ1dHRvbiA9IGRlYWN0aXZhdGVCdXR0b247Cgl0LmRpc2FibGVCdXR0b24gPSBkaXNhYmxlQnV0dG9uOwoJdC5lbmFibGVCdXR0b24gPSBlbmFibGVCdXR0b247Cgl0LmdldFZpZXdzV2l0aEJ1dHRvbnMgPSBnZXRWaWV3c1dpdGhCdXR0b25zOwoJdC5lbCA9IG51bGw7IC8vIG1pcnJvcnMgbG9jYWwgYGVsYAoJCgkvLyBsb2NhbHMKCXZhciBlbDsKCXZhciB2aWV3c1dpdGhCdXR0b25zID0gW107Cgl2YXIgdG07CgoKCS8vIGNhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSBhbmQgd2lsbCByZXJlbmRlcgoJZnVuY3Rpb24gcmVuZGVyKCkgewoJCXZhciBvcHRpb25zID0gY2FsZW5kYXIub3B0aW9uczsKCQl2YXIgc2VjdGlvbnMgPSBvcHRpb25zLmhlYWRlcjsKCgkJdG0gPSBvcHRpb25zLnRoZW1lID8gJ3VpJyA6ICdmYyc7CgoJCWlmIChzZWN0aW9ucykgewoJCQlpZiAoIWVsKSB7CgkJCQllbCA9IHRoaXMuZWwgPSAkKCI8ZGl2IGNsYXNzPSdmYy10b29sYmFyJy8+Iik7CgkJCX0KCQkJZWxzZSB7CgkJCQllbC5lbXB0eSgpOwoJCQl9CgkJCWVsLmFwcGVuZChyZW5kZXJTZWN0aW9uKCdsZWZ0JykpCgkJCQkuYXBwZW5kKHJlbmRlclNlY3Rpb24oJ3JpZ2h0JykpCgkJCQkuYXBwZW5kKHJlbmRlclNlY3Rpb24oJ2NlbnRlcicpKQoJCQkJLmFwcGVuZCgnPGRpdiBjbGFzcz0iZmMtY2xlYXIiLz4nKTsKCQl9CgkJZWxzZSB7CgkJCXJlbW92ZUVsZW1lbnQoKTsKCQl9Cgl9CgkKCQoJZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCgpIHsKCQlpZiAoZWwpIHsKCQkJZWwucmVtb3ZlKCk7CgkJCWVsID0gdC5lbCA9IG51bGw7CgkJfQoJfQoJCgkKCWZ1bmN0aW9uIHJlbmRlclNlY3Rpb24ocG9zaXRpb24pIHsKCQl2YXIgc2VjdGlvbkVsID0gJCgnPGRpdiBjbGFzcz0iZmMtJyArIHBvc2l0aW9uICsgJyIvPicpOwoJCXZhciBvcHRpb25zID0gY2FsZW5kYXIub3B0aW9uczsKCQl2YXIgYnV0dG9uU3RyID0gb3B0aW9ucy5oZWFkZXJbcG9zaXRpb25dOwoKCQlpZiAoYnV0dG9uU3RyKSB7CgkJCSQuZWFjaChidXR0b25TdHIuc3BsaXQoJyAnKSwgZnVuY3Rpb24oaSkgewoJCQkJdmFyIGdyb3VwQ2hpbGRyZW4gPSAkKCk7CgkJCQl2YXIgaXNPbmx5QnV0dG9ucyA9IHRydWU7CgkJCQl2YXIgZ3JvdXBFbDsKCgkJCQkkLmVhY2godGhpcy5zcGxpdCgnLCcpLCBmdW5jdGlvbihqLCBidXR0b25OYW1lKSB7CgkJCQkJdmFyIGN1c3RvbUJ1dHRvblByb3BzOwoJCQkJCXZhciB2aWV3U3BlYzsKCQkJCQl2YXIgYnV0dG9uQ2xpY2s7CgkJCQkJdmFyIG92ZXJyaWRlVGV4dDsgLy8gdGV4dCBleHBsaWNpdGx5IHNldCBieSBjYWxlbmRhcidzIGNvbnN0cnVjdG9yIG9wdGlvbnMuIG92ZXJjb21lcyBpY29ucwoJCQkJCXZhciBkZWZhdWx0VGV4dDsKCQkJCQl2YXIgdGhlbWVJY29uOwoJCQkJCXZhciBub3JtYWxJY29uOwoJCQkJCXZhciBpbm5lckh0bWw7CgkJCQkJdmFyIGNsYXNzZXM7CgkJCQkJdmFyIGJ1dHRvbjsgLy8gdGhlIGVsZW1lbnQKCgkJCQkJaWYgKGJ1dHRvbk5hbWUgPT0gJ3RpdGxlJykgewoJCQkJCQlncm91cENoaWxkcmVuID0gZ3JvdXBDaGlsZHJlbi5hZGQoJCgnPGgyPiZuYnNwOzwvaDI+JykpOyAvLyB3ZSBhbHdheXMgd2FudCBpdCB0byB0YWtlIHVwIGhlaWdodAoJCQkJCQlpc09ubHlCdXR0b25zID0gZmFsc2U7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlpZiAoKGN1c3RvbUJ1dHRvblByb3BzID0gKG9wdGlvbnMuY3VzdG9tQnV0dG9ucyB8fCB7fSlbYnV0dG9uTmFtZV0pKSB7CgkJCQkJCQlidXR0b25DbGljayA9IGZ1bmN0aW9uKGV2KSB7CgkJCQkJCQkJaWYgKGN1c3RvbUJ1dHRvblByb3BzLmNsaWNrKSB7CgkJCQkJCQkJCWN1c3RvbUJ1dHRvblByb3BzLmNsaWNrLmNhbGwoYnV0dG9uWzBdLCBldik7CgkJCQkJCQkJfQoJCQkJCQkJfTsKCQkJCQkJCW92ZXJyaWRlVGV4dCA9ICcnOyAvLyBpY29ucyB3aWxsIG92ZXJyaWRlIHRleHQKCQkJCQkJCWRlZmF1bHRUZXh0ID0gY3VzdG9tQnV0dG9uUHJvcHMudGV4dDsKCQkJCQkJfQoJCQkJCQllbHNlIGlmICgodmlld1NwZWMgPSBjYWxlbmRhci5nZXRWaWV3U3BlYyhidXR0b25OYW1lKSkpIHsKCQkJCQkJCWJ1dHRvbkNsaWNrID0gZnVuY3Rpb24oKSB7CgkJCQkJCQkJY2FsZW5kYXIuY2hhbmdlVmlldyhidXR0b25OYW1lKTsKCQkJCQkJCX07CgkJCQkJCQl2aWV3c1dpdGhCdXR0b25zLnB1c2goYnV0dG9uTmFtZSk7CgkJCQkJCQlvdmVycmlkZVRleHQgPSB2aWV3U3BlYy5idXR0b25UZXh0T3ZlcnJpZGU7CgkJCQkJCQlkZWZhdWx0VGV4dCA9IHZpZXdTcGVjLmJ1dHRvblRleHREZWZhdWx0OwoJCQkJCQl9CgkJCQkJCWVsc2UgaWYgKGNhbGVuZGFyW2J1dHRvbk5hbWVdKSB7IC8vIGEgY2FsZW5kYXIgbWV0aG9kCgkJCQkJCQlidXR0b25DbGljayA9IGZ1bmN0aW9uKCkgewoJCQkJCQkJCWNhbGVuZGFyW2J1dHRvbk5hbWVdKCk7CgkJCQkJCQl9OwoJCQkJCQkJb3ZlcnJpZGVUZXh0ID0gKGNhbGVuZGFyLm92ZXJyaWRlcy5idXR0b25UZXh0IHx8IHt9KVtidXR0b25OYW1lXTsKCQkJCQkJCWRlZmF1bHRUZXh0ID0gb3B0aW9ucy5idXR0b25UZXh0W2J1dHRvbk5hbWVdOyAvLyBldmVyeXRoaW5nIGVsc2UgaXMgY29uc2lkZXJlZCBkZWZhdWx0CgkJCQkJCX0KCgkJCQkJCWlmIChidXR0b25DbGljaykgewoKCQkJCQkJCXRoZW1lSWNvbiA9CgkJCQkJCQkJY3VzdG9tQnV0dG9uUHJvcHMgPwoJCQkJCQkJCQljdXN0b21CdXR0b25Qcm9wcy50aGVtZUljb24gOgoJCQkJCQkJCQlvcHRpb25zLnRoZW1lQnV0dG9uSWNvbnNbYnV0dG9uTmFtZV07CgoJCQkJCQkJbm9ybWFsSWNvbiA9CgkJCQkJCQkJY3VzdG9tQnV0dG9uUHJvcHMgPwoJCQkJCQkJCQljdXN0b21CdXR0b25Qcm9wcy5pY29uIDoKCQkJCQkJCQkJb3B0aW9ucy5idXR0b25JY29uc1tidXR0b25OYW1lXTsKCgkJCQkJCQlpZiAob3ZlcnJpZGVUZXh0KSB7CgkJCQkJCQkJaW5uZXJIdG1sID0gaHRtbEVzY2FwZShvdmVycmlkZVRleHQpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZSBpZiAodGhlbWVJY29uICYmIG9wdGlvbnMudGhlbWUpIHsKCQkJCQkJCQlpbm5lckh0bWwgPSAiPHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi0iICsgdGhlbWVJY29uICsgIic+PC9zcGFuPiI7CgkJCQkJCQl9CgkJCQkJCQllbHNlIGlmIChub3JtYWxJY29uICYmICFvcHRpb25zLnRoZW1lKSB7CgkJCQkJCQkJaW5uZXJIdG1sID0gIjxzcGFuIGNsYXNzPSdmYy1pY29uIGZjLWljb24tIiArIG5vcm1hbEljb24gKyAiJz48L3NwYW4+IjsKCQkJCQkJCX0KCQkJCQkJCWVsc2UgewoJCQkJCQkJCWlubmVySHRtbCA9IGh0bWxFc2NhcGUoZGVmYXVsdFRleHQpOwoJCQkJCQkJfQoKCQkJCQkJCWNsYXNzZXMgPSBbCgkJCQkJCQkJJ2ZjLScgKyBidXR0b25OYW1lICsgJy1idXR0b24nLAoJCQkJCQkJCXRtICsgJy1idXR0b24nLAoJCQkJCQkJCXRtICsgJy1zdGF0ZS1kZWZhdWx0JwoJCQkJCQkJXTsKCgkJCQkJCQlidXR0b24gPSAkKCAvLyB0eXBlPSJidXR0b24iIHNvIHRoYXQgaXQgZG9lc24ndCBzdWJtaXQgYSBmb3JtCgkJCQkJCQkJJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJyArIGNsYXNzZXMuam9pbignICcpICsgJyI+JyArCgkJCQkJCQkJCWlubmVySHRtbCArCgkJCQkJCQkJJzwvYnV0dG9uPicKCQkJCQkJCQkpCgkJCQkJCQkJLmNsaWNrKGZ1bmN0aW9uKGV2KSB7CgkJCQkJCQkJCS8vIGRvbid0IHByb2Nlc3MgY2xpY2tzIGZvciBkaXNhYmxlZCBidXR0b25zCgkJCQkJCQkJCWlmICghYnV0dG9uLmhhc0NsYXNzKHRtICsgJy1zdGF0ZS1kaXNhYmxlZCcpKSB7CgoJCQkJCQkJCQkJYnV0dG9uQ2xpY2soZXYpOwoKCQkJCQkJCQkJCS8vIGFmdGVyIHRoZSBjbGljayBhY3Rpb24sIGlmIHRoZSBidXR0b24gYmVjb21lcyB0aGUgImFjdGl2ZSIgdGFiLCBvciBkaXNhYmxlZCwKCQkJCQkJCQkJCS8vIGl0IHNob3VsZCBuZXZlciBoYXZlIGEgaG92ZXIgY2xhc3MsIHNvIHJlbW92ZSBpdCBub3cuCgkJCQkJCQkJCQlpZiAoCgkJCQkJCQkJCQkJYnV0dG9uLmhhc0NsYXNzKHRtICsgJy1zdGF0ZS1hY3RpdmUnKSB8fAoJCQkJCQkJCQkJCWJ1dHRvbi5oYXNDbGFzcyh0bSArICctc3RhdGUtZGlzYWJsZWQnKQoJCQkJCQkJCQkJKSB7CgkJCQkJCQkJCQkJYnV0dG9uLnJlbW92ZUNsYXNzKHRtICsgJy1zdGF0ZS1ob3ZlcicpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfSkKCQkJCQkJCQkubW91c2Vkb3duKGZ1bmN0aW9uKCkgewoJCQkJCQkJCQkvLyB0aGUgKmRvd24qIGVmZmVjdCAobW91c2UgcHJlc3NlZCBpbikuCgkJCQkJCQkJCS8vIG9ubHkgb24gYnV0dG9ucyB0aGF0IGFyZSBub3QgdGhlICJhY3RpdmUiIHRhYiwgb3IgZGlzYWJsZWQKCQkJCQkJCQkJYnV0dG9uCgkJCQkJCQkJCQkubm90KCcuJyArIHRtICsgJy1zdGF0ZS1hY3RpdmUnKQoJCQkJCQkJCQkJLm5vdCgnLicgKyB0bSArICctc3RhdGUtZGlzYWJsZWQnKQoJCQkJCQkJCQkJLmFkZENsYXNzKHRtICsgJy1zdGF0ZS1kb3duJyk7CgkJCQkJCQkJfSkKCQkJCQkJCQkubW91c2V1cChmdW5jdGlvbigpIHsKCQkJCQkJCQkJLy8gdW5kbyB0aGUgKmRvd24qIGVmZmVjdAoJCQkJCQkJCQlidXR0b24ucmVtb3ZlQ2xhc3ModG0gKyAnLXN0YXRlLWRvd24nKTsKCQkJCQkJCQl9KQoJCQkJCQkJCS5ob3ZlcigKCQkJCQkJCQkJZnVuY3Rpb24oKSB7CgkJCQkJCQkJCQkvLyB0aGUgKmhvdmVyKiBlZmZlY3QuCgkJCQkJCQkJCQkvLyBvbmx5IG9uIGJ1dHRvbnMgdGhhdCBhcmUgbm90IHRoZSAiYWN0aXZlIiB0YWIsIG9yIGRpc2FibGVkCgkJCQkJCQkJCQlidXR0b24KCQkJCQkJCQkJCQkubm90KCcuJyArIHRtICsgJy1zdGF0ZS1hY3RpdmUnKQoJCQkJCQkJCQkJCS5ub3QoJy4nICsgdG0gKyAnLXN0YXRlLWRpc2FibGVkJykKCQkJCQkJCQkJCQkuYWRkQ2xhc3ModG0gKyAnLXN0YXRlLWhvdmVyJyk7CgkJCQkJCQkJCX0sCgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJLy8gdW5kbyB0aGUgKmhvdmVyKiBlZmZlY3QKCQkJCQkJCQkJCWJ1dHRvbgoJCQkJCQkJCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtaG92ZXInKQoJCQkJCQkJCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtZG93bicpOyAvLyBpZiBtb3VzZWxlYXZlIGhhcHBlbnMgYmVmb3JlIG1vdXNldXAKCQkJCQkJCQkJfQoJCQkJCQkJCSk7CgoJCQkJCQkJZ3JvdXBDaGlsZHJlbiA9IGdyb3VwQ2hpbGRyZW4uYWRkKGJ1dHRvbik7CgkJCQkJCX0KCQkJCQl9CgkJCQl9KTsKCgkJCQlpZiAoaXNPbmx5QnV0dG9ucykgewoJCQkJCWdyb3VwQ2hpbGRyZW4KCQkJCQkJLmZpcnN0KCkuYWRkQ2xhc3ModG0gKyAnLWNvcm5lci1sZWZ0JykuZW5kKCkKCQkJCQkJLmxhc3QoKS5hZGRDbGFzcyh0bSArICctY29ybmVyLXJpZ2h0JykuZW5kKCk7CgkJCQl9CgoJCQkJaWYgKGdyb3VwQ2hpbGRyZW4ubGVuZ3RoID4gMSkgewoJCQkJCWdyb3VwRWwgPSAkKCc8ZGl2Lz4nKTsKCQkJCQlpZiAoaXNPbmx5QnV0dG9ucykgewoJCQkJCQlncm91cEVsLmFkZENsYXNzKCdmYy1idXR0b24tZ3JvdXAnKTsKCQkJCQl9CgkJCQkJZ3JvdXBFbC5hcHBlbmQoZ3JvdXBDaGlsZHJlbik7CgkJCQkJc2VjdGlvbkVsLmFwcGVuZChncm91cEVsKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXNlY3Rpb25FbC5hcHBlbmQoZ3JvdXBDaGlsZHJlbik7IC8vIDEgb3IgMCBjaGlsZHJlbgoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiBzZWN0aW9uRWw7Cgl9CgkKCQoJZnVuY3Rpb24gdXBkYXRlVGl0bGUodGV4dCkgewoJCWlmIChlbCkgewoJCQllbC5maW5kKCdoMicpLnRleHQodGV4dCk7CgkJfQoJfQoJCgkKCWZ1bmN0aW9uIGFjdGl2YXRlQnV0dG9uKGJ1dHRvbk5hbWUpIHsKCQlpZiAoZWwpIHsKCQkJZWwuZmluZCgnLmZjLScgKyBidXR0b25OYW1lICsgJy1idXR0b24nKQoJCQkJLmFkZENsYXNzKHRtICsgJy1zdGF0ZS1hY3RpdmUnKTsKCQl9Cgl9CgkKCQoJZnVuY3Rpb24gZGVhY3RpdmF0ZUJ1dHRvbihidXR0b25OYW1lKSB7CgkJaWYgKGVsKSB7CgkJCWVsLmZpbmQoJy5mYy0nICsgYnV0dG9uTmFtZSArICctYnV0dG9uJykKCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtYWN0aXZlJyk7CgkJfQoJfQoJCgkKCWZ1bmN0aW9uIGRpc2FibGVCdXR0b24oYnV0dG9uTmFtZSkgewoJCWlmIChlbCkgewoJCQllbC5maW5kKCcuZmMtJyArIGJ1dHRvbk5hbWUgKyAnLWJ1dHRvbicpCgkJCQkucHJvcCgnZGlzYWJsZWQnLCB0cnVlKQoJCQkJLmFkZENsYXNzKHRtICsgJy1zdGF0ZS1kaXNhYmxlZCcpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBlbmFibGVCdXR0b24oYnV0dG9uTmFtZSkgewoJCWlmIChlbCkgewoJCQllbC5maW5kKCcuZmMtJyArIGJ1dHRvbk5hbWUgKyAnLWJ1dHRvbicpCgkJCQkucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtZGlzYWJsZWQnKTsKCQl9Cgl9CgoKCWZ1bmN0aW9uIGdldFZpZXdzV2l0aEJ1dHRvbnMoKSB7CgkJcmV0dXJuIHZpZXdzV2l0aEJ1dHRvbnM7Cgl9Cgp9Cgo7OwoKRkMuc291cmNlTm9ybWFsaXplcnMgPSBbXTsKRkMuc291cmNlRmV0Y2hlcnMgPSBbXTsKCnZhciBhamF4RGVmYXVsdHMgPSB7CglkYXRhVHlwZTogJ2pzb24nLAoJY2FjaGU6IGZhbHNlCn07Cgp2YXIgZXZlbnRHVUlEID0gMTsKCgpmdW5jdGlvbiBFdmVudE1hbmFnZXIoKSB7IC8vIGFzc3VtZWQgdG8gYmUgYSBjYWxlbmRhcgoJdmFyIHQgPSB0aGlzOwoJCgkKCS8vIGV4cG9ydHMKCXQuaXNGZXRjaE5lZWRlZCA9IGlzRmV0Y2hOZWVkZWQ7Cgl0LmZldGNoRXZlbnRzID0gZmV0Y2hFdmVudHM7Cgl0LmZldGNoRXZlbnRTb3VyY2VzID0gZmV0Y2hFdmVudFNvdXJjZXM7Cgl0LmdldEV2ZW50U291cmNlcyA9IGdldEV2ZW50U291cmNlczsKCXQuZ2V0RXZlbnRTb3VyY2VCeUlkID0gZ2V0RXZlbnRTb3VyY2VCeUlkOwoJdC5nZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXkgPSBnZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXk7Cgl0LmdldEV2ZW50U291cmNlc0J5TWF0Y2ggPSBnZXRFdmVudFNvdXJjZXNCeU1hdGNoOwoJdC5hZGRFdmVudFNvdXJjZSA9IGFkZEV2ZW50U291cmNlOwoJdC5yZW1vdmVFdmVudFNvdXJjZSA9IHJlbW92ZUV2ZW50U291cmNlOwoJdC5yZW1vdmVFdmVudFNvdXJjZXMgPSByZW1vdmVFdmVudFNvdXJjZXM7Cgl0LnVwZGF0ZUV2ZW50ID0gdXBkYXRlRXZlbnQ7Cgl0LnJlbmRlckV2ZW50ID0gcmVuZGVyRXZlbnQ7Cgl0LnJlbW92ZUV2ZW50cyA9IHJlbW92ZUV2ZW50czsKCXQuY2xpZW50RXZlbnRzID0gY2xpZW50RXZlbnRzOwoJdC5tdXRhdGVFdmVudCA9IG11dGF0ZUV2ZW50OwoJdC5ub3JtYWxpemVFdmVudERhdGVzID0gbm9ybWFsaXplRXZlbnREYXRlczsKCXQubm9ybWFsaXplRXZlbnRUaW1lcyA9IG5vcm1hbGl6ZUV2ZW50VGltZXM7CgkKCQoJLy8gaW1wb3J0cwoJdmFyIHJlcG9ydEV2ZW50cyA9IHQucmVwb3J0RXZlbnRzOwoJCgkKCS8vIGxvY2FscwoJdmFyIHN0aWNreVNvdXJjZSA9IHsgZXZlbnRzOiBbXSB9OwoJdmFyIHNvdXJjZXMgPSBbIHN0aWNreVNvdXJjZSBdOwoJdmFyIHJhbmdlU3RhcnQsIHJhbmdlRW5kOwoJdmFyIHBlbmRpbmdTb3VyY2VDbnQgPSAwOyAvLyBvdXRzdGFuZGluZyBmZXRjaCByZXF1ZXN0cywgbWF4IG9uZSBwZXIgc291cmNlCgl2YXIgY2FjaGUgPSBbXTsgLy8gaG9sZHMgZXZlbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZXhwYW5kZWQKCgoJJC5lYWNoKAoJCSh0Lm9wdGlvbnMuZXZlbnRzID8gWyB0Lm9wdGlvbnMuZXZlbnRzIF0gOiBbXSkuY29uY2F0KHQub3B0aW9ucy5ldmVudFNvdXJjZXMgfHwgW10pLAoJCWZ1bmN0aW9uKGksIHNvdXJjZUlucHV0KSB7CgkJCXZhciBzb3VyY2UgPSBidWlsZEV2ZW50U291cmNlKHNvdXJjZUlucHV0KTsKCQkJaWYgKHNvdXJjZSkgewoJCQkJc291cmNlcy5wdXNoKHNvdXJjZSk7CgkJCX0KCQl9CgkpOwoJCgkKCQoJLyogRmV0Y2hpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gc3RhcnQgYW5kIGVuZCBhcmUgYXNzdW1lZCB0byBiZSB1bnpvbmVkCglmdW5jdGlvbiBpc0ZldGNoTmVlZGVkKHN0YXJ0LCBlbmQpIHsKCQlyZXR1cm4gIXJhbmdlU3RhcnQgfHwgLy8gbm90aGluZyBoYXMgYmVlbiBmZXRjaGVkIHlldD8KCQkJc3RhcnQgPCByYW5nZVN0YXJ0IHx8IGVuZCA+IHJhbmdlRW5kOyAvLyBpcyBwYXJ0IG9mIHRoZSBuZXcgcmFuZ2Ugb3V0c2lkZSBvZiB0aGUgb2xkIHJhbmdlPwoJfQoJCgkKCWZ1bmN0aW9uIGZldGNoRXZlbnRzKHN0YXJ0LCBlbmQpIHsKCQlyYW5nZVN0YXJ0ID0gc3RhcnQ7CgkJcmFuZ2VFbmQgPSBlbmQ7CgkJZmV0Y2hFdmVudFNvdXJjZXMoc291cmNlcywgJ3Jlc2V0Jyk7Cgl9CgoKCS8vIGV4cGVjdHMgYW4gYXJyYXkgb2YgZXZlbnQgc291cmNlIG9iamVjdHMgKHRoZSBvcmlnaW5hbHMsIG5vdCBjb3BpZXMpCgkvLyBgc3BlY2lhbEZldGNoVHlwZWAgaXMgYW4gb3B0aW1pemF0aW9uIHBhcmFtZXRlciB0aGF0IGFmZmVjdHMgcHVyZ2luZyBvZiB0aGUgZXZlbnQgY2FjaGUuCglmdW5jdGlvbiBmZXRjaEV2ZW50U291cmNlcyhzcGVjaWZpY1NvdXJjZXMsIHNwZWNpYWxGZXRjaFR5cGUpIHsKCQl2YXIgaSwgc291cmNlOwoKCQlpZiAoc3BlY2lhbEZldGNoVHlwZSA9PT0gJ3Jlc2V0JykgewoJCQljYWNoZSA9IFtdOwoJCX0KCQllbHNlIGlmIChzcGVjaWFsRmV0Y2hUeXBlICE9PSAnYWRkJykgewoJCQljYWNoZSA9IGV4Y2x1ZGVFdmVudHNCeVNvdXJjZXMoY2FjaGUsIHNwZWNpZmljU291cmNlcyk7CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgc3BlY2lmaWNTb3VyY2VzLmxlbmd0aDsgaSsrKSB7CgkJCXNvdXJjZSA9IHNwZWNpZmljU291cmNlc1tpXTsKCgkJCS8vIGFscmVhZHktcGVuZGluZyBzb3VyY2VzIGhhdmUgYWxyZWFkeSBiZWVuIGFjY291bnRlZCBmb3IgaW4gcGVuZGluZ1NvdXJjZUNudAoJCQlpZiAoc291cmNlLl9zdGF0dXMgIT09ICdwZW5kaW5nJykgewoJCQkJcGVuZGluZ1NvdXJjZUNudCsrOwoJCQl9CgoJCQlzb3VyY2UuX2ZldGNoSWQgPSAoc291cmNlLl9mZXRjaElkIHx8IDApICsgMTsKCQkJc291cmNlLl9zdGF0dXMgPSAncGVuZGluZyc7CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgc3BlY2lmaWNTb3VyY2VzLmxlbmd0aDsgaSsrKSB7CgkJCXNvdXJjZSA9IHNwZWNpZmljU291cmNlc1tpXTsKCgkJCXRyeUZldGNoRXZlbnRTb3VyY2Uoc291cmNlLCBzb3VyY2UuX2ZldGNoSWQpOwoJCX0KCX0KCgoJLy8gZmV0Y2hlcyBhbiBldmVudCBzb3VyY2UgYW5kIHByb2Nlc3NlcyBpdHMgcmVzdWx0IE9OTFkgaWYgaXQgaXMgc3RpbGwgdGhlIGN1cnJlbnQgZmV0Y2guCgkvLyBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGluY3JlbWVudGluZyBwZW5kaW5nU291cmNlQ250IGZpcnN0LgoJZnVuY3Rpb24gdHJ5RmV0Y2hFdmVudFNvdXJjZShzb3VyY2UsIGZldGNoSWQpIHsKCQlfZmV0Y2hFdmVudFNvdXJjZShzb3VyY2UsIGZ1bmN0aW9uKGV2ZW50SW5wdXRzKSB7CgkJCXZhciBpc0FycmF5U291cmNlID0gJC5pc0FycmF5KHNvdXJjZS5ldmVudHMpOwoJCQl2YXIgaSwgZXZlbnRJbnB1dDsKCQkJdmFyIGFic3RyYWN0RXZlbnQ7CgoJCQlpZiAoCgkJCQkvLyBpcyB0aGlzIHRoZSBzb3VyY2UncyBtb3N0IHJlY2VudCBmZXRjaD8KCQkJCS8vIGlmIG5vdCwgcmVseSBvbiBhbiB1cGNvbWluZyBmZXRjaCBvZiB0aGlzIHNvdXJjZSB0byBkZWNyZW1lbnQgcGVuZGluZ1NvdXJjZUNudAoJCQkJZmV0Y2hJZCA9PT0gc291cmNlLl9mZXRjaElkICYmCgkJCQkvLyBldmVudCBzb3VyY2Ugbm8gbG9uZ2VyIHZhbGlkPwoJCQkJc291cmNlLl9zdGF0dXMgIT09ICdyZWplY3RlZCcKCQkJKSB7CgkJCQlzb3VyY2UuX3N0YXR1cyA9ICdyZXNvbHZlZCc7CgoJCQkJaWYgKGV2ZW50SW5wdXRzKSB7CgkJCQkJZm9yIChpID0gMDsgaSA8IGV2ZW50SW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJCQkJCWV2ZW50SW5wdXQgPSBldmVudElucHV0c1tpXTsKCgkJCQkJCWlmIChpc0FycmF5U291cmNlKSB7IC8vIGFycmF5IHNvdXJjZXMgaGF2ZSBhbHJlYWR5IGJlZW4gY29udmVydCB0byBFdmVudCBPYmplY3RzCgkJCQkJCQlhYnN0cmFjdEV2ZW50ID0gZXZlbnRJbnB1dDsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCWFic3RyYWN0RXZlbnQgPSBidWlsZEV2ZW50RnJvbUlucHV0KGV2ZW50SW5wdXQsIHNvdXJjZSk7CgkJCQkJCX0KCgkJCQkJCWlmIChhYnN0cmFjdEV2ZW50KSB7IC8vIG5vdCBmYWxzZSAoYW4gaW52YWxpZCBldmVudCkKCQkJCQkJCWNhY2hlLnB1c2guYXBwbHkoCgkJCQkJCQkJY2FjaGUsCgkJCQkJCQkJZXhwYW5kRXZlbnQoYWJzdHJhY3RFdmVudCkgLy8gYWRkIGluZGl2aWR1YWwgZXhwYW5kZWQgZXZlbnRzIHRvIHRoZSBjYWNoZQoJCQkJCQkJKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlkZWNyZW1lbnRQZW5kaW5nU291cmNlQ250KCk7CgkJCX0KCQl9KTsKCX0KCgoJZnVuY3Rpb24gcmVqZWN0RXZlbnRTb3VyY2Uoc291cmNlKSB7CgkJdmFyIHdhc1BlbmRpbmcgPSBzb3VyY2UuX3N0YXR1cyA9PT0gJ3BlbmRpbmcnOwoKCQlzb3VyY2UuX3N0YXR1cyA9ICdyZWplY3RlZCc7CgoJCWlmICh3YXNQZW5kaW5nKSB7CgkJCWRlY3JlbWVudFBlbmRpbmdTb3VyY2VDbnQoKTsKCQl9Cgl9CgoKCWZ1bmN0aW9uIGRlY3JlbWVudFBlbmRpbmdTb3VyY2VDbnQoKSB7CgkJcGVuZGluZ1NvdXJjZUNudC0tOwoJCWlmICghcGVuZGluZ1NvdXJjZUNudCkgewoJCQlyZXBvcnRFdmVudHMoY2FjaGUpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBfZmV0Y2hFdmVudFNvdXJjZShzb3VyY2UsIGNhbGxiYWNrKSB7CgkJdmFyIGk7CgkJdmFyIGZldGNoZXJzID0gRkMuc291cmNlRmV0Y2hlcnM7CgkJdmFyIHJlczsKCgkJZm9yIChpPTA7IGk8ZmV0Y2hlcnMubGVuZ3RoOyBpKyspIHsKCQkJcmVzID0gZmV0Y2hlcnNbaV0uY2FsbCgKCQkJCXQsIC8vIHRoaXMsIHRoZSBDYWxlbmRhciBvYmplY3QKCQkJCXNvdXJjZSwKCQkJCXJhbmdlU3RhcnQuY2xvbmUoKSwKCQkJCXJhbmdlRW5kLmNsb25lKCksCgkJCQl0Lm9wdGlvbnMudGltZXpvbmUsCgkJCQljYWxsYmFjawoJCQkpOwoKCQkJaWYgKHJlcyA9PT0gdHJ1ZSkgewoJCQkJLy8gdGhlIGZldGNoZXIgaXMgaW4gY2hhcmdlLiBtYWRlIGl0cyBvd24gYXN5bmMgcmVxdWVzdAoJCQkJcmV0dXJuOwoJCQl9CgkJCWVsc2UgaWYgKHR5cGVvZiByZXMgPT0gJ29iamVjdCcpIHsKCQkJCS8vIHRoZSBmZXRjaGVyIHJldHVybmVkIGEgbmV3IHNvdXJjZS4gcHJvY2VzcyBpdAoJCQkJX2ZldGNoRXZlbnRTb3VyY2UocmVzLCBjYWxsYmFjayk7CgkJCQlyZXR1cm47CgkJCX0KCQl9CgoJCXZhciBldmVudHMgPSBzb3VyY2UuZXZlbnRzOwoJCWlmIChldmVudHMpIHsKCQkJaWYgKCQuaXNGdW5jdGlvbihldmVudHMpKSB7CgkJCQl0LnB1c2hMb2FkaW5nKCk7CgkJCQlldmVudHMuY2FsbCgKCQkJCQl0LCAvLyB0aGlzLCB0aGUgQ2FsZW5kYXIgb2JqZWN0CgkJCQkJcmFuZ2VTdGFydC5jbG9uZSgpLAoJCQkJCXJhbmdlRW5kLmNsb25lKCksCgkJCQkJdC5vcHRpb25zLnRpbWV6b25lLAoJCQkJCWZ1bmN0aW9uKGV2ZW50cykgewoJCQkJCQljYWxsYmFjayhldmVudHMpOwoJCQkJCQl0LnBvcExvYWRpbmcoKTsKCQkJCQl9CgkJCQkpOwoJCQl9CgkJCWVsc2UgaWYgKCQuaXNBcnJheShldmVudHMpKSB7CgkJCQljYWxsYmFjayhldmVudHMpOwoJCQl9CgkJCWVsc2UgewoJCQkJY2FsbGJhY2soKTsKCQkJfQoJCX1lbHNlewoJCQl2YXIgdXJsID0gc291cmNlLnVybDsKCQkJaWYgKHVybCkgewoJCQkJdmFyIHN1Y2Nlc3MgPSBzb3VyY2Uuc3VjY2VzczsKCQkJCXZhciBlcnJvciA9IHNvdXJjZS5lcnJvcjsKCQkJCXZhciBjb21wbGV0ZSA9IHNvdXJjZS5jb21wbGV0ZTsKCgkJCQkvLyByZXRyaWV2ZSBhbnkgb3V0Ym91bmQgR0VUL1BPU1QgJC5hamF4IGRhdGEgZnJvbSB0aGUgb3B0aW9ucwoJCQkJdmFyIGN1c3RvbURhdGE7CgkJCQlpZiAoJC5pc0Z1bmN0aW9uKHNvdXJjZS5kYXRhKSkgewoJCQkJCS8vIHN1cHBsaWVkIGFzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEga2V5L3ZhbHVlIG9iamVjdAoJCQkJCWN1c3RvbURhdGEgPSBzb3VyY2UuZGF0YSgpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJLy8gc3VwcGxpZWQgYXMgYSBzdHJhaWdodCBrZXkvdmFsdWUgb2JqZWN0CgkJCQkJY3VzdG9tRGF0YSA9IHNvdXJjZS5kYXRhOwoJCQkJfQoKCQkJCS8vIHVzZSBhIGNvcHkgb2YgdGhlIGN1c3RvbSBkYXRhIHNvIHdlIGNhbiBtb2RpZnkgdGhlIHBhcmFtZXRlcnMKCQkJCS8vIGFuZCBub3QgYWZmZWN0IHRoZSBwYXNzZWQtaW4gb2JqZWN0LgoJCQkJdmFyIGRhdGEgPSAkLmV4dGVuZCh7fSwgY3VzdG9tRGF0YSB8fCB7fSk7CgoJCQkJdmFyIHN0YXJ0UGFyYW0gPSBmaXJzdERlZmluZWQoc291cmNlLnN0YXJ0UGFyYW0sIHQub3B0aW9ucy5zdGFydFBhcmFtKTsKCQkJCXZhciBlbmRQYXJhbSA9IGZpcnN0RGVmaW5lZChzb3VyY2UuZW5kUGFyYW0sIHQub3B0aW9ucy5lbmRQYXJhbSk7CgkJCQl2YXIgdGltZXpvbmVQYXJhbSA9IGZpcnN0RGVmaW5lZChzb3VyY2UudGltZXpvbmVQYXJhbSwgdC5vcHRpb25zLnRpbWV6b25lUGFyYW0pOwoKCQkJCWlmIChzdGFydFBhcmFtKSB7CgkJCQkJZGF0YVtzdGFydFBhcmFtXSA9IHJhbmdlU3RhcnQuZm9ybWF0KCk7CgkJCQl9CgkJCQlpZiAoZW5kUGFyYW0pIHsKCQkJCQlkYXRhW2VuZFBhcmFtXSA9IHJhbmdlRW5kLmZvcm1hdCgpOwoJCQkJfQoJCQkJaWYgKHQub3B0aW9ucy50aW1lem9uZSAmJiB0Lm9wdGlvbnMudGltZXpvbmUgIT0gJ2xvY2FsJykgewoJCQkJCWRhdGFbdGltZXpvbmVQYXJhbV0gPSB0Lm9wdGlvbnMudGltZXpvbmU7CgkJCQl9CgoJCQkJdC5wdXNoTG9hZGluZygpOwoJCQkJJC5hamF4KCQuZXh0ZW5kKHt9LCBhamF4RGVmYXVsdHMsIHNvdXJjZSwgewoJCQkJCWRhdGE6IGRhdGEsCgkJCQkJc3VjY2VzczogZnVuY3Rpb24oZXZlbnRzKSB7CgkJCQkJCWV2ZW50cyA9IGV2ZW50cyB8fCBbXTsKCQkJCQkJdmFyIHJlcyA9IGFwcGx5QWxsKHN1Y2Nlc3MsIHRoaXMsIGFyZ3VtZW50cyk7CgkJCQkJCWlmICgkLmlzQXJyYXkocmVzKSkgewoJCQkJCQkJZXZlbnRzID0gcmVzOwoJCQkJCQl9CgkJCQkJCWNhbGxiYWNrKGV2ZW50cyk7CgkJCQkJfSwKCQkJCQllcnJvcjogZnVuY3Rpb24oKSB7CgkJCQkJCWFwcGx5QWxsKGVycm9yLCB0aGlzLCBhcmd1bWVudHMpOwoJCQkJCQljYWxsYmFjaygpOwoJCQkJCX0sCgkJCQkJY29tcGxldGU6IGZ1bmN0aW9uKCkgewoJCQkJCQlhcHBseUFsbChjb21wbGV0ZSwgdGhpcywgYXJndW1lbnRzKTsKCQkJCQkJdC5wb3BMb2FkaW5nKCk7CgkJCQkJfQoJCQkJfSkpOwoJCQl9ZWxzZXsKCQkJCWNhbGxiYWNrKCk7CgkJCX0KCQl9Cgl9CgkKCQoJCgkvKiBTb3VyY2VzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCWZ1bmN0aW9uIGFkZEV2ZW50U291cmNlKHNvdXJjZUlucHV0KSB7CgkJdmFyIHNvdXJjZSA9IGJ1aWxkRXZlbnRTb3VyY2Uoc291cmNlSW5wdXQpOwoJCWlmIChzb3VyY2UpIHsKCQkJc291cmNlcy5wdXNoKHNvdXJjZSk7CgkJCWZldGNoRXZlbnRTb3VyY2VzKFsgc291cmNlIF0sICdhZGQnKTsgLy8gd2lsbCBldmVudHVhbGx5IGNhbGwgcmVwb3J0RXZlbnRzCgkJfQoJfQoKCglmdW5jdGlvbiBidWlsZEV2ZW50U291cmNlKHNvdXJjZUlucHV0KSB7IC8vIHdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiBpbnZhbGlkIHNvdXJjZQoJCXZhciBub3JtYWxpemVycyA9IEZDLnNvdXJjZU5vcm1hbGl6ZXJzOwoJCXZhciBzb3VyY2U7CgkJdmFyIGk7CgoJCWlmICgkLmlzRnVuY3Rpb24oc291cmNlSW5wdXQpIHx8ICQuaXNBcnJheShzb3VyY2VJbnB1dCkpIHsKCQkJc291cmNlID0geyBldmVudHM6IHNvdXJjZUlucHV0IH07CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBzb3VyY2VJbnB1dCA9PT0gJ3N0cmluZycpIHsKCQkJc291cmNlID0geyB1cmw6IHNvdXJjZUlucHV0IH07CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBzb3VyY2VJbnB1dCA9PT0gJ29iamVjdCcpIHsKCQkJc291cmNlID0gJC5leHRlbmQoe30sIHNvdXJjZUlucHV0KTsgLy8gc2hhbGxvdyBjb3B5CgkJfQoKCQlpZiAoc291cmNlKSB7CgoJCQkvLyBUT0RPOiByZXBlYXQgY29kZSwgc2FtZSBjb2RlIGZvciBldmVudCBjbGFzc05hbWVzCgkJCWlmIChzb3VyY2UuY2xhc3NOYW1lKSB7CgkJCQlpZiAodHlwZW9mIHNvdXJjZS5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7CgkJCQkJc291cmNlLmNsYXNzTmFtZSA9IHNvdXJjZS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pOwoJCQkJfQoJCQkJLy8gb3RoZXJ3aXNlLCBhc3N1bWVkIHRvIGJlIGFuIGFycmF5CgkJCX0KCQkJZWxzZSB7CgkJCQlzb3VyY2UuY2xhc3NOYW1lID0gW107CgkJCX0KCgkJCS8vIGZvciBhcnJheSBzb3VyY2VzLCB3ZSBjb252ZXJ0IHRvIHN0YW5kYXJkIEV2ZW50IE9iamVjdHMgdXAgZnJvbnQKCQkJaWYgKCQuaXNBcnJheShzb3VyY2UuZXZlbnRzKSkgewoJCQkJc291cmNlLm9yaWdBcnJheSA9IHNvdXJjZS5ldmVudHM7IC8vIGZvciByZW1vdmVFdmVudFNvdXJjZQoJCQkJc291cmNlLmV2ZW50cyA9ICQubWFwKHNvdXJjZS5ldmVudHMsIGZ1bmN0aW9uKGV2ZW50SW5wdXQpIHsKCQkJCQlyZXR1cm4gYnVpbGRFdmVudEZyb21JbnB1dChldmVudElucHV0LCBzb3VyY2UpOwoJCQkJfSk7CgkJCX0KCgkJCWZvciAoaT0wOyBpPG5vcm1hbGl6ZXJzLmxlbmd0aDsgaSsrKSB7CgkJCQlub3JtYWxpemVyc1tpXS5jYWxsKHQsIHNvdXJjZSk7CgkJCX0KCgkJCXJldHVybiBzb3VyY2U7CgkJfQoJfQoKCglmdW5jdGlvbiByZW1vdmVFdmVudFNvdXJjZShtYXRjaElucHV0KSB7CgkJcmVtb3ZlU3BlY2lmaWNFdmVudFNvdXJjZXMoCgkJCWdldEV2ZW50U291cmNlc0J5TWF0Y2gobWF0Y2hJbnB1dCkKCQkpOwoJfQoKCgkvLyBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsIHJlbW92ZXMgYWxsLgoJZnVuY3Rpb24gcmVtb3ZlRXZlbnRTb3VyY2VzKG1hdGNoSW5wdXRzKSB7CgkJaWYgKG1hdGNoSW5wdXRzID09IG51bGwpIHsKCQkJcmVtb3ZlU3BlY2lmaWNFdmVudFNvdXJjZXMoc291cmNlcywgdHJ1ZSk7IC8vIGlzQWxsPXRydWUKCQl9CgkJZWxzZSB7CgkJCXJlbW92ZVNwZWNpZmljRXZlbnRTb3VyY2VzKAoJCQkJZ2V0RXZlbnRTb3VyY2VzQnlNYXRjaEFycmF5KG1hdGNoSW5wdXRzKQoJCQkpOwoJCX0KCX0KCgoJZnVuY3Rpb24gcmVtb3ZlU3BlY2lmaWNFdmVudFNvdXJjZXModGFyZ2V0U291cmNlcywgaXNBbGwpIHsKCQl2YXIgaTsKCgkJLy8gY2FuY2VsIHBlbmRpbmcgcmVxdWVzdHMKCQlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0U291cmNlcy5sZW5ndGg7IGkrKykgewoJCQlyZWplY3RFdmVudFNvdXJjZSh0YXJnZXRTb3VyY2VzW2ldKTsKCQl9CgoJCWlmIChpc0FsbCkgeyAvLyBhbiBvcHRpbWl6YXRpb24KCQkJc291cmNlcyA9IFtdOwoJCQljYWNoZSA9IFtdOwoJCX0KCQllbHNlIHsKCQkJLy8gcmVtb3ZlIGZyb20gcGVyc2lzdGVkIHNvdXJjZSBsaXN0CgkJCXNvdXJjZXMgPSAkLmdyZXAoc291cmNlcywgZnVuY3Rpb24oc291cmNlKSB7CgkJCQlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0U291cmNlcy5sZW5ndGg7IGkrKykgewoJCQkJCWlmIChzb3VyY2UgPT09IHRhcmdldFNvdXJjZXNbaV0pIHsKCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBleGNsdWRlCgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHRydWU7IC8vIGluY2x1ZGUKCQkJfSk7CgoJCQljYWNoZSA9IGV4Y2x1ZGVFdmVudHNCeVNvdXJjZXMoY2FjaGUsIHRhcmdldFNvdXJjZXMpOwoJCX0KCgkJcmVwb3J0RXZlbnRzKGNhY2hlKTsKCX0KCgoJZnVuY3Rpb24gZ2V0RXZlbnRTb3VyY2VzKCkgewoJCXJldHVybiBzb3VyY2VzLnNsaWNlKDEpOyAvLyByZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHNvdXJjZXMgd2l0aCBzdGlja3lTb3VyY2UgcmVtb3ZlZAoJfQoKCglmdW5jdGlvbiBnZXRFdmVudFNvdXJjZUJ5SWQoaWQpIHsKCQlyZXR1cm4gJC5ncmVwKHNvdXJjZXMsIGZ1bmN0aW9uKHNvdXJjZSkgewoJCQlyZXR1cm4gc291cmNlLmlkICYmIHNvdXJjZS5pZCA9PT0gaWQ7CgkJfSlbMF07Cgl9CgoKCS8vIGxpa2UgZ2V0RXZlbnRTb3VyY2VzQnlNYXRjaCwgYnV0IGFjY2VwdHMgbXVsdHBsZSBtYXRjaCBjcml0ZXJpYSAobGlrZSBtdWx0aXBsZSBJRHMpCglmdW5jdGlvbiBnZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXkobWF0Y2hJbnB1dHMpIHsKCgkJLy8gY29lcmNlIGludG8gYW4gYXJyYXkKCQlpZiAoIW1hdGNoSW5wdXRzKSB7CgkJCW1hdGNoSW5wdXRzID0gW107CgkJfQoJCWVsc2UgaWYgKCEkLmlzQXJyYXkobWF0Y2hJbnB1dHMpKSB7CgkJCW1hdGNoSW5wdXRzID0gWyBtYXRjaElucHV0cyBdOwoJCX0KCgkJdmFyIG1hdGNoaW5nU291cmNlcyA9IFtdOwoJCXZhciBpOwoKCQkvLyByZXNvbHZlIHJhdyBpbnB1dHMgdG8gcmVhbCBldmVudCBzb3VyY2Ugb2JqZWN0cwoJCWZvciAoaSA9IDA7IGkgPCBtYXRjaElucHV0cy5sZW5ndGg7IGkrKykgewoJCQltYXRjaGluZ1NvdXJjZXMucHVzaC5hcHBseSggLy8gYXBwZW5kCgkJCQltYXRjaGluZ1NvdXJjZXMsCgkJCQlnZXRFdmVudFNvdXJjZXNCeU1hdGNoKG1hdGNoSW5wdXRzW2ldKQoJCQkpOwoJCX0KCgkJcmV0dXJuIG1hdGNoaW5nU291cmNlczsKCX0KCgoJLy8gbWF0Y2hJbnB1dCBjYW4gZWl0aGVyIGJ5IGEgcmVhbCBldmVudCBzb3VyY2Ugb2JqZWN0LCBhbiBJRCwgb3IgdGhlIGZ1bmN0aW9uL1VSTCBmb3IgdGhlIHNvdXJjZS4KCS8vIHJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hpbmcgc291cmNlIG9iamVjdHMuCglmdW5jdGlvbiBnZXRFdmVudFNvdXJjZXNCeU1hdGNoKG1hdGNoSW5wdXQpIHsKCQl2YXIgaSwgc291cmNlOwoKCQkvLyBnaXZlbiBhbiBwcm9wZXIgZXZlbnQgc291cmNlIG9iamVjdAoJCWZvciAoaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CgkJCXNvdXJjZSA9IHNvdXJjZXNbaV07CgkJCWlmIChzb3VyY2UgPT09IG1hdGNoSW5wdXQpIHsKCQkJCXJldHVybiBbIHNvdXJjZSBdOwoJCQl9CgkJfQoKCQkvLyBhbiBJRCBtYXRjaAoJCXNvdXJjZSA9IGdldEV2ZW50U291cmNlQnlJZChtYXRjaElucHV0KTsKCQlpZiAoc291cmNlKSB7CgkJCXJldHVybiBbIHNvdXJjZSBdOwoJCX0KCgkJcmV0dXJuICQuZ3JlcChzb3VyY2VzLCBmdW5jdGlvbihzb3VyY2UpIHsKCQkJcmV0dXJuIGlzU291cmNlc0VxdWl2YWxlbnQobWF0Y2hJbnB1dCwgc291cmNlKTsKCQl9KTsKCX0KCgoJZnVuY3Rpb24gaXNTb3VyY2VzRXF1aXZhbGVudChzb3VyY2UxLCBzb3VyY2UyKSB7CgkJcmV0dXJuIHNvdXJjZTEgJiYgc291cmNlMiAmJiBnZXRTb3VyY2VQcmltaXRpdmUoc291cmNlMSkgPT0gZ2V0U291cmNlUHJpbWl0aXZlKHNvdXJjZTIpOwoJfQoKCglmdW5jdGlvbiBnZXRTb3VyY2VQcmltaXRpdmUoc291cmNlKSB7CgkJcmV0dXJuICgKCQkJKHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKSA/IC8vIGEgbm9ybWFsaXplZCBldmVudCBzb3VyY2U/CgkJCQkoc291cmNlLm9yaWdBcnJheSB8fCBzb3VyY2UuZ29vZ2xlQ2FsZW5kYXJJZCB8fCBzb3VyY2UudXJsIHx8IHNvdXJjZS5ldmVudHMpIDogLy8gZ2V0IHRoZSBwcmltaXRpdmUKCQkJCW51bGwKCQkpIHx8CgkJc291cmNlOyAvLyB0aGUgZ2l2ZW4gYXJndW1lbnQgKmlzKiB0aGUgcHJpbWl0aXZlCgl9CgoKCS8vIHV0aWwKCS8vIHJldHVybnMgYSBmaWx0ZXJlZCBhcnJheSB3aXRob3V0IGV2ZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGFueSBvZiB0aGUgZ2l2ZW4gc291cmNlcwoJZnVuY3Rpb24gZXhjbHVkZUV2ZW50c0J5U291cmNlcyhzcGVjaWZpY0V2ZW50cywgc3BlY2lmaWNTb3VyY2VzKSB7CgkJcmV0dXJuICQuZ3JlcChzcGVjaWZpY0V2ZW50cywgZnVuY3Rpb24oZXZlbnQpIHsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzcGVjaWZpY1NvdXJjZXMubGVuZ3RoOyBpKyspIHsKCQkJCWlmIChldmVudC5zb3VyY2UgPT09IHNwZWNpZmljU291cmNlc1tpXSkgewoJCQkJCXJldHVybiBmYWxzZTsgLy8gZXhjbHVkZQoJCQkJfQoJCQl9CgkJCXJldHVybiB0cnVlOyAvLyBrZWVwCgkJfSk7Cgl9CgkKCQoJCgkvKiBNYW5pcHVsYXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gT25seSBldmVyIGNhbGxlZCBmcm9tIHRoZSBleHRlcm5hbGx5LWZhY2luZyBBUEkKCWZ1bmN0aW9uIHVwZGF0ZUV2ZW50KGV2ZW50KSB7CgoJCS8vIG1hc3NhZ2Ugc3RhcnQvZW5kIHZhbHVlcywgZXZlbiBpZiBkYXRlIHN0cmluZyB2YWx1ZXMKCQlldmVudC5zdGFydCA9IHQubW9tZW50KGV2ZW50LnN0YXJ0KTsKCQlpZiAoZXZlbnQuZW5kKSB7CgkJCWV2ZW50LmVuZCA9IHQubW9tZW50KGV2ZW50LmVuZCk7CgkJfQoJCWVsc2UgewoJCQlldmVudC5lbmQgPSBudWxsOwoJCX0KCgkJbXV0YXRlRXZlbnQoZXZlbnQsIGdldE1pc2NFdmVudFByb3BzKGV2ZW50KSk7IC8vIHdpbGwgaGFuZGxlIHN0YXJ0L2VuZC9hbGxEYXkgbm9ybWFsaXphdGlvbgoJCXJlcG9ydEV2ZW50cyhjYWNoZSk7IC8vIHJlcG9ydHMgZXZlbnQgbW9kaWZpY2F0aW9ucyAoc28gd2UgY2FuIHJlZHJhdykKCX0KCgoJLy8gUmV0dXJucyBhIGhhc2ggb2YgbWlzYyBldmVudCBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIGNvcGllZCBvdmVyIHRvIHJlbGF0ZWQgZXZlbnRzLgoJZnVuY3Rpb24gZ2V0TWlzY0V2ZW50UHJvcHMoZXZlbnQpIHsKCQl2YXIgcHJvcHMgPSB7fTsKCgkJJC5lYWNoKGV2ZW50LCBmdW5jdGlvbihuYW1lLCB2YWwpIHsKCQkJaWYgKGlzTWlzY0V2ZW50UHJvcE5hbWUobmFtZSkpIHsKCQkJCWlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiBpc0F0b21pYyh2YWwpKSB7IC8vIGEgZGVmaW5lZCBub24tb2JqZWN0CgkJCQkJcHJvcHNbbmFtZV0gPSB2YWw7CgkJCQl9CgkJCX0KCQl9KTsKCgkJcmV0dXJuIHByb3BzOwoJfQoKCS8vIG5vbi1kYXRlLXJlbGF0ZWQsIG5vbi1pZC1yZWxhdGVkLCBub24tc2VjcmV0CglmdW5jdGlvbiBpc01pc2NFdmVudFByb3BOYW1lKG5hbWUpIHsKCQlyZXR1cm4gIS9eX3xeKGlkfGFsbERheXxzdGFydHxlbmQpJC8udGVzdChuYW1lKTsKCX0KCgkKCS8vIHJldHVybnMgdGhlIGV4cGFuZGVkIGV2ZW50cyB0aGF0IHdlcmUgY3JlYXRlZAoJZnVuY3Rpb24gcmVuZGVyRXZlbnQoZXZlbnRJbnB1dCwgc3RpY2spIHsKCQl2YXIgYWJzdHJhY3RFdmVudCA9IGJ1aWxkRXZlbnRGcm9tSW5wdXQoZXZlbnRJbnB1dCk7CgkJdmFyIGV2ZW50czsKCQl2YXIgaSwgZXZlbnQ7CgoJCWlmIChhYnN0cmFjdEV2ZW50KSB7IC8vIG5vdCBmYWxzZSAoYSB2YWxpZCBpbnB1dCkKCQkJZXZlbnRzID0gZXhwYW5kRXZlbnQoYWJzdHJhY3RFdmVudCk7CgoJCQlmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7CgkJCQlldmVudCA9IGV2ZW50c1tpXTsKCgkJCQlpZiAoIWV2ZW50LnNvdXJjZSkgewoJCQkJCWlmIChzdGljaykgewoJCQkJCQlzdGlja3lTb3VyY2UuZXZlbnRzLnB1c2goZXZlbnQpOwoJCQkJCQlldmVudC5zb3VyY2UgPSBzdGlja3lTb3VyY2U7CgkJCQkJfQoJCQkJCWNhY2hlLnB1c2goZXZlbnQpOwoJCQkJfQoJCQl9CgoJCQlyZXBvcnRFdmVudHMoY2FjaGUpOwoKCQkJcmV0dXJuIGV2ZW50czsKCQl9CgoJCXJldHVybiBbXTsKCX0KCQoJCglmdW5jdGlvbiByZW1vdmVFdmVudHMoZmlsdGVyKSB7CgkJdmFyIGV2ZW50SUQ7CgkJdmFyIGk7CgoJCWlmIChmaWx0ZXIgPT0gbnVsbCkgeyAvLyBudWxsIG9yIHVuZGVmaW5lZC4gcmVtb3ZlIGFsbCBldmVudHMKCQkJZmlsdGVyID0gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9OyAvLyB3aWxsIGFsd2F5cyBtYXRjaAoJCX0KCQllbHNlIGlmICghJC5pc0Z1bmN0aW9uKGZpbHRlcikpIHsgLy8gYW4gZXZlbnQgSUQKCQkJZXZlbnRJRCA9IGZpbHRlciArICcnOwoJCQlmaWx0ZXIgPSBmdW5jdGlvbihldmVudCkgewoJCQkJcmV0dXJuIGV2ZW50Ll9pZCA9PSBldmVudElEOwoJCQl9OwoJCX0KCgkJLy8gUHVyZ2UgZXZlbnQocykgZnJvbSBvdXIgbG9jYWwgY2FjaGUKCQljYWNoZSA9ICQuZ3JlcChjYWNoZSwgZmlsdGVyLCB0cnVlKTsgLy8gaW52ZXJzZT10cnVlCgoJCS8vIFJlbW92ZSBldmVudHMgZnJvbSBhcnJheSBzb3VyY2VzLgoJCS8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGV5IGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gb2ZmaWNpYWwgRXZlbnQgT2JqZWN0cyB1cCBmcm9udC4KCQkvLyAoYW5kIGFzIGEgcmVzdWx0LCBldmVudC5faWQgaGFzIGJlZW4gY2FsY3VsYXRlZCkuCgkJZm9yIChpPTA7IGk8c291cmNlcy5sZW5ndGg7IGkrKykgewoJCQlpZiAoJC5pc0FycmF5KHNvdXJjZXNbaV0uZXZlbnRzKSkgewoJCQkJc291cmNlc1tpXS5ldmVudHMgPSAkLmdyZXAoc291cmNlc1tpXS5ldmVudHMsIGZpbHRlciwgdHJ1ZSk7CgkJCX0KCQl9CgoJCXJlcG9ydEV2ZW50cyhjYWNoZSk7Cgl9CgoJCglmdW5jdGlvbiBjbGllbnRFdmVudHMoZmlsdGVyKSB7CgkJaWYgKCQuaXNGdW5jdGlvbihmaWx0ZXIpKSB7CgkJCXJldHVybiAkLmdyZXAoY2FjaGUsIGZpbHRlcik7CgkJfQoJCWVsc2UgaWYgKGZpbHRlciAhPSBudWxsKSB7IC8vIG5vdCBudWxsLCBub3QgdW5kZWZpbmVkLiBhbiBldmVudCBJRAoJCQlmaWx0ZXIgKz0gJyc7CgkJCXJldHVybiAkLmdyZXAoY2FjaGUsIGZ1bmN0aW9uKGUpIHsKCQkJCXJldHVybiBlLl9pZCA9PSBmaWx0ZXI7CgkJCX0pOwoJCX0KCQlyZXR1cm4gY2FjaGU7IC8vIGVsc2UsIHJldHVybiBhbGwKCX0KCgoJLy8gTWFrZXMgc3VyZSBhbGwgYXJyYXkgZXZlbnQgc291cmNlcyBoYXZlIHRoZWlyIGludGVybmFsIGV2ZW50IG9iamVjdHMKCS8vIGNvbnZlcnRlZCBvdmVyIHRvIHRoZSBDYWxlbmRhcidzIGN1cnJlbnQgdGltZXpvbmUuCgl0LnJlem9uZUFycmF5RXZlbnRTb3VyY2VzID0gZnVuY3Rpb24oKSB7CgkJdmFyIGk7CgkJdmFyIGV2ZW50czsKCQl2YXIgajsKCgkJZm9yIChpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHsKCQkJZXZlbnRzID0gc291cmNlc1tpXS5ldmVudHM7CgkJCWlmICgkLmlzQXJyYXkoZXZlbnRzKSkgewoKCQkJCWZvciAoaiA9IDA7IGogPCBldmVudHMubGVuZ3RoOyBqKyspIHsKCQkJCQlyZXpvbmVFdmVudERhdGVzKGV2ZW50c1tqXSk7CgkJCQl9CgkJCX0KCQl9Cgl9OwoKCWZ1bmN0aW9uIHJlem9uZUV2ZW50RGF0ZXMoZXZlbnQpIHsKCQlldmVudC5zdGFydCA9IHQubW9tZW50KGV2ZW50LnN0YXJ0KTsKCQlpZiAoZXZlbnQuZW5kKSB7CgkJCWV2ZW50LmVuZCA9IHQubW9tZW50KGV2ZW50LmVuZCk7CgkJfQoJCWJhY2t1cEV2ZW50RGF0ZXMoZXZlbnQpOwoJfQoJCgkKCS8qIEV2ZW50IE5vcm1hbGl6YXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gR2l2ZW4gYSByYXcgb2JqZWN0IHdpdGgga2V5L3ZhbHVlIHByb3BlcnRpZXMsIHJldHVybnMgYW4gImFic3RyYWN0IiBFdmVudCBvYmplY3QuCgkvLyBBbiAiYWJzdHJhY3QiIGV2ZW50IGlzIGFuIGV2ZW50IHRoYXQsIGlmIHJlY3VycmluZywgd2lsbCBub3QgaGF2ZSBiZWVuIGV4cGFuZGVkIHlldC4KCS8vIFdpbGwgcmV0dXJuIGBmYWxzZWAgd2hlbiBpbnB1dCBpcyBpbnZhbGlkLgoJLy8gYHNvdXJjZWAgaXMgb3B0aW9uYWwKCWZ1bmN0aW9uIGJ1aWxkRXZlbnRGcm9tSW5wdXQoaW5wdXQsIHNvdXJjZSkgewoJCXZhciBvdXQgPSB7fTsKCQl2YXIgc3RhcnQsIGVuZDsKCQl2YXIgYWxsRGF5OwoKCQlpZiAodC5vcHRpb25zLmV2ZW50RGF0YVRyYW5zZm9ybSkgewoJCQlpbnB1dCA9IHQub3B0aW9ucy5ldmVudERhdGFUcmFuc2Zvcm0oaW5wdXQpOwoJCX0KCQlpZiAoc291cmNlICYmIHNvdXJjZS5ldmVudERhdGFUcmFuc2Zvcm0pIHsKCQkJaW5wdXQgPSBzb3VyY2UuZXZlbnREYXRhVHJhbnNmb3JtKGlucHV0KTsKCQl9CgoJCS8vIENvcHkgYWxsIHByb3BlcnRpZXMgb3ZlciB0byB0aGUgcmVzdWx0aW5nIG9iamVjdC4KCQkvLyBUaGUgc3BlY2lhbC1jYXNlIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgb3ZlciBhZnRlcndhcmRzLgoJCSQuZXh0ZW5kKG91dCwgaW5wdXQpOwoKCQlpZiAoc291cmNlKSB7CgkJCW91dC5zb3VyY2UgPSBzb3VyY2U7CgkJfQoKCQlvdXQuX2lkID0gaW5wdXQuX2lkIHx8IChpbnB1dC5pZCA9PT0gdW5kZWZpbmVkID8gJ19mYycgKyBldmVudEdVSUQrKyA6IGlucHV0LmlkICsgJycpOwoKCQlpZiAoaW5wdXQuY2xhc3NOYW1lKSB7CgkJCWlmICh0eXBlb2YgaW5wdXQuY2xhc3NOYW1lID09ICdzdHJpbmcnKSB7CgkJCQlvdXQuY2xhc3NOYW1lID0gaW5wdXQuY2xhc3NOYW1lLnNwbGl0KC9ccysvKTsKCQkJfQoJCQllbHNlIHsgLy8gYXNzdW1lZCB0byBiZSBhbiBhcnJheQoJCQkJb3V0LmNsYXNzTmFtZSA9IGlucHV0LmNsYXNzTmFtZTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJb3V0LmNsYXNzTmFtZSA9IFtdOwoJCX0KCgkJc3RhcnQgPSBpbnB1dC5zdGFydCB8fCBpbnB1dC5kYXRlOyAvLyAiZGF0ZSIgaXMgYW4gYWxpYXMgZm9yICJzdGFydCIKCQllbmQgPSBpbnB1dC5lbmQ7CgoJCS8vIHBhcnNlIGFzIGEgdGltZSAoRHVyYXRpb24pIGlmIGFwcGxpY2FibGUKCQlpZiAoaXNUaW1lU3RyaW5nKHN0YXJ0KSkgewoJCQlzdGFydCA9IG1vbWVudC5kdXJhdGlvbihzdGFydCk7CgkJfQoJCWlmIChpc1RpbWVTdHJpbmcoZW5kKSkgewoJCQllbmQgPSBtb21lbnQuZHVyYXRpb24oZW5kKTsKCQl9CgoJCWlmIChpbnB1dC5kb3cgfHwgbW9tZW50LmlzRHVyYXRpb24oc3RhcnQpIHx8IG1vbWVudC5pc0R1cmF0aW9uKGVuZCkpIHsKCgkJCS8vIHRoZSBldmVudCBpcyAiYWJzdHJhY3QiIChyZWN1cnJpbmcpIHNvIGRvbid0IGNhbGN1bGF0ZSBleGFjdCBzdGFydC9lbmQgZGF0ZXMganVzdCB5ZXQKCQkJb3V0LnN0YXJ0ID0gc3RhcnQgPyBtb21lbnQuZHVyYXRpb24oc3RhcnQpIDogbnVsbDsgLy8gd2lsbCBiZSBhIER1cmF0aW9uIG9yIG51bGwKCQkJb3V0LmVuZCA9IGVuZCA/IG1vbWVudC5kdXJhdGlvbihlbmQpIDogbnVsbDsgLy8gd2lsbCBiZSBhIER1cmF0aW9uIG9yIG51bGwKCQkJb3V0Ll9yZWN1cnJpbmcgPSB0cnVlOyAvLyBvdXIgaW50ZXJuYWwgbWFya2VyCgkJfQoJCWVsc2UgewoKCQkJaWYgKHN0YXJ0KSB7CgkJCQlzdGFydCA9IHQubW9tZW50KHN0YXJ0KTsKCQkJCWlmICghc3RhcnQuaXNWYWxpZCgpKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQlpZiAoZW5kKSB7CgkJCQllbmQgPSB0Lm1vbWVudChlbmQpOwoJCQkJaWYgKCFlbmQuaXNWYWxpZCgpKSB7CgkJCQkJZW5kID0gbnVsbDsgLy8gbGV0IGRlZmF1bHRzIHRha2Ugb3ZlcgoJCQkJfQoJCQl9CgoJCQlhbGxEYXkgPSBpbnB1dC5hbGxEYXk7CgkJCWlmIChhbGxEYXkgPT09IHVuZGVmaW5lZCkgeyAvLyBzdGlsbCB1bmRlZmluZWQ/IGZhbGxiYWNrIHRvIGRlZmF1bHQKCQkJCWFsbERheSA9IGZpcnN0RGVmaW5lZCgKCQkJCQlzb3VyY2UgPyBzb3VyY2UuYWxsRGF5RGVmYXVsdCA6IHVuZGVmaW5lZCwKCQkJCQl0Lm9wdGlvbnMuYWxsRGF5RGVmYXVsdAoJCQkJKTsKCQkJCS8vIHN0aWxsIHVuZGVmaW5lZD8gbm9ybWFsaXplRXZlbnREYXRlcyB3aWxsIGNhbGN1bGF0ZSBpdAoJCQl9CgoJCQlhc3NpZ25EYXRlc1RvRXZlbnQoc3RhcnQsIGVuZCwgYWxsRGF5LCBvdXQpOwoJCX0KCgkJdC5ub3JtYWxpemVFdmVudChvdXQpOyAvLyBob29rIGZvciBleHRlcm5hbCB1c2UuIGEgcHJvdG90eXBlIG1ldGhvZAoKCQlyZXR1cm4gb3V0OwoJfQoJdC5idWlsZEV2ZW50RnJvbUlucHV0ID0gYnVpbGRFdmVudEZyb21JbnB1dDsKCgoJLy8gTm9ybWFsaXplcyBhbmQgYXNzaWducyB0aGUgZ2l2ZW4gZGF0ZXMgdG8gdGhlIGdpdmVuIHBhcnRpYWxseS1mb3JtZWQgZXZlbnQgb2JqZWN0LgoJLy8gTk9URTogbXV0YXRlcyB0aGUgZ2l2ZW4gc3RhcnQvZW5kIG1vbWVudHMuIGRvZXMgbm90IG1ha2UgYSBjb3B5LgoJZnVuY3Rpb24gYXNzaWduRGF0ZXNUb0V2ZW50KHN0YXJ0LCBlbmQsIGFsbERheSwgZXZlbnQpIHsKCQlldmVudC5zdGFydCA9IHN0YXJ0OwoJCWV2ZW50LmVuZCA9IGVuZDsKCQlldmVudC5hbGxEYXkgPSBhbGxEYXk7CgkJbm9ybWFsaXplRXZlbnREYXRlcyhldmVudCk7CgkJYmFja3VwRXZlbnREYXRlcyhldmVudCk7Cgl9CgoKCS8vIEVuc3VyZXMgcHJvcGVyIHZhbHVlcyBmb3IgYWxsRGF5L3N0YXJ0L2VuZC4gQWNjZXB0cyBhbiBFdmVudCBvYmplY3QsIG9yIGEgcGxhaW4gb2JqZWN0IHdpdGggZXZlbnQtaXNoIHByb3BlcnRpZXMuCgkvLyBOT1RFOiBXaWxsIG1vZGlmeSB0aGUgZ2l2ZW4gb2JqZWN0LgoJZnVuY3Rpb24gbm9ybWFsaXplRXZlbnREYXRlcyhldmVudFByb3BzKSB7CgoJCW5vcm1hbGl6ZUV2ZW50VGltZXMoZXZlbnRQcm9wcyk7CgoJCWlmIChldmVudFByb3BzLmVuZCAmJiAhZXZlbnRQcm9wcy5lbmQuaXNBZnRlcihldmVudFByb3BzLnN0YXJ0KSkgewoJCQlldmVudFByb3BzLmVuZCA9IG51bGw7CgkJfQoKCQlpZiAoIWV2ZW50UHJvcHMuZW5kKSB7CgkJCWlmICh0Lm9wdGlvbnMuZm9yY2VFdmVudER1cmF0aW9uKSB7CgkJCQlldmVudFByb3BzLmVuZCA9IHQuZ2V0RGVmYXVsdEV2ZW50RW5kKGV2ZW50UHJvcHMuYWxsRGF5LCBldmVudFByb3BzLnN0YXJ0KTsKCQkJfQoJCQllbHNlIHsKCQkJCWV2ZW50UHJvcHMuZW5kID0gbnVsbDsKCQkJfQoJCX0KCX0KCgoJLy8gRW5zdXJlcyB0aGUgYWxsRGF5IHByb3BlcnR5IGV4aXN0cyBhbmQgdGhlIHRpbWVsaW5lc3Mgb2YgdGhlIHN0YXJ0L2VuZCBkYXRlcyBhcmUgY29uc2lzdGVudAoJZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRUaW1lcyhldmVudFByb3BzKSB7CgkJaWYgKGV2ZW50UHJvcHMuYWxsRGF5ID09IG51bGwpIHsKCQkJZXZlbnRQcm9wcy5hbGxEYXkgPSAhKGV2ZW50UHJvcHMuc3RhcnQuaGFzVGltZSgpIHx8IChldmVudFByb3BzLmVuZCAmJiBldmVudFByb3BzLmVuZC5oYXNUaW1lKCkpKTsKCQl9CgoJCWlmIChldmVudFByb3BzLmFsbERheSkgewoJCQlldmVudFByb3BzLnN0YXJ0LnN0cmlwVGltZSgpOwoJCQlpZiAoZXZlbnRQcm9wcy5lbmQpIHsKCQkJCS8vIFRPRE86IGNvbnNpZGVyIG5leHREYXlUaHJlc2hvbGQgaGVyZT8gSWYgc28sIHdpbGwgcmVxdWlyZSBhIGxvdCBvZiB0ZXN0aW5nIGFuZCBhZGp1c3RtZW50CgkJCQlldmVudFByb3BzLmVuZC5zdHJpcFRpbWUoKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCFldmVudFByb3BzLnN0YXJ0Lmhhc1RpbWUoKSkgewoJCQkJZXZlbnRQcm9wcy5zdGFydCA9IHQuYXBwbHlUaW1lem9uZShldmVudFByb3BzLnN0YXJ0LnRpbWUoMCkpOyAvLyB3aWxsIGFzc2lnbiBhIDAwOjAwIHRpbWUKCQkJfQoJCQlpZiAoZXZlbnRQcm9wcy5lbmQgJiYgIWV2ZW50UHJvcHMuZW5kLmhhc1RpbWUoKSkgewoJCQkJZXZlbnRQcm9wcy5lbmQgPSB0LmFwcGx5VGltZXpvbmUoZXZlbnRQcm9wcy5lbmQudGltZSgwKSk7IC8vIHdpbGwgYXNzaWduIGEgMDA6MDAgdGltZQoJCQl9CgkJfQoJfQoKCgkvLyBJZiB0aGUgZ2l2ZW4gZXZlbnQgaXMgYSByZWN1cnJpbmcgZXZlbnQsIGJyZWFrIGl0IGRvd24gaW50byBhbiBhcnJheSBvZiBpbmRpdmlkdWFsIGluc3RhbmNlcy4KCS8vIElmIG5vdCBhIHJlY3VycmluZyBldmVudCwgcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIHNpbmdsZSBvcmlnaW5hbCBldmVudC4KCS8vIElmIGdpdmVuIGEgZmFsc3kgaW5wdXQgKHByb2JhYmx5IGJlY2F1c2Ugb2YgYSBmYWlsZWQgYnVpbGRFdmVudEZyb21JbnB1dCBjYWxsKSwgcmV0dXJucyBhbiBlbXB0eSBhcnJheS4KCS8vIEhBQ0s6IGNhbiBvdmVycmlkZSB0aGUgcmVjdXJyaW5nIHdpbmRvdyBieSBwcm92aWRpbmcgY3VzdG9tIHJhbmdlU3RhcnQvcmFuZ2VFbmQgKGZvciBidXNpbmVzc0hvdXJzKS4KCWZ1bmN0aW9uIGV4cGFuZEV2ZW50KGFic3RyYWN0RXZlbnQsIF9yYW5nZVN0YXJ0LCBfcmFuZ2VFbmQpIHsKCQl2YXIgZXZlbnRzID0gW107CgkJdmFyIGRvd0hhc2g7CgkJdmFyIGRvdzsKCQl2YXIgaTsKCQl2YXIgZGF0ZTsKCQl2YXIgc3RhcnRUaW1lLCBlbmRUaW1lOwoJCXZhciBzdGFydCwgZW5kOwoJCXZhciBldmVudDsKCgkJX3JhbmdlU3RhcnQgPSBfcmFuZ2VTdGFydCB8fCByYW5nZVN0YXJ0OwoJCV9yYW5nZUVuZCA9IF9yYW5nZUVuZCB8fCByYW5nZUVuZDsKCgkJaWYgKGFic3RyYWN0RXZlbnQpIHsKCQkJaWYgKGFic3RyYWN0RXZlbnQuX3JlY3VycmluZykgewoKCQkJCS8vIG1ha2UgYSBib29sZWFuIGhhc2ggYXMgdG8gd2hldGhlciB0aGUgZXZlbnQgb2NjdXJzIG9uIGVhY2ggZGF5LW9mLXdlZWsKCQkJCWlmICgoZG93ID0gYWJzdHJhY3RFdmVudC5kb3cpKSB7CgkJCQkJZG93SGFzaCA9IHt9OwoJCQkJCWZvciAoaSA9IDA7IGkgPCBkb3cubGVuZ3RoOyBpKyspIHsKCQkJCQkJZG93SGFzaFtkb3dbaV1dID0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IGRheSBpbiB0aGUgY3VycmVudCByYW5nZQoJCQkJZGF0ZSA9IF9yYW5nZVN0YXJ0LmNsb25lKCkuc3RyaXBUaW1lKCk7IC8vIGhvbGRzIHRoZSBkYXRlIG9mIHRoZSBjdXJyZW50IGRheQoJCQkJd2hpbGUgKGRhdGUuaXNCZWZvcmUoX3JhbmdlRW5kKSkgewoKCQkJCQlpZiAoIWRvd0hhc2ggfHwgZG93SGFzaFtkYXRlLmRheSgpXSkgeyAvLyBpZiBldmVyeWRheSwgb3IgdGhpcyBwYXJ0aWN1bGFyIGRheS1vZi13ZWVrCgoJCQkJCQlzdGFydFRpbWUgPSBhYnN0cmFjdEV2ZW50LnN0YXJ0OyAvLyB0aGUgc3RvcmVkIHN0YXJ0IGFuZCBlbmQgcHJvcGVydGllcyBhcmUgdGltZXMgKER1cmF0aW9ucykKCQkJCQkJZW5kVGltZSA9IGFic3RyYWN0RXZlbnQuZW5kOyAvLyAiCgkJCQkJCXN0YXJ0ID0gZGF0ZS5jbG9uZSgpOwoJCQkJCQllbmQgPSBudWxsOwoKCQkJCQkJaWYgKHN0YXJ0VGltZSkgewoJCQkJCQkJc3RhcnQgPSBzdGFydC50aW1lKHN0YXJ0VGltZSk7CgkJCQkJCX0KCQkJCQkJaWYgKGVuZFRpbWUpIHsKCQkJCQkJCWVuZCA9IGRhdGUuY2xvbmUoKS50aW1lKGVuZFRpbWUpOwoJCQkJCQl9CgoJCQkJCQlldmVudCA9ICQuZXh0ZW5kKHt9LCBhYnN0cmFjdEV2ZW50KTsgLy8gbWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsCgkJCQkJCWFzc2lnbkRhdGVzVG9FdmVudCgKCQkJCQkJCXN0YXJ0LCBlbmQsCgkJCQkJCQkhc3RhcnRUaW1lICYmICFlbmRUaW1lLCAvLyBhbGxEYXk/CgkJCQkJCQlldmVudAoJCQkJCQkpOwoJCQkJCQlldmVudHMucHVzaChldmVudCk7CgkJCQkJfQoKCQkJCQlkYXRlLmFkZCgxLCAnZGF5cycpOwoJCQkJfQoJCQl9CgkJCWVsc2UgewoJCQkJZXZlbnRzLnB1c2goYWJzdHJhY3RFdmVudCk7IC8vIHJldHVybiB0aGUgb3JpZ2luYWwgZXZlbnQuIHdpbGwgYmUgYSBvbmUtaXRlbSBhcnJheQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnRzOwoJfQoJdC5leHBhbmRFdmVudCA9IGV4cGFuZEV2ZW50OwoKCgoJLyogRXZlbnQgTW9kaWZpY2F0aW9uIE1hdGgKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gTW9kaWZpZXMgYW4gZXZlbnQgYW5kIGFsbCByZWxhdGVkIGV2ZW50cyBieSBhcHBseWluZyB0aGUgZ2l2ZW4gcHJvcGVydGllcy4KCS8vIFNwZWNpYWwgZGF0ZS1kaWZmaW5nIGxvZ2ljIGlzIHVzZWQgZm9yIG1hbmlwdWxhdGlvbiBvZiBkYXRlcy4KCS8vIElmIGBwcm9wc2AgZG9lcyBub3QgY29udGFpbiBzdGFydC9lbmQgZGF0ZXMsIHRoZSB1cGRhdGVkIHZhbHVlcyBhcmUgYXNzdW1lZCB0byBiZSB0aGUgZXZlbnQncyBjdXJyZW50IHN0YXJ0L2VuZC4KCS8vIEFsbCBkYXRlIGNvbXBhcmlzb25zIGFyZSBkb25lIGFnYWluc3QgdGhlIGV2ZW50J3MgcHJpc3RpbmUgX3N0YXJ0IGFuZCBfZW5kIGRhdGVzLgoJLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBkZWx0YSBpbmZvcm1hdGlvbiBhbmQgYSBmdW5jdGlvbiB0byB1bmRvIGFsbCBvcGVyYXRpb25zLgoJLy8gRm9yIG1ha2luZyBjb21wdXRhdGlvbnMgaW4gYSBncmFudWxhcml0eSBncmVhdGVyIHRoYW4gZGF5L3RpbWUsIHNwZWNpZnkgbGFyZ2VVbml0LgoJLy8gTk9URTogVGhlIGdpdmVuIGBuZXdQcm9wc2AgbWlnaHQgYmUgbXV0YXRlZCBmb3Igbm9ybWFsaXphdGlvbiBwdXJwb3Nlcy4KCWZ1bmN0aW9uIG11dGF0ZUV2ZW50KGV2ZW50LCBuZXdQcm9wcywgbGFyZ2VVbml0KSB7CgkJdmFyIG1pc2NQcm9wcyA9IHt9OwoJCXZhciBvbGRQcm9wczsKCQl2YXIgY2xlYXJFbmQ7CgkJdmFyIHN0YXJ0RGVsdGE7CgkJdmFyIGVuZERlbHRhOwoJCXZhciBkdXJhdGlvbkRlbHRhOwoJCXZhciB1bmRvRnVuYzsKCgkJLy8gZGlmZnMgdGhlIGRhdGVzIGluIHRoZSBhcHByb3ByaWF0ZSB3YXksIHJldHVybmluZyBhIGR1cmF0aW9uCgkJZnVuY3Rpb24gZGlmZkRhdGVzKGRhdGUxLCBkYXRlMCkgeyAvLyBkYXRlMSAtIGRhdGUwCgkJCWlmIChsYXJnZVVuaXQpIHsKCQkJCXJldHVybiBkaWZmQnlVbml0KGRhdGUxLCBkYXRlMCwgbGFyZ2VVbml0KTsKCQkJfQoJCQllbHNlIGlmIChuZXdQcm9wcy5hbGxEYXkpIHsKCQkJCXJldHVybiBkaWZmRGF5KGRhdGUxLCBkYXRlMCk7CgkJCX0KCQkJZWxzZSB7CgkJCQlyZXR1cm4gZGlmZkRheVRpbWUoZGF0ZTEsIGRhdGUwKTsKCQkJfQoJCX0KCgkJbmV3UHJvcHMgPSBuZXdQcm9wcyB8fCB7fTsKCgkJLy8gbm9ybWFsaXplIG5ldyBkYXRlLXJlbGF0ZWQgcHJvcGVydGllcwoJCWlmICghbmV3UHJvcHMuc3RhcnQpIHsKCQkJbmV3UHJvcHMuc3RhcnQgPSBldmVudC5zdGFydC5jbG9uZSgpOwoJCX0KCQlpZiAobmV3UHJvcHMuZW5kID09PSB1bmRlZmluZWQpIHsKCQkJbmV3UHJvcHMuZW5kID0gZXZlbnQuZW5kID8gZXZlbnQuZW5kLmNsb25lKCkgOiBudWxsOwoJCX0KCQlpZiAobmV3UHJvcHMuYWxsRGF5ID09IG51bGwpIHsgLy8gaXMgbnVsbCBvciB1bmRlZmluZWQ/CgkJCW5ld1Byb3BzLmFsbERheSA9IGV2ZW50LmFsbERheTsKCQl9CgkJbm9ybWFsaXplRXZlbnREYXRlcyhuZXdQcm9wcyk7CgoJCS8vIGNyZWF0ZSBub3JtYWxpemVkIHZlcnNpb25zIG9mIHRoZSBvcmlnaW5hbCBwcm9wcyB0byBjb21wYXJlIGFnYWluc3QKCQkvLyBuZWVkIGEgcmVhbCBlbmQgdmFsdWUsIGZvciBkaWZmaW5nCgkJb2xkUHJvcHMgPSB7CgkJCXN0YXJ0OiBldmVudC5fc3RhcnQuY2xvbmUoKSwKCQkJZW5kOiBldmVudC5fZW5kID8gZXZlbnQuX2VuZC5jbG9uZSgpIDogdC5nZXREZWZhdWx0RXZlbnRFbmQoZXZlbnQuX2FsbERheSwgZXZlbnQuX3N0YXJ0KSwKCQkJYWxsRGF5OiBuZXdQcm9wcy5hbGxEYXkgLy8gbm9ybWFsaXplIHRoZSBkYXRlcyBpbiB0aGUgc2FtZSByZWdhcmQgYXMgdGhlIG5ldyBwcm9wZXJ0aWVzCgkJfTsKCQlub3JtYWxpemVFdmVudERhdGVzKG9sZFByb3BzKTsKCgkJLy8gbmVlZCB0byBjbGVhciB0aGUgZW5kIGRhdGUgaWYgZXhwbGljaXRseSBjaGFuZ2VkIHRvIG51bGwKCQljbGVhckVuZCA9IGV2ZW50Ll9lbmQgIT09IG51bGwgJiYgbmV3UHJvcHMuZW5kID09PSBudWxsOwoKCQkvLyBjb21wdXRlIHRoZSBkZWx0YSBmb3IgbW92aW5nIHRoZSBzdGFydCBkYXRlCgkJc3RhcnREZWx0YSA9IGRpZmZEYXRlcyhuZXdQcm9wcy5zdGFydCwgb2xkUHJvcHMuc3RhcnQpOwoKCQkvLyBjb21wdXRlIHRoZSBkZWx0YSBmb3IgbW92aW5nIHRoZSBlbmQgZGF0ZQoJCWlmIChuZXdQcm9wcy5lbmQpIHsKCQkJZW5kRGVsdGEgPSBkaWZmRGF0ZXMobmV3UHJvcHMuZW5kLCBvbGRQcm9wcy5lbmQpOwoJCQlkdXJhdGlvbkRlbHRhID0gZW5kRGVsdGEuc3VidHJhY3Qoc3RhcnREZWx0YSk7CgkJfQoJCWVsc2UgewoJCQlkdXJhdGlvbkRlbHRhID0gbnVsbDsKCQl9CgoJCS8vIGdhdGhlciBhbGwgbm9uLWRhdGUtcmVsYXRlZCBwcm9wZXJ0aWVzCgkJJC5lYWNoKG5ld1Byb3BzLCBmdW5jdGlvbihuYW1lLCB2YWwpIHsKCQkJaWYgKGlzTWlzY0V2ZW50UHJvcE5hbWUobmFtZSkpIHsKCQkJCWlmICh2YWwgIT09IHVuZGVmaW5lZCkgewoJCQkJCW1pc2NQcm9wc1tuYW1lXSA9IHZhbDsKCQkJCX0KCQkJfQoJCX0pOwoKCQkvLyBhcHBseSB0aGUgb3BlcmF0aW9ucyB0byB0aGUgZXZlbnQgYW5kIGFsbCByZWxhdGVkIGV2ZW50cwoJCXVuZG9GdW5jID0gbXV0YXRlRXZlbnRzKAoJCQljbGllbnRFdmVudHMoZXZlbnQuX2lkKSwgLy8gZ2V0IGV2ZW50cyB3aXRoIHRoaXMgSUQKCQkJY2xlYXJFbmQsCgkJCW5ld1Byb3BzLmFsbERheSwKCQkJc3RhcnREZWx0YSwKCQkJZHVyYXRpb25EZWx0YSwKCQkJbWlzY1Byb3BzCgkJKTsKCgkJcmV0dXJuIHsKCQkJZGF0ZURlbHRhOiBzdGFydERlbHRhLAoJCQlkdXJhdGlvbkRlbHRhOiBkdXJhdGlvbkRlbHRhLAoJCQl1bmRvOiB1bmRvRnVuYwoJCX07Cgl9CgoKCS8vIE1vZGlmaWVzIGFuIGFycmF5IG9mIGV2ZW50cyBpbiB0aGUgZm9sbG93aW5nIHdheXMgKG9wZXJhdGlvbnMgYXJlIGluIG9yZGVyKToKCS8vIC0gY2xlYXIgdGhlIGV2ZW50J3MgYGVuZGAKCS8vIC0gY29udmVydCB0aGUgZXZlbnQgdG8gYWxsRGF5CgkvLyAtIGFkZCBgZGF0ZURlbHRhYCB0byB0aGUgc3RhcnQgYW5kIGVuZAoJLy8gLSBhZGQgYGR1cmF0aW9uRGVsdGFgIHRvIHRoZSBldmVudCdzIGR1cmF0aW9uCgkvLyAtIGFzc2lnbiBgbWlzY1Byb3BzYCB0byB0aGUgZXZlbnQKCS8vCgkvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIHVuZG8gYWxsIHRoZSBvcGVyYXRpb25zLgoJLy8KCS8vIFRPRE86IGRvbid0IHVzZSBzbyBtYW55IGNsb3N1cmVzLiBwb3NzaWJsZSBtZW1vcnkgaXNzdWVzIHdoZW4gbG90cyBvZiBldmVudHMgd2l0aCBzYW1lIElELgoJLy8KCWZ1bmN0aW9uIG11dGF0ZUV2ZW50cyhldmVudHMsIGNsZWFyRW5kLCBhbGxEYXksIGRhdGVEZWx0YSwgZHVyYXRpb25EZWx0YSwgbWlzY1Byb3BzKSB7CgkJdmFyIGlzQW1iaWdUaW1lem9uZSA9IHQuZ2V0SXNBbWJpZ1RpbWV6b25lKCk7CgkJdmFyIHVuZG9GdW5jdGlvbnMgPSBbXTsKCgkJLy8gbm9ybWFsaXplIHplcm8tbGVuZ3RoIGRlbHRhcyB0byBiZSBudWxsCgkJaWYgKGRhdGVEZWx0YSAmJiAhZGF0ZURlbHRhLnZhbHVlT2YoKSkgeyBkYXRlRGVsdGEgPSBudWxsOyB9CgkJaWYgKGR1cmF0aW9uRGVsdGEgJiYgIWR1cmF0aW9uRGVsdGEudmFsdWVPZigpKSB7IGR1cmF0aW9uRGVsdGEgPSBudWxsOyB9CgoJCSQuZWFjaChldmVudHMsIGZ1bmN0aW9uKGksIGV2ZW50KSB7CgkJCXZhciBvbGRQcm9wczsKCQkJdmFyIG5ld1Byb3BzOwoKCQkJLy8gYnVpbGQgYW4gb2JqZWN0IGhvbGRpbmcgYWxsIHRoZSBvbGQgdmFsdWVzLCBib3RoIGRhdGUtcmVsYXRlZCBhbmQgbWlzYy4KCQkJLy8gZm9yIHRoZSB1bmRvIGZ1bmN0aW9uLgoJCQlvbGRQcm9wcyA9IHsKCQkJCXN0YXJ0OiBldmVudC5zdGFydC5jbG9uZSgpLAoJCQkJZW5kOiBldmVudC5lbmQgPyBldmVudC5lbmQuY2xvbmUoKSA6IG51bGwsCgkJCQlhbGxEYXk6IGV2ZW50LmFsbERheQoJCQl9OwoJCQkkLmVhY2gobWlzY1Byb3BzLCBmdW5jdGlvbihuYW1lKSB7CgkJCQlvbGRQcm9wc1tuYW1lXSA9IGV2ZW50W25hbWVdOwoJCQl9KTsKCgkJCS8vIG5ldyBkYXRlLXJlbGF0ZWQgcHJvcGVydGllcy4gd29yayBvZmYgdGhlIG9yaWdpbmFsIGRhdGUgc25hcHNob3QuCgkJCS8vIG9rIHRvIHVzZSByZWZlcmVuY2VzIGJlY2F1c2UgdGhleSB3aWxsIGJlIHRocm93biBhd2F5IHdoZW4gYmFja3VwRXZlbnREYXRlcyBpcyBjYWxsZWQuCgkJCW5ld1Byb3BzID0gewoJCQkJc3RhcnQ6IGV2ZW50Ll9zdGFydCwKCQkJCWVuZDogZXZlbnQuX2VuZCwKCQkJCWFsbERheTogYWxsRGF5IC8vIG5vcm1hbGl6ZSB0aGUgZGF0ZXMgaW4gdGhlIHNhbWUgcmVnYXJkIGFzIHRoZSBuZXcgcHJvcGVydGllcwoJCQl9OwoJCQlub3JtYWxpemVFdmVudERhdGVzKG5ld1Byb3BzKTsgLy8gbWFzc2FnZXMgc3RhcnQvZW5kL2FsbERheQoKCQkJLy8gc3RyaXAgb3IgZW5zdXJlIHRoZSBlbmQgZGF0ZQoJCQlpZiAoY2xlYXJFbmQpIHsKCQkJCW5ld1Byb3BzLmVuZCA9IG51bGw7CgkJCX0KCQkJZWxzZSBpZiAoZHVyYXRpb25EZWx0YSAmJiAhbmV3UHJvcHMuZW5kKSB7IC8vIHRoZSBkdXJhdGlvbiB0cmFuc2xhdGlvbiByZXF1aXJlcyBhbiBlbmQgZGF0ZQoJCQkJbmV3UHJvcHMuZW5kID0gdC5nZXREZWZhdWx0RXZlbnRFbmQobmV3UHJvcHMuYWxsRGF5LCBuZXdQcm9wcy5zdGFydCk7CgkJCX0KCgkJCWlmIChkYXRlRGVsdGEpIHsKCQkJCW5ld1Byb3BzLnN0YXJ0LmFkZChkYXRlRGVsdGEpOwoJCQkJaWYgKG5ld1Byb3BzLmVuZCkgewoJCQkJCW5ld1Byb3BzLmVuZC5hZGQoZGF0ZURlbHRhKTsKCQkJCX0KCQkJfQoKCQkJaWYgKGR1cmF0aW9uRGVsdGEpIHsKCQkJCW5ld1Byb3BzLmVuZC5hZGQoZHVyYXRpb25EZWx0YSk7IC8vIGVuZCBhbHJlYWR5IGVuc3VyZWQgYWJvdmUKCQkJfQoKCQkJLy8gaWYgdGhlIGRhdGVzIGhhdmUgY2hhbmdlZCwgYW5kIHdlIGtub3cgaXQgaXMgaW1wb3NzaWJsZSB0byByZWNvbXB1dGUgdGhlCgkJCS8vIHRpbWV6b25lIG9mZnNldHMsIHN0cmlwIHRoZSB6b25lLgoJCQlpZiAoCgkJCQlpc0FtYmlnVGltZXpvbmUgJiYKCQkJCSFuZXdQcm9wcy5hbGxEYXkgJiYKCQkJCShkYXRlRGVsdGEgfHwgZHVyYXRpb25EZWx0YSkKCQkJKSB7CgkJCQluZXdQcm9wcy5zdGFydC5zdHJpcFpvbmUoKTsKCQkJCWlmIChuZXdQcm9wcy5lbmQpIHsKCQkJCQluZXdQcm9wcy5lbmQuc3RyaXBab25lKCk7CgkJCQl9CgkJCX0KCgkJCSQuZXh0ZW5kKGV2ZW50LCBtaXNjUHJvcHMsIG5ld1Byb3BzKTsgLy8gY29weSBvdmVyIG1pc2MgcHJvcHMsIHRoZW4gZGF0ZS1yZWxhdGVkIHByb3BzCgkJCWJhY2t1cEV2ZW50RGF0ZXMoZXZlbnQpOyAvLyByZWdlbmVyYXRlIGludGVybmFsIF9zdGFydC9fZW5kL19hbGxEYXkKCgkJCXVuZG9GdW5jdGlvbnMucHVzaChmdW5jdGlvbigpIHsKCQkJCSQuZXh0ZW5kKGV2ZW50LCBvbGRQcm9wcyk7CgkJCQliYWNrdXBFdmVudERhdGVzKGV2ZW50KTsgLy8gcmVnZW5lcmF0ZSBpbnRlcm5hbCBfc3RhcnQvX2VuZC9fYWxsRGF5CgkJCX0pOwoJCX0pOwoKCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdW5kb0Z1bmN0aW9ucy5sZW5ndGg7IGkrKykgewoJCQkJdW5kb0Z1bmN0aW9uc1tpXSgpOwoJCQl9CgkJfTsKCX0KCgoJdC5nZXRFdmVudENhY2hlID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGNhY2hlOwoJfTsKCn0KCgovLyBob29rIGZvciBleHRlcm5hbCBsaWJzIHRvIG1hbmlwdWxhdGUgZXZlbnQgcHJvcGVydGllcyB1cG9uIGNyZWF0aW9uLgovLyBzaG91bGQgbWFuaXB1bGF0ZSB0aGUgZXZlbnQgaW4tcGxhY2UuCkNhbGVuZGFyLnByb3RvdHlwZS5ub3JtYWxpemVFdmVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7Cn07CgoKLy8gRG9lcyB0aGUgZ2l2ZW4gc3BhbiAoc3RhcnQsIGVuZCwgYW5kIG90aGVyIGxvY2F0aW9uIGluZm9ybWF0aW9uKQovLyBmdWxseSBjb250YWluIHRoZSBvdGhlcj8KQ2FsZW5kYXIucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW4gPSBmdW5jdGlvbihvdXRlclNwYW4sIGlubmVyU3BhbikgewoJdmFyIGV2ZW50U3RhcnQgPSBvdXRlclNwYW4uc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKTsKCXZhciBldmVudEVuZCA9IHRoaXMuZ2V0RXZlbnRFbmQob3V0ZXJTcGFuKS5zdHJpcFpvbmUoKTsKCglyZXR1cm4gaW5uZXJTcGFuLnN0YXJ0ID49IGV2ZW50U3RhcnQgJiYgaW5uZXJTcGFuLmVuZCA8PSBldmVudEVuZDsKfTsKCgovLyBSZXR1cm5zIGEgbGlzdCBvZiBldmVudHMgdGhhdCB0aGUgZ2l2ZW4gZXZlbnQgc2hvdWxkIGJlIGNvbXBhcmVkIGFnYWluc3Qgd2hlbiBiZWluZyBjb25zaWRlcmVkIGZvciBhIG1vdmUgdG8KLy8gdGhlIHNwZWNpZmllZCBzcGFuLiBBdHRhY2hlZCB0byB0aGUgQ2FsZW5kYXIncyBwcm90b3R5cGUgYmVjYXVzZSBFdmVudE1hbmFnZXIgaXMgYSBtaXhpbiBmb3IgYSBDYWxlbmRhci4KQ2FsZW5kYXIucHJvdG90eXBlLmdldFBlZXJFdmVudHMgPSBmdW5jdGlvbihzcGFuLCBldmVudCkgewoJdmFyIGNhY2hlID0gdGhpcy5nZXRFdmVudENhY2hlKCk7Cgl2YXIgcGVlckV2ZW50cyA9IFtdOwoJdmFyIGksIG90aGVyRXZlbnQ7CgoJZm9yIChpID0gMDsgaSA8IGNhY2hlLmxlbmd0aDsgaSsrKSB7CgkJb3RoZXJFdmVudCA9IGNhY2hlW2ldOwoJCWlmICgKCQkJIWV2ZW50IHx8CgkJCWV2ZW50Ll9pZCAhPT0gb3RoZXJFdmVudC5faWQgLy8gZG9uJ3QgY29tcGFyZSB0aGUgZXZlbnQgdG8gaXRzZWxmIG9yIG90aGVyIHJlbGF0ZWQgW3JlcGVhdGluZ10gZXZlbnRzCgkJKSB7CgkJCXBlZXJFdmVudHMucHVzaChvdGhlckV2ZW50KTsKCQl9Cgl9CgoJcmV0dXJuIHBlZXJFdmVudHM7Cn07CgoKLy8gdXBkYXRlcyB0aGUgImJhY2t1cCIgcHJvcGVydGllcywgd2hpY2ggYXJlIHByZXNlcnZlZCBpbiBvcmRlciB0byBjb21wdXRlIGRpZmZzIGxhdGVyIG9uLgpmdW5jdGlvbiBiYWNrdXBFdmVudERhdGVzKGV2ZW50KSB7CglldmVudC5fYWxsRGF5ID0gZXZlbnQuYWxsRGF5OwoJZXZlbnQuX3N0YXJ0ID0gZXZlbnQuc3RhcnQuY2xvbmUoKTsKCWV2ZW50Ll9lbmQgPSBldmVudC5lbmQgPyBldmVudC5lbmQuY2xvbmUoKSA6IG51bGw7Cn0KCgovKiBPdmVybGFwcGluZyAvIENvbnN0cmFpbmluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKLy8gRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZXZlbnQgY2FuIGJlIHJlbG9jYXRlZCB0byB0aGUgZ2l2ZW4gc3BhbiAodW56b25lZCBzdGFydC9lbmQgd2l0aCBvdGhlciBtaXNjIGRhdGEpCkNhbGVuZGFyLnByb3RvdHlwZS5pc0V2ZW50U3BhbkFsbG93ZWQgPSBmdW5jdGlvbihzcGFuLCBldmVudCkgewoJdmFyIHNvdXJjZSA9IGV2ZW50LnNvdXJjZSB8fCB7fTsKCgl2YXIgY29uc3RyYWludCA9IGZpcnN0RGVmaW5lZCgKCQlldmVudC5jb25zdHJhaW50LAoJCXNvdXJjZS5jb25zdHJhaW50LAoJCXRoaXMub3B0aW9ucy5ldmVudENvbnN0cmFpbnQKCSk7CgoJdmFyIG92ZXJsYXAgPSBmaXJzdERlZmluZWQoCgkJZXZlbnQub3ZlcmxhcCwKCQlzb3VyY2Uub3ZlcmxhcCwKCQl0aGlzLm9wdGlvbnMuZXZlbnRPdmVybGFwCgkpOwoKCXJldHVybiB0aGlzLmlzU3BhbkFsbG93ZWQoc3BhbiwgY29uc3RyYWludCwgb3ZlcmxhcCwgZXZlbnQpICYmCgkJKCF0aGlzLm9wdGlvbnMuZXZlbnRBbGxvdyB8fCB0aGlzLm9wdGlvbnMuZXZlbnRBbGxvdyhzcGFuLCBldmVudCkgIT09IGZhbHNlKTsKfTsKCgovLyBEZXRlcm1pbmVzIGlmIGFuIGV4dGVybmFsIGV2ZW50IGNhbiBiZSByZWxvY2F0ZWQgdG8gdGhlIGdpdmVuIHNwYW4gKHVuem9uZWQgc3RhcnQvZW5kIHdpdGggb3RoZXIgbWlzYyBkYXRhKQpDYWxlbmRhci5wcm90b3R5cGUuaXNFeHRlcm5hbFNwYW5BbGxvd2VkID0gZnVuY3Rpb24oZXZlbnRTcGFuLCBldmVudExvY2F0aW9uLCBldmVudFByb3BzKSB7Cgl2YXIgZXZlbnRJbnB1dDsKCXZhciBldmVudDsKCgkvLyBub3RlOiB2ZXJ5IHNpbWlsYXIgbG9naWMgaXMgaW4gVmlldydzIHJlcG9ydEV4dGVybmFsRHJvcAoJaWYgKGV2ZW50UHJvcHMpIHsKCQlldmVudElucHV0ID0gJC5leHRlbmQoe30sIGV2ZW50UHJvcHMsIGV2ZW50TG9jYXRpb24pOwoJCWV2ZW50ID0gdGhpcy5leHBhbmRFdmVudCgKCQkJdGhpcy5idWlsZEV2ZW50RnJvbUlucHV0KGV2ZW50SW5wdXQpCgkJKVswXTsKCX0KCglpZiAoZXZlbnQpIHsKCQlyZXR1cm4gdGhpcy5pc0V2ZW50U3BhbkFsbG93ZWQoZXZlbnRTcGFuLCBldmVudCk7Cgl9CgllbHNlIHsgLy8gdHJlYXQgaXQgYXMgYSBzZWxlY3Rpb24KCgkJcmV0dXJuIHRoaXMuaXNTZWxlY3Rpb25TcGFuQWxsb3dlZChldmVudFNwYW4pOwoJfQp9OwoKCi8vIERldGVybWluZXMgdGhlIGdpdmVuIHNwYW4gKHVuem9uZWQgc3RhcnQvZW5kIHdpdGggb3RoZXIgbWlzYyBkYXRhKSBjYW4gYmUgc2VsZWN0ZWQuCkNhbGVuZGFyLnByb3RvdHlwZS5pc1NlbGVjdGlvblNwYW5BbGxvd2VkID0gZnVuY3Rpb24oc3BhbikgewoJcmV0dXJuIHRoaXMuaXNTcGFuQWxsb3dlZChzcGFuLCB0aGlzLm9wdGlvbnMuc2VsZWN0Q29uc3RyYWludCwgdGhpcy5vcHRpb25zLnNlbGVjdE92ZXJsYXApICYmCgkJKCF0aGlzLm9wdGlvbnMuc2VsZWN0QWxsb3cgfHwgdGhpcy5vcHRpb25zLnNlbGVjdEFsbG93KHNwYW4pICE9PSBmYWxzZSk7Cn07CgoKLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzcGFuIChjYXVzZWQgYnkgYW4gZXZlbnQgZHJvcC9yZXNpemUgb3IgYSBzZWxlY3Rpb24pIGlzIGFsbG93ZWQgdG8gZXhpc3QKLy8gYWNjb3JkaW5nIHRvIHRoZSBjb25zdHJhaW50L292ZXJsYXAgc2V0dGluZ3MuCi8vIGBldmVudGAgaXMgbm90IHJlcXVpcmVkIGlmIGNoZWNraW5nIGEgc2VsZWN0aW9uLgpDYWxlbmRhci5wcm90b3R5cGUuaXNTcGFuQWxsb3dlZCA9IGZ1bmN0aW9uKHNwYW4sIGNvbnN0cmFpbnQsIG92ZXJsYXAsIGV2ZW50KSB7Cgl2YXIgY29uc3RyYWludEV2ZW50czsKCXZhciBhbnlDb250YWlubWVudDsKCXZhciBwZWVyRXZlbnRzOwoJdmFyIGksIHBlZXJFdmVudDsKCXZhciBwZWVyT3ZlcmxhcDsKCgkvLyB0aGUgcmFuZ2UgbXVzdCBiZSBmdWxseSBjb250YWluZWQgYnkgYXQgbGVhc3Qgb25lIG9mIHByb2R1Y2VkIGNvbnN0cmFpbnQgZXZlbnRzCglpZiAoY29uc3RyYWludCAhPSBudWxsKSB7CgoJCS8vIG5vdCB0cmVhdGVkIGFzIGFuIGV2ZW50ISBpbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmUKCQkvLyBUT0RPOiB1c2UgcmFuZ2VzIGluIHRoZSBmdXR1cmUKCQljb25zdHJhaW50RXZlbnRzID0gdGhpcy5jb25zdHJhaW50VG9FdmVudHMoY29uc3RyYWludCk7CgkJaWYgKGNvbnN0cmFpbnRFdmVudHMpIHsgLy8gbm90IGludmFsaWQKCgkJCWFueUNvbnRhaW5tZW50ID0gZmFsc2U7CgkJCWZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50RXZlbnRzLmxlbmd0aDsgaSsrKSB7CgkJCQlpZiAodGhpcy5zcGFuQ29udGFpbnNTcGFuKGNvbnN0cmFpbnRFdmVudHNbaV0sIHNwYW4pKSB7CgkJCQkJYW55Q29udGFpbm1lbnQgPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQlpZiAoIWFueUNvbnRhaW5tZW50KSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9CgoJcGVlckV2ZW50cyA9IHRoaXMuZ2V0UGVlckV2ZW50cyhzcGFuLCBldmVudCk7CgoJZm9yIChpID0gMDsgaSA8IHBlZXJFdmVudHMubGVuZ3RoOyBpKyspICB7CgkJcGVlckV2ZW50ID0gcGVlckV2ZW50c1tpXTsKCgkJLy8gdGhlcmUgbmVlZHMgdG8gYmUgYW4gYWN0dWFsIGludGVyc2VjdGlvbiBiZWZvcmUgZGlzYWxsb3dpbmcgYW55dGhpbmcKCQlpZiAodGhpcy5ldmVudEludGVyc2VjdHNSYW5nZShwZWVyRXZlbnQsIHNwYW4pKSB7CgoJCQkvLyBldmFsdWF0ZSBvdmVybGFwIGZvciB0aGUgZ2l2ZW4gcmFuZ2UgYW5kIHNob3J0LWNpcmN1aXQgaWYgbmVjZXNzYXJ5CgkJCWlmIChvdmVybGFwID09PSBmYWxzZSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCS8vIGlmIHRoZSBldmVudCdzIG92ZXJsYXAgaXMgYSB0ZXN0IGZ1bmN0aW9uLCBwYXNzIHRoZSBwZWVyIGV2ZW50IGluIHF1ZXN0aW9uIGFzIHRoZSBmaXJzdCBwYXJhbQoJCQllbHNlIGlmICh0eXBlb2Ygb3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyAmJiAhb3ZlcmxhcChwZWVyRXZlbnQsIGV2ZW50KSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQkvLyBpZiB3ZSBhcmUgY29tcHV0aW5nIGlmIHRoZSBnaXZlbiByYW5nZSBpcyBhbGxvd2FibGUgZm9yIGFuIGV2ZW50LCBjb25zaWRlciB0aGUgb3RoZXIgZXZlbnQncwoJCQkvLyBFdmVudE9iamVjdC1zcGVjaWZpYyBvciBTb3VyY2Utc3BlY2lmaWMgYG92ZXJsYXBgIHByb3BlcnR5CgkJCWlmIChldmVudCkgewoJCQkJcGVlck92ZXJsYXAgPSBmaXJzdERlZmluZWQoCgkJCQkJcGVlckV2ZW50Lm92ZXJsYXAsCgkJCQkJKHBlZXJFdmVudC5zb3VyY2UgfHwge30pLm92ZXJsYXAKCQkJCQkvLyB3ZSBhbHJlYWR5IGNvbnNpZGVyZWQgdGhlIGdsb2JhbCBgZXZlbnRPdmVybGFwYAoJCQkJKTsKCQkJCWlmIChwZWVyT3ZlcmxhcCA9PT0gZmFsc2UpIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkvLyBpZiB0aGUgcGVlciBldmVudCdzIG92ZXJsYXAgaXMgYSB0ZXN0IGZ1bmN0aW9uLCBwYXNzIHRoZSBzdWJqZWN0IGV2ZW50IGFzIHRoZSBmaXJzdCBwYXJhbQoJCQkJaWYgKHR5cGVvZiBwZWVyT3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyAmJiAhcGVlck92ZXJsYXAoZXZlbnQsIHBlZXJFdmVudCkpIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIHRydWU7Cn07CgoKLy8gR2l2ZW4gYW4gZXZlbnQgaW5wdXQgZnJvbSB0aGUgQVBJLCBwcm9kdWNlcyBhbiBhcnJheSBvZiBldmVudCBvYmplY3RzLiBQb3NzaWJsZSBldmVudCBpbnB1dHM6Ci8vICdidXNpbmVzc0hvdXJzJwovLyBBbiBldmVudCBJRCAobnVtYmVyIG9yIHN0cmluZykKLy8gQW4gb2JqZWN0IHdpdGggc3BlY2lmaWMgc3RhcnQvZW5kIGRhdGVzIG9yIGEgcmVjdXJyaW5nIGV2ZW50IChsaWtlIHdoYXQgYnVzaW5lc3NIb3VycyBhY2NlcHRzKQpDYWxlbmRhci5wcm90b3R5cGUuY29uc3RyYWludFRvRXZlbnRzID0gZnVuY3Rpb24oY29uc3RyYWludElucHV0KSB7CgoJaWYgKGNvbnN0cmFpbnRJbnB1dCA9PT0gJ2J1c2luZXNzSG91cnMnKSB7CgkJcmV0dXJuIHRoaXMuZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cygpOwoJfQoKCWlmICh0eXBlb2YgY29uc3RyYWludElucHV0ID09PSAnb2JqZWN0JykgewoJCWlmIChjb25zdHJhaW50SW5wdXQuc3RhcnQgIT0gbnVsbCkgeyAvLyBuZWVkcyB0byBiZSBldmVudC1saWtlIGlucHV0CgkJCXJldHVybiB0aGlzLmV4cGFuZEV2ZW50KHRoaXMuYnVpbGRFdmVudEZyb21JbnB1dChjb25zdHJhaW50SW5wdXQpKTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkCgkJfQoJfQoKCXJldHVybiB0aGlzLmNsaWVudEV2ZW50cyhjb25zdHJhaW50SW5wdXQpOyAvLyBwcm9iYWJseSBhbiBJRAp9OwoKCi8vIERvZXMgdGhlIGV2ZW50J3MgZGF0ZSByYW5nZSBpbnRlcnNlY3Qgd2l0aCB0aGUgZ2l2ZW4gcmFuZ2U/Ci8vIHN0YXJ0L2VuZCBhbHJlYWR5IGFzc3VtZWQgdG8gaGF2ZSBzdHJpcHBlZCB6b25lcyA6KApDYWxlbmRhci5wcm90b3R5cGUuZXZlbnRJbnRlcnNlY3RzUmFuZ2UgPSBmdW5jdGlvbihldmVudCwgcmFuZ2UpIHsKCXZhciBldmVudFN0YXJ0ID0gZXZlbnQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKTsKCXZhciBldmVudEVuZCA9IHRoaXMuZ2V0RXZlbnRFbmQoZXZlbnQpLnN0cmlwWm9uZSgpOwoKCXJldHVybiByYW5nZS5zdGFydCA8IGV2ZW50RW5kICYmIHJhbmdlLmVuZCA+IGV2ZW50U3RhcnQ7Cn07CgoKLyogQnVzaW5lc3MgSG91cnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdmFyIEJVU0lORVNTX0hPVVJfRVZFTlRfREVGQVVMVFMgPSB7CglpZDogJ19mY0J1c2luZXNzSG91cnMnLCAvLyB3aWxsIHJlbGF0ZSBldmVudHMgZnJvbSBkaWZmZXJlbnQgY2FsbHMgdG8gZXhwYW5kRXZlbnQKCXN0YXJ0OiAnMDk6MDAnLAoJZW5kOiAnMTc6MDAnLAoJZG93OiBbIDEsIDIsIDMsIDQsIDUgXSwgLy8gbW9uZGF5IC0gZnJpZGF5CglyZW5kZXJpbmc6ICdpbnZlcnNlLWJhY2tncm91bmQnCgkvLyBjbGFzc05hbWVzIGFyZSBkZWZpbmVkIGluIGJ1c2luZXNzSG91cnNTZWdDbGFzc2VzCn07CgovLyBSZXR1cm4gZXZlbnRzIG9iamVjdHMgZm9yIGJ1c2luZXNzIGhvdXJzIHdpdGhpbiB0aGUgY3VycmVudCB2aWV3LgovLyBBYnVzZSBvZiBvdXIgZXZlbnQgc3lzdGVtIDooCkNhbGVuZGFyLnByb3RvdHlwZS5nZXRDdXJyZW50QnVzaW5lc3NIb3VyRXZlbnRzID0gZnVuY3Rpb24od2hvbGVEYXkpIHsKCXJldHVybiB0aGlzLmNvbXB1dGVCdXNpbmVzc0hvdXJFdmVudHMod2hvbGVEYXksIHRoaXMub3B0aW9ucy5idXNpbmVzc0hvdXJzKTsKfTsKCi8vIEdpdmVuIGEgcmF3IGlucHV0IHZhbHVlIGZyb20gb3B0aW9ucywgcmV0dXJuIGV2ZW50cyBvYmplY3RzIGZvciBidXNpbmVzcyBob3VycyB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldy4KQ2FsZW5kYXIucHJvdG90eXBlLmNvbXB1dGVCdXNpbmVzc0hvdXJFdmVudHMgPSBmdW5jdGlvbih3aG9sZURheSwgaW5wdXQpIHsKCWlmIChpbnB1dCA9PT0gdHJ1ZSkgewoJCXJldHVybiB0aGlzLmV4cGFuZEJ1c2luZXNzSG91ckV2ZW50cyh3aG9sZURheSwgWyB7fSBdKTsKCX0KCWVsc2UgaWYgKCQuaXNQbGFpbk9iamVjdChpbnB1dCkpIHsKCQlyZXR1cm4gdGhpcy5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMod2hvbGVEYXksIFsgaW5wdXQgXSk7Cgl9CgllbHNlIGlmICgkLmlzQXJyYXkoaW5wdXQpKSB7CgkJcmV0dXJuIHRoaXMuZXhwYW5kQnVzaW5lc3NIb3VyRXZlbnRzKHdob2xlRGF5LCBpbnB1dCwgdHJ1ZSk7Cgl9CgllbHNlIHsKCQlyZXR1cm4gW107Cgl9Cn07CgovLyBpbnB1dHMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLy8gaWYgaWdub3JlTm9Eb3cgaXMgdHJ1ZSwgd2lsbCBpZ25vcmUgZW50cmllcyB0aGF0IGRvbid0IHNwZWNpZnkgYSBkYXktb2Ytd2VlayAoZG93KSBrZXkuCkNhbGVuZGFyLnByb3RvdHlwZS5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMgPSBmdW5jdGlvbih3aG9sZURheSwgaW5wdXRzLCBpZ25vcmVOb0RvdykgewoJdmFyIHZpZXcgPSB0aGlzLmdldFZpZXcoKTsKCXZhciBldmVudHMgPSBbXTsKCXZhciBpLCBpbnB1dDsKCglmb3IgKGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJaW5wdXQgPSBpbnB1dHNbaV07CgoJCWlmIChpZ25vcmVOb0RvdyAmJiAhaW5wdXQuZG93KSB7CgkJCWNvbnRpbnVlOwoJCX0KCgkJLy8gZ2l2ZSBkZWZhdWx0cy4gd2lsbCBtYWtlIGEgY29weQoJCWlucHV0ID0gJC5leHRlbmQoe30sIEJVU0lORVNTX0hPVVJfRVZFTlRfREVGQVVMVFMsIGlucHV0KTsKCgkJLy8gaWYgYSB3aG9sZS1kYXkgc2VyaWVzIGlzIHJlcXVlc3RlZCwgY2xlYXIgdGhlIHN0YXJ0L2VuZCB0aW1lcwoJCWlmICh3aG9sZURheSkgewoJCQlpbnB1dC5zdGFydCA9IG51bGw7CgkJCWlucHV0LmVuZCA9IG51bGw7CgkJfQoKCQlldmVudHMucHVzaC5hcHBseShldmVudHMsIC8vIGFwcGVuZAoJCQl0aGlzLmV4cGFuZEV2ZW50KAoJCQkJdGhpcy5idWlsZEV2ZW50RnJvbUlucHV0KGlucHV0KSwKCQkJCXZpZXcuc3RhcnQsCgkJCQl2aWV3LmVuZAoJCQkpCgkJKTsKCX0KCglyZXR1cm4gZXZlbnRzOwp9OwoKOzsKCi8qIEFuIGFic3RyYWN0IGNsYXNzIGZvciB0aGUgImJhc2ljIiB2aWV3cywgYXMgd2VsbCBhcyBtb250aCB2aWV3LiBSZW5kZXJzIG9uZSBvciBtb3JlIHJvd3Mgb2YgZGF5IGNlbGxzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLy8gSXQgaXMgYSBtYW5hZ2VyIGZvciBhIERheUdyaWQgc3ViY29tcG9uZW50LCB3aGljaCBkb2VzIG1vc3Qgb2YgdGhlIGhlYXZ5IGxpZnRpbmcuCi8vIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB3aWR0aC9oZWlnaHQuCgp2YXIgQmFzaWNWaWV3ID0gRkMuQmFzaWNWaWV3ID0gVmlldy5leHRlbmQoewoKCXNjcm9sbGVyOiBudWxsLAoKCWRheUdyaWRDbGFzczogRGF5R3JpZCwgLy8gY2xhc3MgdGhlIGRheUdyaWQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZnJvbSAob3ZlcnJpZGFibGUgYnkgc3ViY2xhc3NlcykKCWRheUdyaWQ6IG51bGwsIC8vIHRoZSBtYWluIHN1YmNvbXBvbmVudCB0aGF0IGRvZXMgbW9zdCBvZiB0aGUgaGVhdnkgbGlmdGluZwoKCWRheU51bWJlcnNWaXNpYmxlOiBmYWxzZSwgLy8gZGlzcGxheSBkYXkgbnVtYmVycyBvbiBlYWNoIGRheSBjZWxsPwoJY29sV2Vla051bWJlcnNWaXNpYmxlOiBmYWxzZSwgLy8gZGlzcGxheSB3ZWVrIG51bWJlcnMgYWxvbmcgdGhlIHNpZGU/CgljZWxsV2Vla051bWJlcnNWaXNpYmxlOiBmYWxzZSwgLy8gZGlzcGxheSB3ZWVrIG51bWJlcnMgaW4gZGF5IGNlbGw/CgoJd2Vla051bWJlcldpZHRoOiBudWxsLCAvLyB3aWR0aCBvZiBhbGwgdGhlIHdlZWstbnVtYmVyIGNlbGxzIHJ1bm5pbmcgZG93biB0aGUgc2lkZQoKCWhlYWRDb250YWluZXJFbDogbnVsbCwgLy8gZGl2IHRoYXQgaG9sZCdzIHRoZSBkYXlHcmlkJ3MgcmVuZGVyZWQgZGF0ZSBoZWFkZXIKCWhlYWRSb3dFbDogbnVsbCwgLy8gdGhlIGZha2Ugcm93IGVsZW1lbnQgb2YgdGhlIGRheS1vZi13ZWVrIGhlYWRlcgoKCglpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRheUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlRGF5R3JpZCgpOwoKCQl0aGlzLnNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKHsKCQkJb3ZlcmZsb3dYOiAnaGlkZGVuJywKCQkJb3ZlcmZsb3dZOiAnYXV0bycKCQl9KTsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgRGF5R3JpZCBvYmplY3QgdGhpcyB2aWV3IG5lZWRzLiBEcmF3cyBmcm9tIHRoaXMuZGF5R3JpZENsYXNzCglpbnN0YW50aWF0ZURheUdyaWQ6IGZ1bmN0aW9uKCkgewoJCS8vIGdlbmVyYXRlIGEgc3ViY2xhc3Mgb24gdGhlIGZseSB3aXRoIEJhc2ljVmlldy1zcGVjaWZpYyBiZWhhdmlvcgoJCS8vIFRPRE86IGNhY2hlIHRoaXMgc3ViY2xhc3MKCQl2YXIgc3ViY2xhc3MgPSB0aGlzLmRheUdyaWRDbGFzcy5leHRlbmQoYmFzaWNEYXlHcmlkTWV0aG9kcyk7CgoJCXJldHVybiBuZXcgc3ViY2xhc3ModGhpcyk7Cgl9LAoKCgkvLyBTZXRzIHRoZSBkaXNwbGF5IHJhbmdlIGFuZCBjb21wdXRlcyBhbGwgbmVjZXNzYXJ5IGRhdGVzCglzZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsKCQlWaWV3LnByb3RvdHlwZS5zZXRSYW5nZS5jYWxsKHRoaXMsIHJhbmdlKTsgLy8gY2FsbCB0aGUgc3VwZXItbWV0aG9kCgoJCXRoaXMuZGF5R3JpZC5icmVha09uV2Vla3MgPSAveWVhcnxtb250aHx3ZWVrLy50ZXN0KHRoaXMuaW50ZXJ2YWxVbml0KTsgLy8gZG8gYmVmb3JlIHNldFJhbmdlCgkJdGhpcy5kYXlHcmlkLnNldFJhbmdlKHJhbmdlKTsKCX0sCgoKCS8vIENvbXB1dGUgdGhlIHZhbHVlIHRvIGZlZWQgaW50byBzZXRSYW5nZS4gT3ZlcnJpZGVzIHN1cGVyY2xhc3MuCgljb21wdXRlUmFuZ2U6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgcmFuZ2UgPSBWaWV3LnByb3RvdHlwZS5jb21wdXRlUmFuZ2UuY2FsbCh0aGlzLCBkYXRlKTsgLy8gZ2V0IHZhbHVlIGZyb20gdGhlIHN1cGVyLW1ldGhvZAoKCQkvLyB5ZWFyIGFuZCBtb250aCB2aWV3cyBzaG91bGQgYmUgYWxpZ25lZCB3aXRoIHdlZWtzLiB0aGlzIGlzIGFscmVhZHkgZG9uZSBmb3Igd2VlawoJCWlmICgveWVhcnxtb250aC8udGVzdChyYW5nZS5pbnRlcnZhbFVuaXQpKSB7CgkJCXJhbmdlLnN0YXJ0LnN0YXJ0T2YoJ3dlZWsnKTsKCQkJcmFuZ2Uuc3RhcnQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKHJhbmdlLnN0YXJ0KTsKCgkJCS8vIG1ha2UgZW5kLW9mLXdlZWsgaWYgbm90IGFscmVhZHkKCQkJaWYgKHJhbmdlLmVuZC53ZWVrZGF5KCkpIHsKCQkJCXJhbmdlLmVuZC5hZGQoMSwgJ3dlZWsnKS5zdGFydE9mKCd3ZWVrJyk7CgkJCQlyYW5nZS5lbmQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKHJhbmdlLmVuZCwgLTEsIHRydWUpOyAvLyBleGNsdXNpdmVseSBtb3ZlIGJhY2t3YXJkcwoJCQl9CgkJfQoKCQlyZXR1cm4gcmFuZ2U7Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSB2aWV3IGludG8gYHRoaXMuZWxgLCB3aGljaCBzaG91bGQgYWxyZWFkeSBiZSBhc3NpZ25lZAoJcmVuZGVyRGF0ZXM6IGZ1bmN0aW9uKCkgewoKCQl0aGlzLmRheU51bWJlcnNWaXNpYmxlID0gdGhpcy5kYXlHcmlkLnJvd0NudCA+IDE7IC8vIFRPRE86IG1ha2UgZ3JpZCByZXNwb25zaWJsZQoJCWlmICh0aGlzLm9wdCgnd2Vla051bWJlcnMnKSkgewoJCQlpZiAodGhpcy5vcHQoJ3dlZWtOdW1iZXJzV2l0aGluRGF5cycpKSB7CgkJCQl0aGlzLmNlbGxXZWVrTnVtYmVyc1Zpc2libGUgPSB0cnVlOwoJCQkJdGhpcy5jb2xXZWVrTnVtYmVyc1Zpc2libGUgPSBmYWxzZTsKCQkJfQoJCQllbHNlIHsKCQkJCXRoaXMuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZSA9IGZhbHNlOwoJCQkJdGhpcy5jb2xXZWVrTnVtYmVyc1Zpc2libGUgPSB0cnVlOwoJCQl9OwoJCX0KCQl0aGlzLmRheUdyaWQubnVtYmVyc1Zpc2libGUgPSB0aGlzLmRheU51bWJlcnNWaXNpYmxlIHx8CgkJCXRoaXMuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZSB8fCB0aGlzLmNvbFdlZWtOdW1iZXJzVmlzaWJsZTsKCgkJdGhpcy5lbC5hZGRDbGFzcygnZmMtYmFzaWMtdmlldycpLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSk7CgkJdGhpcy5yZW5kZXJIZWFkKCk7CgoJCXRoaXMuc2Nyb2xsZXIucmVuZGVyKCk7CgkJdmFyIGRheUdyaWRDb250YWluZXJFbCA9IHRoaXMuc2Nyb2xsZXIuZWwuYWRkQ2xhc3MoJ2ZjLWRheS1ncmlkLWNvbnRhaW5lcicpOwoJCXZhciBkYXlHcmlkRWwgPSAkKCc8ZGl2IGNsYXNzPSJmYy1kYXktZ3JpZCIgLz4nKS5hcHBlbmRUbyhkYXlHcmlkQ29udGFpbmVyRWwpOwoJCXRoaXMuZWwuZmluZCgnLmZjLWJvZHkgPiB0ciA+IHRkJykuYXBwZW5kKGRheUdyaWRDb250YWluZXJFbCk7CgoJCXRoaXMuZGF5R3JpZC5zZXRFbGVtZW50KGRheUdyaWRFbCk7CgkJdGhpcy5kYXlHcmlkLnJlbmRlckRhdGVzKHRoaXMuaGFzUmlnaWRSb3dzKCkpOwoJfSwKCgoJLy8gcmVuZGVyIHRoZSBkYXktb2Ytd2VlayBoZWFkZXJzCglyZW5kZXJIZWFkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmhlYWRDb250YWluZXJFbCA9CgkJCXRoaXMuZWwuZmluZCgnLmZjLWhlYWQtY29udGFpbmVyJykKCQkJCS5odG1sKHRoaXMuZGF5R3JpZC5yZW5kZXJIZWFkSHRtbCgpKTsKCQl0aGlzLmhlYWRSb3dFbCA9IHRoaXMuaGVhZENvbnRhaW5lckVsLmZpbmQoJy5mYy1yb3cnKTsKCX0sCgoKCS8vIFVucmVuZGVycyB0aGUgY29udGVudCBvZiB0aGUgdmlldy4gU2luY2Ugd2UgaGF2ZW4ndCBzZXBhcmF0ZWQgc2tlbGV0b24gcmVuZGVyaW5nIGZyb20gZGF0ZSByZW5kZXJpbmcsCgkvLyBhbHdheXMgY29tcGxldGVseSBraWxsIHRoZSBkYXlHcmlkJ3MgcmVuZGVyaW5nLgoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyRGF0ZXMoKTsKCQl0aGlzLmRheUdyaWQucmVtb3ZlRWxlbWVudCgpOwoJCXRoaXMuc2Nyb2xsZXIuZGVzdHJveSgpOwoJfSwKCgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCX0sCgoKCXVucmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpOwoJfSwKCgoJLy8gQnVpbGRzIHRoZSBIVE1MIHNrZWxldG9uIGZvciB0aGUgdmlldy4KCS8vIFRoZSBkYXktZ3JpZCBjb21wb25lbnQgd2lsbCByZW5kZXIgaW5zaWRlIG9mIGEgY29udGFpbmVyIGRlZmluZWQgYnkgdGhpcyBIVE1MLgoJcmVuZGVyU2tlbGV0b25IdG1sOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gJycgKwoJCQknPHRhYmxlPicgKwoJCQkJJzx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+JyArCgkJCQkJJzx0cj4nICsKCQkJCQkJJzx0ZCBjbGFzcz0iZmMtaGVhZC1jb250YWluZXIgJyArIHRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj48L3RkPicgKwoJCQkJCSc8L3RyPicgKwoJCQkJJzwvdGhlYWQ+JyArCgkJCQknPHRib2R5IGNsYXNzPSJmYy1ib2R5Ij4nICsKCQkJCQknPHRyPicgKwoJCQkJCQknPHRkIGNsYXNzPSInICsgdGhpcy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIj48L3RkPicgKwoJCQkJCSc8L3RyPicgKwoJCQkJJzwvdGJvZHk+JyArCgkJCSc8L3RhYmxlPic7Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgYW4gSFRNTCBhdHRyaWJ1dGUgc3RyaW5nIGZvciBzZXR0aW5nIHRoZSB3aWR0aCBvZiB0aGUgd2VlayBudW1iZXIgY29sdW1uLCBpZiBpdCBpcyBrbm93bgoJd2Vla051bWJlclN0eWxlQXR0cjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMud2Vla051bWJlcldpZHRoICE9PSBudWxsKSB7CgkJCXJldHVybiAnc3R5bGU9IndpZHRoOicgKyB0aGlzLndlZWtOdW1iZXJXaWR0aCArICdweCInOwoJCX0KCQlyZXR1cm4gJyc7Cgl9LAoKCgkvLyBEZXRlcm1pbmVzIHdoZXRoZXIgZWFjaCByb3cgc2hvdWxkIGhhdmUgYSBjb25zdGFudCBoZWlnaHQKCWhhc1JpZ2lkUm93czogZnVuY3Rpb24oKSB7CgkJdmFyIGV2ZW50TGltaXQgPSB0aGlzLm9wdCgnZXZlbnRMaW1pdCcpOwoJCXJldHVybiBldmVudExpbWl0ICYmIHR5cGVvZiBldmVudExpbWl0ICE9PSAnbnVtYmVyJzsKCX0sCgoKCS8qIERpbWVuc2lvbnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlZnJlc2hlcyB0aGUgaG9yaXpvbnRhbCBkaW1lbnNpb25zIG9mIHRoZSB2aWV3Cgl1cGRhdGVXaWR0aDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlKSB7CgkJCS8vIE1ha2Ugc3VyZSBhbGwgd2VlayBudW1iZXIgY2VsbHMgcnVubmluZyBkb3duIHRoZSBzaWRlIGhhdmUgdGhlIHNhbWUgd2lkdGguCgkJCS8vIFJlY29yZCB0aGUgd2lkdGggZm9yIGNlbGxzIGNyZWF0ZWQgbGF0ZXIuCgkJCXRoaXMud2Vla051bWJlcldpZHRoID0gbWF0Y2hDZWxsV2lkdGhzKAoJCQkJdGhpcy5lbC5maW5kKCcuZmMtd2Vlay1udW1iZXInKQoJCQkpOwoJCX0KCX0sCgoKCS8vIEFkanVzdHMgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIHZpZXcgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZXMKCXNldEhlaWdodDogZnVuY3Rpb24odG90YWxIZWlnaHQsIGlzQXV0bykgewoJCXZhciBldmVudExpbWl0ID0gdGhpcy5vcHQoJ2V2ZW50TGltaXQnKTsKCQl2YXIgc2Nyb2xsZXJIZWlnaHQ7CgkJdmFyIHNjcm9sbGJhcldpZHRoczsKCgkJLy8gcmVzZXQgYWxsIGhlaWdodHMgdG8gYmUgbmF0dXJhbAoJCXRoaXMuc2Nyb2xsZXIuY2xlYXIoKTsKCQl1bmNvbXBlbnNhdGVTY3JvbGwodGhpcy5oZWFkUm93RWwpOwoKCQl0aGlzLmRheUdyaWQucmVtb3ZlU2VnUG9wb3ZlcigpOyAvLyBraWxsIHRoZSAibW9yZSIgcG9wb3ZlciBpZiBkaXNwbGF5ZWQKCgkJLy8gaXMgdGhlIGV2ZW50IGxpbWl0IGEgY29uc3RhbnQgbGV2ZWwgbnVtYmVyPwoJCWlmIChldmVudExpbWl0ICYmIHR5cGVvZiBldmVudExpbWl0ID09PSAnbnVtYmVyJykgewoJCQl0aGlzLmRheUdyaWQubGltaXRSb3dzKGV2ZW50TGltaXQpOyAvLyBsaW1pdCB0aGUgbGV2ZWxzIGZpcnN0IHNvIHRoZSBoZWlnaHQgY2FuIHJlZGlzdHJpYnV0ZSBhZnRlcgoJCX0KCgkJLy8gZGlzdHJpYnV0ZSB0aGUgaGVpZ2h0IHRvIHRoZSByb3dzCgkJLy8gKHRvdGFsSGVpZ2h0IGlzIGEgInJlY29tbWVuZGVkIiB2YWx1ZSBpZiBpc0F1dG8pCgkJc2Nyb2xsZXJIZWlnaHQgPSB0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0b3RhbEhlaWdodCk7CgkJdGhpcy5zZXRHcmlkSGVpZ2h0KHNjcm9sbGVySGVpZ2h0LCBpc0F1dG8pOwoKCQkvLyBpcyB0aGUgZXZlbnQgbGltaXQgZHluYW1pY2FsbHkgY2FsY3VsYXRlZD8KCQlpZiAoZXZlbnRMaW1pdCAmJiB0eXBlb2YgZXZlbnRMaW1pdCAhPT0gJ251bWJlcicpIHsKCQkJdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhldmVudExpbWl0KTsgLy8gbGltaXQgdGhlIGxldmVscyBhZnRlciB0aGUgZ3JpZCdzIHJvdyBoZWlnaHRzIGhhdmUgYmVlbiBzZXQKCQl9CgoJCWlmICghaXNBdXRvKSB7IC8vIHNob3VsZCB3ZSBmb3JjZSBkaW1lbnNpb25zIG9mIHRoZSBzY3JvbGwgY29udGFpbmVyPwoKCQkJdGhpcy5zY3JvbGxlci5zZXRIZWlnaHQoc2Nyb2xsZXJIZWlnaHQpOwoJCQlzY3JvbGxiYXJXaWR0aHMgPSB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpOwoKCQkJaWYgKHNjcm9sbGJhcldpZHRocy5sZWZ0IHx8IHNjcm9sbGJhcldpZHRocy5yaWdodCkgeyAvLyB1c2luZyBzY3JvbGxiYXJzPwoKCQkJCWNvbXBlbnNhdGVTY3JvbGwodGhpcy5oZWFkUm93RWwsIHNjcm9sbGJhcldpZHRocyk7CgoJCQkJLy8gZG9pbmcgdGhlIHNjcm9sbGJhciBjb21wZW5zYXRpb24gbWlnaHQgaGF2ZSBjcmVhdGVkIHRleHQgb3ZlcmZsb3cgd2hpY2ggY3JlYXRlZCBtb3JlIGhlaWdodC4gcmVkbwoJCQkJc2Nyb2xsZXJIZWlnaHQgPSB0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0b3RhbEhlaWdodCk7CgkJCQl0aGlzLnNjcm9sbGVyLnNldEhlaWdodChzY3JvbGxlckhlaWdodCk7CgkJCX0KCgkJCS8vIGd1YXJhbnRlZXMgdGhlIHNhbWUgc2Nyb2xsYmFyIHdpZHRocwoJCQl0aGlzLnNjcm9sbGVyLmxvY2tPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aHMpOwoJCX0KCX0sCgoKCS8vIGdpdmVuIGEgZGVzaXJlZCB0b3RhbCBoZWlnaHQgb2YgdGhlIHZpZXcsIHJldHVybnMgd2hhdCB0aGUgaGVpZ2h0IG9mIHRoZSBzY3JvbGxlciBzaG91bGQgYmUKCWNvbXB1dGVTY3JvbGxlckhlaWdodDogZnVuY3Rpb24odG90YWxIZWlnaHQpIHsKCQlyZXR1cm4gdG90YWxIZWlnaHQgLQoJCQlzdWJ0cmFjdElubmVyRWxIZWlnaHQodGhpcy5lbCwgdGhpcy5zY3JvbGxlci5lbCk7IC8vIGV2ZXJ5dGhpbmcgdGhhdCdzIE5PVCB0aGUgc2Nyb2xsZXIKCX0sCgoKCS8vIFNldHMgdGhlIGhlaWdodCBvZiBqdXN0IHRoZSBEYXlHcmlkIGNvbXBvbmVudCBpbiB0aGlzIHZpZXcKCXNldEdyaWRIZWlnaHQ6IGZ1bmN0aW9uKGhlaWdodCwgaXNBdXRvKSB7CgkJaWYgKGlzQXV0bykgewoJCQl1bmRpc3RyaWJ1dGVIZWlnaHQodGhpcy5kYXlHcmlkLnJvd0Vscyk7IC8vIGxldCB0aGUgcm93cyBiZSB0aGVpciBuYXR1cmFsIGhlaWdodCB3aXRoIG5vIGV4cGFuZGluZwoJCX0KCQllbHNlIHsKCQkJZGlzdHJpYnV0ZUhlaWdodCh0aGlzLmRheUdyaWQucm93RWxzLCBoZWlnaHQsIHRydWUpOyAvLyB0cnVlID0gY29tcGVuc2F0ZSBmb3IgaGVpZ2h0LWhvZ2dpbmcgcm93cwoJCX0KCX0sCgoKCS8qIFNjcm9sbAoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcXVlcnlTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbFRvcCgpOwoJfSwKCgoJc2V0U2Nyb2xsOiBmdW5jdGlvbih0b3ApIHsKCQl0aGlzLnNjcm9sbGVyLnNldFNjcm9sbFRvcCh0b3ApOwoJfSwKCgoJLyogSGl0IEFyZWFzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJLy8gZm9yd2FyZCBhbGwgaGl0LXJlbGF0ZWQgbWV0aG9kIGNhbGxzIHRvIGRheUdyaWQKCgoJcHJlcGFyZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZGF5R3JpZC5wcmVwYXJlSGl0cygpOwoJfSwKCgoJcmVsZWFzZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZGF5R3JpZC5yZWxlYXNlSGl0cygpOwoJfSwKCgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnQsIHRvcCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQucXVlcnlIaXQobGVmdCwgdG9wKTsKCX0sCgoKCWdldEhpdFNwYW46IGZ1bmN0aW9uKGhpdCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQuZ2V0SGl0U3BhbihoaXQpOwoJfSwKCgoJZ2V0SGl0RWw6IGZ1bmN0aW9uKGhpdCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQuZ2V0SGl0RWwoaGl0KTsKCX0sCgoKCS8qIEV2ZW50cwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyB0aGUgZ2l2ZW4gZXZlbnRzIG9udG8gdGhlIHZpZXcgYW5kIHBvcHVsYXRlcyB0aGUgc2VnbWVudHMgYXJyYXkKCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJdGhpcy5kYXlHcmlkLnJlbmRlckV2ZW50cyhldmVudHMpOwoKCQl0aGlzLnVwZGF0ZUhlaWdodCgpOyAvLyBtdXN0IGNvbXBlbnNhdGUgZm9yIGV2ZW50cyB0aGF0IG92ZXJmbG93IHRoZSByb3cKCX0sCgoKCS8vIFJldHJpZXZlcyBhbGwgc2VnbWVudCBvYmplY3RzIHRoYXQgYXJlIHJlbmRlcmVkIGluIHRoZSB2aWV3CglnZXRFdmVudFNlZ3M6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQuZ2V0RXZlbnRTZWdzKCk7Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYWxsIGV2ZW50IGVsZW1lbnRzIGFuZCBjbGVhcnMgaW50ZXJuYWwgc2VnbWVudCBkYXRhCgl1bnJlbmRlckV2ZW50czogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyRXZlbnRzKCk7CgoJCS8vIHdlIERPTidUIG5lZWQgdG8gY2FsbCB1cGRhdGVIZWlnaHQoKSBiZWNhdXNlCgkJLy8gYSByZW5kZXJFdmVudHMoKSBjYWxsIGFsd2F5cyBoYXBwZW5zIGFmdGVyIHRoaXMsIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBjYWxsIHVwZGF0ZUhlaWdodCgpCgl9LAoKCgkvKiBEcmFnZ2luZyAoZm9yIGJvdGggZXZlbnRzIGFuZCBleHRlcm5hbCBlbGVtZW50cykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEEgcmV0dXJuZWQgdmFsdWUgb2YgYHRydWVgIHNpZ25hbHMgdGhhdCBhIG1vY2sgImhlbHBlciIgZXZlbnQgaGFzIGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEcmFnOiBmdW5jdGlvbihkcm9wTG9jYXRpb24sIHNlZykgewoJCXJldHVybiB0aGlzLmRheUdyaWQucmVuZGVyRHJhZyhkcm9wTG9jYXRpb24sIHNlZyk7Cgl9LAoKCgl1bnJlbmRlckRyYWc6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZGF5R3JpZC51bnJlbmRlckRyYWcoKTsKCX0sCgoKCS8qIFNlbGVjdGlvbgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGEgc2VsZWN0aW9uCglyZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKHNwYW4pIHsKCQl0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHNwYW4pOwoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb25zIG9mIGEgc2VsZWN0aW9uCgl1bnJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyU2VsZWN0aW9uKCk7Cgl9Cgp9KTsKCgovLyBNZXRob2RzIHRoYXQgd2lsbCBjdXN0b21pemUgdGhlIHJlbmRlcmluZyBiZWhhdmlvciBvZiB0aGUgQmFzaWNWaWV3J3MgZGF5R3JpZAp2YXIgYmFzaWNEYXlHcmlkTWV0aG9kcyA9IHsKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgd2lsbCBnbyBiZWZvcmUgdGhlIGRheS1vZiB3ZWVrIGhlYWRlciBjZWxscwoJcmVuZGVySGVhZEludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCWlmICh2aWV3LmNvbFdlZWtOdW1iZXJzVmlzaWJsZSkgewoJCQlyZXR1cm4gJycgKwoJCQkJJzx0aCBjbGFzcz0iZmMtd2Vlay1udW1iZXIgJyArIHZpZXcud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIiAnICsgdmlldy53ZWVrTnVtYmVyU3R5bGVBdHRyKCkgKyAnPicgKwoJCQkJCSc8c3Bhbj4nICsgLy8gbmVlZGVkIGZvciBtYXRjaENlbGxXaWR0aHMKCQkJCQkJaHRtbEVzY2FwZSh2aWV3Lm9wdCgnd2Vla051bWJlclRpdGxlJykpICsKCQkJCQknPC9zcGFuPicgKwoJCQkJJzwvdGg+JzsKCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IHdpbGwgZ28gYmVmb3JlIGNvbnRlbnQtc2tlbGV0b24gY2VsbHMgdGhhdCBkaXNwbGF5IHRoZSBkYXkvd2VlayBudW1iZXJzCglyZW5kZXJOdW1iZXJJbnRyb0h0bWw6IGZ1bmN0aW9uKHJvdykgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB3ZWVrU3RhcnQgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgMCk7CgoJCWlmICh2aWV3LmNvbFdlZWtOdW1iZXJzVmlzaWJsZSkgewoJCQlyZXR1cm4gJycgKwoJCQkJJzx0ZCBjbGFzcz0iZmMtd2Vlay1udW1iZXIiICcgKyB2aWV3LndlZWtOdW1iZXJTdHlsZUF0dHIoKSArICc+JyArCgkJCQkJdmlldy5idWlsZEdvdG9BbmNob3JIdG1sKCAvLyBhc2lkZSBmcm9tIGxpbmssIGltcG9ydGFudCBmb3IgbWF0Y2hDZWxsV2lkdGhzCgkJCQkJCXsgZGF0ZTogd2Vla1N0YXJ0LCB0eXBlOiAnd2VlaycsIGZvcmNlT2ZmOiB0aGlzLmNvbENudCA9PT0gMSB9LAoJCQkJCQl3ZWVrU3RhcnQuZm9ybWF0KCd3JykgLy8gaW5uZXIgSFRNTAoJCQkJCSkgKwoJCQkJJzwvdGQ+JzsKCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIHRoZSBkYXkgYmcgY2VsbHMgZm9yIGVhY2ggZGF5LXJvdwoJcmVuZGVyQmdJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQlpZiAodmlldy5jb2xXZWVrTnVtYmVyc1Zpc2libGUpIHsKCQkJcmV0dXJuICc8dGQgY2xhc3M9ImZjLXdlZWstbnVtYmVyICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciICcgKwoJCQkJdmlldy53ZWVrTnVtYmVyU3R5bGVBdHRyKCkgKyAnPjwvdGQ+JzsKCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIGV2ZXJ5IG90aGVyIHR5cGUgb2Ygcm93IGdlbmVyYXRlZCBieSBEYXlHcmlkLgoJLy8gQWZmZWN0cyBoZWxwZXItc2tlbGV0b24gYW5kIGhpZ2hsaWdodC1za2VsZXRvbiByb3dzLgoJcmVuZGVySW50cm9IdG1sOiBmdW5jdGlvbigpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCgkJaWYgKHZpZXcuY29sV2Vla051bWJlcnNWaXNpYmxlKSB7CgkJCXJldHVybiAnPHRkIGNsYXNzPSJmYy13ZWVrLW51bWJlciIgJyArIHZpZXcud2Vla051bWJlclN0eWxlQXR0cigpICsgJz48L3RkPic7CgkJfQoKCQlyZXR1cm4gJyc7Cgl9Cgp9OwoKOzsKCi8qIEEgbW9udGggdmlldyB3aXRoIGRheSBjZWxscyBydW5uaW5nIGluIHJvd3MgKG9uZS1wZXItd2VlaykgYW5kIGNvbHVtbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgTW9udGhWaWV3ID0gRkMuTW9udGhWaWV3ID0gQmFzaWNWaWV3LmV4dGVuZCh7CgoJLy8gUHJvZHVjZXMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCByYW5nZSB0byBkaXNwbGF5Cgljb21wdXRlUmFuZ2U6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgcmFuZ2UgPSBCYXNpY1ZpZXcucHJvdG90eXBlLmNvbXB1dGVSYW5nZS5jYWxsKHRoaXMsIGRhdGUpOyAvLyBnZXQgdmFsdWUgZnJvbSBzdXBlci1tZXRob2QKCQl2YXIgcm93Q250OwoKCQkvLyBlbnN1cmUgNiB3ZWVrcwoJCWlmICh0aGlzLmlzRml4ZWRXZWVrcygpKSB7CgkJCXJvd0NudCA9IE1hdGguY2VpbChyYW5nZS5lbmQuZGlmZihyYW5nZS5zdGFydCwgJ3dlZWtzJywgdHJ1ZSkpOyAvLyBjb3VsZCBiZSBwYXJ0aWFsIHdlZWtzIGR1ZSB0byBoaWRkZW5EYXlzCgkJCXJhbmdlLmVuZC5hZGQoNiAtIHJvd0NudCwgJ3dlZWtzJyk7CgkJfQoKCQlyZXR1cm4gcmFuZ2U7Cgl9LAoKCgkvLyBPdmVycmlkZXMgdGhlIGRlZmF1bHQgQmFzaWNWaWV3IGJlaGF2aW9yIHRvIGhhdmUgc3BlY2lhbCBtdWx0aS13ZWVrIGF1dG8taGVpZ2h0IGxvZ2ljCglzZXRHcmlkSGVpZ2h0OiBmdW5jdGlvbihoZWlnaHQsIGlzQXV0bykgewoKCQkvLyBpZiBhdXRvLCBtYWtlIHRoZSBoZWlnaHQgb2YgZWFjaCByb3cgdGhlIGhlaWdodCB0aGF0IGl0IHdvdWxkIGJlIGlmIHRoZXJlIHdlcmUgNiB3ZWVrcwoJCWlmIChpc0F1dG8pIHsKCQkJaGVpZ2h0ICo9IHRoaXMucm93Q250IC8gNjsKCQl9CgoJCWRpc3RyaWJ1dGVIZWlnaHQodGhpcy5kYXlHcmlkLnJvd0VscywgaGVpZ2h0LCAhaXNBdXRvKTsgLy8gaWYgYXV0bywgZG9uJ3QgY29tcGVuc2F0ZSBmb3IgaGVpZ2h0LWhvZ2dpbmcgcm93cwoJfSwKCgoJaXNGaXhlZFdlZWtzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5vcHQoJ2ZpeGVkV2Vla0NvdW50Jyk7Cgl9Cgp9KTsKCjs7CgpmY1ZpZXdzLmJhc2ljID0gewoJJ2NsYXNzJzogQmFzaWNWaWV3Cn07CgpmY1ZpZXdzLmJhc2ljRGF5ID0gewoJdHlwZTogJ2Jhc2ljJywKCWR1cmF0aW9uOiB7IGRheXM6IDEgfQp9OwoKZmNWaWV3cy5iYXNpY1dlZWsgPSB7Cgl0eXBlOiAnYmFzaWMnLAoJZHVyYXRpb246IHsgd2Vla3M6IDEgfQp9OwoKZmNWaWV3cy5tb250aCA9IHsKCSdjbGFzcyc6IE1vbnRoVmlldywKCWR1cmF0aW9uOiB7IG1vbnRoczogMSB9LCAvLyBpbXBvcnRhbnQgZm9yIHByZXYvbmV4dAoJZGVmYXVsdHM6IHsKCQlmaXhlZFdlZWtDb3VudDogdHJ1ZQoJfQp9Owo7OwoKLyogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIGFsbCBhZ2VuZGEtcmVsYXRlZCB2aWV3cy4gRGlzcGxheXMgb25lIG1vcmUgY29sdW1ucyB3aXRoIHRpbWUgc2xvdHMgcnVubmluZyB2ZXJ0aWNhbGx5LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLy8gSXMgYSBtYW5hZ2VyIGZvciB0aGUgVGltZUdyaWQgc3ViY29tcG9uZW50IGFuZCBwb3NzaWJseSB0aGUgRGF5R3JpZCBzdWJjb21wb25lbnQgKGlmIGFsbERheVNsb3QgaXMgb24pLgovLyBSZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgd2lkdGgvaGVpZ2h0LgoKdmFyIEFnZW5kYVZpZXcgPSBGQy5BZ2VuZGFWaWV3ID0gVmlldy5leHRlbmQoewoKCXNjcm9sbGVyOiBudWxsLAoKCXRpbWVHcmlkQ2xhc3M6IFRpbWVHcmlkLCAvLyBjbGFzcyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSB0aW1lR3JpZC4gc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKCXRpbWVHcmlkOiBudWxsLCAvLyB0aGUgbWFpbiB0aW1lLWdyaWQgc3ViY29tcG9uZW50IG9mIHRoaXMgdmlldwoKCWRheUdyaWRDbGFzczogRGF5R3JpZCwgLy8gY2xhc3MgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgZGF5R3JpZC4gc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKCWRheUdyaWQ6IG51bGwsIC8vIHRoZSAiYWxsLWRheSIgc3ViY29tcG9uZW50LiBpZiBhbGwtZGF5IGlzIHR1cm5lZCBvZmYsIHRoaXMgd2lsbCBiZSBudWxsCgoJYXhpc1dpZHRoOiBudWxsLCAvLyB0aGUgd2lkdGggb2YgdGhlIHRpbWUgYXhpcyBydW5uaW5nIGRvd24gdGhlIHNpZGUKCgloZWFkQ29udGFpbmVyRWw6IG51bGwsIC8vIGRpdiB0aGF0IGhvbGQncyB0aGUgdGltZUdyaWQncyByZW5kZXJlZCBkYXRlIGhlYWRlcgoJbm9TY3JvbGxSb3dFbHM6IG51bGwsIC8vIHNldCBvZiBmYWtlIHJvdyBlbGVtZW50cyB0aGF0IG11c3QgY29tcGVuc2F0ZSB3aGVuIHNjcm9sbGVyIGhhcyBzY3JvbGxiYXJzCgoJLy8gd2hlbiB0aGUgdGltZS1ncmlkIGlzbid0IHRhbGwgZW5vdWdoIHRvIG9jY3VweSB0aGUgZ2l2ZW4gaGVpZ2h0LCB3ZSByZW5kZXIgYW4gPGhyPiB1bmRlcm5lYXRoCglib3R0b21SdWxlRWw6IG51bGwsCgoKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXRoaXMudGltZUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlVGltZUdyaWQoKTsKCgkJaWYgKHRoaXMub3B0KCdhbGxEYXlTbG90JykpIHsgLy8gc2hvdWxkIHdlIGRpc3BsYXkgdGhlICJhbGwtZGF5IiBhcmVhPwoJCQl0aGlzLmRheUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlRGF5R3JpZCgpOyAvLyB0aGUgYWxsLWRheSBzdWJjb21wb25lbnQgb2YgdGhpcyB2aWV3CgkJfQoKCQl0aGlzLnNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKHsKCQkJb3ZlcmZsb3dYOiAnaGlkZGVuJywKCQkJb3ZlcmZsb3dZOiAnYXV0bycKCQl9KTsKCX0sCgoKCS8vIEluc3RhbnRpYXRlcyB0aGUgVGltZUdyaWQgb2JqZWN0IHRoaXMgdmlldyBuZWVkcy4gRHJhd3MgZnJvbSB0aGlzLnRpbWVHcmlkQ2xhc3MKCWluc3RhbnRpYXRlVGltZUdyaWQ6IGZ1bmN0aW9uKCkgewoJCXZhciBzdWJjbGFzcyA9IHRoaXMudGltZUdyaWRDbGFzcy5leHRlbmQoYWdlbmRhVGltZUdyaWRNZXRob2RzKTsKCgkJcmV0dXJuIG5ldyBzdWJjbGFzcyh0aGlzKTsKCX0sCgoKCS8vIEluc3RhbnRpYXRlcyB0aGUgRGF5R3JpZCBvYmplY3QgdGhpcyB2aWV3IG1pZ2h0IG5lZWQuIERyYXdzIGZyb20gdGhpcy5kYXlHcmlkQ2xhc3MKCWluc3RhbnRpYXRlRGF5R3JpZDogZnVuY3Rpb24oKSB7CgkJdmFyIHN1YmNsYXNzID0gdGhpcy5kYXlHcmlkQ2xhc3MuZXh0ZW5kKGFnZW5kYURheUdyaWRNZXRob2RzKTsKCgkJcmV0dXJuIG5ldyBzdWJjbGFzcyh0aGlzKTsKCX0sCgoKCS8qIFJlbmRlcmluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gU2V0cyB0aGUgZGlzcGxheSByYW5nZSBhbmQgY29tcHV0ZXMgYWxsIG5lY2Vzc2FyeSBkYXRlcwoJc2V0UmFuZ2U6IGZ1bmN0aW9uKHJhbmdlKSB7CgkJVmlldy5wcm90b3R5cGUuc2V0UmFuZ2UuY2FsbCh0aGlzLCByYW5nZSk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoKCQl0aGlzLnRpbWVHcmlkLnNldFJhbmdlKHJhbmdlKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCXRoaXMuZGF5R3JpZC5zZXRSYW5nZShyYW5nZSk7CgkJfQoJfSwKCgoJLy8gUmVuZGVycyB0aGUgdmlldyBpbnRvIGB0aGlzLmVsYCwgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZAoJcmVuZGVyRGF0ZXM6IGZ1bmN0aW9uKCkgewoKCQl0aGlzLmVsLmFkZENsYXNzKCdmYy1hZ2VuZGEtdmlldycpLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSk7CgkJdGhpcy5yZW5kZXJIZWFkKCk7CgoJCXRoaXMuc2Nyb2xsZXIucmVuZGVyKCk7CgkJdmFyIHRpbWVHcmlkV3JhcEVsID0gdGhpcy5zY3JvbGxlci5lbC5hZGRDbGFzcygnZmMtdGltZS1ncmlkLWNvbnRhaW5lcicpOwoJCXZhciB0aW1lR3JpZEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtdGltZS1ncmlkIiAvPicpLmFwcGVuZFRvKHRpbWVHcmlkV3JhcEVsKTsKCQl0aGlzLmVsLmZpbmQoJy5mYy1ib2R5ID4gdHIgPiB0ZCcpLmFwcGVuZCh0aW1lR3JpZFdyYXBFbCk7CgoJCXRoaXMudGltZUdyaWQuc2V0RWxlbWVudCh0aW1lR3JpZEVsKTsKCQl0aGlzLnRpbWVHcmlkLnJlbmRlckRhdGVzKCk7CgoJCS8vIHRoZSA8aHI+IHRoYXQgc29tZXRpbWVzIGRpc3BsYXlzIHVuZGVyIHRoZSB0aW1lLWdyaWQKCQl0aGlzLmJvdHRvbVJ1bGVFbCA9ICQoJzxociBjbGFzcz0iZmMtZGl2aWRlciAnICsgdGhpcy53aWRnZXRIZWFkZXJDbGFzcyArICciLz4nKQoJCQkuYXBwZW5kVG8odGhpcy50aW1lR3JpZC5lbCk7IC8vIGluamVjdCBpdCBpbnRvIHRoZSB0aW1lLWdyaWQKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQuc2V0RWxlbWVudCh0aGlzLmVsLmZpbmQoJy5mYy1kYXktZ3JpZCcpKTsKCQkJdGhpcy5kYXlHcmlkLnJlbmRlckRhdGVzKCk7CgoJCQkvLyBoYXZlIHRoZSBkYXktZ3JpZCBleHRlbmQgaXQncyBjb29yZGluYXRlIGFyZWEgb3ZlciB0aGUgPGhyPiBkaXZpZGluZyB0aGUgdHdvIGdyaWRzCgkJCXRoaXMuZGF5R3JpZC5ib3R0b21Db29yZFBhZGRpbmcgPSB0aGlzLmRheUdyaWQuZWwubmV4dCgnaHInKS5vdXRlckhlaWdodCgpOwoJCX0KCgkJdGhpcy5ub1Njcm9sbFJvd0VscyA9IHRoaXMuZWwuZmluZCgnLmZjLXJvdzpub3QoLmZjLXNjcm9sbGVyICopJyk7IC8vIGZha2Ugcm93cyBub3Qgd2l0aGluIHRoZSBzY3JvbGxlcgoJfSwKCgoJLy8gcmVuZGVyIHRoZSBkYXktb2Ytd2VlayBoZWFkZXJzCglyZW5kZXJIZWFkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmhlYWRDb250YWluZXJFbCA9CgkJCXRoaXMuZWwuZmluZCgnLmZjLWhlYWQtY29udGFpbmVyJykKCQkJCS5odG1sKHRoaXMudGltZUdyaWQucmVuZGVySGVhZEh0bWwoKSk7Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIGNvbnRlbnQgb2YgdGhlIHZpZXcuIFNpbmNlIHdlIGhhdmVuJ3Qgc2VwYXJhdGVkIHNrZWxldG9uIHJlbmRlcmluZyBmcm9tIGRhdGUgcmVuZGVyaW5nLAoJLy8gYWx3YXlzIGNvbXBsZXRlbHkga2lsbCBlYWNoIGdyaWQncyByZW5kZXJpbmcuCgl1bnJlbmRlckRhdGVzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRpbWVHcmlkLnVucmVuZGVyRGF0ZXMoKTsKCQl0aGlzLnRpbWVHcmlkLnJlbW92ZUVsZW1lbnQoKTsKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQudW5yZW5kZXJEYXRlcygpOwoJCQl0aGlzLmRheUdyaWQucmVtb3ZlRWxlbWVudCgpOwoJCX0KCgkJdGhpcy5zY3JvbGxlci5kZXN0cm95KCk7Cgl9LAoKCgkvLyBCdWlsZHMgdGhlIEhUTUwgc2tlbGV0b24gZm9yIHRoZSB2aWV3LgoJLy8gVGhlIGRheS1ncmlkIGFuZCB0aW1lLWdyaWQgY29tcG9uZW50cyB3aWxsIHJlbmRlciBpbnNpZGUgY29udGFpbmVycyBkZWZpbmVkIGJ5IHRoaXMgSFRNTC4KCXJlbmRlclNrZWxldG9uSHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICcnICsKCQkJJzx0YWJsZT4nICsKCQkJCSc8dGhlYWQgY2xhc3M9ImZjLWhlYWQiPicgKwoJCQkJCSc8dHI+JyArCgkJCQkJCSc8dGQgY2xhc3M9ImZjLWhlYWQtY29udGFpbmVyICcgKyB0aGlzLndpZGdldEhlYWRlckNsYXNzICsgJyI+PC90ZD4nICsKCQkJCQknPC90cj4nICsKCQkJCSc8L3RoZWFkPicgKwoJCQkJJzx0Ym9keSBjbGFzcz0iZmMtYm9keSI+JyArCgkJCQkJJzx0cj4nICsKCQkJCQkJJzx0ZCBjbGFzcz0iJyArIHRoaXMud2lkZ2V0Q29udGVudENsYXNzICsgJyI+JyArCgkJCQkJCQkodGhpcy5kYXlHcmlkID8KCQkJCQkJCQknPGRpdiBjbGFzcz0iZmMtZGF5LWdyaWQiLz4nICsKCQkJCQkJCQknPGhyIGNsYXNzPSJmYy1kaXZpZGVyICcgKyB0aGlzLndpZGdldEhlYWRlckNsYXNzICsgJyIvPicgOgoJCQkJCQkJCScnCgkJCQkJCQkJKSArCgkJCQkJCSc8L3RkPicgKwoJCQkJCSc8L3RyPicgKwoJCQkJJzwvdGJvZHk+JyArCgkJCSc8L3RhYmxlPic7Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgYW4gSFRNTCBhdHRyaWJ1dGUgc3RyaW5nIGZvciBzZXR0aW5nIHRoZSB3aWR0aCBvZiB0aGUgYXhpcywgaWYgaXQgaXMga25vd24KCWF4aXNTdHlsZUF0dHI6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmF4aXNXaWR0aCAhPT0gbnVsbCkgewoJCQkgcmV0dXJuICdzdHlsZT0id2lkdGg6JyArIHRoaXMuYXhpc1dpZHRoICsgJ3B4Iic7CgkJfQoJCXJldHVybiAnJzsKCX0sCgoKCS8qIEJ1c2luZXNzIEhvdXJzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRpbWVHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucmVuZGVyQnVzaW5lc3NIb3VycygpOwoJCX0KCX0sCgoKCXVucmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy50aW1lR3JpZC51bnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CgkJfQoJfSwKCgoJLyogTm93IEluZGljYXRvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJZ2V0Tm93SW5kaWNhdG9yVW5pdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0Tm93SW5kaWNhdG9yVW5pdCgpOwoJfSwKCgoJcmVuZGVyTm93SW5kaWNhdG9yOiBmdW5jdGlvbihkYXRlKSB7CgkJdGhpcy50aW1lR3JpZC5yZW5kZXJOb3dJbmRpY2F0b3IoZGF0ZSk7Cgl9LAoKCgl1bnJlbmRlck5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJdGhpcy50aW1lR3JpZC51bnJlbmRlck5vd0luZGljYXRvcigpOwoJfSwKCgoJLyogRGltZW5zaW9ucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJdXBkYXRlU2l6ZTogZnVuY3Rpb24oaXNSZXNpemUpIHsKCQl0aGlzLnRpbWVHcmlkLnVwZGF0ZVNpemUoaXNSZXNpemUpOwoKCQlWaWV3LnByb3RvdHlwZS51cGRhdGVTaXplLmNhbGwodGhpcywgaXNSZXNpemUpOyAvLyBjYWxsIHRoZSBzdXBlci1tZXRob2QKCX0sCgoKCS8vIFJlZnJlc2hlcyB0aGUgaG9yaXpvbnRhbCBkaW1lbnNpb25zIG9mIHRoZSB2aWV3Cgl1cGRhdGVXaWR0aDogZnVuY3Rpb24oKSB7CgkJLy8gbWFrZSBhbGwgYXhpcyBjZWxscyBsaW5lIHVwLCBhbmQgcmVjb3JkIHRoZSB3aWR0aCBzbyBuZXdseSBjcmVhdGVkIGF4aXMgY2VsbHMgd2lsbCBoYXZlIGl0CgkJdGhpcy5heGlzV2lkdGggPSBtYXRjaENlbGxXaWR0aHModGhpcy5lbC5maW5kKCcuZmMtYXhpcycpKTsKCX0sCgoKCS8vIEFkanVzdHMgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIHZpZXcgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZXMKCXNldEhlaWdodDogZnVuY3Rpb24odG90YWxIZWlnaHQsIGlzQXV0bykgewoJCXZhciBldmVudExpbWl0OwoJCXZhciBzY3JvbGxlckhlaWdodDsKCQl2YXIgc2Nyb2xsYmFyV2lkdGhzOwoKCQkvLyByZXNldCBhbGwgZGltZW5zaW9ucyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZQoJCXRoaXMuYm90dG9tUnVsZUVsLmhpZGUoKTsgLy8gLnNob3coKSB3aWxsIGJlIGNhbGxlZCBsYXRlciBpZiB0aGlzIDxocj4gaXMgbmVjZXNzYXJ5CgkJdGhpcy5zY3JvbGxlci5jbGVhcigpOyAvLyBzZXRzIGhlaWdodCB0byAnYXV0bycgYW5kIGNsZWFycyBvdmVyZmxvdwoJCXVuY29tcGVuc2F0ZVNjcm9sbCh0aGlzLm5vU2Nyb2xsUm93RWxzKTsKCgkJLy8gbGltaXQgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgYWxsLWRheSBhcmVhCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucmVtb3ZlU2VnUG9wb3ZlcigpOyAvLyBraWxsIHRoZSAibW9yZSIgcG9wb3ZlciBpZiBkaXNwbGF5ZWQKCgkJCWV2ZW50TGltaXQgPSB0aGlzLm9wdCgnZXZlbnRMaW1pdCcpOwoJCQlpZiAoZXZlbnRMaW1pdCAmJiB0eXBlb2YgZXZlbnRMaW1pdCAhPT0gJ251bWJlcicpIHsKCQkJCWV2ZW50TGltaXQgPSBBR0VOREFfQUxMX0RBWV9FVkVOVF9MSU1JVDsgLy8gbWFrZSBzdXJlICJhdXRvIiBnb2VzIHRvIGEgcmVhbCBudW1iZXIKCQkJfQoJCQlpZiAoZXZlbnRMaW1pdCkgewoJCQkJdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhldmVudExpbWl0KTsKCQkJfQoJCX0KCgkJaWYgKCFpc0F1dG8pIHsgLy8gc2hvdWxkIHdlIGZvcmNlIGRpbWVuc2lvbnMgb2YgdGhlIHNjcm9sbCBjb250YWluZXI/CgoJCQlzY3JvbGxlckhlaWdodCA9IHRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHRvdGFsSGVpZ2h0KTsKCQkJdGhpcy5zY3JvbGxlci5zZXRIZWlnaHQoc2Nyb2xsZXJIZWlnaHQpOwoJCQlzY3JvbGxiYXJXaWR0aHMgPSB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpOwoKCQkJaWYgKHNjcm9sbGJhcldpZHRocy5sZWZ0IHx8IHNjcm9sbGJhcldpZHRocy5yaWdodCkgeyAvLyB1c2luZyBzY3JvbGxiYXJzPwoKCQkJCS8vIG1ha2UgdGhlIGFsbC1kYXkgYW5kIGhlYWRlciByb3dzIGxpbmVzIHVwCgkJCQljb21wZW5zYXRlU2Nyb2xsKHRoaXMubm9TY3JvbGxSb3dFbHMsIHNjcm9sbGJhcldpZHRocyk7CgoJCQkJLy8gdGhlIHNjcm9sbGJhciBjb21wZW5zYXRpb24gbWlnaHQgaGF2ZSBjaGFuZ2VkIHRleHQgZmxvdywgd2hpY2ggbWlnaHQgYWZmZWN0IGhlaWdodCwgc28gcmVjYWxjdWxhdGUKCQkJCS8vIGFuZCByZWFwcGx5IHRoZSBkZXNpcmVkIGhlaWdodCB0byB0aGUgc2Nyb2xsZXIuCgkJCQlzY3JvbGxlckhlaWdodCA9IHRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHRvdGFsSGVpZ2h0KTsKCQkJCXRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KHNjcm9sbGVySGVpZ2h0KTsKCQkJfQoKCQkJLy8gZ3VhcmFudGVlcyB0aGUgc2FtZSBzY3JvbGxiYXIgd2lkdGhzCgkJCXRoaXMuc2Nyb2xsZXIubG9ja092ZXJmbG93KHNjcm9sbGJhcldpZHRocyk7CgoJCQkvLyBpZiB0aGVyZSdzIGFueSBzcGFjZSBiZWxvdyB0aGUgc2xhdHMsIHNob3cgdGhlIGhvcml6b250YWwgcnVsZS4KCQkJLy8gdGhpcyB3b24ndCBjYXVzZSBhbnkgbmV3IG92ZXJmbG93LCBiZWNhdXNlIGxvY2tPdmVyZmxvdyBhbHJlYWR5IGNhbGxlZC4KCQkJaWYgKHRoaXMudGltZUdyaWQuZ2V0VG90YWxTbGF0SGVpZ2h0KCkgPCBzY3JvbGxlckhlaWdodCkgewoJCQkJdGhpcy5ib3R0b21SdWxlRWwuc2hvdygpOwoJCQl9CgkJfQoJfSwKCgoJLy8gZ2l2ZW4gYSBkZXNpcmVkIHRvdGFsIGhlaWdodCBvZiB0aGUgdmlldywgcmV0dXJucyB3aGF0IHRoZSBoZWlnaHQgb2YgdGhlIHNjcm9sbGVyIHNob3VsZCBiZQoJY29tcHV0ZVNjcm9sbGVySGVpZ2h0OiBmdW5jdGlvbih0b3RhbEhlaWdodCkgewoJCXJldHVybiB0b3RhbEhlaWdodCAtCgkJCXN1YnRyYWN0SW5uZXJFbEhlaWdodCh0aGlzLmVsLCB0aGlzLnNjcm9sbGVyLmVsKTsgLy8gZXZlcnl0aGluZyB0aGF0J3MgTk9UIHRoZSBzY3JvbGxlcgoJfSwKCgoJLyogU2Nyb2xsCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBDb21wdXRlcyB0aGUgaW5pdGlhbCBwcmUtY29uZmlndXJlZCBzY3JvbGwgc3RhdGUgcHJpb3IgdG8gYWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hhbmdlIGl0Cgljb21wdXRlSW5pdGlhbFNjcm9sbDogZnVuY3Rpb24oKSB7CgkJdmFyIHNjcm9sbFRpbWUgPSBtb21lbnQuZHVyYXRpb24odGhpcy5vcHQoJ3Njcm9sbFRpbWUnKSk7CgkJdmFyIHRvcCA9IHRoaXMudGltZUdyaWQuY29tcHV0ZVRpbWVUb3Aoc2Nyb2xsVGltZSk7CgoJCS8vIHpvb20gY2FuIGdpdmUgd2VpcmQgZmxvYXRpbmctcG9pbnQgdmFsdWVzLiByYXRoZXIgc2Nyb2xsIGEgbGl0dGxlIGJpdCBmdXJ0aGVyCgkJdG9wID0gTWF0aC5jZWlsKHRvcCk7CgoJCWlmICh0b3ApIHsKCQkJdG9wKys7IC8vIHRvIG92ZXJjb21lIHRvcCBib3JkZXIgdGhhdCBzbG90cyBiZXlvbmQgdGhlIGZpcnN0IGhhdmUuIGxvb2tzIGJldHRlcgoJCX0KCgkJcmV0dXJuIHRvcDsKCX0sCgoKCXF1ZXJ5U2Nyb2xsOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5zY3JvbGxlci5nZXRTY3JvbGxUb3AoKTsKCX0sCgoKCXNldFNjcm9sbDogZnVuY3Rpb24odG9wKSB7CgkJdGhpcy5zY3JvbGxlci5zZXRTY3JvbGxUb3AodG9wKTsKCX0sCgoKCS8qIEhpdCBBcmVhcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCS8vIGZvcndhcmQgYWxsIGhpdC1yZWxhdGVkIG1ldGhvZCBjYWxscyB0byB0aGUgZ3JpZHMgKGRheUdyaWQgbWlnaHQgbm90IGJlIGRlZmluZWQpCgoKCXByZXBhcmVIaXRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRpbWVHcmlkLnByZXBhcmVIaXRzKCk7CgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucHJlcGFyZUhpdHMoKTsKCQl9Cgl9LAoKCglyZWxlYXNlSGl0czogZnVuY3Rpb24oKSB7CgkJdGhpcy50aW1lR3JpZC5yZWxlYXNlSGl0cygpOwoJCWlmICh0aGlzLmRheUdyaWQpIHsKCQkJdGhpcy5kYXlHcmlkLnJlbGVhc2VIaXRzKCk7CgkJfQoJfSwKCgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnQsIHRvcCkgewoJCXZhciBoaXQgPSB0aGlzLnRpbWVHcmlkLnF1ZXJ5SGl0KGxlZnQsIHRvcCk7CgoJCWlmICghaGl0ICYmIHRoaXMuZGF5R3JpZCkgewoJCQloaXQgPSB0aGlzLmRheUdyaWQucXVlcnlIaXQobGVmdCwgdG9wKTsKCQl9CgoJCXJldHVybiBoaXQ7Cgl9LAoKCglnZXRIaXRTcGFuOiBmdW5jdGlvbihoaXQpIHsKCQkvLyBUT0RPOiBoaXQuY29tcG9uZW50IGlzIHNldCBhcyBhIGhhY2sgdG8gaWRlbnRpZnkgd2hlcmUgdGhlIGhpdCBjYW1lIGZyb20KCQlyZXR1cm4gaGl0LmNvbXBvbmVudC5nZXRIaXRTcGFuKGhpdCk7Cgl9LAoKCglnZXRIaXRFbDogZnVuY3Rpb24oaGl0KSB7CgkJLy8gVE9ETzogaGl0LmNvbXBvbmVudCBpcyBzZXQgYXMgYSBoYWNrIHRvIGlkZW50aWZ5IHdoZXJlIHRoZSBoaXQgY2FtZSBmcm9tCgkJcmV0dXJuIGhpdC5jb21wb25lbnQuZ2V0SGl0RWwoaGl0KTsKCX0sCgoKCS8qIEV2ZW50cwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBldmVudHMgb250byB0aGUgdmlldyBhbmQgcG9wdWxhdGVzIHRoZSBWaWV3J3Mgc2VnbWVudCBhcnJheQoJcmVuZGVyRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHsKCQl2YXIgZGF5RXZlbnRzID0gW107CgkJdmFyIHRpbWVkRXZlbnRzID0gW107CgkJdmFyIGRheVNlZ3MgPSBbXTsKCQl2YXIgdGltZWRTZWdzOwoJCXZhciBpOwoKCQkvLyBzZXBhcmF0ZSB0aGUgZXZlbnRzIGludG8gYWxsLWRheSBhbmQgdGltZWQKCQlmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChldmVudHNbaV0uYWxsRGF5KSB7CgkJCQlkYXlFdmVudHMucHVzaChldmVudHNbaV0pOwoJCQl9CgkJCWVsc2UgewoJCQkJdGltZWRFdmVudHMucHVzaChldmVudHNbaV0pOwoJCQl9CgkJfQoKCQkvLyByZW5kZXIgdGhlIGV2ZW50cyBpbiB0aGUgc3ViY29tcG9uZW50cwoJCXRpbWVkU2VncyA9IHRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKHRpbWVkRXZlbnRzKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCWRheVNlZ3MgPSB0aGlzLmRheUdyaWQucmVuZGVyRXZlbnRzKGRheUV2ZW50cyk7CgkJfQoKCQkvLyB0aGUgYWxsLWRheSBhcmVhIGlzIGZsZXhpYmxlIGFuZCBtaWdodCBoYXZlIGEgbG90IG9mIGV2ZW50cywgc28gc2hpZnQgdGhlIGhlaWdodAoJCXRoaXMudXBkYXRlSGVpZ2h0KCk7Cgl9LAoKCgkvLyBSZXRyaWV2ZXMgYWxsIHNlZ21lbnQgb2JqZWN0cyB0aGF0IGFyZSByZW5kZXJlZCBpbiB0aGUgdmlldwoJZ2V0RXZlbnRTZWdzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRFdmVudFNlZ3MoKS5jb25jYXQoCgkJCXRoaXMuZGF5R3JpZCA/IHRoaXMuZGF5R3JpZC5nZXRFdmVudFNlZ3MoKSA6IFtdCgkJKTsKCX0sCgoKCS8vIFVucmVuZGVycyBhbGwgZXZlbnQgZWxlbWVudHMgYW5kIGNsZWFycyBpbnRlcm5hbCBzZWdtZW50IGRhdGEKCXVucmVuZGVyRXZlbnRzOiBmdW5jdGlvbigpIHsKCgkJLy8gdW5yZW5kZXIgdGhlIGV2ZW50cyBpbiB0aGUgc3ViY29tcG9uZW50cwoJCXRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCXRoaXMuZGF5R3JpZC51bnJlbmRlckV2ZW50cygpOwoJCX0KCgkJLy8gd2UgRE9OJ1QgbmVlZCB0byBjYWxsIHVwZGF0ZUhlaWdodCgpIGJlY2F1c2UKCQkvLyBhIHJlbmRlckV2ZW50cygpIGNhbGwgYWx3YXlzIGhhcHBlbnMgYWZ0ZXIgdGhpcywgd2hpY2ggd2lsbCBldmVudHVhbGx5IGNhbGwgdXBkYXRlSGVpZ2h0KCkKCX0sCgoKCS8qIERyYWdnaW5nIChmb3IgZXZlbnRzIGFuZCBleHRlcm5hbCBlbGVtZW50cykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEEgcmV0dXJuZWQgdmFsdWUgb2YgYHRydWVgIHNpZ25hbHMgdGhhdCBhIG1vY2sgImhlbHBlciIgZXZlbnQgaGFzIGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEcmFnOiBmdW5jdGlvbihkcm9wTG9jYXRpb24sIHNlZykgewoJCWlmIChkcm9wTG9jYXRpb24uc3RhcnQuaGFzVGltZSgpKSB7CgkJCXJldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckRyYWcoZHJvcExvY2F0aW9uLCBzZWcpOwoJCX0KCQllbHNlIGlmICh0aGlzLmRheUdyaWQpIHsKCQkJcmV0dXJuIHRoaXMuZGF5R3JpZC5yZW5kZXJEcmFnKGRyb3BMb2NhdGlvbiwgc2VnKTsKCQl9Cgl9LAoKCgl1bnJlbmRlckRyYWc6IGZ1bmN0aW9uKCkgewoJCXRoaXMudGltZUdyaWQudW5yZW5kZXJEcmFnKCk7CgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQudW5yZW5kZXJEcmFnKCk7CgkJfQoJfSwKCgoJLyogU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYSBzZWxlY3Rpb24KCXJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbikgewoJCWlmIChzcGFuLnN0YXJ0Lmhhc1RpbWUoKSB8fCBzcGFuLmVuZC5oYXNUaW1lKCkpIHsKCQkJdGhpcy50aW1lR3JpZC5yZW5kZXJTZWxlY3Rpb24oc3Bhbik7CgkJfQoJCWVsc2UgaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHNwYW4pOwoJCX0KCX0sCgoKCS8vIFVucmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9ucyBvZiBhIHNlbGVjdGlvbgoJdW5yZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMudGltZUdyaWQudW5yZW5kZXJTZWxlY3Rpb24oKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCXRoaXMuZGF5R3JpZC51bnJlbmRlclNlbGVjdGlvbigpOwoJCX0KCX0KCn0pOwoKCi8vIE1ldGhvZHMgdGhhdCB3aWxsIGN1c3RvbWl6ZSB0aGUgcmVuZGVyaW5nIGJlaGF2aW9yIG9mIHRoZSBBZ2VuZGFWaWV3J3MgdGltZUdyaWQKLy8gVE9ETzogbW92ZSBpbnRvIFRpbWVHcmlkCnZhciBhZ2VuZGFUaW1lR3JpZE1ldGhvZHMgPSB7CgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IHdpbGwgZ28gYmVmb3JlIHRoZSBkYXktb2Ygd2VlayBoZWFkZXIgY2VsbHMKCXJlbmRlckhlYWRJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB3ZWVrVGV4dDsKCgkJaWYgKHZpZXcub3B0KCd3ZWVrTnVtYmVycycpKSB7CgkJCXdlZWtUZXh0ID0gdGhpcy5zdGFydC5mb3JtYXQodmlldy5vcHQoJ3NtYWxsV2Vla0Zvcm1hdCcpKTsKCgkJCXJldHVybiAnJyArCgkJCQknPHRoIGNsYXNzPSJmYy1heGlzIGZjLXdlZWstbnVtYmVyICcgKyB2aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz4nICsKCQkJCQl2aWV3LmJ1aWxkR290b0FuY2hvckh0bWwoIC8vIGFzaWRlIGZyb20gbGluaywgaW1wb3J0YW50IGZvciBtYXRjaENlbGxXaWR0aHMKCQkJCQkJeyBkYXRlOiB0aGlzLnN0YXJ0LCB0eXBlOiAnd2VlaycsIGZvcmNlT2ZmOiB0aGlzLmNvbENudCA+IDEgfSwKCQkJCQkJaHRtbEVzY2FwZSh3ZWVrVGV4dCkgLy8gaW5uZXIgSFRNTAoJCQkJCSkgKwoJCQkJJzwvdGg+JzsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiAnPHRoIGNsYXNzPSJmYy1heGlzICcgKyB2aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz48L3RoPic7CgkJfQoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgZ29lcyBiZWZvcmUgdGhlIGJnIG9mIHRoZSBUaW1lR3JpZCBzbG90IGFyZWEuIExvbmcgdmVydGljYWwgY29sdW1uLgoJcmVuZGVyQmdJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQlyZXR1cm4gJzx0ZCBjbGFzcz0iZmMtYXhpcyAnICsgdmlldy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIiAnICsgdmlldy5heGlzU3R5bGVBdHRyKCkgKyAnPjwvdGQ+JzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIGFsbCBvdGhlciB0eXBlcyBvZiBjZWxscy4KCS8vIEFmZmVjdHMgY29udGVudC1za2VsZXRvbiwgaGVscGVyLXNrZWxldG9uLCBoaWdobGlnaHQtc2tlbGV0b24gZm9yIGJvdGggdGhlIHRpbWUtZ3JpZCBhbmQgZGF5LWdyaWQuCglyZW5kZXJJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQlyZXR1cm4gJzx0ZCBjbGFzcz0iZmMtYXhpcyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz48L3RkPic7Cgl9Cgp9OwoKCi8vIE1ldGhvZHMgdGhhdCB3aWxsIGN1c3RvbWl6ZSB0aGUgcmVuZGVyaW5nIGJlaGF2aW9yIG9mIHRoZSBBZ2VuZGFWaWV3J3MgZGF5R3JpZAp2YXIgYWdlbmRhRGF5R3JpZE1ldGhvZHMgPSB7CgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIHRoZSBhbGwtZGF5IGNlbGxzCglyZW5kZXJCZ0ludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCXJldHVybiAnJyArCgkJCSc8dGQgY2xhc3M9ImZjLWF4aXMgJyArIHZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz4nICsKCQkJCSc8c3Bhbj4nICsgLy8gbmVlZGVkIGZvciBtYXRjaENlbGxXaWR0aHMKCQkJCQl2aWV3LmdldEFsbERheUh0bWwoKSArCgkJCQknPC9zcGFuPicgKwoJCQknPC90ZD4nOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgZ29lcyBiZWZvcmUgYWxsIG90aGVyIHR5cGVzIG9mIGNlbGxzLgoJLy8gQWZmZWN0cyBjb250ZW50LXNrZWxldG9uLCBoZWxwZXItc2tlbGV0b24sIGhpZ2hsaWdodC1za2VsZXRvbiBmb3IgYm90aCB0aGUgdGltZS1ncmlkIGFuZCBkYXktZ3JpZC4KCXJlbmRlckludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCXJldHVybiAnPHRkIGNsYXNzPSJmYy1heGlzIiAnICsgdmlldy5heGlzU3R5bGVBdHRyKCkgKyAnPjwvdGQ+JzsKCX0KCn07Cgo7OwoKdmFyIEFHRU5EQV9BTExfREFZX0VWRU5UX0xJTUlUID0gNTsKCi8vIHBvdGVudGlhbCBuaWNlIHZhbHVlcyBmb3IgdGhlIHNsb3QtZHVyYXRpb24gYW5kIGludGVydmFsLWR1cmF0aW9uCi8vIGZyb20gbGFyZ2VzdCB0byBzbWFsbGVzdAp2YXIgQUdFTkRBX1NUT0NLX1NVQl9EVVJBVElPTlMgPSBbCgl7IGhvdXJzOiAxIH0sCgl7IG1pbnV0ZXM6IDMwIH0sCgl7IG1pbnV0ZXM6IDE1IH0sCgl7IHNlY29uZHM6IDMwIH0sCgl7IHNlY29uZHM6IDE1IH0KXTsKCmZjVmlld3MuYWdlbmRhID0gewoJJ2NsYXNzJzogQWdlbmRhVmlldywKCWRlZmF1bHRzOiB7CgkJYWxsRGF5U2xvdDogdHJ1ZSwKCQlzbG90RHVyYXRpb246ICcwMDozMDowMCcsCgkJbWluVGltZTogJzAwOjAwOjAwJywKCQltYXhUaW1lOiAnMjQ6MDA6MDAnLAoJCXNsb3RFdmVudE92ZXJsYXA6IHRydWUgLy8gYSBiYWQgbmFtZS4gY29uZnVzZWQgd2l0aCBvdmVybGFwL2NvbnN0cmFpbnQgc3lzdGVtCgl9Cn07CgpmY1ZpZXdzLmFnZW5kYURheSA9IHsKCXR5cGU6ICdhZ2VuZGEnLAoJZHVyYXRpb246IHsgZGF5czogMSB9Cn07CgpmY1ZpZXdzLmFnZW5kYVdlZWsgPSB7Cgl0eXBlOiAnYWdlbmRhJywKCWR1cmF0aW9uOiB7IHdlZWtzOiAxIH0KfTsKOzsKCi8qClJlc3BvbnNpYmxlIGZvciB0aGUgc2Nyb2xsZXIsIGFuZCBmb3J3YXJkaW5nIGV2ZW50LXJlbGF0ZWQgYWN0aW9ucyBpbnRvIHRoZSAiZ3JpZCIKKi8KdmFyIExpc3RWaWV3ID0gVmlldy5leHRlbmQoewoKCWdyaWQ6IG51bGwsCglzY3JvbGxlcjogbnVsbCwKCglpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKCQl0aGlzLmdyaWQgPSBuZXcgTGlzdFZpZXdHcmlkKHRoaXMpOwoJCXRoaXMuc2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIoewoJCQlvdmVyZmxvd1g6ICdoaWRkZW4nLAoJCQlvdmVyZmxvd1k6ICdhdXRvJwoJCX0pOwoJfSwKCglzZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsKCQlWaWV3LnByb3RvdHlwZS5zZXRSYW5nZS5jYWxsKHRoaXMsIHJhbmdlKTsgLy8gc3VwZXIKCgkJdGhpcy5ncmlkLnNldFJhbmdlKHJhbmdlKTsgLy8gbmVlZHMgdG8gcHJvY2VzcyByYW5nZS1yZWxhdGVkIG9wdGlvbnMKCX0sCgoJcmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWwuYWRkQ2xhc3MoCgkJCSdmYy1saXN0LXZpZXcgJyArCgkJCXRoaXMud2lkZ2V0Q29udGVudENsYXNzCgkJKTsKCgkJdGhpcy5zY3JvbGxlci5yZW5kZXIoKTsKCQl0aGlzLnNjcm9sbGVyLmVsLmFwcGVuZFRvKHRoaXMuZWwpOwoKCQl0aGlzLmdyaWQuc2V0RWxlbWVudCh0aGlzLnNjcm9sbGVyLnNjcm9sbEVsKTsKCX0sCgoJdW5yZW5kZXJTa2VsZXRvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5zY3JvbGxlci5kZXN0cm95KCk7IC8vIHdpbGwgcmVtb3ZlIHRoZSBHcmlkIHRvbwoJfSwKCglzZXRIZWlnaHQ6IGZ1bmN0aW9uKHRvdGFsSGVpZ2h0LCBpc0F1dG8pIHsKCQl0aGlzLnNjcm9sbGVyLnNldEhlaWdodCh0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0b3RhbEhlaWdodCkpOwoJfSwKCgljb21wdXRlU2Nyb2xsZXJIZWlnaHQ6IGZ1bmN0aW9uKHRvdGFsSGVpZ2h0KSB7CgkJcmV0dXJuIHRvdGFsSGVpZ2h0IC0KCQkJc3VidHJhY3RJbm5lckVsSGVpZ2h0KHRoaXMuZWwsIHRoaXMuc2Nyb2xsZXIuZWwpOyAvLyBldmVyeXRoaW5nIHRoYXQncyBOT1QgdGhlIHNjcm9sbGVyCgl9LAoKCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJdGhpcy5ncmlkLnJlbmRlckV2ZW50cyhldmVudHMpOwoJfSwKCgl1bnJlbmRlckV2ZW50czogZnVuY3Rpb24oKSB7CgkJdGhpcy5ncmlkLnVucmVuZGVyRXZlbnRzKCk7Cgl9LAoKCWlzRXZlbnRSZXNpemFibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIGZhbHNlOwoJfSwKCglpc0V2ZW50RHJhZ2dhYmxlOiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiBmYWxzZTsKCX0KCn0pOwoKLyoKUmVzcG9uc2libGUgZm9yIGV2ZW50IHJlbmRlcmluZyBhbmQgdXNlci1pbnRlcmFjdGlvbi4KSXRzICJlbCIgaXMgdGhlIGlubmVyLWNvbnRlbnQgb2YgdGhlIGFib3ZlIHZpZXcncyBzY3JvbGxlci4KKi8KdmFyIExpc3RWaWV3R3JpZCA9IEdyaWQuZXh0ZW5kKHsKCglzZWdTZWxlY3RvcjogJy5mYy1saXN0LWl0ZW0nLCAvLyB3aGljaCBlbGVtZW50cyBhY2NlcHQgZXZlbnQgYWN0aW9ucwoJaGFzRGF5SW50ZXJhY3Rpb25zOiBmYWxzZSwgLy8gbm8gZGF5IHNlbGVjdGlvbiBvciBkYXkgY2xpY2tpbmcKCgkvLyBzbGljZXMgYnkgZGF5CglzcGFuVG9TZWdzOiBmdW5jdGlvbihzcGFuKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGRheVN0YXJ0ID0gdmlldy5zdGFydC5jbG9uZSgpLnRpbWUoMCk7IC8vIHRpbWVkLCBzbyBzZWdzIGdldCB0aW1lcyEKCQl2YXIgZGF5SW5kZXggPSAwOwoJCXZhciBzZWc7CgkJdmFyIHNlZ3MgPSBbXTsKCgkJd2hpbGUgKGRheVN0YXJ0IDwgdmlldy5lbmQpIHsKCgkJCXNlZyA9IGludGVyc2VjdFJhbmdlcyhzcGFuLCB7CgkJCQlzdGFydDogZGF5U3RhcnQsCgkJCQllbmQ6IGRheVN0YXJ0LmNsb25lKCkuYWRkKDEsICdkYXknKQoJCQl9KTsKCgkJCWlmIChzZWcpIHsKCQkJCXNlZy5kYXlJbmRleCA9IGRheUluZGV4OwoJCQkJc2Vncy5wdXNoKHNlZyk7CgkJCX0KCgkJCWRheVN0YXJ0LmFkZCgxLCAnZGF5Jyk7CgkJCWRheUluZGV4Kys7CgoJCQkvLyBkZXRlY3Qgd2hlbiBzcGFuIHdvbid0IGdvIGZ1bGx5IGludG8gdGhlIG5leHQgZGF5LAoJCQkvLyBhbmQgbXV0YXRlIHRoZSBsYXRlc3Qgc2VnIHRvIHRoZSBiZSB0aGUgZW5kLgoJCQlpZiAoCgkJCQlzZWcgJiYgIXNlZy5pc0VuZCAmJiBzcGFuLmVuZC5oYXNUaW1lKCkgJiYKCQkJCXNwYW4uZW5kIDwgZGF5U3RhcnQuY2xvbmUoKS5hZGQodGhpcy52aWV3Lm5leHREYXlUaHJlc2hvbGQpCgkJCSkgewoJCQkJc2VnLmVuZCA9IHNwYW4uZW5kLmNsb25lKCk7CgkJCQlzZWcuaXNFbmQgPSB0cnVlOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCXJldHVybiBzZWdzOwoJfSwKCgkvLyBsaWtlICI0OjAwYW0iCgljb21wdXRlRXZlbnRUaW1lRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy52aWV3Lm9wdCgnbWVkaXVtVGltZUZvcm1hdCcpOwoJfSwKCgkvLyBmb3IgZXZlbnRzIHdpdGggYSB1cmwsIHRoZSB3aG9sZSA8dHI+IHNob3VsZCBiZSBjbGlja2FibGUsCgkvLyBidXQgaXQncyBpbXBvc3NpYmxlIHRvIHdyYXAgd2l0aCBhbiA8YT4gdGFnLiBzaW11bGF0ZSB0aGlzLgoJaGFuZGxlU2VnQ2xpY2s6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl2YXIgdXJsOwoKCQlHcmlkLnByb3RvdHlwZS5oYW5kbGVTZWdDbGljay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBzdXBlci4gbWlnaHQgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24KCgkJLy8gbm90IGNsaWNraW5nIG9uIG9yIHdpdGhpbiBhbiA8YT4gd2l0aCBhbiBocmVmCgkJaWYgKCEkKGV2LnRhcmdldCkuY2xvc2VzdCgnYVtocmVmXScpLmxlbmd0aCkgewoJCQl1cmwgPSBzZWcuZXZlbnQudXJsOwoJCQlpZiAodXJsICYmICFldi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgeyAvLyBqc0V2ZW50IG5vdCBjYW5jZWxsZWQgaW4gaGFuZGxlcgoJCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7IC8vIHNpbXVsYXRlIGxpbmsgY2xpY2sKCQkJfQoJCX0KCX0sCgoJLy8gcmV0dXJucyBsaXN0IG9mIGZvcmVncm91bmQgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCXJlbmRlckZnU2VnczogZnVuY3Rpb24oc2VncykgewoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MpOyAvLyBtaWdodCBmaWx0ZXIgYXdheSBoaWRkZW4gZXZlbnRzCgoJCWlmICghc2Vncy5sZW5ndGgpIHsKCQkJdGhpcy5yZW5kZXJFbXB0eU1lc3NhZ2UoKTsKCQl9CgkJZWxzZSB7CgkJCXRoaXMucmVuZGVyU2VnTGlzdChzZWdzKTsKCQl9CgoJCXJldHVybiBzZWdzOwoJfSwKCglyZW5kZXJFbXB0eU1lc3NhZ2U6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWwuaHRtbCgKCQkJJzxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHktd3JhcDIiPicgKyAvLyBUT0RPOiB0cnkgbGVzcyB3cmFwcwoJCQknPGRpdiBjbGFzcz0iZmMtbGlzdC1lbXB0eS13cmFwMSI+JyArCgkJCSc8ZGl2IGNsYXNzPSJmYy1saXN0LWVtcHR5Ij4nICsKCQkJCWh0bWxFc2NhcGUodGhpcy52aWV3Lm9wdCgnbm9FdmVudHNNZXNzYWdlJykpICsKCQkJJzwvZGl2PicgKwoJCQknPC9kaXY+JyArCgkJCSc8L2Rpdj4nCgkJKTsKCX0sCgoJLy8gcmVuZGVyIHRoZSBldmVudCBzZWdtZW50cyBpbiB0aGUgdmlldwoJcmVuZGVyU2VnTGlzdDogZnVuY3Rpb24oYWxsU2VncykgewoJCXZhciBzZWdzQnlEYXkgPSB0aGlzLmdyb3VwU2Vnc0J5RGF5KGFsbFNlZ3MpOyAvLyBzcGFyc2UgYXJyYXkKCQl2YXIgZGF5SW5kZXg7CgkJdmFyIGRheVNlZ3M7CgkJdmFyIGk7CgkJdmFyIHRhYmxlRWwgPSAkKCc8dGFibGUgY2xhc3M9ImZjLWxpc3QtdGFibGUiPjx0Ym9keS8+PC90YWJsZT4nKTsKCQl2YXIgdGJvZHlFbCA9IHRhYmxlRWwuZmluZCgndGJvZHknKTsKCgkJZm9yIChkYXlJbmRleCA9IDA7IGRheUluZGV4IDwgc2Vnc0J5RGF5Lmxlbmd0aDsgZGF5SW5kZXgrKykgewoJCQlkYXlTZWdzID0gc2Vnc0J5RGF5W2RheUluZGV4XTsKCQkJaWYgKGRheVNlZ3MpIHsgLy8gc3BhcnNlIGFycmF5LCBzbyBtaWdodCBiZSB1bmRlZmluZWQKCgkJCQkvLyBhcHBlbmQgYSBkYXkgaGVhZGVyCgkJCQl0Ym9keUVsLmFwcGVuZCh0aGlzLmRheUhlYWRlckh0bWwoCgkJCQkJdGhpcy52aWV3LnN0YXJ0LmNsb25lKCkuYWRkKGRheUluZGV4LCAnZGF5cycpCgkJCQkpKTsKCgkJCQl0aGlzLnNvcnRFdmVudFNlZ3MoZGF5U2Vncyk7CgoJCQkJZm9yIChpID0gMDsgaSA8IGRheVNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJCQl0Ym9keUVsLmFwcGVuZChkYXlTZWdzW2ldLmVsKTsgLy8gYXBwZW5kIGV2ZW50IHJvdwoJCQkJfQoJCQl9CgkJfQoKCQl0aGlzLmVsLmVtcHR5KCkuYXBwZW5kKHRhYmxlRWwpOwoJfSwKCgkvLyBSZXR1cm5zIGEgc3BhcnNlIGFycmF5IG9mIGFycmF5cywgc2VncyBncm91cGVkIGJ5IHRoZWlyIGRheUluZGV4Cglncm91cFNlZ3NCeURheTogZnVuY3Rpb24oc2VncykgewoJCXZhciBzZWdzQnlEYXkgPSBbXTsgLy8gc3BhcnNlIGFycmF5CgkJdmFyIGksIHNlZzsKCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCQkJKHNlZ3NCeURheVtzZWcuZGF5SW5kZXhdIHx8IChzZWdzQnlEYXlbc2VnLmRheUluZGV4XSA9IFtdKSkKCQkJCS5wdXNoKHNlZyk7CgkJfQoKCQlyZXR1cm4gc2Vnc0J5RGF5OwoJfSwKCgkvLyBnZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIHRoZSBkYXkgaGVhZGVycyB0aGF0IGxpdmUgYW1vbmdzdCB0aGUgZXZlbnQgcm93cwoJZGF5SGVhZGVySHRtbDogZnVuY3Rpb24oZGF5RGF0ZSkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBtYWluRm9ybWF0ID0gdmlldy5vcHQoJ2xpc3REYXlGb3JtYXQnKTsKCQl2YXIgYWx0Rm9ybWF0ID0gdmlldy5vcHQoJ2xpc3REYXlBbHRGb3JtYXQnKTsKCgkJcmV0dXJuICc8dHIgY2xhc3M9ImZjLWxpc3QtaGVhZGluZyIgZGF0YS1kYXRlPSInICsgZGF5RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSArICciPicgKwoJCQknPHRkIGNsYXNzPSInICsgdmlldy53aWRnZXRIZWFkZXJDbGFzcyArICciIGNvbHNwYW49IjMiPicgKwoJCQkJKG1haW5Gb3JtYXQgPwoJCQkJCXZpZXcuYnVpbGRHb3RvQW5jaG9ySHRtbCgKCQkJCQkJZGF5RGF0ZSwKCQkJCQkJeyAnY2xhc3MnOiAnZmMtbGlzdC1oZWFkaW5nLW1haW4nIH0sCgkJCQkJCWh0bWxFc2NhcGUoZGF5RGF0ZS5mb3JtYXQobWFpbkZvcm1hdCkpIC8vIGlubmVyIEhUTUwKCQkJCQkpIDoKCQkJCQknJykgKwoJCQkJKGFsdEZvcm1hdCA/CgkJCQkJdmlldy5idWlsZEdvdG9BbmNob3JIdG1sKAoJCQkJCQlkYXlEYXRlLAoJCQkJCQl7ICdjbGFzcyc6ICdmYy1saXN0LWhlYWRpbmctYWx0JyB9LAoJCQkJCQlodG1sRXNjYXBlKGRheURhdGUuZm9ybWF0KGFsdEZvcm1hdCkpIC8vIGlubmVyIEhUTUwKCQkJCQkpIDoKCQkJCQknJykgKwoJCQknPC90ZD4nICsKCQknPC90cj4nOwoJfSwKCgkvLyBnZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgc2luZ2xlIGV2ZW50IHJvdwoJZmdTZWdIdG1sOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgY2xhc3NlcyA9IFsgJ2ZjLWxpc3QtaXRlbScgXS5jb25jYXQodGhpcy5nZXRTZWdDdXN0b21DbGFzc2VzKHNlZykpOwoJCXZhciBiZ0NvbG9yID0gdGhpcy5nZXRTZWdCYWNrZ3JvdW5kQ29sb3Ioc2VnKTsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIHVybCA9IGV2ZW50LnVybDsKCQl2YXIgdGltZUh0bWw7CgoJCWlmIChldmVudC5hbGxEYXkpIHsKCQkJdGltZUh0bWwgPSB2aWV3LmdldEFsbERheUh0bWwoKTsKCQl9CgkJZWxzZSBpZiAodmlldy5pc011bHRpRGF5RXZlbnQoZXZlbnQpKSB7IC8vIGlmIHRoZSBldmVudCBhcHBlYXJzIHRvIHNwYW4gbW9yZSB0aGFuIG9uZSBkYXkKCQkJaWYgKHNlZy5pc1N0YXJ0IHx8IHNlZy5pc0VuZCkgeyAvLyBvdXRlciBzZWdtZW50IHRoYXQgcHJvYmFibHkgbGFzdHMgcGFydCBvZiB0aGUgZGF5CgkJCQl0aW1lSHRtbCA9IGh0bWxFc2NhcGUodGhpcy5nZXRFdmVudFRpbWVUZXh0KHNlZykpOwoJCQl9CgkJCWVsc2UgeyAvLyBpbm5lciBzZWdtZW50IHRoYXQgbGFzdHMgdGhlIHdob2xlIGRheQoJCQkJdGltZUh0bWwgPSB2aWV3LmdldEFsbERheUh0bWwoKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gRGlzcGxheSB0aGUgbm9ybWFsIHRpbWUgdGV4dCBmb3IgdGhlICpldmVudCdzKiB0aW1lcwoJCQl0aW1lSHRtbCA9IGh0bWxFc2NhcGUodGhpcy5nZXRFdmVudFRpbWVUZXh0KGV2ZW50KSk7CgkJfQoKCQlpZiAodXJsKSB7CgkJCWNsYXNzZXMucHVzaCgnZmMtaGFzLXVybCcpOwoJCX0KCgkJcmV0dXJuICc8dHIgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciPicgKwoJCQkodGhpcy5kaXNwbGF5RXZlbnRUaW1lID8KCQkJCSc8dGQgY2xhc3M9ImZjLWxpc3QtaXRlbS10aW1lICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPicgKwoJCQkJCSh0aW1lSHRtbCB8fCAnJykgKwoJCQkJJzwvdGQ+JyA6CgkJCQknJykgKwoJCQknPHRkIGNsYXNzPSJmYy1saXN0LWl0ZW0tbWFya2VyICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPicgKwoJCQkJJzxzcGFuIGNsYXNzPSJmYy1ldmVudC1kb3QiJyArCgkJCQkoYmdDb2xvciA/CgkJCQkJJyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjonICsgYmdDb2xvciArICciJyA6CgkJCQkJJycpICsKCQkJCSc+PC9zcGFuPicgKwoJCQknPC90ZD4nICsKCQkJJzx0ZCBjbGFzcz0iZmMtbGlzdC1pdGVtLXRpdGxlICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPicgKwoJCQkJJzxhJyArICh1cmwgPyAnIGhyZWY9IicgKyBodG1sRXNjYXBlKHVybCkgKyAnIicgOiAnJykgKyAnPicgKwoJCQkJCWh0bWxFc2NhcGUoc2VnLmV2ZW50LnRpdGxlIHx8ICcnKSArCgkJCQknPC9hPicgKwoJCQknPC90ZD4nICsKCQknPC90cj4nOwoJfQoKfSk7Cgo7OwoKZmNWaWV3cy5saXN0ID0gewoJJ2NsYXNzJzogTGlzdFZpZXcsCglidXR0b25UZXh0S2V5OiAnbGlzdCcsIC8vIHdoYXQgdG8gbG9va3VwIGluIGxvY2FsZSBmaWxlcwoJZGVmYXVsdHM6IHsKCQlidXR0b25UZXh0OiAnbGlzdCcsIC8vIHRleHQgdG8gZGlzcGxheSBmb3IgRW5nbGlzaAoJCWxpc3REYXlGb3JtYXQ6ICdMTCcsIC8vIGxpa2UgIkphbnVhcnkgMSwgMjAxNiIKCQlub0V2ZW50c01lc3NhZ2U6ICdObyBldmVudHMgdG8gZGlzcGxheScKCX0KfTsKCmZjVmlld3MubGlzdERheSA9IHsKCXR5cGU6ICdsaXN0JywKCWR1cmF0aW9uOiB7IGRheXM6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUZvcm1hdDogJ2RkZGQnIC8vIGRheS1vZi13ZWVrIGlzIGFsbCB3ZSBuZWVkLiBmdWxsIGRhdGUgaXMgcHJvYmFibHkgaW4gaGVhZGVyCgl9Cn07CgpmY1ZpZXdzLmxpc3RXZWVrID0gewoJdHlwZTogJ2xpc3QnLAoJZHVyYXRpb246IHsgd2Vla3M6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUZvcm1hdDogJ2RkZGQnLCAvLyBkYXktb2Ytd2VlayBpcyBtb3JlIGltcG9ydGFudAoJCWxpc3REYXlBbHRGb3JtYXQ6ICdMTCcKCX0KfTsKCmZjVmlld3MubGlzdE1vbnRoID0gewoJdHlwZTogJ2xpc3QnLAoJZHVyYXRpb246IHsgbW9udGg6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUFsdEZvcm1hdDogJ2RkZGQnIC8vIGRheS1vZi13ZWVrIGlzIG5pY2UtdG8taGF2ZQoJfQp9OwoKZmNWaWV3cy5saXN0WWVhciA9IHsKCXR5cGU6ICdsaXN0JywKCWR1cmF0aW9uOiB7IHllYXI6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUFsdEZvcm1hdDogJ2RkZGQnIC8vIGRheS1vZi13ZWVrIGlzIG5pY2UtdG8taGF2ZQoJfQp9OwoKOzsKDQpyZXR1cm4gRkM7IC8vIGV4cG9ydCBmb3IgTm9kZS9Db21tb25KUw0KfSk7
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEKICogRG9jcyAmIExpY2Vuc2U6IGh0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vCiAqIChjKSAyMDE2IEFkYW0gU2hhdwogKi8KIWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5IiwibW9tZW50Il0sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXQocmVxdWlyZSgianF1ZXJ5IikscmVxdWlyZSgibW9tZW50IikpOnQoalF1ZXJ5LG1vbWVudCl9KGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gcSh0LHF0KX1mdW5jdGlvbiBpKHQsZSl7ZS5sZWZ0JiZ0LmNzcyh7ImJvcmRlci1sZWZ0LXdpZHRoIjoxLCJtYXJnaW4tbGVmdCI6ZS5sZWZ0LTF9KSxlLnJpZ2h0JiZ0LmNzcyh7ImJvcmRlci1yaWdodC13aWR0aCI6MSwibWFyZ2luLXJpZ2h0IjplLnJpZ2h0LTF9KX1mdW5jdGlvbiByKHQpe3QuY3NzKHsibWFyZ2luLWxlZnQiOiIiLCJtYXJnaW4tcmlnaHQiOiIiLCJib3JkZXItbGVmdC13aWR0aCI6IiIsImJvcmRlci1yaWdodC13aWR0aCI6IiJ9KX1mdW5jdGlvbiBzKCl7dCgiYm9keSIpLmFkZENsYXNzKCJmYy1ub3QtYWxsb3dlZCIpfWZ1bmN0aW9uIG8oKXt0KCJib2R5IikucmVtb3ZlQ2xhc3MoImZjLW5vdC1hbGxvd2VkIil9ZnVuY3Rpb24gbChlLG4saSl7dmFyIHI9TWF0aC5mbG9vcihuL2UubGVuZ3RoKSxzPU1hdGguZmxvb3Iobi1yKihlLmxlbmd0aC0xKSksbz1bXSxsPVtdLHU9W10sZD0wO2EoZSksZS5lYWNoKGZ1bmN0aW9uKG4saSl7dmFyIGE9bj09PWUubGVuZ3RoLTE/czpyLGM9dChpKS5vdXRlckhlaWdodCghMCk7YzxhPyhvLnB1c2goaSksbC5wdXNoKGMpLHUucHVzaCh0KGkpLmhlaWdodCgpKSk6ZCs9Y30pLGkmJihuLT1kLHI9TWF0aC5mbG9vcihuL28ubGVuZ3RoKSxzPU1hdGguZmxvb3Iobi1yKihvLmxlbmd0aC0xKSkpLHQobykuZWFjaChmdW5jdGlvbihlLG4pe3ZhciBpPWU9PT1vLmxlbmd0aC0xP3M6cixhPWxbZV0sZD11W2VdLGM9aS0oYS1kKTthPGkmJnQobikuaGVpZ2h0KGMpfSl9ZnVuY3Rpb24gYSh0KXt0LmhlaWdodCgiIil9ZnVuY3Rpb24gdShlKXt2YXIgbj0wO3JldHVybiBlLmZpbmQoIj4gKiIpLmVhY2goZnVuY3Rpb24oZSxpKXt2YXIgcj10KGkpLm91dGVyV2lkdGgoKTtyPm4mJihuPXIpfSksbisrLGUud2lkdGgobiksbn1mdW5jdGlvbiBkKHQsZSl7dmFyIG4saT10LmFkZChlKTtyZXR1cm4gaS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbGVmdDotMX0pLG49dC5vdXRlckhlaWdodCgpLWUub3V0ZXJIZWlnaHQoKSxpLmNzcyh7cG9zaXRpb246IiIsbGVmdDoiIn0pLG59ZnVuY3Rpb24gYyhlKXt2YXIgbj1lLmNzcygicG9zaXRpb24iKSxpPWUucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7cmV0dXJuLyhhdXRvfHNjcm9sbCkvLnRlc3QoZS5jc3MoIm92ZXJmbG93IikrZS5jc3MoIm92ZXJmbG93LXkiKStlLmNzcygib3ZlcmZsb3cteCIpKX0pLmVxKDApO3JldHVybiJmaXhlZCIhPT1uJiZpLmxlbmd0aD9pOnQoZVswXS5vd25lckRvY3VtZW50fHxkb2N1bWVudCl9ZnVuY3Rpb24gaCh0LGUpe3ZhciBuPXQub2Zmc2V0KCksaT1uLmxlZnQtKGU/ZS5sZWZ0OjApLHI9bi50b3AtKGU/ZS50b3A6MCk7cmV0dXJue2xlZnQ6aSxyaWdodDppK3Qub3V0ZXJXaWR0aCgpLHRvcDpyLGJvdHRvbTpyK3Qub3V0ZXJIZWlnaHQoKX19ZnVuY3Rpb24gZih0LGUpe3ZhciBuPXQub2Zmc2V0KCksaT1wKHQpLHI9bi5sZWZ0K3kodCwiYm9yZGVyLWxlZnQtd2lkdGgiKStpLmxlZnQtKGU/ZS5sZWZ0OjApLHM9bi50b3AreSh0LCJib3JkZXItdG9wLXdpZHRoIikraS50b3AtKGU/ZS50b3A6MCk7cmV0dXJue2xlZnQ6cixyaWdodDpyK3RbMF0uY2xpZW50V2lkdGgsdG9wOnMsYm90dG9tOnMrdFswXS5jbGllbnRIZWlnaHR9fWZ1bmN0aW9uIGcodCxlKXt2YXIgbj10Lm9mZnNldCgpLGk9bi5sZWZ0K3kodCwiYm9yZGVyLWxlZnQtd2lkdGgiKSt5KHQsInBhZGRpbmctbGVmdCIpLShlP2UubGVmdDowKSxyPW4udG9wK3kodCwiYm9yZGVyLXRvcC13aWR0aCIpK3kodCwicGFkZGluZy10b3AiKS0oZT9lLnRvcDowKTtyZXR1cm57bGVmdDppLHJpZ2h0OmkrdC53aWR0aCgpLHRvcDpyLGJvdHRvbTpyK3QuaGVpZ2h0KCl9fWZ1bmN0aW9uIHAodCl7dmFyIGU9dC5pbm5lcldpZHRoKCktdFswXS5jbGllbnRXaWR0aCxuPXtsZWZ0OjAscmlnaHQ6MCx0b3A6MCxib3R0b206dC5pbm5lckhlaWdodCgpLXRbMF0uY2xpZW50SGVpZ2h0fTtyZXR1cm4gdigpJiYicnRsIj09dC5jc3MoImRpcmVjdGlvbiIpP24ubGVmdD1lOm4ucmlnaHQ9ZSxufWZ1bmN0aW9uIHYoKXtyZXR1cm4gbnVsbD09PVp0JiYoWnQ9bSgpKSxadH1mdW5jdGlvbiBtKCl7dmFyIGU9dCgiPGRpdj48ZGl2Lz48L2Rpdj4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOi0xZTMsbGVmdDowLGJvcmRlcjowLHBhZGRpbmc6MCxvdmVyZmxvdzoic2Nyb2xsIixkaXJlY3Rpb246InJ0bCJ9KS5hcHBlbmRUbygiYm9keSIpLG49ZS5jaGlsZHJlbigpLGk9bi5vZmZzZXQoKS5sZWZ0PmUub2Zmc2V0KCkubGVmdDtyZXR1cm4gZS5yZW1vdmUoKSxpfWZ1bmN0aW9uIHkodCxlKXtyZXR1cm4gcGFyc2VGbG9hdCh0LmNzcyhlKSl8fDB9ZnVuY3Rpb24gUyh0KXtyZXR1cm4gMT09dC53aGljaCYmIXQuY3RybEtleX1mdW5jdGlvbiB3KHQpe2lmKHZvaWQgMCE9PXQucGFnZVgpcmV0dXJuIHQucGFnZVg7dmFyIGU9dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7cmV0dXJuIGU/ZVswXS5wYWdlWDp2b2lkIDB9ZnVuY3Rpb24gRSh0KXtpZih2b2lkIDAhPT10LnBhZ2VZKXJldHVybiB0LnBhZ2VZO3ZhciBlPXQub3JpZ2luYWxFdmVudC50b3VjaGVzO3JldHVybiBlP2VbMF0ucGFnZVk6dm9pZCAwfWZ1bmN0aW9uIEQodCl7cmV0dXJuL150b3VjaC8udGVzdCh0LnR5cGUpfWZ1bmN0aW9uIGIodCl7dC5hZGRDbGFzcygiZmMtdW5zZWxlY3RhYmxlIikub24oInNlbGVjdHN0YXJ0IixDKX1mdW5jdGlvbiBDKHQpe3QucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBIKHQpe3JldHVybiEhd2luZG93LmFkZEV2ZW50TGlzdGVuZXImJih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0LCEwKSwhMCl9ZnVuY3Rpb24gVCh0KXtyZXR1cm4hIXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyJiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdCwhMCksITApfWZ1bmN0aW9uIHgodCxlKXt2YXIgbj17bGVmdDpNYXRoLm1heCh0LmxlZnQsZS5sZWZ0KSxyaWdodDpNYXRoLm1pbih0LnJpZ2h0LGUucmlnaHQpLHRvcDpNYXRoLm1heCh0LnRvcCxlLnRvcCksYm90dG9tOk1hdGgubWluKHQuYm90dG9tLGUuYm90dG9tKX07cmV0dXJuIG4ubGVmdDxuLnJpZ2h0JiZuLnRvcDxuLmJvdHRvbSYmbn1mdW5jdGlvbiBSKHQsZSl7cmV0dXJue2xlZnQ6TWF0aC5taW4oTWF0aC5tYXgodC5sZWZ0LGUubGVmdCksZS5yaWdodCksdG9wOk1hdGgubWluKE1hdGgubWF4KHQudG9wLGUudG9wKSxlLmJvdHRvbSl9fWZ1bmN0aW9uIEkodCl7cmV0dXJue2xlZnQ6KHQubGVmdCt0LnJpZ2h0KS8yLHRvcDoodC50b3ArdC5ib3R0b20pLzJ9fWZ1bmN0aW9uIGsodCxlKXtyZXR1cm57bGVmdDp0LmxlZnQtZS5sZWZ0LHRvcDp0LnRvcC1lLnRvcH19ZnVuY3Rpb24gTShlKXt2YXIgbixpLHI9W10scz1bXTtmb3IoInN0cmluZyI9PXR5cGVvZiBlP3M9ZS5zcGxpdCgvXHMqLFxzKi8pOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3M9W2VdOnQuaXNBcnJheShlKSYmKHM9ZSksbj0wO248cy5sZW5ndGg7bisrKWk9c1tuXSwic3RyaW5nIj09dHlwZW9mIGk/ci5wdXNoKCItIj09aS5jaGFyQXQoMCk/e2ZpZWxkOmkuc3Vic3RyaW5nKDEpLG9yZGVyOi0xfTp7ZmllbGQ6aSxvcmRlcjoxfSk6ImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucHVzaCh7ZnVuYzppfSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTCh0LGUsbil7dmFyIGkscjtmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKWlmKHI9Qih0LGUsbltpXSkpcmV0dXJuIHI7cmV0dXJuIDB9ZnVuY3Rpb24gQih0LGUsbil7cmV0dXJuIG4uZnVuYz9uLmZ1bmModCxlKTp6KHRbbi5maWVsZF0sZVtuLmZpZWxkXSkqKG4ub3JkZXJ8fDEpfWZ1bmN0aW9uIHooZSxuKXtyZXR1cm4gZXx8bj9udWxsPT1uPy0xOm51bGw9PWU/MToic3RyaW5nIj09PXQudHlwZShlKXx8InN0cmluZyI9PT10LnR5cGUobik/U3RyaW5nKGUpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKG4pKTplLW46MH1mdW5jdGlvbiBGKHQsZSl7dmFyIG4saSxyLHMsbz10LnN0YXJ0LGw9dC5lbmQsYT1lLnN0YXJ0LHU9ZS5lbmQ7aWYobD5hJiZvPHUpcmV0dXJuIG8+PWE/KG49by5jbG9uZSgpLHI9ITApOihuPWEuY2xvbmUoKSxyPSExKSxsPD11PyhpPWwuY2xvbmUoKSxzPSEwKTooaT11LmNsb25lKCkscz0hMSkse3N0YXJ0Om4sZW5kOmksaXNTdGFydDpyLGlzRW5kOnN9fWZ1bmN0aW9uIE4odCxuKXtyZXR1cm4gZS5kdXJhdGlvbih7ZGF5czp0LmNsb25lKCkuc3RyaXBUaW1lKCkuZGlmZihuLmNsb25lKCkuc3RyaXBUaW1lKCksImRheXMiKSxtczp0LnRpbWUoKS1uLnRpbWUoKX0pfWZ1bmN0aW9uIEcodCxuKXtyZXR1cm4gZS5kdXJhdGlvbih7ZGF5czp0LmNsb25lKCkuc3RyaXBUaW1lKCkuZGlmZihuLmNsb25lKCkuc3RyaXBUaW1lKCksImRheXMiKX0pfWZ1bmN0aW9uIEEodCxuLGkpe3JldHVybiBlLmR1cmF0aW9uKE1hdGgucm91bmQodC5kaWZmKG4saSwhMCkpLGkpfWZ1bmN0aW9uIE8odCxlKXt2YXIgbixpLHI7Zm9yKG49MDtuPFh0Lmxlbmd0aCYmKGk9WHRbbl0scj1WKGksdCxlKSwhKHI+PTEmJm90KHIpKSk7bisrKTtyZXR1cm4gaX1mdW5jdGlvbiBWKHQsbixpKXtyZXR1cm4gbnVsbCE9aT9pLmRpZmYobix0LCEwKTplLmlzRHVyYXRpb24obik/bi5hcyh0KTpuLmVuZC5kaWZmKG4uc3RhcnQsdCwhMCl9ZnVuY3Rpb24gUCh0LGUsbil7dmFyIGk7cmV0dXJuIFcobik/KGUtdCkvbjooaT1uLmFzTW9udGhzKCksTWF0aC5hYnMoaSk+PTEmJm90KGkpP2UuZGlmZih0LCJtb250aHMiLCEwKS9pOmUuZGlmZih0LCJkYXlzIiwhMCkvbi5hc0RheXMoKSl9ZnVuY3Rpb24gXyh0LGUpe3ZhciBuLGk7cmV0dXJuIFcodCl8fFcoZSk/dC9lOihuPXQuYXNNb250aHMoKSxpPWUuYXNNb250aHMoKSxNYXRoLmFicyhuKT49MSYmb3QobikmJk1hdGguYWJzKGkpPj0xJiZvdChpKT9uL2k6dC5hc0RheXMoKS9lLmFzRGF5cygpKX1mdW5jdGlvbiBZKHQsbil7dmFyIGk7cmV0dXJuIFcodCk/ZS5kdXJhdGlvbih0Km4pOihpPXQuYXNNb250aHMoKSxNYXRoLmFicyhpKT49MSYmb3QoaSk/ZS5kdXJhdGlvbih7bW9udGhzOmkqbn0pOmUuZHVyYXRpb24oe2RheXM6dC5hc0RheXMoKSpufSkpfWZ1bmN0aW9uIFcodCl7cmV0dXJuIEJvb2xlYW4odC5ob3VycygpfHx0Lm1pbnV0ZXMoKXx8dC5zZWNvbmRzKCl8fHQubWlsbGlzZWNvbmRzKCkpfWZ1bmN0aW9uIGoodCl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfHx0IGluc3RhbmNlb2YgRGF0ZX1mdW5jdGlvbiBVKHQpe3JldHVybi9eXGQrXDpcZCsoPzpcOlxkK1wuPyg/OlxkezN9KT8pPyQvLnRlc3QodCl9ZnVuY3Rpb24gcSh0LGUpe3ZhciBuLGkscixzLG8sbCxhPXt9O2lmKGUpZm9yKG49MDtuPGUubGVuZ3RoO24rKyl7Zm9yKGk9ZVtuXSxyPVtdLHM9dC5sZW5ndGgtMTtzPj0wO3MtLSlpZihvPXRbc11baV0sIm9iamVjdCI9PXR5cGVvZiBvKXIudW5zaGlmdChvKTtlbHNlIGlmKHZvaWQgMCE9PW8pe2FbaV09bzticmVha31yLmxlbmd0aCYmKGFbaV09cShyKSl9Zm9yKG49dC5sZW5ndGgtMTtuPj0wO24tLSl7bD10W25dO2ZvcihpIGluIGwpaSBpbiBhfHwoYVtpXT1sW2ldKX1yZXR1cm4gYX1mdW5jdGlvbiBaKHQpe3ZhciBlPWZ1bmN0aW9uKCl7fTtyZXR1cm4gZS5wcm90b3R5cGU9dCxuZXcgZX1mdW5jdGlvbiAkKHQsZSl7Zm9yKHZhciBuIGluIHQpWCh0LG4pJiYoZVtuXT10W25dKX1mdW5jdGlvbiBYKHQsZSl7cmV0dXJuIEt0LmNhbGwodCxlKX1mdW5jdGlvbiBLKGUpe3JldHVybi91bmRlZmluZWR8bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmcvLnRlc3QodC50eXBlKGUpKX1mdW5jdGlvbiBRKGUsbixpKXtpZih0LmlzRnVuY3Rpb24oZSkmJihlPVtlXSksZSl7dmFyIHIscztmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKXM9ZVtyXS5hcHBseShuLGkpfHxzO3JldHVybiBzfX1mdW5jdGlvbiBKKCl7Zm9yKHZhciB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylpZih2b2lkIDAhPT1hcmd1bWVudHNbdF0pcmV0dXJuIGFyZ3VtZW50c1t0XX1mdW5jdGlvbiB0dCh0KXtyZXR1cm4odCsiIikucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLycvZywiJiMwMzk7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC9cbi9nLCI8YnIgLz4iKX1mdW5jdGlvbiBldCh0KXtyZXR1cm4gdC5yZXBsYWNlKC8mLio/Oy9nLCIiKX1mdW5jdGlvbiBudChlKXt2YXIgbj1bXTtyZXR1cm4gdC5lYWNoKGUsZnVuY3Rpb24odCxlKXtudWxsIT1lJiZuLnB1c2godCsiOiIrZSl9KSxuLmpvaW4oIjsiKX1mdW5jdGlvbiBpdChlKXt2YXIgbj1bXTtyZXR1cm4gdC5lYWNoKGUsZnVuY3Rpb24odCxlKXtudWxsIT1lJiZuLnB1c2godCsnPSInK3R0KGUpKyciJyl9KSxuLmpvaW4oIiAiKX1mdW5jdGlvbiBydCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfWZ1bmN0aW9uIHN0KHQsZSl7cmV0dXJuIHQtZX1mdW5jdGlvbiBvdCh0KXtyZXR1cm4gdCUxPT09MH1mdW5jdGlvbiBsdCh0LGUpe3ZhciBuPXRbZV07cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBhdCh0LGUsbil7dmFyIGkscixzLG8sbCxhPWZ1bmN0aW9uKCl7dmFyIHU9K25ldyBEYXRlLW87dTxlP2k9c2V0VGltZW91dChhLGUtdSk6KGk9bnVsbCxufHwobD10LmFwcGx5KHMscikscz1yPW51bGwpKX07cmV0dXJuIGZ1bmN0aW9uKCl7cz10aGlzLHI9YXJndW1lbnRzLG89K25ldyBEYXRlO3ZhciB1PW4mJiFpO3JldHVybiBpfHwoaT1zZXRUaW1lb3V0KGEsZSkpLHUmJihsPXQuYXBwbHkocyxyKSxzPXI9bnVsbCksbH19ZnVuY3Rpb24gdXQoZSxuKXtyZXR1cm4gZSYmZS50aGVuJiYicmVzb2x2ZWQiIT09ZS5zdGF0ZSgpP24/ZS50aGVuKG4pOnZvaWQgMDp0LndoZW4obigpKX1mdW5jdGlvbiBkdChuLGkscil7dmFyIHMsbyxsLGEsdT1uWzBdLGQ9MT09bi5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgdTtyZXR1cm4gZS5pc01vbWVudCh1KXx8aih1KXx8dm9pZCAwPT09dT9hPWUuYXBwbHkobnVsbCxuKToocz0hMSxvPSExLGQ/UXQudGVzdCh1KT8odSs9Ii0wMSIsbj1bdV0scz0hMCxvPSEwKToobD1KdC5leGVjKHUpKSYmKHM9IWxbNV0sbz0hMCk6dC5pc0FycmF5KHUpJiYobz0hMCksYT1pfHxzP2UudXRjLmFwcGx5KGUsbik6ZS5hcHBseShudWxsLG4pLHM/KGEuX2FtYmlnVGltZT0hMCxhLl9hbWJpZ1pvbmU9ITApOnImJihvP2EuX2FtYmlnWm9uZT0hMDpkJiZhLnV0Y09mZnNldCh1KSkpLGEuX2Z1bGxDYWxlbmRhcj0hMCxhfWZ1bmN0aW9uIGN0KHQsZSl7cmV0dXJuIGVlLmZvcm1hdC5jYWxsKHQsZSl9ZnVuY3Rpb24gaHQodCxlKXtyZXR1cm4gZnQodCx5dChlKSl9ZnVuY3Rpb24gZnQodCxlKXt2YXIgbixpPSIiO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspaSs9Z3QodCxlW25dKTtyZXR1cm4gaX1mdW5jdGlvbiBndCh0LGUpe3ZhciBuLGk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2U6KG49ZS50b2tlbik/aWVbbl0/aWVbbl0odCk6Y3QodCxuKTplLm1heWJlJiYoaT1mdCh0LGUubWF5YmUpLGkubWF0Y2goL1sxLTldLykpP2k6IiJ9ZnVuY3Rpb24gcHQodCxlLG4saSxyKXt2YXIgcztyZXR1cm4gdD1qdC5tb21lbnQucGFyc2Vab25lKHQpLGU9anQubW9tZW50LnBhcnNlWm9uZShlKSxzPXQubG9jYWxlRGF0YSgpLG49cy5sb25nRGF0ZUZvcm1hdChuKXx8bixpPWl8fCIgLSAiLHZ0KHQsZSx5dChuKSxpLHIpfWZ1bmN0aW9uIHZ0KHQsZSxuLGkscil7dmFyIHMsbyxsLGEsdT10LmNsb25lKCkuc3RyaXBab25lKCksZD1lLmNsb25lKCkuc3RyaXBab25lKCksYz0iIixoPSIiLGY9IiIsZz0iIixwPSIiO2ZvcihvPTA7bzxuLmxlbmd0aCYmKHM9bXQodCxlLHUsZCxuW29dKSxzIT09ITEpO28rKyljKz1zO2ZvcihsPW4ubGVuZ3RoLTE7bD5vJiYocz1tdCh0LGUsdSxkLG5bbF0pLHMhPT0hMSk7bC0tKWg9cytoO2ZvcihhPW87YTw9bDthKyspZis9Z3QodCxuW2FdKSxnKz1ndChlLG5bYV0pO3JldHVybihmfHxnKSYmKHA9cj9nK2krZjpmK2krZyksYytwK2h9ZnVuY3Rpb24gbXQodCxlLG4saSxyKXt2YXIgcyxvO3JldHVybiJzdHJpbmciPT10eXBlb2Ygcj9yOiEhKChzPXIudG9rZW4pJiYobz1yZVtzLmNoYXJBdCgwKV0sbyYmbi5pc1NhbWUoaSxvKSkpJiZjdCh0LHMpfWZ1bmN0aW9uIHl0KHQpe3JldHVybiB0IGluIHNlP3NlW3RdOnNlW3RdPVN0KHQpfWZ1bmN0aW9uIFN0KHQpe2Zvcih2YXIgZSxuPVtdLGk9L1xbKFteXF1dKilcXXxcKChbXlwpXSopXCl8KExUU3xMVHwoXHcpXDQqbz8pfChbXlx3XFtcKF0rKS9nO2U9aS5leGVjKHQpOyllWzFdP24ucHVzaChlWzFdKTplWzJdP24ucHVzaCh7bWF5YmU6U3QoZVsyXSl9KTplWzNdP24ucHVzaCh7dG9rZW46ZVszXX0pOmVbNV0mJm4ucHVzaChlWzVdKTtyZXR1cm4gbn1mdW5jdGlvbiB3dCgpe31mdW5jdGlvbiBFdCh0LGUpe3ZhciBuO3JldHVybiBYKGUsImNvbnN0cnVjdG9yIikmJihuPWUuY29uc3RydWN0b3IpLCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1lLmNvbnN0cnVjdG9yPWZ1bmN0aW9uKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxuLnByb3RvdHlwZT1aKHQucHJvdG90eXBlKSwkKGUsbi5wcm90b3R5cGUpLCQodCxuKSxufWZ1bmN0aW9uIER0KHQsZSl7JChlLHQucHJvdG90eXBlKX1mdW5jdGlvbiBidCh0LGUpe3JldHVybiF0JiYhZXx8ISghdHx8IWUpJiYodC5jb21wb25lbnQ9PT1lLmNvbXBvbmVudCYmQ3QodCxlKSYmQ3QoZSx0KSl9ZnVuY3Rpb24gQ3QodCxlKXtmb3IodmFyIG4gaW4gdClpZighL14oY29tcG9uZW50fGxlZnR8cmlnaHR8dG9wfGJvdHRvbSkkLy50ZXN0KG4pJiZ0W25dIT09ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBIdCh0KXtyZXR1cm57c3RhcnQ6dC5zdGFydC5jbG9uZSgpLGVuZDp0LmVuZD90LmVuZC5jbG9uZSgpOm51bGwsYWxsRGF5OnQuYWxsRGF5fX1mdW5jdGlvbiBUdCh0KXt2YXIgZT1SdCh0KTtyZXR1cm4iYmFja2dyb3VuZCI9PT1lfHwiaW52ZXJzZS1iYWNrZ3JvdW5kIj09PWV9ZnVuY3Rpb24geHQodCl7cmV0dXJuImludmVyc2UtYmFja2dyb3VuZCI9PT1SdCh0KX1mdW5jdGlvbiBSdCh0KXtyZXR1cm4gSigodC5zb3VyY2V8fHt9KS5yZW5kZXJpbmcsdC5yZW5kZXJpbmcpfWZ1bmN0aW9uIEl0KHQpe3ZhciBlLG4saT17fTtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKW49dFtlXSwoaVtuLl9pZF18fChpW24uX2lkXT1bXSkpLnB1c2gobik7cmV0dXJuIGl9ZnVuY3Rpb24ga3QodCxlKXtyZXR1cm4gdC5zdGFydC1lLnN0YXJ0fWZ1bmN0aW9uIE10KG4pe3ZhciBpLHIscyxvLGw9anQuZGF0YUF0dHJQcmVmaXg7cmV0dXJuIGwmJihsKz0iLSIpLGk9bi5kYXRhKGwrImV2ZW50Iil8fG51bGwsaSYmKGk9Im9iamVjdCI9PXR5cGVvZiBpP3QuZXh0ZW5kKHt9LGkpOnt9LHI9aS5zdGFydCxudWxsPT1yJiYocj1pLnRpbWUpLHM9aS5kdXJhdGlvbixvPWkuc3RpY2ssZGVsZXRlIGkuc3RhcnQsZGVsZXRlIGkudGltZSxkZWxldGUgaS5kdXJhdGlvbixkZWxldGUgaS5zdGljayksbnVsbD09ciYmKHI9bi5kYXRhKGwrInN0YXJ0IikpLG51bGw9PXImJihyPW4uZGF0YShsKyJ0aW1lIikpLG51bGw9PXMmJihzPW4uZGF0YShsKyJkdXJhdGlvbiIpKSxudWxsPT1vJiYobz1uLmRhdGEobCsic3RpY2siKSkscj1udWxsIT1yP2UuZHVyYXRpb24ocik6bnVsbCxzPW51bGwhPXM/ZS5kdXJhdGlvbihzKTpudWxsLG89Qm9vbGVhbihvKSx7ZXZlbnRQcm9wczppLHN0YXJ0VGltZTpyLGR1cmF0aW9uOnMsc3RpY2s6b319ZnVuY3Rpb24gTHQodCxlKXt2YXIgbixpO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspaWYoaT1lW25dLGkubGVmdENvbDw9dC5yaWdodENvbCYmaS5yaWdodENvbD49dC5sZWZ0Q29sKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIEJ0KHQsZSl7cmV0dXJuIHQubGVmdENvbC1lLmxlZnRDb2x9ZnVuY3Rpb24genQodCl7dmFyIGUsbixpLHI9W107Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl7Zm9yKG49dFtlXSxpPTA7aTxyLmxlbmd0aCYmR3QobixyW2ldKS5sZW5ndGg7aSsrKTtuLmxldmVsPWksKHJbaV18fChyW2ldPVtdKSkucHVzaChuKX1yZXR1cm4gcn1mdW5jdGlvbiBGdCh0KXt2YXIgZSxuLGkscixzO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspZm9yKG49dFtlXSxpPTA7aTxuLmxlbmd0aDtpKyspZm9yKHI9bltpXSxyLmZvcndhcmRTZWdzPVtdLHM9ZSsxO3M8dC5sZW5ndGg7cysrKUd0KHIsdFtzXSxyLmZvcndhcmRTZWdzKX1mdW5jdGlvbiBOdCh0KXt2YXIgZSxuLGk9dC5mb3J3YXJkU2VncyxyPTA7aWYodm9pZCAwPT09dC5mb3J3YXJkUHJlc3N1cmUpe2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspbj1pW2VdLE50KG4pLHI9TWF0aC5tYXgociwxK24uZm9yd2FyZFByZXNzdXJlKTt0LmZvcndhcmRQcmVzc3VyZT1yfX1mdW5jdGlvbiBHdCh0LGUsbil7bj1ufHxbXTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKylBdCh0LGVbaV0pJiZuLnB1c2goZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gQXQodCxlKXtyZXR1cm4gdC5ib3R0b20+ZS50b3AmJnQudG9wPGUuYm90dG9tfWZ1bmN0aW9uIE90KG4saSl7ZnVuY3Rpb24gcih0KXt0Ll9sb2NhbGU9VX1mdW5jdGlvbiBzKCl7JD91KCkmJihnKCksZCgpKTpvKCl9ZnVuY3Rpb24gbygpe24uYWRkQ2xhc3MoImZjIiksbi5vbigiY2xpY2suZmMiLCJhW2RhdGEtZ290b10iLGZ1bmN0aW9uKGUpe3ZhciBuPXQodGhpcyksaT1uLmRhdGEoImdvdG8iKSxyPWoubW9tZW50KGkuZGF0ZSkscz1pLnR5cGUsbz1LLm9wdCgibmF2TGluayIrcnQocykrIkNsaWNrIik7ImZ1bmN0aW9uIj09dHlwZW9mIG8/byhyLGUpOigic3RyaW5nIj09dHlwZW9mIG8mJihzPW8pLE4ocixzKSl9KSxqLmJpbmRPcHRpb24oInRoZW1lIixmdW5jdGlvbih0KXtYPXQ/InVpIjoiZmMiLG4udG9nZ2xlQ2xhc3MoInVpLXdpZGdldCIsdCksbi50b2dnbGVDbGFzcygiZmMtdW50aGVtZWQiLCF0KX0pLGouYmluZE9wdGlvbnMoWyJpc1JUTCIsImxvY2FsZSJdLGZ1bmN0aW9uKHQpe24udG9nZ2xlQ2xhc3MoImZjLWx0ciIsIXQpLG4udG9nZ2xlQ2xhc3MoImZjLXJ0bCIsdCl9KSwkPXQoIjxkaXYgY2xhc3M9J2ZjLXZpZXctY29udGFpbmVyJy8+IikucHJlcGVuZFRvKG4pLHE9ai5oZWFkZXI9bmV3IF90KGopLGwoKSxkKGoub3B0aW9ucy5kZWZhdWx0Vmlldyksai5vcHRpb25zLmhhbmRsZVdpbmRvd1Jlc2l6ZSYmKEo9YXQobSxqLm9wdGlvbnMud2luZG93UmVzaXplRGVsYXkpLHQod2luZG93KS5yZXNpemUoSikpfWZ1bmN0aW9uIGwoKXtxLnJlbmRlcigpLHEuZWwmJm4ucHJlcGVuZChxLmVsKX1mdW5jdGlvbiBhKCl7SyYmSy5yZW1vdmVFbGVtZW50KCkscS5yZW1vdmVFbGVtZW50KCksJC5yZW1vdmUoKSxuLnJlbW92ZUNsYXNzKCJmYyBmYy1sdHIgZmMtcnRsIGZjLXVudGhlbWVkIHVpLXdpZGdldCIpLG4ub2ZmKCIuZmMiKSxKJiZ0KHdpbmRvdykudW5iaW5kKCJyZXNpemUiLEopfWZ1bmN0aW9uIHUoKXtyZXR1cm4gbi5pcygiOnZpc2libGUiKX1mdW5jdGlvbiBkKGUsbil7bHQrKyxLJiZlJiZLLnR5cGUhPT1lJiYoQSgpLGMoKSksIUsmJmUmJihLPWoudmlldz1vdFtlXXx8KG90W2VdPWouaW5zdGFudGlhdGVWaWV3KGUpKSxLLnNldEVsZW1lbnQodCgiPGRpdiBjbGFzcz0nZmMtdmlldyBmYy0iK2UrIi12aWV3JyAvPiIpLmFwcGVuZFRvKCQpKSxxLmFjdGl2YXRlQnV0dG9uKGUpKSxLJiYodHQ9Sy5tYXNzYWdlQ3VycmVudERhdGUodHQpLEsuZGlzcGxheWluZyYmdHQ+PUsuaW50ZXJ2YWxTdGFydCYmdHQ8Sy5pbnRlcnZhbEVuZHx8dSgpJiYoSy5kaXNwbGF5KHR0LG4pLE8oKSxIKCksVCgpLEUoKSkpLE8oKSxsdC0tfWZ1bmN0aW9uIGMoKXtxLmRlYWN0aXZhdGVCdXR0b24oSy50eXBlKSxLLnJlbW92ZUVsZW1lbnQoKSxLPWoudmlldz1udWxsfWZ1bmN0aW9uIGgoKXtsdCsrLEEoKTt2YXIgdD1LLnR5cGUsZT1LLnF1ZXJ5U2Nyb2xsKCk7YygpLGQodCxlKSxPKCksbHQtLX1mdW5jdGlvbiBmKHQpe2lmKHUoKSlyZXR1cm4gdCYmcCgpLGx0KyssSy51cGRhdGVTaXplKCEwKSxsdC0tLCEwfWZ1bmN0aW9uIGcoKXt1KCkmJnAoKX1mdW5jdGlvbiBwKCl7dmFyIHQ9ai5vcHRpb25zLmNvbnRlbnRIZWlnaHQsZT1qLm9wdGlvbnMuaGVpZ2h0O1E9Im51bWJlciI9PXR5cGVvZiB0P3Q6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOiJudW1iZXIiPT10eXBlb2YgZT9lLXYoKToiZnVuY3Rpb24iPT10eXBlb2YgZT9lKCktdigpOiJwYXJlbnQiPT09ZT9uLnBhcmVudCgpLmhlaWdodCgpLXYoKTpNYXRoLnJvdW5kKCQud2lkdGgoKS9NYXRoLm1heChqLm9wdGlvbnMuYXNwZWN0UmF0aW8sLjUpKX1mdW5jdGlvbiB2KCl7cmV0dXJuIHEuZWw/cS5lbC5vdXRlckhlaWdodCghMCk6MH1mdW5jdGlvbiBtKHQpeyFsdCYmdC50YXJnZXQ9PT13aW5kb3cmJksuc3RhcnQmJmYoITApJiZLLnRyaWdnZXIoIndpbmRvd1Jlc2l6ZSIsc3QpfWZ1bmN0aW9uIHkoKXtEKCl9ZnVuY3Rpb24gUyh0KXtpdChqLmdldEV2ZW50U291cmNlc0J5TWF0Y2hBcnJheSh0KSl9ZnVuY3Rpb24gdygpe3UoKSYmKEEoKSxLLmRpc3BsYXlFdmVudHModXQpLE8oKSl9ZnVuY3Rpb24gRSgpeyFqLm9wdGlvbnMubGF6eUZldGNoaW5nfHxldChLLnN0YXJ0LEsuZW5kKT9EKCk6dygpfWZ1bmN0aW9uIEQoKXtudChLLnN0YXJ0LEsuZW5kKX1mdW5jdGlvbiBiKHQpe3V0PXQsdygpfWZ1bmN0aW9uIEMoKXt3KCl9ZnVuY3Rpb24gSCgpe3EudXBkYXRlVGl0bGUoSy50aXRsZSl9ZnVuY3Rpb24gVCgpe3ZhciB0PWouZ2V0Tm93KCk7dD49Sy5pbnRlcnZhbFN0YXJ0JiZ0PEsuaW50ZXJ2YWxFbmQ/cS5kaXNhYmxlQnV0dG9uKCJ0b2RheSIpOnEuZW5hYmxlQnV0dG9uKCJ0b2RheSIpfWZ1bmN0aW9uIHgodCxlKXtLLnNlbGVjdChqLmJ1aWxkU2VsZWN0U3Bhbi5hcHBseShqLGFyZ3VtZW50cykpfWZ1bmN0aW9uIFIoKXtLJiZLLnVuc2VsZWN0KCl9ZnVuY3Rpb24gSSgpe3R0PUsuY29tcHV0ZVByZXZEYXRlKHR0KSxkKCl9ZnVuY3Rpb24gaygpe3R0PUsuY29tcHV0ZU5leHREYXRlKHR0KSxkKCl9ZnVuY3Rpb24gTSgpe3R0LmFkZCgtMSwieWVhcnMiKSxkKCl9ZnVuY3Rpb24gTCgpe3R0LmFkZCgxLCJ5ZWFycyIpLGQoKX1mdW5jdGlvbiBCKCl7dHQ9ai5nZXROb3coKSxkKCl9ZnVuY3Rpb24geih0KXt0dD1qLm1vbWVudCh0KS5zdHJpcFpvbmUoKSxkKCl9ZnVuY3Rpb24gRih0KXt0dC5hZGQoZS5kdXJhdGlvbih0KSksZCgpfWZ1bmN0aW9uIE4odCxlKXt2YXIgbjtlPWV8fCJkYXkiLG49ai5nZXRWaWV3U3BlYyhlKXx8ai5nZXRVbml0Vmlld1NwZWMoZSksdHQ9dC5jbG9uZSgpLGQobj9uLnR5cGU6bnVsbCl9ZnVuY3Rpb24gRygpe3JldHVybiBqLmFwcGx5VGltZXpvbmUodHQpfWZ1bmN0aW9uIEEoKXskLmNzcyh7d2lkdGg6IjEwMCUiLGhlaWdodDokLmhlaWdodCgpLG92ZXJmbG93OiJoaWRkZW4ifSl9ZnVuY3Rpb24gTygpeyQuY3NzKHt3aWR0aDoiIixoZWlnaHQ6IiIsb3ZlcmZsb3c6IiJ9KX1mdW5jdGlvbiBWKCl7cmV0dXJuIGp9ZnVuY3Rpb24gUCgpe3JldHVybiBLfWZ1bmN0aW9uIF8odCxlKXt2YXIgbjtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKHZvaWQgMD09PWUpcmV0dXJuIGoub3B0aW9uc1t0XTtuPXt9LG5bdF09ZSxZKG4pfWVsc2Uib2JqZWN0Ij09dHlwZW9mIHQmJlkodCl9ZnVuY3Rpb24gWSh0KXt2YXIgZSxuPTA7Zm9yKGUgaW4gdClqLmR5bmFtaWNPdmVycmlkZXNbZV09dFtlXTtqLnZpZXdTcGVjQ2FjaGU9e30sai5wb3B1bGF0ZU9wdGlvbnNIYXNoKCk7Zm9yKGUgaW4gdClqLnRyaWdnZXJPcHRpb25IYW5kbGVycyhlKSxuKys7aWYoMT09PW4pe2lmKCJoZWlnaHQiPT09ZXx8ImNvbnRlbnRIZWlnaHQiPT09ZXx8ImFzcGVjdFJhdGlvIj09PWUpcmV0dXJuIHZvaWQgZighMCk7aWYoImRlZmF1bHREYXRlIj09PWUpcmV0dXJuO2lmKCJidXNpbmVzc0hvdXJzIj09PWUpcmV0dXJuIHZvaWQoSyYmKEsudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCksSy5yZW5kZXJCdXNpbmVzc0hvdXJzKCkpKTtpZigidGltZXpvbmUiPT09ZSlyZXR1cm4gai5yZXpvbmVBcnJheUV2ZW50U291cmNlcygpLHZvaWQgeSgpfWwoKSxvdD17fSxoKCl9ZnVuY3Rpb24gVyh0LGUpe3ZhciBuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTtpZihlPWV8fHN0LHRoaXMudHJpZ2dlcldpdGgodCxlLG4pLGoub3B0aW9uc1t0XSlyZXR1cm4gai5vcHRpb25zW3RdLmFwcGx5KGUsbil9dmFyIGo9dGhpcztqLnJlbmRlcj1zLGouZGVzdHJveT1hLGoucmVmZXRjaEV2ZW50cz15LGoucmVmZXRjaEV2ZW50U291cmNlcz1TLGoucmVwb3J0RXZlbnRzPWIsai5yZXBvcnRFdmVudENoYW5nZT1DLGoucmVyZW5kZXJFdmVudHM9dyxqLmNoYW5nZVZpZXc9ZCxqLnNlbGVjdD14LGoudW5zZWxlY3Q9UixqLnByZXY9SSxqLm5leHQ9ayxqLnByZXZZZWFyPU0sai5uZXh0WWVhcj1MLGoudG9kYXk9QixqLmdvdG9EYXRlPXosai5pbmNyZW1lbnREYXRlPUYsai56b29tVG89TixqLmdldERhdGU9RyxqLmdldENhbGVuZGFyPVYsai5nZXRWaWV3PVAsai5vcHRpb249XyxqLnRyaWdnZXI9VyxqLmR5bmFtaWNPdmVycmlkZXM9e30sai52aWV3U3BlY0NhY2hlPXt9LGoub3B0aW9uSGFuZGxlcnM9e30sai5vdmVycmlkZXM9dC5leHRlbmQoe30saSksai5wb3B1bGF0ZU9wdGlvbnNIYXNoKCk7dmFyIFU7ai5iaW5kT3B0aW9ucyhbImxvY2FsZSIsIm1vbnRoTmFtZXMiLCJtb250aE5hbWVzU2hvcnQiLCJkYXlOYW1lcyIsImRheU5hbWVzU2hvcnQiLCJmaXJzdERheSIsIndlZWtOdW1iZXJDYWxjdWxhdGlvbiJdLGZ1bmN0aW9uKHQsZSxuLGkscyxvLGwpe2lmKCJpc28iPT09bCYmKGw9IklTTyIpLFU9WihQdCh0KSksZSYmKFUuX21vbnRocz1lKSxuJiYoVS5fbW9udGhzU2hvcnQ9biksaSYmKFUuX3dlZWtkYXlzPWkpLHMmJihVLl93ZWVrZGF5c1Nob3J0PXMpLG51bGw9PW8mJiJJU08iPT09bCYmKG89MSksbnVsbCE9byl7dmFyIGE9WihVLl93ZWVrKTthLmRvdz1vLFUuX3dlZWs9YX0iSVNPIiE9PWwmJiJsb2NhbCIhPT1sJiYiZnVuY3Rpb24iIT10eXBlb2YgbHx8KFUuX2Z1bGxDYWxlbmRhcl93ZWVrQ2FsYz1sKSx0dCYmcih0dCl9KSxqLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uPWUuZHVyYXRpb24oai5vcHRpb25zLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uKSxqLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb249ZS5kdXJhdGlvbihqLm9wdGlvbnMuZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbiksai5tb21lbnQ9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4ibG9jYWwiPT09ai5vcHRpb25zLnRpbWV6b25lPyh0PWp0Lm1vbWVudC5hcHBseShudWxsLGFyZ3VtZW50cyksdC5oYXNUaW1lKCkmJnQubG9jYWwoKSk6dD0iVVRDIj09PWoub3B0aW9ucy50aW1lem9uZT9qdC5tb21lbnQudXRjLmFwcGx5KG51bGwsYXJndW1lbnRzKTpqdC5tb21lbnQucGFyc2Vab25lLmFwcGx5KG51bGwsYXJndW1lbnRzKSxyKHQpLHR9LGoubG9jYWxpemVNb21lbnQ9cixqLmdldElzQW1iaWdUaW1lem9uZT1mdW5jdGlvbigpe3JldHVybiJsb2NhbCIhPT1qLm9wdGlvbnMudGltZXpvbmUmJiJVVEMiIT09ai5vcHRpb25zLnRpbWV6b25lfSxqLmFwcGx5VGltZXpvbmU9ZnVuY3Rpb24odCl7aWYoIXQuaGFzVGltZSgpKXJldHVybiB0LmNsb25lKCk7dmFyIGUsbj1qLm1vbWVudCh0LnRvQXJyYXkoKSksaT10LnRpbWUoKS1uLnRpbWUoKTtyZXR1cm4gaSYmKGU9bi5jbG9uZSgpLmFkZChpKSx0LnRpbWUoKS1lLnRpbWUoKT09PTAmJihuPWUpKSxufSxqLmdldE5vdz1mdW5jdGlvbigpe3ZhciB0PWoub3B0aW9ucy5ub3c7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoKSksai5tb21lbnQodCkuc3RyaXBab25lKCl9LGouZ2V0RXZlbnRFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZW5kP3QuZW5kLmNsb25lKCk6ai5nZXREZWZhdWx0RXZlbnRFbmQodC5hbGxEYXksdC5zdGFydCl9LGouZ2V0RGVmYXVsdEV2ZW50RW5kPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jbG9uZSgpO3JldHVybiB0P24uc3RyaXBUaW1lKCkuYWRkKGouZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pOm4uYWRkKGouZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbiksai5nZXRJc0FtYmlnVGltZXpvbmUoKSYmbi5zdHJpcFpvbmUoKSxufSxqLmh1bWFuaXplRHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHQubG9jYWxlKGoub3B0aW9ucy5sb2NhbGUpLmh1bWFuaXplKCl9LFl0LmNhbGwoaik7dmFyIHEsJCxYLEssUSxKLHR0LGV0PWouaXNGZXRjaE5lZWRlZCxudD1qLmZldGNoRXZlbnRzLGl0PWouZmV0Y2hFdmVudFNvdXJjZXMsc3Q9blswXSxvdD17fSxsdD0wLHV0PVtdO3R0PW51bGwhPWoub3B0aW9ucy5kZWZhdWx0RGF0ZT9qLm1vbWVudChqLm9wdGlvbnMuZGVmYXVsdERhdGUpLnN0cmlwWm9uZSgpOmouZ2V0Tm93KCksai5nZXRTdWdnZXN0ZWRWaWV3SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PVEmJmcoKSxRfSxqLmlzSGVpZ2h0QXV0bz1mdW5jdGlvbigpe3JldHVybiJhdXRvIj09PWoub3B0aW9ucy5jb250ZW50SGVpZ2h0fHwiYXV0byI9PT1qLm9wdGlvbnMuaGVpZ2h0fSxqLmZyZWV6ZUNvbnRlbnRIZWlnaHQ9QSxqLnVuZnJlZXplQ29udGVudEhlaWdodD1PLGouaW5pdGlhbGl6ZSgpfWZ1bmN0aW9uIFZ0KGUpe3QuZWFjaChIZSxmdW5jdGlvbih0LG4pe251bGw9PWVbdF0mJihlW3RdPW4oZSkpfSl9ZnVuY3Rpb24gUHQodCl7cmV0dXJuIGUubG9jYWxlRGF0YSh0KXx8ZS5sb2NhbGVEYXRhKCJlbiIpfWZ1bmN0aW9uIF90KGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1lLm9wdGlvbnMscz1uLmhlYWRlcjtmPW4udGhlbWU/InVpIjoiZmMiLHM/KGg/aC5lbXB0eSgpOmg9dGhpcy5lbD10KCI8ZGl2IGNsYXNzPSdmYy10b29sYmFyJy8+IiksaC5hcHBlbmQocigibGVmdCIpKS5hcHBlbmQocigicmlnaHQiKSkuYXBwZW5kKHIoImNlbnRlciIpKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImZjLWNsZWFyIi8+JykpOmkoKX1mdW5jdGlvbiBpKCl7aCYmKGgucmVtb3ZlKCksaD1jLmVsPW51bGwpfWZ1bmN0aW9uIHIobil7dmFyIGk9dCgnPGRpdiBjbGFzcz0iZmMtJytuKyciLz4nKSxyPWUub3B0aW9ucyxzPXIuaGVhZGVyW25dO3JldHVybiBzJiZ0LmVhY2gocy5zcGxpdCgiICIpLGZ1bmN0aW9uKG4pe3ZhciBzLG89dCgpLGw9ITA7dC5lYWNoKHRoaXMuc3BsaXQoIiwiKSxmdW5jdGlvbihuLGkpe3ZhciBzLGEsdSxkLGMsaCxwLHYsbSx5OyJ0aXRsZSI9PWk/KG89by5hZGQodCgiPGgyPiZuYnNwOzwvaDI+IikpLGw9ITEpOigocz0oci5jdXN0b21CdXR0b25zfHx7fSlbaV0pPyh1PWZ1bmN0aW9uKHQpe3MuY2xpY2smJnMuY2xpY2suY2FsbCh5WzBdLHQpfSxkPSIiLGM9cy50ZXh0KTooYT1lLmdldFZpZXdTcGVjKGkpKT8odT1mdW5jdGlvbigpe2UuY2hhbmdlVmlldyhpKX0sZy5wdXNoKGkpLGQ9YS5idXR0b25UZXh0T3ZlcnJpZGUsYz1hLmJ1dHRvblRleHREZWZhdWx0KTplW2ldJiYodT1mdW5jdGlvbigpe2VbaV0oKX0sZD0oZS5vdmVycmlkZXMuYnV0dG9uVGV4dHx8e30pW2ldLGM9ci5idXR0b25UZXh0W2ldKSx1JiYoaD1zP3MudGhlbWVJY29uOnIudGhlbWVCdXR0b25JY29uc1tpXSxwPXM/cy5pY29uOnIuYnV0dG9uSWNvbnNbaV0sdj1kP3R0KGQpOmgmJnIudGhlbWU/IjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tIitoKyInPjwvc3Bhbj4iOnAmJiFyLnRoZW1lPyI8c3BhbiBjbGFzcz0nZmMtaWNvbiBmYy1pY29uLSIrcCsiJz48L3NwYW4+Ijp0dChjKSxtPVsiZmMtIitpKyItYnV0dG9uIixmKyItYnV0dG9uIixmKyItc3RhdGUtZGVmYXVsdCJdLHk9dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSInK20uam9pbigiICIpKyciPicrdisiPC9idXR0b24+IikuY2xpY2soZnVuY3Rpb24odCl7eS5oYXNDbGFzcyhmKyItc3RhdGUtZGlzYWJsZWQiKXx8KHUodCksKHkuaGFzQ2xhc3MoZisiLXN0YXRlLWFjdGl2ZSIpfHx5Lmhhc0NsYXNzKGYrIi1zdGF0ZS1kaXNhYmxlZCIpKSYmeS5yZW1vdmVDbGFzcyhmKyItc3RhdGUtaG92ZXIiKSl9KS5tb3VzZWRvd24oZnVuY3Rpb24oKXt5Lm5vdCgiLiIrZisiLXN0YXRlLWFjdGl2ZSIpLm5vdCgiLiIrZisiLXN0YXRlLWRpc2FibGVkIikuYWRkQ2xhc3MoZisiLXN0YXRlLWRvd24iKX0pLm1vdXNldXAoZnVuY3Rpb24oKXt5LnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1kb3duIil9KS5ob3ZlcihmdW5jdGlvbigpe3kubm90KCIuIitmKyItc3RhdGUtYWN0aXZlIikubm90KCIuIitmKyItc3RhdGUtZGlzYWJsZWQiKS5hZGRDbGFzcyhmKyItc3RhdGUtaG92ZXIiKX0sZnVuY3Rpb24oKXt5LnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1ob3ZlciIpLnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1kb3duIil9KSxvPW8uYWRkKHkpKSl9KSxsJiZvLmZpcnN0KCkuYWRkQ2xhc3MoZisiLWNvcm5lci1sZWZ0IikuZW5kKCkubGFzdCgpLmFkZENsYXNzKGYrIi1jb3JuZXItcmlnaHQiKS5lbmQoKSxvLmxlbmd0aD4xPyhzPXQoIjxkaXYvPiIpLGwmJnMuYWRkQ2xhc3MoImZjLWJ1dHRvbi1ncm91cCIpLHMuYXBwZW5kKG8pLGkuYXBwZW5kKHMpKTppLmFwcGVuZChvKX0pLGl9ZnVuY3Rpb24gcyh0KXtoJiZoLmZpbmQoImgyIikudGV4dCh0KX1mdW5jdGlvbiBvKHQpe2gmJmguZmluZCgiLmZjLSIrdCsiLWJ1dHRvbiIpLmFkZENsYXNzKGYrIi1zdGF0ZS1hY3RpdmUiKX1mdW5jdGlvbiBsKHQpe2gmJmguZmluZCgiLmZjLSIrdCsiLWJ1dHRvbiIpLnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1hY3RpdmUiKX1mdW5jdGlvbiBhKHQpe2gmJmguZmluZCgiLmZjLSIrdCsiLWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwhMCkuYWRkQ2xhc3MoZisiLXN0YXRlLWRpc2FibGVkIil9ZnVuY3Rpb24gdSh0KXtoJiZoLmZpbmQoIi5mYy0iK3QrIi1idXR0b24iKS5wcm9wKCJkaXNhYmxlZCIsITEpLnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1kaXNhYmxlZCIpfWZ1bmN0aW9uIGQoKXtyZXR1cm4gZ312YXIgYz10aGlzO2MucmVuZGVyPW4sYy5yZW1vdmVFbGVtZW50PWksYy51cGRhdGVUaXRsZT1zLGMuYWN0aXZhdGVCdXR0b249byxjLmRlYWN0aXZhdGVCdXR0b249bCxjLmRpc2FibGVCdXR0b249YSxjLmVuYWJsZUJ1dHRvbj11LGMuZ2V0Vmlld3NXaXRoQnV0dG9ucz1kLGMuZWw9bnVsbDt2YXIgaCxmLGc9W119ZnVuY3Rpb24gWXQoKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIU98fHQ8T3x8ZT5WfWZ1bmN0aW9uIGkodCxlKXtPPXQsVj1lLHIoWSwicmVzZXQiKX1mdW5jdGlvbiByKHQsZSl7dmFyIG4saTtmb3IoInJlc2V0Ij09PWU/aj1bXToiYWRkIiE9PWUmJihqPXcoaix0KSksbj0wO248dC5sZW5ndGg7bisrKWk9dFtuXSwicGVuZGluZyIhPT1pLl9zdGF0dXMmJlcrKyxpLl9mZXRjaElkPShpLl9mZXRjaElkfHwwKSsxLGkuX3N0YXR1cz0icGVuZGluZyI7Zm9yKG49MDtuPHQubGVuZ3RoO24rKylpPXRbbl0scyhpLGkuX2ZldGNoSWQpfWZ1bmN0aW9uIHMoZSxuKXthKGUsZnVuY3Rpb24oaSl7dmFyIHIscyxvLGE9dC5pc0FycmF5KGUuZXZlbnRzKTtpZihuPT09ZS5fZmV0Y2hJZCYmInJlamVjdGVkIiE9PWUuX3N0YXR1cyl7aWYoZS5fc3RhdHVzPSJyZXNvbHZlZCIsaSlmb3Iocj0wO3I8aS5sZW5ndGg7cisrKXM9aVtyXSxvPWE/czpSKHMsZSksbyYmai5wdXNoLmFwcGx5KGosTChvKSk7bCgpfX0pfWZ1bmN0aW9uIG8odCl7dmFyIGU9InBlbmRpbmciPT09dC5fc3RhdHVzO3QuX3N0YXR1cz0icmVqZWN0ZWQiLGUmJmwoKX1mdW5jdGlvbiBsKCl7Vy0tLFd8fFAoail9ZnVuY3Rpb24gYShlLG4pe3ZhciBpLHIscz1qdC5zb3VyY2VGZXRjaGVycztmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKXtpZihyPXNbaV0uY2FsbChGLGUsTy5jbG9uZSgpLFYuY2xvbmUoKSxGLm9wdGlvbnMudGltZXpvbmUsbikscj09PSEwKXJldHVybjtpZigib2JqZWN0Ij09dHlwZW9mIHIpcmV0dXJuIHZvaWQgYShyLG4pfXZhciBvPWUuZXZlbnRzO2lmKG8pdC5pc0Z1bmN0aW9uKG8pPyhGLnB1c2hMb2FkaW5nKCksby5jYWxsKEYsTy5jbG9uZSgpLFYuY2xvbmUoKSxGLm9wdGlvbnMudGltZXpvbmUsZnVuY3Rpb24odCl7bih0KSxGLnBvcExvYWRpbmcoKX0pKTp0LmlzQXJyYXkobyk/bihvKTpuKCk7ZWxzZXt2YXIgbD1lLnVybDtpZihsKXt2YXIgdSxkPWUuc3VjY2VzcyxjPWUuZXJyb3IsaD1lLmNvbXBsZXRlO3U9dC5pc0Z1bmN0aW9uKGUuZGF0YSk/ZS5kYXRhKCk6ZS5kYXRhO3ZhciBmPXQuZXh0ZW5kKHt9LHV8fHt9KSxnPUooZS5zdGFydFBhcmFtLEYub3B0aW9ucy5zdGFydFBhcmFtKSxwPUooZS5lbmRQYXJhbSxGLm9wdGlvbnMuZW5kUGFyYW0pLHY9SihlLnRpbWV6b25lUGFyYW0sRi5vcHRpb25zLnRpbWV6b25lUGFyYW0pO2cmJihmW2ddPU8uZm9ybWF0KCkpLHAmJihmW3BdPVYuZm9ybWF0KCkpLEYub3B0aW9ucy50aW1lem9uZSYmImxvY2FsIiE9Ri5vcHRpb25zLnRpbWV6b25lJiYoZlt2XT1GLm9wdGlvbnMudGltZXpvbmUpLEYucHVzaExvYWRpbmcoKSx0LmFqYXgodC5leHRlbmQoe30sVGUsZSx7ZGF0YTpmLHN1Y2Nlc3M6ZnVuY3Rpb24oZSl7ZT1lfHxbXTt2YXIgaT1RKGQsdGhpcyxhcmd1bWVudHMpO3QuaXNBcnJheShpKSYmKGU9aSksbihlKX0sZXJyb3I6ZnVuY3Rpb24oKXtRKGMsdGhpcyxhcmd1bWVudHMpLG4oKX0sY29tcGxldGU6ZnVuY3Rpb24oKXtRKGgsdGhpcyxhcmd1bWVudHMpLEYucG9wTG9hZGluZygpfX0pKX1lbHNlIG4oKX19ZnVuY3Rpb24gdSh0KXt2YXIgZT1kKHQpO2UmJihZLnB1c2goZSkscihbZV0sImFkZCIpKX1mdW5jdGlvbiBkKGUpe3ZhciBuLGkscj1qdC5zb3VyY2VOb3JtYWxpemVycztpZih0LmlzRnVuY3Rpb24oZSl8fHQuaXNBcnJheShlKT9uPXtldmVudHM6ZX06InN0cmluZyI9PXR5cGVvZiBlP249e3VybDplfToib2JqZWN0Ij09dHlwZW9mIGUmJihuPXQuZXh0ZW5kKHt9LGUpKSxuKXtmb3Iobi5jbGFzc05hbWU/InN0cmluZyI9PXR5cGVvZiBuLmNsYXNzTmFtZSYmKG4uY2xhc3NOYW1lPW4uY2xhc3NOYW1lLnNwbGl0KC9ccysvKSk6bi5jbGFzc05hbWU9W10sdC5pc0FycmF5KG4uZXZlbnRzKSYmKG4ub3JpZ0FycmF5PW4uZXZlbnRzLG4uZXZlbnRzPXQubWFwKG4uZXZlbnRzLGZ1bmN0aW9uKHQpe3JldHVybiBSKHQsbil9KSksaT0wO2k8ci5sZW5ndGg7aSsrKXJbaV0uY2FsbChGLG4pO3JldHVybiBufX1mdW5jdGlvbiBjKHQpe2YobSh0KSl9ZnVuY3Rpb24gaCh0KXtudWxsPT10P2YoWSwhMCk6Zih2KHQpKX1mdW5jdGlvbiBmKGUsbil7dmFyIGk7Zm9yKGk9MDtpPGUubGVuZ3RoO2krKylvKGVbaV0pO24/KFk9W10saj1bXSk6KFk9dC5ncmVwKFksZnVuY3Rpb24odCl7Zm9yKGk9MDtpPGUubGVuZ3RoO2krKylpZih0PT09ZVtpXSlyZXR1cm4hMTtyZXR1cm4hMH0pLGo9dyhqLGUpKSxQKGopfWZ1bmN0aW9uIGcoKXtyZXR1cm4gWS5zbGljZSgxKX1mdW5jdGlvbiBwKGUpe3JldHVybiB0LmdyZXAoWSxmdW5jdGlvbih0KXtyZXR1cm4gdC5pZCYmdC5pZD09PWV9KVswXX1mdW5jdGlvbiB2KGUpe2U/dC5pc0FycmF5KGUpfHwoZT1bZV0pOmU9W107dmFyIG4saT1bXTtmb3Iobj0wO248ZS5sZW5ndGg7bisrKWkucHVzaC5hcHBseShpLG0oZVtuXSkpO3JldHVybiBpfWZ1bmN0aW9uIG0oZSl7dmFyIG4saTtmb3Iobj0wO248WS5sZW5ndGg7bisrKWlmKGk9WVtuXSxpPT09ZSlyZXR1cm5baV07cmV0dXJuIGk9cChlKSxpP1tpXTp0LmdyZXAoWSxmdW5jdGlvbih0KXtyZXR1cm4geShlLHQpfSl9ZnVuY3Rpb24geSh0LGUpe3JldHVybiB0JiZlJiZTKHQpPT1TKGUpfWZ1bmN0aW9uIFModCl7cmV0dXJuKCJvYmplY3QiPT10eXBlb2YgdD90Lm9yaWdBcnJheXx8dC5nb29nbGVDYWxlbmRhcklkfHx0LnVybHx8dC5ldmVudHM6bnVsbCl8fHR9ZnVuY3Rpb24gdyhlLG4pe3JldHVybiB0LmdyZXAoZSxmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPG4ubGVuZ3RoO2UrKylpZih0LnNvdXJjZT09PW5bZV0pcmV0dXJuITE7cmV0dXJuITB9KX1mdW5jdGlvbiBFKHQpe3Quc3RhcnQ9Ri5tb21lbnQodC5zdGFydCksdC5lbmQ/dC5lbmQ9Ri5tb21lbnQodC5lbmQpOnQuZW5kPW51bGwsQih0LEQodCkpLFAoail9ZnVuY3Rpb24gRChlKXt2YXIgbj17fTtyZXR1cm4gdC5lYWNoKGUsZnVuY3Rpb24odCxlKXtiKHQpJiZ2b2lkIDAhPT1lJiZLKGUpJiYoblt0XT1lKX0pLG59ZnVuY3Rpb24gYih0KXtyZXR1cm4hL15ffF4oaWR8YWxsRGF5fHN0YXJ0fGVuZCkkLy50ZXN0KHQpfWZ1bmN0aW9uIEModCxlKXt2YXIgbixpLHIscz1SKHQpO2lmKHMpe2ZvcihuPUwocyksaT0wO2k8bi5sZW5ndGg7aSsrKXI9bltpXSxyLnNvdXJjZXx8KGUmJihfLmV2ZW50cy5wdXNoKHIpLHIuc291cmNlPV8pLGoucHVzaChyKSk7cmV0dXJuIFAoaiksbn1yZXR1cm5bXX1mdW5jdGlvbiBIKGUpe3ZhciBuLGk7Zm9yKG51bGw9PWU/ZT1mdW5jdGlvbigpe3JldHVybiEwfTp0LmlzRnVuY3Rpb24oZSl8fChuPWUrIiIsZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5faWQ9PW59KSxqPXQuZ3JlcChqLGUsITApLGk9MDtpPFkubGVuZ3RoO2krKyl0LmlzQXJyYXkoWVtpXS5ldmVudHMpJiYoWVtpXS5ldmVudHM9dC5ncmVwKFlbaV0uZXZlbnRzLGUsITApKTtQKGopfWZ1bmN0aW9uIFQoZSl7cmV0dXJuIHQuaXNGdW5jdGlvbihlKT90LmdyZXAoaixlKTpudWxsIT1lPyhlKz0iIix0LmdyZXAoaixmdW5jdGlvbih0KXtyZXR1cm4gdC5faWQ9PWV9KSk6an1mdW5jdGlvbiB4KHQpe3Quc3RhcnQ9Ri5tb21lbnQodC5zdGFydCksdC5lbmQmJih0LmVuZD1GLm1vbWVudCh0LmVuZCkpLFd0KHQpfWZ1bmN0aW9uIFIobixpKXt2YXIgcixzLG8sbD17fTtpZihGLm9wdGlvbnMuZXZlbnREYXRhVHJhbnNmb3JtJiYobj1GLm9wdGlvbnMuZXZlbnREYXRhVHJhbnNmb3JtKG4pKSxpJiZpLmV2ZW50RGF0YVRyYW5zZm9ybSYmKG49aS5ldmVudERhdGFUcmFuc2Zvcm0obikpLHQuZXh0ZW5kKGwsbiksaSYmKGwuc291cmNlPWkpLGwuX2lkPW4uX2lkfHwodm9pZCAwPT09bi5pZD8iX2ZjIit4ZSsrOm4uaWQrIiIpLG4uY2xhc3NOYW1lPyJzdHJpbmciPT10eXBlb2Ygbi5jbGFzc05hbWU/bC5jbGFzc05hbWU9bi5jbGFzc05hbWUuc3BsaXQoL1xzKy8pOmwuY2xhc3NOYW1lPW4uY2xhc3NOYW1lOmwuY2xhc3NOYW1lPVtdLHI9bi5zdGFydHx8bi5kYXRlLHM9bi5lbmQsVShyKSYmKHI9ZS5kdXJhdGlvbihyKSksVShzKSYmKHM9ZS5kdXJhdGlvbihzKSksbi5kb3d8fGUuaXNEdXJhdGlvbihyKXx8ZS5pc0R1cmF0aW9uKHMpKWwuc3RhcnQ9cj9lLmR1cmF0aW9uKHIpOm51bGwsbC5lbmQ9cz9lLmR1cmF0aW9uKHMpOm51bGwsbC5fcmVjdXJyaW5nPSEwO2Vsc2V7aWYociYmKHI9Ri5tb21lbnQociksIXIuaXNWYWxpZCgpKSlyZXR1cm4hMTtzJiYocz1GLm1vbWVudChzKSxzLmlzVmFsaWQoKXx8KHM9bnVsbCkpLG89bi5hbGxEYXksdm9pZCAwPT09byYmKG89SihpP2kuYWxsRGF5RGVmYXVsdDp2b2lkIDAsRi5vcHRpb25zLmFsbERheURlZmF1bHQpKSxJKHIscyxvLGwpfXJldHVybiBGLm5vcm1hbGl6ZUV2ZW50KGwpLGx9ZnVuY3Rpb24gSSh0LGUsbixpKXtpLnN0YXJ0PXQsaS5lbmQ9ZSxpLmFsbERheT1uLGsoaSksV3QoaSl9ZnVuY3Rpb24gayh0KXtNKHQpLHQuZW5kJiYhdC5lbmQuaXNBZnRlcih0LnN0YXJ0KSYmKHQuZW5kPW51bGwpLHQuZW5kfHwoRi5vcHRpb25zLmZvcmNlRXZlbnREdXJhdGlvbj90LmVuZD1GLmdldERlZmF1bHRFdmVudEVuZCh0LmFsbERheSx0LnN0YXJ0KTp0LmVuZD1udWxsKX1mdW5jdGlvbiBNKHQpe251bGw9PXQuYWxsRGF5JiYodC5hbGxEYXk9ISh0LnN0YXJ0Lmhhc1RpbWUoKXx8dC5lbmQmJnQuZW5kLmhhc1RpbWUoKSkpLHQuYWxsRGF5Pyh0LnN0YXJ0LnN0cmlwVGltZSgpLHQuZW5kJiZ0LmVuZC5zdHJpcFRpbWUoKSk6KHQuc3RhcnQuaGFzVGltZSgpfHwodC5zdGFydD1GLmFwcGx5VGltZXpvbmUodC5zdGFydC50aW1lKDApKSksdC5lbmQmJiF0LmVuZC5oYXNUaW1lKCkmJih0LmVuZD1GLmFwcGx5VGltZXpvbmUodC5lbmQudGltZSgwKSkpKX1mdW5jdGlvbiBMKGUsbixpKXt2YXIgcixzLG8sbCxhLHUsZCxjLGgsZj1bXTtpZihuPW58fE8saT1pfHxWLGUpaWYoZS5fcmVjdXJyaW5nKXtpZihzPWUuZG93KWZvcihyPXt9LG89MDtvPHMubGVuZ3RoO28rKylyW3Nbb11dPSEwO2ZvcihsPW4uY2xvbmUoKS5zdHJpcFRpbWUoKTtsLmlzQmVmb3JlKGkpOylyJiYhcltsLmRheSgpXXx8KGE9ZS5zdGFydCx1PWUuZW5kLGQ9bC5jbG9uZSgpLGM9bnVsbCxhJiYoZD1kLnRpbWUoYSkpLHUmJihjPWwuY2xvbmUoKS50aW1lKHUpKSxoPXQuZXh0ZW5kKHt9LGUpLEkoZCxjLCFhJiYhdSxoKSxmLnB1c2goaCkpLGwuYWRkKDEsImRheXMiKX1lbHNlIGYucHVzaChlKTtyZXR1cm4gZn1mdW5jdGlvbiBCKGUsbixpKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIGk/QSh0LGUsaSk6bi5hbGxEYXk/Ryh0LGUpOk4odCxlKX12YXIgcyxvLGwsYSx1LGQsYz17fTtyZXR1cm4gbj1ufHx7fSxuLnN0YXJ0fHwobi5zdGFydD1lLnN0YXJ0LmNsb25lKCkpLHZvaWQgMD09PW4uZW5kJiYobi5lbmQ9ZS5lbmQ/ZS5lbmQuY2xvbmUoKTpudWxsKSxudWxsPT1uLmFsbERheSYmKG4uYWxsRGF5PWUuYWxsRGF5KSxrKG4pLHM9e3N0YXJ0OmUuX3N0YXJ0LmNsb25lKCksZW5kOmUuX2VuZD9lLl9lbmQuY2xvbmUoKTpGLmdldERlZmF1bHRFdmVudEVuZChlLl9hbGxEYXksZS5fc3RhcnQpLGFsbERheTpuLmFsbERheX0sayhzKSxvPW51bGwhPT1lLl9lbmQmJm51bGw9PT1uLmVuZCxsPXIobi5zdGFydCxzLnN0YXJ0KSxuLmVuZD8oYT1yKG4uZW5kLHMuZW5kKSx1PWEuc3VidHJhY3QobCkpOnU9bnVsbCx0LmVhY2gobixmdW5jdGlvbih0LGUpe2IodCkmJnZvaWQgMCE9PWUmJihjW3RdPWUpfSksZD16KFQoZS5faWQpLG8sbi5hbGxEYXksbCx1LGMpLHtkYXRlRGVsdGE6bCxkdXJhdGlvbkRlbHRhOnUsdW5kbzpkfX1mdW5jdGlvbiB6KGUsbixpLHIscyxvKXt2YXIgbD1GLmdldElzQW1iaWdUaW1lem9uZSgpLGE9W107cmV0dXJuIHImJiFyLnZhbHVlT2YoKSYmKHI9bnVsbCkscyYmIXMudmFsdWVPZigpJiYocz1udWxsKSx0LmVhY2goZSxmdW5jdGlvbihlLHUpe3ZhciBkLGM7ZD17c3RhcnQ6dS5zdGFydC5jbG9uZSgpLGVuZDp1LmVuZD91LmVuZC5jbG9uZSgpOm51bGwsYWxsRGF5OnUuYWxsRGF5fSx0LmVhY2gobyxmdW5jdGlvbih0KXtkW3RdPXVbdF19KSxjPXtzdGFydDp1Ll9zdGFydCxlbmQ6dS5fZW5kLGFsbERheTppfSxrKGMpLG4/Yy5lbmQ9bnVsbDpzJiYhYy5lbmQmJihjLmVuZD1GLmdldERlZmF1bHRFdmVudEVuZChjLmFsbERheSxjLnN0YXJ0KSksciYmKGMuc3RhcnQuYWRkKHIpLGMuZW5kJiZjLmVuZC5hZGQocikpLHMmJmMuZW5kLmFkZChzKSxsJiYhYy5hbGxEYXkmJihyfHxzKSYmKGMuc3RhcnQuc3RyaXBab25lKCksYy5lbmQmJmMuZW5kLnN0cmlwWm9uZSgpKSx0LmV4dGVuZCh1LG8sYyksV3QodSksYS5wdXNoKGZ1bmN0aW9uKCl7dC5leHRlbmQodSxkKSxXdCh1KX0pfSksZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PGEubGVuZ3RoO3QrKylhW3RdKCl9fXZhciBGPXRoaXM7Ri5pc0ZldGNoTmVlZGVkPW4sRi5mZXRjaEV2ZW50cz1pLEYuZmV0Y2hFdmVudFNvdXJjZXM9cixGLmdldEV2ZW50U291cmNlcz1nLEYuZ2V0RXZlbnRTb3VyY2VCeUlkPXAsRi5nZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXk9dixGLmdldEV2ZW50U291cmNlc0J5TWF0Y2g9bSxGLmFkZEV2ZW50U291cmNlPXUsRi5yZW1vdmVFdmVudFNvdXJjZT1jLEYucmVtb3ZlRXZlbnRTb3VyY2VzPWgsRi51cGRhdGVFdmVudD1FLEYucmVuZGVyRXZlbnQ9QyxGLnJlbW92ZUV2ZW50cz1ILEYuY2xpZW50RXZlbnRzPVQsRi5tdXRhdGVFdmVudD1CLEYubm9ybWFsaXplRXZlbnREYXRlcz1rLEYubm9ybWFsaXplRXZlbnRUaW1lcz1NO3ZhciBPLFYsUD1GLnJlcG9ydEV2ZW50cyxfPXtldmVudHM6W119LFk9W19dLFc9MCxqPVtdO3QuZWFjaCgoRi5vcHRpb25zLmV2ZW50cz9bRi5vcHRpb25zLmV2ZW50c106W10pLmNvbmNhdChGLm9wdGlvbnMuZXZlbnRTb3VyY2VzfHxbXSksZnVuY3Rpb24odCxlKXt2YXIgbj1kKGUpO24mJlkucHVzaChuKX0pLEYucmV6b25lQXJyYXlFdmVudFNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgZSxuLGk7Zm9yKGU9MDtlPFkubGVuZ3RoO2UrKylpZihuPVlbZV0uZXZlbnRzLHQuaXNBcnJheShuKSlmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKXgobltpXSl9LEYuYnVpbGRFdmVudEZyb21JbnB1dD1SLEYuZXhwYW5kRXZlbnQ9TCxGLmdldEV2ZW50Q2FjaGU9ZnVuY3Rpb24oKXtyZXR1cm4gan19ZnVuY3Rpb24gV3QodCl7dC5fYWxsRGF5PXQuYWxsRGF5LHQuX3N0YXJ0PXQuc3RhcnQuY2xvbmUoKSx0Ll9lbmQ9dC5lbmQ/dC5lbmQuY2xvbmUoKTpudWxsfXZhciBqdD10LmZ1bGxDYWxlbmRhcj17dmVyc2lvbjoiMy4wLjEiLGludGVybmFsQXBpVmVyc2lvbjo2fSxVdD1qdC52aWV3cz17fTt0LmZuLmZ1bGxDYWxlbmRhcj1mdW5jdGlvbihlKXt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaT10aGlzO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24ocixzKXt2YXIgbyxsPXQocyksYT1sLmRhdGEoImZ1bGxDYWxlbmRhciIpOyJzdHJpbmciPT10eXBlb2YgZT9hJiZ0LmlzRnVuY3Rpb24oYVtlXSkmJihvPWFbZV0uYXBwbHkoYSxuKSxyfHwoaT1vKSwiZGVzdHJveSI9PT1lJiZsLnJlbW92ZURhdGEoImZ1bGxDYWxlbmRhciIpKTphfHwoYT1uZXcgRWUobCxlKSxsLmRhdGEoImZ1bGxDYWxlbmRhciIsYSksYS5yZW5kZXIoKSl9KSxpfTt2YXIgcXQ9WyJoZWFkZXIiLCJidXR0b25UZXh0IiwiYnV0dG9uSWNvbnMiLCJ0aGVtZUJ1dHRvbkljb25zIl07anQuaW50ZXJzZWN0UmFuZ2VzPUYsanQuYXBwbHlBbGw9USxqdC5kZWJvdW5jZT1hdCxqdC5pc0ludD1vdCxqdC5odG1sRXNjYXBlPXR0LGp0LmNzc1RvU3RyPW50LGp0LnByb3h5PWx0LGp0LmNhcGl0YWxpc2VGaXJzdExldHRlcj1ydCxqdC5nZXRPdXRlclJlY3Q9aCxqdC5nZXRDbGllbnRSZWN0PWYsanQuZ2V0Q29udGVudFJlY3Q9ZyxqdC5nZXRTY3JvbGxiYXJXaWR0aHM9cDt2YXIgWnQ9bnVsbDtqdC5wcmV2ZW50RGVmYXVsdD1DLGp0LmludGVyc2VjdFJlY3RzPXgsanQucGFyc2VGaWVsZFNwZWNzPU0sanQuY29tcGFyZUJ5RmllbGRTcGVjcz1MLGp0LmNvbXBhcmVCeUZpZWxkU3BlYz1CLGp0LmZsZXhpYmxlQ29tcGFyZT16LGp0LmNvbXB1dGVJbnRlcnZhbFVuaXQ9TyxqdC5kaXZpZGVSYW5nZUJ5RHVyYXRpb249UCxqdC5kaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb249XyxqdC5tdWx0aXBseUR1cmF0aW9uPVksanQuZHVyYXRpb25IYXNUaW1lPVc7dmFyICR0PVsic3VuIiwibW9uIiwidHVlIiwid2VkIiwidGh1IiwiZnJpIiwic2F0Il0sWHQ9WyJ5ZWFyIiwibW9udGgiLCJ3ZWVrIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl07anQubG9nPWZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LmNvbnNvbGU7aWYodCYmdC5sb2cpcmV0dXJuIHQubG9nLmFwcGx5KHQsYXJndW1lbnRzKX0sanQud2Fybj1mdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5jb25zb2xlO3JldHVybiB0JiZ0Lndhcm4/dC53YXJuLmFwcGx5KHQsYXJndW1lbnRzKTpqdC5sb2cuYXBwbHkoanQsYXJndW1lbnRzKX07dmFyIEt0PXt9Lmhhc093blByb3BlcnR5LFF0PS9eXHMqXGR7NH0tXGRcZCQvLEp0PS9eXHMqXGR7NH0tKD86KFxkXGQtXGRcZCl8KFdcZFxkJCl8KFdcZFxkLVxkKXwoXGRcZFxkKSkoKFR8ICkoXGRcZCg6XGRcZCg6XGRcZChcLlxkKyk/KT8pPyk/KT8kLyx0ZT1lLmZuLGVlPXQuZXh0ZW5kKHt9LHRlKSxuZT1lLm1vbWVudFByb3BlcnRpZXM7bmUucHVzaCgiX2Z1bGxDYWxlbmRhciIpLG5lLnB1c2goIl9hbWJpZ1RpbWUiKSxuZS5wdXNoKCJfYW1iaWdab25lIiksanQubW9tZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGR0KGFyZ3VtZW50cyl9LGp0Lm1vbWVudC51dGM9ZnVuY3Rpb24oKXt2YXIgdD1kdChhcmd1bWVudHMsITApO3JldHVybiB0Lmhhc1RpbWUoKSYmdC51dGMoKSx0fSxqdC5tb21lbnQucGFyc2Vab25lPWZ1bmN0aW9uKCl7cmV0dXJuIGR0KGFyZ3VtZW50cywhMCwhMCl9LHRlLndlZWs9dGUud2Vla3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbG9jYWxlLl9mdWxsQ2FsZW5kYXJfd2Vla0NhbGM7cmV0dXJuIG51bGw9PXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBlP2UodGhpcyk6IklTTyI9PT1lP2VlLmlzb1dlZWsuYXBwbHkodGhpcyxhcmd1bWVudHMpOmVlLndlZWsuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZS50aW1lPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9mdWxsQ2FsZW5kYXIpcmV0dXJuIGVlLnRpbWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG51bGw9PXQpcmV0dXJuIGUuZHVyYXRpb24oe2hvdXJzOnRoaXMuaG91cnMoKSxtaW51dGVzOnRoaXMubWludXRlcygpLHNlY29uZHM6dGhpcy5zZWNvbmRzKCksbWlsbGlzZWNvbmRzOnRoaXMubWlsbGlzZWNvbmRzKCl9KTt0aGlzLl9hbWJpZ1RpbWU9ITEsZS5pc0R1cmF0aW9uKHQpfHxlLmlzTW9tZW50KHQpfHwodD1lLmR1cmF0aW9uKHQpKTt2YXIgbj0wO3JldHVybiBlLmlzRHVyYXRpb24odCkmJihuPTI0Kk1hdGguZmxvb3IodC5hc0RheXMoKSkpLHRoaXMuaG91cnMobit0LmhvdXJzKCkpLm1pbnV0ZXModC5taW51dGVzKCkpLnNlY29uZHModC5zZWNvbmRzKCkpLm1pbGxpc2Vjb25kcyh0Lm1pbGxpc2Vjb25kcygpKX0sdGUuc3RyaXBUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FtYmlnVGltZXx8KHRoaXMudXRjKCEwKSx0aGlzLnNldCh7aG91cnM6MCxtaW51dGVzOjAsc2Vjb25kczowLG1zOjB9KSx0aGlzLl9hbWJpZ1RpbWU9ITAsdGhpcy5fYW1iaWdab25lPSEwKSx0aGlzfSx0ZS5oYXNUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2FtYmlnVGltZX0sdGUuc3RyaXBab25lPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMuX2FtYmlnWm9uZXx8KHQ9dGhpcy5fYW1iaWdUaW1lLHRoaXMudXRjKCEwKSx0aGlzLl9hbWJpZ1RpbWU9dHx8ITEsdGhpcy5fYW1iaWdab25lPSEwKSx0aGlzfSx0ZS5oYXNab25lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2FtYmlnWm9uZX0sdGUubG9jYWw9ZnVuY3Rpb24odCl7cmV0dXJuIGVlLmxvY2FsLmNhbGwodGhpcyx0aGlzLl9hbWJpZ1pvbmV8fHQpLHRoaXMuX2FtYmlnVGltZT0hMSx0aGlzLl9hbWJpZ1pvbmU9ITEsdGhpc30sdGUudXRjPWZ1bmN0aW9uKHQpe3JldHVybiBlZS51dGMuY2FsbCh0aGlzLHQpLHRoaXMuX2FtYmlnVGltZT0hMSx0aGlzLl9hbWJpZ1pvbmU9ITEsdGhpc30sdGUudXRjT2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYodGhpcy5fYW1iaWdUaW1lPSExLHRoaXMuX2FtYmlnWm9uZT0hMSksZWUudXRjT2Zmc2V0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGUuZm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Z1bGxDYWxlbmRhciYmYXJndW1lbnRzWzBdP2h0KHRoaXMsYXJndW1lbnRzWzBdKTp0aGlzLl9hbWJpZ1RpbWU/Y3QodGhpcywiWVlZWS1NTS1ERCIpOnRoaXMuX2FtYmlnWm9uZT9jdCh0aGlzLCJZWVlZLU1NLUREW1RdSEg6bW06c3MiKTplZS5mb3JtYXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZS50b0lTT1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbWJpZ1RpbWU/Y3QodGhpcywiWVlZWS1NTS1ERCIpOnRoaXMuX2FtYmlnWm9uZT9jdCh0aGlzLCJZWVlZLU1NLUREW1RdSEg6bW06c3MiKTplZS50b0lTT1N0cmluZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3ZhciBpZT17dDpmdW5jdGlvbih0KXtyZXR1cm4gY3QodCwiYSIpLmNoYXJBdCgwKX0sVDpmdW5jdGlvbih0KXtyZXR1cm4gY3QodCwiQSIpLmNoYXJBdCgwKX19O2p0LmZvcm1hdFJhbmdlPXB0O3ZhciByZT17WToieWVhciIsTToibW9udGgiLEQ6ImRheSIsZDoiZGF5IixBOiJzZWNvbmQiLGE6InNlY29uZCIsVDoic2Vjb25kIix0OiJzZWNvbmQiLEg6InNlY29uZCIsaDoic2Vjb25kIixtOiJzZWNvbmQiLHM6InNlY29uZCJ9LHNlPXt9LG9lPXtZOnt2YWx1ZToxLHVuaXQ6InllYXIifSxNOnt2YWx1ZToyLHVuaXQ6Im1vbnRoIn0sVzp7dmFsdWU6Myx1bml0OiJ3ZWVrIn0sdzp7dmFsdWU6Myx1bml0OiJ3ZWVrIn0sRDp7dmFsdWU6NCx1bml0OiJkYXkifSxkOnt2YWx1ZTo0LHVuaXQ6ImRheSJ9fTtqdC5xdWVyeU1vc3RHcmFudWxhckZvcm1hdFVuaXQ9ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIscz15dCh0KTtmb3IoZT0wO2U8cy5sZW5ndGg7ZSsrKW49c1tlXSxuLnRva2VuJiYoaT1vZVtuLnRva2VuLmNoYXJBdCgwKV0saSYmKCFyfHxpLnZhbHVlPnIudmFsdWUpJiYocj1pKSk7cmV0dXJuIHI/ci51bml0Om51bGx9LGp0LkNsYXNzPXd0LHd0LmV4dGVuZD1mdW5jdGlvbigpe3ZhciB0LGUsbj1hcmd1bWVudHMubGVuZ3RoO2Zvcih0PTA7dDxuO3QrKyllPWFyZ3VtZW50c1t0XSx0PG4tMSYmRHQodGhpcyxlKTtyZXR1cm4gRXQodGhpcyxlfHx7fSl9LHd0Lm1peGluPWZ1bmN0aW9uKHQpe0R0KHRoaXMsdCl9O3ZhciBsZT1qdC5FbWl0dGVyTWl4aW49e29uOmZ1bmN0aW9uKGUsbil7dmFyIGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5hcHBseShlLmNvbnRleHR8fHRoaXMsZS5hcmdzfHxbXSl9O3JldHVybiBuLmd1aWR8fChuLmd1aWQ9dC5ndWlkKyspLGkuZ3VpZD1uLmd1aWQsdCh0aGlzKS5vbihlLGkpLHRoaXN9LG9mZjpmdW5jdGlvbihlLG4pe3JldHVybiB0KHRoaXMpLm9mZihlLG4pLHRoaXN9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0KHRoaXMpLnRyaWdnZXJIYW5kbGVyKGUse2FyZ3M6bn0pLHRoaXN9LHRyaWdnZXJXaXRoOmZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gdCh0aGlzKS50cmlnZ2VySGFuZGxlcihlLHtjb250ZXh0Om4sYXJnczppfSksdGhpc319LGFlPWp0Lkxpc3RlbmVyTWl4aW49ZnVuY3Rpb24oKXt2YXIgZT0wLG49e2xpc3RlbmVySWQ6bnVsbCxsaXN0ZW5UbzpmdW5jdGlvbihlLG4saSl7aWYoIm9iamVjdCI9PXR5cGVvZiBuKWZvcih2YXIgciBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJnRoaXMubGlzdGVuVG8oZSxyLG5bcl0pO2Vsc2Uic3RyaW5nIj09dHlwZW9mIG4mJmUub24obisiLiIrdGhpcy5nZXRMaXN0ZW5lck5hbWVzcGFjZSgpLHQucHJveHkoaSx0aGlzKSl9LHN0b3BMaXN0ZW5pbmdUbzpmdW5jdGlvbih0LGUpe3Qub2ZmKChlfHwiIikrIi4iK3RoaXMuZ2V0TGlzdGVuZXJOYW1lc3BhY2UoKSl9LGdldExpc3RlbmVyTmFtZXNwYWNlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMubGlzdGVuZXJJZCYmKHRoaXMubGlzdGVuZXJJZD1lKyspLCJfbGlzdGVuZXIiK3RoaXMubGlzdGVuZXJJZH19O3JldHVybiBufSgpLHVlPXtpc0lnbm9yaW5nTW91c2U6ITEsZGVsYXlVbmlnbm9yZU1vdXNlOm51bGwsaW5pdE1vdXNlSWdub3Jpbmc6ZnVuY3Rpb24odCl7dGhpcy5kZWxheVVuaWdub3JlTW91c2U9YXQobHQodGhpcywidW5pZ25vcmVNb3VzZSIpLHR8fDFlMyl9LHRlbXBJZ25vcmVNb3VzZTpmdW5jdGlvbigpe3RoaXMuaXNJZ25vcmluZ01vdXNlPSEwLHRoaXMuZGVsYXlVbmlnbm9yZU1vdXNlKCl9LHVuaWdub3JlTW91c2U6ZnVuY3Rpb24oKXt0aGlzLmlzSWdub3JpbmdNb3VzZT0hMX19LGRlPXd0LmV4dGVuZChhZSx7aXNIaWRkZW46ITAsb3B0aW9uczpudWxsLGVsOm51bGwsbWFyZ2luOjEwLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fHx7fX0sc2hvdzpmdW5jdGlvbigpewp0aGlzLmlzSGlkZGVuJiYodGhpcy5lbHx8dGhpcy5yZW5kZXIoKSx0aGlzLmVsLnNob3coKSx0aGlzLnBvc2l0aW9uKCksdGhpcy5pc0hpZGRlbj0hMSx0aGlzLnRyaWdnZXIoInNob3ciKSl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmlzSGlkZGVufHwodGhpcy5lbC5oaWRlKCksdGhpcy5pc0hpZGRlbj0hMCx0aGlzLnRyaWdnZXIoImhpZGUiKSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10aGlzLm9wdGlvbnM7dGhpcy5lbD10KCc8ZGl2IGNsYXNzPSJmYy1wb3BvdmVyIi8+JykuYWRkQ2xhc3Mobi5jbGFzc05hbWV8fCIiKS5jc3Moe3RvcDowLGxlZnQ6MH0pLmFwcGVuZChuLmNvbnRlbnQpLmFwcGVuZFRvKG4ucGFyZW50RWwpLHRoaXMuZWwub24oImNsaWNrIiwiLmZjLWNsb3NlIixmdW5jdGlvbigpe2UuaGlkZSgpfSksbi5hdXRvSGlkZSYmdGhpcy5saXN0ZW5Ubyh0KGRvY3VtZW50KSwibW91c2Vkb3duIix0aGlzLmRvY3VtZW50TW91c2Vkb3duKX0sZG9jdW1lbnRNb3VzZWRvd246ZnVuY3Rpb24oZSl7dGhpcy5lbCYmIXQoZS50YXJnZXQpLmNsb3Nlc3QodGhpcy5lbCkubGVuZ3RoJiZ0aGlzLmhpZGUoKX0scmVtb3ZlRWxlbWVudDpmdW5jdGlvbigpe3RoaXMuaGlkZSgpLHRoaXMuZWwmJih0aGlzLmVsLnJlbW92ZSgpLHRoaXMuZWw9bnVsbCksdGhpcy5zdG9wTGlzdGVuaW5nVG8odChkb2N1bWVudCksIm1vdXNlZG93biIpfSxwb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBlLG4saSxyLHMsbz10aGlzLm9wdGlvbnMsbD10aGlzLmVsLm9mZnNldFBhcmVudCgpLm9mZnNldCgpLGE9dGhpcy5lbC5vdXRlcldpZHRoKCksdT10aGlzLmVsLm91dGVySGVpZ2h0KCksZD10KHdpbmRvdyksaD1jKHRoaXMuZWwpO3I9by50b3B8fDAscz12b2lkIDAhPT1vLmxlZnQ/by5sZWZ0OnZvaWQgMCE9PW8ucmlnaHQ/by5yaWdodC1hOjAsaC5pcyh3aW5kb3cpfHxoLmlzKGRvY3VtZW50KT8oaD1kLGU9MCxuPTApOihpPWgub2Zmc2V0KCksZT1pLnRvcCxuPWkubGVmdCksZSs9ZC5zY3JvbGxUb3AoKSxuKz1kLnNjcm9sbExlZnQoKSxvLnZpZXdwb3J0Q29uc3RyYWluIT09ITEmJihyPU1hdGgubWluKHIsZStoLm91dGVySGVpZ2h0KCktdS10aGlzLm1hcmdpbikscj1NYXRoLm1heChyLGUrdGhpcy5tYXJnaW4pLHM9TWF0aC5taW4ocyxuK2gub3V0ZXJXaWR0aCgpLWEtdGhpcy5tYXJnaW4pLHM9TWF0aC5tYXgocyxuK3RoaXMubWFyZ2luKSksdGhpcy5lbC5jc3Moe3RvcDpyLWwudG9wLGxlZnQ6cy1sLmxlZnR9KX0sdHJpZ2dlcjpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnNbdF0mJnRoaXMub3B0aW9uc1t0XS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSl9fSksY2U9anQuQ29vcmRDYWNoZT13dC5leHRlbmQoe2VsczpudWxsLGZvcmNlZE9mZnNldFBhcmVudEVsOm51bGwsb3JpZ2luOm51bGwsYm91bmRpbmdSZWN0Om51bGwsaXNIb3Jpem9udGFsOiExLGlzVmVydGljYWw6ITEsbGVmdHM6bnVsbCxyaWdodHM6bnVsbCx0b3BzOm51bGwsYm90dG9tczpudWxsLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMuZWxzPXQoZS5lbHMpLHRoaXMuaXNIb3Jpem9udGFsPWUuaXNIb3Jpem9udGFsLHRoaXMuaXNWZXJ0aWNhbD1lLmlzVmVydGljYWwsdGhpcy5mb3JjZWRPZmZzZXRQYXJlbnRFbD1lLm9mZnNldFBhcmVudD90KGUub2Zmc2V0UGFyZW50KTpudWxsfSxidWlsZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZm9yY2VkT2Zmc2V0UGFyZW50RWx8fHRoaXMuZWxzLmVxKDApLm9mZnNldFBhcmVudCgpO3RoaXMub3JpZ2luPXQub2Zmc2V0KCksdGhpcy5ib3VuZGluZ1JlY3Q9dGhpcy5xdWVyeUJvdW5kaW5nUmVjdCgpLHRoaXMuaXNIb3Jpem9udGFsJiZ0aGlzLmJ1aWxkRWxIb3Jpem9udGFscygpLHRoaXMuaXNWZXJ0aWNhbCYmdGhpcy5idWlsZEVsVmVydGljYWxzKCl9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW49bnVsbCx0aGlzLmJvdW5kaW5nUmVjdD1udWxsLHRoaXMubGVmdHM9bnVsbCx0aGlzLnJpZ2h0cz1udWxsLHRoaXMudG9wcz1udWxsLHRoaXMuYm90dG9tcz1udWxsfSxlbnN1cmVCdWlsdDpmdW5jdGlvbigpe3RoaXMub3JpZ2lufHx0aGlzLmJ1aWxkKCl9LGJ1aWxkRWxIb3Jpem9udGFsczpmdW5jdGlvbigpe3ZhciBlPVtdLG49W107dGhpcy5lbHMuZWFjaChmdW5jdGlvbihpLHIpe3ZhciBzPXQociksbz1zLm9mZnNldCgpLmxlZnQsbD1zLm91dGVyV2lkdGgoKTtlLnB1c2gobyksbi5wdXNoKG8rbCl9KSx0aGlzLmxlZnRzPWUsdGhpcy5yaWdodHM9bn0sYnVpbGRFbFZlcnRpY2FsczpmdW5jdGlvbigpe3ZhciBlPVtdLG49W107dGhpcy5lbHMuZWFjaChmdW5jdGlvbihpLHIpe3ZhciBzPXQociksbz1zLm9mZnNldCgpLnRvcCxsPXMub3V0ZXJIZWlnaHQoKTtlLnB1c2gobyksbi5wdXNoKG8rbCl9KSx0aGlzLnRvcHM9ZSx0aGlzLmJvdHRvbXM9bn0sZ2V0SG9yaXpvbnRhbEluZGV4OmZ1bmN0aW9uKHQpe3RoaXMuZW5zdXJlQnVpbHQoKTt2YXIgZSxuPXRoaXMubGVmdHMsaT10aGlzLnJpZ2h0cyxyPW4ubGVuZ3RoO2ZvcihlPTA7ZTxyO2UrKylpZih0Pj1uW2VdJiZ0PGlbZV0pcmV0dXJuIGV9LGdldFZlcnRpY2FsSW5kZXg6ZnVuY3Rpb24odCl7dGhpcy5lbnN1cmVCdWlsdCgpO3ZhciBlLG49dGhpcy50b3BzLGk9dGhpcy5ib3R0b21zLHI9bi5sZW5ndGg7Zm9yKGU9MDtlPHI7ZSsrKWlmKHQ+PW5bZV0mJnQ8aVtlXSlyZXR1cm4gZX0sZ2V0TGVmdE9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMubGVmdHNbdF19LGdldExlZnRQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMubGVmdHNbdF0tdGhpcy5vcmlnaW4ubGVmdH0sZ2V0UmlnaHRPZmZzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5zdXJlQnVpbHQoKSx0aGlzLnJpZ2h0c1t0XX0sZ2V0UmlnaHRQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMucmlnaHRzW3RdLXRoaXMub3JpZ2luLmxlZnR9LGdldFdpZHRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVuc3VyZUJ1aWx0KCksdGhpcy5yaWdodHNbdF0tdGhpcy5sZWZ0c1t0XX0sZ2V0VG9wT2Zmc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVuc3VyZUJ1aWx0KCksdGhpcy50b3BzW3RdfSxnZXRUb3BQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMudG9wc1t0XS10aGlzLm9yaWdpbi50b3B9LGdldEJvdHRvbU9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMuYm90dG9tc1t0XX0sZ2V0Qm90dG9tUG9zaXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5zdXJlQnVpbHQoKSx0aGlzLmJvdHRvbXNbdF0tdGhpcy5vcmlnaW4udG9wfSxnZXRIZWlnaHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5zdXJlQnVpbHQoKSx0aGlzLmJvdHRvbXNbdF0tdGhpcy50b3BzW3RdfSxxdWVyeUJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3ZhciB0PWModGhpcy5lbHMuZXEoMCkpO2lmKCF0LmlzKGRvY3VtZW50KSlyZXR1cm4gZih0KX0saXNQb2ludEluQm91bmRzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaXNMZWZ0SW5Cb3VuZHModCkmJnRoaXMuaXNUb3BJbkJvdW5kcyhlKX0saXNMZWZ0SW5Cb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuYm91bmRpbmdSZWN0fHx0Pj10aGlzLmJvdW5kaW5nUmVjdC5sZWZ0JiZ0PHRoaXMuYm91bmRpbmdSZWN0LnJpZ2h0fSxpc1RvcEluQm91bmRzOmZ1bmN0aW9uKHQpe3JldHVybiF0aGlzLmJvdW5kaW5nUmVjdHx8dD49dGhpcy5ib3VuZGluZ1JlY3QudG9wJiZ0PHRoaXMuYm91bmRpbmdSZWN0LmJvdHRvbX19KSxoZT1qdC5EcmFnTGlzdGVuZXI9d3QuZXh0ZW5kKGFlLHVlLHtvcHRpb25zOm51bGwsc3ViamVjdEVsOm51bGwsb3JpZ2luWDpudWxsLG9yaWdpblk6bnVsbCxzY3JvbGxFbDpudWxsLGlzSW50ZXJhY3Rpbmc6ITEsaXNEaXN0YW5jZVN1cnBhc3NlZDohMSxpc0RlbGF5RW5kZWQ6ITEsaXNEcmFnZ2luZzohMSxpc1RvdWNoOiExLGRlbGF5Om51bGwsZGVsYXlUaW1lb3V0SWQ6bnVsbCxtaW5EaXN0YW5jZTpudWxsLGhhbmRsZVRvdWNoU2Nyb2xsUHJveHk6bnVsbCxjb25zdHJ1Y3RvcjpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dHx8e30sdGhpcy5oYW5kbGVUb3VjaFNjcm9sbFByb3h5PWx0KHRoaXMsImhhbmRsZVRvdWNoU2Nyb2xsIiksdGhpcy5pbml0TW91c2VJZ25vcmluZyg1MDApfSxzdGFydEludGVyYWN0aW9uOmZ1bmN0aW9uKGUsbil7dmFyIGk9RChlKTtpZigibW91c2Vkb3duIj09PWUudHlwZSl7aWYodGhpcy5pc0lnbm9yaW5nTW91c2UpcmV0dXJuO2lmKCFTKGUpKXJldHVybjtlLnByZXZlbnREZWZhdWx0KCl9dGhpcy5pc0ludGVyYWN0aW5nfHwobj1ufHx7fSx0aGlzLmRlbGF5PUoobi5kZWxheSx0aGlzLm9wdGlvbnMuZGVsYXksMCksdGhpcy5taW5EaXN0YW5jZT1KKG4uZGlzdGFuY2UsdGhpcy5vcHRpb25zLmRpc3RhbmNlLDApLHRoaXMuc3ViamVjdEVsPXRoaXMub3B0aW9ucy5zdWJqZWN0RWwsdGhpcy5pc0ludGVyYWN0aW5nPSEwLHRoaXMuaXNUb3VjaD1pLHRoaXMuaXNEZWxheUVuZGVkPSExLHRoaXMuaXNEaXN0YW5jZVN1cnBhc3NlZD0hMSx0aGlzLm9yaWdpblg9dyhlKSx0aGlzLm9yaWdpblk9RShlKSx0aGlzLnNjcm9sbEVsPWModChlLnRhcmdldCkpLHRoaXMuYmluZEhhbmRsZXJzKCksdGhpcy5pbml0QXV0b1Njcm9sbCgpLHRoaXMuaGFuZGxlSW50ZXJhY3Rpb25TdGFydChlKSx0aGlzLnN0YXJ0RGVsYXkoZSksdGhpcy5taW5EaXN0YW5jZXx8dGhpcy5oYW5kbGVEaXN0YW5jZVN1cnBhc3NlZChlKSl9LGhhbmRsZUludGVyYWN0aW9uU3RhcnQ6ZnVuY3Rpb24odCl7dGhpcy50cmlnZ2VyKCJpbnRlcmFjdGlvblN0YXJ0Iix0KX0sZW5kSW50ZXJhY3Rpb246ZnVuY3Rpb24odCxlKXt0aGlzLmlzSW50ZXJhY3RpbmcmJih0aGlzLmVuZERyYWcodCksdGhpcy5kZWxheVRpbWVvdXRJZCYmKGNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZW91dElkKSx0aGlzLmRlbGF5VGltZW91dElkPW51bGwpLHRoaXMuZGVzdHJveUF1dG9TY3JvbGwoKSx0aGlzLnVuYmluZEhhbmRsZXJzKCksdGhpcy5pc0ludGVyYWN0aW5nPSExLHRoaXMuaGFuZGxlSW50ZXJhY3Rpb25FbmQodCxlKSx0aGlzLmlzVG91Y2gmJnRoaXMudGVtcElnbm9yZU1vdXNlKCkpfSxoYW5kbGVJbnRlcmFjdGlvbkVuZDpmdW5jdGlvbih0LGUpe3RoaXMudHJpZ2dlcigiaW50ZXJhY3Rpb25FbmQiLHQsZXx8ITEpfSxiaW5kSGFuZGxlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49MTt0aGlzLmlzVG91Y2g/KHRoaXMubGlzdGVuVG8odChkb2N1bWVudCkse3RvdWNobW92ZTp0aGlzLmhhbmRsZVRvdWNoTW92ZSx0b3VjaGVuZDp0aGlzLmVuZEludGVyYWN0aW9uLHRvdWNoY2FuY2VsOnRoaXMuZW5kSW50ZXJhY3Rpb24sdG91Y2hzdGFydDpmdW5jdGlvbih0KXtuP24tLTplLmVuZEludGVyYWN0aW9uKHQsITApfX0pLCFIKHRoaXMuaGFuZGxlVG91Y2hTY3JvbGxQcm94eSkmJnRoaXMuc2Nyb2xsRWwmJnRoaXMubGlzdGVuVG8odGhpcy5zY3JvbGxFbCwic2Nyb2xsIix0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsKSk6dGhpcy5saXN0ZW5Ubyh0KGRvY3VtZW50KSx7bW91c2Vtb3ZlOnRoaXMuaGFuZGxlTW91c2VNb3ZlLG1vdXNldXA6dGhpcy5lbmRJbnRlcmFjdGlvbn0pLHRoaXMubGlzdGVuVG8odChkb2N1bWVudCkse3NlbGVjdHN0YXJ0OkMsY29udGV4dG1lbnU6Q30pfSx1bmJpbmRIYW5kbGVyczpmdW5jdGlvbigpe3RoaXMuc3RvcExpc3RlbmluZ1RvKHQoZG9jdW1lbnQpKSxUKHRoaXMuaGFuZGxlVG91Y2hTY3JvbGxQcm94eSksdGhpcy5zY3JvbGxFbCYmdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCwic2Nyb2xsIil9LHN0YXJ0RHJhZzpmdW5jdGlvbih0LGUpe3RoaXMuc3RhcnRJbnRlcmFjdGlvbih0LGUpLHRoaXMuaXNEcmFnZ2luZ3x8KHRoaXMuaXNEcmFnZ2luZz0hMCx0aGlzLmhhbmRsZURyYWdTdGFydCh0KSl9LGhhbmRsZURyYWdTdGFydDpmdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImRyYWdTdGFydCIsdCl9LGhhbmRsZU1vdmU6ZnVuY3Rpb24odCl7dmFyIGUsbj13KHQpLXRoaXMub3JpZ2luWCxpPUUodCktdGhpcy5vcmlnaW5ZLHI9dGhpcy5taW5EaXN0YW5jZTt0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWR8fChlPW4qbitpKmksZT49cipyJiZ0aGlzLmhhbmRsZURpc3RhbmNlU3VycGFzc2VkKHQpKSx0aGlzLmlzRHJhZ2dpbmcmJnRoaXMuaGFuZGxlRHJhZyhuLGksdCl9LGhhbmRsZURyYWc6ZnVuY3Rpb24odCxlLG4pe3RoaXMudHJpZ2dlcigiZHJhZyIsdCxlLG4pLHRoaXMudXBkYXRlQXV0b1Njcm9sbChuKX0sZW5kRHJhZzpmdW5jdGlvbih0KXt0aGlzLmlzRHJhZ2dpbmcmJih0aGlzLmlzRHJhZ2dpbmc9ITEsdGhpcy5oYW5kbGVEcmFnRW5kKHQpKX0saGFuZGxlRHJhZ0VuZDpmdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImRyYWdFbmQiLHQpfSxzdGFydERlbGF5OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5kZWxheT90aGlzLmRlbGF5VGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmhhbmRsZURlbGF5RW5kKHQpfSx0aGlzLmRlbGF5KTp0aGlzLmhhbmRsZURlbGF5RW5kKHQpfSxoYW5kbGVEZWxheUVuZDpmdW5jdGlvbih0KXt0aGlzLmlzRGVsYXlFbmRlZD0hMCx0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQmJnRoaXMuc3RhcnREcmFnKHQpfSxoYW5kbGVEaXN0YW5jZVN1cnBhc3NlZDpmdW5jdGlvbih0KXt0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQ9ITAsdGhpcy5pc0RlbGF5RW5kZWQmJnRoaXMuc3RhcnREcmFnKHQpfSxoYW5kbGVUb3VjaE1vdmU6ZnVuY3Rpb24odCl7dGhpcy5pc0RyYWdnaW5nJiZ0LnByZXZlbnREZWZhdWx0KCksdGhpcy5oYW5kbGVNb3ZlKHQpfSxoYW5kbGVNb3VzZU1vdmU6ZnVuY3Rpb24odCl7dGhpcy5oYW5kbGVNb3ZlKHQpfSxoYW5kbGVUb3VjaFNjcm9sbDpmdW5jdGlvbih0KXt0aGlzLmlzRHJhZ2dpbmd8fHRoaXMuZW5kSW50ZXJhY3Rpb24odCwhMCl9LHRyaWdnZXI6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zW3RdJiZ0aGlzLm9wdGlvbnNbdF0uYXBwbHkodGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpLHRoaXNbIl8iK3RdJiZ0aGlzWyJfIit0XS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSl9fSk7aGUubWl4aW4oe2lzQXV0b1Njcm9sbDohMSxzY3JvbGxCb3VuZHM6bnVsbCxzY3JvbGxUb3BWZWw6bnVsbCxzY3JvbGxMZWZ0VmVsOm51bGwsc2Nyb2xsSW50ZXJ2YWxJZDpudWxsLHNjcm9sbFNlbnNpdGl2aXR5OjMwLHNjcm9sbFNwZWVkOjIwMCxzY3JvbGxJbnRlcnZhbE1zOjUwLGluaXRBdXRvU2Nyb2xsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zY3JvbGxFbDt0aGlzLmlzQXV0b1Njcm9sbD10aGlzLm9wdGlvbnMuc2Nyb2xsJiZ0JiYhdC5pcyh3aW5kb3cpJiYhdC5pcyhkb2N1bWVudCksdGhpcy5pc0F1dG9TY3JvbGwmJnRoaXMubGlzdGVuVG8odCwic2Nyb2xsIixhdCh0aGlzLmhhbmRsZURlYm91bmNlZFNjcm9sbCwxMDApKX0sZGVzdHJveUF1dG9TY3JvbGw6ZnVuY3Rpb24oKXt0aGlzLmVuZEF1dG9TY3JvbGwoKSx0aGlzLmlzQXV0b1Njcm9sbCYmdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCwic2Nyb2xsIil9LGNvbXB1dGVTY3JvbGxCb3VuZHM6ZnVuY3Rpb24oKXt0aGlzLmlzQXV0b1Njcm9sbCYmKHRoaXMuc2Nyb2xsQm91bmRzPWgodGhpcy5zY3JvbGxFbCkpfSx1cGRhdGVBdXRvU2Nyb2xsOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLHM9dGhpcy5zY3JvbGxTZW5zaXRpdml0eSxvPXRoaXMuc2Nyb2xsQm91bmRzLGw9MCxhPTA7byYmKGU9KHMtKEUodCktby50b3ApKS9zLG49KHMtKG8uYm90dG9tLUUodCkpKS9zLGk9KHMtKHcodCktby5sZWZ0KSkvcyxyPShzLShvLnJpZ2h0LXcodCkpKS9zLGU+PTAmJmU8PTE/bD1lKnRoaXMuc2Nyb2xsU3BlZWQqLTE6bj49MCYmbjw9MSYmKGw9bip0aGlzLnNjcm9sbFNwZWVkKSxpPj0wJiZpPD0xP2E9aSp0aGlzLnNjcm9sbFNwZWVkKi0xOnI+PTAmJnI8PTEmJihhPXIqdGhpcy5zY3JvbGxTcGVlZCkpLHRoaXMuc2V0U2Nyb2xsVmVsKGwsYSl9LHNldFNjcm9sbFZlbDpmdW5jdGlvbih0LGUpe3RoaXMuc2Nyb2xsVG9wVmVsPXQsdGhpcy5zY3JvbGxMZWZ0VmVsPWUsdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKSwhdGhpcy5zY3JvbGxUb3BWZWwmJiF0aGlzLnNjcm9sbExlZnRWZWx8fHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZHx8KHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZD1zZXRJbnRlcnZhbChsdCh0aGlzLCJzY3JvbGxJbnRlcnZhbEZ1bmMiKSx0aGlzLnNjcm9sbEludGVydmFsTXMpKX0sY29uc3RyYWluU2Nyb2xsVmVsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zY3JvbGxFbDt0aGlzLnNjcm9sbFRvcFZlbDwwP3Quc2Nyb2xsVG9wKCk8PTAmJih0aGlzLnNjcm9sbFRvcFZlbD0wKTp0aGlzLnNjcm9sbFRvcFZlbD4wJiZ0LnNjcm9sbFRvcCgpK3RbMF0uY2xpZW50SGVpZ2h0Pj10WzBdLnNjcm9sbEhlaWdodCYmKHRoaXMuc2Nyb2xsVG9wVmVsPTApLHRoaXMuc2Nyb2xsTGVmdFZlbDwwP3Quc2Nyb2xsTGVmdCgpPD0wJiYodGhpcy5zY3JvbGxMZWZ0VmVsPTApOnRoaXMuc2Nyb2xsTGVmdFZlbD4wJiZ0LnNjcm9sbExlZnQoKSt0WzBdLmNsaWVudFdpZHRoPj10WzBdLnNjcm9sbFdpZHRoJiYodGhpcy5zY3JvbGxMZWZ0VmVsPTApfSxzY3JvbGxJbnRlcnZhbEZ1bmM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNjcm9sbEVsLGU9dGhpcy5zY3JvbGxJbnRlcnZhbE1zLzFlMzt0aGlzLnNjcm9sbFRvcFZlbCYmdC5zY3JvbGxUb3AodC5zY3JvbGxUb3AoKSt0aGlzLnNjcm9sbFRvcFZlbCplKSx0aGlzLnNjcm9sbExlZnRWZWwmJnQuc2Nyb2xsTGVmdCh0LnNjcm9sbExlZnQoKSt0aGlzLnNjcm9sbExlZnRWZWwqZSksdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKSx0aGlzLnNjcm9sbFRvcFZlbHx8dGhpcy5zY3JvbGxMZWZ0VmVsfHx0aGlzLmVuZEF1dG9TY3JvbGwoKX0sZW5kQXV0b1Njcm9sbDpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsSW50ZXJ2YWxJZCYmKGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxJbnRlcnZhbElkKSx0aGlzLnNjcm9sbEludGVydmFsSWQ9bnVsbCx0aGlzLmhhbmRsZVNjcm9sbEVuZCgpKX0saGFuZGxlRGVib3VuY2VkU2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxJbnRlcnZhbElkfHx0aGlzLmhhbmRsZVNjcm9sbEVuZCgpfSxoYW5kbGVTY3JvbGxFbmQ6ZnVuY3Rpb24oKXt9fSk7dmFyIGZlPWhlLmV4dGVuZCh7Y29tcG9uZW50Om51bGwsb3JpZ0hpdDpudWxsLGhpdDpudWxsLGNvb3JkQWRqdXN0Om51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24odCxlKXtoZS5jYWxsKHRoaXMsZSksdGhpcy5jb21wb25lbnQ9dH0saGFuZGxlSW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbih0KXt2YXIgZSxuLGkscj10aGlzLnN1YmplY3RFbDt0aGlzLmNvbXB1dGVDb29yZHMoKSx0PyhuPXtsZWZ0OncodCksdG9wOkUodCl9LGk9bixyJiYoZT1oKHIpLGk9UihpLGUpKSx0aGlzLm9yaWdIaXQ9dGhpcy5xdWVyeUhpdChpLmxlZnQsaS50b3ApLHImJnRoaXMub3B0aW9ucy5zdWJqZWN0Q2VudGVyJiYodGhpcy5vcmlnSGl0JiYoZT14KHRoaXMub3JpZ0hpdCxlKXx8ZSksaT1JKGUpKSx0aGlzLmNvb3JkQWRqdXN0PWsoaSxuKSk6KHRoaXMub3JpZ0hpdD1udWxsLHRoaXMuY29vcmRBZGp1c3Q9bnVsbCksaGUucHJvdG90eXBlLmhhbmRsZUludGVyYWN0aW9uU3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjb21wdXRlQ29vcmRzOmZ1bmN0aW9uKCl7dGhpcy5jb21wb25lbnQucHJlcGFyZUhpdHMoKSx0aGlzLmNvbXB1dGVTY3JvbGxCb3VuZHMoKX0saGFuZGxlRHJhZ1N0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBlO2hlLnByb3RvdHlwZS5oYW5kbGVEcmFnU3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dGhpcy5xdWVyeUhpdCh3KHQpLEUodCkpLGUmJnRoaXMuaGFuZGxlSGl0T3ZlcihlKX0saGFuZGxlRHJhZzpmdW5jdGlvbih0LGUsbil7dmFyIGk7aGUucHJvdG90eXBlLmhhbmRsZURyYWcuYXBwbHkodGhpcyxhcmd1bWVudHMpLGk9dGhpcy5xdWVyeUhpdCh3KG4pLEUobikpLGJ0KGksdGhpcy5oaXQpfHwodGhpcy5oaXQmJnRoaXMuaGFuZGxlSGl0T3V0KCksaSYmdGhpcy5oYW5kbGVIaXRPdmVyKGkpKX0saGFuZGxlRHJhZ0VuZDpmdW5jdGlvbigpe3RoaXMuaGFuZGxlSGl0RG9uZSgpLGhlLnByb3RvdHlwZS5oYW5kbGVEcmFnRW5kLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saGFuZGxlSGl0T3ZlcjpmdW5jdGlvbih0KXt2YXIgZT1idCh0LHRoaXMub3JpZ0hpdCk7dGhpcy5oaXQ9dCx0aGlzLnRyaWdnZXIoImhpdE92ZXIiLHRoaXMuaGl0LGUsdGhpcy5vcmlnSGl0KX0saGFuZGxlSGl0T3V0OmZ1bmN0aW9uKCl7dGhpcy5oaXQmJih0aGlzLnRyaWdnZXIoImhpdE91dCIsdGhpcy5oaXQpLHRoaXMuaGFuZGxlSGl0RG9uZSgpLHRoaXMuaGl0PW51bGwpfSxoYW5kbGVIaXREb25lOmZ1bmN0aW9uKCl7dGhpcy5oaXQmJnRoaXMudHJpZ2dlcigiaGl0RG9uZSIsdGhpcy5oaXQpfSxoYW5kbGVJbnRlcmFjdGlvbkVuZDpmdW5jdGlvbigpe2hlLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvbkVuZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5vcmlnSGl0PW51bGwsdGhpcy5oaXQ9bnVsbCx0aGlzLmNvbXBvbmVudC5yZWxlYXNlSGl0cygpfSxoYW5kbGVTY3JvbGxFbmQ6ZnVuY3Rpb24oKXtoZS5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsRW5kLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNvbXB1dGVDb29yZHMoKX0scXVlcnlIaXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb29yZEFkanVzdCYmKHQrPXRoaXMuY29vcmRBZGp1c3QubGVmdCxlKz10aGlzLmNvb3JkQWRqdXN0LnRvcCksdGhpcy5jb21wb25lbnQucXVlcnlIaXQodCxlKX19KSxnZT13dC5leHRlbmQoYWUse29wdGlvbnM6bnVsbCxzb3VyY2VFbDpudWxsLGVsOm51bGwscGFyZW50RWw6bnVsbCx0b3AwOm51bGwsbGVmdDA6bnVsbCx5MDpudWxsLHgwOm51bGwsdG9wRGVsdGE6bnVsbCxsZWZ0RGVsdGE6bnVsbCxpc0ZvbGxvd2luZzohMSxpc0hpZGRlbjohMSxpc0FuaW1hdGluZzohMSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLG4pe3RoaXMub3B0aW9ucz1uPW58fHt9LHRoaXMuc291cmNlRWw9ZSx0aGlzLnBhcmVudEVsPW4ucGFyZW50RWw/dChuLnBhcmVudEVsKTplLnBhcmVudCgpfSxzdGFydDpmdW5jdGlvbihlKXt0aGlzLmlzRm9sbG93aW5nfHwodGhpcy5pc0ZvbGxvd2luZz0hMCx0aGlzLnkwPUUoZSksdGhpcy54MD13KGUpLHRoaXMudG9wRGVsdGE9MCx0aGlzLmxlZnREZWx0YT0wLHRoaXMuaXNIaWRkZW58fHRoaXMudXBkYXRlUG9zaXRpb24oKSxEKGUpP3RoaXMubGlzdGVuVG8odChkb2N1bWVudCksInRvdWNobW92ZSIsdGhpcy5oYW5kbGVNb3ZlKTp0aGlzLmxpc3RlblRvKHQoZG9jdW1lbnQpLCJtb3VzZW1vdmUiLHRoaXMuaGFuZGxlTW92ZSkpfSxzdG9wOmZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaSgpe3IuaXNBbmltYXRpbmc9ITEsci5yZW1vdmVFbGVtZW50KCksci50b3AwPXIubGVmdDA9bnVsbCxuJiZuKCl9dmFyIHI9dGhpcyxzPXRoaXMub3B0aW9ucy5yZXZlcnREdXJhdGlvbjt0aGlzLmlzRm9sbG93aW5nJiYhdGhpcy5pc0FuaW1hdGluZyYmKHRoaXMuaXNGb2xsb3dpbmc9ITEsdGhpcy5zdG9wTGlzdGVuaW5nVG8odChkb2N1bWVudCkpLGUmJnMmJiF0aGlzLmlzSGlkZGVuPyh0aGlzLmlzQW5pbWF0aW5nPSEwLHRoaXMuZWwuYW5pbWF0ZSh7dG9wOnRoaXMudG9wMCxsZWZ0OnRoaXMubGVmdDB9LHtkdXJhdGlvbjpzLGNvbXBsZXRlOml9KSk6aSgpKX0sZ2V0RWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsO3JldHVybiB0fHwodD10aGlzLmVsPXRoaXMuc291cmNlRWwuY2xvbmUoKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWRkaXRpb25hbENsYXNzfHwiIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6IiIsZGlzcGxheTp0aGlzLmlzSGlkZGVuPyJub25lIjoiIixtYXJnaW46MCxyaWdodDoiYXV0byIsYm90dG9tOiJhdXRvIix3aWR0aDp0aGlzLnNvdXJjZUVsLndpZHRoKCksaGVpZ2h0OnRoaXMuc291cmNlRWwuaGVpZ2h0KCksb3BhY2l0eTp0aGlzLm9wdGlvbnMub3BhY2l0eXx8IiIsekluZGV4OnRoaXMub3B0aW9ucy56SW5kZXh9KSx0LmFkZENsYXNzKCJmYy11bnNlbGVjdGFibGUiKSx0LmFwcGVuZFRvKHRoaXMucGFyZW50RWwpKSx0fSxyZW1vdmVFbGVtZW50OmZ1bmN0aW9uKCl7dGhpcy5lbCYmKHRoaXMuZWwucmVtb3ZlKCksdGhpcy5lbD1udWxsKX0sdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdCxlO3RoaXMuZ2V0RWwoKSxudWxsPT09dGhpcy50b3AwJiYodD10aGlzLnNvdXJjZUVsLm9mZnNldCgpLGU9dGhpcy5lbC5vZmZzZXRQYXJlbnQoKS5vZmZzZXQoKSx0aGlzLnRvcDA9dC50b3AtZS50b3AsdGhpcy5sZWZ0MD10LmxlZnQtZS5sZWZ0KSx0aGlzLmVsLmNzcyh7dG9wOnRoaXMudG9wMCt0aGlzLnRvcERlbHRhLGxlZnQ6dGhpcy5sZWZ0MCt0aGlzLmxlZnREZWx0YX0pfSxoYW5kbGVNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMudG9wRGVsdGE9RSh0KS10aGlzLnkwLHRoaXMubGVmdERlbHRhPXcodCktdGhpcy54MCx0aGlzLmlzSGlkZGVufHx0aGlzLnVwZGF0ZVBvc2l0aW9uKCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmlzSGlkZGVufHwodGhpcy5pc0hpZGRlbj0hMCx0aGlzLmVsJiZ0aGlzLmVsLmhpZGUoKSl9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLmlzSGlkZGVuJiYodGhpcy5pc0hpZGRlbj0hMSx0aGlzLnVwZGF0ZVBvc2l0aW9uKCksdGhpcy5nZXRFbCgpLnNob3coKSl9fSkscGU9anQuR3JpZD13dC5leHRlbmQoYWUsdWUse2hhc0RheUludGVyYWN0aW9uczohMCx2aWV3Om51bGwsaXNSVEw6bnVsbCxzdGFydDpudWxsLGVuZDpudWxsLGVsOm51bGwsZWxzQnlGaWxsOm51bGwsZXZlbnRUaW1lRm9ybWF0Om51bGwsZGlzcGxheUV2ZW50VGltZTpudWxsLGRpc3BsYXlFdmVudEVuZDpudWxsLG1pblJlc2l6ZUR1cmF0aW9uOm51bGwsbGFyZ2VVbml0Om51bGwsZGF5RHJhZ0xpc3RlbmVyOm51bGwsc2VnRHJhZ0xpc3RlbmVyOm51bGwsc2VnUmVzaXplTGlzdGVuZXI6bnVsbCxleHRlcm5hbERyYWdMaXN0ZW5lcjpudWxsLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQpe3RoaXMudmlldz10LHRoaXMuaXNSVEw9dC5vcHQoImlzUlRMIiksdGhpcy5lbHNCeUZpbGw9e30sdGhpcy5kYXlEcmFnTGlzdGVuZXI9dGhpcy5idWlsZERheURyYWdMaXN0ZW5lcigpLHRoaXMuaW5pdE1vdXNlSWdub3JpbmcoKX0sY29tcHV0ZUV2ZW50VGltZUZvcm1hdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcub3B0KCJzbWFsbFRpbWVGb3JtYXQiKX0sY29tcHV0ZURpc3BsYXlFdmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29tcHV0ZURpc3BsYXlFdmVudEVuZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZXRSYW5nZTpmdW5jdGlvbih0KXt0aGlzLnN0YXJ0PXQuc3RhcnQuY2xvbmUoKSx0aGlzLmVuZD10LmVuZC5jbG9uZSgpLHRoaXMucmFuZ2VVcGRhdGVkKCksdGhpcy5wcm9jZXNzUmFuZ2VPcHRpb25zKCl9LHJhbmdlVXBkYXRlZDpmdW5jdGlvbigpe30scHJvY2Vzc1JhbmdlT3B0aW9uczpmdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLnZpZXc7dGhpcy5ldmVudFRpbWVGb3JtYXQ9bi5vcHQoImV2ZW50VGltZUZvcm1hdCIpfHxuLm9wdCgidGltZUZvcm1hdCIpfHx0aGlzLmNvbXB1dGVFdmVudFRpbWVGb3JtYXQoKSx0PW4ub3B0KCJkaXNwbGF5RXZlbnRUaW1lIiksbnVsbD09dCYmKHQ9dGhpcy5jb21wdXRlRGlzcGxheUV2ZW50VGltZSgpKSxlPW4ub3B0KCJkaXNwbGF5RXZlbnRFbmQiKSxudWxsPT1lJiYoZT10aGlzLmNvbXB1dGVEaXNwbGF5RXZlbnRFbmQoKSksdGhpcy5kaXNwbGF5RXZlbnRUaW1lPXQsdGhpcy5kaXNwbGF5RXZlbnRFbmQ9ZX0sc3BhblRvU2VnczpmdW5jdGlvbih0KXt9LGRpZmZEYXRlczpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxhcmdlVW5pdD9BKHQsZSx0aGlzLmxhcmdlVW5pdCk6Tih0LGUpfSxwcmVwYXJlSGl0czpmdW5jdGlvbigpe30scmVsZWFzZUhpdHM6ZnVuY3Rpb24oKXt9LHF1ZXJ5SGl0OmZ1bmN0aW9uKHQsZSl7fSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe30sZ2V0SGl0RWw6ZnVuY3Rpb24odCl7fSxzZXRFbGVtZW50OmZ1bmN0aW9uKHQpe3RoaXMuZWw9dCx0aGlzLmhhc0RheUludGVyYWN0aW9ucyYmKGIodCksdGhpcy5iaW5kRGF5SGFuZGxlcigidG91Y2hzdGFydCIsdGhpcy5kYXlUb3VjaFN0YXJ0KSx0aGlzLmJpbmREYXlIYW5kbGVyKCJtb3VzZWRvd24iLHRoaXMuZGF5TW91c2Vkb3duKSksdGhpcy5iaW5kU2VnSGFuZGxlcnMoKSx0aGlzLmJpbmRHbG9iYWxIYW5kbGVycygpfSxiaW5kRGF5SGFuZGxlcjpmdW5jdGlvbihlLG4pe3ZhciBpPXRoaXM7dGhpcy5lbC5vbihlLGZ1bmN0aW9uKGUpe2lmKCF0KGUudGFyZ2V0KS5pcyhpLnNlZ1NlbGVjdG9yKyIsIitpLnNlZ1NlbGVjdG9yKyIgKiwuZmMtbW9yZSxhW2RhdGEtZ290b10iKSlyZXR1cm4gbi5jYWxsKGksZSl9KX0scmVtb3ZlRWxlbWVudDpmdW5jdGlvbigpe3RoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKSx0aGlzLmNsZWFyRHJhZ0xpc3RlbmVycygpLHRoaXMuZWwucmVtb3ZlKCl9LHJlbmRlclNrZWxldG9uOmZ1bmN0aW9uKCl7fSxyZW5kZXJEYXRlczpmdW5jdGlvbigpe30sdW5yZW5kZXJEYXRlczpmdW5jdGlvbigpe30sYmluZEdsb2JhbEhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5Ubyh0KGRvY3VtZW50KSx7ZHJhZ3N0YXJ0OnRoaXMuZXh0ZXJuYWxEcmFnU3RhcnQsc29ydHN0YXJ0OnRoaXMuZXh0ZXJuYWxEcmFnU3RhcnR9KX0sdW5iaW5kR2xvYmFsSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0KGRvY3VtZW50KSl9LGRheU1vdXNlZG93bjpmdW5jdGlvbih0KXt0aGlzLmlzSWdub3JpbmdNb3VzZXx8dGhpcy5kYXlEcmFnTGlzdGVuZXIuc3RhcnRJbnRlcmFjdGlvbih0LHt9KX0sZGF5VG91Y2hTdGFydDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpZXc7KGUuaXNTZWxlY3RlZHx8ZS5zZWxlY3RlZEV2ZW50KSYmdGhpcy50ZW1wSWdub3JlTW91c2UoKSx0aGlzLmRheURyYWdMaXN0ZW5lci5zdGFydEludGVyYWN0aW9uKHQse2RlbGF5OnRoaXMudmlldy5vcHQoImxvbmdQcmVzc0RlbGF5Iil9KX0sYnVpbGREYXlEcmFnTGlzdGVuZXI6ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxpPXRoaXMudmlldyxyPWkub3B0KCJzZWxlY3RhYmxlIiksbD1uZXcgZmUodGhpcyx7c2Nyb2xsOmkub3B0KCJkcmFnU2Nyb2xsIiksaW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbigpe3Q9bC5vcmlnSGl0LGU9bnVsbH0sZHJhZ1N0YXJ0OmZ1bmN0aW9uKCl7aS51bnNlbGVjdCgpfSxoaXRPdmVyOmZ1bmN0aW9uKGksbyxsKXtsJiYob3x8KHQ9bnVsbCksciYmKGU9bi5jb21wdXRlU2VsZWN0aW9uKG4uZ2V0SGl0U3BhbihsKSxuLmdldEhpdFNwYW4oaSkpLGU/bi5yZW5kZXJTZWxlY3Rpb24oZSk6ZT09PSExJiZzKCkpKX0saGl0T3V0OmZ1bmN0aW9uKCl7dD1udWxsLGU9bnVsbCxuLnVucmVuZGVyU2VsZWN0aW9uKCl9LGhpdERvbmU6ZnVuY3Rpb24oKXtvKCl9LGludGVyYWN0aW9uRW5kOmZ1bmN0aW9uKHIscyl7c3x8KHQmJiFuLmlzSWdub3JpbmdNb3VzZSYmaS50cmlnZ2VyRGF5Q2xpY2sobi5nZXRIaXRTcGFuKHQpLG4uZ2V0SGl0RWwodCksciksZSYmaS5yZXBvcnRTZWxlY3Rpb24oZSxyKSl9fSk7cmV0dXJuIGx9LGNsZWFyRHJhZ0xpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuZGF5RHJhZ0xpc3RlbmVyLmVuZEludGVyYWN0aW9uKCksdGhpcy5zZWdEcmFnTGlzdGVuZXImJnRoaXMuc2VnRHJhZ0xpc3RlbmVyLmVuZEludGVyYWN0aW9uKCksdGhpcy5zZWdSZXNpemVMaXN0ZW5lciYmdGhpcy5zZWdSZXNpemVMaXN0ZW5lci5lbmRJbnRlcmFjdGlvbigpLHRoaXMuZXh0ZXJuYWxEcmFnTGlzdGVuZXImJnRoaXMuZXh0ZXJuYWxEcmFnTGlzdGVuZXIuZW5kSW50ZXJhY3Rpb24oKX0scmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZmFicmljYXRlSGVscGVyRXZlbnQodCxlKTtyZXR1cm4gdGhpcy5yZW5kZXJIZWxwZXIobixlKX0sZmFicmljYXRlSGVscGVyRXZlbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1lP1ooZS5ldmVudCk6e307cmV0dXJuIG4uc3RhcnQ9dC5zdGFydC5jbG9uZSgpLG4uZW5kPXQuZW5kP3QuZW5kLmNsb25lKCk6bnVsbCxuLmFsbERheT1udWxsLHRoaXMudmlldy5jYWxlbmRhci5ub3JtYWxpemVFdmVudERhdGVzKG4pLG4uY2xhc3NOYW1lPShuLmNsYXNzTmFtZXx8W10pLmNvbmNhdCgiZmMtaGVscGVyIiksZXx8KG4uZWRpdGFibGU9ITEpLG59LHJlbmRlckhlbHBlcjpmdW5jdGlvbih0LGUpe30sdW5yZW5kZXJIZWxwZXI6ZnVuY3Rpb24oKXt9LHJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbih0KXt0aGlzLnJlbmRlckhpZ2hsaWdodCh0KX0sdW5yZW5kZXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCl9LGNvbXB1dGVTZWxlY3Rpb246ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbXB1dGVTZWxlY3Rpb25TcGFuKHQsZSk7cmV0dXJuIShuJiYhdGhpcy52aWV3LmNhbGVuZGFyLmlzU2VsZWN0aW9uU3BhbkFsbG93ZWQobikpJiZufSxjb21wdXRlU2VsZWN0aW9uU3BhbjpmdW5jdGlvbih0LGUpe3ZhciBuPVt0LnN0YXJ0LHQuZW5kLGUuc3RhcnQsZS5lbmRdO3JldHVybiBuLnNvcnQoc3QpLHtzdGFydDpuWzBdLmNsb25lKCksZW5kOm5bM10uY2xvbmUoKX19LHJlbmRlckhpZ2hsaWdodDpmdW5jdGlvbih0KXt0aGlzLnJlbmRlckZpbGwoImhpZ2hsaWdodCIsdGhpcy5zcGFuVG9TZWdzKHQpKX0sdW5yZW5kZXJIaWdobGlnaHQ6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyRmlsbCgiaGlnaGxpZ2h0Iil9LGhpZ2hsaWdodFNlZ0NsYXNzZXM6ZnVuY3Rpb24oKXtyZXR1cm5bImZjLWhpZ2hsaWdodCJdfSxyZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7fSx1bnJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt9LGdldE5vd0luZGljYXRvclVuaXQ6ZnVuY3Rpb24oKXt9LHJlbmRlck5vd0luZGljYXRvcjpmdW5jdGlvbih0KXt9LHVucmVuZGVyTm93SW5kaWNhdG9yOmZ1bmN0aW9uKCl7fSxyZW5kZXJGaWxsOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckZpbGw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbHNCeUZpbGxbdF07ZSYmKGUucmVtb3ZlKCksZGVsZXRlIHRoaXMuZWxzQnlGaWxsW3RdKX0scmVuZGVyRmlsbFNlZ0VsczpmdW5jdGlvbihlLG4pe3ZhciBpLHI9dGhpcyxzPXRoaXNbZSsiU2VnRWwiXSxvPSIiLGw9W107aWYobi5sZW5ndGgpe2ZvcihpPTA7aTxuLmxlbmd0aDtpKyspbys9dGhpcy5maWxsU2VnSHRtbChlLG5baV0pO3QobykuZWFjaChmdW5jdGlvbihlLGkpe3ZhciBvPW5bZV0sYT10KGkpO3MmJihhPXMuY2FsbChyLG8sYSkpLGEmJihhPXQoYSksYS5pcyhyLmZpbGxTZWdUYWcpJiYoby5lbD1hLGwucHVzaChvKSkpfSl9cmV0dXJuIGx9LGZpbGxTZWdUYWc6ImRpdiIsZmlsbFNlZ0h0bWw6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzW3QrIlNlZ0NsYXNzZXMiXSxpPXRoaXNbdCsiU2VnQ3NzIl0scj1uP24uY2FsbCh0aGlzLGUpOltdLHM9bnQoaT9pLmNhbGwodGhpcyxlKTp7fSk7cmV0dXJuIjwiK3RoaXMuZmlsbFNlZ1RhZysoci5sZW5ndGg/JyBjbGFzcz0iJytyLmpvaW4oIiAiKSsnIic6IiIpKyhzPycgc3R5bGU9IicrcysnIic6IiIpKyIgLz4ifSxnZXREYXlDbGFzc2VzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlldyxuPWUuY2FsZW5kYXIuZ2V0Tm93KCksaT1bImZjLSIrJHRbdC5kYXkoKV1dO3JldHVybiAxPT1lLmludGVydmFsRHVyYXRpb24uYXMoIm1vbnRocyIpJiZ0Lm1vbnRoKCkhPWUuaW50ZXJ2YWxTdGFydC5tb250aCgpJiZpLnB1c2goImZjLW90aGVyLW1vbnRoIiksdC5pc1NhbWUobiwiZGF5Iik/aS5wdXNoKCJmYy10b2RheSIsZS5oaWdobGlnaHRTdGF0ZUNsYXNzKTp0PG4/aS5wdXNoKCJmYy1wYXN0Iik6aS5wdXNoKCJmYy1mdXR1cmUiKSxpfX0pO3BlLm1peGluKHtzZWdTZWxlY3RvcjoiLmZjLWV2ZW50LWNvbnRhaW5lciA+ICoiLG1vdXNlZE92ZXJTZWc6bnVsbCxpc0RyYWdnaW5nU2VnOiExLGlzUmVzaXppbmdTZWc6ITEsaXNEcmFnZ2luZ0V4dGVybmFsOiExLHNlZ3M6bnVsbCxyZW5kZXJFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGUsbj1bXSxpPVtdO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspKFR0KHRbZV0pP246aSkucHVzaCh0W2VdKTt0aGlzLnNlZ3M9W10uY29uY2F0KHRoaXMucmVuZGVyQmdFdmVudHMobiksdGhpcy5yZW5kZXJGZ0V2ZW50cyhpKSl9LHJlbmRlckJnRXZlbnRzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZXZlbnRzVG9TZWdzKHQpO3JldHVybiB0aGlzLnJlbmRlckJnU2VncyhlKXx8ZX0scmVuZGVyRmdFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ldmVudHNUb1NlZ3ModCk7cmV0dXJuIHRoaXMucmVuZGVyRmdTZWdzKGUpfHxlfSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe3RoaXMuaGFuZGxlU2VnTW91c2VvdXQoKSx0aGlzLmNsZWFyRHJhZ0xpc3RlbmVycygpLHRoaXMudW5yZW5kZXJGZ1NlZ3MoKSx0aGlzLnVucmVuZGVyQmdTZWdzKCksdGhpcy5zZWdzPW51bGx9LGdldEV2ZW50U2VnczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlZ3N8fFtdfSxyZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24odCl7fSx1bnJlbmRlckZnU2VnczpmdW5jdGlvbigpe30scmVuZGVyRmdTZWdFbHM6ZnVuY3Rpb24oZSxuKXt2YXIgaSxyPXRoaXMudmlldyxzPSIiLG89W107aWYoZS5sZW5ndGgpe2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspcys9dGhpcy5mZ1NlZ0h0bWwoZVtpXSxuKTt0KHMpLmVhY2goZnVuY3Rpb24obixpKXt2YXIgcz1lW25dLGw9ci5yZXNvbHZlRXZlbnRFbChzLmV2ZW50LHQoaSkpO2wmJihsLmRhdGEoImZjLXNlZyIscykscy5lbD1sLG8ucHVzaChzKSl9KX1yZXR1cm4gb30sZmdTZWdIdG1sOmZ1bmN0aW9uKHQsZSl7fSxyZW5kZXJCZ1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVuZGVyRmlsbCgiYmdFdmVudCIsdCl9LHVucmVuZGVyQmdTZWdzOmZ1bmN0aW9uKCl7dGhpcy51bnJlbmRlckZpbGwoImJnRXZlbnQiKX0sYmdFdmVudFNlZ0VsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudmlldy5yZXNvbHZlRXZlbnRFbCh0LmV2ZW50LGUpfSxiZ0V2ZW50U2VnQ2xhc3NlczpmdW5jdGlvbih0KXt2YXIgZT10LmV2ZW50LG49ZS5zb3VyY2V8fHt9O3JldHVyblsiZmMtYmdldmVudCJdLmNvbmNhdChlLmNsYXNzTmFtZSxuLmNsYXNzTmFtZXx8W10pfSxiZ0V2ZW50U2VnQ3NzOmZ1bmN0aW9uKHQpe3JldHVybnsiYmFja2dyb3VuZC1jb2xvciI6dGhpcy5nZXRTZWdTa2luQ3NzKHQpWyJiYWNrZ3JvdW5kLWNvbG9yIl19fSxidXNpbmVzc0hvdXJzU2VnQ2xhc3NlczpmdW5jdGlvbih0KXtyZXR1cm5bImZjLW5vbmJ1c2luZXNzIiwiZmMtYmdldmVudCJdfSxidWlsZEJ1c2luZXNzSG91clNlZ3M6ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy52aWV3LmNhbGVuZGFyLmdldEN1cnJlbnRCdXNpbmVzc0hvdXJFdmVudHMoZSk7cmV0dXJuIW4ubGVuZ3RoJiZ0aGlzLnZpZXcuY2FsZW5kYXIub3B0aW9ucy5idXNpbmVzc0hvdXJzJiYobj1bdC5leHRlbmQoe30sUmUse3N0YXJ0OnRoaXMudmlldy5lbmQsZW5kOnRoaXMudmlldy5lbmQsZG93Om51bGx9KV0pLHRoaXMuZXZlbnRzVG9TZWdzKG4pfSxiaW5kU2VnSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLmJpbmRTZWdIYW5kbGVyc1RvRWwodGhpcy5lbCl9LGJpbmRTZWdIYW5kbGVyc1RvRWw6ZnVuY3Rpb24odCl7dGhpcy5iaW5kU2VnSGFuZGxlclRvRWwodCwidG91Y2hzdGFydCIsdGhpcy5oYW5kbGVTZWdUb3VjaFN0YXJ0KSx0aGlzLmJpbmRTZWdIYW5kbGVyVG9FbCh0LCJ0b3VjaGVuZCIsdGhpcy5oYW5kbGVTZWdUb3VjaEVuZCksdGhpcy5iaW5kU2VnSGFuZGxlclRvRWwodCwibW91c2VlbnRlciIsdGhpcy5oYW5kbGVTZWdNb3VzZW92ZXIpLHRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKHQsIm1vdXNlbGVhdmUiLHRoaXMuaGFuZGxlU2VnTW91c2VvdXQpLHRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKHQsIm1vdXNlZG93biIsdGhpcy5oYW5kbGVTZWdNb3VzZWRvd24pLHRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKHQsImNsaWNrIix0aGlzLmhhbmRsZVNlZ0NsaWNrKX0sYmluZFNlZ0hhbmRsZXJUb0VsOmZ1bmN0aW9uKGUsbixpKXt2YXIgcj10aGlzO2Uub24obix0aGlzLnNlZ1NlbGVjdG9yLGZ1bmN0aW9uKGUpe3ZhciBuPXQodGhpcykuZGF0YSgiZmMtc2VnIik7aWYobiYmIXIuaXNEcmFnZ2luZ1NlZyYmIXIuaXNSZXNpemluZ1NlZylyZXR1cm4gaS5jYWxsKHIsbixlKX0pfSxoYW5kbGVTZWdDbGljazpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudmlldy50cmlnZ2VyKCJldmVudENsaWNrIix0LmVsWzBdLHQuZXZlbnQsZSk7bj09PSExJiZlLnByZXZlbnREZWZhdWx0KCl9LGhhbmRsZVNlZ01vdXNlb3ZlcjpmdW5jdGlvbih0LGUpe3RoaXMuaXNJZ25vcmluZ01vdXNlfHx0aGlzLm1vdXNlZE92ZXJTZWd8fCh0aGlzLm1vdXNlZE92ZXJTZWc9dCx0aGlzLnZpZXcuaXNFdmVudFJlc2l6YWJsZSh0LmV2ZW50KSYmdC5lbC5hZGRDbGFzcygiZmMtYWxsb3ctbW91c2UtcmVzaXplIiksdGhpcy52aWV3LnRyaWdnZXIoImV2ZW50TW91c2VvdmVyIix0LmVsWzBdLHQuZXZlbnQsZSkpfSxoYW5kbGVTZWdNb3VzZW91dDpmdW5jdGlvbih0LGUpe2U9ZXx8e30sdGhpcy5tb3VzZWRPdmVyU2VnJiYodD10fHx0aGlzLm1vdXNlZE92ZXJTZWcsdGhpcy5tb3VzZWRPdmVyU2VnPW51bGwsdGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGUodC5ldmVudCkmJnQuZWwucmVtb3ZlQ2xhc3MoImZjLWFsbG93LW1vdXNlLXJlc2l6ZSIpLHRoaXMudmlldy50cmlnZ2VyKCJldmVudE1vdXNlb3V0Iix0LmVsWzBdLHQuZXZlbnQsZSkpfSxoYW5kbGVTZWdNb3VzZWRvd246ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnN0YXJ0U2VnUmVzaXplKHQsZSx7ZGlzdGFuY2U6NX0pOyFuJiZ0aGlzLnZpZXcuaXNFdmVudERyYWdnYWJsZSh0LmV2ZW50KSYmdGhpcy5idWlsZFNlZ0RyYWdMaXN0ZW5lcih0KS5zdGFydEludGVyYWN0aW9uKGUse2Rpc3RhbmNlOjV9KX0saGFuZGxlU2VnVG91Y2hTdGFydDpmdW5jdGlvbih0LGUpe3ZhciBuLGk9dGhpcy52aWV3LHI9dC5ldmVudCxzPWkuaXNFdmVudFNlbGVjdGVkKHIpLG89aS5pc0V2ZW50RHJhZ2dhYmxlKHIpLGw9aS5pc0V2ZW50UmVzaXphYmxlKHIpLGE9ITE7cyYmbCYmKGE9dGhpcy5zdGFydFNlZ1Jlc2l6ZSh0LGUpKSxhfHwhbyYmIWx8fChuPW8/dGhpcy5idWlsZFNlZ0RyYWdMaXN0ZW5lcih0KTp0aGlzLmJ1aWxkU2VnU2VsZWN0TGlzdGVuZXIodCksbi5zdGFydEludGVyYWN0aW9uKGUse2RlbGF5OnM/MDp0aGlzLnZpZXcub3B0KCJsb25nUHJlc3NEZWxheSIpfSkpLHRoaXMudGVtcElnbm9yZU1vdXNlKCl9LGhhbmRsZVNlZ1RvdWNoRW5kOmZ1bmN0aW9uKHQsZSl7dGhpcy50ZW1wSWdub3JlTW91c2UoKX0sc3RhcnRTZWdSZXNpemU6ZnVuY3Rpb24oZSxuLGkpe3JldHVybiEhdChuLnRhcmdldCkuaXMoIi5mYy1yZXNpemVyIikmJih0aGlzLmJ1aWxkU2VnUmVzaXplTGlzdGVuZXIoZSx0KG4udGFyZ2V0KS5pcygiLmZjLXN0YXJ0LXJlc2l6ZXIiKSkuc3RhcnRJbnRlcmFjdGlvbihuLGkpLCEwKX0sYnVpbGRTZWdEcmFnTGlzdGVuZXI6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHI9dGhpcyxsPXRoaXMudmlldyxhPWwuY2FsZW5kYXIsdT10LmVsLGQ9dC5ldmVudDtpZih0aGlzLnNlZ0RyYWdMaXN0ZW5lcilyZXR1cm4gdGhpcy5zZWdEcmFnTGlzdGVuZXI7dmFyIGM9dGhpcy5zZWdEcmFnTGlzdGVuZXI9bmV3IGZlKGwse3Njcm9sbDpsLm9wdCgiZHJhZ1Njcm9sbCIpLHN1YmplY3RFbDp1LHN1YmplY3RDZW50ZXI6ITAsaW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbihpKXt0LmNvbXBvbmVudD1yLGU9ITEsbj1uZXcgZ2UodC5lbCx7YWRkaXRpb25hbENsYXNzOiJmYy1kcmFnZ2luZyIscGFyZW50RWw6bC5lbCxvcGFjaXR5OmMuaXNUb3VjaD9udWxsOmwub3B0KCJkcmFnT3BhY2l0eSIpLHJldmVydER1cmF0aW9uOmwub3B0KCJkcmFnUmV2ZXJ0RHVyYXRpb24iKSx6SW5kZXg6Mn0pLG4uaGlkZSgpLG4uc3RhcnQoaSl9LGRyYWdTdGFydDpmdW5jdGlvbihuKXtjLmlzVG91Y2gmJiFsLmlzRXZlbnRTZWxlY3RlZChkKSYmbC5zZWxlY3RFdmVudChkKSxlPSEwLHIuaGFuZGxlU2VnTW91c2VvdXQodCxuKSxyLnNlZ0RyYWdTdGFydCh0LG4pLGwuaGlkZUV2ZW50KGQpfSxoaXRPdmVyOmZ1bmN0aW9uKGUsbyx1KXt2YXIgaDt0LmhpdCYmKHU9dC5oaXQpLGk9ci5jb21wdXRlRXZlbnREcm9wKHUuY29tcG9uZW50LmdldEhpdFNwYW4odSksZS5jb21wb25lbnQuZ2V0SGl0U3BhbihlKSxkKSxpJiYhYS5pc0V2ZW50U3BhbkFsbG93ZWQoci5ldmVudFRvU3BhbihpKSxkKSYmKHMoKSxpPW51bGwpLGkmJihoPWwucmVuZGVyRHJhZyhpLHQpKT8oaC5hZGRDbGFzcygiZmMtZHJhZ2dpbmciKSxjLmlzVG91Y2h8fHIuYXBwbHlEcmFnT3BhY2l0eShoKSxuLmhpZGUoKSk6bi5zaG93KCksbyYmKGk9bnVsbCl9LGhpdE91dDpmdW5jdGlvbigpe2wudW5yZW5kZXJEcmFnKCksbi5zaG93KCksaT1udWxsfSxoaXREb25lOmZ1bmN0aW9uKCl7bygpfSxpbnRlcmFjdGlvbkVuZDpmdW5jdGlvbihzKXtkZWxldGUgdC5jb21wb25lbnQsbi5zdG9wKCFpLGZ1bmN0aW9uKCl7ZSYmKGwudW5yZW5kZXJEcmFnKCksbC5zaG93RXZlbnQoZCksci5zZWdEcmFnU3RvcCh0LHMpKSxpJiZsLnJlcG9ydEV2ZW50RHJvcChkLGksdGhpcy5sYXJnZVVuaXQsdSxzKX0pLHIuc2VnRHJhZ0xpc3RlbmVyPW51bGx9fSk7cmV0dXJuIGN9LGJ1aWxkU2VnU2VsZWN0TGlzdGVuZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMudmlldyxpPXQuZXZlbnQ7aWYodGhpcy5zZWdEcmFnTGlzdGVuZXIpcmV0dXJuIHRoaXMuc2VnRHJhZ0xpc3RlbmVyO3ZhciByPXRoaXMuc2VnRHJhZ0xpc3RlbmVyPW5ldyBoZSh7ZHJhZ1N0YXJ0OmZ1bmN0aW9uKHQpe3IuaXNUb3VjaCYmIW4uaXNFdmVudFNlbGVjdGVkKGkpJiZuLnNlbGVjdEV2ZW50KGkpfSxpbnRlcmFjdGlvbkVuZDpmdW5jdGlvbih0KXtlLnNlZ0RyYWdMaXN0ZW5lcj1udWxsfX0pO3JldHVybiByfSxzZWdEcmFnU3RhcnQ6ZnVuY3Rpb24odCxlKXt0aGlzLmlzRHJhZ2dpbmdTZWc9ITAsdGhpcy52aWV3LnRyaWdnZXIoImV2ZW50RHJhZ1N0YXJ0Iix0LmVsWzBdLHQuZXZlbnQsZSx7fSl9LHNlZ0RyYWdTdG9wOmZ1bmN0aW9uKHQsZSl7dGhpcy5pc0RyYWdnaW5nU2VnPSExLHRoaXMudmlldy50cmlnZ2VyKCJldmVudERyYWdTdG9wIix0LmVsWzBdLHQuZXZlbnQsZSx7fSl9LGNvbXB1dGVFdmVudERyb3A6ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIscz10aGlzLnZpZXcuY2FsZW5kYXIsbz10LnN0YXJ0LGw9ZS5zdGFydDtyZXR1cm4gby5oYXNUaW1lKCk9PT1sLmhhc1RpbWUoKT8oaT10aGlzLmRpZmZEYXRlcyhsLG8pLG4uYWxsRGF5JiZXKGkpPyhyPXtzdGFydDpuLnN0YXJ0LmNsb25lKCksZW5kOnMuZ2V0RXZlbnRFbmQobiksYWxsRGF5OiExfSxzLm5vcm1hbGl6ZUV2ZW50VGltZXMocikpOnI9SHQobiksci5zdGFydC5hZGQoaSksci5lbmQmJnIuZW5kLmFkZChpKSk6cj17c3RhcnQ6bC5jbG9uZSgpLGVuZDpudWxsLGFsbERheTohbC5oYXNUaW1lKCl9LHJ9LGFwcGx5RHJhZ09wYWNpdHk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aWV3Lm9wdCgiZHJhZ09wYWNpdHkiKTtudWxsIT1lJiZ0LmNzcygib3BhY2l0eSIsZSl9LGV4dGVybmFsRHJhZ1N0YXJ0OmZ1bmN0aW9uKGUsbil7dmFyIGkscixzPXRoaXMudmlldztzLm9wdCgiZHJvcHBhYmxlIikmJihpPXQoKG4/bi5pdGVtOm51bGwpfHxlLnRhcmdldCkscj1zLm9wdCgiZHJvcEFjY2VwdCIpLCh0LmlzRnVuY3Rpb24ocik/ci5jYWxsKGlbMF0saSk6aS5pcyhyKSkmJih0aGlzLmlzRHJhZ2dpbmdFeHRlcm5hbHx8dGhpcy5saXN0ZW5Ub0V4dGVybmFsRHJhZyhpLGUsbikpKX0sbGlzdGVuVG9FeHRlcm5hbERyYWc6ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI9dGhpcyxsPXRoaXMudmlldy5jYWxlbmRhcixhPU10KHQpLHU9ci5leHRlcm5hbERyYWdMaXN0ZW5lcj1uZXcgZmUodGhpcyx7aW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbigpe3IuaXNEcmFnZ2luZ0V4dGVybmFsPSEwfSxoaXRPdmVyOmZ1bmN0aW9uKHQpe2k9ci5jb21wdXRlRXh0ZXJuYWxEcm9wKHQuY29tcG9uZW50LmdldEhpdFNwYW4odCksYSksaSYmIWwuaXNFeHRlcm5hbFNwYW5BbGxvd2VkKHIuZXZlbnRUb1NwYW4oaSksaSxhLmV2ZW50UHJvcHMpJiYocygpLGk9bnVsbCksaSYmci5yZW5kZXJEcmFnKGkpfSxoaXRPdXQ6ZnVuY3Rpb24oKXtpPW51bGx9LGhpdERvbmU6ZnVuY3Rpb24oKXtvKCksci51bnJlbmRlckRyYWcoKX0saW50ZXJhY3Rpb25FbmQ6ZnVuY3Rpb24oZSl7aSYmci52aWV3LnJlcG9ydEV4dGVybmFsRHJvcChhLGksdCxlLG4pLHIuaXNEcmFnZ2luZ0V4dGVybmFsPSExLHIuZXh0ZXJuYWxEcmFnTGlzdGVuZXI9bnVsbH19KTt1LnN0YXJ0RHJhZyhlKX0sY29tcHV0ZUV4dGVybmFsRHJvcDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudmlldy5jYWxlbmRhcixpPXtzdGFydDpuLmFwcGx5VGltZXpvbmUodC5zdGFydCksZW5kOm51bGx9O3JldHVybiBlLnN0YXJ0VGltZSYmIWkuc3RhcnQuaGFzVGltZSgpJiZpLnN0YXJ0LnRpbWUoZS5zdGFydFRpbWUpLGUuZHVyYXRpb24mJihpLmVuZD1pLnN0YXJ0LmNsb25lKCkuYWRkKGUuZHVyYXRpb24pKSxpfSxyZW5kZXJEcmFnOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt9LGJ1aWxkU2VnUmVzaXplTGlzdGVuZXI6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHI9dGhpcyxsPXRoaXMudmlldyxhPWwuY2FsZW5kYXIsdT10LmVsLGQ9dC5ldmVudCxjPWEuZ2V0RXZlbnRFbmQoZCksaD10aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyPW5ldyBmZSh0aGlzLHtzY3JvbGw6bC5vcHQoImRyYWdTY3JvbGwiKSxzdWJqZWN0RWw6dSxpbnRlcmFjdGlvblN0YXJ0OmZ1bmN0aW9uKCl7bj0hMX0sZHJhZ1N0YXJ0OmZ1bmN0aW9uKGUpe249ITAsci5oYW5kbGVTZWdNb3VzZW91dCh0LGUpLHIuc2VnUmVzaXplU3RhcnQodCxlKX0saGl0T3ZlcjpmdW5jdGlvbihuLG8sdSl7dmFyIGg9ci5nZXRIaXRTcGFuKHUpLGY9ci5nZXRIaXRTcGFuKG4pO2k9ZT9yLmNvbXB1dGVFdmVudFN0YXJ0UmVzaXplKGgsZixkKTpyLmNvbXB1dGVFdmVudEVuZFJlc2l6ZShoLGYsZCksaSYmKGEuaXNFdmVudFNwYW5BbGxvd2VkKHIuZXZlbnRUb1NwYW4oaSksZCk/aS5zdGFydC5pc1NhbWUoZC5zdGFydC5jbG9uZSgpLnN0cmlwWm9uZSgpKSYmaS5lbmQuaXNTYW1lKGMuY2xvbmUoKS5zdHJpcFpvbmUoKSkmJihpPW51bGwpOihzKCksaT1udWxsKSksaSYmKGwuaGlkZUV2ZW50KGQpLHIucmVuZGVyRXZlbnRSZXNpemUoaSx0KSl9LGhpdE91dDpmdW5jdGlvbigpe2k9bnVsbH0saGl0RG9uZTpmdW5jdGlvbigpe3IudW5yZW5kZXJFdmVudFJlc2l6ZSgpLGwuc2hvd0V2ZW50KGQpLG8oKX0saW50ZXJhY3Rpb25FbmQ6ZnVuY3Rpb24oZSl7biYmci5zZWdSZXNpemVTdG9wKHQsZSksaSYmbC5yZXBvcnRFdmVudFJlc2l6ZShkLGksdGhpcy5sYXJnZVVuaXQsdSxlKSxyLnNlZ1Jlc2l6ZUxpc3RlbmVyPW51bGx9fSk7cmV0dXJuIGh9LHNlZ1Jlc2l6ZVN0YXJ0OmZ1bmN0aW9uKHQsZSl7dGhpcy5pc1Jlc2l6aW5nU2VnPSEwLHRoaXMudmlldy50cmlnZ2VyKCJldmVudFJlc2l6ZVN0YXJ0Iix0LmVsWzBdLHQuZXZlbnQsZSx7fSl9LHNlZ1Jlc2l6ZVN0b3A6ZnVuY3Rpb24odCxlKXt0aGlzLmlzUmVzaXppbmdTZWc9ITEsdGhpcy52aWV3LnRyaWdnZXIoImV2ZW50UmVzaXplU3RvcCIsdC5lbFswXSx0LmV2ZW50LGUse30pfSxjb21wdXRlRXZlbnRTdGFydFJlc2l6ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuY29tcHV0ZUV2ZW50UmVzaXplKCJzdGFydCIsdCxlLG4pfSxjb21wdXRlRXZlbnRFbmRSZXNpemU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLmNvbXB1dGVFdmVudFJlc2l6ZSgiZW5kIix0LGUsbil9LGNvbXB1dGVFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUsbixpKXt2YXIgcixzLG89dGhpcy52aWV3LmNhbGVuZGFyLGw9dGhpcy5kaWZmRGF0ZXMoblt0XSxlW3RdKTtyZXR1cm4gcj17c3RhcnQ6aS5zdGFydC5jbG9uZSgpLGVuZDpvLmdldEV2ZW50RW5kKGkpLGFsbERheTppLmFsbERheX0sci5hbGxEYXkmJlcobCkmJihyLmFsbERheT0hMSxvLm5vcm1hbGl6ZUV2ZW50VGltZXMocikpLHJbdF0uYWRkKGwpLHIuc3RhcnQuaXNCZWZvcmUoci5lbmQpfHwocz10aGlzLm1pblJlc2l6ZUR1cmF0aW9ufHwoaS5hbGxEYXk/by5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbjpvLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pLCJzdGFydCI9PXQ/ci5zdGFydD1yLmVuZC5jbG9uZSgpLnN1YnRyYWN0KHMpOnIuZW5kPXIuc3RhcnQuY2xvbmUoKS5hZGQocykpLHJ9LHJlbmRlckV2ZW50UmVzaXplOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckV2ZW50UmVzaXplOmZ1bmN0aW9uKCl7fSxnZXRFdmVudFRpbWVUZXh0OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09ZSYmKGU9dGhpcy5ldmVudFRpbWVGb3JtYXQpLG51bGw9PW4mJihuPXRoaXMuZGlzcGxheUV2ZW50RW5kKSx0aGlzLmRpc3BsYXlFdmVudFRpbWUmJnQuc3RhcnQuaGFzVGltZSgpP24mJnQuZW5kP3RoaXMudmlldy5mb3JtYXRSYW5nZSh0LGUpOnQuc3RhcnQuZm9ybWF0KGUpOiIifSxnZXRTZWdDbGFzc2VzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLnZpZXcscj1bImZjLWV2ZW50Iix0LmlzU3RhcnQ/ImZjLXN0YXJ0IjoiZmMtbm90LXN0YXJ0Iix0LmlzRW5kPyJmYy1lbmQiOiJmYy1ub3QtZW5kIl0uY29uY2F0KHRoaXMuZ2V0U2VnQ3VzdG9tQ2xhc3Nlcyh0KSk7cmV0dXJuIGUmJnIucHVzaCgiZmMtZHJhZ2dhYmxlIiksbiYmci5wdXNoKCJmYy1yZXNpemFibGUiKSxpLmlzRXZlbnRTZWxlY3RlZCh0LmV2ZW50KSYmci5wdXNoKCJmYy1zZWxlY3RlZCIpLHJ9LGdldFNlZ0N1c3RvbUNsYXNzZXM6ZnVuY3Rpb24odCl7dmFyIGU9dC5ldmVudDtyZXR1cm5bXS5jb25jYXQoZS5jbGFzc05hbWUsZS5zb3VyY2U/ZS5zb3VyY2UuY2xhc3NOYW1lOltdKX0sZ2V0U2VnU2tpbkNzczpmdW5jdGlvbih0KXtyZXR1cm57ImJhY2tncm91bmQtY29sb3IiOnRoaXMuZ2V0U2VnQmFja2dyb3VuZENvbG9yKHQpLCJib3JkZXItY29sb3IiOnRoaXMuZ2V0U2VnQm9yZGVyQ29sb3IodCksY29sb3I6dGhpcy5nZXRTZWdUZXh0Q29sb3IodCl9fSxnZXRTZWdCYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZlbnQuYmFja2dyb3VuZENvbG9yfHx0LmV2ZW50LmNvbG9yfHx0aGlzLmdldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3IodCl9LGdldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24odCl7dmFyIGU9dC5ldmVudC5zb3VyY2V8fHt9O3JldHVybiBlLmJhY2tncm91bmRDb2xvcnx8ZS5jb2xvcnx8dGhpcy52aWV3Lm9wdCgiZXZlbnRCYWNrZ3JvdW5kQ29sb3IiKXx8dGhpcy52aWV3Lm9wdCgiZXZlbnRDb2xvciIpfSxnZXRTZWdCb3JkZXJDb2xvcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5ldmVudC5ib3JkZXJDb2xvcnx8dC5ldmVudC5jb2xvcnx8dGhpcy5nZXRTZWdEZWZhdWx0Qm9yZGVyQ29sb3IodCl9LGdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvcjpmdW5jdGlvbih0KXt2YXIgZT10LmV2ZW50LnNvdXJjZXx8e307cmV0dXJuIGUuYm9yZGVyQ29sb3J8fGUuY29sb3J8fHRoaXMudmlldy5vcHQoImV2ZW50Qm9yZGVyQ29sb3IiKXx8dGhpcy52aWV3Lm9wdCgiZXZlbnRDb2xvciIpfSxnZXRTZWdUZXh0Q29sb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZlbnQudGV4dENvbG9yfHx0aGlzLmdldFNlZ0RlZmF1bHRUZXh0Q29sb3IodCl9LGdldFNlZ0RlZmF1bHRUZXh0Q29sb3I6ZnVuY3Rpb24odCl7dmFyIGU9dC5ldmVudC5zb3VyY2V8fHt9O3JldHVybiBlLnRleHRDb2xvcnx8dGhpcy52aWV3Lm9wdCgiZXZlbnRUZXh0Q29sb3IiKX0sZXZlbnRUb1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZXZlbnRzVG9TZWdzKFt0XSl9LGV2ZW50VG9TcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmV2ZW50VG9TcGFucyh0KVswXX0sZXZlbnRUb1NwYW5zOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZXZlbnRUb1JhbmdlKHQpO3JldHVybiB0aGlzLmV2ZW50UmFuZ2VUb1NwYW5zKGUsdCl9LGV2ZW50c1RvU2VnczpmdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMscj1JdChlKSxzPVtdO3JldHVybiB0LmVhY2gocixmdW5jdGlvbih0LGUpe3ZhciByLG89W107Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylvLnB1c2goaS5ldmVudFRvUmFuZ2UoZVtyXSkpO2lmKHh0KGVbMF0pKWZvcihvPWkuaW52ZXJ0UmFuZ2VzKG8pLHI9MDtyPG8ubGVuZ3RoO3IrKylzLnB1c2guYXBwbHkocyxpLmV2ZW50UmFuZ2VUb1NlZ3Mob1tyXSxlWzBdLG4pKTtlbHNlIGZvcihyPTA7cjxvLmxlbmd0aDtyKyspcy5wdXNoLmFwcGx5KHMsaS5ldmVudFJhbmdlVG9TZWdzKG9bcl0sZVtyXSxuKSl9KSxzfSxldmVudFRvUmFuZ2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aWV3LmNhbGVuZGFyLG49dC5zdGFydC5jbG9uZSgpLnN0cmlwWm9uZSgpLGk9KHQuZW5kP3QuZW5kLmNsb25lKCk6ZS5nZXREZWZhdWx0RXZlbnRFbmQobnVsbCE9dC5hbGxEYXk/dC5hbGxEYXk6IXQuc3RhcnQuaGFzVGltZSgpLHQuc3RhcnQpKS5zdHJpcFpvbmUoKTtyZXR1cm4gZS5sb2NhbGl6ZU1vbWVudChuKSxlLmxvY2FsaXplTW9tZW50KGkpLHtzdGFydDpuLGVuZDppfX0sZXZlbnRSYW5nZVRvU2VnczpmdW5jdGlvbih0LGUsbil7dmFyIGkscj10aGlzLmV2ZW50UmFuZ2VUb1NwYW5zKHQsZSkscz1bXTtmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKXMucHVzaC5hcHBseShzLHRoaXMuZXZlbnRTcGFuVG9TZWdzKHJbaV0sZSxuKSk7cmV0dXJuIHN9LGV2ZW50UmFuZ2VUb1NwYW5zOmZ1bmN0aW9uKGUsbil7cmV0dXJuW3QuZXh0ZW5kKHt9LGUpXX0sZXZlbnRTcGFuVG9TZWdzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLHM9bj9uKHQpOnRoaXMuc3BhblRvU2Vncyh0KTtmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKXI9c1tpXSxyLmV2ZW50PWUsci5ldmVudFN0YXJ0TVM9K3Quc3RhcnQsci5ldmVudER1cmF0aW9uTVM9dC5lbmQtdC5zdGFydDtyZXR1cm4gc30saW52ZXJ0UmFuZ2VzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnZpZXcscj1pLnN0YXJ0LmNsb25lKCkscz1pLmVuZC5jbG9uZSgpLG89W10sbD1yO2Zvcih0LnNvcnQoa3QpLGU9MDtlPHQubGVuZ3RoO2UrKyluPXRbZV0sbi5zdGFydD5sJiZvLnB1c2goe3N0YXJ0OmwsZW5kOm4uc3RhcnR9KSxsPW4uZW5kO3JldHVybiBsPHMmJm8ucHVzaCh7c3RhcnQ6bCxlbmQ6c30pLG99LHNvcnRFdmVudFNlZ3M6ZnVuY3Rpb24odCl7dC5zb3J0KGx0KHRoaXMsImNvbXBhcmVFdmVudFNlZ3MiKSl9LGNvbXBhcmVFdmVudFNlZ3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5ldmVudFN0YXJ0TVMtZS5ldmVudFN0YXJ0TVN8fGUuZXZlbnREdXJhdGlvbk1TLXQuZXZlbnREdXJhdGlvbk1TfHxlLmV2ZW50LmFsbERheS10LmV2ZW50LmFsbERheXx8TCh0LmV2ZW50LGUuZXZlbnQsdGhpcy52aWV3LmV2ZW50T3JkZXJTcGVjcyl9fSksanQucGx1Y2tFdmVudERhdGVQcm9wcz1IdCxqdC5pc0JnRXZlbnQ9VHQsanQuZGF0YUF0dHJQcmVmaXg9IiI7dmFyIHZlPWp0LkRheVRhYmxlTWl4aW49e2JyZWFrT25XZWVrczohMSxkYXlEYXRlczpudWxsLGRheUluZGljZXM6bnVsbCxkYXlzUGVyUm93Om51bGwscm93Q250Om51bGwsY29sQ250Om51bGwsY29sSGVhZEZvcm1hdDpudWxsLHVwZGF0ZURheVRhYmxlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUsbixpPXRoaXMudmlldyxyPXRoaXMuc3RhcnQuY2xvbmUoKSxzPS0xLG89W10sbD1bXTtyLmlzQmVmb3JlKHRoaXMuZW5kKTspaS5pc0hpZGRlbkRheShyKT9vLnB1c2gocysuNSk6KHMrKyxvLnB1c2gocyksbC5wdXNoKHIuY2xvbmUoKSkpLHIuYWRkKDEsImRheXMiKTtpZih0aGlzLmJyZWFrT25XZWVrcyl7Zm9yKGU9bFswXS5kYXkoKSx0PTE7dDxsLmxlbmd0aCYmbFt0XS5kYXkoKSE9ZTt0KyspO249TWF0aC5jZWlsKGwubGVuZ3RoL3QpfWVsc2Ugbj0xLHQ9bC5sZW5ndGg7dGhpcy5kYXlEYXRlcz1sLHRoaXMuZGF5SW5kaWNlcz1vLHRoaXMuZGF5c1BlclJvdz10LHRoaXMucm93Q250PW4sdGhpcy51cGRhdGVEYXlUYWJsZUNvbHMoKX0sdXBkYXRlRGF5VGFibGVDb2xzOmZ1bmN0aW9uKCl7dGhpcy5jb2xDbnQ9dGhpcy5jb21wdXRlQ29sQ250KCksdGhpcy5jb2xIZWFkRm9ybWF0PXRoaXMudmlldy5vcHQoImNvbHVtbkZvcm1hdCIpfHx0aGlzLmNvbXB1dGVDb2xIZWFkRm9ybWF0KCl9LGNvbXB1dGVDb2xDbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXlzUGVyUm93fSxnZXRDZWxsRGF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmRheURhdGVzW3RoaXMuZ2V0Q2VsbERheUluZGV4KHQsZSldLmNsb25lKCl9LGdldENlbGxSYW5nZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0Q2VsbERhdGUodCxlKSxpPW4uY2xvbmUoKS5hZGQoMSwiZGF5cyIpO3JldHVybntzdGFydDpuLGVuZDppfX0sZ2V0Q2VsbERheUluZGV4OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQqdGhpcy5kYXlzUGVyUm93K3RoaXMuZ2V0Q29sRGF5SW5kZXgoZSl9LGdldENvbERheUluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzUlRMP3RoaXMuY29sQ250LTEtdDp0fSxnZXREYXRlRGF5SW5kZXg6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXlJbmRpY2VzLG49dC5kaWZmKHRoaXMuc3RhcnQsImRheXMiKTtyZXR1cm4gbjwwP2VbMF0tMTpuPj1lLmxlbmd0aD9lW2UubGVuZ3RoLTFdKzE6ZVtuXX0sY29tcHV0ZUNvbEhlYWRGb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dDbnQ+MXx8dGhpcy5jb2xDbnQ+MTA/ImRkZCI6dGhpcy5jb2xDbnQ+MT90aGlzLnZpZXcub3B0KCJkYXlPZk1vbnRoRm9ybWF0Iik6ImRkZGQifSxzbGljZVJhbmdlQnlSb3c6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIscyxvPXRoaXMuZGF5c1BlclJvdyxsPXRoaXMudmlldy5jb21wdXRlRGF5UmFuZ2UodCksYT10aGlzLmdldERhdGVEYXlJbmRleChsLnN0YXJ0KSx1PXRoaXMuZ2V0RGF0ZURheUluZGV4KGwuZW5kLmNsb25lKCkuc3VidHJhY3QoMSwiZGF5cyIpKSxkPVtdO2ZvcihlPTA7ZTx0aGlzLnJvd0NudDtlKyspbj1lKm8saT1uK28tMSxyPU1hdGgubWF4KGEsbikscz1NYXRoLm1pbih1LGkpLHI9TWF0aC5jZWlsKHIpLHM9TWF0aC5mbG9vcihzKSxyPD1zJiZkLnB1c2goe3JvdzplLGZpcnN0Um93RGF5SW5kZXg6ci1uLGxhc3RSb3dEYXlJbmRleDpzLW4saXNTdGFydDpyPT09YSxpc0VuZDpzPT09dX0pO3JldHVybiBkfSxzbGljZVJhbmdlQnlEYXk6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIscyxvLGw9dGhpcy5kYXlzUGVyUm93LGE9dGhpcy52aWV3LmNvbXB1dGVEYXlSYW5nZSh0KSx1PXRoaXMuZ2V0RGF0ZURheUluZGV4KGEuc3RhcnQpLGQ9dGhpcy5nZXREYXRlRGF5SW5kZXgoYS5lbmQuY2xvbmUoKS5zdWJ0cmFjdCgxLCJkYXlzIikpLGM9W107Zm9yKGU9MDtlPHRoaXMucm93Q250O2UrKylmb3Iobj1lKmwsaT1uK2wtMSxyPW47cjw9aTtyKyspcz1NYXRoLm1heCh1LHIpLG89TWF0aC5taW4oZCxyKSxzPU1hdGguY2VpbChzKSxvPU1hdGguZmxvb3Iobyksczw9byYmYy5wdXNoKHtyb3c6ZSxmaXJzdFJvd0RheUluZGV4OnMtbixsYXN0Um93RGF5SW5kZXg6by1uLGlzU3RhcnQ6cz09PXUsaXNFbmQ6bz09PWR9KTtyZXR1cm4gYzsKfSxyZW5kZXJIZWFkSHRtbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlldztyZXR1cm4nPGRpdiBjbGFzcz0iZmMtcm93ICcrdC53aWRnZXRIZWFkZXJDbGFzcysnIj48dGFibGU+PHRoZWFkPicrdGhpcy5yZW5kZXJIZWFkVHJIdG1sKCkrIjwvdGhlYWQ+PC90YWJsZT48L2Rpdj4ifSxyZW5kZXJIZWFkSW50cm9IdG1sOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCl9LHJlbmRlckhlYWRUckh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4iPHRyPiIrKHRoaXMuaXNSVEw/IiI6dGhpcy5yZW5kZXJIZWFkSW50cm9IdG1sKCkpK3RoaXMucmVuZGVySGVhZERhdGVDZWxsc0h0bWwoKSsodGhpcy5pc1JUTD90aGlzLnJlbmRlckhlYWRJbnRyb0h0bWwoKToiIikrIjwvdHI+In0scmVuZGVySGVhZERhdGVDZWxsc0h0bWw6ZnVuY3Rpb24oKXt2YXIgdCxlLG49W107Zm9yKHQ9MDt0PHRoaXMuY29sQ250O3QrKyllPXRoaXMuZ2V0Q2VsbERhdGUoMCx0KSxuLnB1c2godGhpcy5yZW5kZXJIZWFkRGF0ZUNlbGxIdG1sKGUpKTtyZXR1cm4gbi5qb2luKCIiKX0scmVuZGVySGVhZERhdGVDZWxsSHRtbDpmdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy52aWV3O3JldHVybic8dGggY2xhc3M9ImZjLWRheS1oZWFkZXIgJytpLndpZGdldEhlYWRlckNsYXNzKyIgZmMtIiskdFt0LmRheSgpXSsnIicrKDE9PT10aGlzLnJvd0NudD8nIGRhdGEtZGF0ZT0iJyt0LmZvcm1hdCgiWVlZWS1NTS1ERCIpKyciJzoiIikrKGU+MT8nIGNvbHNwYW49IicrZSsnIic6IiIpKyhuPyIgIituOiIiKSsiPiIraS5idWlsZEdvdG9BbmNob3JIdG1sKHtkYXRlOnQsZm9yY2VPZmY6dGhpcy5yb3dDbnQ+MXx8MT09PXRoaXMuY29sQ250fSx0dCh0LmZvcm1hdCh0aGlzLmNvbEhlYWRGb3JtYXQpKSkrIjwvdGg+In0scmVuZGVyQmdUckh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIjx0cj4iKyh0aGlzLmlzUlRMPyIiOnRoaXMucmVuZGVyQmdJbnRyb0h0bWwodCkpK3RoaXMucmVuZGVyQmdDZWxsc0h0bWwodCkrKHRoaXMuaXNSVEw/dGhpcy5yZW5kZXJCZ0ludHJvSHRtbCh0KToiIikrIjwvdHI+In0scmVuZGVyQmdJbnRyb0h0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCl9LHJlbmRlckJnQ2VsbHNIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT1bXTtmb3IoZT0wO2U8dGhpcy5jb2xDbnQ7ZSsrKW49dGhpcy5nZXRDZWxsRGF0ZSh0LGUpLGkucHVzaCh0aGlzLnJlbmRlckJnQ2VsbEh0bWwobikpO3JldHVybiBpLmpvaW4oIiIpfSxyZW5kZXJCZ0NlbGxIdG1sOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy52aWV3LGk9dGhpcy5nZXREYXlDbGFzc2VzKHQpO3JldHVybiBpLnVuc2hpZnQoImZjLWRheSIsbi53aWRnZXRDb250ZW50Q2xhc3MpLCc8dGQgY2xhc3M9IicraS5qb2luKCIgIikrJyIgZGF0YS1kYXRlPSInK3QuZm9ybWF0KCJZWVlZLU1NLUREIikrJyInKyhlPyIgIitlOiIiKSsiPjwvdGQ+In0scmVuZGVySW50cm9IdG1sOmZ1bmN0aW9uKCl7fSxib29rZW5kQ2VsbHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZW5kZXJJbnRyb0h0bWwoKTtlJiYodGhpcy5pc1JUTD90LmFwcGVuZChlKTp0LnByZXBlbmQoZSkpfX0sbWU9anQuRGF5R3JpZD1wZS5leHRlbmQodmUse251bWJlcnNWaXNpYmxlOiExLGJvdHRvbUNvb3JkUGFkZGluZzowLHJvd0VsczpudWxsLGNlbGxFbHM6bnVsbCxoZWxwZXJFbHM6bnVsbCxyb3dDb29yZENhY2hlOm51bGwsY29sQ29vcmRDYWNoZTpudWxsLHJlbmRlckRhdGVzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnZpZXcscj10aGlzLnJvd0NudCxzPXRoaXMuY29sQ250LG89IiI7Zm9yKGU9MDtlPHI7ZSsrKW8rPXRoaXMucmVuZGVyRGF5Um93SHRtbChlLHQpO2Zvcih0aGlzLmVsLmh0bWwobyksdGhpcy5yb3dFbHM9dGhpcy5lbC5maW5kKCIuZmMtcm93IiksdGhpcy5jZWxsRWxzPXRoaXMuZWwuZmluZCgiLmZjLWRheSIpLHRoaXMucm93Q29vcmRDYWNoZT1uZXcgY2Uoe2Vsczp0aGlzLnJvd0Vscyxpc1ZlcnRpY2FsOiEwfSksdGhpcy5jb2xDb29yZENhY2hlPW5ldyBjZSh7ZWxzOnRoaXMuY2VsbEVscy5zbGljZSgwLHRoaXMuY29sQ250KSxpc0hvcml6b250YWw6ITB9KSxlPTA7ZTxyO2UrKylmb3Iobj0wO248cztuKyspaS50cmlnZ2VyKCJkYXlSZW5kZXIiLG51bGwsdGhpcy5nZXRDZWxsRGF0ZShlLG4pLHRoaXMuZ2V0Q2VsbEVsKGUsbikpfSx1bnJlbmRlckRhdGVzOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVTZWdQb3BvdmVyKCl9LHJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1aWxkQnVzaW5lc3NIb3VyU2VncyghMCk7dGhpcy5yZW5kZXJGaWxsKCJidXNpbmVzc0hvdXJzIix0LCJiZ2V2ZW50Iil9LHVucmVuZGVyQnVzaW5lc3NIb3VyczpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJGaWxsKCJidXNpbmVzc0hvdXJzIil9LHJlbmRlckRheVJvd0h0bWw6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnZpZXcsaT1bImZjLXJvdyIsImZjLXdlZWsiLG4ud2lkZ2V0Q29udGVudENsYXNzXTtyZXR1cm4gZSYmaS5wdXNoKCJmYy1yaWdpZCIpLCc8ZGl2IGNsYXNzPSInK2kuam9pbigiICIpKyciPjxkaXYgY2xhc3M9ImZjLWJnIj48dGFibGU+Jyt0aGlzLnJlbmRlckJnVHJIdG1sKHQpKyc8L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9ImZjLWNvbnRlbnQtc2tlbGV0b24iPjx0YWJsZT4nKyh0aGlzLm51bWJlcnNWaXNpYmxlPyI8dGhlYWQ+Iit0aGlzLnJlbmRlck51bWJlclRySHRtbCh0KSsiPC90aGVhZD4iOiIiKSsiPC90YWJsZT48L2Rpdj48L2Rpdj4ifSxyZW5kZXJOdW1iZXJUckh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIjx0cj4iKyh0aGlzLmlzUlRMPyIiOnRoaXMucmVuZGVyTnVtYmVySW50cm9IdG1sKHQpKSt0aGlzLnJlbmRlck51bWJlckNlbGxzSHRtbCh0KSsodGhpcy5pc1JUTD90aGlzLnJlbmRlck51bWJlckludHJvSHRtbCh0KToiIikrIjwvdHI+In0scmVuZGVyTnVtYmVySW50cm9IdG1sOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlbmRlckludHJvSHRtbCgpfSxyZW5kZXJOdW1iZXJDZWxsc0h0bWw6ZnVuY3Rpb24odCl7dmFyIGUsbixpPVtdO2ZvcihlPTA7ZTx0aGlzLmNvbENudDtlKyspbj10aGlzLmdldENlbGxEYXRlKHQsZSksaS5wdXNoKHRoaXMucmVuZGVyTnVtYmVyQ2VsbEh0bWwobikpO3JldHVybiBpLmpvaW4oIiIpfSxyZW5kZXJOdW1iZXJDZWxsSHRtbDpmdW5jdGlvbih0KXt2YXIgZSxuLGk9IiI7cmV0dXJuIHRoaXMudmlldy5kYXlOdW1iZXJzVmlzaWJsZXx8dGhpcy52aWV3LmNlbGxXZWVrTnVtYmVyc1Zpc2libGU/KGU9dGhpcy5nZXREYXlDbGFzc2VzKHQpLGUudW5zaGlmdCgiZmMtZGF5LXRvcCIpLHRoaXMudmlldy5jZWxsV2Vla051bWJlcnNWaXNpYmxlJiYobj0iSVNPIj09PXQuX2xvY2FsZS5fZnVsbENhbGVuZGFyX3dlZWtDYWxjPzE6dC5fbG9jYWxlLmZpcnN0RGF5T2ZXZWVrKCkpLGkrPSc8dGQgY2xhc3M9IicrZS5qb2luKCIgIikrJyIgZGF0YS1kYXRlPSInK3QuZm9ybWF0KCkrJyI+Jyx0aGlzLnZpZXcuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZSYmdC5kYXkoKT09biYmKGkrPXRoaXMudmlldy5idWlsZEdvdG9BbmNob3JIdG1sKHtkYXRlOnQsdHlwZToid2VlayJ9LHtjbGFzczoiZmMtd2Vlay1udW1iZXIifSx0LmZvcm1hdCgidyIpKSksdGhpcy52aWV3LmRheU51bWJlcnNWaXNpYmxlJiYoaSs9dGhpcy52aWV3LmJ1aWxkR290b0FuY2hvckh0bWwodCx7Y2xhc3M6ImZjLWRheS1udW1iZXIifSx0LmRhdGUoKSkpLGkrPSI8L3RkPiIpOiI8dGQvPiJ9LGNvbXB1dGVFdmVudFRpbWVGb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3Lm9wdCgiZXh0cmFTbWFsbFRpbWVGb3JtYXQiKX0sY29tcHV0ZURpc3BsYXlFdmVudEVuZDpmdW5jdGlvbigpe3JldHVybiAxPT10aGlzLmNvbENudH0scmFuZ2VVcGRhdGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVEYXlUYWJsZSgpfSxzcGFuVG9TZWdzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnNsaWNlUmFuZ2VCeVJvdyh0KTtmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKW49aVtlXSx0aGlzLmlzUlRMPyhuLmxlZnRDb2w9dGhpcy5kYXlzUGVyUm93LTEtbi5sYXN0Um93RGF5SW5kZXgsbi5yaWdodENvbD10aGlzLmRheXNQZXJSb3ctMS1uLmZpcnN0Um93RGF5SW5kZXgpOihuLmxlZnRDb2w9bi5maXJzdFJvd0RheUluZGV4LG4ucmlnaHRDb2w9bi5sYXN0Um93RGF5SW5kZXgpO3JldHVybiBpfSxwcmVwYXJlSGl0czpmdW5jdGlvbigpe3RoaXMuY29sQ29vcmRDYWNoZS5idWlsZCgpLHRoaXMucm93Q29vcmRDYWNoZS5idWlsZCgpLHRoaXMucm93Q29vcmRDYWNoZS5ib3R0b21zW3RoaXMucm93Q250LTFdKz10aGlzLmJvdHRvbUNvb3JkUGFkZGluZ30scmVsZWFzZUhpdHM6ZnVuY3Rpb24oKXt0aGlzLmNvbENvb3JkQ2FjaGUuY2xlYXIoKSx0aGlzLnJvd0Nvb3JkQ2FjaGUuY2xlYXIoKX0scXVlcnlIaXQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLmNvbENvb3JkQ2FjaGUuaXNMZWZ0SW5Cb3VuZHModCkmJnRoaXMucm93Q29vcmRDYWNoZS5pc1RvcEluQm91bmRzKGUpKXt2YXIgbj10aGlzLmNvbENvb3JkQ2FjaGUuZ2V0SG9yaXpvbnRhbEluZGV4KHQpLGk9dGhpcy5yb3dDb29yZENhY2hlLmdldFZlcnRpY2FsSW5kZXgoZSk7aWYobnVsbCE9aSYmbnVsbCE9bilyZXR1cm4gdGhpcy5nZXRDZWxsSGl0KGksbil9fSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldENlbGxSYW5nZSh0LnJvdyx0LmNvbCl9LGdldEhpdEVsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldENlbGxFbCh0LnJvdyx0LmNvbCl9LGdldENlbGxIaXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm57cm93OnQsY29sOmUsY29tcG9uZW50OnRoaXMsbGVmdDp0aGlzLmNvbENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChlKSxyaWdodDp0aGlzLmNvbENvb3JkQ2FjaGUuZ2V0UmlnaHRPZmZzZXQoZSksdG9wOnRoaXMucm93Q29vcmRDYWNoZS5nZXRUb3BPZmZzZXQodCksYm90dG9tOnRoaXMucm93Q29vcmRDYWNoZS5nZXRCb3R0b21PZmZzZXQodCl9fSxnZXRDZWxsRWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jZWxsRWxzLmVxKHQqdGhpcy5jb2xDbnQrZSl9LHJlbmRlckRyYWc6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKHQpKSxlJiZlLmNvbXBvbmVudCE9PXRoaXMpcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcih0LGUpfSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCksdGhpcy51bnJlbmRlckhlbHBlcigpfSxyZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKHQpKSx0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIodCxlKX0sdW5yZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIaWdobGlnaHQoKSx0aGlzLnVucmVuZGVySGVscGVyKCl9LHJlbmRlckhlbHBlcjpmdW5jdGlvbihlLG4pe3ZhciBpLHI9W10scz10aGlzLmV2ZW50VG9TZWdzKGUpO3JldHVybiBzPXRoaXMucmVuZGVyRmdTZWdFbHMocyksaT10aGlzLnJlbmRlclNlZ1Jvd3MocyksdGhpcy5yb3dFbHMuZWFjaChmdW5jdGlvbihlLHMpe3ZhciBvLGw9dChzKSxhPXQoJzxkaXYgY2xhc3M9ImZjLWhlbHBlci1za2VsZXRvbiI+PHRhYmxlLz48L2Rpdj4nKTtvPW4mJm4ucm93PT09ZT9uLmVsLnBvc2l0aW9uKCkudG9wOmwuZmluZCgiLmZjLWNvbnRlbnQtc2tlbGV0b24gdGJvZHkiKS5wb3NpdGlvbigpLnRvcCxhLmNzcygidG9wIixvKS5maW5kKCJ0YWJsZSIpLmFwcGVuZChpW2VdLnRib2R5RWwpLGwuYXBwZW5kKGEpLHIucHVzaChhWzBdKX0pLHRoaXMuaGVscGVyRWxzPXQocil9LHVucmVuZGVySGVscGVyOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJFbHMmJih0aGlzLmhlbHBlckVscy5yZW1vdmUoKSx0aGlzLmhlbHBlckVscz1udWxsKX0sZmlsbFNlZ1RhZzoidGQiLHJlbmRlckZpbGw6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLHMsbyxsPVtdO2ZvcihuPXRoaXMucmVuZGVyRmlsbFNlZ0VscyhlLG4pLHI9MDtyPG4ubGVuZ3RoO3IrKylzPW5bcl0sbz10aGlzLnJlbmRlckZpbGxSb3coZSxzLGkpLHRoaXMucm93RWxzLmVxKHMucm93KS5hcHBlbmQobyksbC5wdXNoKG9bMF0pO3JldHVybiB0aGlzLmVsc0J5RmlsbFtlXT10KGwpLG59LHJlbmRlckZpbGxSb3c6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLHMsbz10aGlzLmNvbENudCxsPW4ubGVmdENvbCxhPW4ucmlnaHRDb2wrMTtyZXR1cm4gaT1pfHxlLnRvTG93ZXJDYXNlKCkscj10KCc8ZGl2IGNsYXNzPSJmYy0nK2krJy1za2VsZXRvbiI+PHRhYmxlPjx0ci8+PC90YWJsZT48L2Rpdj4nKSxzPXIuZmluZCgidHIiKSxsPjAmJnMuYXBwZW5kKCc8dGQgY29sc3Bhbj0iJytsKyciLz4nKSxzLmFwcGVuZChuLmVsLmF0dHIoImNvbHNwYW4iLGEtbCkpLGE8byYmcy5hcHBlbmQoJzx0ZCBjb2xzcGFuPSInKyhvLWEpKyciLz4nKSx0aGlzLmJvb2tlbmRDZWxscyhzKSxyfX0pO21lLm1peGluKHtyb3dTdHJ1Y3RzOm51bGwsdW5yZW5kZXJFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZVNlZ1BvcG92ZXIoKSxwZS5wcm90b3R5cGUudW5yZW5kZXJFdmVudHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxnZXRFdmVudFNlZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gcGUucHJvdG90eXBlLmdldEV2ZW50U2Vncy5jYWxsKHRoaXMpLmNvbmNhdCh0aGlzLnBvcG92ZXJTZWdzfHxbXSl9LHJlbmRlckJnU2VnczpmdW5jdGlvbihlKXt2YXIgbj10LmdyZXAoZSxmdW5jdGlvbih0KXtyZXR1cm4gdC5ldmVudC5hbGxEYXl9KTtyZXR1cm4gcGUucHJvdG90eXBlLnJlbmRlckJnU2Vncy5jYWxsKHRoaXMsbil9LHJlbmRlckZnU2VnczpmdW5jdGlvbihlKXt2YXIgbjtyZXR1cm4gZT10aGlzLnJlbmRlckZnU2VnRWxzKGUpLG49dGhpcy5yb3dTdHJ1Y3RzPXRoaXMucmVuZGVyU2VnUm93cyhlKSx0aGlzLnJvd0Vscy5lYWNoKGZ1bmN0aW9uKGUsaSl7dChpKS5maW5kKCIuZmMtY29udGVudC1za2VsZXRvbiA+IHRhYmxlIikuYXBwZW5kKG5bZV0udGJvZHlFbCl9KSxlfSx1bnJlbmRlckZnU2VnczpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPXRoaXMucm93U3RydWN0c3x8W107dD1lLnBvcCgpOyl0LnRib2R5RWwucmVtb3ZlKCk7dGhpcy5yb3dTdHJ1Y3RzPW51bGx9LHJlbmRlclNlZ1Jvd3M6ZnVuY3Rpb24odCl7dmFyIGUsbixpPVtdO2ZvcihlPXRoaXMuZ3JvdXBTZWdSb3dzKHQpLG49MDtuPGUubGVuZ3RoO24rKylpLnB1c2godGhpcy5yZW5kZXJTZWdSb3cobixlW25dKSk7cmV0dXJuIGl9LGZnU2VnSHRtbDpmdW5jdGlvbih0LGUpe3ZhciBuLGkscj10aGlzLnZpZXcscz10LmV2ZW50LG89ci5pc0V2ZW50RHJhZ2dhYmxlKHMpLGw9IWUmJnMuYWxsRGF5JiZ0LmlzU3RhcnQmJnIuaXNFdmVudFJlc2l6YWJsZUZyb21TdGFydChzKSxhPSFlJiZzLmFsbERheSYmdC5pc0VuZCYmci5pc0V2ZW50UmVzaXphYmxlRnJvbUVuZChzKSx1PXRoaXMuZ2V0U2VnQ2xhc3Nlcyh0LG8sbHx8YSksZD1udCh0aGlzLmdldFNlZ1NraW5Dc3ModCkpLGM9IiI7cmV0dXJuIHUudW5zaGlmdCgiZmMtZGF5LWdyaWQtZXZlbnQiLCJmYy1oLWV2ZW50IiksdC5pc1N0YXJ0JiYobj10aGlzLmdldEV2ZW50VGltZVRleHQocyksbiYmKGM9JzxzcGFuIGNsYXNzPSJmYy10aW1lIj4nK3R0KG4pKyI8L3NwYW4+IikpLGk9JzxzcGFuIGNsYXNzPSJmYy10aXRsZSI+JysodHQocy50aXRsZXx8IiIpfHwiJm5ic3A7IikrIjwvc3Bhbj4iLCc8YSBjbGFzcz0iJyt1LmpvaW4oIiAiKSsnIicrKHMudXJsPycgaHJlZj0iJyt0dChzLnVybCkrJyInOiIiKSsoZD8nIHN0eWxlPSInK2QrJyInOiIiKSsnPjxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicrKHRoaXMuaXNSVEw/aSsiICIrYzpjKyIgIitpKSsiPC9kaXY+IisobD8nPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1zdGFydC1yZXNpemVyIiAvPic6IiIpKyhhPyc8ZGl2IGNsYXNzPSJmYy1yZXNpemVyIGZjLWVuZC1yZXNpemVyIiAvPic6IiIpKyI8L2E+In0scmVuZGVyU2VnUm93OmZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaShlKXtmb3IoO288ZTspZD0obVtyLTFdfHxbXSlbb10sZD9kLmF0dHIoInJvd3NwYW4iLHBhcnNlSW50KGQuYXR0cigicm93c3BhbiIpfHwxLDEwKSsxKTooZD10KCI8dGQvPiIpLGwuYXBwZW5kKGQpKSx2W3JdW29dPWQsbVtyXVtvXT1kLG8rK312YXIgcixzLG8sbCxhLHUsZCxjPXRoaXMuY29sQ250LGg9dGhpcy5idWlsZFNlZ0xldmVscyhuKSxmPU1hdGgubWF4KDEsaC5sZW5ndGgpLGc9dCgiPHRib2R5Lz4iKSxwPVtdLHY9W10sbT1bXTtmb3Iocj0wO3I8ZjtyKyspe2lmKHM9aFtyXSxvPTAsbD10KCI8dHIvPiIpLHAucHVzaChbXSksdi5wdXNoKFtdKSxtLnB1c2goW10pLHMpZm9yKGE9MDthPHMubGVuZ3RoO2ErKyl7Zm9yKHU9c1thXSxpKHUubGVmdENvbCksZD10KCc8dGQgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciIvPicpLmFwcGVuZCh1LmVsKSx1LmxlZnRDb2whPXUucmlnaHRDb2w/ZC5hdHRyKCJjb2xzcGFuIix1LnJpZ2h0Q29sLXUubGVmdENvbCsxKTptW3JdW29dPWQ7bzw9dS5yaWdodENvbDspdltyXVtvXT1kLHBbcl1bb109dSxvKys7bC5hcHBlbmQoZCl9aShjKSx0aGlzLmJvb2tlbmRDZWxscyhsKSxnLmFwcGVuZChsKX1yZXR1cm57cm93OmUsdGJvZHlFbDpnLGNlbGxNYXRyaXg6dixzZWdNYXRyaXg6cCxzZWdMZXZlbHM6aCxzZWdzOm59fSxidWlsZFNlZ0xldmVsczpmdW5jdGlvbih0KXt2YXIgZSxuLGkscj1bXTtmb3IodGhpcy5zb3J0RXZlbnRTZWdzKHQpLGU9MDtlPHQubGVuZ3RoO2UrKyl7Zm9yKG49dFtlXSxpPTA7aTxyLmxlbmd0aCYmTHQobixyW2ldKTtpKyspO24ubGV2ZWw9aSwocltpXXx8KHJbaV09W10pKS5wdXNoKG4pfWZvcihpPTA7aTxyLmxlbmd0aDtpKyspcltpXS5zb3J0KEJ0KTtyZXR1cm4gcn0sZ3JvdXBTZWdSb3dzOmZ1bmN0aW9uKHQpe3ZhciBlLG49W107Zm9yKGU9MDtlPHRoaXMucm93Q250O2UrKyluLnB1c2goW10pO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspblt0W2VdLnJvd10ucHVzaCh0W2VdKTtyZXR1cm4gbn19KSxtZS5taXhpbih7c2VnUG9wb3ZlcjpudWxsLHBvcG92ZXJTZWdzOm51bGwscmVtb3ZlU2VnUG9wb3ZlcjpmdW5jdGlvbigpe3RoaXMuc2VnUG9wb3ZlciYmdGhpcy5zZWdQb3BvdmVyLmhpZGUoKX0sbGltaXRSb3dzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnJvd1N0cnVjdHN8fFtdO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspdGhpcy51bmxpbWl0Um93KGUpLG49ISF0JiYoIm51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5jb21wdXRlUm93TGV2ZWxMaW1pdChlKSksbiE9PSExJiZ0aGlzLmxpbWl0Um93KGUsbil9LGNvbXB1dGVSb3dMZXZlbExpbWl0OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oZSxuKXtzPU1hdGgubWF4KHMsdChuKS5vdXRlckhlaWdodCgpKX12YXIgaSxyLHMsbz10aGlzLnJvd0Vscy5lcShlKSxsPW8uaGVpZ2h0KCksYT10aGlzLnJvd1N0cnVjdHNbZV0udGJvZHlFbC5jaGlsZHJlbigpO2ZvcihpPTA7aTxhLmxlbmd0aDtpKyspaWYocj1hLmVxKGkpLnJlbW92ZUNsYXNzKCJmYy1saW1pdGVkIikscz0wLHIuZmluZCgiPiB0ZCA+IDpmaXJzdC1jaGlsZCIpLmVhY2gobiksci5wb3NpdGlvbigpLnRvcCtzPmwpcmV0dXJuIGk7cmV0dXJuITF9LGxpbWl0Um93OmZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaShpKXtmb3IoO0Q8aTspdT1TLmdldENlbGxTZWdzKGUsRCxuKSx1Lmxlbmd0aCYmKGg9c1tuLTFdW0RdLHk9Uy5yZW5kZXJNb3JlTGluayhlLEQsdSksbT10KCI8ZGl2Lz4iKS5hcHBlbmQoeSksaC5hcHBlbmQobSksRS5wdXNoKG1bMF0pKSxEKyt9dmFyIHIscyxvLGwsYSx1LGQsYyxoLGYsZyxwLHYsbSx5LFM9dGhpcyx3PXRoaXMucm93U3RydWN0c1tlXSxFPVtdLEQ9MDtpZihuJiZuPHcuc2VnTGV2ZWxzLmxlbmd0aCl7Zm9yKHI9dy5zZWdMZXZlbHNbbi0xXSxzPXcuY2VsbE1hdHJpeCxvPXcudGJvZHlFbC5jaGlsZHJlbigpLnNsaWNlKG4pLmFkZENsYXNzKCJmYy1saW1pdGVkIikuZ2V0KCksbD0wO2w8ci5sZW5ndGg7bCsrKXtmb3IoYT1yW2xdLGkoYS5sZWZ0Q29sKSxjPVtdLGQ9MDtEPD1hLnJpZ2h0Q29sOyl1PXRoaXMuZ2V0Q2VsbFNlZ3MoZSxELG4pLGMucHVzaCh1KSxkKz11Lmxlbmd0aCxEKys7aWYoZCl7Zm9yKGg9c1tuLTFdW2EubGVmdENvbF0sZj1oLmF0dHIoInJvd3NwYW4iKXx8MSxnPVtdLHA9MDtwPGMubGVuZ3RoO3ArKyl2PXQoJzx0ZCBjbGFzcz0iZmMtbW9yZS1jZWxsIi8+JykuYXR0cigicm93c3BhbiIsZiksdT1jW3BdLHk9dGhpcy5yZW5kZXJNb3JlTGluayhlLGEubGVmdENvbCtwLFthXS5jb25jYXQodSkpLG09dCgiPGRpdi8+IikuYXBwZW5kKHkpLHYuYXBwZW5kKG0pLGcucHVzaCh2WzBdKSxFLnB1c2godlswXSk7aC5hZGRDbGFzcygiZmMtbGltaXRlZCIpLmFmdGVyKHQoZykpLG8ucHVzaChoWzBdKX19aSh0aGlzLmNvbENudCksdy5tb3JlRWxzPXQoRSksdy5saW1pdGVkRWxzPXQobyl9fSx1bmxpbWl0Um93OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucm93U3RydWN0c1t0XTtlLm1vcmVFbHMmJihlLm1vcmVFbHMucmVtb3ZlKCksZS5tb3JlRWxzPW51bGwpLGUubGltaXRlZEVscyYmKGUubGltaXRlZEVscy5yZW1vdmVDbGFzcygiZmMtbGltaXRlZCIpLGUubGltaXRlZEVscz1udWxsKX0scmVuZGVyTW9yZUxpbms6ZnVuY3Rpb24oZSxuLGkpe3ZhciByPXRoaXMscz10aGlzLnZpZXc7cmV0dXJuIHQoJzxhIGNsYXNzPSJmYy1tb3JlIi8+JykudGV4dCh0aGlzLmdldE1vcmVMaW5rVGV4dChpLmxlbmd0aCkpLm9uKCJjbGljayIsZnVuY3Rpb24obyl7dmFyIGw9cy5vcHQoImV2ZW50TGltaXRDbGljayIpLGE9ci5nZXRDZWxsRGF0ZShlLG4pLHU9dCh0aGlzKSxkPXIuZ2V0Q2VsbEVsKGUsbiksYz1yLmdldENlbGxTZWdzKGUsbiksaD1yLnJlc2xpY2VEYXlTZWdzKGMsYSksZj1yLnJlc2xpY2VEYXlTZWdzKGksYSk7ImZ1bmN0aW9uIj09dHlwZW9mIGwmJihsPXMudHJpZ2dlcigiZXZlbnRMaW1pdENsaWNrIixudWxsLHtkYXRlOmEsZGF5RWw6ZCxtb3JlRWw6dSxzZWdzOmgsaGlkZGVuU2VnczpmfSxvKSksInBvcG92ZXIiPT09bD9yLnNob3dTZWdQb3BvdmVyKGUsbix1LGgpOiJzdHJpbmciPT10eXBlb2YgbCYmcy5jYWxlbmRhci56b29tVG8oYSxsKX0pfSxzaG93U2VnUG9wb3ZlcjpmdW5jdGlvbih0LGUsbixpKXt2YXIgcixzLG89dGhpcyxsPXRoaXMudmlldyxhPW4ucGFyZW50KCk7cj0xPT10aGlzLnJvd0NudD9sLmVsOnRoaXMucm93RWxzLmVxKHQpLHM9e2NsYXNzTmFtZToiZmMtbW9yZS1wb3BvdmVyIixjb250ZW50OnRoaXMucmVuZGVyU2VnUG9wb3ZlckNvbnRlbnQodCxlLGkpLHBhcmVudEVsOnRoaXMudmlldy5lbCx0b3A6ci5vZmZzZXQoKS50b3AsYXV0b0hpZGU6ITAsdmlld3BvcnRDb25zdHJhaW46bC5vcHQoInBvcG92ZXJWaWV3cG9ydENvbnN0cmFpbiIpLGhpZGU6ZnVuY3Rpb24oKXtvLnNlZ1BvcG92ZXIucmVtb3ZlRWxlbWVudCgpLG8uc2VnUG9wb3Zlcj1udWxsLG8ucG9wb3ZlclNlZ3M9bnVsbH19LHRoaXMuaXNSVEw/cy5yaWdodD1hLm9mZnNldCgpLmxlZnQrYS5vdXRlcldpZHRoKCkrMTpzLmxlZnQ9YS5vZmZzZXQoKS5sZWZ0LTEsdGhpcy5zZWdQb3BvdmVyPW5ldyBkZShzKSx0aGlzLnNlZ1BvcG92ZXIuc2hvdygpLHRoaXMuYmluZFNlZ0hhbmRsZXJzVG9FbCh0aGlzLnNlZ1BvcG92ZXIuZWwpfSxyZW5kZXJTZWdQb3BvdmVyQ29udGVudDpmdW5jdGlvbihlLG4saSl7dmFyIHIscz10aGlzLnZpZXcsbz1zLm9wdCgidGhlbWUiKSxsPXRoaXMuZ2V0Q2VsbERhdGUoZSxuKS5mb3JtYXQocy5vcHQoImRheVBvcG92ZXJGb3JtYXQiKSksYT10KCc8ZGl2IGNsYXNzPSJmYy1oZWFkZXIgJytzLndpZGdldEhlYWRlckNsYXNzKyciPjxzcGFuIGNsYXNzPSJmYy1jbG9zZSAnKyhvPyJ1aS1pY29uIHVpLWljb24tY2xvc2V0aGljayI6ImZjLWljb24gZmMtaWNvbi14IikrJyI+PC9zcGFuPjxzcGFuIGNsYXNzPSJmYy10aXRsZSI+Jyt0dChsKSsnPC9zcGFuPjxkaXYgY2xhc3M9ImZjLWNsZWFyIi8+PC9kaXY+PGRpdiBjbGFzcz0iZmMtYm9keSAnK3Mud2lkZ2V0Q29udGVudENsYXNzKyciPjxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciI+PC9kaXY+PC9kaXY+JyksdT1hLmZpbmQoIi5mYy1ldmVudC1jb250YWluZXIiKTtmb3IoaT10aGlzLnJlbmRlckZnU2VnRWxzKGksITApLHRoaXMucG9wb3ZlclNlZ3M9aSxyPTA7cjxpLmxlbmd0aDtyKyspdGhpcy5wcmVwYXJlSGl0cygpLGlbcl0uaGl0PXRoaXMuZ2V0Q2VsbEhpdChlLG4pLHRoaXMucmVsZWFzZUhpdHMoKSx1LmFwcGVuZChpW3JdLmVsKTtyZXR1cm4gYX0scmVzbGljZURheVNlZ3M6ZnVuY3Rpb24oZSxuKXt2YXIgaT10Lm1hcChlLGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2ZW50fSkscj1uLmNsb25lKCkscz1yLmNsb25lKCkuYWRkKDEsImRheXMiKSxvPXtzdGFydDpyLGVuZDpzfTtyZXR1cm4gZT10aGlzLmV2ZW50c1RvU2VncyhpLGZ1bmN0aW9uKHQpe3ZhciBlPUYodCxvKTtyZXR1cm4gZT9bZV06W119KSx0aGlzLnNvcnRFdmVudFNlZ3MoZSksZX0sZ2V0TW9yZUxpbmtUZXh0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlldy5vcHQoImV2ZW50TGltaXRUZXh0Iik7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSh0KToiKyIrdCsiICIrZX0sZ2V0Q2VsbFNlZ3M6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSxyPXRoaXMucm93U3RydWN0c1t0XS5zZWdNYXRyaXgscz1ufHwwLG89W107czxyLmxlbmd0aDspaT1yW3NdW2VdLGkmJm8ucHVzaChpKSxzKys7cmV0dXJuIG99fSk7dmFyIHllPWp0LlRpbWVHcmlkPXBlLmV4dGVuZCh2ZSx7c2xvdER1cmF0aW9uOm51bGwsc25hcER1cmF0aW9uOm51bGwsc25hcHNQZXJTbG90Om51bGwsbWluVGltZTpudWxsLG1heFRpbWU6bnVsbCxsYWJlbEZvcm1hdDpudWxsLGxhYmVsSW50ZXJ2YWw6bnVsbCxjb2xFbHM6bnVsbCxzbGF0Q29udGFpbmVyRWw6bnVsbCxzbGF0RWxzOm51bGwsbm93SW5kaWNhdG9yRWxzOm51bGwsY29sQ29vcmRDYWNoZTpudWxsLHNsYXRDb29yZENhY2hlOm51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24oKXtwZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wcm9jZXNzT3B0aW9ucygpfSxyZW5kZXJEYXRlczpmdW5jdGlvbigpe3RoaXMuZWwuaHRtbCh0aGlzLnJlbmRlckh0bWwoKSksdGhpcy5jb2xFbHM9dGhpcy5lbC5maW5kKCIuZmMtZGF5IiksdGhpcy5zbGF0Q29udGFpbmVyRWw9dGhpcy5lbC5maW5kKCIuZmMtc2xhdHMiKSx0aGlzLnNsYXRFbHM9dGhpcy5zbGF0Q29udGFpbmVyRWwuZmluZCgidHIiKSx0aGlzLmNvbENvb3JkQ2FjaGU9bmV3IGNlKHtlbHM6dGhpcy5jb2xFbHMsaXNIb3Jpem9udGFsOiEwfSksdGhpcy5zbGF0Q29vcmRDYWNoZT1uZXcgY2Uoe2Vsczp0aGlzLnNsYXRFbHMsaXNWZXJ0aWNhbDohMH0pLHRoaXMucmVuZGVyQ29udGVudFNrZWxldG9uKCl9LHJlbmRlckh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4nPGRpdiBjbGFzcz0iZmMtYmciPjx0YWJsZT4nK3RoaXMucmVuZGVyQmdUckh0bWwoMCkrJzwvdGFibGU+PC9kaXY+PGRpdiBjbGFzcz0iZmMtc2xhdHMiPjx0YWJsZT4nK3RoaXMucmVuZGVyU2xhdFJvd0h0bWwoKSsiPC90YWJsZT48L2Rpdj4ifSxyZW5kZXJTbGF0Um93SHRtbDpmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGkscj10aGlzLnZpZXcscz10aGlzLmlzUlRMLG89IiIsbD1lLmR1cmF0aW9uKCt0aGlzLm1pblRpbWUpO2w8dGhpcy5tYXhUaW1lOyl0PXRoaXMuc3RhcnQuY2xvbmUoKS50aW1lKGwpLG49b3QoXyhsLHRoaXMubGFiZWxJbnRlcnZhbCkpLGk9Jzx0ZCBjbGFzcz0iZmMtYXhpcyBmYy10aW1lICcrci53aWRnZXRDb250ZW50Q2xhc3MrJyIgJytyLmF4aXNTdHlsZUF0dHIoKSsiPiIrKG4/IjxzcGFuPiIrdHQodC5mb3JtYXQodGhpcy5sYWJlbEZvcm1hdCkpKyI8L3NwYW4+IjoiIikrIjwvdGQ+IixvKz0nPHRyIGRhdGEtdGltZT0iJyt0LmZvcm1hdCgiSEg6bW06c3MiKSsnIicrKG4/IiI6JyBjbGFzcz0iZmMtbWlub3IiJykrIj4iKyhzPyIiOmkpKyc8dGQgY2xhc3M9Iicrci53aWRnZXRDb250ZW50Q2xhc3MrJyIvPicrKHM/aToiIikrIjwvdHI+IixsLmFkZCh0aGlzLnNsb3REdXJhdGlvbik7cmV0dXJuIG99LHByb2Nlc3NPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIG4saT10aGlzLnZpZXcscj1pLm9wdCgic2xvdER1cmF0aW9uIikscz1pLm9wdCgic25hcER1cmF0aW9uIik7cj1lLmR1cmF0aW9uKHIpLHM9cz9lLmR1cmF0aW9uKHMpOnIsdGhpcy5zbG90RHVyYXRpb249cix0aGlzLnNuYXBEdXJhdGlvbj1zLHRoaXMuc25hcHNQZXJTbG90PXIvcyx0aGlzLm1pblJlc2l6ZUR1cmF0aW9uPXMsdGhpcy5taW5UaW1lPWUuZHVyYXRpb24oaS5vcHQoIm1pblRpbWUiKSksdGhpcy5tYXhUaW1lPWUuZHVyYXRpb24oaS5vcHQoIm1heFRpbWUiKSksbj1pLm9wdCgic2xvdExhYmVsRm9ybWF0IiksdC5pc0FycmF5KG4pJiYobj1uW24ubGVuZ3RoLTFdKSx0aGlzLmxhYmVsRm9ybWF0PW58fGkub3B0KCJzbWFsbFRpbWVGb3JtYXQiKSxuPWkub3B0KCJzbG90TGFiZWxJbnRlcnZhbCIpLHRoaXMubGFiZWxJbnRlcnZhbD1uP2UuZHVyYXRpb24obik6dGhpcy5jb21wdXRlTGFiZWxJbnRlcnZhbChyKX0sY29tcHV0ZUxhYmVsSW50ZXJ2YWw6ZnVuY3Rpb24odCl7dmFyIG4saSxyO2ZvcihuPU5lLmxlbmd0aC0xO24+PTA7bi0tKWlmKGk9ZS5kdXJhdGlvbihOZVtuXSkscj1fKGksdCksb3QocikmJnI+MSlyZXR1cm4gaTtyZXR1cm4gZS5kdXJhdGlvbih0KX0sY29tcHV0ZUV2ZW50VGltZUZvcm1hdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcub3B0KCJub01lcmlkaWVtVGltZUZvcm1hdCIpfSxjb21wdXRlRGlzcGxheUV2ZW50RW5kOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHByZXBhcmVIaXRzOmZ1bmN0aW9uKCl7dGhpcy5jb2xDb29yZENhY2hlLmJ1aWxkKCksdGhpcy5zbGF0Q29vcmRDYWNoZS5idWlsZCgpfSxyZWxlYXNlSGl0czpmdW5jdGlvbigpe3RoaXMuY29sQ29vcmRDYWNoZS5jbGVhcigpfSxxdWVyeUhpdDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc25hcHNQZXJTbG90LGk9dGhpcy5jb2xDb29yZENhY2hlLHI9dGhpcy5zbGF0Q29vcmRDYWNoZTtpZihpLmlzTGVmdEluQm91bmRzKHQpJiZyLmlzVG9wSW5Cb3VuZHMoZSkpe3ZhciBzPWkuZ2V0SG9yaXpvbnRhbEluZGV4KHQpLG89ci5nZXRWZXJ0aWNhbEluZGV4KGUpO2lmKG51bGwhPXMmJm51bGwhPW8pe3ZhciBsPXIuZ2V0VG9wT2Zmc2V0KG8pLGE9ci5nZXRIZWlnaHQobyksdT0oZS1sKS9hLGQ9TWF0aC5mbG9vcih1Km4pLGM9bypuK2QsaD1sK2QvbiphLGY9bCsoZCsxKS9uKmE7cmV0dXJue2NvbDpzLHNuYXA6Yyxjb21wb25lbnQ6dGhpcyxsZWZ0OmkuZ2V0TGVmdE9mZnNldChzKSxyaWdodDppLmdldFJpZ2h0T2Zmc2V0KHMpLHRvcDpoLGJvdHRvbTpmfX19fSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5nZXRDZWxsRGF0ZSgwLHQuY29sKSxpPXRoaXMuY29tcHV0ZVNuYXBUaW1lKHQuc25hcCk7cmV0dXJuIG4udGltZShpKSxlPW4uY2xvbmUoKS5hZGQodGhpcy5zbmFwRHVyYXRpb24pLHtzdGFydDpuLGVuZDplfX0sZ2V0SGl0RWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29sRWxzLmVxKHQuY29sKX0scmFuZ2VVcGRhdGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVEYXlUYWJsZSgpfSxjb21wdXRlU25hcFRpbWU6ZnVuY3Rpb24odCl7cmV0dXJuIGUuZHVyYXRpb24odGhpcy5taW5UaW1lK3RoaXMuc25hcER1cmF0aW9uKnQpfSxzcGFuVG9TZWdzOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5zbGljZVJhbmdlQnlUaW1lcyh0KTtmb3IoZT0wO2U8bi5sZW5ndGg7ZSsrKXRoaXMuaXNSVEw/bltlXS5jb2w9dGhpcy5kYXlzUGVyUm93LTEtbltlXS5kYXlJbmRleDpuW2VdLmNvbD1uW2VdLmRheUluZGV4O3JldHVybiBufSxzbGljZVJhbmdlQnlUaW1lczpmdW5jdGlvbih0KXt2YXIgZSxuLGkscixzPVtdO2ZvcihuPTA7bjx0aGlzLmRheXNQZXJSb3c7bisrKWk9dGhpcy5kYXlEYXRlc1tuXS5jbG9uZSgpLHI9e3N0YXJ0OmkuY2xvbmUoKS50aW1lKHRoaXMubWluVGltZSksZW5kOmkuY2xvbmUoKS50aW1lKHRoaXMubWF4VGltZSl9LGU9Rih0LHIpLGUmJihlLmRheUluZGV4PW4scy5wdXNoKGUpKTtyZXR1cm4gc30sdXBkYXRlU2l6ZTpmdW5jdGlvbih0KXt0aGlzLnNsYXRDb29yZENhY2hlLmJ1aWxkKCksdCYmdGhpcy51cGRhdGVTZWdWZXJ0aWNhbHMoW10uY29uY2F0KHRoaXMuZmdTZWdzfHxbXSx0aGlzLmJnU2Vnc3x8W10sdGhpcy5idXNpbmVzc1NlZ3N8fFtdKSl9LGdldFRvdGFsU2xhdEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNsYXRDb250YWluZXJFbC5vdXRlckhlaWdodCgpfSxjb21wdXRlRGF0ZVRvcDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmNvbXB1dGVUaW1lVG9wKGUuZHVyYXRpb24odC1uLmNsb25lKCkuc3RyaXBUaW1lKCkpKX0sY29tcHV0ZVRpbWVUb3A6ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMuc2xhdEVscy5sZW5ndGgscj0odC10aGlzLm1pblRpbWUpL3RoaXMuc2xvdER1cmF0aW9uO3JldHVybiByPU1hdGgubWF4KDAscikscj1NYXRoLm1pbihpLHIpLGU9TWF0aC5mbG9vcihyKSxlPU1hdGgubWluKGUsaS0xKSxuPXItZSx0aGlzLnNsYXRDb29yZENhY2hlLmdldFRvcFBvc2l0aW9uKGUpK3RoaXMuc2xhdENvb3JkQ2FjaGUuZ2V0SGVpZ2h0KGUpKm59LHJlbmRlckRyYWc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT90aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIodCxlKTp2b2lkIHRoaXMucmVuZGVySGlnaGxpZ2h0KHRoaXMuZXZlbnRUb1NwYW4odCkpfSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGVscGVyKCksdGhpcy51bnJlbmRlckhpZ2hsaWdodCgpfSxyZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIodCxlKX0sdW5yZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIZWxwZXIoKX0scmVuZGVySGVscGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVuZGVySGVscGVyU2Vncyh0aGlzLmV2ZW50VG9TZWdzKHQpLGUpfSx1bnJlbmRlckhlbHBlcjpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIZWxwZXJTZWdzKCl9LHJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt0aGlzLnJlbmRlckJ1c2luZXNzU2Vncyh0aGlzLmJ1aWxkQnVzaW5lc3NIb3VyU2VncygpKX0sdW5yZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy51bnJlbmRlckJ1c2luZXNzU2VncygpfSxnZXROb3dJbmRpY2F0b3JVbml0OmZ1bmN0aW9uKCl7cmV0dXJuIm1pbnV0ZSJ9LHJlbmRlck5vd0luZGljYXRvcjpmdW5jdGlvbihlKXt2YXIgbixpPXRoaXMuc3BhblRvU2Vncyh7c3RhcnQ6ZSxlbmQ6ZX0pLHI9dGhpcy5jb21wdXRlRGF0ZVRvcChlLGUpLHM9W107Zm9yKG49MDtuPGkubGVuZ3RoO24rKylzLnB1c2godCgnPGRpdiBjbGFzcz0iZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWxpbmUiPjwvZGl2PicpLmNzcygidG9wIixyKS5hcHBlbmRUbyh0aGlzLmNvbENvbnRhaW5lckVscy5lcShpW25dLmNvbCkpWzBdKTtpLmxlbmd0aD4wJiZzLnB1c2godCgnPGRpdiBjbGFzcz0iZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWFycm93Ij48L2Rpdj4nKS5jc3MoInRvcCIscikuYXBwZW5kVG8odGhpcy5lbC5maW5kKCIuZmMtY29udGVudC1za2VsZXRvbiIpKVswXSksdGhpcy5ub3dJbmRpY2F0b3JFbHM9dChzKX0sdW5yZW5kZXJOb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt0aGlzLm5vd0luZGljYXRvckVscyYmKHRoaXMubm93SW5kaWNhdG9yRWxzLnJlbW92ZSgpLHRoaXMubm93SW5kaWNhdG9yRWxzPW51bGwpfSxyZW5kZXJTZWxlY3Rpb246ZnVuY3Rpb24odCl7dGhpcy52aWV3Lm9wdCgic2VsZWN0SGVscGVyIik/dGhpcy5yZW5kZXJFdmVudExvY2F0aW9uSGVscGVyKHQpOnRoaXMucmVuZGVySGlnaGxpZ2h0KHQpfSx1bnJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIZWxwZXIoKSx0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCl9LHJlbmRlckhpZ2hsaWdodDpmdW5jdGlvbih0KXt0aGlzLnJlbmRlckhpZ2hsaWdodFNlZ3ModGhpcy5zcGFuVG9TZWdzKHQpKX0sdW5yZW5kZXJIaWdobGlnaHQ6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGlnaGxpZ2h0U2VncygpfX0pO3llLm1peGluKHtjb2xDb250YWluZXJFbHM6bnVsbCxmZ0NvbnRhaW5lckVsczpudWxsLGJnQ29udGFpbmVyRWxzOm51bGwsaGVscGVyQ29udGFpbmVyRWxzOm51bGwsaGlnaGxpZ2h0Q29udGFpbmVyRWxzOm51bGwsYnVzaW5lc3NDb250YWluZXJFbHM6bnVsbCxmZ1NlZ3M6bnVsbCxiZ1NlZ3M6bnVsbCxoZWxwZXJTZWdzOm51bGwsaGlnaGxpZ2h0U2VnczpudWxsLGJ1c2luZXNzU2VnczpudWxsLHJlbmRlckNvbnRlbnRTa2VsZXRvbjpmdW5jdGlvbigpe3ZhciBlLG4saT0iIjtmb3IoZT0wO2U8dGhpcy5jb2xDbnQ7ZSsrKWkrPSc8dGQ+PGRpdiBjbGFzcz0iZmMtY29udGVudC1jb2wiPjxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciBmYy1oZWxwZXItY29udGFpbmVyIj48L2Rpdj48ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiPjwvZGl2PjxkaXYgY2xhc3M9ImZjLWhpZ2hsaWdodC1jb250YWluZXIiPjwvZGl2PjxkaXYgY2xhc3M9ImZjLWJnZXZlbnQtY29udGFpbmVyIj48L2Rpdj48ZGl2IGNsYXNzPSJmYy1idXNpbmVzcy1jb250YWluZXIiPjwvZGl2PjwvZGl2PjwvdGQ+JztuPXQoJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQtc2tlbGV0b24iPjx0YWJsZT48dHI+JytpKyI8L3RyPjwvdGFibGU+PC9kaXY+IiksdGhpcy5jb2xDb250YWluZXJFbHM9bi5maW5kKCIuZmMtY29udGVudC1jb2wiKSx0aGlzLmhlbHBlckNvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1oZWxwZXItY29udGFpbmVyIiksdGhpcy5mZ0NvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1ldmVudC1jb250YWluZXI6bm90KC5mYy1oZWxwZXItY29udGFpbmVyKSIpLHRoaXMuYmdDb250YWluZXJFbHM9bi5maW5kKCIuZmMtYmdldmVudC1jb250YWluZXIiKSx0aGlzLmhpZ2hsaWdodENvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1oaWdobGlnaHQtY29udGFpbmVyIiksdGhpcy5idXNpbmVzc0NvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1idXNpbmVzcy1jb250YWluZXIiKSx0aGlzLmJvb2tlbmRDZWxscyhuLmZpbmQoInRyIikpLHRoaXMuZWwuYXBwZW5kKG4pfSxyZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5yZW5kZXJGZ1NlZ3NJbnRvQ29udGFpbmVycyh0LHRoaXMuZmdDb250YWluZXJFbHMpLHRoaXMuZmdTZWdzPXQsdH0sdW5yZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCJmZ1NlZ3MiKX0scmVuZGVySGVscGVyU2VnczpmdW5jdGlvbihlLG4pe3ZhciBpLHIscyxvPVtdO2ZvcihlPXRoaXMucmVuZGVyRmdTZWdzSW50b0NvbnRhaW5lcnMoZSx0aGlzLmhlbHBlckNvbnRhaW5lckVscyksaT0wO2k8ZS5sZW5ndGg7aSsrKXI9ZVtpXSxuJiZuLmNvbD09PXIuY29sJiYocz1uLmVsLHIuZWwuY3NzKHtsZWZ0OnMuY3NzKCJsZWZ0IikscmlnaHQ6cy5jc3MoInJpZ2h0IiksIm1hcmdpbi1sZWZ0IjpzLmNzcygibWFyZ2luLWxlZnQiKSwibWFyZ2luLXJpZ2h0IjpzLmNzcygibWFyZ2luLXJpZ2h0Iil9KSksby5wdXNoKHIuZWxbMF0pO3JldHVybiB0aGlzLmhlbHBlclNlZ3M9ZSx0KG8pfSx1bnJlbmRlckhlbHBlclNlZ3M6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCJoZWxwZXJTZWdzIil9LHJlbmRlckJnU2VnczpmdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnJlbmRlckZpbGxTZWdFbHMoImJnRXZlbnQiLHQpLHRoaXMudXBkYXRlU2VnVmVydGljYWxzKHQpLHRoaXMuYXR0YWNoU2Vnc0J5Q29sKHRoaXMuZ3JvdXBTZWdzQnlDb2wodCksdGhpcy5iZ0NvbnRhaW5lckVscyksdGhpcy5iZ1NlZ3M9dCx0fSx1bnJlbmRlckJnU2VnczpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJOYW1lZFNlZ3MoImJnU2VncyIpfSxyZW5kZXJIaWdobGlnaHRTZWdzOmZ1bmN0aW9uKHQpe3Q9dGhpcy5yZW5kZXJGaWxsU2VnRWxzKCJoaWdobGlnaHQiLHQpLHRoaXMudXBkYXRlU2VnVmVydGljYWxzKHQpLHRoaXMuYXR0YWNoU2Vnc0J5Q29sKHRoaXMuZ3JvdXBTZWdzQnlDb2wodCksdGhpcy5oaWdobGlnaHRDb250YWluZXJFbHMpLHRoaXMuaGlnaGxpZ2h0U2Vncz10fSx1bnJlbmRlckhpZ2hsaWdodFNlZ3M6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCJoaWdobGlnaHRTZWdzIil9LHJlbmRlckJ1c2luZXNzU2VnczpmdW5jdGlvbih0KXt0PXRoaXMucmVuZGVyRmlsbFNlZ0VscygiYnVzaW5lc3NIb3VycyIsdCksdGhpcy51cGRhdGVTZWdWZXJ0aWNhbHModCksdGhpcy5hdHRhY2hTZWdzQnlDb2wodGhpcy5ncm91cFNlZ3NCeUNvbCh0KSx0aGlzLmJ1c2luZXNzQ29udGFpbmVyRWxzKSx0aGlzLmJ1c2luZXNzU2Vncz10fSx1bnJlbmRlckJ1c2luZXNzU2VnczpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJOYW1lZFNlZ3MoImJ1c2luZXNzU2VncyIpfSxncm91cFNlZ3NCeUNvbDpmdW5jdGlvbih0KXt2YXIgZSxuPVtdO2ZvcihlPTA7ZTx0aGlzLmNvbENudDtlKyspbi5wdXNoKFtdKTtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKW5bdFtlXS5jb2xdLnB1c2godFtlXSk7cmV0dXJuIG59LGF0dGFjaFNlZ3NCeUNvbDpmdW5jdGlvbih0LGUpe3ZhciBuLGkscjtmb3Iobj0wO248dGhpcy5jb2xDbnQ7bisrKWZvcihpPXRbbl0scj0wO3I8aS5sZW5ndGg7cisrKWUuZXEobikuYXBwZW5kKGlbcl0uZWwpfSx1bnJlbmRlck5hbWVkU2VnczpmdW5jdGlvbih0KXt2YXIgZSxuPXRoaXNbdF07aWYobil7Zm9yKGU9MDtlPG4ubGVuZ3RoO2UrKyluW2VdLmVsLnJlbW92ZSgpO3RoaXNbdF09bnVsbH19LHJlbmRlckZnU2Vnc0ludG9Db250YWluZXJzOmZ1bmN0aW9uKHQsZSl7dmFyIG4saTtmb3IodD10aGlzLnJlbmRlckZnU2VnRWxzKHQpLG49dGhpcy5ncm91cFNlZ3NCeUNvbCh0KSxpPTA7aTx0aGlzLmNvbENudDtpKyspdGhpcy51cGRhdGVGZ1NlZ0Nvb3JkcyhuW2ldKTtyZXR1cm4gdGhpcy5hdHRhY2hTZWdzQnlDb2wobixlKSx0fSxmZ1NlZ0h0bWw6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHIscz10aGlzLnZpZXcsbz10LmV2ZW50LGw9cy5pc0V2ZW50RHJhZ2dhYmxlKG8pLGE9IWUmJnQuaXNTdGFydCYmcy5pc0V2ZW50UmVzaXphYmxlRnJvbVN0YXJ0KG8pLHU9IWUmJnQuaXNFbmQmJnMuaXNFdmVudFJlc2l6YWJsZUZyb21FbmQobyksZD10aGlzLmdldFNlZ0NsYXNzZXModCxsLGF8fHUpLGM9bnQodGhpcy5nZXRTZWdTa2luQ3NzKHQpKTtyZXR1cm4gZC51bnNoaWZ0KCJmYy10aW1lLWdyaWQtZXZlbnQiLCJmYy12LWV2ZW50Iikscy5pc011bHRpRGF5RXZlbnQobyk/KHQuaXNTdGFydHx8dC5pc0VuZCkmJihuPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dCh0KSxpPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dCh0LCJMVCIpLHI9dGhpcy5nZXRFdmVudFRpbWVUZXh0KHQsbnVsbCwhMSkpOihuPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dChvKSxpPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dChvLCJMVCIpLHI9dGhpcy5nZXRFdmVudFRpbWVUZXh0KG8sbnVsbCwhMSkpLCc8YSBjbGFzcz0iJytkLmpvaW4oIiAiKSsnIicrKG8udXJsPycgaHJlZj0iJyt0dChvLnVybCkrJyInOiIiKSsoYz8nIHN0eWxlPSInK2MrJyInOiIiKSsnPjxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicrKG4/JzxkaXYgY2xhc3M9ImZjLXRpbWUiIGRhdGEtc3RhcnQ9IicrdHQocikrJyIgZGF0YS1mdWxsPSInK3R0KGkpKyciPjxzcGFuPicrdHQobikrIjwvc3Bhbj48L2Rpdj4iOiIiKSsoby50aXRsZT8nPGRpdiBjbGFzcz0iZmMtdGl0bGUiPicrdHQoby50aXRsZSkrIjwvZGl2PiI6IiIpKyc8L2Rpdj48ZGl2IGNsYXNzPSJmYy1iZyIvPicrKHU/JzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtZW5kLXJlc2l6ZXIiIC8+JzoiIikrIjwvYT4ifSx1cGRhdGVTZWdWZXJ0aWNhbHM6ZnVuY3Rpb24odCl7dGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHQpLHRoaXMuYXNzaWduU2VnVmVydGljYWxzKHQpfSxjb21wdXRlU2VnVmVydGljYWxzOmZ1bmN0aW9uKHQpe3ZhciBlLG47Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyluPXRbZV0sbi50b3A9dGhpcy5jb21wdXRlRGF0ZVRvcChuLnN0YXJ0LG4uc3RhcnQpLG4uYm90dG9tPXRoaXMuY29tcHV0ZURhdGVUb3Aobi5lbmQsbi5zdGFydCl9LGFzc2lnblNlZ1ZlcnRpY2FsczpmdW5jdGlvbih0KXt2YXIgZSxuO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspbj10W2VdLG4uZWwuY3NzKHRoaXMuZ2VuZXJhdGVTZWdWZXJ0aWNhbENzcyhuKSl9LGdlbmVyYXRlU2VnVmVydGljYWxDc3M6ZnVuY3Rpb24odCl7cmV0dXJue3RvcDp0LnRvcCxib3R0b206LXQuYm90dG9tfX0sdXBkYXRlRmdTZWdDb29yZHM6ZnVuY3Rpb24odCl7dGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHQpLHRoaXMuY29tcHV0ZUZnU2VnSG9yaXpvbnRhbHModCksdGhpcy5hc3NpZ25TZWdWZXJ0aWNhbHModCksdGhpcy5hc3NpZ25GZ1NlZ0hvcml6b250YWxzKHQpfSxjb21wdXRlRmdTZWdIb3Jpem9udGFsczpmdW5jdGlvbih0KXt2YXIgZSxuLGk7aWYodGhpcy5zb3J0RXZlbnRTZWdzKHQpLGU9enQodCksRnQoZSksbj1lWzBdKXtmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKU50KG5baV0pO2ZvcihpPTA7aTxuLmxlbmd0aDtpKyspdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhuW2ldLDAsMCl9fSxjb21wdXRlRmdTZWdGb3J3YXJkQmFjazpmdW5jdGlvbih0LGUsbil7dmFyIGkscj10LmZvcndhcmRTZWdzO2lmKHZvaWQgMD09PXQuZm9yd2FyZENvb3JkKWZvcihyLmxlbmd0aD8odGhpcy5zb3J0Rm9yd2FyZFNlZ3MociksdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhyWzBdLGUrMSxuKSx0LmZvcndhcmRDb29yZD1yWzBdLmJhY2t3YXJkQ29vcmQpOnQuZm9yd2FyZENvb3JkPTEsdC5iYWNrd2FyZENvb3JkPXQuZm9yd2FyZENvb3JkLSh0LmZvcndhcmRDb29yZC1uKS8oZSsxKSxpPTA7aTxyLmxlbmd0aDtpKyspdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhyW2ldLDAsdC5mb3J3YXJkQ29vcmQpfSxzb3J0Rm9yd2FyZFNlZ3M6ZnVuY3Rpb24odCl7dC5zb3J0KGx0KHRoaXMsImNvbXBhcmVGb3J3YXJkU2VncyIpKX0sY29tcGFyZUZvcndhcmRTZWdzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZm9yd2FyZFByZXNzdXJlLXQuZm9yd2FyZFByZXNzdXJlfHwodC5iYWNrd2FyZENvb3JkfHwwKS0oZS5iYWNrd2FyZENvb3JkfHwwKXx8dGhpcy5jb21wYXJlRXZlbnRTZWdzKHQsZSl9LGFzc2lnbkZnU2VnSG9yaXpvbnRhbHM6ZnVuY3Rpb24odCl7dmFyIGUsbjtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKW49dFtlXSxuLmVsLmNzcyh0aGlzLmdlbmVyYXRlRmdTZWdIb3Jpem9udGFsQ3NzKG4pKSxuLmJvdHRvbS1uLnRvcDwzMCYmbi5lbC5hZGRDbGFzcygiZmMtc2hvcnQiKX0sZ2VuZXJhdGVGZ1NlZ0hvcml6b250YWxDc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMudmlldy5vcHQoInNsb3RFdmVudE92ZXJsYXAiKSxyPXQuYmFja3dhcmRDb29yZCxzPXQuZm9yd2FyZENvb3JkLG89dGhpcy5nZW5lcmF0ZVNlZ1ZlcnRpY2FsQ3NzKHQpO3JldHVybiBpJiYocz1NYXRoLm1pbigxLHIrMioocy1yKSkpLHRoaXMuaXNSVEw/KGU9MS1zLG49cik6KGU9cixuPTEtcyksby56SW5kZXg9dC5sZXZlbCsxLG8ubGVmdD0xMDAqZSsiJSIsby5yaWdodD0xMDAqbisiJSIsaSYmdC5mb3J3YXJkUHJlc3N1cmUmJihvW3RoaXMuaXNSVEw/Im1hcmdpbkxlZnQiOiJtYXJnaW5SaWdodCJdPTIwKSxvfX0pO3ZhciBTZT1qdC5WaWV3PXd0LmV4dGVuZChsZSxhZSx7dHlwZTpudWxsLG5hbWU6bnVsbCx0aXRsZTpudWxsLGNhbGVuZGFyOm51bGwsb3B0aW9uczpudWxsLGVsOm51bGwsZGlzcGxheWluZzpudWxsLGlzU2tlbGV0b25SZW5kZXJlZDohMSxpc0V2ZW50c1JlbmRlcmVkOiExLHN0YXJ0Om51bGwsZW5kOm51bGwsaW50ZXJ2YWxTdGFydDpudWxsLGludGVydmFsRW5kOm51bGwsaW50ZXJ2YWxEdXJhdGlvbjpudWxsLGludGVydmFsVW5pdDpudWxsLGlzUlRMOiExLGlzU2VsZWN0ZWQ6ITEsc2VsZWN0ZWRFdmVudDpudWxsLGV2ZW50T3JkZXJTcGVjczpudWxsLHdpZGdldEhlYWRlckNsYXNzOm51bGwsd2lkZ2V0Q29udGVudENsYXNzOm51bGwsaGlnaGxpZ2h0U3RhdGVDbGFzczpudWxsLG5leHREYXlUaHJlc2hvbGQ6bnVsbCxpc0hpZGRlbkRheUhhc2g6bnVsbCxpc05vd0luZGljYXRvclJlbmRlcmVkOm51bGwsaW5pdGlhbE5vd0RhdGU6bnVsbCxpbml0aWFsTm93UXVlcmllZE1zOm51bGwsbm93SW5kaWNhdG9yVGltZW91dElEOm51bGwsbm93SW5kaWNhdG9ySW50ZXJ2YWxJRDpudWxsLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQsbixpLHIpe3RoaXMuY2FsZW5kYXI9dCx0aGlzLnR5cGU9dGhpcy5uYW1lPW4sdGhpcy5vcHRpb25zPWksdGhpcy5pbnRlcnZhbER1cmF0aW9uPXJ8fGUuZHVyYXRpb24oMSwiZGF5IiksdGhpcy5uZXh0RGF5VGhyZXNob2xkPWUuZHVyYXRpb24odGhpcy5vcHQoIm5leHREYXlUaHJlc2hvbGQiKSksdGhpcy5pbml0VGhlbWluZ1Byb3BzKCksdGhpcy5pbml0SGlkZGVuRGF5cygpLHRoaXMuaXNSVEw9dGhpcy5vcHQoImlzUlRMIiksdGhpcy5ldmVudE9yZGVyU3BlY3M9TSh0aGlzLm9wdCgiZXZlbnRPcmRlciIpKSx0aGlzLmluaXRpYWxpemUoKX0saW5pdGlhbGl6ZTpmdW5jdGlvbigpe30sb3B0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnNbdF19LHRyaWdnZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNhbGVuZGFyO3JldHVybiBuLnRyaWdnZXIuYXBwbHkobixbdCxlfHx0aGlzXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpLFt0aGlzXSkpfSxzZXREYXRlOmZ1bmN0aW9uKHQpe3RoaXMuc2V0UmFuZ2UodGhpcy5jb21wdXRlUmFuZ2UodCkpfSxzZXRSYW5nZTpmdW5jdGlvbihlKXt0LmV4dGVuZCh0aGlzLGUpLHRoaXMudXBkYXRlVGl0bGUoKX0sY29tcHV0ZVJhbmdlOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT1PKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbikscj10LmNsb25lKCkuc3RhcnRPZihpKSxzPXIuY2xvbmUoKS5hZGQodGhpcy5pbnRlcnZhbER1cmF0aW9uKTtyZXR1cm4veWVhcnxtb250aHx3ZWVrfGRheS8udGVzdChpKT8oci5zdHJpcFRpbWUoKSxzLnN0cmlwVGltZSgpKTooci5oYXNUaW1lKCl8fChyPXRoaXMuY2FsZW5kYXIudGltZSgwKSkscy5oYXNUaW1lKCl8fChzPXRoaXMuY2FsZW5kYXIudGltZSgwKSkpLGU9ci5jbG9uZSgpLGU9dGhpcy5za2lwSGlkZGVuRGF5cyhlKSxuPXMuY2xvbmUoKSxuPXRoaXMuc2tpcEhpZGRlbkRheXMobiwtMSwhMCkse2ludGVydmFsVW5pdDppLGludGVydmFsU3RhcnQ6cixpbnRlcnZhbEVuZDpzLHN0YXJ0OmUsZW5kOm59fSxjb21wdXRlUHJldkRhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFzc2FnZUN1cnJlbnREYXRlKHQuY2xvbmUoKS5zdGFydE9mKHRoaXMuaW50ZXJ2YWxVbml0KS5zdWJ0cmFjdCh0aGlzLmludGVydmFsRHVyYXRpb24pLC0xKX0sY29tcHV0ZU5leHREYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hc3NhZ2VDdXJyZW50RGF0ZSh0LmNsb25lKCkuc3RhcnRPZih0aGlzLmludGVydmFsVW5pdCkuYWRkKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbikpfSxtYXNzYWdlQ3VycmVudERhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pbnRlcnZhbER1cmF0aW9uLmFzKCJkYXlzIik8PTEmJnRoaXMuaXNIaWRkZW5EYXkodCkmJih0PXRoaXMuc2tpcEhpZGRlbkRheXModCxlKSx0LnN0YXJ0T2YoImRheSIpKSx0fSx1cGRhdGVUaXRsZTpmdW5jdGlvbigpe3RoaXMudGl0bGU9dGhpcy5jb21wdXRlVGl0bGUoKX0sY29tcHV0ZVRpdGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm9ybWF0UmFuZ2Uoe3N0YXJ0OnRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0aGlzLmludGVydmFsU3RhcnQpLGVuZDp0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUodGhpcy5pbnRlcnZhbEVuZCl9LHRoaXMub3B0KCJ0aXRsZUZvcm1hdCIpfHx0aGlzLmNvbXB1dGVUaXRsZUZvcm1hdCgpLHRoaXMub3B0KCJ0aXRsZVJhbmdlU2VwYXJhdG9yIikpfSxjb21wdXRlVGl0bGVGb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4ieWVhciI9PXRoaXMuaW50ZXJ2YWxVbml0PyJZWVlZIjoibW9udGgiPT10aGlzLmludGVydmFsVW5pdD90aGlzLm9wdCgibW9udGhZZWFyRm9ybWF0Iik6dGhpcy5pbnRlcnZhbER1cmF0aW9uLmFzKCJkYXlzIik+MT8ibGwiOiJMTCJ9LGZvcm1hdFJhbmdlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LmVuZDtyZXR1cm4gaS5oYXNUaW1lKCl8fChpPWkuY2xvbmUoKS5zdWJ0cmFjdCgxKSkscHQodC5zdGFydCxpLGUsbix0aGlzLm9wdCgiaXNSVEwiKSl9LGdldEFsbERheUh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHQoImFsbERheUh0bWwiKXx8dHQodGhpcy5vcHQoImFsbERheVRleHQiKSl9LGJ1aWxkR290b0FuY2hvckh0bWw6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLHMsbyxsO3JldHVybiB0LmlzUGxhaW5PYmplY3QoZSk/KHI9ZS5kYXRlLHM9ZS50eXBlLG89ZS5mb3JjZU9mZik6cj1lLHI9anQubW9tZW50KHIpLGw9e2RhdGU6ci5mb3JtYXQoIllZWVktTU0tREQiKSx0eXBlOnN8fCJkYXkifSwic3RyaW5nIj09dHlwZW9mIG4mJihpPW4sbj1udWxsKSxuPW4/IiAiK2l0KG4pOiIiLGk9aXx8IiIsIW8mJnRoaXMub3B0KCJuYXZMaW5rcyIpPyI8YSIrbisnIGRhdGEtZ290bz0iJyt0dChKU09OLnN0cmluZ2lmeShsKSkrJyI+JytpKyI8L2E+IjoiPHNwYW4iK24rIj4iK2krIjwvc3Bhbj4ifSxzZXRFbGVtZW50OmZ1bmN0aW9uKHQpe3RoaXMuZWw9dCx0aGlzLmJpbmRHbG9iYWxIYW5kbGVycygpfSxyZW1vdmVFbGVtZW50OmZ1bmN0aW9uKCl7dGhpcy5jbGVhcigpLHRoaXMuaXNTa2VsZXRvblJlbmRlcmVkJiYodGhpcy51bnJlbmRlclNrZWxldG9uKCksdGhpcy5pc1NrZWxldG9uUmVuZGVyZWQ9ITEpLHRoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKSx0aGlzLmVsLnJlbW92ZSgpfSxkaXNwbGF5OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPW51bGw7cmV0dXJuIG51bGwhPWUmJnRoaXMuZGlzcGxheWluZyYmKGk9dGhpcy5xdWVyeVNjcm9sbCgpKSx0aGlzLmNhbGVuZGFyLmZyZWV6ZUNvbnRlbnRIZWlnaHQoKSx1dCh0aGlzLmNsZWFyKCksZnVuY3Rpb24oKXtyZXR1cm4gbi5kaXNwbGF5aW5nPXV0KG4uZGlzcGxheVZpZXcodCksZnVuY3Rpb24oKXtudWxsIT1lP24uc2V0U2Nyb2xsKGUpOm4uZm9yY2VTY3JvbGwobi5jb21wdXRlSW5pdGlhbFNjcm9sbChpKSksbi5jYWxlbmRhci51bmZyZWV6ZUNvbnRlbnRIZWlnaHQoKSxuLnRyaWdnZXJSZW5kZXIoKX0pfSl9LGNsZWFyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXRoaXMuZGlzcGxheWluZztyZXR1cm4gbj91dChuLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGlzcGxheWluZz1udWxsLGUuY2xlYXJFdmVudHMoKSxlLmNsZWFyVmlldygpfSk6dC53aGVuKCl9LGRpc3BsYXlWaWV3OmZ1bmN0aW9uKHQpe3RoaXMuaXNTa2VsZXRvblJlbmRlcmVkfHwodGhpcy5yZW5kZXJTa2VsZXRvbigpLHRoaXMuaXNTa2VsZXRvblJlbmRlcmVkPSEwKSx0JiZ0aGlzLnNldERhdGUodCksdGhpcy5yZW5kZXImJnRoaXMucmVuZGVyKCksdGhpcy5yZW5kZXJEYXRlcygpLHRoaXMudXBkYXRlU2l6ZSgpLHRoaXMucmVuZGVyQnVzaW5lc3NIb3VycygpLHRoaXMuc3RhcnROb3dJbmRpY2F0b3IoKX0sY2xlYXJWaWV3OmZ1bmN0aW9uKCl7dGhpcy51bnNlbGVjdCgpLHRoaXMuc3RvcE5vd0luZGljYXRvcigpLHRoaXMudHJpZ2dlclVucmVuZGVyKCksdGhpcy51bnJlbmRlckJ1c2luZXNzSG91cnMoKSx0aGlzLnVucmVuZGVyRGF0ZXMoKSx0aGlzLmRlc3Ryb3kmJnRoaXMuZGVzdHJveSgpfSxyZW5kZXJTa2VsZXRvbjpmdW5jdGlvbigpe30sdW5yZW5kZXJTa2VsZXRvbjpmdW5jdGlvbigpe30scmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt9LHVucmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt9LHRyaWdnZXJSZW5kZXI6ZnVuY3Rpb24oKXt0aGlzLnRyaWdnZXIoInZpZXdSZW5kZXIiLHRoaXMsdGhpcyx0aGlzLmVsKX0sdHJpZ2dlclVucmVuZGVyOmZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyKCJ2aWV3RGVzdHJveSIsdGhpcyx0aGlzLHRoaXMuZWwpfSxiaW5kR2xvYmFsSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLmxpc3RlblRvKHQoZG9jdW1lbnQpLCJtb3VzZWRvd24iLHRoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZWRvd24pLHRoaXMubGlzdGVuVG8odChkb2N1bWVudCksInRvdWNoc3RhcnQiLHRoaXMucHJvY2Vzc1Vuc2VsZWN0KX0sdW5iaW5kR2xvYmFsSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0KGRvY3VtZW50KSl9LGluaXRUaGVtaW5nUHJvcHM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdCgidGhlbWUiKT8idWkiOiJmYyI7dGhpcy53aWRnZXRIZWFkZXJDbGFzcz10KyItd2lkZ2V0LWhlYWRlciIsdGhpcy53aWRnZXRDb250ZW50Q2xhc3M9dCsiLXdpZGdldC1jb250ZW50Iix0aGlzLmhpZ2hsaWdodFN0YXRlQ2xhc3M9dCsiLXN0YXRlLWhpZ2hsaWdodCJ9LHJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt9LHVucmVuZGVyQnVzaW5lc3NIb3VyczpmdW5jdGlvbigpe30sc3RhcnROb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt2YXIgdCxuLGkscj10aGlzO3RoaXMub3B0KCJub3dJbmRpY2F0b3IiKSYmKHQ9dGhpcy5nZXROb3dJbmRpY2F0b3JVbml0KCksdCYmKG49bHQodGhpcywidXBkYXRlTm93SW5kaWNhdG9yIiksdGhpcy5pbml0aWFsTm93RGF0ZT10aGlzLmNhbGVuZGFyLmdldE5vdygpLHRoaXMuaW5pdGlhbE5vd1F1ZXJpZWRNcz0rbmV3IERhdGUsdGhpcy5yZW5kZXJOb3dJbmRpY2F0b3IodGhpcy5pbml0aWFsTm93RGF0ZSksdGhpcy5pc05vd0luZGljYXRvclJlbmRlcmVkPSEwLGk9dGhpcy5pbml0aWFsTm93RGF0ZS5jbG9uZSgpLnN0YXJ0T2YodCkuYWRkKDEsdCktdGhpcy5pbml0aWFsTm93RGF0ZSx0aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5ub3dJbmRpY2F0b3JUaW1lb3V0SUQ9bnVsbCxuKCksaT0rZS5kdXJhdGlvbigxLHQpLGk9TWF0aC5tYXgoMTAwLGkpLHIubm93SW5kaWNhdG9ySW50ZXJ2YWxJRD1zZXRJbnRlcnZhbChuLGkpfSxpKSkpfSx1cGRhdGVOb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQmJih0aGlzLnVucmVuZGVyTm93SW5kaWNhdG9yKCksdGhpcy5yZW5kZXJOb3dJbmRpY2F0b3IodGhpcy5pbml0aWFsTm93RGF0ZS5jbG9uZSgpLmFkZChuZXcgRGF0ZS10aGlzLmluaXRpYWxOb3dRdWVyaWVkTXMpKSl9LHN0b3BOb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQmJih0aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRCYmKGNsZWFyVGltZW91dCh0aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRCksdGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQ9bnVsbCksdGhpcy5ub3dJbmRpY2F0b3JJbnRlcnZhbElEJiYoY2xlYXJUaW1lb3V0KHRoaXMubm93SW5kaWNhdG9ySW50ZXJ2YWxJRCksdGhpcy5ub3dJbmRpY2F0b3JJbnRlcnZhbElEPW51bGwpLHRoaXMudW5yZW5kZXJOb3dJbmRpY2F0b3IoKSx0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQ9ITEpfSxnZXROb3dJbmRpY2F0b3JVbml0OmZ1bmN0aW9uKCl7fSxyZW5kZXJOb3dJbmRpY2F0b3I6ZnVuY3Rpb24odCl7fSx1bnJlbmRlck5vd0luZGljYXRvcjpmdW5jdGlvbigpe30sdXBkYXRlU2l6ZTpmdW5jdGlvbih0KXt2YXIgZTt0JiYoZT10aGlzLnF1ZXJ5U2Nyb2xsKCkpLHRoaXMudXBkYXRlSGVpZ2h0KHQpLHRoaXMudXBkYXRlV2lkdGgodCksdGhpcy51cGRhdGVOb3dJbmRpY2F0b3IoKSx0JiZ0aGlzLnNldFNjcm9sbChlKX0sdXBkYXRlV2lkdGg6ZnVuY3Rpb24odCl7fSx1cGRhdGVIZWlnaHQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYWxlbmRhcjt0aGlzLnNldEhlaWdodChlLmdldFN1Z2dlc3RlZFZpZXdIZWlnaHQoKSxlLmlzSGVpZ2h0QXV0bygpKX0sc2V0SGVpZ2h0OmZ1bmN0aW9uKHQsZSl7fSxjb21wdXRlSW5pdGlhbFNjcm9sbDpmdW5jdGlvbih0KXtyZXR1cm4gMH0scXVlcnlTY3JvbGw6ZnVuY3Rpb24oKXt9LHNldFNjcm9sbDpmdW5jdGlvbih0KXt9LGZvcmNlU2Nyb2xsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5zZXRTY3JvbGwodCksc2V0VGltZW91dChmdW5jdGlvbigpe2Uuc2V0U2Nyb2xsKHQpfSwwKX0sZGlzcGxheUV2ZW50czpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnF1ZXJ5U2Nyb2xsKCk7dGhpcy5jbGVhckV2ZW50cygpLHRoaXMucmVuZGVyRXZlbnRzKHQpLHRoaXMuaXNFdmVudHNSZW5kZXJlZD0hMCx0aGlzLnNldFNjcm9sbChlKSx0aGlzLnRyaWdnZXJFdmVudFJlbmRlcigpfSxjbGVhckV2ZW50czpmdW5jdGlvbigpe3ZhciB0O3RoaXMuaXNFdmVudHNSZW5kZXJlZCYmKHQ9dGhpcy5xdWVyeVNjcm9sbCgpLHRoaXMudHJpZ2dlckV2ZW50VW5yZW5kZXIoKSx0aGlzLmRlc3Ryb3lFdmVudHMmJnRoaXMuZGVzdHJveUV2ZW50cygpLHRoaXMudW5yZW5kZXJFdmVudHMoKSx0aGlzLnNldFNjcm9sbCh0KSx0aGlzLmlzRXZlbnRzUmVuZGVyZWQ9ITEpfSxyZW5kZXJFdmVudHM6ZnVuY3Rpb24odCl7fSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe30sdHJpZ2dlckV2ZW50UmVuZGVyOmZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImV2ZW50QWZ0ZXJSZW5kZXIiLHQuZXZlbnQsdC5ldmVudCx0LmVsKX0pLHRoaXMudHJpZ2dlcigiZXZlbnRBZnRlckFsbFJlbmRlciIpfSx0cmlnZ2VyRXZlbnRVbnJlbmRlcjpmdW5jdGlvbigpe3RoaXMucmVuZGVyZWRFdmVudFNlZ0VhY2goZnVuY3Rpb24odCl7dGhpcy50cmlnZ2VyKCJldmVudERlc3Ryb3kiLHQuZXZlbnQsdC5ldmVudCx0LmVsKX0pfSxyZXNvbHZlRXZlbnRFbDpmdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMudHJpZ2dlcigiZXZlbnRSZW5kZXIiLGUsZSxuKTtyZXR1cm4gaT09PSExP249bnVsbDppJiZpIT09ITAmJihuPXQoaSkpLG59LHNob3dFdmVudDpmdW5jdGlvbih0KXt0aGlzLnJlbmRlcmVkRXZlbnRTZWdFYWNoKGZ1bmN0aW9uKHQpe3QuZWwuY3NzKCJ2aXNpYmlsaXR5IiwiIil9LHQpfSxoaWRlRXZlbnQ6ZnVuY3Rpb24odCl7dGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbih0KXt0LmVsLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpfSx0KX0scmVuZGVyZWRFdmVudFNlZ0VhY2g6ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMuZ2V0RXZlbnRTZWdzKCk7Zm9yKG49MDtuPGkubGVuZ3RoO24rKyllJiZpW25dLmV2ZW50Ll9pZCE9PWUuX2lkfHxpW25dLmVsJiZ0LmNhbGwodGhpcyxpW25dKX0sZ2V0RXZlbnRTZWdzOmZ1bmN0aW9uKCl7cmV0dXJuW119LGlzRXZlbnREcmFnZ2FibGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNFdmVudFN0YXJ0RWRpdGFibGUodCl9LGlzRXZlbnRTdGFydEVkaXRhYmxlOmZ1bmN0aW9uKHQpe3JldHVybiBKKHQuc3RhcnRFZGl0YWJsZSwodC5zb3VyY2V8fHt9KS5zdGFydEVkaXRhYmxlLHRoaXMub3B0KCJldmVudFN0YXJ0RWRpdGFibGUiKSx0aGlzLmlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZSh0KSl9LGlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZTpmdW5jdGlvbih0KXtyZXR1cm4gSih0LmVkaXRhYmxlLCh0LnNvdXJjZXx8e30pLmVkaXRhYmxlLHRoaXMub3B0KCJlZGl0YWJsZSIpKX0scmVwb3J0RXZlbnREcm9wOmZ1bmN0aW9uKHQsZSxuLGkscil7CnZhciBzPXRoaXMuY2FsZW5kYXIsbz1zLm11dGF0ZUV2ZW50KHQsZSxuKSxsPWZ1bmN0aW9uKCl7by51bmRvKCkscy5yZXBvcnRFdmVudENoYW5nZSgpfTt0aGlzLnRyaWdnZXJFdmVudERyb3AodCxvLmRhdGVEZWx0YSxsLGkscikscy5yZXBvcnRFdmVudENoYW5nZSgpfSx0cmlnZ2VyRXZlbnREcm9wOmZ1bmN0aW9uKHQsZSxuLGkscil7dGhpcy50cmlnZ2VyKCJldmVudERyb3AiLGlbMF0sdCxlLG4scix7fSl9LHJlcG9ydEV4dGVybmFsRHJvcDpmdW5jdGlvbihlLG4saSxyLHMpe3ZhciBvLGwsYT1lLmV2ZW50UHJvcHM7YSYmKG89dC5leHRlbmQoe30sYSxuKSxsPXRoaXMuY2FsZW5kYXIucmVuZGVyRXZlbnQobyxlLnN0aWNrKVswXSksdGhpcy50cmlnZ2VyRXh0ZXJuYWxEcm9wKGwsbixpLHIscyl9LHRyaWdnZXJFeHRlcm5hbERyb3A6ZnVuY3Rpb24odCxlLG4saSxyKXt0aGlzLnRyaWdnZXIoImRyb3AiLG5bMF0sZS5zdGFydCxpLHIpLHQmJnRoaXMudHJpZ2dlcigiZXZlbnRSZWNlaXZlIixudWxsLHQpfSxyZW5kZXJEcmFnOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt9LGlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0KCJldmVudFJlc2l6YWJsZUZyb21TdGFydCIpJiZ0aGlzLmlzRXZlbnRSZXNpemFibGUodCl9LGlzRXZlbnRSZXNpemFibGVGcm9tRW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzRXZlbnRSZXNpemFibGUodCl9LGlzRXZlbnRSZXNpemFibGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5zb3VyY2V8fHt9O3JldHVybiBKKHQuZHVyYXRpb25FZGl0YWJsZSxlLmR1cmF0aW9uRWRpdGFibGUsdGhpcy5vcHQoImV2ZW50RHVyYXRpb25FZGl0YWJsZSIpLHQuZWRpdGFibGUsZS5lZGl0YWJsZSx0aGlzLm9wdCgiZWRpdGFibGUiKSl9LHJlcG9ydEV2ZW50UmVzaXplOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIHM9dGhpcy5jYWxlbmRhcixvPXMubXV0YXRlRXZlbnQodCxlLG4pLGw9ZnVuY3Rpb24oKXtvLnVuZG8oKSxzLnJlcG9ydEV2ZW50Q2hhbmdlKCl9O3RoaXMudHJpZ2dlckV2ZW50UmVzaXplKHQsby5kdXJhdGlvbkRlbHRhLGwsaSxyKSxzLnJlcG9ydEV2ZW50Q2hhbmdlKCl9LHRyaWdnZXJFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUsbixpLHIpe3RoaXMudHJpZ2dlcigiZXZlbnRSZXNpemUiLGlbMF0sdCxlLG4scix7fSl9LHNlbGVjdDpmdW5jdGlvbih0LGUpe3RoaXMudW5zZWxlY3QoZSksdGhpcy5yZW5kZXJTZWxlY3Rpb24odCksdGhpcy5yZXBvcnRTZWxlY3Rpb24odCxlKX0scmVuZGVyU2VsZWN0aW9uOmZ1bmN0aW9uKHQpe30scmVwb3J0U2VsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7dGhpcy5pc1NlbGVjdGVkPSEwLHRoaXMudHJpZ2dlclNlbGVjdCh0LGUpfSx0cmlnZ2VyU2VsZWN0OmZ1bmN0aW9uKHQsZSl7dGhpcy50cmlnZ2VyKCJzZWxlY3QiLG51bGwsdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHQuc3RhcnQpLHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0LmVuZCksZSl9LHVuc2VsZWN0OmZ1bmN0aW9uKHQpe3RoaXMuaXNTZWxlY3RlZCYmKHRoaXMuaXNTZWxlY3RlZD0hMSx0aGlzLmRlc3Ryb3lTZWxlY3Rpb24mJnRoaXMuZGVzdHJveVNlbGVjdGlvbigpLHRoaXMudW5yZW5kZXJTZWxlY3Rpb24oKSx0aGlzLnRyaWdnZXIoInVuc2VsZWN0IixudWxsLHQpKX0sdW5yZW5kZXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt9LHNlbGVjdEV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuc2VsZWN0ZWRFdmVudCYmdGhpcy5zZWxlY3RlZEV2ZW50PT09dHx8KHRoaXMudW5zZWxlY3RFdmVudCgpLHRoaXMucmVuZGVyZWRFdmVudFNlZ0VhY2goZnVuY3Rpb24odCl7dC5lbC5hZGRDbGFzcygiZmMtc2VsZWN0ZWQiKX0sdCksdGhpcy5zZWxlY3RlZEV2ZW50PXQpfSx1bnNlbGVjdEV2ZW50OmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEV2ZW50JiYodGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbih0KXt0LmVsLnJlbW92ZUNsYXNzKCJmYy1zZWxlY3RlZCIpfSx0aGlzLnNlbGVjdGVkRXZlbnQpLHRoaXMuc2VsZWN0ZWRFdmVudD1udWxsKX0saXNFdmVudFNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdGVkRXZlbnQmJnRoaXMuc2VsZWN0ZWRFdmVudC5faWQ9PT10Ll9pZH0saGFuZGxlRG9jdW1lbnRNb3VzZWRvd246ZnVuY3Rpb24odCl7Uyh0KSYmdGhpcy5wcm9jZXNzVW5zZWxlY3QodCl9LHByb2Nlc3NVbnNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLnByb2Nlc3NSYW5nZVVuc2VsZWN0KHQpLHRoaXMucHJvY2Vzc0V2ZW50VW5zZWxlY3QodCl9LHByb2Nlc3NSYW5nZVVuc2VsZWN0OmZ1bmN0aW9uKGUpe3ZhciBuO3RoaXMuaXNTZWxlY3RlZCYmdGhpcy5vcHQoInVuc2VsZWN0QXV0byIpJiYobj10aGlzLm9wdCgidW5zZWxlY3RDYW5jZWwiKSxuJiZ0KGUudGFyZ2V0KS5jbG9zZXN0KG4pLmxlbmd0aHx8dGhpcy51bnNlbGVjdChlKSl9LHByb2Nlc3NFdmVudFVuc2VsZWN0OmZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0ZWRFdmVudCYmKHQoZS50YXJnZXQpLmNsb3Nlc3QoIi5mYy1zZWxlY3RlZCIpLmxlbmd0aHx8dGhpcy51bnNlbGVjdEV2ZW50KCkpfSx0cmlnZ2VyRGF5Q2xpY2s6ZnVuY3Rpb24odCxlLG4pe3RoaXMudHJpZ2dlcigiZGF5Q2xpY2siLGUsdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHQuc3RhcnQpLG4pfSxpbml0SGlkZGVuRGF5czpmdW5jdGlvbigpe3ZhciBlLG49dGhpcy5vcHQoImhpZGRlbkRheXMiKXx8W10saT1bXSxyPTA7Zm9yKHRoaXMub3B0KCJ3ZWVrZW5kcyIpPT09ITEmJm4ucHVzaCgwLDYpLGU9MDtlPDc7ZSsrKShpW2VdPXQuaW5BcnJheShlLG4pIT09LTEpfHxyKys7aWYoIXIpdGhyb3ciaW52YWxpZCBoaWRkZW5EYXlzIjt0aGlzLmlzSGlkZGVuRGF5SGFzaD1pfSxpc0hpZGRlbkRheTpmdW5jdGlvbih0KXtyZXR1cm4gZS5pc01vbWVudCh0KSYmKHQ9dC5kYXkoKSksdGhpcy5pc0hpZGRlbkRheUhhc2hbdF19LHNraXBIaWRkZW5EYXlzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LmNsb25lKCk7Zm9yKGU9ZXx8MTt0aGlzLmlzSGlkZGVuRGF5SGFzaFsoaS5kYXkoKSsobj9lOjApKzcpJTddOylpLmFkZChlLCJkYXlzIik7cmV0dXJuIGl9LGNvbXB1dGVEYXlSYW5nZTpmdW5jdGlvbih0KXt2YXIgZSxuPXQuc3RhcnQuY2xvbmUoKS5zdHJpcFRpbWUoKSxpPXQuZW5kLHI9bnVsbDtyZXR1cm4gaSYmKHI9aS5jbG9uZSgpLnN0cmlwVGltZSgpLGU9K2kudGltZSgpLGUmJmU+PXRoaXMubmV4dERheVRocmVzaG9sZCYmci5hZGQoMSwiZGF5cyIpKSwoIWl8fHI8PW4pJiYocj1uLmNsb25lKCkuYWRkKDEsImRheXMiKSkse3N0YXJ0Om4sZW5kOnJ9fSxpc011bHRpRGF5RXZlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb21wdXRlRGF5UmFuZ2UodCk7cmV0dXJuIGUuZW5kLmRpZmYoZS5zdGFydCwiZGF5cyIpPjF9fSksd2U9anQuU2Nyb2xsZXI9d3QuZXh0ZW5kKHtlbDpudWxsLHNjcm9sbEVsOm51bGwsb3ZlcmZsb3dYOm51bGwsb3ZlcmZsb3dZOm51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLm92ZXJmbG93WD10Lm92ZXJmbG93WHx8dC5vdmVyZmxvd3x8ImF1dG8iLHRoaXMub3ZlcmZsb3dZPXQub3ZlcmZsb3dZfHx0Lm92ZXJmbG93fHwiYXV0byJ9LHJlbmRlcjpmdW5jdGlvbigpe3RoaXMuZWw9dGhpcy5yZW5kZXJFbCgpLHRoaXMuYXBwbHlPdmVyZmxvdygpfSxyZW5kZXJFbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbEVsPXQoJzxkaXYgY2xhc3M9ImZjLXNjcm9sbGVyIj48L2Rpdj4nKX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLnNldEhlaWdodCgiYXV0byIpLHRoaXMuYXBwbHlPdmVyZmxvdygpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbC5yZW1vdmUoKX0sYXBwbHlPdmVyZmxvdzpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsRWwuY3NzKHsib3ZlcmZsb3cteCI6dGhpcy5vdmVyZmxvd1gsIm92ZXJmbG93LXkiOnRoaXMub3ZlcmZsb3dZfSl9LGxvY2tPdmVyZmxvdzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm92ZXJmbG93WCxuPXRoaXMub3ZlcmZsb3dZO3Q9dHx8dGhpcy5nZXRTY3JvbGxiYXJXaWR0aHMoKSwiYXV0byI9PT1lJiYoZT10LnRvcHx8dC5ib3R0b218fHRoaXMuc2Nyb2xsRWxbMF0uc2Nyb2xsV2lkdGgtMT50aGlzLnNjcm9sbEVsWzBdLmNsaWVudFdpZHRoPyJzY3JvbGwiOiJoaWRkZW4iKSwiYXV0byI9PT1uJiYobj10LmxlZnR8fHQucmlnaHR8fHRoaXMuc2Nyb2xsRWxbMF0uc2Nyb2xsSGVpZ2h0LTE+dGhpcy5zY3JvbGxFbFswXS5jbGllbnRIZWlnaHQ/InNjcm9sbCI6ImhpZGRlbiIpLHRoaXMuc2Nyb2xsRWwuY3NzKHsib3ZlcmZsb3cteCI6ZSwib3ZlcmZsb3cteSI6bn0pfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxFbC5oZWlnaHQodCl9LGdldFNjcm9sbFRvcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbEVsLnNjcm9sbFRvcCgpfSxzZXRTY3JvbGxUb3A6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxFbC5zY3JvbGxUb3AodCl9LGdldENsaWVudFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Nyb2xsRWxbMF0uY2xpZW50V2lkdGh9LGdldENsaWVudEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbEVsWzBdLmNsaWVudEhlaWdodH0sZ2V0U2Nyb2xsYmFyV2lkdGhzOmZ1bmN0aW9uKCl7cmV0dXJuIHAodGhpcy5zY3JvbGxFbCl9fSksRWU9anQuQ2FsZW5kYXI9d3QuZXh0ZW5kKHtkaXJEZWZhdWx0czpudWxsLGxvY2FsZURlZmF1bHRzOm51bGwsb3ZlcnJpZGVzOm51bGwsZHluYW1pY092ZXJyaWRlczpudWxsLG9wdGlvbnM6bnVsbCx2aWV3U3BlY0NhY2hlOm51bGwsdmlldzpudWxsLGhlYWRlcjpudWxsLGxvYWRpbmdMZXZlbDowLGNvbnN0cnVjdG9yOk90LGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9LHBvcHVsYXRlT3B0aW9uc0hhc2g6ZnVuY3Rpb24oKXt2YXIgdCxlLGkscjt0PUoodGhpcy5keW5hbWljT3ZlcnJpZGVzLmxvY2FsZSx0aGlzLm92ZXJyaWRlcy5sb2NhbGUpLGU9RGVbdF0sZXx8KHQ9RWUuZGVmYXVsdHMubG9jYWxlLGU9RGVbdF18fHt9KSxpPUoodGhpcy5keW5hbWljT3ZlcnJpZGVzLmlzUlRMLHRoaXMub3ZlcnJpZGVzLmlzUlRMLGUuaXNSVEwsRWUuZGVmYXVsdHMuaXNSVEwpLHI9aT9FZS5ydGxEZWZhdWx0czp7fSx0aGlzLmRpckRlZmF1bHRzPXIsdGhpcy5sb2NhbGVEZWZhdWx0cz1lLHRoaXMub3B0aW9ucz1uKFtFZS5kZWZhdWx0cyxyLGUsdGhpcy5vdmVycmlkZXMsdGhpcy5keW5hbWljT3ZlcnJpZGVzXSksVnQodGhpcy5vcHRpb25zKX0sZ2V0Vmlld1NwZWM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aWV3U3BlY0NhY2hlO3JldHVybiBlW3RdfHwoZVt0XT10aGlzLmJ1aWxkVmlld1NwZWModCkpfSxnZXRVbml0Vmlld1NwZWM6ZnVuY3Rpb24oZSl7dmFyIG4saSxyO2lmKHQuaW5BcnJheShlLFh0KSE9LTEpZm9yKG49dGhpcy5oZWFkZXIuZ2V0Vmlld3NXaXRoQnV0dG9ucygpLHQuZWFjaChqdC52aWV3cyxmdW5jdGlvbih0KXtuLnB1c2godCl9KSxpPTA7aTxuLmxlbmd0aDtpKyspaWYocj10aGlzLmdldFZpZXdTcGVjKG5baV0pLHImJnIuc2luZ2xlVW5pdD09ZSlyZXR1cm4gcn0sYnVpbGRWaWV3U3BlYzpmdW5jdGlvbih0KXtmb3IodmFyIGkscixzLG8sbD10aGlzLm92ZXJyaWRlcy52aWV3c3x8e30sYT1bXSx1PVtdLGQ9W10sYz10O2M7KWk9VXRbY10scj1sW2NdLGM9bnVsbCwiZnVuY3Rpb24iPT10eXBlb2YgaSYmKGk9e2NsYXNzOml9KSxpJiYoYS51bnNoaWZ0KGkpLHUudW5zaGlmdChpLmRlZmF1bHRzfHx7fSkscz1zfHxpLmR1cmF0aW9uLGM9Y3x8aS50eXBlKSxyJiYoZC51bnNoaWZ0KHIpLHM9c3x8ci5kdXJhdGlvbixjPWN8fHIudHlwZSk7cmV0dXJuIGk9cShhKSxpLnR5cGU9dCwhIWkuY2xhc3MmJihzJiYocz1lLmR1cmF0aW9uKHMpLHMudmFsdWVPZigpJiYoaS5kdXJhdGlvbj1zLG89TyhzKSwxPT09cy5hcyhvKSYmKGkuc2luZ2xlVW5pdD1vLGQudW5zaGlmdChsW29dfHx7fSkpKSksaS5kZWZhdWx0cz1uKHUpLGkub3ZlcnJpZGVzPW4oZCksdGhpcy5idWlsZFZpZXdTcGVjT3B0aW9ucyhpKSx0aGlzLmJ1aWxkVmlld1NwZWNCdXR0b25UZXh0KGksdCksaSl9LGJ1aWxkVmlld1NwZWNPcHRpb25zOmZ1bmN0aW9uKHQpe3Qub3B0aW9ucz1uKFtFZS5kZWZhdWx0cyx0LmRlZmF1bHRzLHRoaXMuZGlyRGVmYXVsdHMsdGhpcy5sb2NhbGVEZWZhdWx0cyx0aGlzLm92ZXJyaWRlcyx0Lm92ZXJyaWRlcyx0aGlzLmR5bmFtaWNPdmVycmlkZXNdKSxWdCh0Lm9wdGlvbnMpfSxidWlsZFZpZXdTcGVjQnV0dG9uVGV4dDpmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4obil7dmFyIGk9bi5idXR0b25UZXh0fHx7fTtyZXR1cm4gaVtlXXx8KHQuYnV0dG9uVGV4dEtleT9pW3QuYnV0dG9uVGV4dEtleV06bnVsbCl8fCh0LnNpbmdsZVVuaXQ/aVt0LnNpbmdsZVVuaXRdOm51bGwpfXQuYnV0dG9uVGV4dE92ZXJyaWRlPW4odGhpcy5keW5hbWljT3ZlcnJpZGVzKXx8bih0aGlzLm92ZXJyaWRlcyl8fHQub3ZlcnJpZGVzLmJ1dHRvblRleHQsdC5idXR0b25UZXh0RGVmYXVsdD1uKHRoaXMubG9jYWxlRGVmYXVsdHMpfHxuKHRoaXMuZGlyRGVmYXVsdHMpfHx0LmRlZmF1bHRzLmJ1dHRvblRleHR8fG4oRWUuZGVmYXVsdHMpfHwodC5kdXJhdGlvbj90aGlzLmh1bWFuaXplRHVyYXRpb24odC5kdXJhdGlvbik6bnVsbCl8fGV9LGluc3RhbnRpYXRlVmlldzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFZpZXdTcGVjKHQpO3JldHVybiBuZXcgZS5jbGFzcyh0aGlzLHQsZS5vcHRpb25zLGUuZHVyYXRpb24pfSxpc1ZhbGlkVmlld1R5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIEJvb2xlYW4odGhpcy5nZXRWaWV3U3BlYyh0KSl9LHB1c2hMb2FkaW5nOmZ1bmN0aW9uKCl7dGhpcy5sb2FkaW5nTGV2ZWwrK3x8dGhpcy50cmlnZ2VyKCJsb2FkaW5nIixudWxsLCEwLHRoaXMudmlldyl9LHBvcExvYWRpbmc6ZnVuY3Rpb24oKXstLXRoaXMubG9hZGluZ0xldmVsfHx0aGlzLnRyaWdnZXIoImxvYWRpbmciLG51bGwsITEsdGhpcy52aWV3KX0sYnVpbGRTZWxlY3RTcGFuOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLm1vbWVudCh0KS5zdHJpcFpvbmUoKTtyZXR1cm4gbj1lP3RoaXMubW9tZW50KGUpLnN0cmlwWm9uZSgpOmkuaGFzVGltZSgpP2kuY2xvbmUoKS5hZGQodGhpcy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTppLmNsb25lKCkuYWRkKHRoaXMuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pLHtzdGFydDppLGVuZDpufX19KTtFZS5taXhpbihsZSksRWUubWl4aW4oe29wdGlvbkhhbmRsZXJzOm51bGwsYmluZE9wdGlvbjpmdW5jdGlvbih0LGUpe3RoaXMuYmluZE9wdGlvbnMoW3RdLGUpfSxiaW5kT3B0aW9uczpmdW5jdGlvbih0LGUpe3ZhciBuLGk9e2Z1bmM6ZSxuYW1lczp0fTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXRoaXMucmVnaXN0ZXJPcHRpb25IYW5kbGVyT2JqKHRbbl0saSk7dGhpcy50cmlnZ2VyT3B0aW9uSGFuZGxlck9iaihpKX0scmVnaXN0ZXJPcHRpb25IYW5kbGVyT2JqOmZ1bmN0aW9uKHQsZSl7KHRoaXMub3B0aW9uSGFuZGxlcnNbdF18fCh0aGlzLm9wdGlvbkhhbmRsZXJzW3RdPVtdKSkucHVzaChlKX0sdHJpZ2dlck9wdGlvbkhhbmRsZXJzOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5vcHRpb25IYW5kbGVyc1t0XXx8W107Zm9yKGU9MDtlPG4ubGVuZ3RoO2UrKyl0aGlzLnRyaWdnZXJPcHRpb25IYW5kbGVyT2JqKG5bZV0pfSx0cmlnZ2VyT3B0aW9uSGFuZGxlck9iajpmdW5jdGlvbih0KXt2YXIgZSxuPXQubmFtZXMsaT1bXTtmb3IoZT0wO2U8bi5sZW5ndGg7ZSsrKWkucHVzaCh0aGlzLm9wdGlvbnNbbltlXV0pO3QuZnVuYy5hcHBseSh0aGlzLGkpfX0pLEVlLmRlZmF1bHRzPXt0aXRsZVJhbmdlU2VwYXJhdG9yOiIg4oCTICIsbW9udGhZZWFyRm9ybWF0OiJNTU1NIFlZWVkiLGRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb246IjAyOjAwOjAwIixkZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbjp7ZGF5czoxfSxmb3JjZUV2ZW50RHVyYXRpb246ITEsbmV4dERheVRocmVzaG9sZDoiMDk6MDA6MDAiLGRlZmF1bHRWaWV3OiJtb250aCIsYXNwZWN0UmF0aW86MS4zNSxoZWFkZXI6e2xlZnQ6InRpdGxlIixjZW50ZXI6IiIscmlnaHQ6InRvZGF5IHByZXYsbmV4dCJ9LHdlZWtlbmRzOiEwLHdlZWtOdW1iZXJzOiExLHdlZWtOdW1iZXJUaXRsZToiVyIsd2Vla051bWJlckNhbGN1bGF0aW9uOiJsb2NhbCIsc2Nyb2xsVGltZToiMDY6MDA6MDAiLGxhenlGZXRjaGluZzohMCxzdGFydFBhcmFtOiJzdGFydCIsZW5kUGFyYW06ImVuZCIsdGltZXpvbmVQYXJhbToidGltZXpvbmUiLHRpbWV6b25lOiExLGlzUlRMOiExLGJ1dHRvblRleHQ6e3ByZXY6InByZXYiLG5leHQ6Im5leHQiLHByZXZZZWFyOiJwcmV2IHllYXIiLG5leHRZZWFyOiJuZXh0IHllYXIiLHllYXI6InllYXIiLHRvZGF5OiJ0b2RheSIsbW9udGg6Im1vbnRoIix3ZWVrOiJ3ZWVrIixkYXk6ImRheSJ9LGJ1dHRvbkljb25zOntwcmV2OiJsZWZ0LXNpbmdsZS1hcnJvdyIsbmV4dDoicmlnaHQtc2luZ2xlLWFycm93IixwcmV2WWVhcjoibGVmdC1kb3VibGUtYXJyb3ciLG5leHRZZWFyOiJyaWdodC1kb3VibGUtYXJyb3cifSxhbGxEYXlUZXh0OiJhbGwtZGF5Iix0aGVtZTohMSx0aGVtZUJ1dHRvbkljb25zOntwcmV2OiJjaXJjbGUtdHJpYW5nbGUtdyIsbmV4dDoiY2lyY2xlLXRyaWFuZ2xlLWUiLHByZXZZZWFyOiJzZWVrLXByZXYiLG5leHRZZWFyOiJzZWVrLW5leHQifSxkcmFnT3BhY2l0eTouNzUsZHJhZ1JldmVydER1cmF0aW9uOjUwMCxkcmFnU2Nyb2xsOiEwLHVuc2VsZWN0QXV0bzohMCxkcm9wQWNjZXB0OiIqIixldmVudE9yZGVyOiJ0aXRsZSIsZXZlbnRMaW1pdDohMSxldmVudExpbWl0VGV4dDoibW9yZSIsZXZlbnRMaW1pdENsaWNrOiJwb3BvdmVyIixkYXlQb3BvdmVyRm9ybWF0OiJMTCIsaGFuZGxlV2luZG93UmVzaXplOiEwLHdpbmRvd1Jlc2l6ZURlbGF5OjEwMCxsb25nUHJlc3NEZWxheToxZTN9LEVlLmVuZ2xpc2hEZWZhdWx0cz17ZGF5UG9wb3ZlckZvcm1hdDoiZGRkZCwgTU1NTSBEIn0sRWUucnRsRGVmYXVsdHM9e2hlYWRlcjp7bGVmdDoibmV4dCxwcmV2IHRvZGF5IixjZW50ZXI6IiIscmlnaHQ6InRpdGxlIn0sYnV0dG9uSWNvbnM6e3ByZXY6InJpZ2h0LXNpbmdsZS1hcnJvdyIsbmV4dDoibGVmdC1zaW5nbGUtYXJyb3ciLHByZXZZZWFyOiJyaWdodC1kb3VibGUtYXJyb3ciLG5leHRZZWFyOiJsZWZ0LWRvdWJsZS1hcnJvdyJ9LHRoZW1lQnV0dG9uSWNvbnM6e3ByZXY6ImNpcmNsZS10cmlhbmdsZS1lIixuZXh0OiJjaXJjbGUtdHJpYW5nbGUtdyIsbmV4dFllYXI6InNlZWstcHJldiIscHJldlllYXI6InNlZWstbmV4dCJ9fTt2YXIgRGU9anQubG9jYWxlcz17fTtqdC5kYXRlcGlja2VyTG9jYWxlPWZ1bmN0aW9uKGUsbixpKXt2YXIgcj1EZVtlXXx8KERlW2VdPXt9KTtyLmlzUlRMPWkuaXNSVEwsci53ZWVrTnVtYmVyVGl0bGU9aS53ZWVrSGVhZGVyLHQuZWFjaChiZSxmdW5jdGlvbih0LGUpe3JbdF09ZShpKX0pLHQuZGF0ZXBpY2tlciYmKHQuZGF0ZXBpY2tlci5yZWdpb25hbFtuXT10LmRhdGVwaWNrZXIucmVnaW9uYWxbZV09aSx0LmRhdGVwaWNrZXIucmVnaW9uYWwuZW49dC5kYXRlcGlja2VyLnJlZ2lvbmFsWyIiXSx0LmRhdGVwaWNrZXIuc2V0RGVmYXVsdHMoaSkpfSxqdC5sb2NhbGU9ZnVuY3Rpb24oZSxpKXt2YXIgcixzO3I9RGVbZV18fChEZVtlXT17fSksaSYmKHI9RGVbZV09bihbcixpXSkpLHM9UHQoZSksdC5lYWNoKENlLGZ1bmN0aW9uKHQsZSl7bnVsbD09clt0XSYmKHJbdF09ZShzLHIpKX0pLEVlLmRlZmF1bHRzLmxvY2FsZT1lfTt2YXIgYmU9e2J1dHRvblRleHQ6ZnVuY3Rpb24odCl7cmV0dXJue3ByZXY6ZXQodC5wcmV2VGV4dCksbmV4dDpldCh0Lm5leHRUZXh0KSx0b2RheTpldCh0LmN1cnJlbnRUZXh0KX19LG1vbnRoWWVhckZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5zaG93TW9udGhBZnRlclllYXI/IllZWVlbIit0LnllYXJTdWZmaXgrIl0gTU1NTSI6Ik1NTU0gWVlZWVsiK3QueWVhclN1ZmZpeCsiXSJ9fSxDZT17ZGF5T2ZNb250aEZvcm1hdDpmdW5jdGlvbih0LGUpe3ZhciBuPXQubG9uZ0RhdGVGb3JtYXQoImwiKTtyZXR1cm4gbj1uLnJlcGxhY2UoL15ZK1teXHdcc10qfFteXHdcc10qWSskL2csIiIpLGUuaXNSVEw/bis9IiBkZGQiOm49ImRkZCAiK24sbn0sbWVkaXVtVGltZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5sb25nRGF0ZUZvcm1hdCgiTFQiKS5yZXBsYWNlKC9ccyphJC9pLCJhIil9LHNtYWxsVGltZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5sb25nRGF0ZUZvcm1hdCgiTFQiKS5yZXBsYWNlKCI6bW0iLCIoOm1tKSIpLnJlcGxhY2UoLyhcV21tKSQvLCIoJDEpIikucmVwbGFjZSgvXHMqYSQvaSwiYSIpfSxleHRyYVNtYWxsVGltZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5sb25nRGF0ZUZvcm1hdCgiTFQiKS5yZXBsYWNlKCI6bW0iLCIoOm1tKSIpLnJlcGxhY2UoLyhcV21tKSQvLCIoJDEpIikucmVwbGFjZSgvXHMqYSQvaSwidCIpfSxob3VyRm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmxvbmdEYXRlRm9ybWF0KCJMVCIpLnJlcGxhY2UoIjptbSIsIiIpLnJlcGxhY2UoLyhcV21tKSQvLCIiKS5yZXBsYWNlKC9ccyphJC9pLCJhIil9LG5vTWVyaWRpZW1UaW1lRm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmxvbmdEYXRlRm9ybWF0KCJMVCIpLnJlcGxhY2UoL1xzKmEkL2ksIiIpfX0sSGU9e3NtYWxsRGF5RGF0ZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pc1JUTD8iRCBkZCI6ImRkIEQifSx3ZWVrRm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmlzUlRMPyJ3WyAiK3Qud2Vla051bWJlclRpdGxlKyJdIjoiWyIrdC53ZWVrTnVtYmVyVGl0bGUrIiBddyJ9LHNtYWxsV2Vla0Zvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pc1JUTD8id1siK3Qud2Vla051bWJlclRpdGxlKyJdIjoiWyIrdC53ZWVrTnVtYmVyVGl0bGUrIl13In19O2p0LmxvY2FsZSgiZW4iLEVlLmVuZ2xpc2hEZWZhdWx0cyksanQuc291cmNlTm9ybWFsaXplcnM9W10sanQuc291cmNlRmV0Y2hlcnM9W107dmFyIFRlPXtkYXRhVHlwZToianNvbiIsY2FjaGU6ITF9LHhlPTE7RWUucHJvdG90eXBlLm5vcm1hbGl6ZUV2ZW50PWZ1bmN0aW9uKHQpe30sRWUucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW49ZnVuY3Rpb24odCxlKXt2YXIgbj10LnN0YXJ0LmNsb25lKCkuc3RyaXBab25lKCksaT10aGlzLmdldEV2ZW50RW5kKHQpLnN0cmlwWm9uZSgpO3JldHVybiBlLnN0YXJ0Pj1uJiZlLmVuZDw9aX0sRWUucHJvdG90eXBlLmdldFBlZXJFdmVudHM9ZnVuY3Rpb24odCxlKXt2YXIgbixpLHI9dGhpcy5nZXRFdmVudENhY2hlKCkscz1bXTtmb3Iobj0wO248ci5sZW5ndGg7bisrKWk9cltuXSxlJiZlLl9pZD09PWkuX2lkfHxzLnB1c2goaSk7cmV0dXJuIHN9LEVlLnByb3RvdHlwZS5pc0V2ZW50U3BhbkFsbG93ZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNvdXJjZXx8e30saT1KKGUuY29uc3RyYWludCxuLmNvbnN0cmFpbnQsdGhpcy5vcHRpb25zLmV2ZW50Q29uc3RyYWludCkscj1KKGUub3ZlcmxhcCxuLm92ZXJsYXAsdGhpcy5vcHRpb25zLmV2ZW50T3ZlcmxhcCk7cmV0dXJuIHRoaXMuaXNTcGFuQWxsb3dlZCh0LGkscixlKSYmKCF0aGlzLm9wdGlvbnMuZXZlbnRBbGxvd3x8dGhpcy5vcHRpb25zLmV2ZW50QWxsb3codCxlKSE9PSExKX0sRWUucHJvdG90eXBlLmlzRXh0ZXJuYWxTcGFuQWxsb3dlZD1mdW5jdGlvbihlLG4saSl7dmFyIHIscztyZXR1cm4gaSYmKHI9dC5leHRlbmQoe30saSxuKSxzPXRoaXMuZXhwYW5kRXZlbnQodGhpcy5idWlsZEV2ZW50RnJvbUlucHV0KHIpKVswXSkscz90aGlzLmlzRXZlbnRTcGFuQWxsb3dlZChlLHMpOnRoaXMuaXNTZWxlY3Rpb25TcGFuQWxsb3dlZChlKX0sRWUucHJvdG90eXBlLmlzU2VsZWN0aW9uU3BhbkFsbG93ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNTcGFuQWxsb3dlZCh0LHRoaXMub3B0aW9ucy5zZWxlY3RDb25zdHJhaW50LHRoaXMub3B0aW9ucy5zZWxlY3RPdmVybGFwKSYmKCF0aGlzLm9wdGlvbnMuc2VsZWN0QWxsb3d8fHRoaXMub3B0aW9ucy5zZWxlY3RBbGxvdyh0KSE9PSExKX0sRWUucHJvdG90eXBlLmlzU3BhbkFsbG93ZWQ9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHIscyxvLGwsYSx1O2lmKG51bGwhPWUmJihyPXRoaXMuY29uc3RyYWludFRvRXZlbnRzKGUpKSl7Zm9yKHM9ITEsbD0wO2w8ci5sZW5ndGg7bCsrKWlmKHRoaXMuc3BhbkNvbnRhaW5zU3BhbihyW2xdLHQpKXtzPSEwO2JyZWFrfWlmKCFzKXJldHVybiExfWZvcihvPXRoaXMuZ2V0UGVlckV2ZW50cyh0LGkpLGw9MDtsPG8ubGVuZ3RoO2wrKylpZihhPW9bbF0sdGhpcy5ldmVudEludGVyc2VjdHNSYW5nZShhLHQpKXtpZihuPT09ITEpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4mJiFuKGEsaSkpcmV0dXJuITE7aWYoaSl7aWYodT1KKGEub3ZlcmxhcCwoYS5zb3VyY2V8fHt9KS5vdmVybGFwKSx1PT09ITEpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHUmJiF1KGksYSkpcmV0dXJuITF9fXJldHVybiEwfSxFZS5wcm90b3R5cGUuY29uc3RyYWludFRvRXZlbnRzPWZ1bmN0aW9uKHQpe3JldHVybiJidXNpbmVzc0hvdXJzIj09PXQ/dGhpcy5nZXRDdXJyZW50QnVzaW5lc3NIb3VyRXZlbnRzKCk6Im9iamVjdCI9PXR5cGVvZiB0P251bGwhPXQuc3RhcnQ/dGhpcy5leHBhbmRFdmVudCh0aGlzLmJ1aWxkRXZlbnRGcm9tSW5wdXQodCkpOm51bGw6dGhpcy5jbGllbnRFdmVudHModCl9LEVlLnByb3RvdHlwZS5ldmVudEludGVyc2VjdHNSYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKSxpPXRoaXMuZ2V0RXZlbnRFbmQodCkuc3RyaXBab25lKCk7cmV0dXJuIGUuc3RhcnQ8aSYmZS5lbmQ+bn07dmFyIFJlPXtpZDoiX2ZjQnVzaW5lc3NIb3VycyIsc3RhcnQ6IjA5OjAwIixlbmQ6IjE3OjAwIixkb3c6WzEsMiwzLDQsNV0scmVuZGVyaW5nOiJpbnZlcnNlLWJhY2tncm91bmQifTtFZS5wcm90b3R5cGUuZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wdXRlQnVzaW5lc3NIb3VyRXZlbnRzKHQsdGhpcy5vcHRpb25zLmJ1c2luZXNzSG91cnMpfSxFZS5wcm90b3R5cGUuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cz1mdW5jdGlvbihlLG4pe3JldHVybiBuPT09ITA/dGhpcy5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMoZSxbe31dKTp0LmlzUGxhaW5PYmplY3Qobik/dGhpcy5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMoZSxbbl0pOnQuaXNBcnJheShuKT90aGlzLmV4cGFuZEJ1c2luZXNzSG91ckV2ZW50cyhlLG4sITApOltdfSxFZS5wcm90b3R5cGUuZXhwYW5kQnVzaW5lc3NIb3VyRXZlbnRzPWZ1bmN0aW9uKGUsbixpKXt2YXIgcixzLG89dGhpcy5nZXRWaWV3KCksbD1bXTtmb3Iocj0wO3I8bi5sZW5ndGg7cisrKXM9bltyXSxpJiYhcy5kb3d8fChzPXQuZXh0ZW5kKHt9LFJlLHMpLGUmJihzLnN0YXJ0PW51bGwscy5lbmQ9bnVsbCksbC5wdXNoLmFwcGx5KGwsdGhpcy5leHBhbmRFdmVudCh0aGlzLmJ1aWxkRXZlbnRGcm9tSW5wdXQocyksby5zdGFydCxvLmVuZCkpKTtyZXR1cm4gbH07dmFyIEllPWp0LkJhc2ljVmlldz1TZS5leHRlbmQoe3Njcm9sbGVyOm51bGwsZGF5R3JpZENsYXNzOm1lLGRheUdyaWQ6bnVsbCxkYXlOdW1iZXJzVmlzaWJsZTohMSxjb2xXZWVrTnVtYmVyc1Zpc2libGU6ITEsY2VsbFdlZWtOdW1iZXJzVmlzaWJsZTohMSx3ZWVrTnVtYmVyV2lkdGg6bnVsbCxoZWFkQ29udGFpbmVyRWw6bnVsbCxoZWFkUm93RWw6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkPXRoaXMuaW5zdGFudGlhdGVEYXlHcmlkKCksdGhpcy5zY3JvbGxlcj1uZXcgd2Uoe292ZXJmbG93WDoiaGlkZGVuIixvdmVyZmxvd1k6ImF1dG8ifSl9LGluc3RhbnRpYXRlRGF5R3JpZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF5R3JpZENsYXNzLmV4dGVuZChrZSk7cmV0dXJuIG5ldyB0KHRoaXMpfSxzZXRSYW5nZTpmdW5jdGlvbih0KXtTZS5wcm90b3R5cGUuc2V0UmFuZ2UuY2FsbCh0aGlzLHQpLHRoaXMuZGF5R3JpZC5icmVha09uV2Vla3M9L3llYXJ8bW9udGh8d2Vlay8udGVzdCh0aGlzLmludGVydmFsVW5pdCksdGhpcy5kYXlHcmlkLnNldFJhbmdlKHQpfSxjb21wdXRlUmFuZ2U6ZnVuY3Rpb24odCl7dmFyIGU9U2UucHJvdG90eXBlLmNvbXB1dGVSYW5nZS5jYWxsKHRoaXMsdCk7cmV0dXJuL3llYXJ8bW9udGgvLnRlc3QoZS5pbnRlcnZhbFVuaXQpJiYoZS5zdGFydC5zdGFydE9mKCJ3ZWVrIiksZS5zdGFydD10aGlzLnNraXBIaWRkZW5EYXlzKGUuc3RhcnQpLGUuZW5kLndlZWtkYXkoKSYmKGUuZW5kLmFkZCgxLCJ3ZWVrIikuc3RhcnRPZigid2VlayIpLGUuZW5kPXRoaXMuc2tpcEhpZGRlbkRheXMoZS5lbmQsLTEsITApKSksZX0scmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt0aGlzLmRheU51bWJlcnNWaXNpYmxlPXRoaXMuZGF5R3JpZC5yb3dDbnQ+MSx0aGlzLm9wdCgid2Vla051bWJlcnMiKSYmKHRoaXMub3B0KCJ3ZWVrTnVtYmVyc1dpdGhpbkRheXMiKT8odGhpcy5jZWxsV2Vla051bWJlcnNWaXNpYmxlPSEwLHRoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlPSExKToodGhpcy5jZWxsV2Vla051bWJlcnNWaXNpYmxlPSExLHRoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlPSEwKSksdGhpcy5kYXlHcmlkLm51bWJlcnNWaXNpYmxlPXRoaXMuZGF5TnVtYmVyc1Zpc2libGV8fHRoaXMuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZXx8dGhpcy5jb2xXZWVrTnVtYmVyc1Zpc2libGUsdGhpcy5lbC5hZGRDbGFzcygiZmMtYmFzaWMtdmlldyIpLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSksdGhpcy5yZW5kZXJIZWFkKCksdGhpcy5zY3JvbGxlci5yZW5kZXIoKTt2YXIgZT10aGlzLnNjcm9sbGVyLmVsLmFkZENsYXNzKCJmYy1kYXktZ3JpZC1jb250YWluZXIiKSxuPXQoJzxkaXYgY2xhc3M9ImZjLWRheS1ncmlkIiAvPicpLmFwcGVuZFRvKGUpO3RoaXMuZWwuZmluZCgiLmZjLWJvZHkgPiB0ciA+IHRkIikuYXBwZW5kKGUpLHRoaXMuZGF5R3JpZC5zZXRFbGVtZW50KG4pLHRoaXMuZGF5R3JpZC5yZW5kZXJEYXRlcyh0aGlzLmhhc1JpZ2lkUm93cygpKX0scmVuZGVySGVhZDpmdW5jdGlvbigpe3RoaXMuaGVhZENvbnRhaW5lckVsPXRoaXMuZWwuZmluZCgiLmZjLWhlYWQtY29udGFpbmVyIikuaHRtbCh0aGlzLmRheUdyaWQucmVuZGVySGVhZEh0bWwoKSksdGhpcy5oZWFkUm93RWw9dGhpcy5oZWFkQ29udGFpbmVyRWwuZmluZCgiLmZjLXJvdyIpfSx1bnJlbmRlckRhdGVzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnVucmVuZGVyRGF0ZXMoKSx0aGlzLmRheUdyaWQucmVtb3ZlRWxlbWVudCgpLHRoaXMuc2Nyb2xsZXIuZGVzdHJveSgpfSxyZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKX0sdW5yZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpfSxyZW5kZXJTa2VsZXRvbkh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4nPHRhYmxlPjx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+PHRyPjx0ZCBjbGFzcz0iZmMtaGVhZC1jb250YWluZXIgJyt0aGlzLndpZGdldEhlYWRlckNsYXNzKyciPjwvdGQ+PC90cj48L3RoZWFkPjx0Ym9keSBjbGFzcz0iZmMtYm9keSI+PHRyPjx0ZCBjbGFzcz0iJyt0aGlzLndpZGdldENvbnRlbnRDbGFzcysnIj48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPid9LHdlZWtOdW1iZXJTdHlsZUF0dHI6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMud2Vla051bWJlcldpZHRoPydzdHlsZT0id2lkdGg6Jyt0aGlzLndlZWtOdW1iZXJXaWR0aCsncHgiJzoiIn0saGFzUmlnaWRSb3dzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHQoImV2ZW50TGltaXQiKTtyZXR1cm4gdCYmIm51bWJlciIhPXR5cGVvZiB0fSx1cGRhdGVXaWR0aDpmdW5jdGlvbigpe3RoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlJiYodGhpcy53ZWVrTnVtYmVyV2lkdGg9dSh0aGlzLmVsLmZpbmQoIi5mYy13ZWVrLW51bWJlciIpKSl9LHNldEhlaWdodDpmdW5jdGlvbih0LGUpe3ZhciBuLHMsbz10aGlzLm9wdCgiZXZlbnRMaW1pdCIpO3RoaXMuc2Nyb2xsZXIuY2xlYXIoKSxyKHRoaXMuaGVhZFJvd0VsKSx0aGlzLmRheUdyaWQucmVtb3ZlU2VnUG9wb3ZlcigpLG8mJiJudW1iZXIiPT10eXBlb2YgbyYmdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhvKSxuPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2V0R3JpZEhlaWdodChuLGUpLG8mJiJudW1iZXIiIT10eXBlb2YgbyYmdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhvKSxlfHwodGhpcy5zY3JvbGxlci5zZXRIZWlnaHQobikscz10aGlzLnNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpLChzLmxlZnR8fHMucmlnaHQpJiYoaSh0aGlzLmhlYWRSb3dFbCxzKSxuPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KG4pKSx0aGlzLnNjcm9sbGVyLmxvY2tPdmVyZmxvdyhzKSl9LGNvbXB1dGVTY3JvbGxlckhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdC1kKHRoaXMuZWwsdGhpcy5zY3JvbGxlci5lbCl9LHNldEdyaWRIZWlnaHQ6ZnVuY3Rpb24odCxlKXtlP2EodGhpcy5kYXlHcmlkLnJvd0Vscyk6bCh0aGlzLmRheUdyaWQucm93RWxzLHQsITApfSxxdWVyeVNjcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbFRvcCgpfSxzZXRTY3JvbGw6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxlci5zZXRTY3JvbGxUb3AodCl9LHByZXBhcmVIaXRzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnByZXBhcmVIaXRzKCl9LHJlbGVhc2VIaXRzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnJlbGVhc2VIaXRzKCl9LHF1ZXJ5SGl0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZGF5R3JpZC5xdWVyeUhpdCh0LGUpfSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRheUdyaWQuZ2V0SGl0U3Bhbih0KX0sZ2V0SGl0RWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF5R3JpZC5nZXRIaXRFbCh0KX0scmVuZGVyRXZlbnRzOmZ1bmN0aW9uKHQpe3RoaXMuZGF5R3JpZC5yZW5kZXJFdmVudHModCksdGhpcy51cGRhdGVIZWlnaHQoKX0sZ2V0RXZlbnRTZWdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF5R3JpZC5nZXRFdmVudFNlZ3MoKX0sdW5yZW5kZXJFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLmRheUdyaWQudW5yZW5kZXJFdmVudHMoKX0scmVuZGVyRHJhZzpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmRheUdyaWQucmVuZGVyRHJhZyh0LGUpfSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt0aGlzLmRheUdyaWQudW5yZW5kZXJEcmFnKCl9LHJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbih0KXt0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHQpfSx1bnJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMuZGF5R3JpZC51bnJlbmRlclNlbGVjdGlvbigpfX0pLGtlPXtyZW5kZXJIZWFkSW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3O3JldHVybiB0LmNvbFdlZWtOdW1iZXJzVmlzaWJsZT8nPHRoIGNsYXNzPSJmYy13ZWVrLW51bWJlciAnK3Qud2lkZ2V0SGVhZGVyQ2xhc3MrJyIgJyt0LndlZWtOdW1iZXJTdHlsZUF0dHIoKSsiPjxzcGFuPiIrdHQodC5vcHQoIndlZWtOdW1iZXJUaXRsZSIpKSsiPC9zcGFuPjwvdGg+IjoiIn0scmVuZGVyTnVtYmVySW50cm9IdG1sOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlldyxuPXRoaXMuZ2V0Q2VsbERhdGUodCwwKTtyZXR1cm4gZS5jb2xXZWVrTnVtYmVyc1Zpc2libGU/Jzx0ZCBjbGFzcz0iZmMtd2Vlay1udW1iZXIiICcrZS53ZWVrTnVtYmVyU3R5bGVBdHRyKCkrIj4iK2UuYnVpbGRHb3RvQW5jaG9ySHRtbCh7ZGF0ZTpuLHR5cGU6IndlZWsiLGZvcmNlT2ZmOjE9PT10aGlzLmNvbENudH0sbi5mb3JtYXQoInciKSkrIjwvdGQ+IjoiIn0scmVuZGVyQmdJbnRyb0h0bWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpZXc7cmV0dXJuIHQuY29sV2Vla051bWJlcnNWaXNpYmxlPyc8dGQgY2xhc3M9ImZjLXdlZWstbnVtYmVyICcrdC53aWRnZXRDb250ZW50Q2xhc3MrJyIgJyt0LndlZWtOdW1iZXJTdHlsZUF0dHIoKSsiPjwvdGQ+IjoiIn0scmVuZGVySW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3O3JldHVybiB0LmNvbFdlZWtOdW1iZXJzVmlzaWJsZT8nPHRkIGNsYXNzPSJmYy13ZWVrLW51bWJlciIgJyt0LndlZWtOdW1iZXJTdHlsZUF0dHIoKSsiPjwvdGQ+IjoiIn19LE1lPWp0Lk1vbnRoVmlldz1JZS5leHRlbmQoe2NvbXB1dGVSYW5nZTpmdW5jdGlvbih0KXt2YXIgZSxuPUllLnByb3RvdHlwZS5jb21wdXRlUmFuZ2UuY2FsbCh0aGlzLHQpO3JldHVybiB0aGlzLmlzRml4ZWRXZWVrcygpJiYoZT1NYXRoLmNlaWwobi5lbmQuZGlmZihuLnN0YXJ0LCJ3ZWVrcyIsITApKSxuLmVuZC5hZGQoNi1lLCJ3ZWVrcyIpKSxufSxzZXRHcmlkSGVpZ2h0OmZ1bmN0aW9uKHQsZSl7ZSYmKHQqPXRoaXMucm93Q250LzYpLGwodGhpcy5kYXlHcmlkLnJvd0Vscyx0LCFlKX0saXNGaXhlZFdlZWtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0KCJmaXhlZFdlZWtDb3VudCIpfX0pO1V0LmJhc2ljPXtjbGFzczpJZX0sVXQuYmFzaWNEYXk9e3R5cGU6ImJhc2ljIixkdXJhdGlvbjp7ZGF5czoxfX0sVXQuYmFzaWNXZWVrPXt0eXBlOiJiYXNpYyIsZHVyYXRpb246e3dlZWtzOjF9fSxVdC5tb250aD17Y2xhc3M6TWUsZHVyYXRpb246e21vbnRoczoxfSxkZWZhdWx0czp7Zml4ZWRXZWVrQ291bnQ6ITB9fTt2YXIgTGU9anQuQWdlbmRhVmlldz1TZS5leHRlbmQoe3Njcm9sbGVyOm51bGwsdGltZUdyaWRDbGFzczp5ZSx0aW1lR3JpZDpudWxsLGRheUdyaWRDbGFzczptZSxkYXlHcmlkOm51bGwsYXhpc1dpZHRoOm51bGwsaGVhZENvbnRhaW5lckVsOm51bGwsbm9TY3JvbGxSb3dFbHM6bnVsbCxib3R0b21SdWxlRWw6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZD10aGlzLmluc3RhbnRpYXRlVGltZUdyaWQoKSx0aGlzLm9wdCgiYWxsRGF5U2xvdCIpJiYodGhpcy5kYXlHcmlkPXRoaXMuaW5zdGFudGlhdGVEYXlHcmlkKCkpLHRoaXMuc2Nyb2xsZXI9bmV3IHdlKHtvdmVyZmxvd1g6ImhpZGRlbiIsb3ZlcmZsb3dZOiJhdXRvIn0pfSxpbnN0YW50aWF0ZVRpbWVHcmlkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50aW1lR3JpZENsYXNzLmV4dGVuZChCZSk7cmV0dXJuIG5ldyB0KHRoaXMpfSxpbnN0YW50aWF0ZURheUdyaWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRheUdyaWRDbGFzcy5leHRlbmQoemUpO3JldHVybiBuZXcgdCh0aGlzKX0sc2V0UmFuZ2U6ZnVuY3Rpb24odCl7U2UucHJvdG90eXBlLnNldFJhbmdlLmNhbGwodGhpcyx0KSx0aGlzLnRpbWVHcmlkLnNldFJhbmdlKHQpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnNldFJhbmdlKHQpfSxyZW5kZXJEYXRlczpmdW5jdGlvbigpe3RoaXMuZWwuYWRkQ2xhc3MoImZjLWFnZW5kYS12aWV3IikuaHRtbCh0aGlzLnJlbmRlclNrZWxldG9uSHRtbCgpKSx0aGlzLnJlbmRlckhlYWQoKSx0aGlzLnNjcm9sbGVyLnJlbmRlcigpO3ZhciBlPXRoaXMuc2Nyb2xsZXIuZWwuYWRkQ2xhc3MoImZjLXRpbWUtZ3JpZC1jb250YWluZXIiKSxuPXQoJzxkaXYgY2xhc3M9ImZjLXRpbWUtZ3JpZCIgLz4nKS5hcHBlbmRUbyhlKTt0aGlzLmVsLmZpbmQoIi5mYy1ib2R5ID4gdHIgPiB0ZCIpLmFwcGVuZChlKSx0aGlzLnRpbWVHcmlkLnNldEVsZW1lbnQobiksdGhpcy50aW1lR3JpZC5yZW5kZXJEYXRlcygpLHRoaXMuYm90dG9tUnVsZUVsPXQoJzxociBjbGFzcz0iZmMtZGl2aWRlciAnK3RoaXMud2lkZ2V0SGVhZGVyQ2xhc3MrJyIvPicpLmFwcGVuZFRvKHRoaXMudGltZUdyaWQuZWwpLHRoaXMuZGF5R3JpZCYmKHRoaXMuZGF5R3JpZC5zZXRFbGVtZW50KHRoaXMuZWwuZmluZCgiLmZjLWRheS1ncmlkIikpLHRoaXMuZGF5R3JpZC5yZW5kZXJEYXRlcygpLHRoaXMuZGF5R3JpZC5ib3R0b21Db29yZFBhZGRpbmc9dGhpcy5kYXlHcmlkLmVsLm5leHQoImhyIikub3V0ZXJIZWlnaHQoKSksdGhpcy5ub1Njcm9sbFJvd0Vscz10aGlzLmVsLmZpbmQoIi5mYy1yb3c6bm90KC5mYy1zY3JvbGxlciAqKSIpfSxyZW5kZXJIZWFkOmZ1bmN0aW9uKCl7dGhpcy5oZWFkQ29udGFpbmVyRWw9dGhpcy5lbC5maW5kKCIuZmMtaGVhZC1jb250YWluZXIiKS5odG1sKHRoaXMudGltZUdyaWQucmVuZGVySGVhZEh0bWwoKSl9LHVucmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt0aGlzLnRpbWVHcmlkLnVucmVuZGVyRGF0ZXMoKSx0aGlzLnRpbWVHcmlkLnJlbW92ZUVsZW1lbnQoKSx0aGlzLmRheUdyaWQmJih0aGlzLmRheUdyaWQudW5yZW5kZXJEYXRlcygpLHRoaXMuZGF5R3JpZC5yZW1vdmVFbGVtZW50KCkpLHRoaXMuc2Nyb2xsZXIuZGVzdHJveSgpfSxyZW5kZXJTa2VsZXRvbkh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4nPHRhYmxlPjx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+PHRyPjx0ZCBjbGFzcz0iZmMtaGVhZC1jb250YWluZXIgJyt0aGlzLndpZGdldEhlYWRlckNsYXNzKyciPjwvdGQ+PC90cj48L3RoZWFkPjx0Ym9keSBjbGFzcz0iZmMtYm9keSI+PHRyPjx0ZCBjbGFzcz0iJyt0aGlzLndpZGdldENvbnRlbnRDbGFzcysnIj4nKyh0aGlzLmRheUdyaWQ/JzxkaXYgY2xhc3M9ImZjLWRheS1ncmlkIi8+PGhyIGNsYXNzPSJmYy1kaXZpZGVyICcrdGhpcy53aWRnZXRIZWFkZXJDbGFzcysnIi8+JzoiIikrIjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+In0sYXhpc1N0eWxlQXR0cjpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5heGlzV2lkdGg/J3N0eWxlPSJ3aWR0aDonK3RoaXMuYXhpc1dpZHRoKydweCInOiIifSxyZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC5yZW5kZXJCdXNpbmVzc0hvdXJzKCksdGhpcy5kYXlHcmlkJiZ0aGlzLmRheUdyaWQucmVuZGVyQnVzaW5lc3NIb3VycygpfSx1bnJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt0aGlzLnRpbWVHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpfSxnZXROb3dJbmRpY2F0b3JVbml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0Tm93SW5kaWNhdG9yVW5pdCgpfSxyZW5kZXJOb3dJbmRpY2F0b3I6ZnVuY3Rpb24odCl7dGhpcy50aW1lR3JpZC5yZW5kZXJOb3dJbmRpY2F0b3IodCl9LHVucmVuZGVyTm93SW5kaWNhdG9yOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC51bnJlbmRlck5vd0luZGljYXRvcigpfSx1cGRhdGVTaXplOmZ1bmN0aW9uKHQpe3RoaXMudGltZUdyaWQudXBkYXRlU2l6ZSh0KSxTZS5wcm90b3R5cGUudXBkYXRlU2l6ZS5jYWxsKHRoaXMsdCl9LHVwZGF0ZVdpZHRoOmZ1bmN0aW9uKCl7dGhpcy5heGlzV2lkdGg9dSh0aGlzLmVsLmZpbmQoIi5mYy1heGlzIikpfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCxlKXt2YXIgbixzLG87dGhpcy5ib3R0b21SdWxlRWwuaGlkZSgpLHRoaXMuc2Nyb2xsZXIuY2xlYXIoKSxyKHRoaXMubm9TY3JvbGxSb3dFbHMpLHRoaXMuZGF5R3JpZCYmKHRoaXMuZGF5R3JpZC5yZW1vdmVTZWdQb3BvdmVyKCksbj10aGlzLm9wdCgiZXZlbnRMaW1pdCIpLG4mJiJudW1iZXIiIT10eXBlb2YgbiYmKG49RmUpLG4mJnRoaXMuZGF5R3JpZC5saW1pdFJvd3MobikpLGV8fChzPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KHMpLG89dGhpcy5zY3JvbGxlci5nZXRTY3JvbGxiYXJXaWR0aHMoKSwoby5sZWZ0fHxvLnJpZ2h0KSYmKGkodGhpcy5ub1Njcm9sbFJvd0VscyxvKSxzPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KHMpKSx0aGlzLnNjcm9sbGVyLmxvY2tPdmVyZmxvdyhvKSx0aGlzLnRpbWVHcmlkLmdldFRvdGFsU2xhdEhlaWdodCgpPHMmJnRoaXMuYm90dG9tUnVsZUVsLnNob3coKSl9LGNvbXB1dGVTY3JvbGxlckhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdC1kKHRoaXMuZWwsdGhpcy5zY3JvbGxlci5lbCl9LGNvbXB1dGVJbml0aWFsU2Nyb2xsOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5kdXJhdGlvbih0aGlzLm9wdCgic2Nyb2xsVGltZSIpKSxuPXRoaXMudGltZUdyaWQuY29tcHV0ZVRpbWVUb3AodCk7cmV0dXJuIG49TWF0aC5jZWlsKG4pLG4mJm4rKyxufSxxdWVyeVNjcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbFRvcCgpfSxzZXRTY3JvbGw6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxlci5zZXRTY3JvbGxUb3AodCl9LHByZXBhcmVIaXRzOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC5wcmVwYXJlSGl0cygpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnByZXBhcmVIaXRzKCl9LHJlbGVhc2VIaXRzOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC5yZWxlYXNlSGl0cygpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnJlbGVhc2VIaXRzKCl9LHF1ZXJ5SGl0OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy50aW1lR3JpZC5xdWVyeUhpdCh0LGUpO3JldHVybiFuJiZ0aGlzLmRheUdyaWQmJihuPXRoaXMuZGF5R3JpZC5xdWVyeUhpdCh0LGUpKSxufSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbXBvbmVudC5nZXRIaXRTcGFuKHQpfSxnZXRIaXRFbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb21wb25lbnQuZ2V0SGl0RWwodCl9LHJlbmRlckV2ZW50czpmdW5jdGlvbih0KXt2YXIgZSxuLGk9W10scj1bXSxzPVtdO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXS5hbGxEYXk/aS5wdXNoKHRbbl0pOnIucHVzaCh0W25dKTtlPXRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKHIpLHRoaXMuZGF5R3JpZCYmKHM9dGhpcy5kYXlHcmlkLnJlbmRlckV2ZW50cyhpKSksdGhpcy51cGRhdGVIZWlnaHQoKX0sZ2V0RXZlbnRTZWdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0RXZlbnRTZWdzKCkuY29uY2F0KHRoaXMuZGF5R3JpZD90aGlzLmRheUdyaWQuZ2V0RXZlbnRTZWdzKCk6W10pfSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe3RoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnJlbmRlckV2ZW50cygpfSxyZW5kZXJEcmFnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc3RhcnQuaGFzVGltZSgpP3RoaXMudGltZUdyaWQucmVuZGVyRHJhZyh0LGUpOnRoaXMuZGF5R3JpZD90aGlzLmRheUdyaWQucmVuZGVyRHJhZyh0LGUpOnZvaWQgMH0sdW5yZW5kZXJEcmFnOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC51bnJlbmRlckRyYWcoKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnJlbmRlckRyYWcoKX0scmVuZGVyU2VsZWN0aW9uOmZ1bmN0aW9uKHQpe3Quc3RhcnQuaGFzVGltZSgpfHx0LmVuZC5oYXNUaW1lKCk/dGhpcy50aW1lR3JpZC5yZW5kZXJTZWxlY3Rpb24odCk6dGhpcy5kYXlHcmlkJiZ0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHQpfSx1bnJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMudGltZUdyaWQudW5yZW5kZXJTZWxlY3Rpb24oKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnJlbmRlclNlbGVjdGlvbigpfX0pLEJlPXtyZW5kZXJIZWFkSW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLnZpZXc7cmV0dXJuIGUub3B0KCJ3ZWVrTnVtYmVycyIpPyh0PXRoaXMuc3RhcnQuZm9ybWF0KGUub3B0KCJzbWFsbFdlZWtGb3JtYXQiKSksJzx0aCBjbGFzcz0iZmMtYXhpcyBmYy13ZWVrLW51bWJlciAnK2Uud2lkZ2V0SGVhZGVyQ2xhc3MrJyIgJytlLmF4aXNTdHlsZUF0dHIoKSsiPiIrZS5idWlsZEdvdG9BbmNob3JIdG1sKHtkYXRlOnRoaXMuc3RhcnQsdHlwZToid2VlayIsZm9yY2VPZmY6dGhpcy5jb2xDbnQ+MX0sdHQodCkpKyI8L3RoPiIpOic8dGggY2xhc3M9ImZjLWF4aXMgJytlLndpZGdldEhlYWRlckNsYXNzKyciICcrZS5heGlzU3R5bGVBdHRyKCkrIj48L3RoPiJ9LHJlbmRlckJnSW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3O3JldHVybic8dGQgY2xhc3M9ImZjLWF4aXMgJyt0LndpZGdldENvbnRlbnRDbGFzcysnIiAnK3QuYXhpc1N0eWxlQXR0cigpKyI+PC90ZD4ifSxyZW5kZXJJbnRyb0h0bWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpZXc7cmV0dXJuJzx0ZCBjbGFzcz0iZmMtYXhpcyIgJyt0LmF4aXNTdHlsZUF0dHIoKSsiPjwvdGQ+In19LHplPXtyZW5kZXJCZ0ludHJvSHRtbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlldztyZXR1cm4nPHRkIGNsYXNzPSJmYy1heGlzICcrdC53aWRnZXRDb250ZW50Q2xhc3MrJyIgJyt0LmF4aXNTdHlsZUF0dHIoKSsiPjxzcGFuPiIrdC5nZXRBbGxEYXlIdG1sKCkrIjwvc3Bhbj48L3RkPiJ9LHJlbmRlckludHJvSHRtbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlldztyZXR1cm4nPHRkIGNsYXNzPSJmYy1heGlzIiAnK3QuYXhpc1N0eWxlQXR0cigpKyI+PC90ZD4ifX0sRmU9NSxOZT1be2hvdXJzOjF9LHttaW51dGVzOjMwfSx7bWludXRlczoxNX0se3NlY29uZHM6MzB9LHtzZWNvbmRzOjE1fV07VXQuYWdlbmRhPXtjbGFzczpMZSxkZWZhdWx0czp7YWxsRGF5U2xvdDohMCxzbG90RHVyYXRpb246IjAwOjMwOjAwIixtaW5UaW1lOiIwMDowMDowMCIsbWF4VGltZToiMjQ6MDA6MDAiLHNsb3RFdmVudE92ZXJsYXA6ITB9fSxVdC5hZ2VuZGFEYXk9e3R5cGU6ImFnZW5kYSIsZHVyYXRpb246e2RheXM6MX19LFV0LmFnZW5kYVdlZWs9e3R5cGU6ImFnZW5kYSIsZHVyYXRpb246e3dlZWtzOjF9fTt2YXIgR2U9U2UuZXh0ZW5kKHtncmlkOm51bGwsc2Nyb2xsZXI6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5ncmlkPW5ldyBBZSh0aGlzKSx0aGlzLnNjcm9sbGVyPW5ldyB3ZSh7b3ZlcmZsb3dYOiJoaWRkZW4iLG92ZXJmbG93WToiYXV0byJ9KX0sc2V0UmFuZ2U6ZnVuY3Rpb24odCl7U2UucHJvdG90eXBlLnNldFJhbmdlLmNhbGwodGhpcyx0KSx0aGlzLmdyaWQuc2V0UmFuZ2UodCl9LHJlbmRlclNrZWxldG9uOmZ1bmN0aW9uKCl7dGhpcy5lbC5hZGRDbGFzcygiZmMtbGlzdC12aWV3ICIrdGhpcy53aWRnZXRDb250ZW50Q2xhc3MpLHRoaXMuc2Nyb2xsZXIucmVuZGVyKCksdGhpcy5zY3JvbGxlci5lbC5hcHBlbmRUbyh0aGlzLmVsKSx0aGlzLmdyaWQuc2V0RWxlbWVudCh0aGlzLnNjcm9sbGVyLnNjcm9sbEVsKX0sdW5yZW5kZXJTa2VsZXRvbjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuZGVzdHJveSgpfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCxlKXt0aGlzLnNjcm9sbGVyLnNldEhlaWdodCh0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0KSl9LGNvbXB1dGVTY3JvbGxlckhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdC1kKHRoaXMuZWwsdGhpcy5zY3JvbGxlci5lbCl9LHJlbmRlckV2ZW50czpmdW5jdGlvbih0KXt0aGlzLmdyaWQucmVuZGVyRXZlbnRzKHQpfSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe3RoaXMuZ3JpZC51bnJlbmRlckV2ZW50cygpfSxpc0V2ZW50UmVzaXphYmxlOmZ1bmN0aW9uKHQpe3JldHVybiExfSxpc0V2ZW50RHJhZ2dhYmxlOmZ1bmN0aW9uKHQpe3JldHVybiExfX0pLEFlPXBlLmV4dGVuZCh7c2VnU2VsZWN0b3I6Ii5mYy1saXN0LWl0ZW0iLGhhc0RheUludGVyYWN0aW9uczohMSxzcGFuVG9TZWdzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXRoaXMudmlldyxpPW4uc3RhcnQuY2xvbmUoKS50aW1lKDApLHI9MCxzPVtdO2k8bi5lbmQ7KWlmKGU9Rih0LHtzdGFydDppLGVuZDppLmNsb25lKCkuYWRkKDEsImRheSIpfSksZSYmKGUuZGF5SW5kZXg9cixzLnB1c2goZSkpLGkuYWRkKDEsImRheSIpLHIrKyxlJiYhZS5pc0VuZCYmdC5lbmQuaGFzVGltZSgpJiZ0LmVuZDxpLmNsb25lKCkuYWRkKHRoaXMudmlldy5uZXh0RGF5VGhyZXNob2xkKSl7ZS5lbmQ9dC5lbmQuY2xvbmUoKSxlLmlzRW5kPSEwO2JyZWFrfXJldHVybiBzfSxjb21wdXRlRXZlbnRUaW1lRm9ybWF0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5vcHQoIm1lZGl1bVRpbWVGb3JtYXQiKX0saGFuZGxlU2VnQ2xpY2s6ZnVuY3Rpb24oZSxuKXt2YXIgaTtwZS5wcm90b3R5cGUuaGFuZGxlU2VnQ2xpY2suYXBwbHkodGhpcyxhcmd1bWVudHMpLHQobi50YXJnZXQpLmNsb3Nlc3QoImFbaHJlZl0iKS5sZW5ndGh8fChpPWUuZXZlbnQudXJsLGkmJiFuLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYod2luZG93LmxvY2F0aW9uLmhyZWY9aSkpfSxyZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5yZW5kZXJGZ1NlZ0Vscyh0KSx0Lmxlbmd0aD90aGlzLnJlbmRlclNlZ0xpc3QodCk6dGhpcy5yZW5kZXJFbXB0eU1lc3NhZ2UoKSx0fSxyZW5kZXJFbXB0eU1lc3NhZ2U6ZnVuY3Rpb24oKXt0aGlzLmVsLmh0bWwoJzxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHktd3JhcDIiPjxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHktd3JhcDEiPjxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHkiPicrdHQodGhpcy52aWV3Lm9wdCgibm9FdmVudHNNZXNzYWdlIikpKyI8L2Rpdj48L2Rpdj48L2Rpdj4iKX0scmVuZGVyU2VnTGlzdDpmdW5jdGlvbihlKXt2YXIgbixpLHIscz10aGlzLmdyb3VwU2Vnc0J5RGF5KGUpLG89dCgnPHRhYmxlIGNsYXNzPSJmYy1saXN0LXRhYmxlIj48dGJvZHkvPjwvdGFibGU+JyksbD1vLmZpbmQoInRib2R5Iik7Zm9yKG49MDtuPHMubGVuZ3RoO24rKylpZihpPXNbbl0pZm9yKGwuYXBwZW5kKHRoaXMuZGF5SGVhZGVySHRtbCh0aGlzLnZpZXcuc3RhcnQuY2xvbmUoKS5hZGQobiwiZGF5cyIpKSksdGhpcy5zb3J0RXZlbnRTZWdzKGkpLHI9MDtyPGkubGVuZ3RoO3IrKylsLmFwcGVuZChpW3JdLmVsKTt0aGlzLmVsLmVtcHR5KCkuYXBwZW5kKG8pfSxncm91cFNlZ3NCeURheTpmdW5jdGlvbih0KXt2YXIgZSxuLGk9W107Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyluPXRbZV0sKGlbbi5kYXlJbmRleF18fChpW24uZGF5SW5kZXhdPVtdKSkucHVzaChuKTtyZXR1cm4gaX0sZGF5SGVhZGVySHRtbDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpZXcsbj1lLm9wdCgibGlzdERheUZvcm1hdCIpLGk9ZS5vcHQoImxpc3REYXlBbHRGb3JtYXQiKTtyZXR1cm4nPHRyIGNsYXNzPSJmYy1saXN0LWhlYWRpbmciIGRhdGEtZGF0ZT0iJyt0LmZvcm1hdCgiWVlZWS1NTS1ERCIpKyciPjx0ZCBjbGFzcz0iJytlLndpZGdldEhlYWRlckNsYXNzKyciIGNvbHNwYW49IjMiPicrKG4/ZS5idWlsZEdvdG9BbmNob3JIdG1sKHQse2NsYXNzOiJmYy1saXN0LWhlYWRpbmctbWFpbiJ9LHR0KHQuZm9ybWF0KG4pKSk6IiIpKyhpP2UuYnVpbGRHb3RvQW5jaG9ySHRtbCh0LHtjbGFzczoiZmMtbGlzdC1oZWFkaW5nLWFsdCJ9LHR0KHQuZm9ybWF0KGkpKSk6IiIpKyI8L3RkPjwvdHI+In0sZmdTZWdIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy52aWV3LGk9WyJmYy1saXN0LWl0ZW0iXS5jb25jYXQodGhpcy5nZXRTZWdDdXN0b21DbGFzc2VzKHQpKSxyPXRoaXMuZ2V0U2VnQmFja2dyb3VuZENvbG9yKHQpLHM9dC5ldmVudCxvPXMudXJsO3JldHVybiBlPXMuYWxsRGF5P24uZ2V0QWxsRGF5SHRtbCgpOm4uaXNNdWx0aURheUV2ZW50KHMpP3QuaXNTdGFydHx8dC5pc0VuZD90dCh0aGlzLmdldEV2ZW50VGltZVRleHQodCkpOm4uZ2V0QWxsRGF5SHRtbCgpOnR0KHRoaXMuZ2V0RXZlbnRUaW1lVGV4dChzKSksbyYmaS5wdXNoKCJmYy1oYXMtdXJsIiksJzx0ciBjbGFzcz0iJytpLmpvaW4oIiAiKSsnIj4nKyh0aGlzLmRpc3BsYXlFdmVudFRpbWU/Jzx0ZCBjbGFzcz0iZmMtbGlzdC1pdGVtLXRpbWUgJytuLndpZGdldENvbnRlbnRDbGFzcysnIj4nKyhlfHwiIikrIjwvdGQ+IjoiIikrJzx0ZCBjbGFzcz0iZmMtbGlzdC1pdGVtLW1hcmtlciAnK24ud2lkZ2V0Q29udGVudENsYXNzKyciPjxzcGFuIGNsYXNzPSJmYy1ldmVudC1kb3QiJysocj8nIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOicrcisnIic6IiIpKyc+PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJmYy1saXN0LWl0ZW0tdGl0bGUgJytuLndpZGdldENvbnRlbnRDbGFzcysnIj48YScrKG8/JyBocmVmPSInK3R0KG8pKyciJzoiIikrIj4iK3R0KHQuZXZlbnQudGl0bGV8fCIiKSsiPC9hPjwvdGQ+PC90cj4ifX0pO3JldHVybiBVdC5saXN0PXtjbGFzczpHZSxidXR0b25UZXh0S2V5OiJsaXN0IixkZWZhdWx0czp7YnV0dG9uVGV4dDoibGlzdCIsbGlzdERheUZvcm1hdDoiTEwiLG5vRXZlbnRzTWVzc2FnZToiTm8gZXZlbnRzIHRvIGRpc3BsYXkifX0sVXQubGlzdERheT17dHlwZToibGlzdCIsZHVyYXRpb246e2RheXM6MX0sZGVmYXVsdHM6e2xpc3REYXlGb3JtYXQ6ImRkZGQifX0sVXQubGlzdFdlZWs9e3R5cGU6Imxpc3QiLGR1cmF0aW9uOnt3ZWVrczoxfSxkZWZhdWx0czp7bGlzdERheUZvcm1hdDoiZGRkZCIsbGlzdERheUFsdEZvcm1hdDoiTEwifX0sVXQubGlzdE1vbnRoPXt0eXBlOiJsaXN0IixkdXJhdGlvbjp7bW9udGg6MX0sZGVmYXVsdHM6e2xpc3REYXlBbHRGb3JtYXQ6ImRkZGQifX0sVXQubGlzdFllYXI9e3R5cGU6Imxpc3QiLGR1cmF0aW9uOnt5ZWFyOjF9LGRlZmF1bHRzOntsaXN0RGF5QWx0Rm9ybWF0OiJkZGRkIn19LGp0fSk7
Ci8qIQpGdWxsQ2FsZW5kYXIgU2NoZWR1bGVyIHYxLjQuMApEb2NzICYgTGljZW5zZTogaHR0cDovL2Z1bGxjYWxlbmRhci5pby9zY2hlZHVsZXIvCihjKSAyMDE2IEFkYW0gU2hhdwogKi8KKGZ1bmN0aW9uKGZhY3RvcnkpIHsKCWlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKCQlkZWZpbmUoWyAnanF1ZXJ5JywgJ21vbWVudCcsICdmdWxsY2FsZW5kYXInIF0sIGZhY3RvcnkpOwoJfQoJZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7IC8vIE5vZGUvQ29tbW9uSlMKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoCgkJCXJlcXVpcmUoJ2pxdWVyeScpLAoJCQlyZXF1aXJlKCdtb21lbnQnKSwKCQkJcmVxdWlyZSgnZnVsbGNhbGVuZGFyJykKCQkpOwoJfQoJZWxzZSB7CgkJZmFjdG9yeShqUXVlcnksIG1vbWVudCk7Cgl9Cn0pKGZ1bmN0aW9uKCQsIG1vbWVudCkgezsKdmFyIENPTF9NSU5fV0lEVEgsIENhbGVuZGFyLCBDYWxlbmRhckV4dGVuc2lvbiwgQ2xhc3MsIENsaXBwZWRTY3JvbGxlciwgQ29vcmRDYWNoZSwgREVGQVVMVF9HUklEX0RVUkFUSU9OLCBEcmFnTGlzdGVuZXIsIEVtaXR0ZXJNaXhpbiwgRW5oYW5jZWRTY3JvbGxlciwgRXZlbnRSb3csIEZDLCBHcmlkLCBIUm93R3JvdXAsIExJQ0VOU0VfSU5GT19VUkwsIExpc3RlbmVyTWl4aW4sIE1BWF9BVVRPX0NFTExTLCBNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwsIE1BWF9DRUxMUywgTUlOX0FVVE9fTEFCRUxTLCBQUkVTRVRfTElDRU5TRV9LRVlTLCBSRUxFQVNFX0RBVEUsIFJlc291cmNlQWdlbmRhVmlldywgUmVzb3VyY2VCYXNpY1ZpZXcsIFJlc291cmNlRGF5R3JpZCwgUmVzb3VyY2VEYXlUYWJsZU1peGluLCBSZXNvdXJjZUdyaWRNaXhpbiwgUmVzb3VyY2VNYW5hZ2VyLCBSZXNvdXJjZU1vbnRoVmlldywgUmVzb3VyY2VSb3csIFJlc291cmNlVGltZUdyaWQsIFJlc291cmNlVGltZWxpbmVHcmlkLCBSZXNvdXJjZVRpbWVsaW5lVmlldywgUmVzb3VyY2VWaWV3TWl4aW4sIFJvd0dyb3VwLCBSb3dQYXJlbnQsIFNUT0NLX1NVQl9EVVJBVElPTlMsIFNjcm9sbEZvbGxvd2VyLCBTY3JvbGxGb2xsb3dlclNwcml0ZSwgU2Nyb2xsSm9pbmVyLCBTY3JvbGxlckNhbnZhcywgU3ByZWFkc2hlZXQsIFRpbWVsaW5lR3JpZCwgVGltZWxpbmVWaWV3LCBVUEdSQURFX1dJTkRPVywgVlJvd0dyb3VwLCBWaWV3LCBhcHBseUFsbCwgY2FwaXRhbGlzZUZpcnN0TGV0dGVyLCBjb21wYXJlQnlGaWVsZFNwZWNzLCBjb21wdXRlSW50ZXJ2YWxVbml0LCBjb21wdXRlT2Zmc2V0Rm9yU2VnLCBjb21wdXRlT2Zmc2V0Rm9yU2VncywgY29weVJlY3QsIGNzc1RvU3RyLCBkZWJvdW5jZSwgZGV0ZWN0V2FybmluZ0luQ29udGFpbmVyLCBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24sIGRpdmlkZVJhbmdlQnlEdXJhdGlvbiwgZHVyYXRpb25IYXNUaW1lLCBmbGV4aWJsZUNvbXBhcmUsIGdldENvbnRlbnRSZWN0LCBnZXRPdXRlclJlY3QsIGdldE93bkNlbGxzLCBnZXRSZWN0SGVpZ2h0LCBnZXRSZWN0V2lkdGgsIGdldFNjcm9sbGJhcldpZHRocywgaENvbnRhaW5SZWN0LCBodG1sRXNjYXBlLCBpbnRlcnNlY3RSYW5nZXMsIGludGVyc2VjdFJlY3RzLCBpc0ltbXVuZVVybCwgaXNJbnQsIGlzVmFsaWRLZXksIGpvaW5SZWN0cywgbXVsdGlwbHlEdXJhdGlvbiwgb3JpZ0Rpc3BsYXlFdmVudHMsIG9yaWdEaXNwbGF5Vmlldywgb3JpZ0dldFNlZ0N1c3RvbUNsYXNzZXMsIG9yaWdHZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yLCBvcmlnR2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yLCBvcmlnR2V0U2VnRGVmYXVsdFRleHRDb2xvciwgb3JpZ1JlbmRlclNrZWxldG9uLCBvcmlnVW5yZW5kZXJTa2VsZXRvbiwgcGFyc2VGaWVsZFNwZWNzLCBwcm9jZXNzTGljZW5zZUtleSwgcHJveHksIHJlbmRlcmluZ1dhcm5pbmdJbkNvbnRhaW5lciwgc3luY1RoZW4sIHRlc3RSZWN0Q29udGFpbnMsIHRlc3RSZWN0SENvbnRhaW5zLCB0ZXN0UmVjdFZDb250YWlucywgdGltZVJvd1NlZ3NDb2xsaWRlLCB2Q29udGFpblJlY3QsCiAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LAogIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSwKICBpbmRleE9mID0gW10uaW5kZXhPZiB8fCBmdW5jdGlvbihpdGVtKSB7IGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsgaWYgKGkgaW4gdGhpcyAmJiB0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsgfSByZXR1cm4gLTE7IH0sCiAgc2xpY2UgPSBbXS5zbGljZTsKCkZDID0gJC5mdWxsQ2FsZW5kYXI7CgpGQy5zY2hlZHVsZXJWZXJzaW9uID0gIjEuNC4wIjsKCmlmIChGQy5pbnRlcm5hbEFwaVZlcnNpb24gIT09IDYpIHsKICBGQy53YXJuKCd2JyArIEZDLnNjaGVkdWxlclZlcnNpb24gKyAnIG9mIEZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgJyArICdpcyBpbmNvbXBhdGlibGUgd2l0aCB2JyArIEZDLnZlcnNpb24gKyAnIG9mIHRoZSBjb3JlLlxuJyArICdQbGVhc2Ugc2VlIGh0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vc3VwcG9ydC8gZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7CiAgcmV0dXJuOwp9CgpDYWxlbmRhciA9IEZDLkNhbGVuZGFyOwoKQ2xhc3MgPSBGQy5DbGFzczsKClZpZXcgPSBGQy5WaWV3OwoKR3JpZCA9IEZDLkdyaWQ7CgppbnRlcnNlY3RSYW5nZXMgPSBGQy5pbnRlcnNlY3RSYW5nZXM7CgpkZWJvdW5jZSA9IEZDLmRlYm91bmNlOwoKaXNJbnQgPSBGQy5pc0ludDsKCmdldFNjcm9sbGJhcldpZHRocyA9IEZDLmdldFNjcm9sbGJhcldpZHRoczsKCkRyYWdMaXN0ZW5lciA9IEZDLkRyYWdMaXN0ZW5lcjsKCmh0bWxFc2NhcGUgPSBGQy5odG1sRXNjYXBlOwoKY29tcHV0ZUludGVydmFsVW5pdCA9IEZDLmNvbXB1dGVJbnRlcnZhbFVuaXQ7Cgpwcm94eSA9IEZDLnByb3h5OwoKY2FwaXRhbGlzZUZpcnN0TGV0dGVyID0gRkMuY2FwaXRhbGlzZUZpcnN0TGV0dGVyOwoKYXBwbHlBbGwgPSBGQy5hcHBseUFsbDsKCkVtaXR0ZXJNaXhpbiA9IEZDLkVtaXR0ZXJNaXhpbjsKCkxpc3RlbmVyTWl4aW4gPSBGQy5MaXN0ZW5lck1peGluOwoKZHVyYXRpb25IYXNUaW1lID0gRkMuZHVyYXRpb25IYXNUaW1lOwoKZGl2aWRlUmFuZ2VCeUR1cmF0aW9uID0gRkMuZGl2aWRlUmFuZ2VCeUR1cmF0aW9uOwoKZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uID0gRkMuZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uOwoKbXVsdGlwbHlEdXJhdGlvbiA9IEZDLm11bHRpcGx5RHVyYXRpb247CgpwYXJzZUZpZWxkU3BlY3MgPSBGQy5wYXJzZUZpZWxkU3BlY3M7Cgpjb21wYXJlQnlGaWVsZFNwZWNzID0gRkMuY29tcGFyZUJ5RmllbGRTcGVjczsKCmZsZXhpYmxlQ29tcGFyZSA9IEZDLmZsZXhpYmxlQ29tcGFyZTsKCmludGVyc2VjdFJlY3RzID0gRkMuaW50ZXJzZWN0UmVjdHM7CgpDb29yZENhY2hlID0gRkMuQ29vcmRDYWNoZTsKCmdldENvbnRlbnRSZWN0ID0gRkMuZ2V0Q29udGVudFJlY3Q7CgpnZXRPdXRlclJlY3QgPSBGQy5nZXRPdXRlclJlY3Q7CgoKLyoKR2l2ZW4gYSBqUXVlcnkgPHRyPiBzZXQsIHJldHVybnMgdGhlIDx0ZD4ncyB0aGF0IGRvIG5vdCBoYXZlIG11bHRpLWxpbmUgcm93c3BhbnMuCldvdWxkIHVzZSB0aGUgW3Jvd3NwYW5dIHNlbGVjdG9yLCBidXQgbmV2ZXIgbm90IGRlZmluZWQgaW4gSUU4LgogKi8KCmdldE93bkNlbGxzID0gZnVuY3Rpb24odHJzKSB7CiAgcmV0dXJuIHRycy5maW5kKCc+IHRkJykuZmlsdGVyKGZ1bmN0aW9uKGksIHRkTm9kZSkgewogICAgcmV0dXJuIHRkTm9kZS5yb3dTcGFuIDw9IDE7CiAgfSk7Cn07CgoKLyoKSEFDSyB0byBjb21iYXQgalF1ZXJ5IDMgcHJvbWlzZXMgbm93IGFsd2F5cyBleGVjdXRlZCBkb25lIGhhbmRsZXJzIGFzeW5jaHJvbm91c2x5LgppZiB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCwgb3Igbm90IGEgcHJvbWlzZSBhdCBhbGwsIGRvbmVGdW5jIGV4ZWN1dGVzIGltbWVkaWF0ZWx5LgppZiB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSBiZWVuIHJlamVjdGVkLCBmYWlsRnVuYyBleGVjdXRlcyBpbW1lZGlhdGVseS4KICovCgpzeW5jVGhlbiA9IGZ1bmN0aW9uKHByb21pc2UsIGRvbmVGdW5jLCBmYWlsRnVuYykgewogIGlmICghcHJvbWlzZSB8fCAhcHJvbWlzZS50aGVuIHx8IHByb21pc2Uuc3RhdGUoKSA9PT0gJ3Jlc29sdmVkJykgewogICAgaWYgKGRvbmVGdW5jKSB7CiAgICAgIHJldHVybiAkLndoZW4oZG9uZUZ1bmMoKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJC53aGVuKCk7CiAgICB9CiAgfSBlbHNlIGlmIChwcm9taXNlLnN0YXRlKCkgPT09ICdyZWplY3RlZCcpIHsKICAgIGlmIChmYWlsRnVuYykgewogICAgICBmYWlsRnVuYygpOwogICAgfQogICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoKS5wcm9taXNlKCk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBwcm9taXNlLnRoZW4oZG9uZUZ1bmMsIGZhaWxGdW5jKTsKICB9Cn07CgoKLyoKQSBTY3JvbGxlciB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eToKLSBvcHRpb25hbCBTY3JvbGxlckNhbnZhcyBmb3IgY29udGVudAotIGZpcmVkIGV2ZW50cyBmb3Igc2Nyb2xsIHN0YXJ0L2VuZAotIGNyb3NzLWJyb3dzZXIgbm9ybWFsaXphdGlvbiBvZiBob3Jpem9udGFsIHNjcm9sbCBmb3IgUlRMCiAqLwoKRW5oYW5jZWRTY3JvbGxlciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgdmFyIGRldGVjdFJ0bFNjcm9sbFN5c3RlbSwgcnRsU2Nyb2xsU3lzdGVtOwoKICBleHRlbmQoRW5oYW5jZWRTY3JvbGxlciwgc3VwZXJDbGFzcyk7CgogIEVuaGFuY2VkU2Nyb2xsZXIubWl4aW4oRW1pdHRlck1peGluKTsKCiAgRW5oYW5jZWRTY3JvbGxlci5taXhpbihMaXN0ZW5lck1peGluKTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUuY2FudmFzID0gbnVsbDsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUuaXNTY3JvbGxpbmcgPSBmYWxzZTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUuaXNUb3VjaGluZyA9IGZhbHNlOwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5pc01vdmluZyA9IGZhbHNlOwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5pc1RvdWNoU2Nyb2xsRW5hYmxlZCA9IHRydWU7CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXIgPSBudWxsOwoKICBmdW5jdGlvbiBFbmhhbmNlZFNjcm9sbGVyKCkgewogICAgRW5oYW5jZWRTY3JvbGxlci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMucmVxdWVzdE1vdmluZ0VuZCA9IGRlYm91bmNlKHRoaXMucmVwb3J0TW92aW5nRW5kLCA1MDApOwogIH0KCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICBFbmhhbmNlZFNjcm9sbGVyLl9fc3VwZXJfXy5yZW5kZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh0aGlzLmNhbnZhcykgewogICAgICB0aGlzLmNhbnZhcy5yZW5kZXIoKTsKICAgICAgdGhpcy5jYW52YXMuZWwuYXBwZW5kVG8odGhpcy5zY3JvbGxFbCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5iaW5kSGFuZGxlcnMoKTsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CiAgICBFbmhhbmNlZFNjcm9sbGVyLl9fc3VwZXJfXy5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy51bmJpbmRIYW5kbGVycygpOwogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmRpc2FibGVUb3VjaFNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pc1RvdWNoU2Nyb2xsRW5hYmxlZCA9IGZhbHNlOwogICAgcmV0dXJuIHRoaXMuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpOwogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmVuYWJsZVRvdWNoU2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlzVG91Y2hTY3JvbGxFbmFibGVkID0gdHJ1ZTsKICAgIGlmICghdGhpcy5pc1RvdWNoaW5nKSB7CiAgICAgIHJldHVybiB0aGlzLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpOwogICAgfQogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmJpbmRQcmV2ZW50VG91Y2hTY3JvbGwgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyKSB7CiAgICAgIHJldHVybiB0aGlzLnNjcm9sbEVsLm9uKCd0b3VjaG1vdmUnLCB0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXIgPSBGQy5wcmV2ZW50RGVmYXVsdCk7CiAgICB9CiAgfTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUudW5iaW5kUHJldmVudFRvdWNoU2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyKSB7CiAgICAgIHRoaXMuc2Nyb2xsRWwub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXIpOwogICAgICByZXR1cm4gdGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyID0gbnVsbDsKICAgIH0KICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5iaW5kSGFuZGxlcnMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmxpc3RlblRvKHRoaXMuc2Nyb2xsRWwsIHsKICAgICAgc2Nyb2xsOiB0aGlzLnJlcG9ydFNjcm9sbCwKICAgICAgdG91Y2hzdGFydDogdGhpcy5yZXBvcnRUb3VjaFN0YXJ0LAogICAgICB0b3VjaGVuZDogdGhpcy5yZXBvcnRUb3VjaEVuZAogICAgfSk7CiAgfTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUudW5iaW5kSGFuZGxlcnMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0aGlzLnNjcm9sbEVsKTsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRTY3JvbGwgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5pc1Njcm9sbGluZykgewogICAgICB0aGlzLnJlcG9ydFNjcm9sbFN0YXJ0KCk7CiAgICB9CiAgICB0aGlzLnRyaWdnZXIoJ3Njcm9sbCcpOwogICAgdGhpcy5pc01vdmluZyA9IHRydWU7CiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0TW92aW5nRW5kKCk7CiAgfTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUucmVwb3J0U2Nyb2xsU3RhcnQgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5pc1Njcm9sbGluZykgewogICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcignc2Nyb2xsU3RhcnQnLCB0aGlzLmlzVG91Y2hpbmcpOwogICAgfQogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnJlcXVlc3RNb3ZpbmdFbmQgPSBudWxsOwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRNb3ZpbmdFbmQgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaXNNb3ZpbmcgPSBmYWxzZTsKICAgIGlmICghdGhpcy5pc1RvdWNoaW5nKSB7CiAgICAgIHJldHVybiB0aGlzLnJlcG9ydFNjcm9sbEVuZCgpOwogICAgfQogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnJlcG9ydFNjcm9sbEVuZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaXNTY3JvbGxpbmcpIHsKICAgICAgdGhpcy50cmlnZ2VyKCdzY3JvbGxFbmQnKTsKICAgICAgcmV0dXJuIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsKICAgIH0KICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRUb3VjaFN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5pc1RvdWNoaW5nID0gdHJ1ZTsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRUb3VjaEVuZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaXNUb3VjaGluZykgewogICAgICB0aGlzLmlzVG91Y2hpbmcgPSBmYWxzZTsKICAgICAgaWYgKHRoaXMuaXNUb3VjaFNjcm9sbEVuYWJsZWQpIHsKICAgICAgICB0aGlzLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpOwogICAgICB9CiAgICAgIGlmICghdGhpcy5pc01vdmluZykgewogICAgICAgIHJldHVybiB0aGlzLnJlcG9ydFNjcm9sbEVuZCgpOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qCiAgCUlmIFJUTCwgYW5kIHNjcm9sbGVkIHRvIHRoZSBsZWZ0LCByZXR1cm5zIE5FR0FUSVZFIHZhbHVlIChsaWtlIEZpcmVmb3gpCiAgICovCgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbExlZnQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBkaXJlY3Rpb24sIG5vZGUsIHZhbDsKICAgIGRpcmVjdGlvbiA9IHRoaXMuc2Nyb2xsRWwuY3NzKCdkaXJlY3Rpb24nKTsKICAgIG5vZGUgPSB0aGlzLnNjcm9sbEVsWzBdOwogICAgdmFsID0gbm9kZS5zY3JvbGxMZWZ0OwogICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcpIHsKICAgICAgc3dpdGNoIChydGxTY3JvbGxTeXN0ZW0pIHsKICAgICAgICBjYXNlICdwb3NpdGl2ZSc6CiAgICAgICAgICB2YWwgPSB2YWwgKyBub2RlLmNsaWVudFdpZHRoIC0gbm9kZS5zY3JvbGxXaWR0aDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3JldmVyc2UnOgogICAgICAgICAgdmFsID0gLXZhbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbDsKICB9OwoKCiAgLyoKICAJQWNjZXB0cyBhIE5FR0FUSVZFIHZhbHVlIGZvciB3aGVuIHNjcm9sbGVkIGluIFJUTAogICAqLwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5zZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24odmFsKSB7CiAgICB2YXIgZGlyZWN0aW9uLCBub2RlOwogICAgZGlyZWN0aW9uID0gdGhpcy5zY3JvbGxFbC5jc3MoJ2RpcmVjdGlvbicpOwogICAgbm9kZSA9IHRoaXMuc2Nyb2xsRWxbMF07CiAgICBpZiAoZGlyZWN0aW9uID09PSAncnRsJykgewogICAgICBzd2l0Y2ggKHJ0bFNjcm9sbFN5c3RlbSkgewogICAgICAgIGNhc2UgJ3Bvc2l0aXZlJzoKICAgICAgICAgIHZhbCA9IHZhbCAtIG5vZGUuY2xpZW50V2lkdGggKyBub2RlLnNjcm9sbFdpZHRoOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncmV2ZXJzZSc6CiAgICAgICAgICB2YWwgPSAtdmFsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZS5zY3JvbGxMZWZ0ID0gdmFsOwogIH07CgoKICAvKgogIAlBbHdheXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyBzY3JvbGxlZCBmcm9tIHRoZSBsZWZ0bW9zdCBwb3NpdGlvbiAoZXZlbiBpZiBSVEwpLgogIAlBbHdheXMgcG9zaXRpdmUuCiAgICovCgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbEZyb21MZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZGlyZWN0aW9uLCBub2RlLCB2YWw7CiAgICBkaXJlY3Rpb24gPSB0aGlzLnNjcm9sbEVsLmNzcygnZGlyZWN0aW9uJyk7CiAgICBub2RlID0gdGhpcy5zY3JvbGxFbFswXTsKICAgIHZhbCA9IG5vZGUuc2Nyb2xsTGVmdDsKICAgIGlmIChkaXJlY3Rpb24gPT09ICdydGwnKSB7CiAgICAgIHN3aXRjaCAocnRsU2Nyb2xsU3lzdGVtKSB7CiAgICAgICAgY2FzZSAnbmVnYXRpdmUnOgogICAgICAgICAgdmFsID0gdmFsIC0gbm9kZS5jbGllbnRXaWR0aCArIG5vZGUuc2Nyb2xsV2lkdGg7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdyZXZlcnNlJzoKICAgICAgICAgIHZhbCA9IC12YWwgLSBub2RlLmNsaWVudFdpZHRoICsgbm9kZS5zY3JvbGxXaWR0aDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbDsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5nZXROYXRpdmVTY3JvbGxMZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5zY3JvbGxFbFswXS5zY3JvbGxMZWZ0OwogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnNldE5hdGl2ZVNjcm9sbExlZnQgPSBmdW5jdGlvbih2YWwpIHsKICAgIHJldHVybiB0aGlzLnNjcm9sbEVsWzBdLnNjcm9sbExlZnQgPSB2YWw7CiAgfTsKCiAgcnRsU2Nyb2xsU3lzdGVtID0gbnVsbDsKCiAgZGV0ZWN0UnRsU2Nyb2xsU3lzdGVtID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZWwsIG5vZGUsIHN5c3RlbTsKICAgIGVsID0gJCgnPGRpdiBzdHlsZT0iIHBvc2l0aW9uOiBhYnNvbHV0ZSB0b3A6IC0xMDAwcHg7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBvdmVyZmxvdzogc2Nyb2xsOyBkaXJlY3Rpb246IHJ0bDsgZm9udC1zaXplOiAxNHB4OyAiPkE8L2Rpdj4nKS5hcHBlbmRUbygnYm9keScpOwogICAgbm9kZSA9IGVsWzBdOwogICAgc3lzdGVtID0gbm9kZS5zY3JvbGxMZWZ0ID4gMCA/ICdwb3NpdGl2ZScgOiAobm9kZS5zY3JvbGxMZWZ0ID0gMSwgZWwuc2Nyb2xsTGVmdCA+IDAgPyAncmV2ZXJzZScgOiAnbmVnYXRpdmUnKTsKICAgIGVsLnJlbW92ZSgpOwogICAgcmV0dXJuIHN5c3RlbTsKICB9OwoKICAkKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHJ0bFNjcm9sbFN5c3RlbSA9IGRldGVjdFJ0bFNjcm9sbFN5c3RlbSgpOwogIH0pOwoKICByZXR1cm4gRW5oYW5jZWRTY3JvbGxlcjsKCn0pKEZDLlNjcm9sbGVyKTsKCgovKgpBIFNjcm9sbGVyLCBidXQgd2l0aCBhIHdyYXBwaW5nIGRpdiB0aGF0IGFsbG93cyAiY2xpcHBpbmciIGF3YXkgb2YgbmF0aXZlIHNjcm9sbGJhcnMsCmdpdmluZyB0aGUgYXBwZWFyYW5jZSB0aGF0IHRoZXJlIGFyZSBubyBzY3JvbGxiYXJzLgogKi8KCkNsaXBwZWRTY3JvbGxlciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKENsaXBwZWRTY3JvbGxlciwgc3VwZXJDbGFzcyk7CgogIENsaXBwZWRTY3JvbGxlci5wcm90b3R5cGUuaXNIU2Nyb2xsYmFyc0NsaXBwZWQgPSBmYWxzZTsKCiAgQ2xpcHBlZFNjcm9sbGVyLnByb3RvdHlwZS5pc1ZTY3JvbGxiYXJzQ2xpcHBlZCA9IGZhbHNlOwoKCiAgLyoKICAJUmVjZWl2ZWQgb3ZlcmZsb3dzIGNhbiBiZSBzZXQgdG8gJ2NsaXBwZWQnLCBtZWFuaW5nIHNjcm9sbGJhcnMgc2hvdWxkbid0IGJlIHZpc2libGUKICAJdG8gdGhlIHVzZXIsIGJ1dCB0aGUgYXJlYSBzaG91bGQgc3RpbGwgc2Nyb2xsLgogICAqLwoKICBmdW5jdGlvbiBDbGlwcGVkU2Nyb2xsZXIoKSB7CiAgICBDbGlwcGVkU2Nyb2xsZXIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5vdmVyZmxvd1ggPT09ICdjbGlwcGVkLXNjcm9sbCcpIHsKICAgICAgdGhpcy5vdmVyZmxvd1ggPSAnc2Nyb2xsJzsKICAgICAgdGhpcy5pc0hTY3JvbGxiYXJzQ2xpcHBlZCA9IHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5vdmVyZmxvd1kgPT09ICdjbGlwcGVkLXNjcm9sbCcpIHsKICAgICAgdGhpcy5vdmVyZmxvd1kgPSAnc2Nyb2xsJzsKICAgICAgdGhpcy5pc1ZTY3JvbGxiYXJzQ2xpcHBlZCA9IHRydWU7CiAgICB9CiAgfQoKICBDbGlwcGVkU2Nyb2xsZXIucHJvdG90eXBlLnJlbmRlckVsID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgc2Nyb2xsRWw7CiAgICBzY3JvbGxFbCA9IENsaXBwZWRTY3JvbGxlci5fX3N1cGVyX18ucmVuZGVyRWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHJldHVybiAkKCc8ZGl2IGNsYXNzPSJmYy1zY3JvbGxlci1jbGlwIiAvPicpLmFwcGVuZChzY3JvbGxFbCk7CiAgfTsKCiAgQ2xpcHBlZFNjcm9sbGVyLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgY3NzUHJvcHMsIHNjcm9sbEVsLCBzY3JvbGxiYXJXaWR0aHM7CiAgICBzY3JvbGxFbCA9IHRoaXMuc2Nyb2xsRWw7CiAgICBzY3JvbGxiYXJXaWR0aHMgPSBnZXRTY3JvbGxiYXJXaWR0aHMoc2Nyb2xsRWwpOwogICAgY3NzUHJvcHMgPSB7CiAgICAgIG1hcmdpbkxlZnQ6IDAsCiAgICAgIG1hcmdpblJpZ2h0OiAwLAogICAgICBtYXJnaW5Ub3A6IDAsCiAgICAgIG1hcmdpbkJvdHRvbTogMAogICAgfTsKICAgIGlmICh0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIGNzc1Byb3BzLm1hcmdpblRvcCA9IC1zY3JvbGxiYXJXaWR0aHMudG9wOwogICAgICBjc3NQcm9wcy5tYXJnaW5Cb3R0b20gPSAtc2Nyb2xsYmFyV2lkdGhzLmJvdHRvbTsKICAgIH0KICAgIGlmICh0aGlzLmlzVlNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIGNzc1Byb3BzLm1hcmdpbkxlZnQgPSAtc2Nyb2xsYmFyV2lkdGhzLmxlZnQ7CiAgICAgIGNzc1Byb3BzLm1hcmdpblJpZ2h0ID0gLXNjcm9sbGJhcldpZHRocy5yaWdodDsKICAgIH0KICAgIHNjcm9sbEVsLmNzcyhjc3NQcm9wcyk7CiAgICByZXR1cm4gc2Nyb2xsRWwudG9nZ2xlQ2xhc3MoJ2ZjLW5vLXNjcm9sbGJhcnMnLCAodGhpcy5pc0hTY3JvbGxiYXJzQ2xpcHBlZCB8fCB0aGlzLm92ZXJmbG93WCA9PT0gJ2hpZGRlbicpICYmICh0aGlzLmlzVlNjcm9sbGJhcnNDbGlwcGVkIHx8IHRoaXMub3ZlcmZsb3dZID09PSAnaGlkZGVuJykgJiYgIShzY3JvbGxiYXJXaWR0aHMudG9wIHx8IHNjcm9sbGJhcldpZHRocy5ib3R0b20gfHwgc2Nyb2xsYmFyV2lkdGhzLmxlZnQgfHwgc2Nyb2xsYmFyV2lkdGhzLnJpZ2h0KSk7CiAgfTsKCgogIC8qCiAgCUFjY291bnRzIGZvciAnY2xpcHBlZCcgc2Nyb2xsYmFycwogICAqLwoKICBDbGlwcGVkU2Nyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbGJhcldpZHRocyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHdpZHRoczsKICAgIHdpZHRocyA9IGdldFNjcm9sbGJhcldpZHRocyh0aGlzLnNjcm9sbEVsKTsKICAgIGlmICh0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIHdpZHRocy50b3AgPSAwOwogICAgICB3aWR0aHMuYm90dG9tID0gMDsKICAgIH0KICAgIGlmICh0aGlzLmlzVlNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIHdpZHRocy5sZWZ0ID0gMDsKICAgICAgd2lkdGhzLnJpZ2h0ID0gMDsKICAgIH0KICAgIHJldHVybiB3aWR0aHM7CiAgfTsKCiAgcmV0dXJuIENsaXBwZWRTY3JvbGxlcjsKCn0pKEVuaGFuY2VkU2Nyb2xsZXIpOwoKCi8qCkEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBjb250ZW50IHRoYXQgbGl2ZXMgd2l0aGluIGEgU2Nyb2xsZXIuCkNhbiBoYXZlICJndXR0ZXJzIiwgYXJlYXMgb2YgZGVhZCBzcGFjaW5nIGFyb3VuZCB0aGUgcGVyaW1ldGVyLgpBbHNvIHZlcnkgdXNlZnVsIGZvciBmb3JjaW5nIGEgd2lkdGgsIHdoaWNoIGEgU2Nyb2xsZXIgY2Fubm90IGRvIGFsb25lLgpIYXMgYSBjb250ZW50IGFyZWEgdGhhdCBsaXZlcyBhYm92ZSBhIGJhY2tncm91bmQgYXJlYS4KICovCgpTY3JvbGxlckNhbnZhcyA9IChmdW5jdGlvbigpIHsKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuZWwgPSBudWxsOwoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuY29udGVudEVsID0gbnVsbDsKCiAgU2Nyb2xsZXJDYW52YXMucHJvdG90eXBlLmJnRWwgPSBudWxsOwoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuZ3V0dGVycyA9IG51bGw7CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS53aWR0aCA9IG51bGw7CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS5taW5XaWR0aCA9IG51bGw7CgogIGZ1bmN0aW9uIFNjcm9sbGVyQ2FudmFzKCkgewogICAgdGhpcy5ndXR0ZXJzID0ge307CiAgfQoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsID0gJCgnPGRpdiBjbGFzcz0iZmMtc2Nyb2xsZXItY2FudmFzIj4gPGRpdiBjbGFzcz0iZmMtY29udGVudCI+PC9kaXY+IDxkaXYgY2xhc3M9ImZjLWJnIj48L2Rpdj4gPC9kaXY+Jyk7CiAgICB0aGlzLmNvbnRlbnRFbCA9IHRoaXMuZWwuZmluZCgnLmZjLWNvbnRlbnQnKTsKICAgIHJldHVybiB0aGlzLmJnRWwgPSB0aGlzLmVsLmZpbmQoJy5mYy1iZycpOwogIH07CgoKICAvKgogIAlJZiBmYWxzeSwgcmVzZXRzIGFsbCB0aGUgZ3V0dGVycyB0byAwCiAgICovCgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS5zZXRHdXR0ZXJzID0gZnVuY3Rpb24oZ3V0dGVycykgewogICAgaWYgKCFndXR0ZXJzKSB7CiAgICAgIHRoaXMuZ3V0dGVycyA9IHt9OwogICAgfSBlbHNlIHsKICAgICAgJC5leHRlbmQodGhpcy5ndXR0ZXJzLCBndXR0ZXJzKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnVwZGF0ZVNpemUoKTsKICB9OwoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbih3aWR0aDEpIHsKICAgIHRoaXMud2lkdGggPSB3aWR0aDE7CiAgICByZXR1cm4gdGhpcy51cGRhdGVTaXplKCk7CiAgfTsKCiAgU2Nyb2xsZXJDYW52YXMucHJvdG90eXBlLnNldE1pbldpZHRoID0gZnVuY3Rpb24obWluV2lkdGgxKSB7CiAgICB0aGlzLm1pbldpZHRoID0gbWluV2lkdGgxOwogICAgcmV0dXJuIHRoaXMudXBkYXRlU2l6ZSgpOwogIH07CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS5jbGVhcldpZHRoID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLndpZHRoID0gbnVsbDsKICAgIHRoaXMubWluV2lkdGggPSBudWxsOwogICAgcmV0dXJuIHRoaXMudXBkYXRlU2l6ZSgpOwogIH07CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZ3V0dGVyczsKICAgIGd1dHRlcnMgPSB0aGlzLmd1dHRlcnM7CiAgICB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1ndXR0ZXItbGVmdCcsIEJvb2xlYW4oZ3V0dGVycy5sZWZ0KSkudG9nZ2xlQ2xhc3MoJ2ZjLWd1dHRlci1yaWdodCcsIEJvb2xlYW4oZ3V0dGVycy5yaWdodCkpLnRvZ2dsZUNsYXNzKCdmYy1ndXR0ZXItdG9wJywgQm9vbGVhbihndXR0ZXJzLnRvcCkpLnRvZ2dsZUNsYXNzKCdmYy1ndXR0ZXItYm90dG9tJywgQm9vbGVhbihndXR0ZXJzLmJvdHRvbSkpLmNzcyh7CiAgICAgIHBhZGRpbmdMZWZ0OiBndXR0ZXJzLmxlZnQgfHwgJycsCiAgICAgIHBhZGRpbmdSaWdodDogZ3V0dGVycy5yaWdodCB8fCAnJywKICAgICAgcGFkZGluZ1RvcDogZ3V0dGVycy50b3AgfHwgJycsCiAgICAgIHBhZGRpbmdCb3R0b206IGd1dHRlcnMuYm90dG9tIHx8ICcnLAogICAgICB3aWR0aDogdGhpcy53aWR0aCAhPSBudWxsID8gdGhpcy53aWR0aCArIChndXR0ZXJzLmxlZnQgfHwgMCkgKyAoZ3V0dGVycy5yaWdodCB8fCAwKSA6ICcnLAogICAgICBtaW5XaWR0aDogdGhpcy5taW5XaWR0aCAhPSBudWxsID8gdGhpcy5taW5XaWR0aCArIChndXR0ZXJzLmxlZnQgfHwgMCkgKyAoZ3V0dGVycy5yaWdodCB8fCAwKSA6ICcnCiAgICB9KTsKICAgIHJldHVybiB0aGlzLmJnRWwuY3NzKHsKICAgICAgbGVmdDogZ3V0dGVycy5sZWZ0IHx8ICcnLAogICAgICByaWdodDogZ3V0dGVycy5yaWdodCB8fCAnJywKICAgICAgdG9wOiBndXR0ZXJzLnRvcCB8fCAnJywKICAgICAgYm90dG9tOiBndXR0ZXJzLmJvdHRvbSB8fCAnJwogICAgfSk7CiAgfTsKCiAgcmV0dXJuIFNjcm9sbGVyQ2FudmFzOwoKfSkoKTsKClNjcm9sbEpvaW5lciA9IChmdW5jdGlvbigpIHsKICBTY3JvbGxKb2luZXIucHJvdG90eXBlLmF4aXMgPSBudWxsOwoKICBTY3JvbGxKb2luZXIucHJvdG90eXBlLnNjcm9sbGVycyA9IG51bGw7CgogIFNjcm9sbEpvaW5lci5wcm90b3R5cGUubWFzdGVyU2Nyb2xsZXIgPSBudWxsOwoKICBmdW5jdGlvbiBTY3JvbGxKb2luZXIoYXhpcywgc2Nyb2xsZXJzKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHNjcm9sbGVyOwogICAgdGhpcy5heGlzID0gYXhpczsKICAgIHRoaXMuc2Nyb2xsZXJzID0gc2Nyb2xsZXJzOwogICAgcmVmID0gdGhpcy5zY3JvbGxlcnM7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgc2Nyb2xsZXIgPSByZWZbal07CiAgICAgIHRoaXMuaW5pdFNjcm9sbGVyKHNjcm9sbGVyKTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIFNjcm9sbEpvaW5lci5wcm90b3R5cGUuaW5pdFNjcm9sbGVyID0gZnVuY3Rpb24oc2Nyb2xsZXIpIHsKICAgIHNjcm9sbGVyLnNjcm9sbEVsLm9uKCd3aGVlbCBtb3VzZXdoZWVsIERvbU1vdXNlU2Nyb2xsIE1vek1vdXNlUGl4ZWxTY3JvbGwnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIF90aGlzLmFzc2lnbk1hc3RlclNjcm9sbGVyKHNjcm9sbGVyKTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICAgIHJldHVybiBzY3JvbGxlci5vbignc2Nyb2xsU3RhcnQnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghX3RoaXMubWFzdGVyU2Nyb2xsZXIpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5hc3NpZ25NYXN0ZXJTY3JvbGxlcihzY3JvbGxlcik7CiAgICAgICAgfQogICAgICB9OwogICAgfSkodGhpcykpLm9uKCdzY3JvbGwnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBqLCBsZW4sIG90aGVyU2Nyb2xsZXIsIHJlZiwgcmVzdWx0czsKICAgICAgICBpZiAoc2Nyb2xsZXIgPT09IF90aGlzLm1hc3RlclNjcm9sbGVyKSB7CiAgICAgICAgICByZWYgPSBfdGhpcy5zY3JvbGxlcnM7CiAgICAgICAgICByZXN1bHRzID0gW107CiAgICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgICAgb3RoZXJTY3JvbGxlciA9IHJlZltqXTsKICAgICAgICAgICAgaWYgKG90aGVyU2Nyb2xsZXIgIT09IHNjcm9sbGVyKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChfdGhpcy5heGlzKSB7CiAgICAgICAgICAgICAgICBjYXNlICdob3Jpem9udGFsJzoKICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKG90aGVyU2Nyb2xsZXIuc2V0TmF0aXZlU2Nyb2xsTGVmdChzY3JvbGxlci5nZXROYXRpdmVTY3JvbGxMZWZ0KCkpKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd2ZXJ0aWNhbCc6CiAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChvdGhlclNjcm9sbGVyLnNldFNjcm9sbFRvcChzY3JvbGxlci5nZXRTY3JvbGxUb3AoKSkpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXN1bHRzLnB1c2godm9pZCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfQogICAgICB9OwogICAgfSkodGhpcykpLm9uKCdzY3JvbGxFbmQnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChzY3JvbGxlciA9PT0gX3RoaXMubWFzdGVyU2Nyb2xsZXIpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy51bmFzc2lnbk1hc3RlclNjcm9sbGVyKCk7CiAgICAgICAgfQogICAgICB9OwogICAgfSkodGhpcykpOwogIH07CgogIFNjcm9sbEpvaW5lci5wcm90b3R5cGUuYXNzaWduTWFzdGVyU2Nyb2xsZXIgPSBmdW5jdGlvbihzY3JvbGxlcikgewogICAgdmFyIGosIGxlbiwgb3RoZXJTY3JvbGxlciwgcmVmOwogICAgdGhpcy51bmFzc2lnbk1hc3RlclNjcm9sbGVyKCk7CiAgICB0aGlzLm1hc3RlclNjcm9sbGVyID0gc2Nyb2xsZXI7CiAgICByZWYgPSB0aGlzLnNjcm9sbGVyczsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBvdGhlclNjcm9sbGVyID0gcmVmW2pdOwogICAgICBpZiAob3RoZXJTY3JvbGxlciAhPT0gc2Nyb2xsZXIpIHsKICAgICAgICBvdGhlclNjcm9sbGVyLmRpc2FibGVUb3VjaFNjcm9sbCgpOwogICAgICB9CiAgICB9CiAgfTsKCiAgU2Nyb2xsSm9pbmVyLnByb3RvdHlwZS51bmFzc2lnbk1hc3RlclNjcm9sbGVyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCBvdGhlclNjcm9sbGVyLCByZWY7CiAgICBpZiAodGhpcy5tYXN0ZXJTY3JvbGxlcikgewogICAgICByZWYgPSB0aGlzLnNjcm9sbGVyczsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgb3RoZXJTY3JvbGxlciA9IHJlZltqXTsKICAgICAgICBvdGhlclNjcm9sbGVyLmVuYWJsZVRvdWNoU2Nyb2xsKCk7CiAgICAgIH0KICAgICAgdGhpcy5tYXN0ZXJTY3JvbGxlciA9IG51bGw7CiAgICB9CiAgfTsKCiAgU2Nyb2xsSm9pbmVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhbGxXaWR0aHMsIGksIGosIGssIGxlbiwgbGVuMSwgbWF4Qm90dG9tLCBtYXhMZWZ0LCBtYXhSaWdodCwgbWF4VG9wLCByZWYsIHNjcm9sbGVyLCB3aWR0aHM7CiAgICBhbGxXaWR0aHMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0czsKICAgICAgcmVmID0gdGhpcy5zY3JvbGxlcnM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2Nyb2xsZXIgPSByZWZbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKHNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgICBtYXhMZWZ0ID0gbWF4UmlnaHQgPSBtYXhUb3AgPSBtYXhCb3R0b20gPSAwOwogICAgZm9yIChqID0gMCwgbGVuID0gYWxsV2lkdGhzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHdpZHRocyA9IGFsbFdpZHRoc1tqXTsKICAgICAgbWF4TGVmdCA9IE1hdGgubWF4KG1heExlZnQsIHdpZHRocy5sZWZ0KTsKICAgICAgbWF4UmlnaHQgPSBNYXRoLm1heChtYXhSaWdodCwgd2lkdGhzLnJpZ2h0KTsKICAgICAgbWF4VG9wID0gTWF0aC5tYXgobWF4VG9wLCB3aWR0aHMudG9wKTsKICAgICAgbWF4Qm90dG9tID0gTWF0aC5tYXgobWF4Qm90dG9tLCB3aWR0aHMuYm90dG9tKTsKICAgIH0KICAgIHJlZiA9IHRoaXMuc2Nyb2xsZXJzOwogICAgZm9yIChpID0gayA9IDAsIGxlbjEgPSByZWYubGVuZ3RoOyBrIDwgbGVuMTsgaSA9ICsraykgewogICAgICBzY3JvbGxlciA9IHJlZltpXTsKICAgICAgd2lkdGhzID0gYWxsV2lkdGhzW2ldOwogICAgICBzY3JvbGxlci5jYW52YXMuc2V0R3V0dGVycyh0aGlzLmF4aXMgPT09ICdob3Jpem9udGFsJyA/IHsKICAgICAgICBsZWZ0OiBtYXhMZWZ0IC0gd2lkdGhzLmxlZnQsCiAgICAgICAgcmlnaHQ6IG1heFJpZ2h0IC0gd2lkdGhzLnJpZ2h0CiAgICAgIH0gOiB7CiAgICAgICAgdG9wOiBtYXhUb3AgLSB3aWR0aHMudG9wLAogICAgICAgIGJvdHRvbTogbWF4Qm90dG9tIC0gd2lkdGhzLmJvdHRvbQogICAgICB9KTsKICAgIH0KICB9OwoKICByZXR1cm4gU2Nyb2xsSm9pbmVyOwoKfSkoKTsKClNjcm9sbEZvbGxvd2VyID0gKGZ1bmN0aW9uKCkgewogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5zY3JvbGxlciA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5zY3JvbGxiYXJXaWR0aHMgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuc3ByaXRlcyA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS52aWV3cG9ydFJlY3QgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuY29udGVudE9mZnNldCA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5pc0hGb2xsb3dpbmcgPSB0cnVlOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaXNWRm9sbG93aW5nID0gZmFsc2U7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5jb250YWluT25OYXR1cmFsTGVmdCA9IGZhbHNlOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuY29udGFpbk9uTmF0dXJhbFJpZ2h0ID0gZmFsc2U7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5taW5UcmF2ZWwgPSAwOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaXNUb3VjaCA9IGZhbHNlOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaXNGb3JjZWRSZWxhdGl2ZSA9IGZhbHNlOwoKICBmdW5jdGlvbiBTY3JvbGxGb2xsb3dlcihzY3JvbGxlciwgaXNUb3VjaCkgewogICAgdGhpcy5pc1RvdWNoID0gaXNUb3VjaDsKICAgIHRoaXMuc2Nyb2xsZXIgPSBzY3JvbGxlcjsKICAgIHRoaXMuc3ByaXRlcyA9IFtdOwogICAgaWYgKHRoaXMuaXNUb3VjaCkgewogICAgICB0aGlzLmlzRm9yY2VkUmVsYXRpdmUgPSB0cnVlOwogICAgfQogICAgc2Nyb2xsZXIub24oKHRoaXMuaXNUb3VjaCA/ICdzY3JvbGxFbmQnIDogJ3Njcm9sbCcpLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVTY3JvbGwoKTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICB9CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5zZXRTcHJpdGVzID0gZnVuY3Rpb24oc3ByaXRlcykgewogICAgdmFyIGosIGxlbiwgc3ByaXRlOwogICAgdGhpcy5jbGVhclNwcml0ZXMoKTsKICAgIGlmIChzcHJpdGVzIGluc3RhbmNlb2YgJCkgewogICAgICByZXR1cm4gdGhpcy5zcHJpdGVzID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgICAgcmVzdWx0cyA9IFtdOwogICAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHNwcml0ZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgIHNwcml0ZSA9IHNwcml0ZXNbal07CiAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IFNjcm9sbEZvbGxvd2VyU3ByaXRlKCQoc3ByaXRlKSwgdGhpcykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgfSkuY2FsbCh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHNwcml0ZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzcHJpdGUgPSBzcHJpdGVzW2pdOwogICAgICAgIHNwcml0ZS5mb2xsb3dlciA9IHRoaXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuc3ByaXRlcyA9IHNwcml0ZXM7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLmNsZWFyU3ByaXRlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGosIGxlbiwgcmVmLCBzcHJpdGU7CiAgICByZWYgPSB0aGlzLnNwcml0ZXM7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgc3ByaXRlID0gcmVmW2pdOwogICAgICBzcHJpdGUuY2xlYXIoKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnNwcml0ZXMgPSBbXTsKICB9OwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KCk7CiAgICByZXR1cm4gdGhpcy51cGRhdGVQb3NpdGlvbnMoKTsKICB9OwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuY2FjaGVEaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHNwcml0ZTsKICAgIHRoaXMudXBkYXRlVmlld3BvcnQoKTsKICAgIHRoaXMuc2Nyb2xsYmFyV2lkdGhzID0gdGhpcy5zY3JvbGxlci5nZXRTY3JvbGxiYXJXaWR0aHMoKTsKICAgIHRoaXMuY29udGVudE9mZnNldCA9IHRoaXMuc2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpOwogICAgcmVmID0gdGhpcy5zcHJpdGVzOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHNwcml0ZSA9IHJlZltqXTsKICAgICAgc3ByaXRlLmNhY2hlRGltZW5zaW9ucygpOwogICAgfQogIH07CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS51cGRhdGVWaWV3cG9ydCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxlZnQsIHNjcm9sbGVyLCB0b3A7CiAgICBzY3JvbGxlciA9IHRoaXMuc2Nyb2xsZXI7CiAgICBsZWZ0ID0gc2Nyb2xsZXIuZ2V0U2Nyb2xsRnJvbUxlZnQoKTsKICAgIHRvcCA9IHNjcm9sbGVyLmdldFNjcm9sbFRvcCgpOwogICAgcmV0dXJuIHRoaXMudmlld3BvcnRSZWN0ID0gewogICAgICBsZWZ0OiBsZWZ0LAogICAgICByaWdodDogbGVmdCArIHNjcm9sbGVyLmdldENsaWVudFdpZHRoKCksCiAgICAgIHRvcDogdG9wLAogICAgICBib3R0b206IHRvcCArIHNjcm9sbGVyLmdldENsaWVudEhlaWdodCgpCiAgICB9OwogIH07CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5mb3JjZVJlbGF0aXZlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHNwcml0ZTsKICAgIGlmICghdGhpcy5pc0ZvcmNlZFJlbGF0aXZlKSB7CiAgICAgIHRoaXMuaXNGb3JjZWRSZWxhdGl2ZSA9IHRydWU7CiAgICAgIHJlZiA9IHRoaXMuc3ByaXRlczsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzcHJpdGUgPSByZWZbal07CiAgICAgICAgaWYgKHNwcml0ZS5kb0Fic29sdXRlKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goc3ByaXRlLmFzc2lnblBvc2l0aW9uKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHRzLnB1c2godm9pZCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLmNsZWFyRm9yY2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0cywgc3ByaXRlOwogICAgaWYgKHRoaXMuaXNGb3JjZWRSZWxhdGl2ZSAmJiAhdGhpcy5pc1RvdWNoKSB7CiAgICAgIHRoaXMuaXNGb3JjZWRSZWxhdGl2ZSA9IGZhbHNlOwogICAgICByZWYgPSB0aGlzLnNwcml0ZXM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc3ByaXRlID0gcmVmW2pdOwogICAgICAgIHJlc3VsdHMucHVzaChzcHJpdGUuYXNzaWduUG9zaXRpb24oKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jYWNoZURpbWVuc2lvbnMoKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVBvc2l0aW9ucygpOwogIH07CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgc3ByaXRlOwogICAgcmVmID0gdGhpcy5zcHJpdGVzOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHNwcml0ZSA9IHJlZltqXTsKICAgICAgc3ByaXRlLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLmdldENvbnRlbnRSZWN0ID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBnZXRDb250ZW50UmVjdChlbCwgdGhpcy5jb250ZW50T2Zmc2V0KTsKICB9OwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuZ2V0Qm91bmRpbmdSZWN0ID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBnZXRPdXRlclJlY3QoZWwsIHRoaXMuY29udGVudE9mZnNldCk7CiAgfTsKCiAgcmV0dXJuIFNjcm9sbEZvbGxvd2VyOwoKfSkoKTsKClNjcm9sbEZvbGxvd2VyU3ByaXRlID0gKGZ1bmN0aW9uKCkgewogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5mb2xsb3dlciA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5lbCA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5hYnNvbHV0ZUVsID0gbnVsbDsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLm5hdHVyYWxSZWN0ID0gbnVsbDsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLnBhcmVudFJlY3QgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuY29udGFpbmVyUmVjdCA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5pc0VuYWJsZWQgPSB0cnVlOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuaXNIRm9sbG93aW5nID0gZmFsc2U7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5pc1ZGb2xsb3dpbmcgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmRvQWJzb2x1dGUgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmlzQWJzb2x1dGUgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmlzQ2VudGVyZWQgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLnJlY3QgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuaXNCbG9jayA9IGZhbHNlOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUubmF0dXJhbFdpZHRoID0gbnVsbDsKCiAgZnVuY3Rpb24gU2Nyb2xsRm9sbG93ZXJTcHJpdGUoZWwxLCBmb2xsb3dlcjEpIHsKICAgIHRoaXMuZWwgPSBlbDE7CiAgICB0aGlzLmZvbGxvd2VyID0gZm9sbG93ZXIxICE9IG51bGwgPyBmb2xsb3dlcjEgOiBudWxsOwogICAgdGhpcy5pc0Jsb2NrID0gdGhpcy5lbC5jc3MoJ2Rpc3BsYXknKSA9PT0gJ2Jsb2NrJzsKICAgIHRoaXMuZWwuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpOwogIH0KCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzRW5hYmxlZCkgewogICAgICB0aGlzLmlzRW5hYmxlZCA9IGZhbHNlOwogICAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTsKICAgICAgcmV0dXJuIHRoaXMudW5hYnNvbHV0aXplKCk7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkgewogICAgICB0aGlzLmlzRW5hYmxlZCA9IHRydWU7CiAgICAgIHJldHVybiB0aGlzLmFzc2lnblBvc2l0aW9uKCk7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmRpc2FibGUoKTsKICAgIHRoaXMuZm9sbG93ZXIgPSBudWxsOwogICAgcmV0dXJuIHRoaXMuYWJzb2x1dGVFbCA9IG51bGw7CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmNhY2hlRGltZW5zaW9ucyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNvbnRhaW5lclJlY3QsIGZvbGxvd2VyLCBpc0NlbnRlcmVkLCBpc0hGb2xsb3dpbmcsIGlzVkZvbGxvd2luZywgbWluVHJhdmVsLCBuYXR1cmFsUmVjdCwgcGFyZW50RWw7CiAgICBpc0hGb2xsb3dpbmcgPSBmYWxzZTsKICAgIGlzVkZvbGxvd2luZyA9IGZhbHNlOwogICAgaXNDZW50ZXJlZCA9IGZhbHNlOwogICAgdGhpcy5uYXR1cmFsV2lkdGggPSB0aGlzLmVsLndpZHRoKCk7CiAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTsKICAgIGZvbGxvd2VyID0gdGhpcy5mb2xsb3dlcjsKICAgIG5hdHVyYWxSZWN0ID0gdGhpcy5uYXR1cmFsUmVjdCA9IGZvbGxvd2VyLmdldEJvdW5kaW5nUmVjdCh0aGlzLmVsKTsKICAgIHBhcmVudEVsID0gdGhpcy5lbC5wYXJlbnQoKTsKICAgIHRoaXMucGFyZW50UmVjdCA9IGZvbGxvd2VyLmdldEJvdW5kaW5nUmVjdChwYXJlbnRFbCk7CiAgICBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXJSZWN0ID0gam9pblJlY3RzKGZvbGxvd2VyLmdldENvbnRlbnRSZWN0KHBhcmVudEVsKSwgbmF0dXJhbFJlY3QpOwogICAgbWluVHJhdmVsID0gZm9sbG93ZXIubWluVHJhdmVsOwogICAgaWYgKGZvbGxvd2VyLmNvbnRhaW5Pbk5hdHVyYWxMZWZ0KSB7CiAgICAgIGNvbnRhaW5lclJlY3QubGVmdCA9IG5hdHVyYWxSZWN0LmxlZnQ7CiAgICB9CiAgICBpZiAoZm9sbG93ZXIuY29udGFpbk9uTmF0dXJhbFJpZ2h0KSB7CiAgICAgIGNvbnRhaW5lclJlY3QucmlnaHQgPSBuYXR1cmFsUmVjdC5yaWdodDsKICAgIH0KICAgIGlmIChmb2xsb3dlci5pc0hGb2xsb3dpbmcpIHsKICAgICAgaWYgKGdldFJlY3RXaWR0aChjb250YWluZXJSZWN0KSAtIGdldFJlY3RXaWR0aChuYXR1cmFsUmVjdCkgPj0gbWluVHJhdmVsKSB7CiAgICAgICAgaXNDZW50ZXJlZCA9IHRoaXMuZWwuY3NzKCd0ZXh0LWFsaWduJykgPT09ICdjZW50ZXInOwogICAgICAgIGlzSEZvbGxvd2luZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb2xsb3dlci5pc1ZGb2xsb3dpbmcpIHsKICAgICAgaWYgKGdldFJlY3RIZWlnaHQoY29udGFpbmVyUmVjdCkgLSBnZXRSZWN0SGVpZ2h0KG5hdHVyYWxSZWN0KSA+PSBtaW5UcmF2ZWwpIHsKICAgICAgICBpc1ZGb2xsb3dpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICB0aGlzLmlzSEZvbGxvd2luZyA9IGlzSEZvbGxvd2luZzsKICAgIHRoaXMuaXNWRm9sbG93aW5nID0gaXNWRm9sbG93aW5nOwogICAgcmV0dXJuIHRoaXMuaXNDZW50ZXJlZCA9IGlzQ2VudGVyZWQ7CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvbXB1dGVQb3NpdGlvbigpOwogICAgcmV0dXJuIHRoaXMuYXNzaWduUG9zaXRpb24oKTsKICB9OwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUucmVzZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZWwuY3NzKHsKICAgICAgdG9wOiAnJywKICAgICAgbGVmdDogJycKICAgIH0pOwogIH07CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb24gPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb250YWluZXJSZWN0LCBkb0Fic29sdXRlLCBwYXJlbnRSZWN0LCByZWN0LCByZWN0V2lkdGgsIHN1YmplY3RSZWN0LCB2aWV3cG9ydFJlY3QsIHZpc2libGVQYXJlbnRSZWN0OwogICAgdmlld3BvcnRSZWN0ID0gdGhpcy5mb2xsb3dlci52aWV3cG9ydFJlY3Q7CiAgICBwYXJlbnRSZWN0ID0gdGhpcy5wYXJlbnRSZWN0OwogICAgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyUmVjdDsKICAgIHZpc2libGVQYXJlbnRSZWN0ID0gaW50ZXJzZWN0UmVjdHModmlld3BvcnRSZWN0LCBwYXJlbnRSZWN0KTsKICAgIHJlY3QgPSBudWxsOwogICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgaWYgKHZpc2libGVQYXJlbnRSZWN0KSB7CiAgICAgIHJlY3QgPSBjb3B5UmVjdCh0aGlzLm5hdHVyYWxSZWN0KTsKICAgICAgc3ViamVjdFJlY3QgPSBpbnRlcnNlY3RSZWN0cyhyZWN0LCBwYXJlbnRSZWN0KTsKICAgICAgaWYgKCh0aGlzLmlzQ2VudGVyZWQgJiYgIXRlc3RSZWN0Q29udGFpbnModmlld3BvcnRSZWN0LCBwYXJlbnRSZWN0KSkgfHwgKHN1YmplY3RSZWN0ICYmICF0ZXN0UmVjdENvbnRhaW5zKHZpZXdwb3J0UmVjdCwgc3ViamVjdFJlY3QpKSkgewogICAgICAgIGRvQWJzb2x1dGUgPSB0cnVlOwogICAgICAgIGlmICh0aGlzLmlzSEZvbGxvd2luZykgewogICAgICAgICAgaWYgKHRoaXMuaXNDZW50ZXJlZCkgewogICAgICAgICAgICByZWN0V2lkdGggPSBnZXRSZWN0V2lkdGgocmVjdCk7CiAgICAgICAgICAgIHJlY3QubGVmdCA9ICh2aXNpYmxlUGFyZW50UmVjdC5sZWZ0ICsgdmlzaWJsZVBhcmVudFJlY3QucmlnaHQpIC8gMiAtIHJlY3RXaWR0aCAvIDI7CiAgICAgICAgICAgIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyByZWN0V2lkdGg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIWhDb250YWluUmVjdChyZWN0LCB2aWV3cG9ydFJlY3QpKSB7CiAgICAgICAgICAgICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaENvbnRhaW5SZWN0KHJlY3QsIGNvbnRhaW5lclJlY3QpKSB7CiAgICAgICAgICAgIGRvQWJzb2x1dGUgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNWRm9sbG93aW5nKSB7CiAgICAgICAgICBpZiAoIXZDb250YWluUmVjdChyZWN0LCB2aWV3cG9ydFJlY3QpKSB7CiAgICAgICAgICAgIGRvQWJzb2x1dGUgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2Q29udGFpblJlY3QocmVjdCwgY29udGFpbmVyUmVjdCkpIHsKICAgICAgICAgICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXRlc3RSZWN0Q29udGFpbnModmlld3BvcnRSZWN0LCByZWN0KSkgewogICAgICAgICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5yZWN0ID0gcmVjdDsKICAgIHJldHVybiB0aGlzLmRvQWJzb2x1dGUgPSBkb0Fic29sdXRlOwogIH07CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5hc3NpZ25Qb3NpdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxlZnQsIHRvcDsKICAgIGlmICh0aGlzLmlzRW5hYmxlZCkgewogICAgICBpZiAoIXRoaXMucmVjdCkgewogICAgICAgIHJldHVybiB0aGlzLnVuYWJzb2x1dGl6ZSgpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuZG9BYnNvbHV0ZSAmJiAhdGhpcy5mb2xsb3dlci5pc0ZvcmNlZFJlbGF0aXZlKSB7CiAgICAgICAgdGhpcy5hYnNvbHV0aXplKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuYWJzb2x1dGVFbC5jc3MoewogICAgICAgICAgdG9wOiB0aGlzLnJlY3QudG9wIC0gdGhpcy5mb2xsb3dlci52aWV3cG9ydFJlY3QudG9wICsgdGhpcy5mb2xsb3dlci5zY3JvbGxiYXJXaWR0aHMudG9wLAogICAgICAgICAgbGVmdDogdGhpcy5yZWN0LmxlZnQgLSB0aGlzLmZvbGxvd2VyLnZpZXdwb3J0UmVjdC5sZWZ0ICsgdGhpcy5mb2xsb3dlci5zY3JvbGxiYXJXaWR0aHMubGVmdCwKICAgICAgICAgIHdpZHRoOiB0aGlzLmlzQmxvY2sgPyB0aGlzLm5hdHVyYWxXaWR0aCA6ICcnCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9wID0gdGhpcy5yZWN0LnRvcCAtIHRoaXMubmF0dXJhbFJlY3QudG9wOwogICAgICAgIGxlZnQgPSB0aGlzLnJlY3QubGVmdCAtIHRoaXMubmF0dXJhbFJlY3QubGVmdDsKICAgICAgICB0aGlzLnVuYWJzb2x1dGl6ZSgpOwogICAgICAgIHJldHVybiB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1mb2xsb3dpbmcnLCBCb29sZWFuKHRvcCB8fCBsZWZ0KSkuY3NzKHsKICAgICAgICAgIHRvcDogdG9wLAogICAgICAgICAgbGVmdDogbGVmdAogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmFic29sdXRpemUgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5pc0Fic29sdXRlKSB7CiAgICAgIGlmICghdGhpcy5hYnNvbHV0ZUVsKSB7CiAgICAgICAgdGhpcy5hYnNvbHV0ZUVsID0gdGhpcy5idWlsZEFic29sdXRlRWwoKTsKICAgICAgfQogICAgICB0aGlzLmFic29sdXRlRWwuYXBwZW5kVG8odGhpcy5mb2xsb3dlci5zY3JvbGxlci5lbCk7CiAgICAgIHRoaXMuZWwuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpOwogICAgICByZXR1cm4gdGhpcy5pc0Fic29sdXRlID0gdHJ1ZTsKICAgIH0KICB9OwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUudW5hYnNvbHV0aXplID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5pc0Fic29sdXRlKSB7CiAgICAgIHRoaXMuYWJzb2x1dGVFbC5kZXRhY2goKTsKICAgICAgdGhpcy5lbC5jc3MoJ3Zpc2liaWxpdHknLCAnJyk7CiAgICAgIHJldHVybiB0aGlzLmlzQWJzb2x1dGUgPSBmYWxzZTsKICAgIH0KICB9OwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuYnVpbGRBYnNvbHV0ZUVsID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lbC5jbG9uZSgpLmFkZENsYXNzKCdmYy1mb2xsb3dpbmcnKS5jc3MoewogICAgICAncG9zaXRpb24nOiAnYWJzb2x1dGUnLAogICAgICAnei1pbmRleCc6IDEwMDAsCiAgICAgICdmb250LXdlaWdodCc6IHRoaXMuZWwuY3NzKCdmb250LXdlaWdodCcpLAogICAgICAnZm9udC1zaXplJzogdGhpcy5lbC5jc3MoJ2ZvbnQtc2l6ZScpLAogICAgICAnZm9udC1mYW1pbHknOiB0aGlzLmVsLmNzcygnZm9udC1mYW1pbHknKSwKICAgICAgJ2NvbG9yJzogdGhpcy5lbC5jc3MoJ2NvbG9yJyksCiAgICAgICdwYWRkaW5nLXRvcCc6IHRoaXMuZWwuY3NzKCdwYWRkaW5nLXRvcCcpLAogICAgICAncGFkZGluZy1ib3R0b20nOiB0aGlzLmVsLmNzcygncGFkZGluZy1ib3R0b20nKSwKICAgICAgJ3BhZGRpbmctbGVmdCc6IHRoaXMuZWwuY3NzKCdwYWRkaW5nLWxlZnQnKSwKICAgICAgJ3BhZGRpbmctcmlnaHQnOiB0aGlzLmVsLmNzcygncGFkZGluZy1yaWdodCcpLAogICAgICAncG9pbnRlci1ldmVudHMnOiAnbm9uZScKICAgIH0pOwogIH07CgogIHJldHVybiBTY3JvbGxGb2xsb3dlclNwcml0ZTsKCn0pKCk7Cgpjb3B5UmVjdCA9IGZ1bmN0aW9uKHJlY3QpIHsKICByZXR1cm4gewogICAgbGVmdDogcmVjdC5sZWZ0LAogICAgcmlnaHQ6IHJlY3QucmlnaHQsCiAgICB0b3A6IHJlY3QudG9wLAogICAgYm90dG9tOiByZWN0LmJvdHRvbQogIH07Cn07CgpnZXRSZWN0V2lkdGggPSBmdW5jdGlvbihyZWN0KSB7CiAgcmV0dXJuIHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7Cn07CgpnZXRSZWN0SGVpZ2h0ID0gZnVuY3Rpb24ocmVjdCkgewogIHJldHVybiByZWN0LmJvdHRvbSAtIHJlY3QudG9wOwp9OwoKdGVzdFJlY3RDb250YWlucyA9IGZ1bmN0aW9uKHJlY3QsIGlubmVyUmVjdCkgewogIHJldHVybiB0ZXN0UmVjdEhDb250YWlucyhyZWN0LCBpbm5lclJlY3QpICYmIHRlc3RSZWN0VkNvbnRhaW5zKHJlY3QsIGlubmVyUmVjdCk7Cn07Cgp0ZXN0UmVjdEhDb250YWlucyA9IGZ1bmN0aW9uKHJlY3QsIGlubmVyUmVjdCkgewogIHJldHVybiBpbm5lclJlY3QubGVmdCA+PSByZWN0LmxlZnQgJiYgaW5uZXJSZWN0LnJpZ2h0IDw9IHJlY3QucmlnaHQ7Cn07Cgp0ZXN0UmVjdFZDb250YWlucyA9IGZ1bmN0aW9uKHJlY3QsIGlubmVyUmVjdCkgewogIHJldHVybiBpbm5lclJlY3QudG9wID49IHJlY3QudG9wICYmIGlubmVyUmVjdC5ib3R0b20gPD0gcmVjdC5ib3R0b207Cn07CgpoQ29udGFpblJlY3QgPSBmdW5jdGlvbihyZWN0LCBvdXRlclJlY3QpIHsKICBpZiAocmVjdC5sZWZ0IDwgb3V0ZXJSZWN0LmxlZnQpIHsKICAgIHJlY3QucmlnaHQgPSBvdXRlclJlY3QubGVmdCArIGdldFJlY3RXaWR0aChyZWN0KTsKICAgIHJlY3QubGVmdCA9IG91dGVyUmVjdC5sZWZ0OwogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIGlmIChyZWN0LnJpZ2h0ID4gb3V0ZXJSZWN0LnJpZ2h0KSB7CiAgICByZWN0LmxlZnQgPSBvdXRlclJlY3QucmlnaHQgLSBnZXRSZWN0V2lkdGgocmVjdCk7CiAgICByZWN0LnJpZ2h0ID0gb3V0ZXJSZWN0LnJpZ2h0OwogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn07Cgp2Q29udGFpblJlY3QgPSBmdW5jdGlvbihyZWN0LCBvdXRlclJlY3QpIHsKICBpZiAocmVjdC50b3AgPCBvdXRlclJlY3QudG9wKSB7CiAgICByZWN0LmJvdHRvbSA9IG91dGVyUmVjdC50b3AgKyBnZXRSZWN0SGVpZ2h0KHJlY3QpOwogICAgcmVjdC50b3AgPSBvdXRlclJlY3QudG9wOwogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IG91dGVyUmVjdC5ib3R0b20pIHsKICAgIHJlY3QudG9wID0gb3V0ZXJSZWN0LmJvdHRvbSAtIGdldFJlY3RIZWlnaHQocmVjdCk7CiAgICByZWN0LmJvdHRvbSA9IG91dGVyUmVjdC5ib3R0b207CiAgICByZXR1cm4gdHJ1ZTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfTsKCmpvaW5SZWN0cyA9IGZ1bmN0aW9uKHJlY3QxLCByZWN0MikgewogIHJldHVybiB7CiAgICBsZWZ0OiBNYXRoLm1pbihyZWN0MS5sZWZ0LCByZWN0Mi5sZWZ0KSwKICAgIHJpZ2h0OiBNYXRoLm1heChyZWN0MS5yaWdodCwgcmVjdDIucmlnaHQpLAogICAgdG9wOiBNYXRoLm1pbihyZWN0MS50b3AsIHJlY3QyLnRvcCksCiAgICBib3R0b206IE1hdGgubWF4KHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKQogIH07Cn07CgpDYWxlbmRhckV4dGVuc2lvbiA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKENhbGVuZGFyRXh0ZW5zaW9uLCBzdXBlckNsYXNzKTsKCiAgZnVuY3Rpb24gQ2FsZW5kYXJFeHRlbnNpb24oKSB7CiAgICByZXR1cm4gQ2FsZW5kYXJFeHRlbnNpb24uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUucmVzb3VyY2VNYW5hZ2VyID0gbnVsbDsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnJlc291cmNlTWFuYWdlciA9IG5ldyBSZXNvdXJjZU1hbmFnZXIodGhpcyk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmluc3RhbnRpYXRlVmlldyA9IGZ1bmN0aW9uKHZpZXdUeXBlKSB7CiAgICB2YXIgc3BlYywgdmlld0NsYXNzOwogICAgc3BlYyA9IHRoaXMuZ2V0Vmlld1NwZWModmlld1R5cGUpOwogICAgdmlld0NsYXNzID0gc3BlY1snY2xhc3MnXTsKICAgIGlmICh0aGlzLm9wdGlvbnMucmVzb3VyY2VzICYmIHNwZWMub3B0aW9ucy5yZXNvdXJjZXMgIT09IGZhbHNlKSB7CiAgICAgIGlmIChzcGVjLnF1ZXJ5UmVzb3VyY2VDbGFzcykgewogICAgICAgIHZpZXdDbGFzcyA9IHNwZWMucXVlcnlSZXNvdXJjZUNsYXNzKHNwZWMpIHx8IHZpZXdDbGFzczsKICAgICAgfSBlbHNlIGlmIChzcGVjLnJlc291cmNlQ2xhc3MpIHsKICAgICAgICB2aWV3Q2xhc3MgPSBzcGVjLnJlc291cmNlQ2xhc3M7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgdmlld0NsYXNzKHRoaXMsIHZpZXdUeXBlLCBzcGVjLm9wdGlvbnMsIHNwZWMuZHVyYXRpb24pOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmFkZFJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2VJbnB1dCwgc2Nyb2xsKSB7CiAgICB2YXIgcHJvbWlzZTsKICAgIGlmIChzY3JvbGwgPT0gbnVsbCkgewogICAgICBzY3JvbGwgPSBmYWxzZTsKICAgIH0KICAgIHByb21pc2UgPSB0aGlzLnJlc291cmNlTWFuYWdlci5hZGRSZXNvdXJjZShyZXNvdXJjZUlucHV0KTsKICAgIGlmIChzY3JvbGwgJiYgdGhpcy52aWV3LnNjcm9sbFRvUmVzb3VyY2UpIHsKICAgICAgcHJvbWlzZS5kb25lKChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZSkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnZpZXcuc2Nyb2xsVG9SZXNvdXJjZShyZXNvdXJjZSk7CiAgICAgICAgfTsKICAgICAgfSkodGhpcykpOwogICAgfQogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZSA9IGZ1bmN0aW9uKGlkT3JSZXNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMucmVzb3VyY2VNYW5hZ2VyLnJlbW92ZVJlc291cmNlKGlkT3JSZXNvdXJjZSk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLnJlZmV0Y2hSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVzb3VyY2VNYW5hZ2VyLmZldGNoUmVzb3VyY2VzKCk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLnJlcmVuZGVyUmVzb3VyY2VzID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlc291cmNlTWFuYWdlci5yZXNldFJlc291cmNlcygpOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5pc1NwYW5BbGxvd2VkID0gZnVuY3Rpb24oc3BhbiwgY29uc3RyYWludCkgewogICAgdmFyIGNvbnN0cmFpblRvUmVzb3VyY2VJZHMsIHJlZjsKICAgIGlmICh0eXBlb2YgY29uc3RyYWludCA9PT0gJ29iamVjdCcpIHsKICAgICAgY29uc3RyYWluVG9SZXNvdXJjZUlkcyA9IHRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhjb25zdHJhaW50KTsKICAgICAgaWYgKGNvbnN0cmFpblRvUmVzb3VyY2VJZHMubGVuZ3RoICYmICghc3Bhbi5yZXNvdXJjZUlkIHx8ICEocmVmID0gc3Bhbi5yZXNvdXJjZUlkLCBpbmRleE9mLmNhbGwoY29uc3RyYWluVG9SZXNvdXJjZUlkcywgcmVmKSA+PSAwKSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBDYWxlbmRhckV4dGVuc2lvbi5fX3N1cGVyX18uaXNTcGFuQWxsb3dlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRQZWVyRXZlbnRzID0gZnVuY3Rpb24oc3BhbiwgZXZlbnQpIHsKICAgIHZhciBmaWx0ZXJlZFBlZXJFdmVudHMsIGlzUGVlciwgaiwgaywgbCwgbGVuLCBsZW4xLCBsZW4yLCBuZXdSZXNvdXJjZUlkLCBuZXdSZXNvdXJjZUlkcywgcGVlckV2ZW50LCBwZWVyRXZlbnRzLCBwZWVyUmVzb3VyY2VJZCwgcGVlclJlc291cmNlSWRzOwogICAgcGVlckV2ZW50cyA9IENhbGVuZGFyRXh0ZW5zaW9uLl9fc3VwZXJfXy5nZXRQZWVyRXZlbnRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBuZXdSZXNvdXJjZUlkcyA9IHNwYW4ucmVzb3VyY2VJZCA/IFtzcGFuLnJlc291cmNlSWRdIDogZXZlbnQgPyB0aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZXZlbnQpIDogW107CiAgICBmaWx0ZXJlZFBlZXJFdmVudHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHBlZXJFdmVudHMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcGVlckV2ZW50ID0gcGVlckV2ZW50c1tqXTsKICAgICAgaXNQZWVyID0gZmFsc2U7CiAgICAgIHBlZXJSZXNvdXJjZUlkcyA9IHRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhwZWVyRXZlbnQpOwogICAgICBpZiAoIXBlZXJSZXNvdXJjZUlkcy5sZW5ndGggfHwgIW5ld1Jlc291cmNlSWRzLmxlbmd0aCkgewogICAgICAgIGlzUGVlciA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHBlZXJSZXNvdXJjZUlkcy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICAgIHBlZXJSZXNvdXJjZUlkID0gcGVlclJlc291cmNlSWRzW2tdOwogICAgICAgICAgZm9yIChsID0gMCwgbGVuMiA9IG5ld1Jlc291cmNlSWRzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICAgICAgICBuZXdSZXNvdXJjZUlkID0gbmV3UmVzb3VyY2VJZHNbbF07CiAgICAgICAgICAgIGlmIChuZXdSZXNvdXJjZUlkID09PSBwZWVyUmVzb3VyY2VJZCkgewogICAgICAgICAgICAgIGlzUGVlciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzUGVlcikgewogICAgICAgIGZpbHRlcmVkUGVlckV2ZW50cy5wdXNoKHBlZXJFdmVudCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaWx0ZXJlZFBlZXJFdmVudHM7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW4gPSBmdW5jdGlvbihvdXRlclNwYW4sIGlubmVyU3BhbikgewogICAgaWYgKG91dGVyU3Bhbi5yZXNvdXJjZUlkICYmIG91dGVyU3Bhbi5yZXNvdXJjZUlkICE9PSBpbm5lclNwYW4ucmVzb3VyY2VJZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gQ2FsZW5kYXJFeHRlbnNpb24uX19zdXBlcl9fLnNwYW5Db250YWluc1NwYW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0KICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cyA9IGZ1bmN0aW9uKHdob2xlRGF5KSB7CiAgICB2YXIgYWxsRXZlbnRzLCBhbnlDdXN0b21CdXNpbmVzc0hvdXJzLCBldmVudCwgZXZlbnRzLCBmbGF0UmVzb3VyY2VzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIHJlc291cmNlOwogICAgZmxhdFJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VNYW5hZ2VyLmdldEZsYXRSZXNvdXJjZXMoKTsKICAgIGFueUN1c3RvbUJ1c2luZXNzSG91cnMgPSBmYWxzZTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IGZsYXRSZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSBmbGF0UmVzb3VyY2VzW2pdOwogICAgICBpZiAocmVzb3VyY2UuYnVzaW5lc3NIb3VycykgewogICAgICAgIGFueUN1c3RvbUJ1c2luZXNzSG91cnMgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoYW55Q3VzdG9tQnVzaW5lc3NIb3VycykgewogICAgICBhbGxFdmVudHMgPSBbXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IGZsYXRSZXNvdXJjZXMubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgICAgcmVzb3VyY2UgPSBmbGF0UmVzb3VyY2VzW2tdOwogICAgICAgIGV2ZW50cyA9IHRoaXMuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyh3aG9sZURheSwgcmVzb3VyY2UuYnVzaW5lc3NIb3VycyB8fCB0aGlzLm9wdGlvbnMuYnVzaW5lc3NIb3Vycyk7CiAgICAgICAgZm9yIChsID0gMCwgbGVuMiA9IGV2ZW50cy5sZW5ndGg7IGwgPCBsZW4yOyBsKyspIHsKICAgICAgICAgIGV2ZW50ID0gZXZlbnRzW2xdOwogICAgICAgICAgZXZlbnQucmVzb3VyY2VJZCA9IHJlc291cmNlLmlkOwogICAgICAgICAgYWxsRXZlbnRzLnB1c2goZXZlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYWxsRXZlbnRzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIENhbGVuZGFyRXh0ZW5zaW9uLl9fc3VwZXJfXy5nZXRDdXJyZW50QnVzaW5lc3NIb3VyRXZlbnRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmJ1aWxkU2VsZWN0U3BhbiA9IGZ1bmN0aW9uKHN0YXJ0SW5wdXQsIGVuZElucHV0LCByZXNvdXJjZUlkKSB7CiAgICB2YXIgc3BhbjsKICAgIHNwYW4gPSBDYWxlbmRhckV4dGVuc2lvbi5fX3N1cGVyX18uYnVpbGRTZWxlY3RTcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICBzcGFuLnJlc291cmNlSWQgPSByZXNvdXJjZUlkOwogICAgfQogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmdldFJlc291cmNlQnlJZCA9IGZ1bmN0aW9uKGlkKSB7CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VCeUlkKGlkKTsKICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUubm9ybWFsaXplRXZlbnQgPSBmdW5jdGlvbihldmVudCkgewogICAgQ2FsZW5kYXJFeHRlbnNpb24uX19zdXBlcl9fLm5vcm1hbGl6ZUV2ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoZXZlbnQucmVzb3VyY2VJZCA9PSBudWxsKSB7CiAgICAgIGV2ZW50LnJlc291cmNlSWQgPSBudWxsOwogICAgfQogICAgcmV0dXJuIGV2ZW50LnJlc291cmNlSWRzICE9IG51bGwgPyBldmVudC5yZXNvdXJjZUlkcyA6IGV2ZW50LnJlc291cmNlSWRzID0gbnVsbDsKICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZUlkID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgIHJldHVybiB0aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZXZlbnQpWzBdOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlSWRzID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgIHZhciBqLCBsZW4sIG5vcm1hbFJlc291cmNlSWQsIG5vcm1hbFJlc291cmNlSWRzLCByZWYsIHJlZjEsIHJlZjIsIHJlc291cmNlSWQ7CiAgICByZXNvdXJjZUlkID0gU3RyaW5nKChyZWYgPSAocmVmMSA9IGV2ZW50W3RoaXMuZ2V0RXZlbnRSZXNvdXJjZUZpZWxkKCldKSAhPSBudWxsID8gcmVmMSA6IGV2ZW50LnJlc291cmNlSWQpICE9IG51bGwgPyByZWYgOiAnJyk7CiAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICByZXR1cm4gW3Jlc291cmNlSWRdOwogICAgfSBlbHNlIGlmIChldmVudC5yZXNvdXJjZUlkcykgewogICAgICBub3JtYWxSZXNvdXJjZUlkcyA9IFtdOwogICAgICByZWYyID0gZXZlbnQucmVzb3VyY2VJZHM7CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZjIubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByZXNvdXJjZUlkID0gcmVmMltqXTsKICAgICAgICBub3JtYWxSZXNvdXJjZUlkID0gU3RyaW5nKHJlc291cmNlSWQgIT0gbnVsbCA/IHJlc291cmNlSWQgOiAnJyk7CiAgICAgICAgaWYgKG5vcm1hbFJlc291cmNlSWQpIHsKICAgICAgICAgIG5vcm1hbFJlc291cmNlSWRzLnB1c2gobm9ybWFsUmVzb3VyY2VJZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBub3JtYWxSZXNvdXJjZUlkczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuc2V0RXZlbnRSZXNvdXJjZUlkID0gZnVuY3Rpb24oZXZlbnQsIHJlc291cmNlSWQpIHsKICAgIHJldHVybiBldmVudFt0aGlzLmdldEV2ZW50UmVzb3VyY2VGaWVsZCgpXSA9IFN0cmluZyhyZXNvdXJjZUlkICE9IG51bGwgPyByZXNvdXJjZUlkIDogJycpOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlRmllbGQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm9wdGlvbnNbJ2V2ZW50UmVzb3VyY2VGaWVsZCddIHx8ICdyZXNvdXJjZUlkJzsKICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuZ2V0UmVzb3VyY2VFdmVudHMgPSBmdW5jdGlvbihpZE9yUmVzb3VyY2UpIHsKICAgIHZhciByZXNvdXJjZTsKICAgIHJlc291cmNlID0gdHlwZW9mIGlkT3JSZXNvdXJjZSA9PT0gJ29iamVjdCcgPyBpZE9yUmVzb3VyY2UgOiB0aGlzLmdldFJlc291cmNlQnlJZChpZE9yUmVzb3VyY2UpOwogICAgaWYgKHJlc291cmNlKSB7CiAgICAgIHJldHVybiB0aGlzLmNsaWVudEV2ZW50cygoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgIHJldHVybiAkLmluQXJyYXkocmVzb3VyY2UuaWQsIF90aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZXZlbnQpKSAhPT0gLTE7CiAgICAgICAgfTsKICAgICAgfSkodGhpcykpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlID0gZnVuY3Rpb24oaWRPckV2ZW50KSB7CiAgICByZXR1cm4gdGhpcy5nZXRFdmVudFJlc291cmNlcyhpZE9yRXZlbnQpWzBdOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlcyA9IGZ1bmN0aW9uKGlkT3JFdmVudCkgewogICAgdmFyIGV2ZW50LCBqLCBsZW4sIHJlZiwgcmVzb3VyY2UsIHJlc291cmNlSWQsIHJlc291cmNlczsKICAgIGV2ZW50ID0gdHlwZW9mIGlkT3JFdmVudCA9PT0gJ29iamVjdCcgPyBpZE9yRXZlbnQgOiB0aGlzLmNsaWVudEV2ZW50cyhpZE9yRXZlbnQpWzBdOwogICAgcmVzb3VyY2VzID0gW107CiAgICBpZiAoZXZlbnQpIHsKICAgICAgcmVmID0gdGhpcy5nZXRFdmVudFJlc291cmNlSWRzKGV2ZW50KTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgcmVzb3VyY2VJZCA9IHJlZltqXTsKICAgICAgICByZXNvdXJjZSA9IHRoaXMuZ2V0UmVzb3VyY2VCeUlkKHJlc291cmNlSWQpOwogICAgICAgIGlmIChyZXNvdXJjZSkgewogICAgICAgICAgcmVzb3VyY2VzLnB1c2gocmVzb3VyY2UpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc291cmNlczsKICB9OwoKICByZXR1cm4gQ2FsZW5kYXJFeHRlbnNpb247Cgp9KShDYWxlbmRhcik7CgpDYWxlbmRhci5wcm90b3R5cGUgPSBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGU7CgpvcmlnRGlzcGxheVZpZXcgPSBWaWV3LnByb3RvdHlwZS5kaXNwbGF5VmlldzsKCm9yaWdSZW5kZXJTa2VsZXRvbiA9IFZpZXcucHJvdG90eXBlLnJlbmRlclNrZWxldG9uOwoKb3JpZ1VucmVuZGVyU2tlbGV0b24gPSBWaWV3LnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uOwoKb3JpZ0Rpc3BsYXlFdmVudHMgPSBWaWV3LnByb3RvdHlwZS5kaXNwbGF5RXZlbnRzOwoKVmlldy5wcm90b3R5cGUuaXNSZXNvdXJjZXNCb3VuZCA9IGZhbHNlOwoKVmlldy5wcm90b3R5cGUuc2V0dGluZ1Jlc291cmNlcyA9IG51bGw7CgpWaWV3LnByb3RvdHlwZS5kaXNwbGF5VmlldyA9IGZ1bmN0aW9uKCkgewogIG9yaWdEaXNwbGF5Vmlldy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIHByb2Nlc3NMaWNlbnNlS2V5KHRoaXMuY2FsZW5kYXIub3B0aW9ucy5zY2hlZHVsZXJMaWNlbnNlS2V5LCB0aGlzLmVsKTsKICB0aGlzLmJpbmRSZXNvdXJjZXMoKTsKICByZXR1cm4gdGhpcy53aGVuUmVzb3VyY2VzKCk7Cn07CgpWaWV3LnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uID0gZnVuY3Rpb24oKSB7CiAgb3JpZ1VucmVuZGVyU2tlbGV0b24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICByZXR1cm4gdGhpcy51bmJpbmRSZXNvdXJjZXModHJ1ZSk7Cn07CgpWaWV3LnByb3RvdHlwZS5kaXNwbGF5RXZlbnRzID0gZnVuY3Rpb24oZXZlbnRzKSB7CiAgcmV0dXJuIHRoaXMud2hlblJlc291cmNlcygoZnVuY3Rpb24oX3RoaXMpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIG9yaWdEaXNwbGF5RXZlbnRzLmNhbGwoX3RoaXMsIGV2ZW50cyk7CiAgICB9OwogIH0pKHRoaXMpKTsKfTsKClZpZXcucHJvdG90eXBlLmJpbmRSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHsKICB2YXIgc2V0UmVzb3VyY2VzOwogIGlmICghdGhpcy5pc1Jlc291cmNlc0JvdW5kKSB7CiAgICB0aGlzLmlzUmVzb3VyY2VzQm91bmQgPSB0cnVlOwogICAgdGhpcy5zZXR0aW5nUmVzb3VyY2VzID0gJC5EZWZlcnJlZCgpOwogICAgc2V0UmVzb3VyY2VzID0gKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICAgICAgICBfdGhpcy5zZXRSZXNvdXJjZXMocmVzb3VyY2VzKTsKICAgICAgICByZXR1cm4gX3RoaXMuc2V0dGluZ1Jlc291cmNlcy5yZXNvbHZlKCk7CiAgICAgIH07CiAgICB9KSh0aGlzKTsKICAgIHRoaXMubGlzdGVuVG8odGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIsIHsKICAgICAgc2V0OiBzZXRSZXNvdXJjZXMsCiAgICAgIHVuc2V0OiB0aGlzLnVuc2V0UmVzb3VyY2VzLAogICAgICByZXNldDogdGhpcy5yZXNldFJlc291cmNlcywKICAgICAgYWRkOiB0aGlzLmFkZFJlc291cmNlLAogICAgICByZW1vdmU6IHRoaXMucmVtb3ZlUmVzb3VyY2UKICAgIH0pOwogICAgaWYgKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLmhhc0ZldGNoZWQoKSkgewogICAgICByZXR1cm4gc2V0UmVzb3VyY2VzKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci5nZXRSZXNvdXJjZXMoKTsKICAgIH0KICB9Cn07CgpWaWV3LnByb3RvdHlwZS51bmJpbmRSZXNvdXJjZXMgPSBmdW5jdGlvbihpc0Rlc3Ryb3lpbmcpIHsKICBpZiAodGhpcy5pc1Jlc291cmNlc0JvdW5kKSB7CiAgICB0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlcik7CiAgICBpZiAodGhpcy5zZXR0aW5nUmVzb3VyY2VzLnN0YXRlKCkgPT09ICdyZXNvbHZlZCcpIHsKICAgICAgdGhpcy51bnNldFJlc291cmNlcyhpc0Rlc3Ryb3lpbmcpOwogICAgfQogICAgdGhpcy5zZXR0aW5nUmVzb3VyY2VzID0gbnVsbDsKICAgIHJldHVybiB0aGlzLmlzUmVzb3VyY2VzQm91bmQgPSBmYWxzZTsKICB9Cn07CgpWaWV3LnByb3RvdHlwZS53aGVuUmVzb3VyY2VzID0gZnVuY3Rpb24odGhlbkZ1bmMpIHsKICByZXR1cm4gc3luY1RoZW4odGhpcy5zZXR0aW5nUmVzb3VyY2VzLCB0aGVuRnVuYyk7Cn07CgpWaWV3LnByb3RvdHlwZS5zZXRSZXNvdXJjZXMgPSBmdW5jdGlvbihyZXNvdXJjZXMpIHt9OwoKVmlldy5wcm90b3R5cGUudW5zZXRSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHt9OwoKVmlldy5wcm90b3R5cGUucmVzZXRSZXNvdXJjZXMgPSBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICByZXR1cm4gdGhpcy5jYWxlbmRhci5yZXJlbmRlckV2ZW50cygpOwp9OwoKVmlldy5wcm90b3R5cGUuYWRkUmVzb3VyY2UgPSBmdW5jdGlvbihyZXNvdXJjZSkgewogIHJldHVybiB0aGlzLnJlc2V0UmVzb3VyY2VzKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKTsKfTsKClZpZXcucHJvdG90eXBlLnJlbW92ZVJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UpIHsKICByZXR1cm4gdGhpcy5yZXNldFJlc291cmNlcyh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyk7Cn07CgpvcmlnR2V0U2VnQ3VzdG9tQ2xhc3NlcyA9IEdyaWQucHJvdG90eXBlLmdldFNlZ0N1c3RvbUNsYXNzZXM7CgpvcmlnR2V0U2VnRGVmYXVsdEJhY2tncm91bmRDb2xvciA9IEdyaWQucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3I7CgpvcmlnR2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yID0gR3JpZC5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yOwoKb3JpZ0dldFNlZ0RlZmF1bHRUZXh0Q29sb3IgPSBHcmlkLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0VGV4dENvbG9yOwoKR3JpZC5wcm90b3R5cGUuZ2V0U2VnQ3VzdG9tQ2xhc3NlcyA9IGZ1bmN0aW9uKHNlZykgewogIHZhciBjbGFzc2VzLCBqLCBsZW4sIHJlZiwgcmVzb3VyY2U7CiAgY2xhc3NlcyA9IG9yaWdHZXRTZWdDdXN0b21DbGFzc2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgcmVmID0gdGhpcy5nZXRTZWdSZXNvdXJjZXMoc2VnKTsKICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIHJlc291cmNlID0gcmVmW2pdOwogICAgY2xhc3NlcyA9IGNsYXNzZXMuY29uY2F0KHJlc291cmNlLmV2ZW50Q2xhc3NOYW1lIHx8IFtdKTsKICB9CiAgcmV0dXJuIGNsYXNzZXM7Cn07CgpHcmlkLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yID0gZnVuY3Rpb24oc2VnKSB7CiAgdmFyIGN1cnJlbnRSZXNvdXJjZSwgaiwgbGVuLCByZXNvdXJjZXMsIHZhbDsKICByZXNvdXJjZXMgPSB0aGlzLmdldFNlZ1Jlc291cmNlcyhzZWcpOwogIGZvciAoaiA9IDAsIGxlbiA9IHJlc291cmNlcy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgY3VycmVudFJlc291cmNlID0gcmVzb3VyY2VzW2pdOwogICAgd2hpbGUgKGN1cnJlbnRSZXNvdXJjZSkgewogICAgICB2YWwgPSBjdXJyZW50UmVzb3VyY2UuZXZlbnRCYWNrZ3JvdW5kQ29sb3IgfHwgY3VycmVudFJlc291cmNlLmV2ZW50Q29sb3I7CiAgICAgIGlmICh2YWwpIHsKICAgICAgICByZXR1cm4gdmFsOwogICAgICB9CiAgICAgIGN1cnJlbnRSZXNvdXJjZSA9IGN1cnJlbnRSZXNvdXJjZS5fcGFyZW50OwogICAgfQogIH0KICByZXR1cm4gb3JpZ0dldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKCkdyaWQucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvciA9IGZ1bmN0aW9uKHNlZykgewogIHZhciBjdXJyZW50UmVzb3VyY2UsIGosIGxlbiwgcmVzb3VyY2VzLCB2YWw7CiAgcmVzb3VyY2VzID0gdGhpcy5nZXRTZWdSZXNvdXJjZXMoc2VnKTsKICBmb3IgKGogPSAwLCBsZW4gPSByZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIGN1cnJlbnRSZXNvdXJjZSA9IHJlc291cmNlc1tqXTsKICAgIHdoaWxlIChjdXJyZW50UmVzb3VyY2UpIHsKICAgICAgdmFsID0gY3VycmVudFJlc291cmNlLmV2ZW50Qm9yZGVyQ29sb3IgfHwgY3VycmVudFJlc291cmNlLmV2ZW50Q29sb3I7CiAgICAgIGlmICh2YWwpIHsKICAgICAgICByZXR1cm4gdmFsOwogICAgICB9CiAgICAgIGN1cnJlbnRSZXNvdXJjZSA9IGN1cnJlbnRSZXNvdXJjZS5fcGFyZW50OwogICAgfQogIH0KICByZXR1cm4gb3JpZ0dldFNlZ0RlZmF1bHRCb3JkZXJDb2xvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9OwoKR3JpZC5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdFRleHRDb2xvciA9IGZ1bmN0aW9uKHNlZykgewogIHZhciBjdXJyZW50UmVzb3VyY2UsIGosIGxlbiwgcmVzb3VyY2VzLCB2YWw7CiAgcmVzb3VyY2VzID0gdGhpcy5nZXRTZWdSZXNvdXJjZXMoc2VnKTsKICBmb3IgKGogPSAwLCBsZW4gPSByZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIGN1cnJlbnRSZXNvdXJjZSA9IHJlc291cmNlc1tqXTsKICAgIHdoaWxlIChjdXJyZW50UmVzb3VyY2UpIHsKICAgICAgdmFsID0gY3VycmVudFJlc291cmNlLmV2ZW50VGV4dENvbG9yOwogICAgICBpZiAodmFsKSB7CiAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgfQogICAgICBjdXJyZW50UmVzb3VyY2UgPSBjdXJyZW50UmVzb3VyY2UuX3BhcmVudDsKICAgIH0KICB9CiAgcmV0dXJuIG9yaWdHZXRTZWdEZWZhdWx0VGV4dENvbG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07CgpHcmlkLnByb3RvdHlwZS5nZXRTZWdSZXNvdXJjZXMgPSBmdW5jdGlvbihzZWcpIHsKICBpZiAoc2VnLnJlc291cmNlKSB7CiAgICByZXR1cm4gW3NlZy5yZXNvdXJjZV07CiAgfSBlbHNlIHsKICAgIHJldHVybiB0aGlzLnZpZXcuY2FsZW5kYXIuZ2V0RXZlbnRSZXNvdXJjZXMoc2VnLmV2ZW50KTsKICB9Cn07CgpSZXNvdXJjZU1hbmFnZXIgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZU1hbmFnZXIsIHN1cGVyQ2xhc3MpOwoKICBSZXNvdXJjZU1hbmFnZXIubWl4aW4oRW1pdHRlck1peGluKTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnJlc291cmNlR3VpZCA9IDE7CgogIFJlc291cmNlTWFuYWdlci5hamF4RGVmYXVsdHMgPSB7CiAgICBkYXRhVHlwZTogJ2pzb24nLAogICAgY2FjaGU6IGZhbHNlCiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5jYWxlbmRhciA9IG51bGw7CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUudG9wTGV2ZWxSZXNvdXJjZXMgPSBudWxsOwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLnJlc291cmNlc0J5SWQgPSBudWxsOwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmZldGNoaW5nID0gbnVsbDsKCiAgZnVuY3Rpb24gUmVzb3VyY2VNYW5hZ2VyKGNhbGVuZGFyMSkgewogICAgdGhpcy5jYWxlbmRhciA9IGNhbGVuZGFyMTsKICAgIHRoaXMuaW5pdGlhbGl6ZUNhY2hlKCk7CiAgfQoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmhhc0ZldGNoZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmZldGNoaW5nICYmIHRoaXMuZmV0Y2hpbmcuc3RhdGUoKSA9PT0gJ3Jlc29sdmVkJzsKICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmdldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGdldHRpbmc7CiAgICBpZiAoIXRoaXMuZmV0Y2hpbmcpIHsKICAgICAgZ2V0dGluZyA9ICQuRGVmZXJyZWQoKTsKICAgICAgc3luY1RoZW4odGhpcy5mZXRjaFJlc291cmNlcygpLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZ2V0dGluZy5yZXNvbHZlKHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOwogICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZ2V0dGluZy5yZXNvbHZlKFtdKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBnZXR0aW5nLnByb21pc2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSh0aGlzLnRvcExldmVsUmVzb3VyY2VzKS5wcm9taXNlKCk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5mZXRjaFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHByZXZGZXRjaGluZzsKICAgIHByZXZGZXRjaGluZyA9IHRoaXMuZmV0Y2hpbmc7CiAgICByZXR1cm4gc3luY1RoZW4ocHJldkZldGNoaW5nLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIF90aGlzLmZldGNoaW5nID0gJC5EZWZlcnJlZCgpOwogICAgICAgIF90aGlzLmZldGNoUmVzb3VyY2VJbnB1dHMoZnVuY3Rpb24ocmVzb3VyY2VJbnB1dHMpIHsKICAgICAgICAgIF90aGlzLnNldFJlc291cmNlcyhyZXNvdXJjZUlucHV0cywgQm9vbGVhbihwcmV2RmV0Y2hpbmcpKTsKICAgICAgICAgIHJldHVybiBfdGhpcy5mZXRjaGluZy5yZXNvbHZlKF90aGlzLnRvcExldmVsUmVzb3VyY2VzKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gX3RoaXMuZmV0Y2hpbmcucHJvbWlzZSgpOwogICAgICB9OwogICAgfSkodGhpcykpOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuZmV0Y2hSZXNvdXJjZUlucHV0cyA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICB2YXIgc291cmNlOwogICAgc291cmNlID0gdGhpcy5jYWxlbmRhci5vcHRpb25zWydyZXNvdXJjZXMnXTsKICAgIGlmICgkLnR5cGUoc291cmNlKSA9PT0gJ3N0cmluZycpIHsKICAgICAgc291cmNlID0gewogICAgICAgIHVybDogc291cmNlCiAgICAgIH07CiAgICB9CiAgICBzd2l0Y2ggKCQudHlwZShzb3VyY2UpKSB7CiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoKICAgICAgICB0aGlzLmNhbGVuZGFyLnB1c2hMb2FkaW5nKCk7CiAgICAgICAgcmV0dXJuIHNvdXJjZSgoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZUlucHV0cykgewogICAgICAgICAgICBfdGhpcy5jYWxlbmRhci5wb3BMb2FkaW5nKCk7CiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyZXNvdXJjZUlucHV0cyk7CiAgICAgICAgICB9OwogICAgICAgIH0pKHRoaXMpKTsKICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICB0aGlzLmNhbGVuZGFyLnB1c2hMb2FkaW5nKCk7CiAgICAgICAgcmV0dXJuICQuYWpheCgkLmV4dGVuZCh7fSwgUmVzb3VyY2VNYW5hZ2VyLmFqYXhEZWZhdWx0cywgc291cmNlKSkuZG9uZSgoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZUlucHV0cykgewogICAgICAgICAgICBfdGhpcy5jYWxlbmRhci5wb3BMb2FkaW5nKCk7CiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyZXNvdXJjZUlucHV0cyk7CiAgICAgICAgICB9OwogICAgICAgIH0pKHRoaXMpKTsKICAgICAgY2FzZSAnYXJyYXknOgogICAgICAgIHJldHVybiBjYWxsYmFjayhzb3VyY2UpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBjYWxsYmFjayhbXSk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5yZXNldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHN5bmNUaGVuKHRoaXMuZ2V0UmVzb3VyY2VzKCksIChmdW5jdGlvbihfdGhpcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF90aGlzLnRyaWdnZXIoJ3Jlc2V0JywgX3RoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOwogICAgICB9OwogICAgfSkodGhpcykpOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VCeUlkID0gZnVuY3Rpb24oaWQpIHsKICAgIHJldHVybiB0aGlzLnJlc291cmNlc0J5SWRbaWRdOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuZ2V0RmxhdFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGlkLCByZXN1bHRzOwogICAgcmVzdWx0cyA9IFtdOwogICAgZm9yIChpZCBpbiB0aGlzLnJlc291cmNlc0J5SWQpIHsKICAgICAgcmVzdWx0cy5wdXNoKHRoaXMucmVzb3VyY2VzQnlJZFtpZF0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5pbml0aWFsaXplQ2FjaGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMgPSBbXTsKICAgIHJldHVybiB0aGlzLnJlc291cmNlc0J5SWQgPSB7fTsKICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKHJlc291cmNlSW5wdXRzLCBpc1Jlc2V0KSB7CiAgICB2YXIgaiwgbGVuLCByZXNvdXJjZSwgcmVzb3VyY2VJbnB1dCwgcmVzb3VyY2VzLCB2YWxpZFJlc291cmNlczsKICAgIHRoaXMuaW5pdGlhbGl6ZUNhY2hlKCk7CiAgICByZXNvdXJjZXMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVzb3VyY2VJbnB1dHMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByZXNvdXJjZUlucHV0ID0gcmVzb3VyY2VJbnB1dHNbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuYnVpbGRSZXNvdXJjZShyZXNvdXJjZUlucHV0KSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KS5jYWxsKHRoaXMpOwogICAgdmFsaWRSZXNvdXJjZXMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVzb3VyY2VzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZXNbal07CiAgICAgICAgaWYgKHRoaXMuYWRkUmVzb3VyY2VUb0luZGV4KHJlc291cmNlKSkgewogICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc291cmNlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KS5jYWxsKHRoaXMpOwogICAgZm9yIChqID0gMCwgbGVuID0gdmFsaWRSZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSB2YWxpZFJlc291cmNlc1tqXTsKICAgICAgdGhpcy5hZGRSZXNvdXJjZVRvVHJlZShyZXNvdXJjZSk7CiAgICB9CiAgICBpZiAoaXNSZXNldCkgewogICAgICB0aGlzLnRyaWdnZXIoJ3Jlc2V0JywgdGhpcy50b3BMZXZlbFJlc291cmNlcyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnRyaWdnZXIoJ3NldCcsIHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOwogICAgfQogICAgcmV0dXJuIHRoaXMuY2FsZW5kYXIudHJpZ2dlcigncmVzb3VyY2VzU2V0JywgbnVsbCwgdGhpcy50b3BMZXZlbFJlc291cmNlcyk7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5hZGRSZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlSW5wdXQpIHsKICAgIHJldHVybiBzeW5jVGhlbih0aGlzLmZldGNoaW5nLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByZXNvdXJjZTsKICAgICAgICByZXNvdXJjZSA9IF90aGlzLmJ1aWxkUmVzb3VyY2UocmVzb3VyY2VJbnB1dCk7CiAgICAgICAgaWYgKF90aGlzLmFkZFJlc291cmNlVG9JbmRleChyZXNvdXJjZSkpIHsKICAgICAgICAgIF90aGlzLmFkZFJlc291cmNlVG9UcmVlKHJlc291cmNlKTsKICAgICAgICAgIF90aGlzLnRyaWdnZXIoJ2FkZCcsIHJlc291cmNlKTsKICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmFkZFJlc291cmNlVG9JbmRleCA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICB2YXIgY2hpbGQsIGosIGxlbiwgcmVmOwogICAgaWYgKHRoaXMucmVzb3VyY2VzQnlJZFtyZXNvdXJjZS5pZF0pIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5yZXNvdXJjZXNCeUlkW3Jlc291cmNlLmlkXSA9IHJlc291cmNlOwogICAgICByZWYgPSByZXNvdXJjZS5jaGlsZHJlbjsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgICAgdGhpcy5hZGRSZXNvdXJjZVRvSW5kZXgoY2hpbGQpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuYWRkUmVzb3VyY2VUb1RyZWUgPSBmdW5jdGlvbihyZXNvdXJjZSkgewogICAgdmFyIHBhcmVudCwgcGFyZW50SWQsIHJlZiwgc2libGluZ3M7CiAgICBpZiAoIXJlc291cmNlLnBhcmVudCkgewogICAgICBwYXJlbnRJZCA9IFN0cmluZygocmVmID0gcmVzb3VyY2VbJ3BhcmVudElkJ10pICE9IG51bGwgPyByZWYgOiAnJyk7CiAgICAgIGlmIChwYXJlbnRJZCkgewogICAgICAgIHBhcmVudCA9IHRoaXMucmVzb3VyY2VzQnlJZFtwYXJlbnRJZF07CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgcmVzb3VyY2UucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgc2libGluZ3MgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2libGluZ3MgPSB0aGlzLnRvcExldmVsUmVzb3VyY2VzOwogICAgICB9CiAgICAgIHNpYmxpbmdzLnB1c2gocmVzb3VyY2UpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZSA9IGZ1bmN0aW9uKGlkT3JSZXNvdXJjZSkgewogICAgdmFyIGlkOwogICAgaWQgPSB0eXBlb2YgaWRPclJlc291cmNlID09PSAnb2JqZWN0JyA/IGlkT3JSZXNvdXJjZS5pZCA6IGlkT3JSZXNvdXJjZTsKICAgIHJldHVybiBzeW5jVGhlbih0aGlzLmZldGNoaW5nLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByZXNvdXJjZTsKICAgICAgICByZXNvdXJjZSA9IF90aGlzLnJlbW92ZVJlc291cmNlRnJvbUluZGV4KGlkKTsKICAgICAgICBpZiAocmVzb3VyY2UpIHsKICAgICAgICAgIF90aGlzLnJlbW92ZVJlc291cmNlRnJvbVRyZWUocmVzb3VyY2UpOwogICAgICAgICAgX3RoaXMudHJpZ2dlcigncmVtb3ZlJywgcmVzb3VyY2UpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgIH07CiAgICB9KSh0aGlzKSk7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZUZyb21JbmRleCA9IGZ1bmN0aW9uKHJlc291cmNlSWQpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWYsIHJlc291cmNlOwogICAgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlc0J5SWRbcmVzb3VyY2VJZF07CiAgICBpZiAocmVzb3VyY2UpIHsKICAgICAgZGVsZXRlIHRoaXMucmVzb3VyY2VzQnlJZFtyZXNvdXJjZUlkXTsKICAgICAgcmVmID0gcmVzb3VyY2UuY2hpbGRyZW47CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICAgIHRoaXMucmVtb3ZlUmVzb3VyY2VGcm9tSW5kZXgoY2hpbGQuaWQpOwogICAgICB9CiAgICAgIHJldHVybiByZXNvdXJjZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLnJlbW92ZVJlc291cmNlRnJvbVRyZWUgPSBmdW5jdGlvbihyZXNvdXJjZSwgc2libGluZ3MpIHsKICAgIHZhciBpLCBqLCBsZW4sIHNpYmxpbmc7CiAgICBpZiAoc2libGluZ3MgPT0gbnVsbCkgewogICAgICBzaWJsaW5ncyA9IHRoaXMudG9wTGV2ZWxSZXNvdXJjZXM7CiAgICB9CiAgICBmb3IgKGkgPSBqID0gMCwgbGVuID0gc2libGluZ3MubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7CiAgICAgIHNpYmxpbmcgPSBzaWJsaW5nc1tpXTsKICAgICAgaWYgKHNpYmxpbmcgPT09IHJlc291cmNlKSB7CiAgICAgICAgcmVzb3VyY2UucGFyZW50ID0gbnVsbDsKICAgICAgICBzaWJsaW5ncy5zcGxpY2UoaSwgMSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKHRoaXMucmVtb3ZlUmVzb3VyY2VGcm9tVHJlZShyZXNvdXJjZSwgc2libGluZy5jaGlsZHJlbikpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuYnVpbGRSZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlSW5wdXQpIHsKICAgIHZhciBjaGlsZCwgY2hpbGRJbnB1dCwgcmF3Q2xhc3NOYW1lLCByZWYsIHJlc291cmNlOwogICAgcmVzb3VyY2UgPSAkLmV4dGVuZCh7fSwgcmVzb3VyY2VJbnB1dCk7CiAgICByZXNvdXJjZS5pZCA9IFN0cmluZygocmVmID0gcmVzb3VyY2VJbnB1dC5pZCkgIT0gbnVsbCA/IHJlZiA6ICdfZmMnICsgUmVzb3VyY2VNYW5hZ2VyLnJlc291cmNlR3VpZCsrKTsKICAgIHJhd0NsYXNzTmFtZSA9IHJlc291cmNlSW5wdXQuZXZlbnRDbGFzc05hbWU7CiAgICByZXNvdXJjZS5ldmVudENsYXNzTmFtZSA9IChmdW5jdGlvbigpIHsKICAgICAgc3dpdGNoICgkLnR5cGUocmF3Q2xhc3NOYW1lKSkgewogICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgICByZXR1cm4gcmF3Q2xhc3NOYW1lLnNwbGl0KC9ccysvKTsKICAgICAgICBjYXNlICdhcnJheSc6CiAgICAgICAgICByZXR1cm4gcmF3Q2xhc3NOYW1lOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgIH0pKCk7CiAgICByZXNvdXJjZS5jaGlsZHJlbiA9IChmdW5jdGlvbigpIHsKICAgICAgdmFyIGosIGxlbiwgcmVmMSwgcmVmMiwgcmVzdWx0czsKICAgICAgcmVmMiA9IChyZWYxID0gcmVzb3VyY2VJbnB1dC5jaGlsZHJlbikgIT0gbnVsbCA/IHJlZjEgOiBbXTsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYyLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgY2hpbGRJbnB1dCA9IHJlZjJbal07CiAgICAgICAgY2hpbGQgPSB0aGlzLmJ1aWxkUmVzb3VyY2UoY2hpbGRJbnB1dCk7CiAgICAgICAgY2hpbGQucGFyZW50ID0gcmVzb3VyY2U7CiAgICAgICAgcmVzdWx0cy5wdXNoKGNoaWxkKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgICByZXR1cm4gcmVzb3VyY2U7CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlTWFuYWdlcjsKCn0pKENsYXNzKTsKCgovKgpBIHZpZXcgdGhhdCBzdHJ1Y3R1cmFsbHkgZGlzdGluZ3Vpc2hlcyBldmVudHMgYnkgcmVzb3VyY2UKICovCgpSZXNvdXJjZVZpZXdNaXhpbiA9IHsKICByZXNvdXJjZVRleHRGdW5jOiBudWxsLAogIHVuc2V0UmVzb3VyY2VzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmNsZWFyRXZlbnRzKCk7CiAgfSwKICByZXNldFJlc291cmNlczogZnVuY3Rpb24ocmVzb3VyY2VzKSB7CiAgICB2YXIgc2Nyb2xsU3RhdGU7CiAgICBzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKICAgIHRoaXMudW5zZXRSZXNvdXJjZXMoKTsKICAgIHRoaXMuc2V0UmVzb3VyY2VzKHJlc291cmNlcyk7CiAgICB0aGlzLnNldFNjcm9sbChzY3JvbGxTdGF0ZSk7CiAgICByZXR1cm4gdGhpcy5jYWxlbmRhci5yZXJlbmRlckV2ZW50cygpOwogIH0sCiAgaXNFdmVudERyYWdnYWJsZTogZnVuY3Rpb24oZXZlbnQpIHsKICAgIHJldHVybiB0aGlzLmlzRXZlbnRSZXNvdXJjZUVkaXRhYmxlKGV2ZW50KSB8fCBWaWV3LnByb3RvdHlwZS5pc0V2ZW50RHJhZ2dhYmxlLmNhbGwodGhpcywgZXZlbnQpOwogIH0sCiAgaXNFdmVudFJlc291cmNlRWRpdGFibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICB2YXIgcmVmLCByZWYxLCByZWYyOwogICAgcmV0dXJuIChyZWYgPSAocmVmMSA9IChyZWYyID0gZXZlbnQucmVzb3VyY2VFZGl0YWJsZSkgIT0gbnVsbCA/IHJlZjIgOiAoZXZlbnQuc291cmNlIHx8IHt9KS5yZXNvdXJjZUVkaXRhYmxlKSAhPSBudWxsID8gcmVmMSA6IHRoaXMub3B0KCdldmVudFJlc291cmNlRWRpdGFibGUnKSkgIT0gbnVsbCA/IHJlZiA6IHRoaXMuaXNFdmVudEdlbmVyYWxseUVkaXRhYmxlKGV2ZW50KTsKICB9LAogIGdldFJlc291cmNlVGV4dDogZnVuY3Rpb24ocmVzb3VyY2UpIHsKICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlVGV4dEZ1bmMoKShyZXNvdXJjZSk7CiAgfSwKICBnZXRSZXNvdXJjZVRleHRGdW5jOiBmdW5jdGlvbigpIHsKICAgIHZhciBmdW5jOwogICAgaWYgKHRoaXMucmVzb3VyY2VUZXh0RnVuYykgewogICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVRleHRGdW5jOwogICAgfSBlbHNlIHsKICAgICAgZnVuYyA9IHRoaXMub3B0KCdyZXNvdXJjZVRleHQnKTsKICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZnVuYyA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICAgICAgICByZXR1cm4gcmVzb3VyY2UudGl0bGUgfHwgcmVzb3VyY2UuaWQ7CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVRleHRGdW5jID0gZnVuYzsKICAgIH0KICB9LAogIHRyaWdnZXJEYXlDbGljazogZnVuY3Rpb24oc3BhbiwgZGF5RWwsIGV2KSB7CiAgICB2YXIgcmVzb3VyY2VNYW5hZ2VyOwogICAgcmVzb3VyY2VNYW5hZ2VyID0gdGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXI7CiAgICByZXR1cm4gdGhpcy50cmlnZ2VyKCdkYXlDbGljaycsIGRheUVsLCB0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUoc3Bhbi5zdGFydCksIGV2LCB0aGlzLCByZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VCeUlkKHNwYW4ucmVzb3VyY2VJZCkpOwogIH0sCiAgdHJpZ2dlclNlbGVjdDogZnVuY3Rpb24oc3BhbiwgZXYpIHsKICAgIHZhciByZXNvdXJjZU1hbmFnZXI7CiAgICByZXNvdXJjZU1hbmFnZXIgPSB0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlcjsKICAgIHJldHVybiB0aGlzLnRyaWdnZXIoJ3NlbGVjdCcsIG51bGwsIHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZShzcGFuLnN0YXJ0KSwgdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHNwYW4uZW5kKSwgZXYsIHRoaXMsIHJlc291cmNlTWFuYWdlci5nZXRSZXNvdXJjZUJ5SWQoc3Bhbi5yZXNvdXJjZUlkKSk7CiAgfSwKICB0cmlnZ2VyRXh0ZXJuYWxEcm9wOiBmdW5jdGlvbihldmVudCwgZHJvcExvY2F0aW9uLCBlbCwgZXYsIHVpKSB7CiAgICB0aGlzLnRyaWdnZXIoJ2Ryb3AnLCBlbFswXSwgZHJvcExvY2F0aW9uLnN0YXJ0LCBldiwgdWksIGRyb3BMb2NhdGlvbi5yZXNvdXJjZUlkKTsKICAgIGlmIChldmVudCkgewogICAgICByZXR1cm4gdGhpcy50cmlnZ2VyKCdldmVudFJlY2VpdmUnLCBudWxsLCBldmVudCk7CiAgICB9CiAgfSwKCiAgLyogSGFja3MKICAJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgCVRoZXNlIHRyaWdnZXJzIHVzdWFsbHkgY2FsbCBtdXRhdGVFdmVudCB3aXRoIGRyb3BMb2NhdGlvbiwgd2hpY2ggY2F1c2VzIGFuIGV2ZW50IG1vZGlmaWNhdGlvbiBhbmQgcmVyZW5kZXIuCiAgCUJ1dCBtdXRhdGVFdmVudCBpc24ndCBhd2FyZSBvZiBldmVudFJlc291cmNlRmllbGQsIHNvIGl0IG1pZ2h0IGJlIHNldHRpbmcgdGhlIHdyb25nIHByb3BlcnR5LiBXb3JrYXJvdW5kLgogIAlUT0RPOiBub3JtYWxpemUgc29tZXdoZXJlIGVsc2UuIG1heWJlIG1ha2UgYSBob29rIGluIGNvcmUuCiAgICovCiAgcmVwb3J0RXZlbnREcm9wOiBmdW5jdGlvbigpIHsKICAgIHZhciBkcm9wTG9jYXRpb24sIGV2ZW50LCBvdGhlckFyZ3MsIHJlZjsKICAgIGV2ZW50ID0gYXJndW1lbnRzWzBdLCBkcm9wTG9jYXRpb24gPSBhcmd1bWVudHNbMV0sIG90aGVyQXJncyA9IDMgPD0gYXJndW1lbnRzLmxlbmd0aCA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IFtdOwogICAgZHJvcExvY2F0aW9uID0gdGhpcy5ub3JtYWxpemVEcm9wTG9jYXRpb24oZHJvcExvY2F0aW9uKTsKICAgIGlmIChkcm9wTG9jYXRpb24ucmVzb3VyY2VJZCAmJiBldmVudC5yZXNvdXJjZUlkcykgewogICAgICBkcm9wTG9jYXRpb24ucmVzb3VyY2VJZHMgPSBudWxsOwogICAgfQogICAgcmV0dXJuIChyZWYgPSBWaWV3LnByb3RvdHlwZS5yZXBvcnRFdmVudERyb3ApLmNhbGwuYXBwbHkocmVmLCBbdGhpcywgZXZlbnQsIGRyb3BMb2NhdGlvbl0uY29uY2F0KHNsaWNlLmNhbGwob3RoZXJBcmdzKSkpOwogIH0sCiAgcmVwb3J0RXh0ZXJuYWxEcm9wOiBmdW5jdGlvbigpIHsKICAgIHZhciBkcm9wTG9jYXRpb24sIG1ldGEsIG90aGVyQXJncywgcmVmOwogICAgbWV0YSA9IGFyZ3VtZW50c1swXSwgZHJvcExvY2F0aW9uID0gYXJndW1lbnRzWzFdLCBvdGhlckFyZ3MgPSAzIDw9IGFyZ3VtZW50cy5sZW5ndGggPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiBbXTsKICAgIGRyb3BMb2NhdGlvbiA9IHRoaXMubm9ybWFsaXplRHJvcExvY2F0aW9uKGRyb3BMb2NhdGlvbik7CiAgICByZXR1cm4gKHJlZiA9IFZpZXcucHJvdG90eXBlLnJlcG9ydEV4dGVybmFsRHJvcCkuY2FsbC5hcHBseShyZWYsIFt0aGlzLCBtZXRhLCBkcm9wTG9jYXRpb25dLmNvbmNhdChzbGljZS5jYWxsKG90aGVyQXJncykpKTsKICB9LAogIG5vcm1hbGl6ZURyb3BMb2NhdGlvbjogZnVuY3Rpb24oZHJvcExvY2F0aW9uKSB7CiAgICB2YXIgb3V0OwogICAgb3V0ID0gJC5leHRlbmQoe30sIGRyb3BMb2NhdGlvbik7CiAgICBkZWxldGUgb3V0LnJlc291cmNlSWQ7CiAgICB0aGlzLmNhbGVuZGFyLnNldEV2ZW50UmVzb3VyY2VJZChvdXQsIGRyb3BMb2NhdGlvbi5yZXNvdXJjZUlkKTsKICAgIHJldHVybiBvdXQ7CiAgfQp9OwoKUmVzb3VyY2VHcmlkTWl4aW4gPSB7CiAgYWxsb3dDcm9zc1Jlc291cmNlOiB0cnVlLAogIGV2ZW50UmFuZ2VUb1NwYW5zOiBmdW5jdGlvbihyYW5nZSwgZXZlbnQpIHsKICAgIHZhciBqLCBsZW4sIHJlc291cmNlSWQsIHJlc291cmNlSWRzLCByZXN1bHRzOwogICAgcmVzb3VyY2VJZHMgPSB0aGlzLnZpZXcuY2FsZW5kYXIuZ2V0RXZlbnRSZXNvdXJjZUlkcyhldmVudCk7CiAgICBpZiAocmVzb3VyY2VJZHMubGVuZ3RoKSB7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVzb3VyY2VJZHMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByZXNvdXJjZUlkID0gcmVzb3VyY2VJZHNbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKCQuZXh0ZW5kKHt9LCByYW5nZSwgewogICAgICAgICAgcmVzb3VyY2VJZDogcmVzb3VyY2VJZAogICAgICAgIH0pKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0gZWxzZSBpZiAoRkMuaXNCZ0V2ZW50KGV2ZW50KSkgewogICAgICByZXR1cm4gR3JpZC5wcm90b3R5cGUuZXZlbnRSYW5nZVRvU3BhbnMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICB9LAogIGZhYnJpY2F0ZUhlbHBlckV2ZW50OiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzZWcpIHsKICAgIHZhciBldmVudDsKICAgIGV2ZW50ID0gR3JpZC5wcm90b3R5cGUuZmFicmljYXRlSGVscGVyRXZlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMudmlldy5jYWxlbmRhci5zZXRFdmVudFJlc291cmNlSWQoZXZlbnQsIGV2ZW50TG9jYXRpb24ucmVzb3VyY2VJZCk7CiAgICByZXR1cm4gZXZlbnQ7CiAgfSwKICBjb21wdXRlRXZlbnREcm9wOiBmdW5jdGlvbihzdGFydFNwYW4sIGVuZFNwYW4sIGV2ZW50KSB7CiAgICB2YXIgZHJvcExvY2F0aW9uOwogICAgaWYgKHRoaXMudmlldy5pc0V2ZW50U3RhcnRFZGl0YWJsZShldmVudCkpIHsKICAgICAgZHJvcExvY2F0aW9uID0gR3JpZC5wcm90b3R5cGUuY29tcHV0ZUV2ZW50RHJvcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgZHJvcExvY2F0aW9uID0gRkMucGx1Y2tFdmVudERhdGVQcm9wcyhldmVudCk7CiAgICB9CiAgICBpZiAoZHJvcExvY2F0aW9uKSB7CiAgICAgIGlmICh0aGlzLnZpZXcuaXNFdmVudFJlc291cmNlRWRpdGFibGUoZXZlbnQpKSB7CiAgICAgICAgZHJvcExvY2F0aW9uLnJlc291cmNlSWQgPSBlbmRTcGFuLnJlc291cmNlSWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZHJvcExvY2F0aW9uLnJlc291cmNlSWQgPSBzdGFydFNwYW4ucmVzb3VyY2VJZDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRyb3BMb2NhdGlvbjsKICB9LAogIGNvbXB1dGVFeHRlcm5hbERyb3A6IGZ1bmN0aW9uKHNwYW4sIG1ldGEpIHsKICAgIHZhciBkcm9wTG9jYXRpb247CiAgICBkcm9wTG9jYXRpb24gPSBHcmlkLnByb3RvdHlwZS5jb21wdXRlRXh0ZXJuYWxEcm9wLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoZHJvcExvY2F0aW9uKSB7CiAgICAgIGRyb3BMb2NhdGlvbi5yZXNvdXJjZUlkID0gc3Bhbi5yZXNvdXJjZUlkOwogICAgfQogICAgcmV0dXJuIGRyb3BMb2NhdGlvbjsKICB9LAogIGNvbXB1dGVFdmVudFJlc2l6ZTogZnVuY3Rpb24odHlwZSwgc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCkgewogICAgdmFyIHJlc2l6ZUxvY2F0aW9uOwogICAgaWYgKCF0aGlzLmFsbG93Q3Jvc3NSZXNvdXJjZSAmJiBzdGFydFNwYW4ucmVzb3VyY2VJZCAhPT0gZW5kU3Bhbi5yZXNvdXJjZUlkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJlc2l6ZUxvY2F0aW9uID0gR3JpZC5wcm90b3R5cGUuY29tcHV0ZUV2ZW50UmVzaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzaXplTG9jYXRpb24pIHsKICAgICAgcmVzaXplTG9jYXRpb24ucmVzb3VyY2VJZCA9IHN0YXJ0U3Bhbi5yZXNvdXJjZUlkOwogICAgfQogICAgcmV0dXJuIHJlc2l6ZUxvY2F0aW9uOwogIH0sCiAgY29tcHV0ZVNlbGVjdGlvblNwYW46IGZ1bmN0aW9uKHN0YXJ0U3BhbiwgZW5kU3BhbikgewogICAgdmFyIHNlbGVjdGlvblNwYW47CiAgICBpZiAoIXRoaXMuYWxsb3dDcm9zc1Jlc291cmNlICYmIHN0YXJ0U3Bhbi5yZXNvdXJjZUlkICE9PSBlbmRTcGFuLnJlc291cmNlSWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc2VsZWN0aW9uU3BhbiA9IEdyaWQucHJvdG90eXBlLmNvbXB1dGVTZWxlY3Rpb25TcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoc2VsZWN0aW9uU3BhbikgewogICAgICBzZWxlY3Rpb25TcGFuLnJlc291cmNlSWQgPSBzdGFydFNwYW4ucmVzb3VyY2VJZDsKICAgIH0KICAgIHJldHVybiBzZWxlY3Rpb25TcGFuOwogIH0KfTsKCgovKgpSZXF1aXJlbWVudHM6Ci0gbXVzdCBiZSBhIEdyaWQKLSBncmlkIG11c3QgaGF2ZSBhIHZpZXcgdGhhdCdzIGEgUmVzb3VyY2VWaWV3Ci0gRGF5VGFibGVNaXhpbiBtdXN0IGFscmVhZHkgYmUgbWl4ZWQgaW4KICovCgpSZXNvdXJjZURheVRhYmxlTWl4aW4gPSB7CiAgZmxhdHRlbmVkUmVzb3VyY2VzOiBudWxsLAogIHJlc291cmNlQ250OiAwLAogIGRhdGVzQWJvdmVSZXNvdXJjZXM6IGZhbHNlLAogIGFsbG93Q3Jvc3NSZXNvdXJjZTogZmFsc2UsCiAgc2V0UmVzb3VyY2VzOiBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICAgIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzID0gdGhpcy5mbGF0dGVuUmVzb3VyY2VzKHJlc291cmNlcyk7CiAgICB0aGlzLnJlc291cmNlQ250ID0gdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMubGVuZ3RoOwogICAgcmV0dXJuIHRoaXMudXBkYXRlRGF5VGFibGVDb2xzKCk7CiAgfSwKICB1bnNldFJlc291cmNlczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmZsYXR0ZW5lZFJlc291cmNlcyA9IG51bGw7CiAgICB0aGlzLnJlc291cmNlQ250ID0gMDsKICAgIHJldHVybiB0aGlzLnVwZGF0ZURheVRhYmxlQ29scygpOwogIH0sCiAgZmxhdHRlblJlc291cmNlczogZnVuY3Rpb24ocmVzb3VyY2VzKSB7CiAgICB2YXIgb3JkZXJTcGVjcywgb3JkZXJWYWwsIHJlcywgc29ydEZ1bmM7CiAgICBvcmRlclZhbCA9IHRoaXMudmlldy5vcHQoJ3Jlc291cmNlT3JkZXInKTsKICAgIGlmIChvcmRlclZhbCkgewogICAgICBvcmRlclNwZWNzID0gcGFyc2VGaWVsZFNwZWNzKG9yZGVyVmFsKTsKICAgICAgc29ydEZ1bmMgPSBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGNvbXBhcmVCeUZpZWxkU3BlY3MoYSwgYiwgb3JkZXJTcGVjcyk7CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBzb3J0RnVuYyA9IG51bGw7CiAgICB9CiAgICByZXMgPSBbXTsKICAgIHRoaXMuYWNjdW11bGF0ZVJlc291cmNlcyhyZXNvdXJjZXMsIHNvcnRGdW5jLCByZXMpOwogICAgcmV0dXJuIHJlczsKICB9LAogIGFjY3VtdWxhdGVSZXNvdXJjZXM6IGZ1bmN0aW9uKHJlc291cmNlcywgc29ydEZ1bmMsIHJlcykgewogICAgdmFyIGosIGxlbiwgcmVzb3VyY2UsIHJlc3VsdHMsIHNvcnRlZFJlc291cmNlczsKICAgIGlmIChzb3J0RnVuYykgewogICAgICBzb3J0ZWRSZXNvdXJjZXMgPSByZXNvdXJjZXMuc2xpY2UoMCk7CiAgICAgIHNvcnRlZFJlc291cmNlcy5zb3J0KHNvcnRGdW5jKTsKICAgIH0gZWxzZSB7CiAgICAgIHNvcnRlZFJlc291cmNlcyA9IHJlc291cmNlczsKICAgIH0KICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHNvcnRlZFJlc291cmNlcy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZXNvdXJjZSA9IHNvcnRlZFJlc291cmNlc1tqXTsKICAgICAgcmVzLnB1c2gocmVzb3VyY2UpOwogICAgICByZXN1bHRzLnB1c2godGhpcy5hY2N1bXVsYXRlUmVzb3VyY2VzKHJlc291cmNlLmNoaWxkcmVuLCBzb3J0RnVuYywgcmVzKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9LAogIHVwZGF0ZURheVRhYmxlQ29sczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXMgPSB0aGlzLnZpZXcub3B0KCdncm91cEJ5RGF0ZUFuZFJlc291cmNlJyk7CiAgICByZXR1cm4gRkMuRGF5VGFibGVNaXhpbi51cGRhdGVEYXlUYWJsZUNvbHMuY2FsbCh0aGlzKTsKICB9LAogIGNvbXB1dGVDb2xDbnQ6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICh0aGlzLnJlc291cmNlQ250IHx8IDEpICogdGhpcy5kYXlzUGVyUm93OwogIH0sCiAgZ2V0Q29sRGF5SW5kZXg6IGZ1bmN0aW9uKGNvbCkgewogICAgaWYgKHRoaXMuaXNSVEwpIHsKICAgICAgY29sID0gdGhpcy5jb2xDbnQgLSAxIC0gY29sOwogICAgfQogICAgaWYgKHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcykgewogICAgICByZXR1cm4gTWF0aC5mbG9vcihjb2wgLyAodGhpcy5yZXNvdXJjZUNudCB8fCAxKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29sICUgdGhpcy5kYXlzUGVyUm93OwogICAgfQogIH0sCiAgZ2V0Q29sUmVzb3VyY2U6IGZ1bmN0aW9uKGNvbCkgewogICAgcmV0dXJuIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzW3RoaXMuZ2V0Q29sUmVzb3VyY2VJbmRleChjb2wpXTsKICB9LAogIGdldENvbFJlc291cmNlSW5kZXg6IGZ1bmN0aW9uKGNvbCkgewogICAgaWYgKHRoaXMuaXNSVEwpIHsKICAgICAgY29sID0gdGhpcy5jb2xDbnQgLSAxIC0gY29sOwogICAgfQogICAgaWYgKHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcykgewogICAgICByZXR1cm4gY29sICUgKHRoaXMucmVzb3VyY2VDbnQgfHwgMSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gTWF0aC5mbG9vcihjb2wgLyB0aGlzLmRheXNQZXJSb3cpOwogICAgfQogIH0sCiAgaW5kaWNlc1RvQ29sOiBmdW5jdGlvbihyZXNvdXJjZUluZGV4LCBkYXlJbmRleCkgewogICAgdmFyIGNvbDsKICAgIGNvbCA9IHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcyA/IGRheUluZGV4ICogKHRoaXMucmVzb3VyY2VDbnQgfHwgMSkgKyByZXNvdXJjZUluZGV4IDogcmVzb3VyY2VJbmRleCAqIHRoaXMuZGF5c1BlclJvdyArIGRheUluZGV4OwogICAgaWYgKHRoaXMuaXNSVEwpIHsKICAgICAgY29sID0gdGhpcy5jb2xDbnQgLSAxIC0gY29sOwogICAgfQogICAgcmV0dXJuIGNvbDsKICB9LAogIHJlbmRlckhlYWRUckh0bWw6IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLnJlc291cmNlQ250KSB7CiAgICAgIHJldHVybiBGQy5EYXlUYWJsZU1peGluLnJlbmRlckhlYWRUckh0bWwuY2FsbCh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh0aGlzLmRheXNQZXJSb3cgPiAxKSB7CiAgICAgICAgaWYgKHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcykgewogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGVhZERhdGVBbmRSZXNvdXJjZUh0bWwoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGVhZFJlc291cmNlQW5kRGF0ZUh0bWwoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGVhZFJlc291cmNlSHRtbCgpOwogICAgICB9CiAgICB9CiAgfSwKICByZW5kZXJIZWFkUmVzb3VyY2VIdG1sOiBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzb3VyY2UsIHJlc291cmNlSHRtbHM7CiAgICByZXNvdXJjZUh0bWxzID0gW107CiAgICByZWYgPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlczsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZXNvdXJjZSA9IHJlZltqXTsKICAgICAgcmVzb3VyY2VIdG1scy5wdXNoKHRoaXMucmVuZGVySGVhZFJlc291cmNlQ2VsbEh0bWwocmVzb3VyY2UpKTsKICAgIH0KICAgIHJldHVybiB0aGlzLndyYXBUcihyZXNvdXJjZUh0bWxzLCAncmVuZGVySGVhZEludHJvSHRtbCcpOwogIH0sCiAgcmVuZGVySGVhZFJlc291cmNlQW5kRGF0ZUh0bWw6IGZ1bmN0aW9uKCkgewogICAgdmFyIGRhdGUsIGRhdGVIdG1scywgZGF5SW5kZXgsIGosIGssIGxlbiwgcmVmLCByZWYxLCByZXNvdXJjZSwgcmVzb3VyY2VIdG1sczsKICAgIHJlc291cmNlSHRtbHMgPSBbXTsKICAgIGRhdGVIdG1scyA9IFtdOwogICAgcmVmID0gdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXM7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSByZWZbal07CiAgICAgIHJlc291cmNlSHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKHJlc291cmNlLCBudWxsLCB0aGlzLmRheXNQZXJSb3cpKTsKICAgICAgZm9yIChkYXlJbmRleCA9IGsgPSAwLCByZWYxID0gdGhpcy5kYXlzUGVyUm93OyBrIDwgcmVmMTsgZGF5SW5kZXggPSBrICs9IDEpIHsKICAgICAgICBkYXRlID0gdGhpcy5kYXlEYXRlc1tkYXlJbmRleF0uY2xvbmUoKTsKICAgICAgICBkYXRlSHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZURhdGVDZWxsSHRtbChkYXRlLCByZXNvdXJjZSkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy53cmFwVHIocmVzb3VyY2VIdG1scywgJ3JlbmRlckhlYWRJbnRyb0h0bWwnKSArIHRoaXMud3JhcFRyKGRhdGVIdG1scywgJ3JlbmRlckhlYWRJbnRyb0h0bWwnKTsKICB9LAogIHJlbmRlckhlYWREYXRlQW5kUmVzb3VyY2VIdG1sOiBmdW5jdGlvbigpIHsKICAgIHZhciBkYXRlLCBkYXRlSHRtbHMsIGRheUluZGV4LCBqLCBrLCBsZW4sIHJlZiwgcmVmMSwgcmVzb3VyY2UsIHJlc291cmNlSHRtbHM7CiAgICBkYXRlSHRtbHMgPSBbXTsKICAgIHJlc291cmNlSHRtbHMgPSBbXTsKICAgIGZvciAoZGF5SW5kZXggPSBqID0gMCwgcmVmID0gdGhpcy5kYXlzUGVyUm93OyBqIDwgcmVmOyBkYXlJbmRleCA9IGogKz0gMSkgewogICAgICBkYXRlID0gdGhpcy5kYXlEYXRlc1tkYXlJbmRleF0uY2xvbmUoKTsKICAgICAgZGF0ZUh0bWxzLnB1c2godGhpcy5yZW5kZXJIZWFkRGF0ZUNlbGxIdG1sKGRhdGUsIHRoaXMucmVzb3VyY2VDbnQpKTsKICAgICAgcmVmMSA9IHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzOwogICAgICBmb3IgKGsgPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7CiAgICAgICAgcmVzb3VyY2UgPSByZWYxW2tdOwogICAgICAgIHJlc291cmNlSHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKHJlc291cmNlLCBkYXRlKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzLndyYXBUcihkYXRlSHRtbHMsICdyZW5kZXJIZWFkSW50cm9IdG1sJykgKyB0aGlzLndyYXBUcihyZXNvdXJjZUh0bWxzLCAncmVuZGVySGVhZEludHJvSHRtbCcpOwogIH0sCiAgcmVuZGVySGVhZFJlc291cmNlQ2VsbEh0bWw6IGZ1bmN0aW9uKHJlc291cmNlLCBkYXRlLCBjb2xzcGFuKSB7CiAgICByZXR1cm4gJzx0aCBjbGFzcz0iZmMtcmVzb3VyY2UtY2VsbCInICsgJyBkYXRhLXJlc291cmNlLWlkPSInICsgcmVzb3VyY2UuaWQgKyAnIicgKyAoZGF0ZSA/ICcgZGF0YS1kYXRlPSInICsgZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSArICciJyA6ICcnKSArIChjb2xzcGFuID4gMSA/ICcgY29sc3Bhbj0iJyArIGNvbHNwYW4gKyAnIicgOiAnJykgKyAnPicgKyBodG1sRXNjYXBlKHRoaXMudmlldy5nZXRSZXNvdXJjZVRleHQocmVzb3VyY2UpKSArICc8L3RoPic7CiAgfSwKICByZW5kZXJIZWFkUmVzb3VyY2VEYXRlQ2VsbEh0bWw6IGZ1bmN0aW9uKGRhdGUsIHJlc291cmNlLCBjb2xzcGFuKSB7CiAgICByZXR1cm4gdGhpcy5yZW5kZXJIZWFkRGF0ZUNlbGxIdG1sKGRhdGUsIGNvbHNwYW4sICdkYXRhLXJlc291cmNlLWlkPSInICsgcmVzb3VyY2UuaWQgKyAnIicpOwogIH0sCiAgcHJvY2Vzc0hlYWRSZXNvdXJjZUVsczogZnVuY3Rpb24oY29udGFpbmVyRWwpIHsKICAgIHJldHVybiBjb250YWluZXJFbC5maW5kKCcuZmMtcmVzb3VyY2UtY2VsbCcpLmVhY2goKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihjb2wsIG5vZGUpIHsKICAgICAgICB2YXIgcmVzb3VyY2U7CiAgICAgICAgaWYgKF90aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXMpIHsKICAgICAgICAgIHJlc291cmNlID0gX3RoaXMuZ2V0Q29sUmVzb3VyY2UoY29sKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzb3VyY2UgPSBfdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXNbX3RoaXMuaXNSVEwgPyBfdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMubGVuZ3RoIC0gMSAtIGNvbCA6IGNvbF07CiAgICAgICAgfQogICAgICAgIHJldHVybiBfdGhpcy52aWV3LnRyaWdnZXIoJ3Jlc291cmNlUmVuZGVyJywgcmVzb3VyY2UsIHJlc291cmNlLCAkKG5vZGUpLCAkKCkpOwogICAgICB9OwogICAgfSkodGhpcykpOwogIH0sCiAgcmVuZGVyQmdDZWxsc0h0bWw6IGZ1bmN0aW9uKHJvdykgewogICAgdmFyIGNvbCwgZGF0ZSwgaHRtbHMsIGosIHJlZiwgcmVzb3VyY2U7CiAgICBpZiAoIXRoaXMucmVzb3VyY2VDbnQpIHsKICAgICAgcmV0dXJuIEZDLkRheVRhYmxlTWl4aW4ucmVuZGVyQmdDZWxsc0h0bWwuY2FsbCh0aGlzLCByb3cpOwogICAgfSBlbHNlIHsKICAgICAgaHRtbHMgPSBbXTsKICAgICAgZm9yIChjb2wgPSBqID0gMCwgcmVmID0gdGhpcy5jb2xDbnQ7IGogPCByZWY7IGNvbCA9IGogKz0gMSkgewogICAgICAgIGRhdGUgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgY29sKTsKICAgICAgICByZXNvdXJjZSA9IHRoaXMuZ2V0Q29sUmVzb3VyY2UoY29sKTsKICAgICAgICBodG1scy5wdXNoKHRoaXMucmVuZGVyUmVzb3VyY2VCZ0NlbGxIdG1sKGRhdGUsIHJlc291cmNlKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGh0bWxzLmpvaW4oJycpOwogICAgfQogIH0sCiAgcmVuZGVyUmVzb3VyY2VCZ0NlbGxIdG1sOiBmdW5jdGlvbihkYXRlLCByZXNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMucmVuZGVyQmdDZWxsSHRtbChkYXRlLCAnZGF0YS1yZXNvdXJjZS1pZD0iJyArIHJlc291cmNlLmlkICsgJyInKTsKICB9LAogIHdyYXBUcjogZnVuY3Rpb24oY2VsbEh0bWxzLCBpbnRyb01ldGhvZE5hbWUpIHsKICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgIGNlbGxIdG1scy5yZXZlcnNlKCk7CiAgICAgIHJldHVybiAnPHRyPicgKyBjZWxsSHRtbHMuam9pbignJykgKyB0aGlzW2ludHJvTWV0aG9kTmFtZV0oKSArICc8L3RyPic7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJzx0cj4nICsgdGhpc1tpbnRyb01ldGhvZE5hbWVdKCkgKyBjZWxsSHRtbHMuam9pbignJykgKyAnPC90cj4nOwogICAgfQogIH0sCgogIC8qCiAgCUlmIHRoZXJlIGFyZSBubyBwZXItcmVzb3VyY2UgYnVzaW5lc3MgaG91ciBkZWZpbml0aW9ucywgcmV0dXJucyBudWxsLgogIAlPdGhlcndpc2UsIHJldHVybnMgYSBsaXN0IG9mIGJ1c2luZXNzIGhvdXJzIHNlZ3MgZm9yICpldmVyeSogcmVzb3VyY2UuCiAgICovCiAgY29tcHV0ZVBlclJlc291cmNlQnVzaW5lc3NIb3VyU2VnczogZnVuY3Rpb24od2hvbGVEYXkpIHsKICAgIHZhciBhbGxTZWdzLCBhbnlDdXN0b21CdXNpbmVzc0hvdXJzLCBidXNpbmVzc0hvdXJzLCBldmVudCwgZXZlbnRzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIHJlZiwgcmVmMSwgcmVzb3VyY2UsIHNlZ3M7CiAgICBpZiAodGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMpIHsKICAgICAgYW55Q3VzdG9tQnVzaW5lc3NIb3VycyA9IGZhbHNlOwogICAgICByZWYgPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlczsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgcmVzb3VyY2UgPSByZWZbal07CiAgICAgICAgaWYgKHJlc291cmNlLmJ1c2luZXNzSG91cnMpIHsKICAgICAgICAgIGFueUN1c3RvbUJ1c2luZXNzSG91cnMgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYW55Q3VzdG9tQnVzaW5lc3NIb3VycykgewogICAgICAgIGFsbFNlZ3MgPSBbXTsKICAgICAgICByZWYxID0gdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXM7CiAgICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHJlZjEubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgICAgICByZXNvdXJjZSA9IHJlZjFba107CiAgICAgICAgICBidXNpbmVzc0hvdXJzID0gcmVzb3VyY2UuYnVzaW5lc3NIb3VycyB8fCB0aGlzLnZpZXcub3B0KCdidXNpbmVzc0hvdXJzJyk7CiAgICAgICAgICBldmVudHMgPSB0aGlzLnZpZXcuY2FsZW5kYXIuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyh3aG9sZURheSwgYnVzaW5lc3NIb3Vycyk7CiAgICAgICAgICBmb3IgKGwgPSAwLCBsZW4yID0gZXZlbnRzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICAgICAgICBldmVudCA9IGV2ZW50c1tsXTsKICAgICAgICAgICAgZXZlbnQucmVzb3VyY2VJZCA9IHJlc291cmNlLmlkOwogICAgICAgICAgfQogICAgICAgICAgc2VncyA9IHRoaXMuZXZlbnRzVG9TZWdzKGV2ZW50cyk7CiAgICAgICAgICBhbGxTZWdzLnB1c2guYXBwbHkoYWxsU2Vncywgc2Vncyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbGxTZWdzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn07CgpSZXNvdXJjZURheUdyaWQgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZURheUdyaWQsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZURheUdyaWQoKSB7CiAgICByZXR1cm4gUmVzb3VyY2VEYXlHcmlkLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgUmVzb3VyY2VEYXlHcmlkLm1peGluKFJlc291cmNlR3JpZE1peGluKTsKCiAgUmVzb3VyY2VEYXlHcmlkLm1peGluKFJlc291cmNlRGF5VGFibGVNaXhpbik7CgogIFJlc291cmNlRGF5R3JpZC5wcm90b3R5cGUuZ2V0SGl0U3BhbiA9IGZ1bmN0aW9uKGhpdCkgewogICAgdmFyIHNwYW47CiAgICBzcGFuID0gUmVzb3VyY2VEYXlHcmlkLl9fc3VwZXJfXy5nZXRIaXRTcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5yZXNvdXJjZUNudCkgewogICAgICBzcGFuLnJlc291cmNlSWQgPSB0aGlzLmdldENvbFJlc291cmNlKGhpdC5jb2wpLmlkOwogICAgfQogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgUmVzb3VyY2VEYXlHcmlkLnByb3RvdHlwZS5zcGFuVG9TZWdzID0gZnVuY3Rpb24oc3BhbikgewogICAgdmFyIGNvcHksIGdlbmVyaWNTZWdzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIHJlZiwgcmVzb3VyY2VDbnQsIHJlc291cmNlSW5kZXgsIHJlc291cmNlT2JqLCByZXNvdXJjZVNlZ3MsIHNlZzsKICAgIHJlc291cmNlQ250ID0gdGhpcy5yZXNvdXJjZUNudDsKICAgIGdlbmVyaWNTZWdzID0gdGhpcy5kYXRlc0Fib3ZlUmVzb3VyY2VzID8gdGhpcy5zbGljZVJhbmdlQnlEYXkoc3BhbikgOiB0aGlzLnNsaWNlUmFuZ2VCeVJvdyhzcGFuKTsKICAgIGlmICghcmVzb3VyY2VDbnQpIHsKICAgICAgZm9yIChqID0gMCwgbGVuID0gZ2VuZXJpY1NlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzZWcgPSBnZW5lcmljU2Vnc1tqXTsKICAgICAgICBpZiAodGhpcy5pc1JUTCkgewogICAgICAgICAgc2VnLmxlZnRDb2wgPSBzZWcubGFzdFJvd0RheUluZGV4OwogICAgICAgICAgc2VnLnJpZ2h0Q29sID0gc2VnLmZpcnN0Um93RGF5SW5kZXg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZy5sZWZ0Q29sID0gc2VnLmZpcnN0Um93RGF5SW5kZXg7CiAgICAgICAgICBzZWcucmlnaHRDb2wgPSBzZWcubGFzdFJvd0RheUluZGV4OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZ2VuZXJpY1NlZ3M7CiAgICB9IGVsc2UgewogICAgICByZXNvdXJjZVNlZ3MgPSBbXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IGdlbmVyaWNTZWdzLmxlbmd0aDsgayA8IGxlbjE7IGsrKykgewogICAgICAgIHNlZyA9IGdlbmVyaWNTZWdzW2tdOwogICAgICAgIGZvciAocmVzb3VyY2VJbmRleCA9IGwgPSAwLCByZWYgPSByZXNvdXJjZUNudDsgbCA8IHJlZjsgcmVzb3VyY2VJbmRleCA9IGwgKz0gMSkgewogICAgICAgICAgcmVzb3VyY2VPYmogPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlc1tyZXNvdXJjZUluZGV4XTsKICAgICAgICAgIGlmICghc3Bhbi5yZXNvdXJjZUlkIHx8IHNwYW4ucmVzb3VyY2VJZCA9PT0gcmVzb3VyY2VPYmouaWQpIHsKICAgICAgICAgICAgY29weSA9ICQuZXh0ZW5kKHt9LCBzZWcpOwogICAgICAgICAgICBjb3B5LnJlc291cmNlID0gcmVzb3VyY2VPYmo7CiAgICAgICAgICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgICAgICAgICAgY29weS5sZWZ0Q29sID0gdGhpcy5pbmRpY2VzVG9Db2wocmVzb3VyY2VJbmRleCwgc2VnLmxhc3RSb3dEYXlJbmRleCk7CiAgICAgICAgICAgICAgY29weS5yaWdodENvbCA9IHRoaXMuaW5kaWNlc1RvQ29sKHJlc291cmNlSW5kZXgsIHNlZy5maXJzdFJvd0RheUluZGV4KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb3B5LmxlZnRDb2wgPSB0aGlzLmluZGljZXNUb0NvbChyZXNvdXJjZUluZGV4LCBzZWcuZmlyc3RSb3dEYXlJbmRleCk7CiAgICAgICAgICAgICAgY29weS5yaWdodENvbCA9IHRoaXMuaW5kaWNlc1RvQ29sKHJlc291cmNlSW5kZXgsIHNlZy5sYXN0Um93RGF5SW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc291cmNlU2Vncy5wdXNoKGNvcHkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzb3VyY2VTZWdzOwogICAgfQogIH07CgogIFJlc291cmNlRGF5R3JpZC5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5jb21wdXRlUGVyUmVzb3VyY2VCdXNpbmVzc0hvdXJTZWdzKHRydWUpOwogICAgaWYgKHNlZ3MpIHsKICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRmlsbCgnYnVzaW5lc3NIb3VycycsIHNlZ3MsICdiZ2V2ZW50Jyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gUmVzb3VyY2VEYXlHcmlkLl9fc3VwZXJfXy5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlRGF5R3JpZDsKCn0pKEZDLkRheUdyaWQpOwoKUmVzb3VyY2VUaW1lR3JpZCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKFJlc291cmNlVGltZUdyaWQsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZVRpbWVHcmlkKCkgewogICAgcmV0dXJuIFJlc291cmNlVGltZUdyaWQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBSZXNvdXJjZVRpbWVHcmlkLm1peGluKFJlc291cmNlR3JpZE1peGluKTsKCiAgUmVzb3VyY2VUaW1lR3JpZC5taXhpbihSZXNvdXJjZURheVRhYmxlTWl4aW4pOwoKICBSZXNvdXJjZVRpbWVHcmlkLnByb3RvdHlwZS5nZXRIaXRTcGFuID0gZnVuY3Rpb24oaGl0KSB7CiAgICB2YXIgc3BhbjsKICAgIHNwYW4gPSBSZXNvdXJjZVRpbWVHcmlkLl9fc3VwZXJfXy5nZXRIaXRTcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5yZXNvdXJjZUNudCkgewogICAgICBzcGFuLnJlc291cmNlSWQgPSB0aGlzLmdldENvbFJlc291cmNlKGhpdC5jb2wpLmlkOwogICAgfQogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgUmVzb3VyY2VUaW1lR3JpZC5wcm90b3R5cGUuc3BhblRvU2VncyA9IGZ1bmN0aW9uKHNwYW4pIHsKICAgIHZhciBjb3B5LCBnZW5lcmljU2VncywgaiwgaywgbCwgbGVuLCBsZW4xLCByZWYsIHJlc291cmNlQ250LCByZXNvdXJjZUluZGV4LCByZXNvdXJjZU9iaiwgcmVzb3VyY2VTZWdzLCBzZWc7CiAgICByZXNvdXJjZUNudCA9IHRoaXMucmVzb3VyY2VDbnQ7CiAgICBnZW5lcmljU2VncyA9IHRoaXMuc2xpY2VSYW5nZUJ5VGltZXMoc3Bhbik7CiAgICBpZiAoIXJlc291cmNlQ250KSB7CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IGdlbmVyaWNTZWdzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2VnID0gZ2VuZXJpY1NlZ3Nbal07CiAgICAgICAgc2VnLmNvbCA9IHNlZy5kYXlJbmRleDsKICAgICAgfQogICAgICByZXR1cm4gZ2VuZXJpY1NlZ3M7CiAgICB9IGVsc2UgewogICAgICByZXNvdXJjZVNlZ3MgPSBbXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IGdlbmVyaWNTZWdzLmxlbmd0aDsgayA8IGxlbjE7IGsrKykgewogICAgICAgIHNlZyA9IGdlbmVyaWNTZWdzW2tdOwogICAgICAgIGZvciAocmVzb3VyY2VJbmRleCA9IGwgPSAwLCByZWYgPSByZXNvdXJjZUNudDsgbCA8IHJlZjsgcmVzb3VyY2VJbmRleCA9IGwgKz0gMSkgewogICAgICAgICAgcmVzb3VyY2VPYmogPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlc1tyZXNvdXJjZUluZGV4XTsKICAgICAgICAgIGlmICghc3Bhbi5yZXNvdXJjZUlkIHx8IHNwYW4ucmVzb3VyY2VJZCA9PT0gcmVzb3VyY2VPYmouaWQpIHsKICAgICAgICAgICAgY29weSA9ICQuZXh0ZW5kKHt9LCBzZWcpOwogICAgICAgICAgICBjb3B5LnJlc291cmNlID0gcmVzb3VyY2VPYmo7CiAgICAgICAgICAgIGNvcHkuY29sID0gdGhpcy5pbmRpY2VzVG9Db2wocmVzb3VyY2VJbmRleCwgc2VnLmRheUluZGV4KTsKICAgICAgICAgICAgcmVzb3VyY2VTZWdzLnB1c2goY29weSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXNvdXJjZVNlZ3M7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lR3JpZC5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5jb21wdXRlUGVyUmVzb3VyY2VCdXNpbmVzc0hvdXJTZWdzKGZhbHNlKTsKICAgIGlmIChzZWdzKSB7CiAgICAgIHJldHVybiB0aGlzLnJlbmRlckJ1c2luZXNzU2VncyhzZWdzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBSZXNvdXJjZVRpbWVHcmlkLl9fc3VwZXJfXy5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlVGltZUdyaWQ7Cgp9KShGQy5UaW1lR3JpZCk7CgpUaW1lbGluZVZpZXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChUaW1lbGluZVZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBUaW1lbGluZVZpZXcoKSB7CiAgICByZXR1cm4gVGltZWxpbmVWaWV3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS50aW1lR3JpZCA9IG51bGw7CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuaXNTY3JvbGxlZCA9IGZhbHNlOwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlR3JpZCgpOwogICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWxEdXJhdGlvbiA9IHRoaXMudGltZUdyaWQuZHVyYXRpb247CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnN0YW50aWF0ZUdyaWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBuZXcgVGltZWxpbmVHcmlkKHRoaXMpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0UmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgewogICAgVGltZWxpbmVWaWV3Ll9fc3VwZXJfXy5zZXRSYW5nZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuc2V0UmFuZ2UocmFuZ2UpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuYWRkQ2xhc3MoJ2ZjLXRpbWVsaW5lJyk7CiAgICBpZiAodGhpcy5vcHQoJ2V2ZW50T3ZlcmxhcCcpID09PSBmYWxzZSkgewogICAgICB0aGlzLmVsLmFkZENsYXNzKCdmYy1uby1vdmVybGFwJyk7CiAgICB9CiAgICB0aGlzLmVsLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSk7CiAgICByZXR1cm4gdGhpcy5yZW5kZXJUaW1lR3JpZFNrZWxldG9uKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbkh0bWwgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiAnPHRhYmxlPiA8dGhlYWQgY2xhc3M9ImZjLWhlYWQiPiA8dHI+IDx0ZCBjbGFzcz0iZmMtdGltZS1hcmVhICcgKyB0aGlzLndpZGdldEhlYWRlckNsYXNzICsgJyI+PC90ZD4gPC90cj4gPC90aGVhZD4gPHRib2R5IGNsYXNzPSJmYy1ib2R5Ij4gPHRyPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnICsgdGhpcy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIj48L3RkPiA8L3RyPiA8L3Rib2R5PiA8L3RhYmxlPic7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJUaW1lR3JpZFNrZWxldG9uID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRpbWVHcmlkLnNldEVsZW1lbnQodGhpcy5lbC5maW5kKCd0Ym9keSAuZmMtdGltZS1hcmVhJykpOwogICAgdGhpcy50aW1lR3JpZC5oZWFkRWwgPSB0aGlzLmVsLmZpbmQoJ3RoZWFkIC5mYy10aW1lLWFyZWEnKTsKICAgIHRoaXMudGltZUdyaWQucmVuZGVyU2tlbGV0b24oKTsKICAgIHRoaXMuaXNTY3JvbGxlZCA9IGZhbHNlOwogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuYm9keVNjcm9sbGVyLm9uKCdzY3JvbGwnLCBwcm94eSh0aGlzLCAnaGFuZGxlQm9keVNjcm9sbCcpKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLmhhbmRsZUJvZHlTY3JvbGwgPSBmdW5jdGlvbih0b3AsIGxlZnQpIHsKICAgIGlmICh0b3ApIHsKICAgICAgaWYgKCF0aGlzLmlzU2Nyb2xsZWQpIHsKICAgICAgICB0aGlzLmlzU2Nyb2xsZWQgPSB0cnVlOwogICAgICAgIHJldHVybiB0aGlzLmVsLmFkZENsYXNzKCdmYy1zY3JvbGxlZCcpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAodGhpcy5pc1Njcm9sbGVkKSB7CiAgICAgICAgdGhpcy5pc1Njcm9sbGVkID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRoaXMuZWwucmVtb3ZlQ2xhc3MoJ2ZjLXNjcm9sbGVkJyk7CiAgICAgIH0KICAgIH0KICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnVucmVuZGVyU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZUdyaWQucmVtb3ZlRWxlbWVudCgpOwogICAgdGhpcy5oYW5kbGVCb2R5U2Nyb2xsKDApOwogICAgcmV0dXJuIFRpbWVsaW5lVmlldy5fX3N1cGVyX18udW5yZW5kZXJTa2VsZXRvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyRGF0ZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckRhdGVzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS51bnJlbmRlckRhdGVzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlckRhdGVzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJCdXNpbmVzc0hvdXJzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS51bnJlbmRlckJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuZ2V0Tm93SW5kaWNhdG9yVW5pdCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0Tm93SW5kaWNhdG9yVW5pdCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyTm93SW5kaWNhdG9yID0gZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyTm93SW5kaWNhdG9yKGRhdGUpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUudW5yZW5kZXJOb3dJbmRpY2F0b3IgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyTm93SW5kaWNhdG9yKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5wcmVwYXJlSGl0cyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQucHJlcGFyZUhpdHMoKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlbGVhc2VIaXRzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5yZWxlYXNlSGl0cygpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucXVlcnlIaXQgPSBmdW5jdGlvbihsZWZ0T2Zmc2V0LCB0b3BPZmZzZXQpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnF1ZXJ5SGl0KGxlZnRPZmZzZXQsIHRvcE9mZnNldCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5nZXRIaXRTcGFuID0gZnVuY3Rpb24oaGl0KSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRIaXRTcGFuKGhpdCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5nZXRIaXRFbCA9IGZ1bmN0aW9uKGhpdCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0SGl0RWwoaGl0KTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnVwZGF0ZVdpZHRoID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51cGRhdGVXaWR0aCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24odG90YWxIZWlnaHQsIGlzQXV0bykgewogICAgdmFyIGJvZHlIZWlnaHQ7CiAgICBpZiAoaXNBdXRvKSB7CiAgICAgIGJvZHlIZWlnaHQgPSAnYXV0byc7CiAgICB9IGVsc2UgewogICAgICBib2R5SGVpZ2h0ID0gdG90YWxIZWlnaHQgLSB0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoKSAtIHRoaXMucXVlcnlNaXNjSGVpZ2h0KCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuc2V0SGVpZ2h0KGJvZHlIZWlnaHQpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucXVlcnlNaXNjSGVpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lbC5vdXRlckhlaWdodCgpIC0gdGhpcy50aW1lR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSAtIHRoaXMudGltZUdyaWQuYm9keVNjcm9sbGVyLmVsLm91dGVySGVpZ2h0KCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5jb21wdXRlSW5pdGlhbFNjcm9sbCA9IGZ1bmN0aW9uKHByZXZTY3JvbGxTdGF0ZSkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuY29tcHV0ZUluaXRpYWxTY3JvbGwocHJldlNjcm9sbFN0YXRlKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnF1ZXJ5U2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5xdWVyeVNjcm9sbCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0U2Nyb2xsID0gZnVuY3Rpb24oc3RhdGUpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnNldFNjcm9sbChzdGF0ZSk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJFdmVudHMgPSBmdW5jdGlvbihldmVudHMpIHsKICAgIHRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKGV2ZW50cyk7CiAgICByZXR1cm4gdGhpcy51cGRhdGVXaWR0aCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUudW5yZW5kZXJFdmVudHMgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpZHRoKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJEcmFnID0gZnVuY3Rpb24oZHJvcExvY2F0aW9uLCBzZWcpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckRyYWcoZHJvcExvY2F0aW9uLCBzZWcpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUudW5yZW5kZXJEcmFnID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlckRyYWcoKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLmdldEV2ZW50U2VncyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0RXZlbnRTZWdzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJTZWxlY3Rpb24gPSBmdW5jdGlvbihyYW5nZSkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyU2VsZWN0aW9uKHJhbmdlKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnVucmVuZGVyU2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlclNlbGVjdGlvbigpOwogIH07CgogIHJldHVybiBUaW1lbGluZVZpZXc7Cgp9KShWaWV3KTsKCmNzc1RvU3RyID0gRkMuY3NzVG9TdHI7CgpUaW1lbGluZUdyaWQgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChUaW1lbGluZUdyaWQsIHN1cGVyQ2xhc3MpOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsb3REYXRlcyA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2xvdENudCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc25hcENudCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc25hcHNQZXJTbG90ID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbmFwRGlmZlRvSW5kZXggPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNuYXBJbmRleFRvRGlmZiA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaGVhZEVsID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbGF0Q29udGFpbmVyRWwgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsYXRFbHMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbnRhaW5lckNvb3JkQ2FjaGUgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsYXRDb29yZENhY2hlID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbGF0SW5uZXJDb29yZENhY2hlID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWFkU2Nyb2xsZXIgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmJvZHlTY3JvbGxlciA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuam9pbmVyID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5mb2xsb3dlciA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZXZlbnRUaXRsZUZvbGxvd2VyID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5taW5UaW1lID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5tYXhUaW1lID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS50aW1lV2luZG93TXMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsb3REdXJhdGlvbiA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc25hcER1cmF0aW9uID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5kdXJhdGlvbiA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUubGFiZWxJbnRlcnZhbCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaGVhZGVyRm9ybWF0cyA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaXNUaW1lU2NhbGUgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmxhcmdlVW5pdCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZW1waGFzaXplV2Vla3MgPSBmYWxzZTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS50aXRsZUZvbGxvd2VyID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zZWdDb250YWluZXJFbCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2VnQ29udGFpbmVySGVpZ2h0ID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5iZ1NlZ0NvbnRhaW5lckVsID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWxwZXJFbHMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmlubmVyRWwgPSBudWxsOwoKICBmdW5jdGlvbiBUaW1lbGluZUdyaWQoKSB7CiAgICB2YXIgaW5wdXQ7CiAgICBUaW1lbGluZUdyaWQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB0aGlzLmluaXRTY2FsZVByb3BzKCk7CiAgICB0aGlzLm1pblRpbWUgPSBtb21lbnQuZHVyYXRpb24odGhpcy5vcHQoJ21pblRpbWUnKSB8fCAnMDA6MDAnKTsKICAgIHRoaXMubWF4VGltZSA9IG1vbWVudC5kdXJhdGlvbih0aGlzLm9wdCgnbWF4VGltZScpIHx8ICcyNDowMCcpOwogICAgdGhpcy50aW1lV2luZG93TXMgPSB0aGlzLm1heFRpbWUgLSB0aGlzLm1pblRpbWU7CiAgICB0aGlzLnNuYXBEdXJhdGlvbiA9IChpbnB1dCA9IHRoaXMub3B0KCdzbmFwRHVyYXRpb24nKSkgPyBtb21lbnQuZHVyYXRpb24oaW5wdXQpIDogdGhpcy5zbG90RHVyYXRpb247CiAgICB0aGlzLm1pblJlc2l6ZUR1cmF0aW9uID0gdGhpcy5zbmFwRHVyYXRpb247CiAgICB0aGlzLnNuYXBzUGVyU2xvdCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbih0aGlzLnNsb3REdXJhdGlvbiwgdGhpcy5zbmFwRHVyYXRpb24pOwogICAgdGhpcy5zbG90V2lkdGggPSB0aGlzLm9wdCgnc2xvdFdpZHRoJyk7CiAgfQoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLm9wdCA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHJldHVybiB0aGlzLnZpZXcub3B0KG5hbWUpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaXNWYWxpZERhdGUgPSBmdW5jdGlvbihkYXRlKSB7CiAgICB2YXIgbXM7CiAgICBpZiAodGhpcy52aWV3LmlzSGlkZGVuRGF5KGRhdGUpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAodGhpcy5pc1RpbWVTY2FsZSkgewogICAgICBtcyA9IGRhdGUudGltZSgpIC0gdGhpcy5taW5UaW1lOwogICAgICBtcyA9ICgobXMgJSA4NjQwMDAwMCkgKyA4NjQwMDAwMCkgJSA4NjQwMDAwMDsKICAgICAgcmV0dXJuIG1zIDwgdGhpcy50aW1lV2luZG93TXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVEaXNwbGF5RXZlbnRUaW1lID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gIXRoaXMuaXNUaW1lU2NhbGU7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlRGlzcGxheUV2ZW50RW5kID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlRXZlbnRUaW1lRm9ybWF0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5vcHQoJ2V4dHJhU21hbGxUaW1lRm9ybWF0Jyk7CiAgfTsKCgogIC8qCiAgCU1ha2VzIHRoZSBnaXZlbiBkYXRlIGNvbnNpc3RlbnQgd2l0aCBpc1RpbWVTY2FsZS9sYXJnZVVuaXQsCiAgCXNvLCBlaXRoZXIgcmVtb3ZlcyB0aGUgdGltZXMsIGVuc3VyZXMgYSB0aW1lLCBvciBtYWtlcyBpdCB0aGUgc3RhcnRPZiBsYXJnZVVuaXQuCiAgCVN0cmlwcyBhbGwgdGltZXpvbmVzLiBSZXR1cm5zIG5ldyBjb3B5LgogIAlUT0RPOiBzaG91bGQgbWF5YmUgYmUgY2FsbGVkICJub3JtYWxpemVSYW5nZURhdGUiLgogICAqLwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLm5vcm1hbGl6ZUdyaWREYXRlID0gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIG5vcm1hbERhdGU7CiAgICBpZiAodGhpcy5pc1RpbWVTY2FsZSkgewogICAgICBub3JtYWxEYXRlID0gZGF0ZS5jbG9uZSgpOwogICAgICBpZiAoIW5vcm1hbERhdGUuaGFzVGltZSgpKSB7CiAgICAgICAgbm9ybWFsRGF0ZS50aW1lKDApOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBub3JtYWxEYXRlID0gZGF0ZS5jbG9uZSgpLnN0cmlwVGltZSgpOwogICAgICBpZiAodGhpcy5sYXJnZVVuaXQpIHsKICAgICAgICBub3JtYWxEYXRlLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9ybWFsRGF0ZTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLm5vcm1hbGl6ZUdyaWRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICB2YXIgYWRqdXN0ZWRFbmQsIG5vcm1hbFJhbmdlOwogICAgaWYgKHRoaXMuaXNUaW1lU2NhbGUpIHsKICAgICAgbm9ybWFsUmFuZ2UgPSB7CiAgICAgICAgc3RhcnQ6IHRoaXMubm9ybWFsaXplR3JpZERhdGUocmFuZ2Uuc3RhcnQpLAogICAgICAgIGVuZDogdGhpcy5ub3JtYWxpemVHcmlkRGF0ZShyYW5nZS5lbmQpCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBub3JtYWxSYW5nZSA9IHRoaXMudmlldy5jb21wdXRlRGF5UmFuZ2UocmFuZ2UpOwogICAgICBpZiAodGhpcy5sYXJnZVVuaXQpIHsKICAgICAgICBub3JtYWxSYW5nZS5zdGFydC5zdGFydE9mKHRoaXMubGFyZ2VVbml0KTsKICAgICAgICBhZGp1c3RlZEVuZCA9IG5vcm1hbFJhbmdlLmVuZC5jbG9uZSgpLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpOwogICAgICAgIGlmICghYWRqdXN0ZWRFbmQuaXNTYW1lKG5vcm1hbFJhbmdlLmVuZCkgfHwgIWFkanVzdGVkRW5kLmlzQWZ0ZXIobm9ybWFsUmFuZ2Uuc3RhcnQpKSB7CiAgICAgICAgICBhZGp1c3RlZEVuZC5hZGQodGhpcy5zbG90RHVyYXRpb24pOwogICAgICAgIH0KICAgICAgICBub3JtYWxSYW5nZS5lbmQgPSBhZGp1c3RlZEVuZDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vcm1hbFJhbmdlOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmFuZ2VVcGRhdGVkID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZGF0ZSwgc2xvdERhdGVzOwogICAgdGhpcy5zdGFydCA9IHRoaXMubm9ybWFsaXplR3JpZERhdGUodGhpcy5zdGFydCk7CiAgICB0aGlzLmVuZCA9IHRoaXMubm9ybWFsaXplR3JpZERhdGUodGhpcy5lbmQpOwogICAgaWYgKHRoaXMuaXNUaW1lU2NhbGUpIHsKICAgICAgdGhpcy5zdGFydC5hZGQodGhpcy5taW5UaW1lKTsKICAgICAgdGhpcy5lbmQuc3VidHJhY3QoMSwgJ2RheScpLmFkZCh0aGlzLm1heFRpbWUpOwogICAgfQogICAgc2xvdERhdGVzID0gW107CiAgICBkYXRlID0gdGhpcy5zdGFydC5jbG9uZSgpOwogICAgd2hpbGUgKGRhdGUgPCB0aGlzLmVuZCkgewogICAgICBpZiAodGhpcy5pc1ZhbGlkRGF0ZShkYXRlKSkgewogICAgICAgIHNsb3REYXRlcy5wdXNoKGRhdGUuY2xvbmUoKSk7CiAgICAgIH0KICAgICAgZGF0ZS5hZGQodGhpcy5zbG90RHVyYXRpb24pOwogICAgfQogICAgdGhpcy5zbG90RGF0ZXMgPSBzbG90RGF0ZXM7CiAgICByZXR1cm4gdGhpcy51cGRhdGVHcmlkRGF0ZXMoKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVwZGF0ZUdyaWREYXRlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGRhdGUsIHNuYXBEaWZmLCBzbmFwRGlmZlRvSW5kZXgsIHNuYXBJbmRleCwgc25hcEluZGV4VG9EaWZmOwogICAgc25hcEluZGV4ID0gLTE7CiAgICBzbmFwRGlmZiA9IDA7CiAgICBzbmFwRGlmZlRvSW5kZXggPSBbXTsKICAgIHNuYXBJbmRleFRvRGlmZiA9IFtdOwogICAgZGF0ZSA9IHRoaXMuc3RhcnQuY2xvbmUoKTsKICAgIHdoaWxlIChkYXRlIDwgdGhpcy5lbmQpIHsKICAgICAgaWYgKHRoaXMuaXNWYWxpZERhdGUoZGF0ZSkpIHsKICAgICAgICBzbmFwSW5kZXgrKzsKICAgICAgICBzbmFwRGlmZlRvSW5kZXgucHVzaChzbmFwSW5kZXgpOwogICAgICAgIHNuYXBJbmRleFRvRGlmZi5wdXNoKHNuYXBEaWZmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbmFwRGlmZlRvSW5kZXgucHVzaChzbmFwSW5kZXggKyAwLjUpOwogICAgICB9CiAgICAgIGRhdGUuYWRkKHRoaXMuc25hcER1cmF0aW9uKTsKICAgICAgc25hcERpZmYrKzsKICAgIH0KICAgIHRoaXMuc25hcERpZmZUb0luZGV4ID0gc25hcERpZmZUb0luZGV4OwogICAgdGhpcy5zbmFwSW5kZXhUb0RpZmYgPSBzbmFwSW5kZXhUb0RpZmY7CiAgICB0aGlzLnNuYXBDbnQgPSBzbmFwSW5kZXggKyAxOwogICAgcmV0dXJuIHRoaXMuc2xvdENudCA9IHRoaXMuc25hcENudCAvIHRoaXMuc25hcHNQZXJTbG90OwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc3BhblRvU2VncyA9IGZ1bmN0aW9uKHNwYW4pIHsKICAgIHZhciBub3JtYWxSYW5nZSwgc2VnOwogICAgbm9ybWFsUmFuZ2UgPSB0aGlzLm5vcm1hbGl6ZUdyaWRSYW5nZShzcGFuKTsKICAgIGlmICh0aGlzLmNvbXB1dGVEYXRlU25hcENvdmVyYWdlKHNwYW4uc3RhcnQpIDwgdGhpcy5jb21wdXRlRGF0ZVNuYXBDb3ZlcmFnZShzcGFuLmVuZCkpIHsKICAgICAgc2VnID0gaW50ZXJzZWN0UmFuZ2VzKG5vcm1hbFJhbmdlLCB0aGlzKTsKICAgICAgaWYgKHNlZykgewogICAgICAgIGlmIChzZWcuaXNTdGFydCAmJiAhdGhpcy5pc1ZhbGlkRGF0ZShzZWcuc3RhcnQpKSB7CiAgICAgICAgICBzZWcuaXNTdGFydCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoc2VnLmlzRW5kICYmIHNlZy5lbmQgJiYgIXRoaXMuaXNWYWxpZERhdGUoc2VnLmVuZC5jbG9uZSgpLnN1YnRyYWN0KDEpKSkgewogICAgICAgICAgc2VnLmlzRW5kID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbc2VnXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFtdOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucHJlcGFyZUhpdHMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmJ1aWxkQ29vcmRzKCk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeUhpdCA9IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewogICAgdmFyIGNvbnRhaW5lckNvb3JkQ2FjaGUsIGxvY2FsU25hcEluZGV4LCBwYXJ0aWFsLCBzbGF0Q29vcmRDYWNoZSwgc2xhdEluZGV4LCBzbGF0TGVmdCwgc2xhdFJpZ2h0LCBzbGF0V2lkdGgsIHNuYXBJbmRleCwgc25hcExlZnQsIHNuYXBSaWdodCwgc25hcHNQZXJTbG90OwogICAgc25hcHNQZXJTbG90ID0gdGhpcy5zbmFwc1BlclNsb3Q7CiAgICBzbGF0Q29vcmRDYWNoZSA9IHRoaXMuc2xhdENvb3JkQ2FjaGU7CiAgICBjb250YWluZXJDb29yZENhY2hlID0gdGhpcy5jb250YWluZXJDb29yZENhY2hlOwogICAgaWYgKGNvbnRhaW5lckNvb3JkQ2FjaGUuaXNUb3BJbkJvdW5kcyh0b3BPZmZzZXQpKSB7CiAgICAgIHNsYXRJbmRleCA9IHNsYXRDb29yZENhY2hlLmdldEhvcml6b250YWxJbmRleChsZWZ0T2Zmc2V0KTsKICAgICAgaWYgKHNsYXRJbmRleCAhPSBudWxsKSB7CiAgICAgICAgc2xhdFdpZHRoID0gc2xhdENvb3JkQ2FjaGUuZ2V0V2lkdGgoc2xhdEluZGV4KTsKICAgICAgICBpZiAodGhpcy5pc1JUTCkgewogICAgICAgICAgc2xhdFJpZ2h0ID0gc2xhdENvb3JkQ2FjaGUuZ2V0UmlnaHRPZmZzZXQoc2xhdEluZGV4KTsKICAgICAgICAgIHBhcnRpYWwgPSAoc2xhdFJpZ2h0IC0gbGVmdE9mZnNldCkgLyBzbGF0V2lkdGg7CiAgICAgICAgICBsb2NhbFNuYXBJbmRleCA9IE1hdGguZmxvb3IocGFydGlhbCAqIHNuYXBzUGVyU2xvdCk7CiAgICAgICAgICBzbmFwSW5kZXggPSBzbGF0SW5kZXggKiBzbmFwc1BlclNsb3QgKyBsb2NhbFNuYXBJbmRleDsKICAgICAgICAgIHNuYXBSaWdodCA9IHNsYXRSaWdodCAtIChsb2NhbFNuYXBJbmRleCAvIHNuYXBzUGVyU2xvdCkgKiBzbGF0V2lkdGg7CiAgICAgICAgICBzbmFwTGVmdCA9IHNuYXBSaWdodCAtICgobG9jYWxTbmFwSW5kZXggKyAxKSAvIHNuYXBzUGVyU2xvdCkgKiBzbGF0V2lkdGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNsYXRMZWZ0ID0gc2xhdENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChzbGF0SW5kZXgpOwogICAgICAgICAgcGFydGlhbCA9IChsZWZ0T2Zmc2V0IC0gc2xhdExlZnQpIC8gc2xhdFdpZHRoOwogICAgICAgICAgbG9jYWxTbmFwSW5kZXggPSBNYXRoLmZsb29yKHBhcnRpYWwgKiBzbmFwc1BlclNsb3QpOwogICAgICAgICAgc25hcEluZGV4ID0gc2xhdEluZGV4ICogc25hcHNQZXJTbG90ICsgbG9jYWxTbmFwSW5kZXg7CiAgICAgICAgICBzbmFwTGVmdCA9IHNsYXRMZWZ0ICsgKGxvY2FsU25hcEluZGV4IC8gc25hcHNQZXJTbG90KSAqIHNsYXRXaWR0aDsKICAgICAgICAgIHNuYXBSaWdodCA9IHNsYXRMZWZ0ICsgKChsb2NhbFNuYXBJbmRleCArIDEpIC8gc25hcHNQZXJTbG90KSAqIHNsYXRXaWR0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHNuYXA6IHNuYXBJbmRleCwKICAgICAgICAgIGNvbXBvbmVudDogdGhpcywKICAgICAgICAgIGxlZnQ6IHNuYXBMZWZ0LAogICAgICAgICAgcmlnaHQ6IHNuYXBSaWdodCwKICAgICAgICAgIHRvcDogY29udGFpbmVyQ29vcmRDYWNoZS5nZXRUb3BPZmZzZXQoMCksCiAgICAgICAgICBib3R0b206IGNvbnRhaW5lckNvb3JkQ2FjaGUuZ2V0Qm90dG9tT2Zmc2V0KDApCiAgICAgICAgfTsKICAgICAgfQogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZ2V0SGl0U3BhbiA9IGZ1bmN0aW9uKGhpdCkgewogICAgcmV0dXJuIHRoaXMuZ2V0U25hcFJhbmdlKGhpdC5zbmFwKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldEhpdEVsID0gZnVuY3Rpb24oaGl0KSB7CiAgICByZXR1cm4gdGhpcy5nZXRTbmFwRWwoaGl0LnNuYXApOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZ2V0U25hcFJhbmdlID0gZnVuY3Rpb24oc25hcEluZGV4KSB7CiAgICB2YXIgZW5kLCBzdGFydDsKICAgIHN0YXJ0ID0gdGhpcy5zdGFydC5jbG9uZSgpOwogICAgc3RhcnQuYWRkKG11bHRpcGx5RHVyYXRpb24odGhpcy5zbmFwRHVyYXRpb24sIHRoaXMuc25hcEluZGV4VG9EaWZmW3NuYXBJbmRleF0pKTsKICAgIGVuZCA9IHN0YXJ0LmNsb25lKCkuYWRkKHRoaXMuc25hcER1cmF0aW9uKTsKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0OiBzdGFydCwKICAgICAgZW5kOiBlbmQKICAgIH07CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5nZXRTbmFwRWwgPSBmdW5jdGlvbihzbmFwSW5kZXgpIHsKICAgIHJldHVybiB0aGlzLnNsYXRFbHMuZXEoTWF0aC5mbG9vcihzbmFwSW5kZXggLyB0aGlzLnNuYXBzUGVyU2xvdCkpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaGVhZFNjcm9sbGVyID0gbmV3IENsaXBwZWRTY3JvbGxlcih7CiAgICAgIG92ZXJmbG93WDogJ2NsaXBwZWQtc2Nyb2xsJywKICAgICAgb3ZlcmZsb3dZOiAnaGlkZGVuJwogICAgfSk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMgPSBuZXcgU2Nyb2xsZXJDYW52YXMoKTsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLnJlbmRlcigpOwogICAgdGhpcy5oZWFkRWwuYXBwZW5kKHRoaXMuaGVhZFNjcm9sbGVyLmVsKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyID0gbmV3IENsaXBwZWRTY3JvbGxlcigpOwogICAgdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzID0gbmV3IFNjcm9sbGVyQ2FudmFzKCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci5yZW5kZXIoKTsKICAgIHRoaXMuZWwuYXBwZW5kKHRoaXMuYm9keVNjcm9sbGVyLmVsKTsKICAgIHRoaXMuaW5uZXJFbCA9IHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWw7CiAgICB0aGlzLnNsYXRDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLXNsYXRzIi8+JykuYXBwZW5kVG8odGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmJnRWwpOwogICAgdGhpcy5zZWdDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciIvPicpLmFwcGVuZFRvKHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwpOwogICAgdGhpcy5iZ1NlZ0NvbnRhaW5lckVsID0gdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmJnRWw7CiAgICB0aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CiAgICAgIGVsczogdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLAogICAgICBpc0hvcml6b250YWw6IHRydWUsCiAgICAgIGlzVmVydGljYWw6IHRydWUKICAgIH0pOwogICAgdGhpcy5qb2luZXIgPSBuZXcgU2Nyb2xsSm9pbmVyKCdob3Jpem9udGFsJywgW3RoaXMuaGVhZFNjcm9sbGVyLCB0aGlzLmJvZHlTY3JvbGxlcl0pOwogICAgaWYgKHRydWUpIHsKICAgICAgdGhpcy5mb2xsb3dlciA9IG5ldyBTY3JvbGxGb2xsb3dlcih0aGlzLmhlYWRTY3JvbGxlciwgdGhpcy52aWV3LmNhbGVuZGFyLmlzVG91Y2gpOwogICAgfQogICAgaWYgKHRydWUpIHsKICAgICAgdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIgPSBuZXcgU2Nyb2xsRm9sbG93ZXIodGhpcy5ib2R5U2Nyb2xsZXIsIHRoaXMudmlldy5jYWxlbmRhci5pc1RvdWNoKTsKICAgICAgdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIubWluVHJhdmVsID0gNTA7CiAgICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgICAgdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY29udGFpbk9uTmF0dXJhbFJpZ2h0ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jb250YWluT25OYXR1cmFsTGVmdCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBUaW1lbGluZUdyaWQuX19zdXBlcl9fLnJlbmRlclNrZWxldG9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWFkQ29sRWxzID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbGF0Q29sRWxzID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJEYXRlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGRhdGUsIGksIGosIGxlbiwgcmVmOwogICAgdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5odG1sKHRoaXMucmVuZGVySGVhZEh0bWwoKSk7CiAgICB0aGlzLmhlYWRDb2xFbHMgPSB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoJ2NvbCcpOwogICAgdGhpcy5zbGF0Q29udGFpbmVyRWwuaHRtbCh0aGlzLnJlbmRlclNsYXRIdG1sKCkpOwogICAgdGhpcy5zbGF0Q29sRWxzID0gdGhpcy5zbGF0Q29udGFpbmVyRWwuZmluZCgnY29sJyk7CiAgICB0aGlzLnNsYXRFbHMgPSB0aGlzLnNsYXRDb250YWluZXJFbC5maW5kKCd0ZCcpOwogICAgdGhpcy5zbGF0Q29vcmRDYWNoZSA9IG5ldyBDb29yZENhY2hlKHsKICAgICAgZWxzOiB0aGlzLnNsYXRFbHMsCiAgICAgIGlzSG9yaXpvbnRhbDogdHJ1ZQogICAgfSk7CiAgICB0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CiAgICAgIGVsczogdGhpcy5zbGF0RWxzLmZpbmQoJz4gZGl2JyksCiAgICAgIGlzSG9yaXpvbnRhbDogdHJ1ZSwKICAgICAgb2Zmc2V0UGFyZW50OiB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuZWwKICAgIH0pOwogICAgcmVmID0gdGhpcy5zbG90RGF0ZXM7CiAgICBmb3IgKGkgPSBqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaSA9ICsraikgewogICAgICBkYXRlID0gcmVmW2ldOwogICAgICB0aGlzLnZpZXcudHJpZ2dlcignZGF5UmVuZGVyJywgbnVsbCwgZGF0ZSwgdGhpcy5zbGF0RWxzLmVxKGkpKTsKICAgIH0KICAgIGlmICh0aGlzLmZvbGxvd2VyKSB7CiAgICAgIHJldHVybiB0aGlzLmZvbGxvd2VyLnNldFNwcml0ZXModGhpcy5oZWFkRWwuZmluZCgndHI6bm90KDpsYXN0LWNoaWxkKSBzcGFuJykpOwogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJEYXRlcyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuZm9sbG93ZXIpIHsKICAgICAgdGhpcy5mb2xsb3dlci5jbGVhclNwcml0ZXMoKTsKICAgIH0KICAgIHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZW1wdHkoKTsKICAgIHRoaXMuc2xhdENvbnRhaW5lckVsLmVtcHR5KCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY2xlYXJXaWR0aCgpOwogICAgcmV0dXJuIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jbGVhcldpZHRoKCk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJIZWFkSHRtbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNlbGwsIGNlbGxSb3dzLCBkYXRlLCBkYXRlRGF0YSwgZm9ybWF0LCBmb3JtYXRzLCBodG1sLCBpLCBpc0Nocm9ubywgaXNMYXN0LCBpc1N1cGVyUm93LCBpc1dlZWtTdGFydCwgaiwgaywgbCwgbGFiZWxJbnRlcnZhbCwgbGVhZGluZ0NlbGwsIGxlbiwgbGVuMSwgbGVuMiwgbGVuMywgbGVuNCwgbGVuNSwgbGVuNiwgbSwgbiwgbmV3Q2VsbCwgcCwgcHJldldlZWtOdW1iZXIsIHEsIHJvdywgcm93Q2VsbHMsIHNsYXRIdG1sLCBzbG90Q2VsbHMsIHNsb3REYXRlcywgdGV4dCwgd2Vla051bWJlcjsKICAgIGxhYmVsSW50ZXJ2YWwgPSB0aGlzLmxhYmVsSW50ZXJ2YWw7CiAgICBmb3JtYXRzID0gdGhpcy5oZWFkZXJGb3JtYXRzOwogICAgY2VsbFJvd3MgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gZm9ybWF0cy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIGZvcm1hdCA9IGZvcm1hdHNbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKFtdKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pKCk7CiAgICBsZWFkaW5nQ2VsbCA9IG51bGw7CiAgICBwcmV2V2Vla051bWJlciA9IG51bGw7CiAgICBzbG90RGF0ZXMgPSB0aGlzLnNsb3REYXRlczsKICAgIHNsb3RDZWxscyA9IFtdOwogICAgZm9yIChqID0gMCwgbGVuID0gc2xvdERhdGVzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGRhdGUgPSBzbG90RGF0ZXNbal07CiAgICAgIHdlZWtOdW1iZXIgPSBkYXRlLndlZWsoKTsKICAgICAgaXNXZWVrU3RhcnQgPSB0aGlzLmVtcGhhc2l6ZVdlZWtzICYmIHByZXZXZWVrTnVtYmVyICE9PSBudWxsICYmIHByZXZXZWVrTnVtYmVyICE9PSB3ZWVrTnVtYmVyOwogICAgICBmb3IgKHJvdyA9IGsgPSAwLCBsZW4xID0gZm9ybWF0cy5sZW5ndGg7IGsgPCBsZW4xOyByb3cgPSArK2spIHsKICAgICAgICBmb3JtYXQgPSBmb3JtYXRzW3Jvd107CiAgICAgICAgcm93Q2VsbHMgPSBjZWxsUm93c1tyb3ddOwogICAgICAgIGxlYWRpbmdDZWxsID0gcm93Q2VsbHNbcm93Q2VsbHMubGVuZ3RoIC0gMV07CiAgICAgICAgaXNTdXBlclJvdyA9IGZvcm1hdHMubGVuZ3RoID4gMSAmJiByb3cgPCBmb3JtYXRzLmxlbmd0aCAtIDE7CiAgICAgICAgbmV3Q2VsbCA9IG51bGw7CiAgICAgICAgaWYgKGlzU3VwZXJSb3cpIHsKICAgICAgICAgIHRleHQgPSBkYXRlLmZvcm1hdChmb3JtYXQpOwogICAgICAgICAgZGF0ZURhdGEgPSBkYXRlLmZvcm1hdCgpOwogICAgICAgICAgaWYgKCFsZWFkaW5nQ2VsbCB8fCBsZWFkaW5nQ2VsbC50ZXh0ICE9PSB0ZXh0KSB7CiAgICAgICAgICAgIG5ld0NlbGwgPSB7CiAgICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgICBkYXRlRGF0YTogZGF0ZURhdGEsCiAgICAgICAgICAgICAgY29sc3BhbjogMQogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGVhZGluZ0NlbGwuY29sc3BhbiArPSAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIWxlYWRpbmdDZWxsIHx8IGlzSW50KGRpdmlkZVJhbmdlQnlEdXJhdGlvbih0aGlzLnN0YXJ0LCBkYXRlLCBsYWJlbEludGVydmFsKSkpIHsKICAgICAgICAgICAgdGV4dCA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7CiAgICAgICAgICAgIGRhdGVEYXRhID0gZGF0ZS5mb3JtYXQoKTsKICAgICAgICAgICAgbmV3Q2VsbCA9IHsKICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICAgIGRhdGVEYXRhOiBkYXRlRGF0YSwKICAgICAgICAgICAgICBjb2xzcGFuOiAxCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZWFkaW5nQ2VsbC5jb2xzcGFuICs9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChuZXdDZWxsKSB7CiAgICAgICAgICBuZXdDZWxsLndlZWtTdGFydCA9IGlzV2Vla1N0YXJ0OwogICAgICAgICAgcm93Q2VsbHMucHVzaChuZXdDZWxsKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2xvdENlbGxzLnB1c2goewogICAgICAgIHdlZWtTdGFydDogaXNXZWVrU3RhcnQKICAgICAgfSk7CiAgICAgIHByZXZXZWVrTnVtYmVyID0gd2Vla051bWJlcjsKICAgIH0KICAgIGlzQ2hyb25vID0gbGFiZWxJbnRlcnZhbCA+IHRoaXMuc2xvdER1cmF0aW9uOwogICAgaHRtbCA9ICc8dGFibGU+JzsKICAgIGh0bWwgKz0gJzxjb2xncm91cD4nOwogICAgZm9yIChsID0gMCwgbGVuMiA9IHNsb3REYXRlcy5sZW5ndGg7IGwgPCBsZW4yOyBsKyspIHsKICAgICAgZGF0ZSA9IHNsb3REYXRlc1tsXTsKICAgICAgaHRtbCArPSAnPGNvbC8+JzsKICAgIH0KICAgIGh0bWwgKz0gJzwvY29sZ3JvdXA+JzsKICAgIGh0bWwgKz0gJzx0Ym9keT4nOwogICAgZm9yIChpID0gbSA9IDAsIGxlbjMgPSBjZWxsUm93cy5sZW5ndGg7IG0gPCBsZW4zOyBpID0gKyttKSB7CiAgICAgIHJvd0NlbGxzID0gY2VsbFJvd3NbaV07CiAgICAgIGlzTGFzdCA9IGkgPT09IGNlbGxSb3dzLmxlbmd0aCAtIDE7CiAgICAgIGh0bWwgKz0gJzx0cicgKyAoaXNDaHJvbm8gJiYgaXNMYXN0ID8gJyBjbGFzcz0iZmMtY2hyb25vIicgOiAnJykgKyAnPic7CiAgICAgIGZvciAobiA9IDAsIGxlbjQgPSByb3dDZWxscy5sZW5ndGg7IG4gPCBsZW40OyBuKyspIHsKICAgICAgICBjZWxsID0gcm93Q2VsbHNbbl07CiAgICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyAnICsgKGNlbGwud2Vla1N0YXJ0ID8gJ2ZjLWVtLWNlbGwnIDogJycpICsgJyInICsgJyBkYXRhLWRhdGU9IicgKyBjZWxsLmRhdGVEYXRhICsgJyInICsgKGNlbGwuY29sc3BhbiA+IDEgPyAnIGNvbHNwYW49IicgKyBjZWxsLmNvbHNwYW4gKyAnIicgOiAnJykgKyAnPicgKyAnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nICsgJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicgKyBodG1sRXNjYXBlKGNlbGwudGV4dCkgKyAnPC9zcGFuPicgKyAnPC9kaXY+JyArICc8L3RoPic7CiAgICAgIH0KICAgICAgaHRtbCArPSAnPC90cj4nOwogICAgfQogICAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPic7CiAgICBzbGF0SHRtbCA9ICc8dGFibGU+JzsKICAgIHNsYXRIdG1sICs9ICc8Y29sZ3JvdXA+JzsKICAgIGZvciAocCA9IDAsIGxlbjUgPSBzbG90Q2VsbHMubGVuZ3RoOyBwIDwgbGVuNTsgcCsrKSB7CiAgICAgIGNlbGwgPSBzbG90Q2VsbHNbcF07CiAgICAgIHNsYXRIdG1sICs9ICc8Y29sLz4nOwogICAgfQogICAgc2xhdEh0bWwgKz0gJzwvY29sZ3JvdXA+JzsKICAgIHNsYXRIdG1sICs9ICc8dGJvZHk+PHRyPic7CiAgICBmb3IgKGkgPSBxID0gMCwgbGVuNiA9IHNsb3RDZWxscy5sZW5ndGg7IHEgPCBsZW42OyBpID0gKytxKSB7CiAgICAgIGNlbGwgPSBzbG90Q2VsbHNbaV07CiAgICAgIGRhdGUgPSBzbG90RGF0ZXNbaV07CiAgICAgIHNsYXRIdG1sICs9IHRoaXMuc2xhdENlbGxIdG1sKGRhdGUsIGNlbGwud2Vla1N0YXJ0KTsKICAgIH0KICAgIHNsYXRIdG1sICs9ICc8L3RyPjwvdGJvZHk+PC90YWJsZT4nOwogICAgdGhpcy5fc2xhdEh0bWwgPSBzbGF0SHRtbDsKICAgIHJldHVybiBodG1sOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyU2xhdEh0bWwgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLl9zbGF0SHRtbDsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsYXRDZWxsSHRtbCA9IGZ1bmN0aW9uKGRhdGUsIGlzRW0pIHsKICAgIHZhciBjbGFzc2VzOwogICAgaWYgKHRoaXMuaXNUaW1lU2NhbGUpIHsKICAgICAgY2xhc3NlcyA9IFtdOwogICAgICBjbGFzc2VzLnB1c2goaXNJbnQoZGl2aWRlUmFuZ2VCeUR1cmF0aW9uKHRoaXMuc3RhcnQsIGRhdGUsIHRoaXMubGFiZWxJbnRlcnZhbCkpID8gJ2ZjLW1ham9yJyA6ICdmYy1taW5vcicpOwogICAgfSBlbHNlIHsKICAgICAgY2xhc3NlcyA9IHRoaXMuZ2V0RGF5Q2xhc3NlcyhkYXRlKTsKICAgICAgY2xhc3Nlcy5wdXNoKCdmYy1kYXknKTsKICAgIH0KICAgIGNsYXNzZXMudW5zaGlmdCh0aGlzLnZpZXcud2lkZ2V0Q29udGVudENsYXNzKTsKICAgIGlmIChpc0VtKSB7CiAgICAgIGNsYXNzZXMucHVzaCgnZmMtZW0tY2VsbCcpOwogICAgfQogICAgcmV0dXJuICc8dGQgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciJyArICcgZGF0YS1kYXRlPSInICsgZGF0ZS5mb3JtYXQoKSArICciJyArICc+PGRpdiAvPjwvdGQ+JzsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmJ1c2luZXNzSG91clNlZ3MgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBzZWdzOwogICAgaWYgKCF0aGlzLmxhcmdlVW5pdCkgewogICAgICBzZWdzID0gdGhpcy5idXNpbmVzc0hvdXJTZWdzID0gdGhpcy5idWlsZEJ1c2luZXNzSG91clNlZ3MoIXRoaXMuaXNUaW1lU2NhbGUpOwogICAgICByZXR1cm4gdGhpcy5yZW5kZXJGaWxsKCdidXNpbmVzc0hvdXJzJywgc2VncywgJ2JnZXZlbnQnKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudW5yZW5kZXJGaWxsKCdidXNpbmVzc0hvdXJzJyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5ub3dJbmRpY2F0b3JFbHMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldE5vd0luZGljYXRvclVuaXQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzVGltZVNjYWxlKSB7CiAgICAgIHJldHVybiBjb21wdXRlSW50ZXJ2YWxVbml0KHRoaXMuc2xvdER1cmF0aW9uKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbmRlck5vd0luZGljYXRvciA9IGZ1bmN0aW9uKGRhdGUpIHsKICAgIHZhciBjb29yZCwgY3NzLCBub2RlczsKICAgIG5vZGVzID0gW107CiAgICBkYXRlID0gdGhpcy5ub3JtYWxpemVHcmlkRGF0ZShkYXRlKTsKICAgIGlmIChkYXRlID49IHRoaXMuc3RhcnQgJiYgZGF0ZSA8IHRoaXMuZW5kKSB7CiAgICAgIGNvb3JkID0gdGhpcy5kYXRlVG9Db29yZChkYXRlKTsKICAgICAgY3NzID0gdGhpcy5pc1JUTCA/IHsKICAgICAgICByaWdodDogLWNvb3JkCiAgICAgIH0gOiB7CiAgICAgICAgbGVmdDogY29vcmQKICAgICAgfTsKICAgICAgbm9kZXMucHVzaCgkKCI8ZGl2IGNsYXNzPSdmYy1ub3ctaW5kaWNhdG9yIGZjLW5vdy1pbmRpY2F0b3ItYXJyb3cnPjwvZGl2PiIpLmNzcyhjc3MpLmFwcGVuZFRvKHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5lbClbMF0pOwogICAgICBub2Rlcy5wdXNoKCQoIjxkaXYgY2xhc3M9J2ZjLW5vdy1pbmRpY2F0b3IgZmMtbm93LWluZGljYXRvci1saW5lJz48L2Rpdj4iKS5jc3MoY3NzKS5hcHBlbmRUbyh0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuZWwpWzBdKTsKICAgIH0KICAgIHJldHVybiB0aGlzLm5vd0luZGljYXRvckVscyA9ICQobm9kZXMpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJOb3dJbmRpY2F0b3IgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLm5vd0luZGljYXRvckVscykgewogICAgICB0aGlzLm5vd0luZGljYXRvckVscy5yZW1vdmUoKTsKICAgICAgcmV0dXJuIHRoaXMubm93SW5kaWNhdG9yRWxzID0gbnVsbDsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmV4cGxpY2l0U2xvdFdpZHRoID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5kZWZhdWx0U2xvdFdpZHRoID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS51cGRhdGVXaWR0aCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGF2YWlsYWJsZVdpZHRoLCBjb250YWluZXJNaW5XaWR0aCwgY29udGFpbmVyV2lkdGgsIG5vbkxhc3RTbG90V2lkdGgsIHNsb3RXaWR0aDsKICAgIHNsb3RXaWR0aCA9IE1hdGgucm91bmQodGhpcy5zbG90V2lkdGggfHwgKHRoaXMuc2xvdFdpZHRoID0gdGhpcy5jb21wdXRlU2xvdFdpZHRoKCkpKTsKICAgIGNvbnRhaW5lcldpZHRoID0gc2xvdFdpZHRoICogdGhpcy5zbG90RGF0ZXMubGVuZ3RoOwogICAgY29udGFpbmVyTWluV2lkdGggPSAnJzsKICAgIG5vbkxhc3RTbG90V2lkdGggPSBzbG90V2lkdGg7CiAgICBhdmFpbGFibGVXaWR0aCA9IHRoaXMuYm9keVNjcm9sbGVyLmdldENsaWVudFdpZHRoKCk7CiAgICBpZiAoYXZhaWxhYmxlV2lkdGggPiBjb250YWluZXJXaWR0aCkgewogICAgICBjb250YWluZXJNaW5XaWR0aCA9IGF2YWlsYWJsZVdpZHRoOwogICAgICBjb250YWluZXJXaWR0aCA9ICcnOwogICAgICBub25MYXN0U2xvdFdpZHRoID0gTWF0aC5mbG9vcihhdmFpbGFibGVXaWR0aCAvIHRoaXMuc2xvdERhdGVzLmxlbmd0aCk7CiAgICB9CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuc2V0V2lkdGgoY29udGFpbmVyV2lkdGgpOwogICAgdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLnNldE1pbldpZHRoKGNvbnRhaW5lck1pbldpZHRoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5zZXRXaWR0aChjb250YWluZXJXaWR0aCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuc2V0TWluV2lkdGgoY29udGFpbmVyTWluV2lkdGgpOwogICAgdGhpcy5oZWFkQ29sRWxzLnNsaWNlKDAsIC0xKS5hZGQodGhpcy5zbGF0Q29sRWxzLnNsaWNlKDAsIC0xKSkud2lkdGgobm9uTGFzdFNsb3RXaWR0aCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci51cGRhdGVTaXplKCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci51cGRhdGVTaXplKCk7CiAgICB0aGlzLmpvaW5lci51cGRhdGUoKTsKICAgIHRoaXMuYnVpbGRDb29yZHMoKTsKICAgIHRoaXMudXBkYXRlU2VnUG9zaXRpb25zKCk7CiAgICB0aGlzLnZpZXcudXBkYXRlTm93SW5kaWNhdG9yKCk7CiAgICBpZiAodGhpcy5mb2xsb3dlcikgewogICAgICB0aGlzLmZvbGxvd2VyLnVwZGF0ZSgpOwogICAgfQogICAgaWYgKHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci51cGRhdGUoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVTbG90V2lkdGggPSBmdW5jdGlvbigpIHsKICAgIHZhciBoZWFkZXJXaWR0aCwgaW5uZXJFbHMsIG1heElubmVyV2lkdGgsIG1pbldpZHRoLCBzbG90V2lkdGgsIHNsb3RzUGVyTGFiZWw7CiAgICBtYXhJbm5lcldpZHRoID0gMDsKICAgIGlubmVyRWxzID0gdGhpcy5oZWFkRWwuZmluZCgndHI6bGFzdC1jaGlsZCB0aCBzcGFuJyk7CiAgICBpbm5lckVscy5lYWNoKGZ1bmN0aW9uKGksIG5vZGUpIHsKICAgICAgdmFyIGlubmVyV2lkdGg7CiAgICAgIGlubmVyV2lkdGggPSAkKG5vZGUpLm91dGVyV2lkdGgoKTsKICAgICAgcmV0dXJuIG1heElubmVyV2lkdGggPSBNYXRoLm1heChtYXhJbm5lcldpZHRoLCBpbm5lcldpZHRoKTsKICAgIH0pOwogICAgaGVhZGVyV2lkdGggPSBtYXhJbm5lcldpZHRoICsgMTsKICAgIHNsb3RzUGVyTGFiZWwgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odGhpcy5sYWJlbEludGVydmFsLCB0aGlzLnNsb3REdXJhdGlvbik7CiAgICBzbG90V2lkdGggPSBNYXRoLmNlaWwoaGVhZGVyV2lkdGggLyBzbG90c1BlckxhYmVsKTsKICAgIG1pbldpZHRoID0gdGhpcy5oZWFkQ29sRWxzLmVxKDApLmNzcygnbWluLXdpZHRoJyk7CiAgICBpZiAobWluV2lkdGgpIHsKICAgICAgbWluV2lkdGggPSBwYXJzZUludChtaW5XaWR0aCwgMTApOwogICAgICBpZiAobWluV2lkdGgpIHsKICAgICAgICBzbG90V2lkdGggPSBNYXRoLm1heChzbG90V2lkdGgsIG1pbldpZHRoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNsb3RXaWR0aDsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmJ1aWxkQ29vcmRzID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUuYnVpbGQoKTsKICAgIHRoaXMuc2xhdENvb3JkQ2FjaGUuYnVpbGQoKTsKICAgIHJldHVybiB0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGUuYnVpbGQoKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVEYXRlU25hcENvdmVyYWdlID0gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIHNuYXBDb3ZlcmFnZSwgc25hcERpZmYsIHNuYXBEaWZmSW50OwogICAgc25hcERpZmYgPSBkaXZpZGVSYW5nZUJ5RHVyYXRpb24odGhpcy5zdGFydCwgZGF0ZSwgdGhpcy5zbmFwRHVyYXRpb24pOwogICAgaWYgKHNuYXBEaWZmIDwgMCkgewogICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSBpZiAoc25hcERpZmYgPj0gdGhpcy5zbmFwRGlmZlRvSW5kZXgubGVuZ3RoKSB7CiAgICAgIHJldHVybiB0aGlzLnNuYXBDbnQ7CiAgICB9IGVsc2UgewogICAgICBzbmFwRGlmZkludCA9IE1hdGguZmxvb3Ioc25hcERpZmYpOwogICAgICBzbmFwQ292ZXJhZ2UgPSB0aGlzLnNuYXBEaWZmVG9JbmRleFtzbmFwRGlmZkludF07CiAgICAgIGlmIChpc0ludChzbmFwQ292ZXJhZ2UpKSB7CiAgICAgICAgc25hcENvdmVyYWdlICs9IHNuYXBEaWZmIC0gc25hcERpZmZJbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc25hcENvdmVyYWdlID0gTWF0aC5jZWlsKHNuYXBDb3ZlcmFnZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNuYXBDb3ZlcmFnZTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmRhdGVUb0Nvb3JkID0gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIGNvb3JkQ2FjaGUsIHBhcnRpYWwsIHNsb3RDb3ZlcmFnZSwgc2xvdEluZGV4LCBzbmFwQ292ZXJhZ2U7CiAgICBzbmFwQ292ZXJhZ2UgPSB0aGlzLmNvbXB1dGVEYXRlU25hcENvdmVyYWdlKGRhdGUpOwogICAgc2xvdENvdmVyYWdlID0gc25hcENvdmVyYWdlIC8gdGhpcy5zbmFwc1BlclNsb3Q7CiAgICBzbG90SW5kZXggPSBNYXRoLmZsb29yKHNsb3RDb3ZlcmFnZSk7CiAgICBzbG90SW5kZXggPSBNYXRoLm1pbihzbG90SW5kZXgsIHRoaXMuc2xvdENudCAtIDEpOwogICAgcGFydGlhbCA9IHNsb3RDb3ZlcmFnZSAtIHNsb3RJbmRleDsKICAgIGNvb3JkQ2FjaGUgPSB0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGU7CiAgICBpZiAodGhpcy5pc1JUTCkgewogICAgICByZXR1cm4gKGNvb3JkQ2FjaGUuZ2V0UmlnaHRQb3NpdGlvbihzbG90SW5kZXgpIC0gY29vcmRDYWNoZS5nZXRXaWR0aChzbG90SW5kZXgpICogcGFydGlhbCkgLSB0aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUuZ2V0V2lkdGgoMCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29vcmRDYWNoZS5nZXRMZWZ0UG9zaXRpb24oc2xvdEluZGV4KSArIGNvb3JkQ2FjaGUuZ2V0V2lkdGgoc2xvdEluZGV4KSAqIHBhcnRpYWw7CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yYW5nZVRvQ29vcmRzID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgcmlnaHQ6IHRoaXMuZGF0ZVRvQ29vcmQocmFuZ2Uuc3RhcnQpLAogICAgICAgIGxlZnQ6IHRoaXMuZGF0ZVRvQ29vcmQocmFuZ2UuZW5kKQogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBsZWZ0OiB0aGlzLmRhdGVUb0Nvb3JkKHJhbmdlLnN0YXJ0KSwKICAgICAgICByaWdodDogdGhpcy5kYXRlVG9Db29yZChyYW5nZS5lbmQpCiAgICAgIH07CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWFkSGVpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgdGFibGU7CiAgICB0YWJsZSA9IHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZmluZCgndGFibGUnKTsKICAgIHJldHVybiB0YWJsZS5oZWlnaHQuYXBwbHkodGFibGUsIGFyZ3VtZW50cyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS51cGRhdGVTZWdQb3NpdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb29yZHMsIGosIGxlbiwgc2VnLCBzZWdzOwogICAgc2VncyA9ICh0aGlzLnNlZ3MgfHwgW10pLmNvbmNhdCh0aGlzLmJ1c2luZXNzSG91clNlZ3MgfHwgW10pOwogICAgZm9yIChqID0gMCwgbGVuID0gc2Vncy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBzZWcgPSBzZWdzW2pdOwogICAgICBjb29yZHMgPSB0aGlzLnJhbmdlVG9Db29yZHMoc2VnKTsKICAgICAgc2VnLmVsLmNzcyh7CiAgICAgICAgbGVmdDogKHNlZy5sZWZ0ID0gY29vcmRzLmxlZnQpLAogICAgICAgIHJpZ2h0OiAtKHNlZy5yaWdodCA9IGNvb3Jkcy5yaWdodCkKICAgICAgfSk7CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlSW5pdGlhbFNjcm9sbCA9IGZ1bmN0aW9uKHByZXZTdGF0ZSkgewogICAgdmFyIGxlZnQsIHNjcm9sbFRpbWU7CiAgICBsZWZ0ID0gMDsKICAgIGlmICh0aGlzLmlzVGltZVNjYWxlKSB7CiAgICAgIHNjcm9sbFRpbWUgPSB0aGlzLm9wdCgnc2Nyb2xsVGltZScpOwogICAgICBpZiAoc2Nyb2xsVGltZSkgewogICAgICAgIHNjcm9sbFRpbWUgPSBtb21lbnQuZHVyYXRpb24oc2Nyb2xsVGltZSk7CiAgICAgICAgbGVmdCA9IHRoaXMuZGF0ZVRvQ29vcmQodGhpcy5zdGFydC5jbG9uZSgpLnRpbWUoc2Nyb2xsVGltZSkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gewogICAgICBsZWZ0OiBsZWZ0LAogICAgICB0b3A6IDAKICAgIH07CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeVNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsKICAgICAgbGVmdDogdGhpcy5ib2R5U2Nyb2xsZXIuZ2V0U2Nyb2xsTGVmdCgpLAogICAgICB0b3A6IHRoaXMuYm9keVNjcm9sbGVyLmdldFNjcm9sbFRvcCgpCiAgICB9OwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2V0U2Nyb2xsID0gZnVuY3Rpb24oc3RhdGUpIHsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLnNldFNjcm9sbExlZnQoc3RhdGUubGVmdCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5zZXRTY3JvbGxMZWZ0KHN0YXRlLmxlZnQpOwogICAgcmV0dXJuIHRoaXMuYm9keVNjcm9sbGVyLnNldFNjcm9sbFRvcChzdGF0ZS50b3ApOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmdTZWdzID0gZnVuY3Rpb24oc2VncykgewogICAgc2VncyA9IHRoaXMucmVuZGVyRmdTZWdFbHMoc2Vncyk7CiAgICB0aGlzLnJlbmRlckZnU2Vnc0luQ29udGFpbmVycyhbW3RoaXMsIHNlZ3NdXSk7CiAgICB0aGlzLnVwZGF0ZVNlZ0ZvbGxvd2VycyhzZWdzKTsKICAgIHJldHVybiBzZWdzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJGZ1NlZ3MgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2xlYXJTZWdGb2xsb3dlcnMoKTsKICAgIHJldHVybiB0aGlzLnVucmVuZGVyRmdDb250YWluZXJzKFt0aGlzXSk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnMgPSBmdW5jdGlvbihwYWlycykgewogICAgdmFyIGNvbnRhaW5lciwgY29vcmRzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIGxlbjMsIGxlbjQsIGxlbjUsIGxlbjYsIGxlbjcsIG0sIG4sIHAsIHEsIHIsIHJlZiwgcmVmMSwgcmVmMiwgcmVmMywgcmVzdWx0cywgc2VnLCBzZWdzOwogICAgZm9yIChqID0gMCwgbGVuID0gcGFpcnMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVmID0gcGFpcnNbal0sIGNvbnRhaW5lciA9IHJlZlswXSwgc2VncyA9IHJlZlsxXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHNlZ3MubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgICAgc2VnID0gc2Vnc1trXTsKICAgICAgICBjb29yZHMgPSB0aGlzLnJhbmdlVG9Db29yZHMoc2VnKTsKICAgICAgICBzZWcuZWwuY3NzKHsKICAgICAgICAgIGxlZnQ6IChzZWcubGVmdCA9IGNvb3Jkcy5sZWZ0KSwKICAgICAgICAgIHJpZ2h0OiAtKHNlZy5yaWdodCA9IGNvb3Jkcy5yaWdodCkKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZm9yIChsID0gMCwgbGVuMiA9IHBhaXJzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICByZWYxID0gcGFpcnNbbF0sIGNvbnRhaW5lciA9IHJlZjFbMF0sIHNlZ3MgPSByZWYxWzFdOwogICAgICBmb3IgKG0gPSAwLCBsZW4zID0gc2Vncy5sZW5ndGg7IG0gPCBsZW4zOyBtKyspIHsKICAgICAgICBzZWcgPSBzZWdzW21dOwogICAgICAgIHNlZy5lbC5hcHBlbmRUbyhjb250YWluZXIuc2VnQ29udGFpbmVyRWwpOwogICAgICB9CiAgICB9CiAgICBmb3IgKG4gPSAwLCBsZW40ID0gcGFpcnMubGVuZ3RoOyBuIDwgbGVuNDsgbisrKSB7CiAgICAgIHJlZjIgPSBwYWlyc1tuXSwgY29udGFpbmVyID0gcmVmMlswXSwgc2VncyA9IHJlZjJbMV07CiAgICAgIGZvciAocCA9IDAsIGxlbjUgPSBzZWdzLmxlbmd0aDsgcCA8IGxlbjU7IHArKykgewogICAgICAgIHNlZyA9IHNlZ3NbcF07CiAgICAgICAgc2VnLmhlaWdodCA9IHNlZy5lbC5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgfQogICAgICB0aGlzLmJ1aWxkU2VnTGV2ZWxzKHNlZ3MpOwogICAgICBjb250YWluZXIuc2VnQ29udGFpbmVySGVpZ2h0ID0gY29tcHV0ZU9mZnNldEZvclNlZ3Moc2Vncyk7CiAgICB9CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKHEgPSAwLCBsZW42ID0gcGFpcnMubGVuZ3RoOyBxIDwgbGVuNjsgcSsrKSB7CiAgICAgIHJlZjMgPSBwYWlyc1txXSwgY29udGFpbmVyID0gcmVmM1swXSwgc2VncyA9IHJlZjNbMV07CiAgICAgIGZvciAociA9IDAsIGxlbjcgPSBzZWdzLmxlbmd0aDsgciA8IGxlbjc7IHIrKykgewogICAgICAgIHNlZyA9IHNlZ3Nbcl07CiAgICAgICAgc2VnLmVsLmNzcygndG9wJywgc2VnLnRvcCk7CiAgICAgIH0KICAgICAgcmVzdWx0cy5wdXNoKGNvbnRhaW5lci5zZWdDb250YWluZXJFbC5oZWlnaHQoY29udGFpbmVyLnNlZ0NvbnRhaW5lckhlaWdodCkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5idWlsZFNlZ0xldmVscyA9IGZ1bmN0aW9uKHNlZ3MpIHsKICAgIHZhciBiZWxvd1NlZywgaXNMZXZlbENvbGxpc2lvbiwgaiwgaywgbCwgbGVuLCBsZW4xLCBsZW4yLCBsZXZlbCwgcGxhY2VkU2VnLCByZWYsIHJlZjEsIHNlZ0xldmVscywgdW5wbGFjZWRTZWc7CiAgICBzZWdMZXZlbHMgPSBbXTsKICAgIHRoaXMuc29ydEV2ZW50U2VncyhzZWdzKTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgdW5wbGFjZWRTZWcgPSBzZWdzW2pdOwogICAgICB1bnBsYWNlZFNlZy5hYm92ZSA9IFtdOwogICAgICBsZXZlbCA9IDA7CiAgICAgIHdoaWxlIChsZXZlbCA8IHNlZ0xldmVscy5sZW5ndGgpIHsKICAgICAgICBpc0xldmVsQ29sbGlzaW9uID0gZmFsc2U7CiAgICAgICAgcmVmID0gc2VnTGV2ZWxzW2xldmVsXTsKICAgICAgICBmb3IgKGsgPSAwLCBsZW4xID0gcmVmLmxlbmd0aDsgayA8IGxlbjE7IGsrKykgewogICAgICAgICAgcGxhY2VkU2VnID0gcmVmW2tdOwogICAgICAgICAgaWYgKHRpbWVSb3dTZWdzQ29sbGlkZSh1bnBsYWNlZFNlZywgcGxhY2VkU2VnKSkgewogICAgICAgICAgICB1bnBsYWNlZFNlZy5hYm92ZS5wdXNoKHBsYWNlZFNlZyk7CiAgICAgICAgICAgIGlzTGV2ZWxDb2xsaXNpb24gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNMZXZlbENvbGxpc2lvbikgewogICAgICAgICAgbGV2ZWwgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIChzZWdMZXZlbHNbbGV2ZWxdIHx8IChzZWdMZXZlbHNbbGV2ZWxdID0gW10pKS5wdXNoKHVucGxhY2VkU2VnKTsKICAgICAgbGV2ZWwgKz0gMTsKICAgICAgd2hpbGUgKGxldmVsIDwgc2VnTGV2ZWxzLmxlbmd0aCkgewogICAgICAgIHJlZjEgPSBzZWdMZXZlbHNbbGV2ZWxdOwogICAgICAgIGZvciAobCA9IDAsIGxlbjIgPSByZWYxLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICAgICAgYmVsb3dTZWcgPSByZWYxW2xdOwogICAgICAgICAgaWYgKHRpbWVSb3dTZWdzQ29sbGlkZSh1bnBsYWNlZFNlZywgYmVsb3dTZWcpKSB7CiAgICAgICAgICAgIGJlbG93U2VnLmFib3ZlLnB1c2godW5wbGFjZWRTZWcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXZlbCArPSAxOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2VnTGV2ZWxzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJGZ0NvbnRhaW5lcnMgPSBmdW5jdGlvbihjb250YWluZXJzKSB7CiAgICB2YXIgY29udGFpbmVyLCBqLCBsZW4sIHJlc3VsdHM7CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBjb250YWluZXJzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lcnNbal07CiAgICAgIGNvbnRhaW5lci5zZWdDb250YWluZXJFbC5lbXB0eSgpOwogICAgICBjb250YWluZXIuc2VnQ29udGFpbmVyRWwuaGVpZ2h0KCcnKTsKICAgICAgcmVzdWx0cy5wdXNoKGNvbnRhaW5lci5zZWdDb250YWluZXJIZWlnaHQgPSBudWxsKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZmdTZWdIdG1sID0gZnVuY3Rpb24oc2VnLCBkaXNhYmxlUmVzaXppbmcpIHsKICAgIHZhciBjbGFzc2VzLCBldmVudCwgaXNEcmFnZ2FibGUsIGlzUmVzaXphYmxlRnJvbUVuZCwgaXNSZXNpemFibGVGcm9tU3RhcnQsIHRpbWVUZXh0OwogICAgZXZlbnQgPSBzZWcuZXZlbnQ7CiAgICBpc0RyYWdnYWJsZSA9IHRoaXMudmlldy5pc0V2ZW50RHJhZ2dhYmxlKGV2ZW50KTsKICAgIGlzUmVzaXphYmxlRnJvbVN0YXJ0ID0gc2VnLmlzU3RhcnQgJiYgdGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQoZXZlbnQpOwogICAgaXNSZXNpemFibGVGcm9tRW5kID0gc2VnLmlzRW5kICYmIHRoaXMudmlldy5pc0V2ZW50UmVzaXphYmxlRnJvbUVuZChldmVudCk7CiAgICBjbGFzc2VzID0gdGhpcy5nZXRTZWdDbGFzc2VzKHNlZywgaXNEcmFnZ2FibGUsIGlzUmVzaXphYmxlRnJvbVN0YXJ0IHx8IGlzUmVzaXphYmxlRnJvbUVuZCk7CiAgICBjbGFzc2VzLnVuc2hpZnQoJ2ZjLXRpbWVsaW5lLWV2ZW50JywgJ2ZjLWgtZXZlbnQnKTsKICAgIHRpbWVUZXh0ID0gdGhpcy5nZXRFdmVudFRpbWVUZXh0KGV2ZW50KTsKICAgIHJldHVybiAnPGEgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciIHN0eWxlPSInICsgY3NzVG9TdHIodGhpcy5nZXRTZWdTa2luQ3NzKHNlZykpICsgJyInICsgKGV2ZW50LnVybCA/ICcgaHJlZj0iJyArIGh0bWxFc2NhcGUoZXZlbnQudXJsKSArICciJyA6ICcnKSArICc+JyArICc8ZGl2IGNsYXNzPSJmYy1jb250ZW50Ij4nICsgKHRpbWVUZXh0ID8gJzxzcGFuIGNsYXNzPSJmYy10aW1lIj4nICsgaHRtbEVzY2FwZSh0aW1lVGV4dCkgKyAnPC9zcGFuPicgOiAnJykgKyAnPHNwYW4gY2xhc3M9ImZjLXRpdGxlIj4nICsgKGV2ZW50LnRpdGxlID8gaHRtbEVzY2FwZShldmVudC50aXRsZSkgOiAnJm5ic3A7JykgKyAnPC9zcGFuPicgKyAnPC9kaXY+JyArICc8ZGl2IGNsYXNzPSJmYy1iZyIgLz4nICsgKGlzUmVzaXphYmxlRnJvbVN0YXJ0ID8gJzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtc3RhcnQtcmVzaXplciI+PC9kaXY+JyA6ICcnKSArIChpc1Jlc2l6YWJsZUZyb21FbmQgPyAnPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1lbmQtcmVzaXplciI+PC9kaXY+JyA6ICcnKSArICc8L2E+JzsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVwZGF0ZVNlZ0ZvbGxvd2VycyA9IGZ1bmN0aW9uKHNlZ3MpIHsKICAgIHZhciBqLCBsZW4sIHNlZywgc3ByaXRlcywgdGl0bGVFbDsKICAgIGlmICh0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcikgewogICAgICBzcHJpdGVzID0gW107CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzZWcgPSBzZWdzW2pdOwogICAgICAgIHRpdGxlRWwgPSBzZWcuZWwuZmluZCgnLmZjLXRpdGxlJyk7CiAgICAgICAgaWYgKHRpdGxlRWwubGVuZ3RoKSB7CiAgICAgICAgICBzcHJpdGVzLnB1c2gobmV3IFNjcm9sbEZvbGxvd2VyU3ByaXRlKHRpdGxlRWwpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLnNldFNwcml0ZXMoc3ByaXRlcyk7CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jbGVhclNlZ0ZvbGxvd2VycyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jbGVhclNwcml0ZXMoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNlZ0RyYWdTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zZWdEcmFnU3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcikgewogICAgICByZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuZm9yY2VSZWxhdGl2ZSgpOwogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2VnRHJhZ0VuZCA9IGZ1bmN0aW9uKCkgewogICAgVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zZWdEcmFnRW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmNsZWFyRm9yY2UoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNlZ1Jlc2l6ZVN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICBUaW1lbGluZUdyaWQuX19zdXBlcl9fLnNlZ1Jlc2l6ZVN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmZvcmNlUmVsYXRpdmUoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNlZ1Jlc2l6ZUVuZCA9IGZ1bmN0aW9uKCkgewogICAgVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zZWdSZXNpemVFbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcikgewogICAgICByZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY2xlYXJGb3JjZSgpOwogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVySGVscGVyID0gZnVuY3Rpb24oZXZlbnQsIHNvdXJjZVNlZykgewogICAgdmFyIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5ldmVudFRvU2VncyhldmVudCk7CiAgICBzZWdzID0gdGhpcy5yZW5kZXJGZ1NlZ0VscyhzZWdzKTsKICAgIHJldHVybiB0aGlzLnJlbmRlckhlbHBlclNlZ3NJbkNvbnRhaW5lcnMoW1t0aGlzLCBzZWdzXV0sIHNvdXJjZVNlZyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJIZWxwZXJTZWdzSW5Db250YWluZXJzID0gZnVuY3Rpb24ocGFpcnMsIHNvdXJjZVNlZykgewogICAgdmFyIGNvbnRhaW5lck9iaiwgY29vcmRzLCBoZWxwZXJDb250YWluZXJFbCwgaGVscGVyTm9kZXMsIGosIGssIGwsIGxlbiwgbGVuMSwgbGVuMiwgbGVuMywgbSwgcmVmLCByZWYxLCByZWYyLCBzZWcsIHNlZ05vZGVzLCBzZWdzOwogICAgaGVscGVyTm9kZXMgPSBbXTsKICAgIHNlZ05vZGVzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZWYgPSBwYWlyc1tqXSwgY29udGFpbmVyT2JqID0gcmVmWzBdLCBzZWdzID0gcmVmWzFdOwogICAgICBmb3IgKGsgPSAwLCBsZW4xID0gc2Vncy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICBzZWcgPSBzZWdzW2tdOwogICAgICAgIGNvb3JkcyA9IHRoaXMucmFuZ2VUb0Nvb3JkcyhzZWcpOwogICAgICAgIHNlZy5lbC5jc3MoewogICAgICAgICAgbGVmdDogKHNlZy5sZWZ0ID0gY29vcmRzLmxlZnQpLAogICAgICAgICAgcmlnaHQ6IC0oc2VnLnJpZ2h0ID0gY29vcmRzLnJpZ2h0KQogICAgICAgIH0pOwogICAgICAgIGlmIChzb3VyY2VTZWcgJiYgc291cmNlU2VnLnJlc291cmNlSWQgPT09ICgocmVmMSA9IGNvbnRhaW5lck9iai5yZXNvdXJjZSkgIT0gbnVsbCA/IHJlZjEuaWQgOiB2b2lkIDApKSB7CiAgICAgICAgICBzZWcuZWwuY3NzKCd0b3AnLCBzb3VyY2VTZWcuZWwuY3NzKCd0b3AnKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZy5lbC5jc3MoJ3RvcCcsIDApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChsID0gMCwgbGVuMiA9IHBhaXJzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICByZWYyID0gcGFpcnNbbF0sIGNvbnRhaW5lck9iaiA9IHJlZjJbMF0sIHNlZ3MgPSByZWYyWzFdOwogICAgICBoZWxwZXJDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciBmYy1oZWxwZXItY29udGFpbmVyIi8+JykuYXBwZW5kVG8oY29udGFpbmVyT2JqLmlubmVyRWwpOwogICAgICBoZWxwZXJOb2Rlcy5wdXNoKGhlbHBlckNvbnRhaW5lckVsWzBdKTsKICAgICAgZm9yIChtID0gMCwgbGVuMyA9IHNlZ3MubGVuZ3RoOyBtIDwgbGVuMzsgbSsrKSB7CiAgICAgICAgc2VnID0gc2Vnc1ttXTsKICAgICAgICBoZWxwZXJDb250YWluZXJFbC5hcHBlbmQoc2VnLmVsKTsKICAgICAgICBzZWdOb2Rlcy5wdXNoKHNlZy5lbFswXSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLmhlbHBlckVscykgewogICAgICB0aGlzLmhlbHBlckVscyA9IHRoaXMuaGVscGVyRWxzLmFkZCgkKGhlbHBlck5vZGVzKSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmhlbHBlckVscyA9ICQoaGVscGVyTm9kZXMpOwogICAgfQogICAgcmV0dXJuICQoc2VnTm9kZXMpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJIZWxwZXIgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhlbHBlckVscykgewogICAgICB0aGlzLmhlbHBlckVscy5yZW1vdmUoKTsKICAgICAgcmV0dXJuIHRoaXMuaGVscGVyRWxzID0gbnVsbDsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbmRlckV2ZW50UmVzaXplID0gZnVuY3Rpb24ocmVzaXplTG9jYXRpb24sIHNlZykgewogICAgdGhpcy5yZW5kZXJIaWdobGlnaHQodGhpcy5ldmVudFRvU3BhbihyZXNpemVMb2NhdGlvbikpOwogICAgcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcihyZXNpemVMb2NhdGlvbiwgc2VnKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyRXZlbnRSZXNpemUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKICAgIHJldHVybiB0aGlzLnVucmVuZGVySGVscGVyKCk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJGaWxsID0gZnVuY3Rpb24odHlwZSwgc2VncywgY2xhc3NOYW1lKSB7CiAgICBzZWdzID0gdGhpcy5yZW5kZXJGaWxsU2VnRWxzKHR5cGUsIHNlZ3MpOwogICAgdGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXJzKHR5cGUsIFtbdGhpcywgc2Vnc11dLCBjbGFzc05hbWUpOwogICAgcmV0dXJuIHNlZ3M7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJGaWxsSW5Db250YWluZXJzID0gZnVuY3Rpb24odHlwZSwgcGFpcnMsIGNsYXNzTmFtZSkgewogICAgdmFyIGNvbnRhaW5lck9iaiwgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHNlZ3M7CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZWYgPSBwYWlyc1tqXSwgY29udGFpbmVyT2JqID0gcmVmWzBdLCBzZWdzID0gcmVmWzFdOwogICAgICByZXN1bHRzLnB1c2godGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXIodHlwZSwgY29udGFpbmVyT2JqLCBzZWdzLCBjbGFzc05hbWUpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmlsbEluQ29udGFpbmVyID0gZnVuY3Rpb24odHlwZSwgY29udGFpbmVyT2JqLCBzZWdzLCBjbGFzc05hbWUpIHsKICAgIHZhciBjb250YWluZXJFbCwgY29vcmRzLCBqLCBsZW4sIHNlZzsKICAgIGlmIChzZWdzLmxlbmd0aCkgewogICAgICBjbGFzc05hbWUgfHwgKGNsYXNzTmFtZSA9IHR5cGUudG9Mb3dlckNhc2UoKSk7CiAgICAgIGNvbnRhaW5lckVsID0gJCgnPGRpdiBjbGFzcz0iZmMtJyArIGNsYXNzTmFtZSArICctY29udGFpbmVyIiAvPicpLmFwcGVuZFRvKGNvbnRhaW5lck9iai5iZ1NlZ0NvbnRhaW5lckVsKTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gc2Vncy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIHNlZyA9IHNlZ3Nbal07CiAgICAgICAgY29vcmRzID0gdGhpcy5yYW5nZVRvQ29vcmRzKHNlZyk7CiAgICAgICAgc2VnLmVsLmNzcyh7CiAgICAgICAgICBsZWZ0OiAoc2VnLmxlZnQgPSBjb29yZHMubGVmdCksCiAgICAgICAgICByaWdodDogLShzZWcucmlnaHQgPSBjb29yZHMucmlnaHQpCiAgICAgICAgfSk7CiAgICAgICAgc2VnLmVsLmFwcGVuZFRvKGNvbnRhaW5lckVsKTsKICAgICAgfQogICAgICBpZiAodGhpcy5lbHNCeUZpbGxbdHlwZV0pIHsKICAgICAgICByZXR1cm4gdGhpcy5lbHNCeUZpbGxbdHlwZV0gPSB0aGlzLmVsc0J5RmlsbFt0eXBlXS5hZGQoY29udGFpbmVyRWwpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0aGlzLmVsc0J5RmlsbFt0eXBlXSA9IGNvbnRhaW5lckVsOwogICAgICB9CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJEcmFnID0gZnVuY3Rpb24oZHJvcExvY2F0aW9uLCBzZWcpIHsKICAgIGlmIChzZWcpIHsKICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcihkcm9wTG9jYXRpb24sIHNlZyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKGRyb3BMb2NhdGlvbikpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyRHJhZyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy51bnJlbmRlckhlbHBlcigpOwogICAgcmV0dXJuIHRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKICB9OwoKICByZXR1cm4gVGltZWxpbmVHcmlkOwoKfSkoR3JpZCk7Cgpjb21wdXRlT2Zmc2V0Rm9yU2VncyA9IGZ1bmN0aW9uKHNlZ3MpIHsKICB2YXIgaiwgbGVuLCBtYXgsIHNlZzsKICBtYXggPSAwOwogIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIHNlZyA9IHNlZ3Nbal07CiAgICBtYXggPSBNYXRoLm1heChtYXgsIGNvbXB1dGVPZmZzZXRGb3JTZWcoc2VnKSk7CiAgfQogIHJldHVybiBtYXg7Cn07Cgpjb21wdXRlT2Zmc2V0Rm9yU2VnID0gZnVuY3Rpb24oc2VnKSB7CiAgaWYgKHNlZy50b3AgPT0gbnVsbCkgewogICAgc2VnLnRvcCA9IGNvbXB1dGVPZmZzZXRGb3JTZWdzKHNlZy5hYm92ZSk7CiAgfQogIHJldHVybiBzZWcudG9wICsgc2VnLmhlaWdodDsKfTsKCnRpbWVSb3dTZWdzQ29sbGlkZSA9IGZ1bmN0aW9uKHNlZzAsIHNlZzEpIHsKICByZXR1cm4gc2VnMC5sZWZ0IDwgc2VnMS5yaWdodCAmJiBzZWcwLnJpZ2h0ID4gc2VnMS5sZWZ0Owp9OwoKTUlOX0FVVE9fTEFCRUxTID0gMTg7CgpNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwgPSA2OwoKTUFYX0FVVE9fQ0VMTFMgPSAyMDA7CgpNQVhfQ0VMTFMgPSAxMDAwOwoKREVGQVVMVF9HUklEX0RVUkFUSU9OID0gewogIG1vbnRoczogMQp9OwoKU1RPQ0tfU1VCX0RVUkFUSU9OUyA9IFsKICB7CiAgICB5ZWFyczogMQogIH0sIHsKICAgIG1vbnRoczogMQogIH0sIHsKICAgIGRheXM6IDEKICB9LCB7CiAgICBob3VyczogMQogIH0sIHsKICAgIG1pbnV0ZXM6IDMwCiAgfSwgewogICAgbWludXRlczogMTUKICB9LCB7CiAgICBtaW51dGVzOiAxMAogIH0sIHsKICAgIG1pbnV0ZXM6IDUKICB9LCB7CiAgICBtaW51dGVzOiAxCiAgfSwgewogICAgc2Vjb25kczogMzAKICB9LCB7CiAgICBzZWNvbmRzOiAxNQogIH0sIHsKICAgIHNlY29uZHM6IDEwCiAgfSwgewogICAgc2Vjb25kczogNQogIH0sIHsKICAgIHNlY29uZHM6IDEKICB9LCB7CiAgICBtaWxsaXNlY29uZHM6IDUwMAogIH0sIHsKICAgIG1pbGxpc2Vjb25kczogMTAwCiAgfSwgewogICAgbWlsbGlzZWNvbmRzOiAxMAogIH0sIHsKICAgIG1pbGxpc2Vjb25kczogMQogIH0KXTsKClRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaW5pdFNjYWxlUHJvcHMgPSBmdW5jdGlvbigpIHsKICB2YXIgaW5wdXQsIHNsb3RVbml0LCB0eXBlOwogIHRoaXMubGFiZWxJbnRlcnZhbCA9IHRoaXMucXVlcnlEdXJhdGlvbk9wdGlvbignc2xvdExhYmVsSW50ZXJ2YWwnKTsKICB0aGlzLnNsb3REdXJhdGlvbiA9IHRoaXMucXVlcnlEdXJhdGlvbk9wdGlvbignc2xvdER1cmF0aW9uJyk7CiAgdGhpcy5lbnN1cmVHcmlkRHVyYXRpb24oKTsKICB0aGlzLnZhbGlkYXRlTGFiZWxBbmRTbG90KCk7CiAgdGhpcy5lbnN1cmVMYWJlbEludGVydmFsKCk7CiAgdGhpcy5lbnN1cmVTbG90RHVyYXRpb24oKTsKICBpbnB1dCA9IHRoaXMub3B0KCdzbG90TGFiZWxGb3JtYXQnKTsKICB0eXBlID0gJC50eXBlKGlucHV0KTsKICB0aGlzLmhlYWRlckZvcm1hdHMgPSB0eXBlID09PSAnYXJyYXknID8gaW5wdXQgOiB0eXBlID09PSAnc3RyaW5nJyA/IFtpbnB1dF0gOiB0aGlzLmNvbXB1dGVIZWFkZXJGb3JtYXRzKCk7CiAgdGhpcy5pc1RpbWVTY2FsZSA9IGR1cmF0aW9uSGFzVGltZSh0aGlzLnNsb3REdXJhdGlvbik7CiAgdGhpcy5sYXJnZVVuaXQgPSAhdGhpcy5pc1RpbWVTY2FsZSA/IChzbG90VW5pdCA9IGNvbXB1dGVJbnRlcnZhbFVuaXQodGhpcy5zbG90RHVyYXRpb24pLCAveWVhcnxtb250aHx3ZWVrLy50ZXN0KHNsb3RVbml0KSA/IHNsb3RVbml0IDogdm9pZCAwKSA6IHZvaWQgMDsKICByZXR1cm4gdGhpcy5lbXBoYXNpemVXZWVrcyA9IHRoaXMuc2xvdER1cmF0aW9uLmFzKCdkYXlzJykgPT09IDEgJiYgdGhpcy5kdXJhdGlvbi5hcygnd2Vla3MnKSA+PSAyICYmICF0aGlzLm9wdCgnYnVzaW5lc3NIb3VycycpOwoKICAvKgogIAljb25zb2xlLmxvZygndmlldyBkdXJhdGlvbiA9JywgQGR1cmF0aW9uLmh1bWFuaXplKCkpCiAgCWNvbnNvbGUubG9nKCdsYWJlbCBpbnRlcnZhbCA9JywgQGxhYmVsSW50ZXJ2YWwuaHVtYW5pemUoKSkKICAJY29uc29sZS5sb2coJ3Nsb3QgZHVyYXRpb24gPScsIEBzbG90RHVyYXRpb24uaHVtYW5pemUoKSkKICAJY29uc29sZS5sb2coJ2hlYWRlciBmb3JtYXRzID0nLCBAaGVhZGVyRm9ybWF0cykKICAJY29uc29sZS5sb2coJ2lzVGltZVNjYWxlJywgQGlzVGltZVNjYWxlKQogIAljb25zb2xlLmxvZygnbGFyZ2VVbml0JywgQGxhcmdlVW5pdCkKICAgKi8KfTsKClRpbWVsaW5lR3JpZC5wcm90b3R5cGUucXVlcnlEdXJhdGlvbk9wdGlvbiA9IGZ1bmN0aW9uKG5hbWUpIHsKICB2YXIgZHVyLCBpbnB1dDsKICBpbnB1dCA9IHRoaXMub3B0KG5hbWUpOwogIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICBkdXIgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQpOwogICAgaWYgKCtkdXIpIHsKICAgICAgcmV0dXJuIGR1cjsKICAgIH0KICB9Cn07CgpUaW1lbGluZUdyaWQucHJvdG90eXBlLnZhbGlkYXRlTGFiZWxBbmRTbG90ID0gZnVuY3Rpb24oKSB7CiAgdmFyIGxhYmVsQ250LCBzbG90Q250LCBzbG90c1BlckxhYmVsOwogIGlmICh0aGlzLmxhYmVsSW50ZXJ2YWwpIHsKICAgIGxhYmVsQ250ID0gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKHRoaXMuZHVyYXRpb24sIHRoaXMubGFiZWxJbnRlcnZhbCk7CiAgICBpZiAobGFiZWxDbnQgPiBNQVhfQ0VMTFMpIHsKICAgICAgRkMud2Fybignc2xvdExhYmVsSW50ZXJ2YWwgcmVzdWx0cyBpbiB0b28gbWFueSBjZWxscycpOwogICAgICB0aGlzLmxhYmVsSW50ZXJ2YWwgPSBudWxsOwogICAgfQogIH0KICBpZiAodGhpcy5zbG90RHVyYXRpb24pIHsKICAgIHNsb3RDbnQgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odGhpcy5kdXJhdGlvbiwgdGhpcy5zbG90RHVyYXRpb24pOwogICAgaWYgKHNsb3RDbnQgPiBNQVhfQ0VMTFMpIHsKICAgICAgRkMud2Fybignc2xvdER1cmF0aW9uIHJlc3VsdHMgaW4gdG9vIG1hbnkgY2VsbHMnKTsKICAgICAgdGhpcy5zbG90RHVyYXRpb24gPSBudWxsOwogICAgfQogIH0KICBpZiAodGhpcy5sYWJlbEludGVydmFsICYmIHRoaXMuc2xvdER1cmF0aW9uKSB7CiAgICBzbG90c1BlckxhYmVsID0gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKHRoaXMubGFiZWxJbnRlcnZhbCwgdGhpcy5zbG90RHVyYXRpb24pOwogICAgaWYgKCFpc0ludChzbG90c1BlckxhYmVsKSB8fCBzbG90c1BlckxhYmVsIDwgMSkgewogICAgICBGQy53YXJuKCdzbG90TGFiZWxJbnRlcnZhbCBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc2xvdER1cmF0aW9uJyk7CiAgICAgIHJldHVybiB0aGlzLnNsb3REdXJhdGlvbiA9IG51bGw7CiAgICB9CiAgfQp9OwoKVGltZWxpbmVHcmlkLnByb3RvdHlwZS5lbnN1cmVHcmlkRHVyYXRpb24gPSBmdW5jdGlvbigpIHsKICB2YXIgZ3JpZER1cmF0aW9uLCBpbnB1dCwgaiwgbGFiZWxDbnQsIGxhYmVsSW50ZXJ2YWw7CiAgZ3JpZER1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjsKICBpZiAoIWdyaWREdXJhdGlvbikgewogICAgZ3JpZER1cmF0aW9uID0gdGhpcy52aWV3LmludGVydmFsRHVyYXRpb247CiAgICBpZiAoIWdyaWREdXJhdGlvbikgewogICAgICBpZiAoIXRoaXMubGFiZWxJbnRlcnZhbCAmJiAhdGhpcy5zbG90RHVyYXRpb24pIHsKICAgICAgICBncmlkRHVyYXRpb24gPSBtb21lbnQuZHVyYXRpb24oREVGQVVMVF9HUklEX0RVUkFUSU9OKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYWJlbEludGVydmFsID0gdGhpcy5lbnN1cmVMYWJlbEludGVydmFsKCk7CiAgICAgICAgZm9yIChqID0gU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGggLSAxOyBqID49IDA7IGogKz0gLTEpIHsKICAgICAgICAgIGlucHV0ID0gU1RPQ0tfU1VCX0RVUkFUSU9OU1tqXTsKICAgICAgICAgIGdyaWREdXJhdGlvbiA9IG1vbWVudC5kdXJhdGlvbihpbnB1dCk7CiAgICAgICAgICBsYWJlbENudCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihncmlkRHVyYXRpb24sIGxhYmVsSW50ZXJ2YWwpOwogICAgICAgICAgaWYgKGxhYmVsQ250ID49IE1JTl9BVVRPX0xBQkVMUykgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZHVyYXRpb24gPSBncmlkRHVyYXRpb247CiAgfQogIHJldHVybiBncmlkRHVyYXRpb247Cn07CgpUaW1lbGluZUdyaWQucHJvdG90eXBlLmVuc3VyZUxhYmVsSW50ZXJ2YWwgPSBmdW5jdGlvbigpIHsKICB2YXIgaW5wdXQsIGosIGssIGxhYmVsQ250LCBsYWJlbEludGVydmFsLCBsZW4sIGxlbjEsIHNsb3RzUGVyTGFiZWwsIHRyeUxhYmVsSW50ZXJ2YWw7CiAgbGFiZWxJbnRlcnZhbCA9IHRoaXMubGFiZWxJbnRlcnZhbDsKICBpZiAoIWxhYmVsSW50ZXJ2YWwpIHsKICAgIGlmICghdGhpcy5kdXJhdGlvbiAmJiAhdGhpcy5zbG90RHVyYXRpb24pIHsKICAgICAgdGhpcy5lbnN1cmVHcmlkRHVyYXRpb24oKTsKICAgIH0KICAgIGlmICh0aGlzLnNsb3REdXJhdGlvbikgewogICAgICBmb3IgKGogPSAwLCBsZW4gPSBTVE9DS19TVUJfRFVSQVRJT05TLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgaW5wdXQgPSBTVE9DS19TVUJfRFVSQVRJT05TW2pdOwogICAgICAgIHRyeUxhYmVsSW50ZXJ2YWwgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQpOwogICAgICAgIHNsb3RzUGVyTGFiZWwgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odHJ5TGFiZWxJbnRlcnZhbCwgdGhpcy5zbG90RHVyYXRpb24pOwogICAgICAgIGlmIChpc0ludChzbG90c1BlckxhYmVsKSAmJiBzbG90c1BlckxhYmVsIDw9IE1BWF9BVVRPX1NMT1RTX1BFUl9MQUJFTCkgewogICAgICAgICAgbGFiZWxJbnRlcnZhbCA9IHRyeUxhYmVsSW50ZXJ2YWw7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFsYWJlbEludGVydmFsKSB7CiAgICAgICAgbGFiZWxJbnRlcnZhbCA9IHRoaXMuc2xvdER1cmF0aW9uOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGsgPSAwLCBsZW4xID0gU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICBpbnB1dCA9IFNUT0NLX1NVQl9EVVJBVElPTlNba107CiAgICAgICAgbGFiZWxJbnRlcnZhbCA9IG1vbWVudC5kdXJhdGlvbihpbnB1dCk7CiAgICAgICAgbGFiZWxDbnQgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odGhpcy5kdXJhdGlvbiwgbGFiZWxJbnRlcnZhbCk7CiAgICAgICAgaWYgKGxhYmVsQ250ID49IE1JTl9BVVRPX0xBQkVMUykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLmxhYmVsSW50ZXJ2YWwgPSBsYWJlbEludGVydmFsOwogIH0KICByZXR1cm4gbGFiZWxJbnRlcnZhbDsKfTsKClRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZW5zdXJlU2xvdER1cmF0aW9uID0gZnVuY3Rpb24oKSB7CiAgdmFyIGlucHV0LCBqLCBsYWJlbEludGVydmFsLCBsZW4sIHNsb3RDbnQsIHNsb3REdXJhdGlvbiwgc2xvdHNQZXJMYWJlbCwgdHJ5U2xvdER1cmF0aW9uOwogIHNsb3REdXJhdGlvbiA9IHRoaXMuc2xvdER1cmF0aW9uOwogIGlmICghc2xvdER1cmF0aW9uKSB7CiAgICBsYWJlbEludGVydmFsID0gdGhpcy5lbnN1cmVMYWJlbEludGVydmFsKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSBTVE9DS19TVUJfRFVSQVRJT05TLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGlucHV0ID0gU1RPQ0tfU1VCX0RVUkFUSU9OU1tqXTsKICAgICAgdHJ5U2xvdER1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKGlucHV0KTsKICAgICAgc2xvdHNQZXJMYWJlbCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihsYWJlbEludGVydmFsLCB0cnlTbG90RHVyYXRpb24pOwogICAgICBpZiAoaXNJbnQoc2xvdHNQZXJMYWJlbCkgJiYgc2xvdHNQZXJMYWJlbCA+IDEgJiYgc2xvdHNQZXJMYWJlbCA8PSBNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwpIHsKICAgICAgICBzbG90RHVyYXRpb24gPSB0cnlTbG90RHVyYXRpb247CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChzbG90RHVyYXRpb24gJiYgdGhpcy5kdXJhdGlvbikgewogICAgICBzbG90Q250ID0gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKHRoaXMuZHVyYXRpb24sIHNsb3REdXJhdGlvbik7CiAgICAgIGlmIChzbG90Q250ID4gTUFYX0FVVE9fQ0VMTFMpIHsKICAgICAgICBzbG90RHVyYXRpb24gPSBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoIXNsb3REdXJhdGlvbikgewogICAgICBzbG90RHVyYXRpb24gPSBsYWJlbEludGVydmFsOwogICAgfQogICAgdGhpcy5zbG90RHVyYXRpb24gPSBzbG90RHVyYXRpb247CiAgfQogIHJldHVybiBzbG90RHVyYXRpb247Cn07CgpUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVIZWFkZXJGb3JtYXRzID0gZnVuY3Rpb24oKSB7CiAgdmFyIGZvcm1hdDAsIGZvcm1hdDEsIGZvcm1hdDIsIGdyaWREdXJhdGlvbiwgbGFiZWxJbnRlcnZhbCwgdW5pdCwgdmlldywgd2Vla051bWJlcnNWaXNpYmxlOwogIHZpZXcgPSB0aGlzLnZpZXc7CiAgZ3JpZER1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjsKICBsYWJlbEludGVydmFsID0gdGhpcy5sYWJlbEludGVydmFsOwogIHVuaXQgPSBjb21wdXRlSW50ZXJ2YWxVbml0KGxhYmVsSW50ZXJ2YWwpOwogIHdlZWtOdW1iZXJzVmlzaWJsZSA9IHRoaXMub3B0KCd3ZWVrTnVtYmVycycpOwogIGZvcm1hdDAgPSBmb3JtYXQxID0gZm9ybWF0MiA9IG51bGw7CiAgaWYgKHVuaXQgPT09ICd3ZWVrJyAmJiAhd2Vla051bWJlcnNWaXNpYmxlKSB7CiAgICB1bml0ID0gJ2RheSc7CiAgfQogIHN3aXRjaCAodW5pdCkgewogICAgY2FzZSAneWVhcic6CiAgICAgIGZvcm1hdDAgPSAnWVlZWSc7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnbW9udGgnOgogICAgICBpZiAoZ3JpZER1cmF0aW9uLmFzWWVhcnMoKSA+IDEpIHsKICAgICAgICBmb3JtYXQwID0gJ1lZWVknOwogICAgICB9CiAgICAgIGZvcm1hdDEgPSAnTU1NJzsKICAgICAgYnJlYWs7CiAgICBjYXNlICd3ZWVrJzoKICAgICAgaWYgKGdyaWREdXJhdGlvbi5hc1llYXJzKCkgPiAxKSB7CiAgICAgICAgZm9ybWF0MCA9ICdZWVlZJzsKICAgICAgfQogICAgICBmb3JtYXQxID0gdGhpcy5vcHQoJ3Nob3J0V2Vla0Zvcm1hdCcpOwogICAgICBicmVhazsKICAgIGNhc2UgJ2RheSc6CiAgICAgIGlmIChncmlkRHVyYXRpb24uYXNZZWFycygpID4gMSkgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnbW9udGhZZWFyRm9ybWF0Jyk7CiAgICAgIH0gZWxzZSBpZiAoZ3JpZER1cmF0aW9uLmFzTW9udGhzKCkgPiAxKSB7CiAgICAgICAgZm9ybWF0MCA9ICdNTU1NJzsKICAgICAgfQogICAgICBpZiAod2Vla051bWJlcnNWaXNpYmxlKSB7CiAgICAgICAgZm9ybWF0MSA9IHRoaXMub3B0KCd3ZWVrRm9ybWF0Jyk7CiAgICAgIH0KICAgICAgZm9ybWF0MiA9ICdkZCBEJzsKICAgICAgYnJlYWs7CiAgICBjYXNlICdob3VyJzoKICAgICAgaWYgKHdlZWtOdW1iZXJzVmlzaWJsZSkgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnd2Vla0Zvcm1hdCcpOwogICAgICB9CiAgICAgIGlmIChncmlkRHVyYXRpb24uYXNEYXlzKCkgPiAxKSB7CiAgICAgICAgZm9ybWF0MSA9IHRoaXMub3B0KCdkYXlPZk1vbnRoRm9ybWF0Jyk7CiAgICAgIH0KICAgICAgZm9ybWF0MiA9IHRoaXMub3B0KCdzbWFsbFRpbWVGb3JtYXQnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdtaW51dGUnOgogICAgICBpZiAobGFiZWxJbnRlcnZhbC5hc01pbnV0ZXMoKSAvIDYwID49IE1BWF9BVVRPX1NMT1RTX1BFUl9MQUJFTCkgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnaG91ckZvcm1hdCcpOwogICAgICAgIGZvcm1hdDEgPSAnWzpdbW0nOwogICAgICB9IGVsc2UgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnbWVkaXVtVGltZUZvcm1hdCcpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAnc2Vjb25kJzoKICAgICAgaWYgKGxhYmVsSW50ZXJ2YWwuYXNTZWNvbmRzKCkgLyA2MCA+PSBNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwpIHsKICAgICAgICBmb3JtYXQwID0gJ0xUJzsKICAgICAgICBmb3JtYXQxID0gJ1s6XXNzJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3JtYXQwID0gJ0xUUyc7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICdtaWxsaXNlY29uZCc6CiAgICAgIGZvcm1hdDAgPSAnTFRTJzsKICAgICAgZm9ybWF0MSA9ICdbLl1TU1MnOwogIH0KICByZXR1cm4gW10uY29uY2F0KGZvcm1hdDAgfHwgW10sIGZvcm1hdDEgfHwgW10sIGZvcm1hdDIgfHwgW10pOwp9OwoKRkMudmlld3MudGltZWxpbmUgPSB7CiAgImNsYXNzIjogVGltZWxpbmVWaWV3LAogIGRlZmF1bHRzOiB7CiAgICBldmVudFJlc2l6YWJsZUZyb21TdGFydDogdHJ1ZQogIH0KfTsKCkZDLnZpZXdzLnRpbWVsaW5lRGF5ID0gewogIHR5cGU6ICd0aW1lbGluZScsCiAgZHVyYXRpb246IHsKICAgIGRheXM6IDEKICB9Cn07CgpGQy52aWV3cy50aW1lbGluZVdlZWsgPSB7CiAgdHlwZTogJ3RpbWVsaW5lJywKICBkdXJhdGlvbjogewogICAgd2Vla3M6IDEKICB9Cn07CgpGQy52aWV3cy50aW1lbGluZU1vbnRoID0gewogIHR5cGU6ICd0aW1lbGluZScsCiAgZHVyYXRpb246IHsKICAgIG1vbnRoczogMQogIH0KfTsKCkZDLnZpZXdzLnRpbWVsaW5lWWVhciA9IHsKICB0eXBlOiAndGltZWxpbmUnLAogIGR1cmF0aW9uOiB7CiAgICB5ZWFyczogMQogIH0KfTsKClJlc291cmNlVGltZWxpbmVWaWV3ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoUmVzb3VyY2VUaW1lbGluZVZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZVRpbWVsaW5lVmlldygpIHsKICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIFJlc291cmNlVGltZWxpbmVWaWV3Lm1peGluKFJlc291cmNlVmlld01peGluKTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlc291cmNlR3JpZCA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS50Ym9keUhhc2ggPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuam9pbmVyID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmRpdmlkZXJFbHMgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuc3VwZXJIZWFkZXJUZXh0ID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmlzVkdyb3VwaW5nID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmlzSEdyb3VwaW5nID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmdyb3VwU3BlY3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuY29sU3BlY3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUub3JkZXJTcGVjcyA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yb3dIaWVyYXJjaHkgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVzb3VyY2VSb3dIYXNoID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLm5lc3RpbmdDbnQgPSAwOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuaXNOZXN0aW5nID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmRpdmlkZXJXaWR0aCA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24oKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18uaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgdGhpcy5wcm9jZXNzUmVzb3VyY2VPcHRpb25zKCk7CiAgICB0aGlzLnJlc291cmNlR3JpZCA9IG5ldyBTcHJlYWRzaGVldCh0aGlzKTsKICAgIHRoaXMucm93SGllcmFyY2h5ID0gbmV3IFJvd1BhcmVudCh0aGlzKTsKICAgIHJldHVybiB0aGlzLnJlc291cmNlUm93SGFzaCA9IHt9OwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnN0YW50aWF0ZUdyaWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBuZXcgUmVzb3VyY2VUaW1lbGluZUdyaWQodGhpcyk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnByb2Nlc3NSZXNvdXJjZU9wdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhbGxDb2xTcGVjcywgYWxsT3JkZXJTcGVjcywgY29sU3BlYywgZGVmYXVsdExhYmVsVGV4dCwgZ3JvdXBDb2xTcGVjcywgZ3JvdXBTcGVjLCBncm91cFNwZWNzLCBoR3JvdXBGaWVsZCwgaXNHcm91cCwgaXNIR3JvdXBpbmcsIGlzVkdyb3VwaW5nLCBqLCBrLCBsLCBsYWJlbFRleHQsIGxlbiwgbGVuMSwgbGVuMiwgb3JkZXJTcGVjLCBwbGFpbkNvbFNwZWNzLCBwbGFpbk9yZGVyU3BlY3MsIHN1cGVySGVhZGVyVGV4dDsKICAgIGFsbENvbFNwZWNzID0gdGhpcy5vcHQoJ3Jlc291cmNlQ29sdW1ucycpIHx8IFtdOwogICAgbGFiZWxUZXh0ID0gdGhpcy5vcHQoJ3Jlc291cmNlTGFiZWxUZXh0Jyk7CiAgICBkZWZhdWx0TGFiZWxUZXh0ID0gJ1Jlc291cmNlcyc7CiAgICBzdXBlckhlYWRlclRleHQgPSBudWxsOwogICAgaWYgKCFhbGxDb2xTcGVjcy5sZW5ndGgpIHsKICAgICAgYWxsQ29sU3BlY3MucHVzaCh7CiAgICAgICAgbGFiZWxUZXh0OiBsYWJlbFRleHQgfHwgZGVmYXVsdExhYmVsVGV4dCwKICAgICAgICB0ZXh0OiB0aGlzLmdldFJlc291cmNlVGV4dEZ1bmMoKQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVySGVhZGVyVGV4dCA9IGxhYmVsVGV4dDsKICAgIH0KICAgIHBsYWluQ29sU3BlY3MgPSBbXTsKICAgIGdyb3VwQ29sU3BlY3MgPSBbXTsKICAgIGdyb3VwU3BlY3MgPSBbXTsKICAgIGlzVkdyb3VwaW5nID0gZmFsc2U7CiAgICBpc0hHcm91cGluZyA9IGZhbHNlOwogICAgZm9yIChqID0gMCwgbGVuID0gYWxsQ29sU3BlY3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY29sU3BlYyA9IGFsbENvbFNwZWNzW2pdOwogICAgICBpZiAoY29sU3BlYy5ncm91cCkgewogICAgICAgIGdyb3VwQ29sU3BlY3MucHVzaChjb2xTcGVjKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbGFpbkNvbFNwZWNzLnB1c2goY29sU3BlYyk7CiAgICAgIH0KICAgIH0KICAgIHBsYWluQ29sU3BlY3NbMF0uaXNNYWluID0gdHJ1ZTsKICAgIGlmIChncm91cENvbFNwZWNzLmxlbmd0aCkgewogICAgICBncm91cFNwZWNzID0gZ3JvdXBDb2xTcGVjczsKICAgICAgaXNWR3JvdXBpbmcgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgaEdyb3VwRmllbGQgPSB0aGlzLm9wdCgncmVzb3VyY2VHcm91cEZpZWxkJyk7CiAgICAgIGlmIChoR3JvdXBGaWVsZCkgewogICAgICAgIGlzSEdyb3VwaW5nID0gdHJ1ZTsKICAgICAgICBncm91cFNwZWNzLnB1c2goewogICAgICAgICAgZmllbGQ6IGhHcm91cEZpZWxkLAogICAgICAgICAgdGV4dDogdGhpcy5vcHQoJ3Jlc291cmNlR3JvdXBUZXh0JyksCiAgICAgICAgICByZW5kZXI6IHRoaXMub3B0KCdyZXNvdXJjZUdyb3VwUmVuZGVyJykKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgYWxsT3JkZXJTcGVjcyA9IHBhcnNlRmllbGRTcGVjcyh0aGlzLm9wdCgncmVzb3VyY2VPcmRlcicpKTsKICAgIHBsYWluT3JkZXJTcGVjcyA9IFtdOwogICAgZm9yIChrID0gMCwgbGVuMSA9IGFsbE9yZGVyU3BlY3MubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgIG9yZGVyU3BlYyA9IGFsbE9yZGVyU3BlY3Nba107CiAgICAgIGlzR3JvdXAgPSBmYWxzZTsKICAgICAgZm9yIChsID0gMCwgbGVuMiA9IGdyb3VwU3BlY3MubGVuZ3RoOyBsIDwgbGVuMjsgbCsrKSB7CiAgICAgICAgZ3JvdXBTcGVjID0gZ3JvdXBTcGVjc1tsXTsKICAgICAgICBpZiAoZ3JvdXBTcGVjLmZpZWxkID09PSBvcmRlclNwZWMuZmllbGQpIHsKICAgICAgICAgIGdyb3VwU3BlYy5vcmRlciA9IG9yZGVyU3BlYy5vcmRlcjsKICAgICAgICAgIGlzR3JvdXAgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghaXNHcm91cCkgewogICAgICAgIHBsYWluT3JkZXJTcGVjcy5wdXNoKG9yZGVyU3BlYyk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuc3VwZXJIZWFkZXJUZXh0ID0gc3VwZXJIZWFkZXJUZXh0OwogICAgdGhpcy5pc1ZHcm91cGluZyA9IGlzVkdyb3VwaW5nOwogICAgdGhpcy5pc0hHcm91cGluZyA9IGlzSEdyb3VwaW5nOwogICAgdGhpcy5ncm91cFNwZWNzID0gZ3JvdXBTcGVjczsKICAgIHRoaXMuY29sU3BlY3MgPSBncm91cENvbFNwZWNzLmNvbmNhdChwbGFpbkNvbFNwZWNzKTsKICAgIHJldHVybiB0aGlzLm9yZGVyU3BlY3MgPSBwbGFpbk9yZGVyU3BlY3M7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlbmRlclNrZWxldG9uID0gZnVuY3Rpb24oKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18ucmVuZGVyU2tlbGV0b24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMucmVuZGVyUmVzb3VyY2VHcmlkU2tlbGV0b24oKTsKICAgIHRoaXMudGJvZHlIYXNoID0gewogICAgICBzcHJlYWRzaGVldDogdGhpcy5yZXNvdXJjZUdyaWQudGJvZHlFbCwKICAgICAgZXZlbnQ6IHRoaXMudGltZUdyaWQudGJvZHlFbAogICAgfTsKICAgIHRoaXMuam9pbmVyID0gbmV3IFNjcm9sbEpvaW5lcigndmVydGljYWwnLCBbdGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLCB0aGlzLnRpbWVHcmlkLmJvZHlTY3JvbGxlcl0pOwogICAgcmV0dXJuIHRoaXMuaW5pdERpdmlkZXJNb3ZpbmcoKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyU2tlbGV0b25IdG1sID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gJzx0YWJsZT4gPHRoZWFkIGNsYXNzPSJmYy1oZWFkIj4gPHRyPiA8dGQgY2xhc3M9ImZjLXJlc291cmNlLWFyZWEgJyArIHRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj48L3RkPiA8dGQgY2xhc3M9ImZjLWRpdmlkZXIgZmMtY29sLXJlc2l6ZXIgJyArIHRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj48L3RkPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnICsgdGhpcy53aWRnZXRIZWFkZXJDbGFzcyArICciPjwvdGQ+IDwvdHI+IDwvdGhlYWQ+IDx0Ym9keSBjbGFzcz0iZmMtYm9keSI+IDx0cj4gPHRkIGNsYXNzPSJmYy1yZXNvdXJjZS1hcmVhICcgKyB0aGlzLndpZGdldENvbnRlbnRDbGFzcyArICciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtZGl2aWRlciBmYy1jb2wtcmVzaXplciAnICsgdGhpcy53aWRnZXRIZWFkZXJDbGFzcyArICciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtdGltZS1hcmVhICcgKyB0aGlzLndpZGdldENvbnRlbnRDbGFzcyArICciPjwvdGQ+IDwvdHI+IDwvdGJvZHk+IDwvdGFibGU+JzsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyUmVzb3VyY2VHcmlkU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVzb3VyY2VHcmlkLmVsID0gdGhpcy5lbC5maW5kKCd0Ym9keSAuZmMtcmVzb3VyY2UtYXJlYScpOwogICAgdGhpcy5yZXNvdXJjZUdyaWQuaGVhZEVsID0gdGhpcy5lbC5maW5kKCd0aGVhZCAuZmMtcmVzb3VyY2UtYXJlYScpOwogICAgcmV0dXJuIHRoaXMucmVzb3VyY2VHcmlkLnJlbmRlclNrZWxldG9uKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmluaXREaXZpZGVyTW92aW5nID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcmVmOwogICAgdGhpcy5kaXZpZGVyRWxzID0gdGhpcy5lbC5maW5kKCcuZmMtZGl2aWRlcicpOwogICAgdGhpcy5kaXZpZGVyV2lkdGggPSAocmVmID0gdGhpcy5vcHQoJ3Jlc291cmNlQXJlYVdpZHRoJykpICE9IG51bGwgPyByZWYgOiB0aGlzLnJlc291cmNlR3JpZC50YWJsZVdpZHRoOwogICAgaWYgKHRoaXMuZGl2aWRlcldpZHRoICE9IG51bGwpIHsKICAgICAgdGhpcy5wb3NpdGlvbkRpdmlkZXIodGhpcy5kaXZpZGVyV2lkdGgpOwogICAgfQogICAgcmV0dXJuIHRoaXMuZGl2aWRlckVscy5vbignbW91c2Vkb3duJywgKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihldikgewogICAgICAgIHJldHVybiBfdGhpcy5kaXZpZGVyTW91c2Vkb3duKGV2KTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZGl2aWRlck1vdXNlZG93biA9IGZ1bmN0aW9uKGV2KSB7CiAgICB2YXIgZHJhZ0xpc3RlbmVyLCBpc1JUTCwgbWF4V2lkdGgsIG1pbldpZHRoLCBvcmlnV2lkdGg7CiAgICBpc1JUTCA9IHRoaXMub3B0KCdpc1JUTCcpOwogICAgbWluV2lkdGggPSAzMDsKICAgIG1heFdpZHRoID0gdGhpcy5lbC53aWR0aCgpIC0gMzA7CiAgICBvcmlnV2lkdGggPSB0aGlzLmdldE5hdHVyYWxEaXZpZGVyV2lkdGgoKTsKICAgIGRyYWdMaXN0ZW5lciA9IG5ldyBEcmFnTGlzdGVuZXIoewogICAgICBkcmFnU3RhcnQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5kaXZpZGVyRWxzLmFkZENsYXNzKCdmYy1hY3RpdmUnKTsKICAgICAgICB9OwogICAgICB9KSh0aGlzKSwKICAgICAgZHJhZzogKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGR4LCBkeSkgewogICAgICAgICAgdmFyIHdpZHRoOwogICAgICAgICAgaWYgKGlzUlRMKSB7CiAgICAgICAgICAgIHdpZHRoID0gb3JpZ1dpZHRoIC0gZHg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aWR0aCA9IG9yaWdXaWR0aCArIGR4OwogICAgICAgICAgfQogICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbWluV2lkdGgpOwogICAgICAgICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgbWF4V2lkdGgpOwogICAgICAgICAgX3RoaXMuZGl2aWRlcldpZHRoID0gd2lkdGg7CiAgICAgICAgICBfdGhpcy5wb3NpdGlvbkRpdmlkZXIod2lkdGgpOwogICAgICAgICAgcmV0dXJuIF90aGlzLnVwZGF0ZVdpZHRoKCk7CiAgICAgICAgfTsKICAgICAgfSkodGhpcyksCiAgICAgIGRyYWdFbmQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5kaXZpZGVyRWxzLnJlbW92ZUNsYXNzKCdmYy1hY3RpdmUnKTsKICAgICAgICB9OwogICAgICB9KSh0aGlzKQogICAgfSk7CiAgICByZXR1cm4gZHJhZ0xpc3RlbmVyLnN0YXJ0SW50ZXJhY3Rpb24oZXYpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5nZXROYXR1cmFsRGl2aWRlcldpZHRoID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lbC5maW5kKCcuZmMtcmVzb3VyY2UtYXJlYScpLndpZHRoKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnBvc2l0aW9uRGl2aWRlciA9IGZ1bmN0aW9uKHcpIHsKICAgIHJldHVybiB0aGlzLmVsLmZpbmQoJy5mYy1yZXNvdXJjZS1hcmVhJykud2lkdGgodyk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlbmRlckV2ZW50cyA9IGZ1bmN0aW9uKGV2ZW50cykgewogICAgdGhpcy50aW1lR3JpZC5yZW5kZXJFdmVudHMoZXZlbnRzKTsKICAgIHRoaXMuc3luY1Jvd0hlaWdodHMoKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpZHRoKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnVucmVuZGVyRXZlbnRzID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRpbWVHcmlkLnVucmVuZGVyRXZlbnRzKCk7CiAgICB0aGlzLnN5bmNSb3dIZWlnaHRzKCk7CiAgICByZXR1cm4gdGhpcy51cGRhdGVXaWR0aCgpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS51cGRhdGVXaWR0aCA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VUaW1lbGluZVZpZXcuX19zdXBlcl9fLnVwZGF0ZVdpZHRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB0aGlzLnJlc291cmNlR3JpZC51cGRhdGVXaWR0aCgpOwogICAgdGhpcy5qb2luZXIudXBkYXRlKCk7CiAgICBpZiAodGhpcy5jZWxsRm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuY2VsbEZvbGxvd2VyLnVwZGF0ZSgpOwogICAgfQogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS51cGRhdGVIZWlnaHQgPSBmdW5jdGlvbihpc1Jlc2l6ZSkgewogICAgUmVzb3VyY2VUaW1lbGluZVZpZXcuX19zdXBlcl9fLnVwZGF0ZUhlaWdodC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKGlzUmVzaXplKSB7CiAgICAgIHJldHVybiB0aGlzLnN5bmNSb3dIZWlnaHRzKCk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uKHRvdGFsSGVpZ2h0LCBpc0F1dG8pIHsKICAgIHZhciBib2R5SGVpZ2h0LCBoZWFkSGVpZ2h0OwogICAgaGVhZEhlaWdodCA9IHRoaXMuc3luY0hlYWRIZWlnaHRzKCk7CiAgICBpZiAoaXNBdXRvKSB7CiAgICAgIGJvZHlIZWlnaHQgPSAnYXV0byc7CiAgICB9IGVsc2UgewogICAgICBib2R5SGVpZ2h0ID0gdG90YWxIZWlnaHQgLSBoZWFkSGVpZ2h0IC0gdGhpcy5xdWVyeU1pc2NIZWlnaHQoKTsKICAgIH0KICAgIHRoaXMudGltZUdyaWQuYm9keVNjcm9sbGVyLnNldEhlaWdodChib2R5SGVpZ2h0KTsKICAgIHJldHVybiB0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuc2V0SGVpZ2h0KGJvZHlIZWlnaHQpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5xdWVyeU1pc2NIZWlnaHQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmVsLm91dGVySGVpZ2h0KCkgLSBNYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSwgdGhpcy50aW1lR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSkgLSBNYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSwgdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnN5bmNIZWFkSGVpZ2h0cyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGhlYWRIZWlnaHQ7CiAgICB0aGlzLnJlc291cmNlR3JpZC5oZWFkSGVpZ2h0KCdhdXRvJyk7CiAgICB0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoJ2F1dG8nKTsKICAgIGhlYWRIZWlnaHQgPSBNYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5oZWFkSGVpZ2h0KCksIHRoaXMudGltZUdyaWQuaGVhZEhlaWdodCgpKTsKICAgIHRoaXMucmVzb3VyY2VHcmlkLmhlYWRIZWlnaHQoaGVhZEhlaWdodCk7CiAgICB0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoaGVhZEhlaWdodCk7CiAgICByZXR1cm4gaGVhZEhlaWdodDsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2Nyb2xsVG9SZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5zY3JvbGxUb1Jlc291cmNlKHJlc291cmNlKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0UmVzb3VyY2VzID0gZnVuY3Rpb24ocmVzb3VyY2VzKSB7CiAgICB2YXIgaiwgbGVuLCByZXNvdXJjZTsKICAgIHRoaXMuYmF0Y2hSb3dzKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZXNbal07CiAgICAgIHRoaXMuaW5zZXJ0UmVzb3VyY2UocmVzb3VyY2UpOwogICAgfQogICAgdGhpcy5yb3dIaWVyYXJjaHkuc2hvdygpOwogICAgdGhpcy51bmJhdGNoUm93cygpOwogICAgcmV0dXJuIHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS51bnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhckV2ZW50cygpOwogICAgdGhpcy5iYXRjaFJvd3MoKTsKICAgIHRoaXMucm93SGllcmFyY2h5LnJlbW92ZUNoaWxkcmVuKCk7CiAgICB0aGlzLnVuYmF0Y2hSb3dzKCk7CiAgICByZXR1cm4gdGhpcy5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzKCk7CiAgfTsKCgogIC8qCiAgCVRPRE86IHRoZSBzY2VuYXJpbyB3aGVyZSB0aGVyZSB3ZXJlIHByZXZpb3VzbHkgdW5hc3NvY2lhdGVkIGV2ZW50cyB0aGF0IGFyZSBub3cKICAJIGF0dGFjaGVkIHRvIHRoaXMgcmVzb3VyY2UuIHNob3VsZCByZW5kZXIgdGhvc2UgZXZlbnRzIGltbWVkaWF0ZWx5LgogIAogIAlSZXNwb25zaWJsZSBmb3IgcmVuZGVyaW5nIHRoZSBuZXcgcmVzb3VyY2UKICAgKi8KCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmFkZFJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UpIHsKICAgIHRoaXMuaW5zZXJ0UmVzb3VyY2UocmVzb3VyY2UpOwogICAgcmV0dXJuIHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICB2YXIgcm93OwogICAgcm93ID0gdGhpcy5nZXRSZXNvdXJjZVJvdyhyZXNvdXJjZS5pZCk7CiAgICBpZiAocm93KSB7CiAgICAgIHRoaXMuYmF0Y2hSb3dzKCk7CiAgICAgIHJvdy5yZW1vdmUoKTsKICAgICAgdGhpcy51bmJhdGNoUm93cygpOwogICAgICByZXR1cm4gdGhpcy5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzKCk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmNlbGxGb2xsb3dlciA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgY2VsbENvbnRlbnQsIGosIGxlbiwgbm9kZXMsIHJlZiwgcm93OwogICAgaWYgKHRoaXMuY2VsbEZvbGxvd2VyKSB7CiAgICAgIHRoaXMuY2VsbEZvbGxvd2VyLmNsZWFyU3ByaXRlcygpOwogICAgfQogICAgdGhpcy5jZWxsRm9sbG93ZXIgPSBuZXcgU2Nyb2xsRm9sbG93ZXIodGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLCB0aGlzLmNhbGVuZGFyLmlzVG91Y2gpOwogICAgdGhpcy5jZWxsRm9sbG93ZXIuaXNIRm9sbG93aW5nID0gZmFsc2U7CiAgICB0aGlzLmNlbGxGb2xsb3dlci5pc1ZGb2xsb3dpbmcgPSB0cnVlOwogICAgbm9kZXMgPSBbXTsKICAgIHJlZiA9IHRoaXMucm93SGllcmFyY2h5LmdldE5vZGVzKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcm93ID0gcmVmW2pdOwogICAgICBpZiAocm93IGluc3RhbmNlb2YgVlJvd0dyb3VwKSB7CiAgICAgICAgaWYgKHJvdy5ncm91cFRkKSB7CiAgICAgICAgICBjZWxsQ29udGVudCA9IHJvdy5ncm91cFRkLmZpbmQoJy5mYy1jZWxsLWNvbnRlbnQnKTsKICAgICAgICAgIGlmIChjZWxsQ29udGVudC5sZW5ndGgpIHsKICAgICAgICAgICAgbm9kZXMucHVzaChjZWxsQ29udGVudFswXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5jZWxsRm9sbG93ZXIuc2V0U3ByaXRlcygkKG5vZGVzKSk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmluc2VydFJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UsIHBhcmVudFJlc291cmNlUm93KSB7CiAgICB2YXIgY2hpbGRSZXNvdXJjZSwgaiwgbGVuLCBwYXJlbnRJZCwgcmVmLCByZXN1bHRzLCByb3c7CiAgICByb3cgPSBuZXcgUmVzb3VyY2VSb3codGhpcywgcmVzb3VyY2UpOwogICAgaWYgKHBhcmVudFJlc291cmNlUm93ID09IG51bGwpIHsKICAgICAgcGFyZW50SWQgPSByZXNvdXJjZS5wYXJlbnRJZDsKICAgICAgaWYgKHBhcmVudElkKSB7CiAgICAgICAgcGFyZW50UmVzb3VyY2VSb3cgPSB0aGlzLmdldFJlc291cmNlUm93KHBhcmVudElkKTsKICAgICAgfQogICAgfQogICAgaWYgKHBhcmVudFJlc291cmNlUm93KSB7CiAgICAgIHRoaXMuaW5zZXJ0Um93QXNDaGlsZChyb3csIHBhcmVudFJlc291cmNlUm93KTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaW5zZXJ0Um93KHJvdyk7CiAgICB9CiAgICByZWYgPSByZXNvdXJjZS5jaGlsZHJlbjsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBjaGlsZFJlc291cmNlID0gcmVmW2pdOwogICAgICByZXN1bHRzLnB1c2godGhpcy5pbnNlcnRSZXNvdXJjZShjaGlsZFJlc291cmNlLCByb3cpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnNlcnRSb3cgPSBmdW5jdGlvbihyb3csIHBhcmVudCwgZ3JvdXBTcGVjcykgewogICAgdmFyIGdyb3VwOwogICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CiAgICAgIHBhcmVudCA9IHRoaXMucm93SGllcmFyY2h5OwogICAgfQogICAgaWYgKGdyb3VwU3BlY3MgPT0gbnVsbCkgewogICAgICBncm91cFNwZWNzID0gdGhpcy5ncm91cFNwZWNzOwogICAgfQogICAgaWYgKGdyb3VwU3BlY3MubGVuZ3RoKSB7CiAgICAgIGdyb3VwID0gdGhpcy5lbnN1cmVSZXNvdXJjZUdyb3VwKHJvdywgcGFyZW50LCBncm91cFNwZWNzWzBdKTsKICAgICAgaWYgKGdyb3VwIGluc3RhbmNlb2YgSFJvd0dyb3VwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0Um93QXNDaGlsZChyb3csIGdyb3VwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRSb3cocm93LCBncm91cCwgZ3JvdXBTcGVjcy5zbGljZSgxKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmluc2VydFJvd0FzQ2hpbGQocm93LCBwYXJlbnQpOwogICAgfQogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnNlcnRSb3dBc0NoaWxkID0gZnVuY3Rpb24ocm93LCBwYXJlbnQpIHsKICAgIHJldHVybiBwYXJlbnQuYWRkQ2hpbGQocm93LCB0aGlzLmNvbXB1dGVDaGlsZFJvd1Bvc2l0aW9uKHJvdywgcGFyZW50KSk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmNvbXB1dGVDaGlsZFJvd1Bvc2l0aW9uID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgewogICAgdmFyIGNtcCwgaSwgaiwgbGVuLCByZWYsIHNpYmxpbmc7CiAgICBpZiAodGhpcy5vcmRlclNwZWNzLmxlbmd0aCkgewogICAgICByZWYgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7CiAgICAgICAgc2libGluZyA9IHJlZltpXTsKICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmVSZXNvdXJjZXMoc2libGluZy5yZXNvdXJjZSB8fCB7fSwgY2hpbGQucmVzb3VyY2UgfHwge30pOwogICAgICAgIGlmIChjbXAgPiAwKSB7CiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5jb21wYXJlUmVzb3VyY2VzID0gZnVuY3Rpb24oYSwgYikgewogICAgcmV0dXJuIGNvbXBhcmVCeUZpZWxkU3BlY3MoYSwgYiwgdGhpcy5vcmRlclNwZWNzKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZW5zdXJlUmVzb3VyY2VHcm91cCA9IGZ1bmN0aW9uKHJvdywgcGFyZW50LCBzcGVjKSB7CiAgICB2YXIgY21wLCBncm91cCwgZ3JvdXBWYWx1ZSwgaSwgaiwgaywgbGVuLCBsZW4xLCByZWYsIHJlZjEsIHRlc3RHcm91cDsKICAgIGdyb3VwVmFsdWUgPSAocm93LnJlc291cmNlIHx8IHt9KVtzcGVjLmZpZWxkXTsKICAgIGdyb3VwID0gbnVsbDsKICAgIGlmIChzcGVjLm9yZGVyKSB7CiAgICAgIHJlZiA9IHBhcmVudC5jaGlsZHJlbjsKICAgICAgZm9yIChpID0gaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGkgPSArK2opIHsKICAgICAgICB0ZXN0R3JvdXAgPSByZWZbaV07CiAgICAgICAgY21wID0gZmxleGlibGVDb21wYXJlKHRlc3RHcm91cC5ncm91cFZhbHVlLCBncm91cFZhbHVlKSAqIHNwZWMub3JkZXI7CiAgICAgICAgaWYgKGNtcCA9PT0gMCkgewogICAgICAgICAgZ3JvdXAgPSB0ZXN0R3JvdXA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVmMSA9IHBhcmVudC5jaGlsZHJlbjsKICAgICAgZm9yIChpID0gayA9IDAsIGxlbjEgPSByZWYxLmxlbmd0aDsgayA8IGxlbjE7IGkgPSArK2spIHsKICAgICAgICB0ZXN0R3JvdXAgPSByZWYxW2ldOwogICAgICAgIGlmICh0ZXN0R3JvdXAuZ3JvdXBWYWx1ZSA9PT0gZ3JvdXBWYWx1ZSkgewogICAgICAgICAgZ3JvdXAgPSB0ZXN0R3JvdXA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghZ3JvdXApIHsKICAgICAgaWYgKHRoaXMuaXNWR3JvdXBpbmcpIHsKICAgICAgICBncm91cCA9IG5ldyBWUm93R3JvdXAodGhpcywgc3BlYywgZ3JvdXBWYWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ3JvdXAgPSBuZXcgSFJvd0dyb3VwKHRoaXMsIHNwZWMsIGdyb3VwVmFsdWUpOwogICAgICB9CiAgICAgIHBhcmVudC5hZGRDaGlsZChncm91cCwgaSk7CiAgICB9CiAgICByZXR1cm4gZ3JvdXA7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnBhaXJTZWdzV2l0aFJvd3MgPSBmdW5jdGlvbihzZWdzKSB7CiAgICB2YXIgaiwgbGVuLCBwYWlyLCBwYWlycywgcGFpcnNCeUlkLCByZXNvdXJjZUlkLCByb3dPYmosIHNlZzsKICAgIHBhaXJzID0gW107CiAgICBwYWlyc0J5SWQgPSB7fTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgc2VnID0gc2Vnc1tqXTsKICAgICAgcmVzb3VyY2VJZCA9IHNlZy5yZXNvdXJjZUlkOwogICAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICAgIHJvd09iaiA9IHRoaXMuZ2V0UmVzb3VyY2VSb3cocmVzb3VyY2VJZCk7CiAgICAgICAgaWYgKHJvd09iaikgewogICAgICAgICAgcGFpciA9IHBhaXJzQnlJZFtyZXNvdXJjZUlkXTsKICAgICAgICAgIGlmICghcGFpcikgewogICAgICAgICAgICBwYWlyID0gW3Jvd09iaiwgW11dOwogICAgICAgICAgICBwYWlycy5wdXNoKHBhaXIpOwogICAgICAgICAgICBwYWlyc0J5SWRbcmVzb3VyY2VJZF0gPSBwYWlyOwogICAgICAgICAgfQogICAgICAgICAgcGFpclsxXS5wdXNoKHNlZyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGFpcnM7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd0FkZGVkID0gZnVuY3Rpb24ocm93KSB7CiAgICB2YXIgaXNOZXN0aW5nLCB3YXNOZXN0aW5nOwogICAgaWYgKHJvdyBpbnN0YW5jZW9mIFJlc291cmNlUm93KSB7CiAgICAgIHRoaXMucmVzb3VyY2VSb3dIYXNoW3Jvdy5yZXNvdXJjZS5pZF0gPSByb3c7CiAgICAgIHRoaXMudGltZUdyaWQuYXNzaWduUm93QnVzaW5lc3NIb3VyU2Vncyhyb3cpOwogICAgfQogICAgd2FzTmVzdGluZyA9IHRoaXMuaXNOZXN0aW5nOwogICAgaXNOZXN0aW5nID0gQm9vbGVhbih0aGlzLm5lc3RpbmdDbnQgKz0gcm93LmRlcHRoID8gMSA6IDApOwogICAgaWYgKHdhc05lc3RpbmcgIT09IGlzTmVzdGluZykgewogICAgICB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1uZXN0ZWQnLCBpc05lc3RpbmcpOwogICAgICB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1mbGF0JywgIWlzTmVzdGluZyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5pc05lc3RpbmcgPSBpc05lc3Rpbmc7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIHZhciBpc05lc3RpbmcsIHdhc05lc3Rpbmc7CiAgICBpZiAocm93IGluc3RhbmNlb2YgUmVzb3VyY2VSb3cpIHsKICAgICAgZGVsZXRlIHRoaXMucmVzb3VyY2VSb3dIYXNoW3Jvdy5yZXNvdXJjZS5pZF07CiAgICAgIHRoaXMudGltZUdyaWQuZGVzdHJveVJvd0J1c2luZXNzSG91clNlZ3Mocm93KTsKICAgIH0KICAgIHdhc05lc3RpbmcgPSB0aGlzLmlzTmVzdGluZzsKICAgIGlzTmVzdGluZyA9IEJvb2xlYW4odGhpcy5uZXN0aW5nQ250IC09IHJvdy5kZXB0aCA/IDEgOiAwKTsKICAgIGlmICh3YXNOZXN0aW5nICE9PSBpc05lc3RpbmcpIHsKICAgICAgdGhpcy5lbC50b2dnbGVDbGFzcygnZmMtbmVzdGVkJywgaXNOZXN0aW5nKTsKICAgICAgdGhpcy5lbC50b2dnbGVDbGFzcygnZmMtZmxhdCcsICFpc05lc3RpbmcpOwogICAgfQogICAgcmV0dXJuIHRoaXMuaXNOZXN0aW5nID0gaXNOZXN0aW5nOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5iYXRjaFJvd0RlcHRoID0gMDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnNob3duUm93QmF0Y2ggPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuaGlkZGVuUm93QmF0Y2ggPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuYmF0Y2hSb3dzID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoISh0aGlzLmJhdGNoUm93RGVwdGgrKykpIHsKICAgICAgdGhpcy5zaG93blJvd0JhdGNoID0gW107CiAgICAgIHJldHVybiB0aGlzLmhpZGRlblJvd0JhdGNoID0gW107CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnVuYmF0Y2hSb3dzID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoISgtLXRoaXMuYmF0Y2hSb3dEZXB0aCkpIHsKICAgICAgaWYgKHRoaXMuaGlkZGVuUm93QmF0Y2gubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5yb3dzSGlkZGVuKHRoaXMuaGlkZGVuUm93QmF0Y2gpOwogICAgICB9CiAgICAgIGlmICh0aGlzLnNob3duUm93QmF0Y2gubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5yb3dzU2hvd24odGhpcy5zaG93blJvd0JhdGNoKTsKICAgICAgfQogICAgICB0aGlzLmhpZGRlblJvd0JhdGNoID0gbnVsbDsKICAgICAgcmV0dXJuIHRoaXMuc2hvd25Sb3dCYXRjaCA9IG51bGw7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd1Nob3duID0gZnVuY3Rpb24ocm93KSB7CiAgICBpZiAodGhpcy5zaG93blJvd0JhdGNoKSB7CiAgICAgIHJldHVybiB0aGlzLnNob3duUm93QmF0Y2gucHVzaChyb3cpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRoaXMucm93c1Nob3duKFtyb3ddKTsKICAgIH0KICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucm93SGlkZGVuID0gZnVuY3Rpb24ocm93KSB7CiAgICBpZiAodGhpcy5oaWRkZW5Sb3dCYXRjaCkgewogICAgICByZXR1cm4gdGhpcy5oaWRkZW5Sb3dCYXRjaC5wdXNoKHJvdyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdGhpcy5yb3dzSGlkZGVuKFtyb3ddKTsKICAgIH0KICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucm93c1Nob3duID0gZnVuY3Rpb24ocm93cykgewogICAgdGhpcy5zeW5jUm93SGVpZ2h0cyhyb3dzKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpZHRoKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd3NIaWRkZW4gPSBmdW5jdGlvbihyb3dzKSB7CiAgICByZXR1cm4gdGhpcy51cGRhdGVXaWR0aCgpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5zeW5jUm93SGVpZ2h0cyA9IGZ1bmN0aW9uKHZpc2libGVSb3dzLCBzYWZlKSB7CiAgICB2YXIgaCwgaDEsIGgyLCBpLCBpbm5lckhlaWdodHMsIGosIGssIGxlbiwgbGVuMSwgcm93OwogICAgaWYgKHNhZmUgPT0gbnVsbCkgewogICAgICBzYWZlID0gZmFsc2U7CiAgICB9CiAgICBpZiAodmlzaWJsZVJvd3MgPT0gbnVsbCkgewogICAgICB2aXNpYmxlUm93cyA9IHRoaXMuZ2V0VmlzaWJsZVJvd3MoKTsKICAgIH0KICAgIGZvciAoaiA9IDAsIGxlbiA9IHZpc2libGVSb3dzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHJvdyA9IHZpc2libGVSb3dzW2pdOwogICAgICByb3cuc2V0VHJJbm5lckhlaWdodCgnJyk7CiAgICB9CiAgICBpbm5lckhlaWdodHMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBrLCBsZW4xLCByZXN1bHRzOwogICAgICByZXN1bHRzID0gW107CiAgICAgIGZvciAoayA9IDAsIGxlbjEgPSB2aXNpYmxlUm93cy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICByb3cgPSB2aXNpYmxlUm93c1trXTsKICAgICAgICBoID0gcm93LmdldE1heFRySW5uZXJIZWlnaHQoKTsKICAgICAgICBpZiAoc2FmZSkgewogICAgICAgICAgaCArPSBoICUgMjsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGgpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSkoKTsKICAgIGZvciAoaSA9IGsgPSAwLCBsZW4xID0gdmlzaWJsZVJvd3MubGVuZ3RoOyBrIDwgbGVuMTsgaSA9ICsraykgewogICAgICByb3cgPSB2aXNpYmxlUm93c1tpXTsKICAgICAgcm93LnNldFRySW5uZXJIZWlnaHQoaW5uZXJIZWlnaHRzW2ldKTsKICAgIH0KICAgIGlmICghc2FmZSkgewogICAgICBoMSA9IHRoaXMucmVzb3VyY2VHcmlkLnRib2R5RWwuaGVpZ2h0KCk7CiAgICAgIGgyID0gdGhpcy50aW1lR3JpZC50Ym9keUVsLmhlaWdodCgpOwogICAgICBpZiAoTWF0aC5hYnMoaDEgLSBoMikgPiAxKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3luY1Jvd0hlaWdodHModmlzaWJsZVJvd3MsIHRydWUpOwogICAgICB9CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmdldFZpc2libGVSb3dzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHJvdzsKICAgIHJlZiA9IHRoaXMucm93SGllcmFyY2h5LmdldFJvd3MoKTsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByb3cgPSByZWZbal07CiAgICAgIGlmIChyb3cuaXNTaG93bikgewogICAgICAgIHJlc3VsdHMucHVzaChyb3cpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZ2V0RXZlbnRSb3dzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHJvdzsKICAgIHJlZiA9IHRoaXMucm93SGllcmFyY2h5LmdldFJvd3MoKTsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByb3cgPSByZWZbal07CiAgICAgIGlmIChyb3cgaW5zdGFuY2VvZiBFdmVudFJvdykgewogICAgICAgIHJlc3VsdHMucHVzaChyb3cpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZ2V0UmVzb3VyY2VSb3cgPSBmdW5jdGlvbihyZXNvdXJjZUlkKSB7CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVJvd0hhc2hbcmVzb3VyY2VJZF07CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnNldFNjcm9sbCA9IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18uc2V0U2Nyb2xsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLnNldFNjcm9sbFRvcChzdGF0ZS50b3ApOwogIH07CgogIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lVmlldzsKCn0pKFRpbWVsaW5lVmlldyk7CgpSZXNvdXJjZVRpbWVsaW5lR3JpZCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKFJlc291cmNlVGltZWxpbmVHcmlkLCBzdXBlckNsYXNzKTsKCiAgZnVuY3Rpb24gUmVzb3VyY2VUaW1lbGluZUdyaWQoKSB7CiAgICByZXR1cm4gUmVzb3VyY2VUaW1lbGluZUdyaWQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5taXhpbihSZXNvdXJjZUdyaWRNaXhpbik7CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5ldmVudFJvd3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2hvd25FdmVudFJvd3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUudGJvZHlFbCA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yb3dDb29yZENhY2hlID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLnNwYW5Ub1NlZ3MgPSBmdW5jdGlvbihzcGFuKSB7CiAgICB2YXIgY2FsZW5kYXIsIGosIGxlbiwgcmVzb3VyY2VJZCwgc2VnLCBzZWdzOwogICAgc2VncyA9IFJlc291cmNlVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zcGFuVG9TZWdzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBjYWxlbmRhciA9IHRoaXMudmlldy5jYWxlbmRhcjsKICAgIHJlc291cmNlSWQgPSBzcGFuLnJlc291cmNlSWQ7CiAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICBmb3IgKGogPSAwLCBsZW4gPSBzZWdzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2VnID0gc2Vnc1tqXTsKICAgICAgICBzZWcucmVzb3VyY2UgPSBjYWxlbmRhci5nZXRSZXNvdXJjZUJ5SWQocmVzb3VyY2VJZCk7CiAgICAgICAgc2VnLnJlc291cmNlSWQgPSByZXNvdXJjZUlkOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2VnczsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucHJlcGFyZUhpdHMgPSBmdW5jdGlvbigpIHsKICAgIHZhciByb3csIHRyQXJyYXk7CiAgICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucHJlcGFyZUhpdHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMuZXZlbnRSb3dzID0gdGhpcy52aWV3LmdldEV2ZW50Um93cygpOwogICAgdGhpcy5zaG93bkV2ZW50Um93cyA9IChmdW5jdGlvbigpIHsKICAgICAgdmFyIGosIGxlbiwgcmVmLCByZXN1bHRzOwogICAgICByZWYgPSB0aGlzLmV2ZW50Um93czsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByb3cgPSByZWZbal07CiAgICAgICAgaWYgKHJvdy5pc1Nob3duKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2gocm93KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KS5jYWxsKHRoaXMpOwogICAgdHJBcnJheSA9IChmdW5jdGlvbigpIHsKICAgICAgdmFyIGosIGxlbiwgcmVmLCByZXN1bHRzOwogICAgICByZWYgPSB0aGlzLnNob3duRXZlbnRSb3dzOwogICAgICByZXN1bHRzID0gW107CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIHJvdyA9IHJlZltqXTsKICAgICAgICByZXN1bHRzLnB1c2gocm93LmdldFRyKCdldmVudCcpWzBdKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgICB0aGlzLnJvd0Nvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CiAgICAgIGVsczogdHJBcnJheSwKICAgICAgaXNWZXJ0aWNhbDogdHJ1ZQogICAgfSk7CiAgICByZXR1cm4gdGhpcy5yb3dDb29yZENhY2hlLmJ1aWxkKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbGVhc2VIaXRzID0gZnVuY3Rpb24oKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucmVsZWFzZUhpdHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMuZXZlbnRSb3dzID0gbnVsbDsKICAgIHRoaXMuc2hvd25FdmVudFJvd3MgPSBudWxsOwogICAgcmV0dXJuIHRoaXMucm93Q29vcmRDYWNoZS5jbGVhcigpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeUhpdCA9IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewogICAgdmFyIHJvd0luZGV4LCBzaW1wbGVIaXQ7CiAgICBzaW1wbGVIaXQgPSBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucXVlcnlIaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmIChzaW1wbGVIaXQpIHsKICAgICAgcm93SW5kZXggPSB0aGlzLnJvd0Nvb3JkQ2FjaGUuZ2V0VmVydGljYWxJbmRleCh0b3BPZmZzZXQpOwogICAgICBpZiAocm93SW5kZXggIT0gbnVsbCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXNvdXJjZUlkOiB0aGlzLnNob3duRXZlbnRSb3dzW3Jvd0luZGV4XS5yZXNvdXJjZS5pZCwKICAgICAgICAgIHNuYXA6IHNpbXBsZUhpdC5zbmFwLAogICAgICAgICAgY29tcG9uZW50OiB0aGlzLAogICAgICAgICAgbGVmdDogc2ltcGxlSGl0LmxlZnQsCiAgICAgICAgICByaWdodDogc2ltcGxlSGl0LnJpZ2h0LAogICAgICAgICAgdG9wOiB0aGlzLnJvd0Nvb3JkQ2FjaGUuZ2V0VG9wT2Zmc2V0KHJvd0luZGV4KSwKICAgICAgICAgIGJvdHRvbTogdGhpcy5yb3dDb29yZENhY2hlLmdldEJvdHRvbU9mZnNldChyb3dJbmRleCkKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldEhpdFNwYW4gPSBmdW5jdGlvbihoaXQpIHsKICAgIHZhciBzcGFuOwogICAgc3BhbiA9IHRoaXMuZ2V0U25hcFJhbmdlKGhpdC5zbmFwKTsKICAgIHNwYW4ucmVzb3VyY2VJZCA9IGhpdC5yZXNvdXJjZUlkOwogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldEhpdEVsID0gZnVuY3Rpb24oaGl0KSB7CiAgICByZXR1cm4gdGhpcy5nZXRTbmFwRWwoaGl0LnNuYXApOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHJvd0NvbnRhaW5lckVsOwogICAgUmVzb3VyY2VUaW1lbGluZUdyaWQuX19zdXBlcl9fLnJlbmRlclNrZWxldG9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB0aGlzLnNlZ0NvbnRhaW5lckVsLnJlbW92ZSgpOwogICAgdGhpcy5zZWdDb250YWluZXJFbCA9IG51bGw7CiAgICByb3dDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLXJvd3MiPjx0YWJsZT48dGJvZHkvPjwvdGFibGU+PC9kaXY+JykuYXBwZW5kVG8odGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbCk7CiAgICByZXR1cm4gdGhpcy50Ym9keUVsID0gcm93Q29udGFpbmVyRWwuZmluZCgndGJvZHknKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmdTZWdzID0gZnVuY3Rpb24oc2VncykgewogICAgdmFyIGNvbnRhaW5lck9iaiwgY29udGFpbmVyU2VncywgaiwgbGVuLCBwYWlyLCBwYWlycywgdmlzaWJsZVBhaXJzOwogICAgc2VncyA9IHRoaXMucmVuZGVyRmdTZWdFbHMoc2Vncyk7CiAgICBwYWlycyA9IHRoaXMudmlldy5wYWlyU2Vnc1dpdGhSb3dzKHNlZ3MpOwogICAgdmlzaWJsZVBhaXJzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBwYWlyID0gcGFpcnNbal07CiAgICAgIGNvbnRhaW5lck9iaiA9IHBhaXJbMF0sIGNvbnRhaW5lclNlZ3MgPSBwYWlyWzFdOwogICAgICBjb250YWluZXJPYmouZmdTZWdzID0gY29udGFpbmVyU2VnczsKICAgICAgaWYgKGNvbnRhaW5lck9iai5pc1Nob3duKSB7CiAgICAgICAgY29udGFpbmVyT2JqLmlzU2Vnc1JlbmRlcmVkID0gdHJ1ZTsKICAgICAgICB2aXNpYmxlUGFpcnMucHVzaChwYWlyKTsKICAgICAgfQogICAgfQogICAgdGhpcy5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnModmlzaWJsZVBhaXJzKTsKICAgIHRoaXMudXBkYXRlU2VnRm9sbG93ZXJzKHNlZ3MpOwogICAgcmV0dXJuIHNlZ3M7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyRmdTZWdzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZXZlbnRSb3csIGV2ZW50Um93cywgaiwgbGVuOwogICAgdGhpcy5jbGVhclNlZ0ZvbGxvd2VycygpOwogICAgZXZlbnRSb3dzID0gdGhpcy52aWV3LmdldEV2ZW50Um93cygpOwogICAgZm9yIChqID0gMCwgbGVuID0gZXZlbnRSb3dzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGV2ZW50Um93ID0gZXZlbnRSb3dzW2pdOwogICAgICBldmVudFJvdy5mZ1NlZ3MgPSBudWxsOwogICAgICBldmVudFJvdy5pc1NlZ3NSZW5kZXJlZCA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRoaXMudW5yZW5kZXJGZ0NvbnRhaW5lcnMoZXZlbnRSb3dzKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMgPSAwOwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpIHsKICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlSW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfQogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS51bnJlbmRlckJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnJvd0NudFdpdGhDdXN0b21CdXNpbmVzc0hvdXJzKSB7CiAgICAgIHJldHVybiB0aGlzLmNsZWFySW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18udW5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUVuc3VyZXMgdGhhdCBhbGwgcm93cyBoYXZlIHRoZWlyIGluZGl2aWR1YWwgYnVzaW5lc3MgaG91cnMgRElTUExBWUVELgogICAqLwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZW5zdXJlSW5kaXZpZHVhbEJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0cywgcm93OwogICAgcmVmID0gdGhpcy52aWV3LmdldEV2ZW50Um93cygpOwogICAgcmVzdWx0cyA9IFtdOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHJvdyA9IHJlZltqXTsKICAgICAgaWYgKCFyb3cuYnVzaW5lc3NIb3VyU2VncykgewogICAgICAgIHRoaXMucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2Vncyhyb3cpOwogICAgICB9CiAgICAgIGlmIChyb3cuaXNTaG93bikgewogICAgICAgIHJlc3VsdHMucHVzaChyb3cuZW5zdXJlQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKCiAgLyoKICAJRW5zdXJlcyB0aGF0IGFsbCByb3dzIGhhdmUgdGhlaXIgaW5kaXZpZHVhbCBidXNpbmVzcyBob3VycyBDTEVBUkVELgogICAqLwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUuY2xlYXJJbmRpdmlkdWFsQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGosIGxlbiwgcmVmLCByZXN1bHRzLCByb3c7CiAgICByZWYgPSB0aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCk7CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcm93ID0gcmVmW2pdOwogICAgICByZXN1bHRzLnB1c2gocm93LmNsZWFyQnVzaW5lc3NIb3VyU2VncygpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgoKICAvKgogIAlDYWxsZWQgd2hlbiBhIHJvdyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZSwgYnV0IGJlZm9yZSBpdCdzIHJlbmRlcmVkLgogIAlDb21wdXRlcyBhbmQgYXNzaWducyBidXNpbmVzcyBob3VyIGRhdGEgKmlmIG5lY2Vzc2FyeSouIFRvIGJlIHJlbmRlcmVkIHNvb24gYWZ0ZXIuCiAgICovCgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5hc3NpZ25Sb3dCdXNpbmVzc0hvdXJTZWdzID0gZnVuY3Rpb24ocm93KSB7CiAgICBpZiAocm93LnJlc291cmNlLmJ1c2luZXNzSG91cnMpIHsKICAgICAgaWYgKCF0aGlzLnJvd0NudFdpdGhDdXN0b21CdXNpbmVzc0hvdXJzKSB7CiAgICAgICAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS51bnJlbmRlckJ1c2luZXNzSG91cnMuY2FsbCh0aGlzKTsKICAgICAgICB0aGlzLmVuc3VyZUluZGl2aWR1YWxCdXNpbmVzc0hvdXJzKCk7CiAgICAgIH0KICAgICAgdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3VycyArPSAxOwogICAgfQogICAgaWYgKHRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpIHsKICAgICAgcmV0dXJuIHRoaXMucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2Vncyhyb3cpOwogICAgfQogIH07CgoKICAvKgogIAlDYWxsZWQgd2hlbiBhIHJvdyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmUuCiAgCVVucmVuZGVycyB0aGUgcm93J3Mgc2VncyBhbmQsIGlmIG5lY2Vzc2FyeSwgZm9yY2VzIGJ1c2luZXNzSG91cnMgYmFjayB0byBnZW5lcmljIHJlbmRlcmluZy4KICAgKi8KCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLmRlc3Ryb3lSb3dCdXNpbmVzc0hvdXJTZWdzID0gZnVuY3Rpb24ocm93KSB7CiAgICByb3cuY2xlYXJCdXNpbmVzc0hvdXJTZWdzKCk7CiAgICBpZiAocm93LnJlc291cmNlLmJ1c2luZXNzSG91cnMpIHsKICAgICAgdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3VycyAtPSAxOwogICAgICBpZiAoIXRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpIHsKICAgICAgICB0aGlzLmNsZWFySW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKTsKICAgICAgICByZXR1cm4gVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJCdXNpbmVzc0hvdXJzLmNhbGwodGhpcyk7CiAgICAgIH0KICAgIH0KICB9OwoKCiAgLyoKICAJQ29tcHV0ZSBhbmQgYXNzaWduIHRvIHJvdy5idXNpbmVzc0hvdXJTZWdzIHVuY29uZGl0aW9uYWxseQogICAqLwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2VncyA9IGZ1bmN0aW9uKHJvdykgewogICAgdmFyIGJ1c2luZXNzSG91clNlZ3MsIGJ1c2luZXNzSG91cnMsIGJ1c2luZXNzSG91cnNFdmVudHM7CiAgICBidXNpbmVzc0hvdXJzID0gcm93LnJlc291cmNlLmJ1c2luZXNzSG91cnMgfHwgdGhpcy52aWV3Lm9wdCgnYnVzaW5lc3NIb3VycycpOwogICAgYnVzaW5lc3NIb3Vyc0V2ZW50cyA9IHRoaXMudmlldy5jYWxlbmRhci5jb21wdXRlQnVzaW5lc3NIb3VyRXZlbnRzKCF0aGlzLmlzVGltZVNjYWxlLCBidXNpbmVzc0hvdXJzKTsKICAgIGJ1c2luZXNzSG91clNlZ3MgPSB0aGlzLmV2ZW50c1RvU2VncyhidXNpbmVzc0hvdXJzRXZlbnRzKTsKICAgIGJ1c2luZXNzSG91clNlZ3MgPSB0aGlzLnJlbmRlckZpbGxTZWdFbHMoJ2J1c2luZXNzSG91cnMnLCBidXNpbmVzc0hvdXJTZWdzKTsKICAgIHJvdy5idXNpbmVzc0hvdXJTZWdzID0gYnVzaW5lc3NIb3VyU2VnczsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmlsbCA9IGZ1bmN0aW9uKHR5cGUsIHNlZ3MsIGNsYXNzTmFtZSkgewogICAgdmFyIGosIGssIGxlbiwgbGVuMSwgbm9uUmVzb3VyY2VTZWdzLCBwYWlyLCBwYWlycywgcmVzb3VyY2VTZWdzLCByb3dPYmosIHJvd1NlZ3MsIHNlZywgdmlzaWJsZVBhaXJzOwogICAgc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0Vscyh0eXBlLCBzZWdzKTsKICAgIHJlc291cmNlU2VncyA9IFtdOwogICAgbm9uUmVzb3VyY2VTZWdzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBzZWdzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHNlZyA9IHNlZ3Nbal07CiAgICAgIGlmIChzZWcucmVzb3VyY2VJZCkgewogICAgICAgIHJlc291cmNlU2Vncy5wdXNoKHNlZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9uUmVzb3VyY2VTZWdzLnB1c2goc2VnKTsKICAgICAgfQogICAgfQogICAgcGFpcnMgPSB0aGlzLnZpZXcucGFpclNlZ3NXaXRoUm93cyhyZXNvdXJjZVNlZ3MpOwogICAgdmlzaWJsZVBhaXJzID0gW107CiAgICBmb3IgKGsgPSAwLCBsZW4xID0gcGFpcnMubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgIHBhaXIgPSBwYWlyc1trXTsKICAgICAgcm93T2JqID0gcGFpclswXSwgcm93U2VncyA9IHBhaXJbMV07CiAgICAgIGlmICh0eXBlID09PSAnYmdFdmVudCcpIHsKICAgICAgICByb3dPYmouYmdTZWdzID0gcm93U2VnczsKICAgICAgfQogICAgICBpZiAocm93T2JqLmlzU2hvd24pIHsKICAgICAgICB2aXNpYmxlUGFpcnMucHVzaChwYWlyKTsKICAgICAgfQogICAgfQogICAgaWYgKG5vblJlc291cmNlU2Vncy5sZW5ndGgpIHsKICAgICAgdmlzaWJsZVBhaXJzLnVuc2hpZnQoW3RoaXMsIG5vblJlc291cmNlU2Vnc10pOwogICAgfQogICAgdGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXJzKHR5cGUsIHZpc2libGVQYWlycywgY2xhc3NOYW1lKTsKICAgIHJldHVybiBzZWdzOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJIZWxwZXIgPSBmdW5jdGlvbihldmVudCwgc291cmNlU2VnKSB7CiAgICB2YXIgcGFpcnMsIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5ldmVudFRvU2VncyhldmVudCk7CiAgICBzZWdzID0gdGhpcy5yZW5kZXJGZ1NlZ0VscyhzZWdzKTsKICAgIHBhaXJzID0gdGhpcy52aWV3LnBhaXJTZWdzV2l0aFJvd3Moc2Vncyk7CiAgICByZXR1cm4gdGhpcy5yZW5kZXJIZWxwZXJTZWdzSW5Db250YWluZXJzKHBhaXJzLCBzb3VyY2VTZWcpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlSW5pdGlhbFNjcm9sbCA9IGZ1bmN0aW9uKHByZXZTdGF0ZSkgewogICAgdmFyIHN0YXRlOwogICAgc3RhdGUgPSBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18uY29tcHV0ZUluaXRpYWxTY3JvbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmIChwcmV2U3RhdGUpIHsKICAgICAgc3RhdGUucmVzb3VyY2VJZCA9IHByZXZTdGF0ZS5yZXNvdXJjZUlkOwogICAgICBzdGF0ZS5ib3R0b20gPSBwcmV2U3RhdGUuYm90dG9tOwogICAgfQogICAgcmV0dXJuIHN0YXRlOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeVNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGVsLCBlbEJvdHRvbSwgaiwgbGVuLCByZWYsIHJvd09iaiwgc2Nyb2xsZXJUb3AsIHN0YXRlOwogICAgc3RhdGUgPSBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucXVlcnlTY3JvbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHNjcm9sbGVyVG9wID0gdGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwub2Zmc2V0KCkudG9wOwogICAgcmVmID0gdGhpcy52aWV3LmdldFZpc2libGVSb3dzKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcm93T2JqID0gcmVmW2pdOwogICAgICBpZiAocm93T2JqLnJlc291cmNlKSB7CiAgICAgICAgZWwgPSByb3dPYmouZ2V0VHIoJ2V2ZW50Jyk7CiAgICAgICAgZWxCb3R0b20gPSBlbC5vZmZzZXQoKS50b3AgKyBlbC5vdXRlckhlaWdodCgpOwogICAgICAgIGlmIChlbEJvdHRvbSA+IHNjcm9sbGVyVG9wKSB7CiAgICAgICAgICBzdGF0ZS5yZXNvdXJjZUlkID0gcm93T2JqLnJlc291cmNlLmlkOwogICAgICAgICAgc3RhdGUuYm90dG9tID0gZWxCb3R0b20gLSBzY3JvbGxlclRvcDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0YXRlOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zZXRTY3JvbGwgPSBmdW5jdGlvbihzdGF0ZSkgewogICAgdmFyIGVsLCBlbEJvdHRvbSwgaW5uZXJUb3AsIHJvdzsKICAgIGlmIChzdGF0ZS5yZXNvdXJjZUlkKSB7CiAgICAgIHJvdyA9IHRoaXMudmlldy5nZXRSZXNvdXJjZVJvdyhzdGF0ZS5yZXNvdXJjZUlkKTsKICAgICAgaWYgKHJvdykgewogICAgICAgIGVsID0gcm93LmdldFRyKCdldmVudCcpOwogICAgICAgIGlmIChlbCkgewogICAgICAgICAgaW5uZXJUb3AgPSB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuZWwub2Zmc2V0KCkudG9wOwogICAgICAgICAgZWxCb3R0b20gPSBlbC5vZmZzZXQoKS50b3AgKyBlbC5vdXRlckhlaWdodCgpOwogICAgICAgICAgc3RhdGUudG9wID0gZWxCb3R0b20gLSBzdGF0ZS5ib3R0b20gLSBpbm5lclRvcDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18uc2V0U2Nyb2xsLmNhbGwodGhpcywgc3RhdGUpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zY3JvbGxUb1Jlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UpIHsKICAgIHZhciBlbCwgaW5uZXJUb3AsIHJvdywgc2Nyb2xsVG9wOwogICAgcm93ID0gdGhpcy52aWV3LmdldFJlc291cmNlUm93KHJlc291cmNlLmlkKTsKICAgIGlmIChyb3cpIHsKICAgICAgZWwgPSByb3cuZ2V0VHIoJ2V2ZW50Jyk7CiAgICAgIGlmIChlbCkgewogICAgICAgIGlubmVyVG9wID0gdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpLnRvcDsKICAgICAgICBzY3JvbGxUb3AgPSBlbC5vZmZzZXQoKS50b3AgLSBpbm5lclRvcDsKICAgICAgICByZXR1cm4gdGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwuc2Nyb2xsVG9wKHNjcm9sbFRvcCk7CiAgICAgIH0KICAgIH0KICB9OwoKICByZXR1cm4gUmVzb3VyY2VUaW1lbGluZUdyaWQ7Cgp9KShUaW1lbGluZUdyaWQpOwoKQ09MX01JTl9XSURUSCA9IDMwOwoKU3ByZWFkc2hlZXQgPSAoZnVuY3Rpb24oKSB7CiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLnZpZXcgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuaGVhZEVsID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmVsID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLnRib2R5RWwgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuaGVhZFNjcm9sbGVyID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmJvZHlTY3JvbGxlciA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5qb2luZXIgPSBudWxsOwoKICBmdW5jdGlvbiBTcHJlYWRzaGVldCh2aWV3MSkgewogICAgdmFyIGNvbFNwZWM7CiAgICB0aGlzLnZpZXcgPSB2aWV3MTsKICAgIHRoaXMuaXNSVEwgPSB0aGlzLnZpZXcub3B0KCdpc1JUTCcpOwogICAgdGhpcy5naXZlbkNvbFdpZHRocyA9IHRoaXMuY29sV2lkdGhzID0gKGZ1bmN0aW9uKCkgewogICAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHM7CiAgICAgIHJlZiA9IHRoaXMudmlldy5jb2xTcGVjczsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBjb2xTcGVjID0gcmVmW2pdOwogICAgICAgIHJlc3VsdHMucHVzaChjb2xTcGVjLndpZHRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgfQoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuY29sR3JvdXBIdG1sID0gJyc7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5oZWFkVGFibGUgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuaGVhZENvbEVscyA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5oZWFkQ2VsbEVscyA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5ib2R5Q29sRWxzID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmJvZHlUYWJsZSA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbiA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5oZWFkU2Nyb2xsZXIgPSBuZXcgQ2xpcHBlZFNjcm9sbGVyKHsKICAgICAgb3ZlcmZsb3dYOiAnY2xpcHBlZC1zY3JvbGwnLAogICAgICBvdmVyZmxvd1k6ICdoaWRkZW4nCiAgICB9KTsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcyA9IG5ldyBTY3JvbGxlckNhbnZhcygpOwogICAgdGhpcy5oZWFkU2Nyb2xsZXIucmVuZGVyKCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmh0bWwodGhpcy5yZW5kZXJIZWFkSHRtbCgpKTsKICAgIHRoaXMuaGVhZEVsLmFwcGVuZCh0aGlzLmhlYWRTY3JvbGxlci5lbCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlciA9IG5ldyBDbGlwcGVkU2Nyb2xsZXIoewogICAgICBvdmVyZmxvd1k6ICdjbGlwcGVkLXNjcm9sbCcKICAgIH0pOwogICAgdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzID0gbmV3IFNjcm9sbGVyQ2FudmFzKCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci5yZW5kZXIoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuaHRtbCgnPHRhYmxlPicgKyB0aGlzLmNvbEdyb3VwSHRtbCArICc8dGJvZHkvPjwvdGFibGU+Jyk7CiAgICB0aGlzLnRib2R5RWwgPSB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoJ3Rib2R5Jyk7CiAgICB0aGlzLmVsLmFwcGVuZCh0aGlzLmJvZHlTY3JvbGxlci5lbCk7CiAgICB0aGlzLmpvaW5lciA9IG5ldyBTY3JvbGxKb2luZXIoJ2hvcml6b250YWwnLCBbdGhpcy5oZWFkU2Nyb2xsZXIsIHRoaXMuYm9keVNjcm9sbGVyXSk7CiAgICB0aGlzLmhlYWRUYWJsZSA9IHRoaXMuaGVhZEVsLmZpbmQoJ3RhYmxlJyk7CiAgICB0aGlzLmhlYWRDb2xFbHMgPSB0aGlzLmhlYWRFbC5maW5kKCdjb2wnKTsKICAgIHRoaXMuaGVhZENlbGxFbHMgPSB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoJ3RyOmxhc3QtY2hpbGQgdGgnKTsKICAgIHRoaXMuYm9keUNvbEVscyA9IHRoaXMuZWwuZmluZCgnY29sJyk7CiAgICB0aGlzLmJvZHlUYWJsZSA9IHRoaXMuZWwuZmluZCgndGFibGUnKTsKICAgIHRoaXMuY29sTWluV2lkdGhzID0gdGhpcy5jb21wdXRlQ29sTWluV2lkdGhzKCk7CiAgICB0aGlzLmFwcGx5Q29sV2lkdGhzKCk7CiAgICByZXR1cm4gdGhpcy5pbml0Q29sUmVzaXppbmcoKTsKICB9OwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUucmVuZGVySGVhZEh0bWwgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb2xHcm91cEh0bWwsIGNvbFNwZWNzLCBodG1sLCBpLCBpc0xhc3QsIGlzTWFpbkNvbCwgaiwgaywgbGVuLCBsZW4xLCBvOwogICAgY29sU3BlY3MgPSB0aGlzLnZpZXcuY29sU3BlY3M7CiAgICBodG1sID0gJzx0YWJsZT4nOwogICAgY29sR3JvdXBIdG1sID0gJzxjb2xncm91cD4nOwogICAgZm9yIChqID0gMCwgbGVuID0gY29sU3BlY3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgbyA9IGNvbFNwZWNzW2pdOwogICAgICBpZiAoby5pc01haW4pIHsKICAgICAgICBjb2xHcm91cEh0bWwgKz0gJzxjb2wgY2xhc3M9ImZjLW1haW4tY29sIi8+JzsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb2xHcm91cEh0bWwgKz0gJzxjb2wvPic7CiAgICAgIH0KICAgIH0KICAgIGNvbEdyb3VwSHRtbCArPSAnPC9jb2xncm91cD4nOwogICAgdGhpcy5jb2xHcm91cEh0bWwgPSBjb2xHcm91cEh0bWw7CiAgICBodG1sICs9IGNvbEdyb3VwSHRtbDsKICAgIGh0bWwgKz0gJzx0Ym9keT4nOwogICAgaWYgKHRoaXMudmlldy5zdXBlckhlYWRlclRleHQpIHsKICAgICAgaHRtbCArPSAnPHRyIGNsYXNzPSJmYy1zdXBlciI+JyArICc8dGggY2xhc3M9IicgKyB0aGlzLnZpZXcud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIiBjb2xzcGFuPSInICsgY29sU3BlY3MubGVuZ3RoICsgJyI+JyArICc8ZGl2IGNsYXNzPSJmYy1jZWxsLWNvbnRlbnQiPicgKyAnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+JyArIGh0bWxFc2NhcGUodGhpcy52aWV3LnN1cGVySGVhZGVyVGV4dCkgKyAnPC9zcGFuPicgKyAnPC9kaXY+JyArICc8L3RoPicgKyAnPC90cj4nOwogICAgfQogICAgaHRtbCArPSAnPHRyPic7CiAgICBpc01haW5Db2wgPSB0cnVlOwogICAgZm9yIChpID0gayA9IDAsIGxlbjEgPSBjb2xTcGVjcy5sZW5ndGg7IGsgPCBsZW4xOyBpID0gKytrKSB7CiAgICAgIG8gPSBjb2xTcGVjc1tpXTsKICAgICAgaXNMYXN0ID0gaSA9PT0gY29sU3BlY3MubGVuZ3RoIC0gMTsKICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyI+JyArICc8ZGl2PicgKyAnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nICsgKG8uaXNNYWluID8gJzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlci1zcGFjZSI+JyArICc8c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPicgKyAnPC9zcGFuPicgOiAnJykgKyAnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+JyArIGh0bWxFc2NhcGUoby5sYWJlbFRleHQgfHwgJycpICsgJzwvc3Bhbj4nICsgJzwvZGl2PicgKyAoIWlzTGFzdCA/ICc8ZGl2IGNsYXNzPSJmYy1jb2wtcmVzaXplciI+PC9kaXY+JyA6ICcnKSArICc8L2Rpdj4nICsgJzwvdGg+JzsKICAgIH0KICAgIGh0bWwgKz0gJzwvdHI+JzsKICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT4nOwogICAgcmV0dXJuIGh0bWw7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmdpdmVuQ29sV2lkdGhzID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmNvbFdpZHRocyA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5jb2xNaW5XaWR0aHMgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUudGFibGVXaWR0aCA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS50YWJsZU1pbldpZHRoID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmluaXRDb2xSZXNpemluZyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuaGVhZEVsLmZpbmQoJ3RoIC5mYy1jb2wtcmVzaXplcicpLmVhY2goKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihpLCByZXNpemVyRWwpIHsKICAgICAgICByZXNpemVyRWwgPSAkKHJlc2l6ZXJFbCk7CiAgICAgICAgcmV0dXJuIHJlc2l6ZXJFbC5vbignbW91c2Vkb3duJywgZnVuY3Rpb24oZXYpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5jb2xSZXNpemVNb3VzZWRvd24oaSwgZXYsIHJlc2l6ZXJFbCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICB9KSh0aGlzKSk7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmNvbFJlc2l6ZU1vdXNlZG93biA9IGZ1bmN0aW9uKGksIGV2LCByZXNpemVyRWwpIHsKICAgIHZhciBjb2xXaWR0aHMsIGRyYWdMaXN0ZW5lciwgbWluV2lkdGgsIG9yaWdDb2xXaWR0aDsKICAgIGNvbFdpZHRocyA9IHRoaXMuY29sV2lkdGhzID0gdGhpcy5xdWVyeUNvbFdpZHRocygpOwogICAgY29sV2lkdGhzLnBvcCgpOwogICAgY29sV2lkdGhzLnB1c2gobnVsbCk7CiAgICBvcmlnQ29sV2lkdGggPSBjb2xXaWR0aHNbaV07CiAgICBtaW5XaWR0aCA9IE1hdGgubWluKHRoaXMuY29sTWluV2lkdGhzW2ldLCBDT0xfTUlOX1dJRFRIKTsKICAgIGRyYWdMaXN0ZW5lciA9IG5ldyBEcmFnTGlzdGVuZXIoewogICAgICBkcmFnU3RhcnQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiByZXNpemVyRWwuYWRkQ2xhc3MoJ2ZjLWFjdGl2ZScpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpLAogICAgICBkcmFnOiAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZHgsIGR5KSB7CiAgICAgICAgICB2YXIgd2lkdGg7CiAgICAgICAgICB3aWR0aCA9IG9yaWdDb2xXaWR0aCArIChfdGhpcy5pc1JUTCA/IC1keCA6IGR4KTsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIG1pbldpZHRoKTsKICAgICAgICAgIGNvbFdpZHRoc1tpXSA9IHdpZHRoOwogICAgICAgICAgcmV0dXJuIF90aGlzLmFwcGx5Q29sV2lkdGhzKCk7CiAgICAgICAgfTsKICAgICAgfSkodGhpcyksCiAgICAgIGRyYWdFbmQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiByZXNpemVyRWwucmVtb3ZlQ2xhc3MoJ2ZjLWFjdGl2ZScpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpCiAgICB9KTsKICAgIHJldHVybiBkcmFnTGlzdGVuZXIuc3RhcnRJbnRlcmFjdGlvbihldik7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmFwcGx5Q29sV2lkdGhzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgYWxsTnVtYmVycywgYW55UGVyY2VudGFnZXMsIGNvbE1pbldpZHRocywgY29sV2lkdGgsIGNvbFdpZHRocywgY3NzV2lkdGgsIGNzc1dpZHRocywgZGVmYXVsdENzc1dpZHRoLCBpLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIHRhYmxlTWluV2lkdGgsIHRvdGFsOwogICAgY29sTWluV2lkdGhzID0gdGhpcy5jb2xNaW5XaWR0aHM7CiAgICBjb2xXaWR0aHMgPSB0aGlzLmNvbFdpZHRoczsKICAgIGFsbE51bWJlcnMgPSB0cnVlOwogICAgYW55UGVyY2VudGFnZXMgPSBmYWxzZTsKICAgIHRvdGFsID0gMDsKICAgIGZvciAoaiA9IDAsIGxlbiA9IGNvbFdpZHRocy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBjb2xXaWR0aCA9IGNvbFdpZHRoc1tqXTsKICAgICAgaWYgKHR5cGVvZiBjb2xXaWR0aCA9PT0gJ251bWJlcicpIHsKICAgICAgICB0b3RhbCArPSBjb2xXaWR0aDsKICAgICAgfSBlbHNlIHsKICAgICAgICBhbGxOdW1iZXJzID0gZmFsc2U7CiAgICAgICAgaWYgKGNvbFdpZHRoKSB7CiAgICAgICAgICBhbnlQZXJjZW50YWdlcyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBkZWZhdWx0Q3NzV2lkdGggPSBhbnlQZXJjZW50YWdlcyAmJiAhdGhpcy52aWV3LmlzSEdyb3VwaW5nID8gJ2F1dG8nIDogJyc7CiAgICBjc3NXaWR0aHMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBrLCBsZW4xLCByZXN1bHRzOwogICAgICByZXN1bHRzID0gW107CiAgICAgIGZvciAoaSA9IGsgPSAwLCBsZW4xID0gY29sV2lkdGhzLmxlbmd0aDsgayA8IGxlbjE7IGkgPSArK2spIHsKICAgICAgICBjb2xXaWR0aCA9IGNvbFdpZHRoc1tpXTsKICAgICAgICByZXN1bHRzLnB1c2goY29sV2lkdGggIT0gbnVsbCA/IGNvbFdpZHRoIDogZGVmYXVsdENzc1dpZHRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pKCk7CiAgICB0YWJsZU1pbldpZHRoID0gMDsKICAgIGZvciAoaSA9IGsgPSAwLCBsZW4xID0gY3NzV2lkdGhzLmxlbmd0aDsgayA8IGxlbjE7IGkgPSArK2spIHsKICAgICAgY3NzV2lkdGggPSBjc3NXaWR0aHNbaV07CiAgICAgIHRhYmxlTWluV2lkdGggKz0gdHlwZW9mIGNzc1dpZHRoID09PSAnbnVtYmVyJyA/IGNzc1dpZHRoIDogY29sTWluV2lkdGhzW2ldOwogICAgfQogICAgZm9yIChpID0gbCA9IDAsIGxlbjIgPSBjc3NXaWR0aHMubGVuZ3RoOyBsIDwgbGVuMjsgaSA9ICsrbCkgewogICAgICBjc3NXaWR0aCA9IGNzc1dpZHRoc1tpXTsKICAgICAgdGhpcy5oZWFkQ29sRWxzLmVxKGkpLndpZHRoKGNzc1dpZHRoKTsKICAgICAgdGhpcy5ib2R5Q29sRWxzLmVxKGkpLndpZHRoKGNzc1dpZHRoKTsKICAgIH0KICAgIHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5zZXRNaW5XaWR0aCh0YWJsZU1pbldpZHRoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5zZXRNaW5XaWR0aCh0YWJsZU1pbldpZHRoKTsKICAgIHRoaXMudGFibGVNaW5XaWR0aCA9IHRhYmxlTWluV2lkdGg7CiAgICByZXR1cm4gdGhpcy50YWJsZVdpZHRoID0gYWxsTnVtYmVycyA/IHRvdGFsIDogdm9pZCAwOwogIH07CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5jb21wdXRlQ29sTWluV2lkdGhzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaSwgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHdpZHRoOwogICAgcmVmID0gdGhpcy5naXZlbkNvbFdpZHRoczsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7CiAgICAgIHdpZHRoID0gcmVmW2ldOwogICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJykgewogICAgICAgIHJlc3VsdHMucHVzaCh3aWR0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSW50KHRoaXMuaGVhZENvbEVscy5lcShpKS5jc3MoJ21pbi13aWR0aCcpKSB8fCBDT0xfTUlOX1dJRFRIKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLnF1ZXJ5Q29sV2lkdGhzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCBub2RlLCByZWYsIHJlc3VsdHM7CiAgICByZWYgPSB0aGlzLmhlYWRDZWxsRWxzOwogICAgcmVzdWx0cyA9IFtdOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIG5vZGUgPSByZWZbal07CiAgICAgIHJlc3VsdHMucHVzaCgkKG5vZGUpLm91dGVyV2lkdGgoKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUudXBkYXRlV2lkdGggPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLnVwZGF0ZVNpemUoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLnVwZGF0ZVNpemUoKTsKICAgIHRoaXMuam9pbmVyLnVwZGF0ZSgpOwogICAgaWYgKHRoaXMuZm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZm9sbG93ZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmhlYWRIZWlnaHQgPSBmdW5jdGlvbigpIHsKICAgIHZhciB0YWJsZTsKICAgIHRhYmxlID0gdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5maW5kKCd0YWJsZScpOwogICAgcmV0dXJuIHRhYmxlLmhlaWdodC5hcHBseSh0YWJsZSwgYXJndW1lbnRzKTsKICB9OwoKICByZXR1cm4gU3ByZWFkc2hlZXQ7Cgp9KSgpOwoKCi8qCkFuIGFic3RyYWN0IG5vZGUgaW4gYSByb3ctaGllcmFyY2h5IHRyZWUuCk1heSBiZSBhIHNlbGYtY29udGFpbmVkIHNpbmdsZSByb3csIGEgcm93IHdpdGggc3Vicm93cywKT1IgYSBncm91cGluZyBvZiByb3dzIHdpdGhvdXQgaXRzIG93biBkaXN0aW5jdCByb3cuCiAqLwoKUm93UGFyZW50ID0gKGZ1bmN0aW9uKCkgewogIFJvd1BhcmVudC5wcm90b3R5cGUudmlldyA9IG51bGw7CgogIFJvd1BhcmVudC5wcm90b3R5cGUucGFyZW50ID0gbnVsbDsKCiAgUm93UGFyZW50LnByb3RvdHlwZS5wcmV2U2libGluZyA9IG51bGw7CgogIFJvd1BhcmVudC5wcm90b3R5cGUuY2hpbGRyZW4gPSBudWxsOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmRlcHRoID0gMDsKCiAgUm93UGFyZW50LnByb3RvdHlwZS5oYXNPd25Sb3cgPSBmYWxzZTsKCiAgUm93UGFyZW50LnByb3RvdHlwZS50ckhhc2ggPSBudWxsOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnRycyA9IG51bGw7CgogIFJvd1BhcmVudC5wcm90b3R5cGUuaXNSZW5kZXJlZCA9IGZhbHNlOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmlzRXhwYW5kZWQgPSB0cnVlOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmlzU2hvd24gPSBmYWxzZTsKCiAgZnVuY3Rpb24gUm93UGFyZW50KHZpZXcxKSB7CiAgICB0aGlzLnZpZXcgPSB2aWV3MTsKICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgIHRoaXMudHJIYXNoID0ge307CiAgICB0aGlzLnRycyA9ICQoKTsKICB9CgoKICAvKgogIAlBZGRzIHRoZSBnaXZlbiBub2RlIGFzIGEgY2hpbGQuCiAgCVdpbGwgYmUgaW5zZXJ0ZWQgYXQgdGhlIGBpbmRleGAuIElmIG5vdCBnaXZlbiwgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24oY2hpbGQsIGluZGV4KSB7CiAgICB2YXIgY2hpbGRyZW4sIGosIGxlbiwgbm9kZSwgcmVmOwogICAgY2hpbGQucmVtb3ZlKCk7CiAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICBpZiAoaW5kZXggIT0gbnVsbCkgewogICAgICBjaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTsKICAgIH0gZWxzZSB7CiAgICAgIGluZGV4ID0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTsKICAgIH0KICAgIGNoaWxkLnByZXZTaWJsaW5nID0gaW5kZXggPiAwID8gY2hpbGRyZW5baW5kZXggLSAxXSA6IG51bGw7CiAgICBpZiAoaW5kZXggPCBjaGlsZHJlbi5sZW5ndGggLSAxKSB7CiAgICAgIGNoaWxkcmVuW2luZGV4ICsgMV0ucHJldlNpYmxpbmcgPSBjaGlsZDsKICAgIH0KICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7CiAgICBjaGlsZC5kZXB0aCA9IHRoaXMuZGVwdGggKyAodGhpcy5oYXNPd25Sb3cgPyAxIDogMCk7CiAgICByZWYgPSBjaGlsZC5nZXROb2RlcygpOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIG5vZGUgPSByZWZbal07CiAgICAgIG5vZGUuYWRkZWQoKTsKICAgIH0KICAgIGlmICh0aGlzLmlzU2hvd24gJiYgdGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgIHJldHVybiBjaGlsZC5zaG93KCk7CiAgICB9CiAgfTsKCgogIC8qCiAgCVJlbW92ZXMgdGhlIGdpdmVuIGNoaWxkIGZyb20gdGhlIG5vZGUuIEFzc3VtZXMgaXQgaXMgYSBkaXJlY3QgY2hpbGQuCiAgCUlmIG5vdCBhIGRpcmVjdCBjaGlsZCwgcmV0dXJucyBmYWxzZSBhbmQgbm90aGluZyBoYXBwZW5zLgogIAlVbnJlbmRlcnMgdGhlIGNoaWxkIGFuZCB0cmlnZ2VycyBoYW5kbGVycy4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uKGNoaWxkKSB7CiAgICB2YXIgY2hpbGRyZW4sIGksIGlzRm91bmQsIGosIGssIGxlbiwgbGVuMSwgcmVmLCByb3csIHRlc3RDaGlsZDsKICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgIGlzRm91bmQgPSBmYWxzZTsKICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSBjaGlsZHJlbi5sZW5ndGg7IGogPCBsZW47IGkgPSArK2opIHsKICAgICAgdGVzdENoaWxkID0gY2hpbGRyZW5baV07CiAgICAgIGlmICh0ZXN0Q2hpbGQgPT09IGNoaWxkKSB7CiAgICAgICAgaXNGb3VuZCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghaXNGb3VuZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAoaSA8IGNoaWxkcmVuLmxlbmd0aCAtIDEpIHsKICAgICAgICBjaGlsZHJlbltpICsgMV0ucHJldlNpYmxpbmcgPSBjaGlsZC5wcmV2U2libGluZzsKICAgICAgfQogICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7CiAgICAgIGNoaWxkLnJlY3Vyc2l2ZWx5VW5yZW5kZXIoKTsKICAgICAgcmVmID0gY2hpbGQuZ2V0Tm9kZXMoKTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHJlZi5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICByb3cgPSByZWZba107CiAgICAgICAgcm93LnJlbW92ZWQoKTsKICAgICAgfQogICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICBjaGlsZC5wcmV2U2libGluZyA9IG51bGw7CiAgICAgIHJldHVybiBjaGlsZDsKICAgIH0KICB9OwoKCiAgLyoKICAJUmVtb3ZlcyBhbGwgb2YgdGhlIG5vZGUncyBjaGlsZHJlbiBmcm9tIHRoZSBoaWVyYXJjaHkuIFVucmVuZGVycyB0aGVtIGFuZCB0cmlnZ2VycyBjYWxsYmFja3MuCiAgCU5PVEU6IGJhdGNoUm93cy91bmJhdGNoUm93cyBzaG91bGQgcHJvYmFibHkgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIGhhcHBlbnMgOigKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZHJlbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNoaWxkLCBqLCBrLCBsZW4sIGxlbjEsIHJlZiwgcmVmMTsKICAgIHJlZiA9IHRoaXMuY2hpbGRyZW47CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgIGNoaWxkLnJlY3Vyc2l2ZWx5VW5yZW5kZXIoKTsKICAgIH0KICAgIHJlZjEgPSB0aGlzLmdldERlc2NlbmRhbnRzKCk7CiAgICBmb3IgKGsgPSAwLCBsZW4xID0gcmVmMS5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgY2hpbGQgPSByZWYxW2tdOwogICAgICBjaGlsZC5yZW1vdmVkKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbiA9IFtdOwogIH07CgoKICAvKgogIAlSZW1vdmVzIHRoaXMgbm9kZSBmcm9tIGl0cyBwYXJlbnQKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnBhcmVudCkgewogICAgICByZXR1cm4gdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUdldHMgdGhlIGxhc3QgZGlyZWN0IGNoaWxkIG5vZGUKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRMYXN0Q2hpbGQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgIHJldHVybiBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTsKICB9OwoKCiAgLyoKICAJV2Fsa3MgYmFja3dhcmQgaW4gdGhlIGhpZXJhcmNoeSB0byBmaW5kIHRoZSBwcmV2aW91cyByb3cgbGVhZiBub2RlLgogIAlXaGVuIGxvb2tpbmcgYXQgdGhlIGhpZXJhcmNoeSBpbiBhIGZsYXQgbGluZWFyIGZhc2hpb24sIHRoaXMgaXMgdGhlIHJldmVhbGVkIHJvdyBqdXN0IGJlZm9yZSB0aGUgY3VycmVudC4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRQcmV2Um93ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgbGFzdENoaWxkLCBub2RlOwogICAgbm9kZSA9IHRoaXM7CiAgICB3aGlsZSAobm9kZSkgewogICAgICBpZiAobm9kZS5wcmV2U2libGluZykgewogICAgICAgIG5vZGUgPSBub2RlLnByZXZTaWJsaW5nOwogICAgICAgIHdoaWxlICgobGFzdENoaWxkID0gbm9kZS5nZXRMYXN0Q2hpbGQoKSkpIHsKICAgICAgICAgIG5vZGUgPSBsYXN0Q2hpbGQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgfQogICAgICBpZiAobm9kZSAmJiBub2RlLmhhc093blJvdyAmJiBub2RlLmlzU2hvd24pIHsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfTsKCgogIC8qCiAgCVJldHVybnMgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHN1YnRyZWUgdGhhdCBoYXMgYSByZXZlYWxlZCByb3cKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRMZWFkaW5nUm93ID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5oYXNPd25Sb3cpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgaWYgKHRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblswXS5nZXRMZWFkaW5nUm93KCk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUdlbmVyYXRlcyBhIGZsYXQgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIHJvdy1ub2RlcyBvZiB0aGUgc3VidHJlZS4gRGVzY2VuZGFudHMgKyBzZWxmCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuZ2V0Um93cyA9IGZ1bmN0aW9uKGJhdGNoQXJyYXkpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWY7CiAgICBpZiAoYmF0Y2hBcnJheSA9PSBudWxsKSB7CiAgICAgIGJhdGNoQXJyYXkgPSBbXTsKICAgIH0KICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICBiYXRjaEFycmF5LnB1c2godGhpcyk7CiAgICB9CiAgICByZWYgPSB0aGlzLmNoaWxkcmVuOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICBjaGlsZC5nZXRSb3dzKGJhdGNoQXJyYXkpOwogICAgfQogICAgcmV0dXJuIGJhdGNoQXJyYXk7CiAgfTsKCgogIC8qCiAgCUdlbmVyYXRlcyBhIGZsYXQgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIG5vZGVzIChyb3cvbm9uLXJvdykgb2YgdGhlIHN1YnRyZWUuIERlc2NlbmRhbnRzICsgc2VsZgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmdldE5vZGVzID0gZnVuY3Rpb24oYmF0Y2hBcnJheSkgewogICAgdmFyIGNoaWxkLCBqLCBsZW4sIHJlZjsKICAgIGlmIChiYXRjaEFycmF5ID09IG51bGwpIHsKICAgICAgYmF0Y2hBcnJheSA9IFtdOwogICAgfQogICAgYmF0Y2hBcnJheS5wdXNoKHRoaXMpOwogICAgcmVmID0gdGhpcy5jaGlsZHJlbjsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBjaGlsZCA9IHJlZltqXTsKICAgICAgY2hpbGQuZ2V0Tm9kZXMoYmF0Y2hBcnJheSk7CiAgICB9CiAgICByZXR1cm4gYmF0Y2hBcnJheTsKICB9OwoKCiAgLyoKICAJR2VuZXJhdGVzIGEgZmxhdCBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZGVzY2VuZGFudCBub2RlcyB0aGUgY3VycmVudCBub2RlCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuZ2V0RGVzY2VuZGFudHMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiYXRjaEFycmF5LCBjaGlsZCwgaiwgbGVuLCByZWY7CiAgICBiYXRjaEFycmF5ID0gW107CiAgICByZWYgPSB0aGlzLmNoaWxkcmVuOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICBjaGlsZC5nZXROb2RlcyhiYXRjaEFycmF5KTsKICAgIH0KICAgIHJldHVybiBiYXRjaEFycmF5OwogIH07CgoKICAvKgogIAlCdWlsZHMgYW5kIHBvcHVsYXRlcyB0aGUgVFJzIGZvciBlYWNoIHJvdyB0eXBlLiBJbnNlcnRzIHRoZW0gaW50byB0aGUgRE9NLgogIAlEb2VzIHRoaXMgb25seSBmb3IgdGhpcyBzaW5nbGUgcm93LiBOb3QgcmVjdXJzaXZlLiBJZiBub3QgYSByb3cgKGhhc093blJvdz1mYWxzZSksIGRvZXMgbm90IHJlbmRlciBhbnl0aGluZy4KICAJUFJFQ09ORElUSU9OOiBhc3N1bWVzIHRoZSBwYXJlbnQgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZC4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwcmV2Um93LCByZWYsIHJlbmRlck1ldGhvZE5hbWUsIHRib2R5LCB0ciwgdHJOb2RlcywgdHlwZTsKICAgIHRoaXMudHJIYXNoID0ge307CiAgICB0ck5vZGVzID0gW107CiAgICBpZiAodGhpcy5oYXNPd25Sb3cpIHsKICAgICAgcHJldlJvdyA9IHRoaXMuZ2V0UHJldlJvdygpOwogICAgICByZWYgPSB0aGlzLnZpZXcudGJvZHlIYXNoOwogICAgICBmb3IgKHR5cGUgaW4gcmVmKSB7CiAgICAgICAgdGJvZHkgPSByZWZbdHlwZV07CiAgICAgICAgdHIgPSAkKCc8dHIvPicpOwogICAgICAgIHRoaXMudHJIYXNoW3R5cGVdID0gdHI7CiAgICAgICAgdHJOb2Rlcy5wdXNoKHRyWzBdKTsKICAgICAgICByZW5kZXJNZXRob2ROYW1lID0gJ3JlbmRlcicgKyBjYXBpdGFsaXNlRmlyc3RMZXR0ZXIodHlwZSkgKyAnQ29udGVudCc7CiAgICAgICAgaWYgKHRoaXNbcmVuZGVyTWV0aG9kTmFtZV0pIHsKICAgICAgICAgIHRoaXNbcmVuZGVyTWV0aG9kTmFtZV0odHIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJldlJvdykgewogICAgICAgICAgcHJldlJvdy50ckhhc2hbdHlwZV0uYWZ0ZXIodHIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0Ym9keS5wcmVwZW5kKHRyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMudHJzID0gJCh0ck5vZGVzKS5vbignY2xpY2snLCAnLmZjLWV4cGFuZGVyJywgcHJveHkodGhpcywgJ3RvZ2dsZUV4cGFuZGVkJykpOwogICAgcmV0dXJuIHRoaXMuaXNSZW5kZXJlZCA9IHRydWU7CiAgfTsKCgogIC8qCiAgCVVucG9wdWxhdGVzIGFuZCByZW1vdmVzIGFsbCBvZiB0aGlzIHJvdydzIFRScyBmcm9tIHRoZSBET00uIE9ubHkgZm9yIHRoaXMgc2luZ2xlIHJvdy4gTm90IHJlY3Vyc2l2ZS4KICAJV2lsbCB0cmlnZ2VyICJoaWRkZW4iLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnVucmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcmVmLCB0ciwgdHlwZSwgdW5yZW5kZXJNZXRob2ROYW1lOwogICAgaWYgKHRoaXMuaXNSZW5kZXJlZCkgewogICAgICByZWYgPSB0aGlzLnRySGFzaDsKICAgICAgZm9yICh0eXBlIGluIHJlZikgewogICAgICAgIHRyID0gcmVmW3R5cGVdOwogICAgICAgIHVucmVuZGVyTWV0aG9kTmFtZSA9ICd1bnJlbmRlcicgKyBjYXBpdGFsaXNlRmlyc3RMZXR0ZXIodHlwZSkgKyAnQ29udGVudCc7CiAgICAgICAgaWYgKHRoaXNbdW5yZW5kZXJNZXRob2ROYW1lXSkgewogICAgICAgICAgdGhpc1t1bnJlbmRlck1ldGhvZE5hbWVdKHRyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy50ckhhc2ggPSB7fTsKICAgICAgdGhpcy50cnMucmVtb3ZlKCk7CiAgICAgIHRoaXMudHJzID0gJCgpOwogICAgICB0aGlzLmlzUmVuZGVyZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pc1Nob3duID0gZmFsc2U7CiAgICAgIHJldHVybiB0aGlzLmhpZGRlbigpOwogICAgfQogIH07CgoKICAvKgogIAlMaWtlIHVucmVuZGVyKCksIGJ1dCBkb2VzIGl0IGZvciB0aGlzIHJvdyBBTkQgYWxsIGRlc2NlbmRhbnRzLgogIAlOT1RFOiBiYXRjaFJvd3MvdW5iYXRjaFJvd3Mgc2hvdWxkIHByb2JhYmx5IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBoYXBwZW5zIDooCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUucmVjdXJzaXZlbHlVbnJlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNoaWxkLCBqLCBsZW4sIHJlZiwgcmVzdWx0czsKICAgIHRoaXMudW5yZW5kZXIoKTsKICAgIHJlZiA9IHRoaXMuY2hpbGRyZW47CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgIHJlc3VsdHMucHVzaChjaGlsZC5yZWN1cnNpdmVseVVucmVuZGVyKCkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCgogIC8qCiAgCUEgc2ltcGxlIGdldHRlciBmb3IgcmV0cmlldmluZyBhIFRSIGpRdWVyeSBvYmplY3Qgb2YgYSBjZXJ0YWluIHJvdyB0eXBlCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuZ2V0VHIgPSBmdW5jdGlvbih0eXBlKSB7CiAgICByZXR1cm4gdGhpcy50ckhhc2hbdHlwZV07CiAgfTsKCgogIC8qCiAgCVJlbmRlcnMgdGhpcyByb3cgaWYgbm90IGFscmVhZHkgcmVuZGVyZWQsIG1ha2luZyBzdXJlIGl0IGlzIHZpc2libGUuCiAgCUFsc28gcmVuZGVycyBkZXNjZW5kYW50cyBvZiB0aGlzIHN1YnRyZWUsIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgZXhwYW5kZWQgb3Igbm90LgogIAlOT1RFOiBJZiBjYWxsZWQgZXh0ZXJuYWxseSwgYmF0Y2hSb3dzL3VuYmF0Y2hSb3dzIHNob3VsZCBwcm9iYWJseSBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgaGFwcGVucyA6KAogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWYsIHJlc3VsdHM7CiAgICBpZiAoIXRoaXMuaXNTaG93bikgewogICAgICBpZiAoIXRoaXMuaXNSZW5kZXJlZCkgewogICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy50cnMuY3NzKCdkaXNwbGF5JywgJycpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmVuc3VyZVNlZ3NSZW5kZXJlZCkgewogICAgICAgIHRoaXMuZW5zdXJlU2Vnc1JlbmRlcmVkKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuaXNFeHBhbmRlZCkgewogICAgICAgIHRoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuaW5kaWNhdGVDb2xsYXBzZWQoKTsKICAgICAgfQogICAgICB0aGlzLmlzU2hvd24gPSB0cnVlOwogICAgICB0aGlzLnNob3duKCk7CiAgICAgIGlmICh0aGlzLmlzRXhwYW5kZWQpIHsKICAgICAgICByZWYgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICAgICAgcmVzdWx0cy5wdXNoKGNoaWxkLnNob3coKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qCiAgCVRlbXBvcmFyaWx5IGhpZGVzIHRoaXMgbm9kZSdzIFRScyAoaWYgYXBwbGljYWJsZSkgYXMgd2VsbCBhcyBhbGwgbm9kZXMgaW4gdGhlIHN1YnRyZWUKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgY2hpbGQsIGosIGxlbiwgcmVmLCByZXN1bHRzOwogICAgaWYgKHRoaXMuaXNTaG93bikgewogICAgICBpZiAodGhpcy5pc1JlbmRlcmVkKSB7CiAgICAgICAgdGhpcy50cnMuaGlkZSgpOwogICAgICB9CiAgICAgIHRoaXMuaXNTaG93biA9IGZhbHNlOwogICAgICB0aGlzLmhpZGRlbigpOwogICAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgICAgcmVmID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICByZXN1bHRzID0gW107CiAgICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICBjaGlsZCA9IHJlZltqXTsKICAgICAgICAgIHJlc3VsdHMucHVzaChjaGlsZC5oaWRlKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgfQogICAgfQogIH07CgoKICAvKgogIAlSZXZlYWxzIHRoaXMgbm9kZSdzIGNoaWxkcmVuIGlmIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHJldmVhbGVkLiBDaGFuZ2VzIGFueSBleHBhbmRlciBpY29uLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmV4cGFuZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNoaWxkLCBqLCBsZW4sIHJlZjsKICAgIGlmICghdGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IHRydWU7CiAgICAgIHRoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOwogICAgICB0aGlzLnZpZXcuYmF0Y2hSb3dzKCk7CiAgICAgIHJlZiA9IHRoaXMuY2hpbGRyZW47CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICAgIGNoaWxkLnNob3coKTsKICAgICAgfQogICAgICB0aGlzLnZpZXcudW5iYXRjaFJvd3MoKTsKICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZUV4cGFuZCgpOwogICAgfQogIH07CgoKICAvKgogIAlIaWRlcyB0aGlzIG5vZGUncyBjaGlsZHJlbiBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBoaWRkZW4uIENoYW5nZXMgYW55IGV4cGFuZGVyIGljb24uCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuY29sbGFwc2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWY7CiAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlOwogICAgICB0aGlzLmluZGljYXRlQ29sbGFwc2VkKCk7CiAgICAgIHRoaXMudmlldy5iYXRjaFJvd3MoKTsKICAgICAgcmVmID0gdGhpcy5jaGlsZHJlbjsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgICAgY2hpbGQuaGlkZSgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnZpZXcudW5iYXRjaFJvd3MoKTsKICAgIH0KICB9OwoKCiAgLyoKICAJU3dpdGNoZXMgYmV0d2VlbiBleHBhbmRlZC9jb2xsYXBzZWQgc3RhdGVzCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUudG9nZ2xlRXhwYW5kZWQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzRXhwYW5kZWQpIHsKICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmV4cGFuZCgpOwogICAgfQogIH07CgoKICAvKgogIAlDaGFuZ2VzIHRoZSBleHBhbmRlciBpY29uIHRvIHRoZSAiZXhwYW5kZWQiIHN0YXRlCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuaW5kaWNhdGVFeHBhbmRlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudHJzLmZpbmQoJy5mYy1leHBhbmRlciAuZmMtaWNvbicpLnJlbW92ZUNsYXNzKHRoaXMuZ2V0Q29sbGFwc2VkSWNvbigpKS5hZGRDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKTsKICB9OwoKCiAgLyoKICAJQ2hhbmdlcyB0aGUgZXhwYW5kZXIgaWNvbiB0byB0aGUgImNvbGxhcHNlZCIgc3RhdGUKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5pbmRpY2F0ZUNvbGxhcHNlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudHJzLmZpbmQoJy5mYy1leHBhbmRlciAuZmMtaWNvbicpLnJlbW92ZUNsYXNzKHRoaXMuZ2V0RXhwYW5kZWRJY29uKCkpLmFkZENsYXNzKHRoaXMuZ2V0Q29sbGFwc2VkSWNvbigpKTsKICB9OwoKCiAgLyoKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5lbmFibGVFeHBhbmRpbmcgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRycy5maW5kKCcuZmMtZXhwYW5kZXItc3BhY2UnKS5hZGRDbGFzcygnZmMtZXhwYW5kZXInKTsKICB9OwoKCiAgLyoKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5kaXNhYmxlRXhwYW5kaW5nID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50cnMuZmluZCgnLmZjLWV4cGFuZGVyLXNwYWNlJykucmVtb3ZlQ2xhc3MoJ2ZjLWV4cGFuZGVyJykuZmluZCgnLmZjLWljb24nKS5yZW1vdmVDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKS5yZW1vdmVDbGFzcyh0aGlzLmdldENvbGxhcHNlZEljb24oKSk7CiAgfTsKCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRFeHBhbmRlZEljb24gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiAnZmMtaWNvbi1kb3duLXRyaWFuZ2xlJzsKICB9OwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmdldENvbGxhcHNlZEljb24gPSBmdW5jdGlvbigpIHsKICAgIHZhciBkaXI7CiAgICBkaXIgPSB0aGlzLnZpZXcuaXNSVEwgPyAnbGVmdCcgOiAncmlnaHQnOwogICAgcmV0dXJuICdmYy1pY29uLScgKyBkaXIgKyAnLXRyaWFuZ2xlJzsKICB9OwoKCiAgLyoKICAJQ2F1c2VzIGEgc2xpZGUtZG93biBDU1MgdHJhbnNpdGlvbiB0byBkZW1vbnN0cmF0ZSB0aGF0IHRoZSBleHBhbmQgaGFzIGhhcHBlbmVkCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuYW5pbWF0ZUV4cGFuZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHJlZiwgcmVmMSwgdHJzOwogICAgdHJzID0gKHJlZiA9IHRoaXMuY2hpbGRyZW5bMF0pICE9IG51bGwgPyAocmVmMSA9IHJlZi5nZXRMZWFkaW5nUm93KCkpICE9IG51bGwgPyByZWYxLnRycyA6IHZvaWQgMCA6IHZvaWQgMDsKICAgIGlmICh0cnMpIHsKICAgICAgdHJzLmFkZENsYXNzKCdmYy1jb2xsYXBzZWQnKTsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB0cnMuYWRkQ2xhc3MoJ2ZjLXRyYW5zaXRpb25pbmcnKTsKICAgICAgICByZXR1cm4gdHJzLnJlbW92ZUNsYXNzKCdmYy1jb2xsYXBzZWQnKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnMub25lKCd3ZWJraXRUcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIG9UcmFuc2l0aW9uRW5kIG1zVHJhbnNpdGlvbkVuZCB0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRycy5yZW1vdmVDbGFzcygnZmMtdHJhbnNpdGlvbmluZycpOwogICAgICB9KTsKICAgIH0KICB9OwoKCiAgLyoKICAJRmluZCBlYWNoIFRScyAiaW5uZXIgZGl2IiAoZGl2IHdpdGhpbiBmaXJzdCBjZWxsKS4gVGhpcyBkaXYgY29udHJvbHMgZWFjaCBUUnMgaGVpZ2h0LgogIAlSZXR1cm5zIHRoZSBtYXggcGl4ZWwgaGVpZ2h0LgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmdldE1heFRySW5uZXJIZWlnaHQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBtYXg7CiAgICBtYXggPSAwOwogICAgJC5lYWNoKHRoaXMudHJIYXNoLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUsIHRyKSB7CiAgICAgICAgdmFyIGlubmVyRWw7CiAgICAgICAgaW5uZXJFbCA9IGdldE93bkNlbGxzKHRyKS5maW5kKCc+IGRpdjpub3QoLmZjLWNlbGwtY29udGVudCk6Zmlyc3QnKTsKICAgICAgICByZXR1cm4gbWF4ID0gTWF0aC5tYXgoaW5uZXJFbC5oZWlnaHQoKSwgbWF4KTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICAgIHJldHVybiBtYXg7CiAgfTsKCgogIC8qCiAgCUZpbmQgZWFjaCBUUnMgImlubmVyIGRpdiIgYW5kIHNldHMgYWxsIG9mIHRoZWlyIGhlaWdodHMgdG8gdGhlIHNhbWUgdmFsdWUuCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuc2V0VHJJbm5lckhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCkgewogICAgcmV0dXJuICQuZWFjaCh0aGlzLnRySGFzaCwgKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0eXBlLCB0cikgewogICAgICAgIHJldHVybiBnZXRPd25DZWxscyh0cikuZmluZCgnPiBkaXY6bm90KC5mYy1jZWxsLWNvbnRlbnQpOmZpcnN0JykuaGVpZ2h0KGhlaWdodCk7CiAgICAgIH07CiAgICB9KSh0aGlzKSk7CiAgfTsKCgogIC8qCiAgCVRyaWdnZXJlZCB3aGVuIHRoZSBjdXJyZW50IG5vZGUgaGFzIGJlZW4gc2hvd24gKGVpdGhlciBmcmVzaGx5IHJlbmRlcmVkIG9yIHJlLXNob3duKQogIAl3aGVuIGl0IGhhZCBwcmV2aW91c2x5IGJlZW4gdW5yZW5kZXJlZCBvciBoaWRkZW4uIGBzaG93bmAgZG9lcyBub3QgYnViYmxlIHVwIHRoZSBoaWVyYXJjaHkuCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuc2hvd24gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICByZXR1cm4gdGhpcy5yb3dTaG93bih0aGlzKTsKICAgIH0KICB9OwoKCiAgLyoKICAJVHJpZ2dlcmVkIHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBoYXMgYmVlbiBoaWRkZW4gKGVpdGhlciB0ZW1wb3JhcmlseSBvciBwZXJtYW5lbnRseSkKICAJd2hlbiBpdCBoYWQgcHJldmlvdXNseSBiZWVuIHNob3duLiBgaGlkZGVuYCBkb2VzIG5vdCBidWJibGUgdXAgdGhlIGhpZXJhcmNoeS4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5oaWRkZW4gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICByZXR1cm4gdGhpcy5yb3dIaWRkZW4odGhpcyk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUp1c3QgbGlrZSBgc2hvd25gLCBidXQgb25seSB0cmlnZ2VyZWQgZm9yIG5vZGVzIHRoYXQgYXJlIGFjdHVhbCByb3dzLiBCdWJibGVzIHVwIHRoZSBoaWVyYXJjaHkuCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUucm93U2hvd24gPSBmdW5jdGlvbihyb3cpIHsKICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcy52aWV3KS5yb3dTaG93bihyb3cpOwogIH07CgoKICAvKgogIAlKdXN0IGxpa2UgYGhpZGRlbmAsIGJ1dCBvbmx5IHRyaWdnZXJlZCBmb3Igbm9kZXMgdGhhdCBhcmUgYWN0dWFsIHJvd3MuIEJ1YmJsZXMgdXAgdGhlIGhpZXJhcmNoeS4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yb3dIaWRkZW4gPSBmdW5jdGlvbihyb3cpIHsKICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcy52aWV3KS5yb3dIaWRkZW4ocm93KTsKICB9OwoKCiAgLyoKICAJVHJpZ2dlcmVkIHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgaGllcmFyY2h5LiBgYWRkZWRgIGRvZXMgbm90IGJ1YmJsZSB1cC4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5hZGRlZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaGFzT3duUm93KSB7CiAgICAgIHJldHVybiB0aGlzLnJvd0FkZGVkKHRoaXMpOwogICAgfQogIH07CgoKICAvKgogIAlUcmlnZ2VyZWQgd2hlbiB0aGUgY3VycmVudCBub2RlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgaGllcmFyY2h5LiBgcmVtb3ZlZGAgZG9lcyBub3QgYnViYmxlIHVwLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnJlbW92ZWQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICByZXR1cm4gdGhpcy5yb3dSZW1vdmVkKHRoaXMpOwogICAgfQogIH07CgoKICAvKgogIAlKdXN0IGxpa2UgYGFkZGVkYCwgYnV0IG9ubHkgdHJpZ2dlcmVkIGZvciBub2RlcyB0aGF0IGFyZSBhY3R1YWwgcm93cy4gQnViYmxlcyB1cCB0aGUgaGllcmFyY2h5LgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnJvd0FkZGVkID0gZnVuY3Rpb24ocm93KSB7CiAgICByZXR1cm4gKHRoaXMucGFyZW50IHx8IHRoaXMudmlldykucm93QWRkZWQocm93KTsKICB9OwoKCiAgLyoKICAJSnVzdCBsaWtlIGByZW1vdmVkYCwgYnV0IG9ubHkgdHJpZ2dlcmVkIGZvciBub2RlcyB0aGF0IGFyZSBhY3R1YWwgcm93cy4gQnViYmxlcyB1cCB0aGUgaGllcmFyY2h5LgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcy52aWV3KS5yb3dSZW1vdmVkKHJvdyk7CiAgfTsKCiAgcmV0dXJuIFJvd1BhcmVudDsKCn0pKCk7CgoKLyoKQW4gYWJzdHJhY3Qgbm9kZSBpbiBhIHJvdy1oaWVyYXJjaHkgdHJlZSB0aGF0IGNvbnRhaW5zIG90aGVyIG5vZGVzLgpXaWxsIGhhdmUgc29tZSBzb3J0IG9mIHJlbmRlcmVkIGxhYmVsIGluZGljYXRpbmcgdGhlIGdyb3VwaW5nLAp1cCB0byB0aGUgc3ViY2xhc3MgZm9yIGRldGVybWluaW5nIHdoYXQgdG8gZG8gd2l0aCBpdC4KICovCgpSb3dHcm91cCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKFJvd0dyb3VwLCBzdXBlckNsYXNzKTsKCiAgUm93R3JvdXAucHJvdG90eXBlLmdyb3VwU3BlYyA9IG51bGw7CgogIFJvd0dyb3VwLnByb3RvdHlwZS5ncm91cFZhbHVlID0gbnVsbDsKCiAgZnVuY3Rpb24gUm93R3JvdXAodmlldywgZ3JvdXBTcGVjMSwgZ3JvdXBWYWx1ZTEpIHsKICAgIHRoaXMuZ3JvdXBTcGVjID0gZ3JvdXBTcGVjMTsKICAgIHRoaXMuZ3JvdXBWYWx1ZSA9IGdyb3VwVmFsdWUxOwogICAgUm93R3JvdXAuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKCiAgLyoKICAJQ2FsbGVkIHdoZW4gdGhpcyByb3cgKGlmIGl0IHJlbmRlcnMgYSByb3cpIG9yIGEgc3Vicm93IGlzIHJlbW92ZWQKICAgKi8KCiAgUm93R3JvdXAucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIFJvd0dyb3VwLl9fc3VwZXJfXy5yb3dSZW1vdmVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocm93ICE9PSB0aGlzICYmICF0aGlzLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4gdGhpcy5yZW1vdmUoKTsKICAgIH0KICB9OwoKCiAgLyoKICAJUmVuZGVycyB0aGUgY29udGVudCB3cmFwcGVyIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhpcyByb3cncyBURCBjZWxsCiAgICovCgogIFJvd0dyb3VwLnByb3RvdHlwZS5yZW5kZXJHcm91cENvbnRlbnRFbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNvbnRlbnRFbCwgZmlsdGVyOwogICAgY29udGVudEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50IiAvPicpLmFwcGVuZCh0aGlzLnJlbmRlckdyb3VwVGV4dEVsKCkpOwogICAgZmlsdGVyID0gdGhpcy5ncm91cFNwZWMucmVuZGVyOwogICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgY29udGVudEVsID0gZmlsdGVyKGNvbnRlbnRFbCwgdGhpcy5ncm91cFZhbHVlKSB8fCBjb250ZW50RWw7CiAgICB9CiAgICByZXR1cm4gY29udGVudEVsOwogIH07CgoKICAvKgogIAlSZW5kZXJzIHRoZSB0ZXh0IHNwYW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGlzIHJvdydzIFREIGNlbGwuCiAgCUdvZXMgd2l0aGluIHRoZSBjb250ZW50IGVsZW1lbnQuCiAgICovCgogIFJvd0dyb3VwLnByb3RvdHlwZS5yZW5kZXJHcm91cFRleHRFbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGZpbHRlciwgdGV4dDsKICAgIHRleHQgPSB0aGlzLmdyb3VwVmFsdWUgfHwgJyc7CiAgICBmaWx0ZXIgPSB0aGlzLmdyb3VwU3BlYy50ZXh0OwogICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdGV4dCA9IGZpbHRlcih0ZXh0KSB8fCB0ZXh0OwogICAgfQogICAgcmV0dXJuICQoJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiIC8+JykudGV4dCh0ZXh0KTsKICB9OwoKICByZXR1cm4gUm93R3JvdXA7Cgp9KShSb3dQYXJlbnQpOwoKCi8qCkEgcm93IGdyb3VwaW5nIHRoYXQgcmVuZGVycyBhcyBhIHNpbmdsZSBzb2xpZCByb3cgdGhhdCBzcGFucyB3aWR0aC13aXNlIChsaWtlIGEgaG9yaXpvbnRhbCBydWxlKQogKi8KCkhSb3dHcm91cCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKEhSb3dHcm91cCwgc3VwZXJDbGFzcyk7CgogIGZ1bmN0aW9uIEhSb3dHcm91cCgpIHsKICAgIHJldHVybiBIUm93R3JvdXAuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBIUm93R3JvdXAucHJvdG90eXBlLmhhc093blJvdyA9IHRydWU7CgoKICAvKgogIAlSZW5kZXJzIHRoaXMgcm93J3MgVFIgZm9yIHRoZSAic3ByZWFkc2hlZXQiIHF1YWRyYW50LCB0aGUgYXJlYSB3aXRoIGluZm8gYWJvdXQgZWFjaCByZXNvdXJjZQogICAqLwoKICBIUm93R3JvdXAucHJvdG90eXBlLnJlbmRlclNwcmVhZHNoZWV0Q29udGVudCA9IGZ1bmN0aW9uKHRyKSB7CiAgICB2YXIgY29udGVudEVsOwogICAgY29udGVudEVsID0gdGhpcy5yZW5kZXJHcm91cENvbnRlbnRFbCgpOwogICAgY29udGVudEVsLnByZXBlbmQoJzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlciI+JyArICc8c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPicgKyAnPC9zcGFuPicpOwogICAgcmV0dXJuICQoJzx0ZCBjbGFzcz0iZmMtZGl2aWRlciIgLz4nKS5hdHRyKCdjb2xzcGFuJywgdGhpcy52aWV3LmNvbFNwZWNzLmxlbmd0aCkuYXBwZW5kKCQoJzxkaXYvPicpLmFwcGVuZChjb250ZW50RWwpKS5hcHBlbmRUbyh0cik7CiAgfTsKCgogIC8qCiAgCVJlbmRlcnMgdGhpcyByb3cncyBUUiBmb3IgdGhlIHF1YWRyYW50IHRoYXQgY29udGFpbnMgYSByZXNvdXJjZSdzIGV2ZW50cwogICAqLwoKICBIUm93R3JvdXAucHJvdG90eXBlLnJlbmRlckV2ZW50Q29udGVudCA9IGZ1bmN0aW9uKHRyKSB7CiAgICByZXR1cm4gdHIuYXBwZW5kKCc8dGQgY2xhc3M9ImZjLWRpdmlkZXIiPiA8ZGl2Lz4gPC90ZD4nKTsKICB9OwoKICByZXR1cm4gSFJvd0dyb3VwOwoKfSkoUm93R3JvdXApOwoKCi8qCkEgcm93IGdyb3VwaW5nIHRoYXQgcmVuZGVycyBhcyBhIHRhbGwgbXVsdGktY2VsbCB2ZXJ0aWNhbCBzcGFuIGluIHRoZSAic3ByZWFkc2hlZXQiIGFyZWEKICovCgpWUm93R3JvdXAgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChWUm93R3JvdXAsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBWUm93R3JvdXAoKSB7CiAgICByZXR1cm4gVlJvd0dyb3VwLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgVlJvd0dyb3VwLnByb3RvdHlwZS5yb3dzcGFuID0gMDsKCiAgVlJvd0dyb3VwLnByb3RvdHlwZS5sZWFkaW5nVHIgPSBudWxsOwoKICBWUm93R3JvdXAucHJvdG90eXBlLmdyb3VwVGQgPSBudWxsOwoKCiAgLyoKICAJQ2FsbGVkIHdoZW4gYSByb3cgc29tZXdoZXJlIHdpdGhpbiB0aGUgZ3JvdXBpbmcgaXMgc2hvd24KICAgKi8KCiAgVlJvd0dyb3VwLnByb3RvdHlwZS5yb3dTaG93biA9IGZ1bmN0aW9uKHJvdykgewogICAgdGhpcy5yb3dzcGFuICs9IDE7CiAgICB0aGlzLnJlbmRlclJvd3NwYW4oKTsKICAgIHJldHVybiBWUm93R3JvdXAuX19zdXBlcl9fLnJvd1Nob3duLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKCgogIC8qCiAgCUNhbGxlZCB3aGVuIGEgcm93IHNvbWV3aGVyZSB3aXRoaW4gdGhlIGdyb3VwaW5nIGlzIGhpZGRlbgogICAqLwoKICBWUm93R3JvdXAucHJvdG90eXBlLnJvd0hpZGRlbiA9IGZ1bmN0aW9uKHJvdykgewogICAgdGhpcy5yb3dzcGFuIC09IDE7CiAgICB0aGlzLnJlbmRlclJvd3NwYW4oKTsKICAgIHJldHVybiBWUm93R3JvdXAuX19zdXBlcl9fLnJvd0hpZGRlbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CgoKICAvKgogIAlNYWtlcyBzdXJlIHRoZSBncm91cFRkIGhhcyB0aGUgY29ycmVjdCByb3dzcGFuIC8gcGxhY2UgaW4gdGhlIERPTS4KICAJUFJFQ09ORElUSU9OOiBpbiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBncm91cCBuZXN0aW5nLCBhIGNoaWxkJ3MgcmVuZGVyUm93c3BhbigpCiAgCXdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgcGFyZW50J3MgcmVuZGVyUm93c3BhbigpLgogICAqLwoKICBWUm93R3JvdXAucHJvdG90eXBlLnJlbmRlclJvd3NwYW4gPSBmdW5jdGlvbigpIHsKICAgIHZhciBsZWFkaW5nVHI7CiAgICBpZiAodGhpcy5yb3dzcGFuKSB7CiAgICAgIGlmICghdGhpcy5ncm91cFRkKSB7CiAgICAgICAgdGhpcy5ncm91cFRkID0gJCgnPHRkIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciLz4nKS5hcHBlbmQodGhpcy5yZW5kZXJHcm91cENvbnRlbnRFbCgpKTsKICAgICAgfQogICAgICB0aGlzLmdyb3VwVGQuYXR0cigncm93c3BhbicsIHRoaXMucm93c3Bhbik7CiAgICAgIGxlYWRpbmdUciA9IHRoaXMuZ2V0TGVhZGluZ1JvdygpLmdldFRyKCdzcHJlYWRzaGVldCcpOwogICAgICBpZiAobGVhZGluZ1RyICE9PSB0aGlzLmxlYWRpbmdUcikgewogICAgICAgIGlmIChsZWFkaW5nVHIpIHsKICAgICAgICAgIGxlYWRpbmdUci5wcmVwZW5kKHRoaXMuZ3JvdXBUZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmxlYWRpbmdUciA9IGxlYWRpbmdUcjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKHRoaXMuZ3JvdXBUZCkgewogICAgICAgIHRoaXMuZ3JvdXBUZC5yZW1vdmUoKTsKICAgICAgICB0aGlzLmdyb3VwVGQgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLmxlYWRpbmdUciA9IG51bGw7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFZSb3dHcm91cDsKCn0pKFJvd0dyb3VwKTsKCkV2ZW50Um93ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoRXZlbnRSb3csIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBFdmVudFJvdygpIHsKICAgIHJldHVybiBFdmVudFJvdy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIEV2ZW50Um93LnByb3RvdHlwZS5oYXNPd25Sb3cgPSB0cnVlOwoKICBFdmVudFJvdy5wcm90b3R5cGUuc2VnQ29udGFpbmVyRWwgPSBudWxsOwoKICBFdmVudFJvdy5wcm90b3R5cGUuc2VnQ29udGFpbmVySGVpZ2h0ID0gbnVsbDsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmlubmVyRWwgPSBudWxsOwoKICBFdmVudFJvdy5wcm90b3R5cGUuYmdTZWdDb250YWluZXJFbCA9IG51bGw7CgogIEV2ZW50Um93LnByb3RvdHlwZS5pc1NlZ3NSZW5kZXJlZCA9IGZhbHNlOwoKICBFdmVudFJvdy5wcm90b3R5cGUuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQgPSBmYWxzZTsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmJ1c2luZXNzSG91clNlZ3MgPSBudWxsOwoKICBFdmVudFJvdy5wcm90b3R5cGUuYmdTZWdzID0gbnVsbDsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmZnU2VncyA9IG51bGw7CgogIEV2ZW50Um93LnByb3RvdHlwZS5yZW5kZXJFdmVudENvbnRlbnQgPSBmdW5jdGlvbih0cikgewogICAgdHIuaHRtbCgnPHRkIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPiA8ZGl2PiA8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiIC8+IDwvZGl2PiA8L3RkPicpOwogICAgdGhpcy5zZWdDb250YWluZXJFbCA9IHRyLmZpbmQoJy5mYy1ldmVudC1jb250YWluZXInKTsKICAgIHRoaXMuaW5uZXJFbCA9IHRoaXMuYmdTZWdDb250YWluZXJFbCA9IHRyLmZpbmQoJ3RkID4gZGl2Jyk7CiAgICByZXR1cm4gdGhpcy5lbnN1cmVTZWdzUmVuZGVyZWQoKTsKICB9OwoKICBFdmVudFJvdy5wcm90b3R5cGUuZW5zdXJlU2Vnc1JlbmRlcmVkID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIXRoaXMuaXNTZWdzUmVuZGVyZWQpIHsKICAgICAgdGhpcy5lbnN1cmVCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQoKTsKICAgICAgaWYgKHRoaXMuYmdTZWdzKSB7CiAgICAgICAgdGhpcy52aWV3LnRpbWVHcmlkLnJlbmRlckZpbGxJbkNvbnRhaW5lcignYmdFdmVudCcsIHRoaXMsIHRoaXMuYmdTZWdzKTsKICAgICAgfQogICAgICBpZiAodGhpcy5mZ1NlZ3MpIHsKICAgICAgICB0aGlzLnZpZXcudGltZUdyaWQucmVuZGVyRmdTZWdzSW5Db250YWluZXJzKFtbdGhpcywgdGhpcy5mZ1NlZ3NdXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuaXNTZWdzUmVuZGVyZWQgPSB0cnVlOwogICAgfQogIH07CgogIEV2ZW50Um93LnByb3RvdHlwZS5lbnN1cmVCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmJ1c2luZXNzSG91clNlZ3MgJiYgIXRoaXMuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQpIHsKICAgICAgdGhpcy52aWV3LnRpbWVHcmlkLnJlbmRlckZpbGxJbkNvbnRhaW5lcignYnVzaW5lc3NIb3VycycsIHRoaXMsIHRoaXMuYnVzaW5lc3NIb3VyU2VncywgJ2JnZXZlbnQnKTsKICAgICAgcmV0dXJuIHRoaXMuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQgPSB0cnVlOwogICAgfQogIH07CgogIEV2ZW50Um93LnByb3RvdHlwZS51bnJlbmRlckV2ZW50Q29udGVudCA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhckJ1c2luZXNzSG91clNlZ3MoKTsKICAgIHRoaXMuYmdTZWdzID0gbnVsbDsKICAgIHRoaXMuZmdTZWdzID0gbnVsbDsKICAgIHJldHVybiB0aGlzLmlzU2Vnc1JlbmRlcmVkID0gZmFsc2U7CiAgfTsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmNsZWFyQnVzaW5lc3NIb3VyU2VncyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGosIGxlbiwgcmVmLCBzZWc7CiAgICBpZiAodGhpcy5idXNpbmVzc0hvdXJTZWdzKSB7CiAgICAgIHJlZiA9IHRoaXMuYnVzaW5lc3NIb3VyU2VnczsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2VnID0gcmVmW2pdOwogICAgICAgIGlmIChzZWcuZWwpIHsKICAgICAgICAgIHNlZy5lbC5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5idXNpbmVzc0hvdXJTZWdzID0gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzLmlzQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkID0gZmFsc2U7CiAgfTsKCiAgcmV0dXJuIEV2ZW50Um93OwoKfSkoUm93UGFyZW50KTsKCgovKgpBIHJvdyB0aGF0IHJlbmRlcnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIHJlc291cmNlLCBhcyB3ZWxsIGFzIGl0IGV2ZW50cyAoaGFuZGxlZCBieSBzdXBlcmNsYXNzKQogKi8KClJlc291cmNlUm93ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoUmVzb3VyY2VSb3csIHN1cGVyQ2xhc3MpOwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucmVzb3VyY2UgPSBudWxsOwoKICBmdW5jdGlvbiBSZXNvdXJjZVJvdyh2aWV3LCByZXNvdXJjZTEpIHsKICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTE7CiAgICBSZXNvdXJjZVJvdy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgoKICAvKgogIAlDYWxsZWQgd2hlbiBhIHJvdyBpbiB0aGUgdHJlZSBoYXMgYmVlbiBhZGRlZAogICAqLwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucm93QWRkZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIFJlc291cmNlUm93Ll9fc3VwZXJfXy5yb3dBZGRlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHJvdyAhPT0gdGhpcyAmJiB0aGlzLmlzUmVuZGVyZWQpIHsKICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7CiAgICAgICAgdGhpcy5lbmFibGVFeHBhbmRpbmcoKTsKICAgICAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5pbmRpY2F0ZUV4cGFuZGVkKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB0aGlzLmluZGljYXRlQ29sbGFwc2VkKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCgogIC8qCiAgCUNhbGxlZCB3aGVuIGEgcm93IGluIHRoZSB0cmVlIGhhcyBiZWVuIHJlbW92ZWQKICAgKi8KCiAgUmVzb3VyY2VSb3cucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIFJlc291cmNlUm93Ll9fc3VwZXJfXy5yb3dSZW1vdmVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocm93ICE9PSB0aGlzICYmIHRoaXMuaXNSZW5kZXJlZCkgewogICAgICBpZiAoIXRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZUV4cGFuZGluZygpOwogICAgICB9CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VSb3cucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VSb3cuX19zdXBlcl9fLnJlbmRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICB0aGlzLmVuYWJsZUV4cGFuZGluZygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kaXNhYmxlRXhwYW5kaW5nKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy52aWV3LnRyaWdnZXIoJ3Jlc291cmNlUmVuZGVyJywgdGhpcy5yZXNvdXJjZSwgdGhpcy5yZXNvdXJjZSwgdGhpcy5nZXRUcignc3ByZWFkc2hlZXQnKS5maW5kKCc+IHRkJyksIHRoaXMuZ2V0VHIoJ2V2ZW50JykuZmluZCgnPiB0ZCcpKTsKICB9OwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucmVuZGVyRXZlbnRDb250ZW50ID0gZnVuY3Rpb24odHIpIHsKICAgIFJlc291cmNlUm93Ll9fc3VwZXJfXy5yZW5kZXJFdmVudENvbnRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHJldHVybiB0ci5hdHRyKCdkYXRhLXJlc291cmNlLWlkJywgdGhpcy5yZXNvdXJjZS5pZCk7CiAgfTsKCgogIC8qCiAgCVBvcHVsYXRlcyB0aGUgVFIgd2l0aCBjZWxscyBjb250YWluaW5nIGRhdGEgYWJvdXQgdGhlIHJlc291cmNlCiAgICovCgogIFJlc291cmNlUm93LnByb3RvdHlwZS5yZW5kZXJTcHJlYWRzaGVldENvbnRlbnQgPSBmdW5jdGlvbih0cikgewogICAgdmFyIGNvbFNwZWMsIGNvbnRlbnRFbCwgaW5wdXQsIGosIGxlbiwgcmVmLCByZXNvdXJjZSwgdGQsIHRleHQ7CiAgICByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2U7CiAgICByZWYgPSB0aGlzLnZpZXcuY29sU3BlY3M7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY29sU3BlYyA9IHJlZltqXTsKICAgICAgaWYgKGNvbFNwZWMuZ3JvdXApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpbnB1dCA9IGNvbFNwZWMuZmllbGQgPyByZXNvdXJjZVtjb2xTcGVjLmZpZWxkXSB8fCBudWxsIDogcmVzb3VyY2U7CiAgICAgIHRleHQgPSB0eXBlb2YgY29sU3BlYy50ZXh0ID09PSAnZnVuY3Rpb24nID8gY29sU3BlYy50ZXh0KHJlc291cmNlLCBpbnB1dCkgOiBpbnB1dDsKICAgICAgY29udGVudEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nICsgKGNvbFNwZWMuaXNNYWluID8gdGhpcy5yZW5kZXJHdXR0ZXJIdG1sKCkgOiAnJykgKyAnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+JyArICh0ZXh0ID8gaHRtbEVzY2FwZSh0ZXh0KSA6ICcmbmJzcDsnKSArICc8L3NwYW4+JyArICc8L2Rpdj4nKTsKICAgICAgaWYgKHR5cGVvZiBjb2xTcGVjLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGNvbnRlbnRFbCA9IGNvbFNwZWMucmVuZGVyKHJlc291cmNlLCBjb250ZW50RWwsIGlucHV0KSB8fCBjb250ZW50RWw7CiAgICAgIH0KICAgICAgdGQgPSAkKCc8dGQgY2xhc3M9IicgKyB0aGlzLnZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyIvPicpLmFwcGVuZChjb250ZW50RWwpOwogICAgICBpZiAoY29sU3BlYy5pc01haW4pIHsKICAgICAgICB0ZC53cmFwSW5uZXIoJzxkaXYvPicpOwogICAgICB9CiAgICAgIHRyLmFwcGVuZCh0ZCk7CiAgICB9CiAgICByZXR1cm4gdHIuYXR0cignZGF0YS1yZXNvdXJjZS1pZCcsIHJlc291cmNlLmlkKTsKICB9OwoKCiAgLyoKICAJUmVuZGVycyB0aGUgSFRNTCByZXNwb25zaWJsZSBmb3IgdGhlIHN1YnJvdyBleHBhbmRlciBhcmVhLAogIAlhcyB3ZWxsIGFzIHRoZSBzcGFjZSBiZWZvcmUgaXQgKHVzZWQgdG8gYWxpZ24gZXhwYW5kZXJzIG9mIHNpbWlsYXIgZGVwdGhzKQogICAqLwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucmVuZGVyR3V0dGVySHRtbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGh0bWwsIGksIGosIHJlZjsKICAgIGh0bWwgPSAnJzsKICAgIGZvciAoaSA9IGogPSAwLCByZWYgPSB0aGlzLmRlcHRoOyBqIDwgcmVmOyBpID0gaiArPSAxKSB7CiAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJmYy1pY29uIi8+JzsKICAgIH0KICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlci1zcGFjZSI+JyArICc8c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPicgKyAnPC9zcGFuPic7CiAgICByZXR1cm4gaHRtbDsKICB9OwoKICByZXR1cm4gUmVzb3VyY2VSb3c7Cgp9KShFdmVudFJvdyk7CgpGQy52aWV3cy50aW1lbGluZS5yZXNvdXJjZUNsYXNzID0gUmVzb3VyY2VUaW1lbGluZVZpZXc7CgpSZXNvdXJjZUFnZW5kYVZpZXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZUFnZW5kYVZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZUFnZW5kYVZpZXcoKSB7CiAgICByZXR1cm4gUmVzb3VyY2VBZ2VuZGFWaWV3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgUmVzb3VyY2VBZ2VuZGFWaWV3Lm1peGluKFJlc291cmNlVmlld01peGluKTsKCiAgUmVzb3VyY2VBZ2VuZGFWaWV3LnByb3RvdHlwZS50aW1lR3JpZENsYXNzID0gUmVzb3VyY2VUaW1lR3JpZDsKCiAgUmVzb3VyY2VBZ2VuZGFWaWV3LnByb3RvdHlwZS5kYXlHcmlkQ2xhc3MgPSBSZXNvdXJjZURheUdyaWQ7CgogIFJlc291cmNlQWdlbmRhVmlldy5wcm90b3R5cGUucmVuZGVySGVhZCA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VBZ2VuZGFWaWV3Ll9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5wcm9jZXNzSGVhZFJlc291cmNlRWxzKHRoaXMuaGVhZENvbnRhaW5lckVsKTsKICB9OwoKICBSZXNvdXJjZUFnZW5kYVZpZXcucHJvdG90eXBlLnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKHJlc291cmNlcykgewogICAgdGhpcy50aW1lR3JpZC5zZXRSZXNvdXJjZXMocmVzb3VyY2VzKTsKICAgIGlmICh0aGlzLmRheUdyaWQpIHsKICAgICAgdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyhyZXNvdXJjZXMpOwogICAgfQogICAgdGhpcy5jbGVhclZpZXcoKTsKICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgfTsKCiAgUmVzb3VyY2VBZ2VuZGFWaWV3LnByb3RvdHlwZS51bnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKGlzRGVzdHJveWluZykgewogICAgdGhpcy5jbGVhckV2ZW50cygpOwogICAgdGhpcy50aW1lR3JpZC51bnNldFJlc291cmNlcygpOwogICAgaWYgKHRoaXMuZGF5R3JpZCkgewogICAgICB0aGlzLmRheUdyaWQudW5zZXRSZXNvdXJjZXMoKTsKICAgIH0KICAgIGlmICghaXNEZXN0cm95aW5nKSB7CiAgICAgIHRoaXMuY2xlYXJWaWV3KCk7CiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlQWdlbmRhVmlldzsKCn0pKEZDLkFnZW5kYVZpZXcpOwoKRkMudmlld3MuYWdlbmRhLnF1ZXJ5UmVzb3VyY2VDbGFzcyA9IGZ1bmN0aW9uKHZpZXdTcGVjKSB7CiAgdmFyIHJlZjsKICBpZiAoKHJlZiA9IHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeVJlc291cmNlIHx8IHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeURhdGVBbmRSZXNvdXJjZSkgIT0gbnVsbCA/IHJlZiA6IHZpZXdTcGVjLmR1cmF0aW9uLmFzKCdkYXlzJykgPT09IDEpIHsKICAgIHJldHVybiBSZXNvdXJjZUFnZW5kYVZpZXc7CiAgfQp9OwoKUmVzb3VyY2VCYXNpY1ZpZXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZUJhc2ljVmlldywgc3VwZXJDbGFzcyk7CgogIGZ1bmN0aW9uIFJlc291cmNlQmFzaWNWaWV3KCkgewogICAgcmV0dXJuIFJlc291cmNlQmFzaWNWaWV3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgUmVzb3VyY2VCYXNpY1ZpZXcubWl4aW4oUmVzb3VyY2VWaWV3TWl4aW4pOwoKICBSZXNvdXJjZUJhc2ljVmlldy5wcm90b3R5cGUuZGF5R3JpZENsYXNzID0gUmVzb3VyY2VEYXlHcmlkOwoKICBSZXNvdXJjZUJhc2ljVmlldy5wcm90b3R5cGUucmVuZGVySGVhZCA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VCYXNpY1ZpZXcuX19zdXBlcl9fLnJlbmRlckhlYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHJldHVybiB0aGlzLmRheUdyaWQucHJvY2Vzc0hlYWRSZXNvdXJjZUVscyh0aGlzLmhlYWRDb250YWluZXJFbCk7CiAgfTsKCiAgUmVzb3VyY2VCYXNpY1ZpZXcucHJvdG90eXBlLnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKHJlc291cmNlcykgewogICAgdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyhyZXNvdXJjZXMpOwogICAgdGhpcy5jbGVhclZpZXcoKTsKICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgfTsKCiAgUmVzb3VyY2VCYXNpY1ZpZXcucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzID0gZnVuY3Rpb24oaXNEZXN0cm95aW5nKSB7CiAgICB0aGlzLmNsZWFyRXZlbnRzKCk7CiAgICB0aGlzLmRheUdyaWQudW5zZXRSZXNvdXJjZXMoKTsKICAgIGlmICghaXNEZXN0cm95aW5nKSB7CiAgICAgIHRoaXMuY2xlYXJWaWV3KCk7CiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlQmFzaWNWaWV3OwoKfSkoRkMuQmFzaWNWaWV3KTsKClJlc291cmNlTW9udGhWaWV3ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoUmVzb3VyY2VNb250aFZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZU1vbnRoVmlldygpIHsKICAgIHJldHVybiBSZXNvdXJjZU1vbnRoVmlldy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIFJlc291cmNlTW9udGhWaWV3Lm1peGluKFJlc291cmNlVmlld01peGluKTsKCiAgUmVzb3VyY2VNb250aFZpZXcucHJvdG90eXBlLmRheUdyaWRDbGFzcyA9IFJlc291cmNlRGF5R3JpZDsKCiAgUmVzb3VyY2VNb250aFZpZXcucHJvdG90eXBlLnJlbmRlckhlYWQgPSBmdW5jdGlvbigpIHsKICAgIFJlc291cmNlTW9udGhWaWV3Ll9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy5kYXlHcmlkLnByb2Nlc3NIZWFkUmVzb3VyY2VFbHModGhpcy5oZWFkQ29udGFpbmVyRWwpOwogIH07CgogIFJlc291cmNlTW9udGhWaWV3LnByb3RvdHlwZS5zZXRSZXNvdXJjZXMgPSBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICAgIHRoaXMuZGF5R3JpZC5zZXRSZXNvdXJjZXMocmVzb3VyY2VzKTsKICAgIHRoaXMuY2xlYXJWaWV3KCk7CiAgICByZXR1cm4gdGhpcy5kaXNwbGF5VmlldygpOwogIH07CgogIFJlc291cmNlTW9udGhWaWV3LnByb3RvdHlwZS51bnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhckV2ZW50cygpOwogICAgdGhpcy5kYXlHcmlkLnVuc2V0UmVzb3VyY2VzKCk7CiAgICB0aGlzLmNsZWFyVmlldygpOwogICAgcmV0dXJuIHRoaXMuZGlzcGxheVZpZXcoKTsKICB9OwoKICByZXR1cm4gUmVzb3VyY2VNb250aFZpZXc7Cgp9KShGQy5Nb250aFZpZXcpOwoKRkMudmlld3MuYmFzaWMucXVlcnlSZXNvdXJjZUNsYXNzID0gZnVuY3Rpb24odmlld1NwZWMpIHsKICB2YXIgcmVmOwogIGlmICgocmVmID0gdmlld1NwZWMub3B0aW9ucy5ncm91cEJ5UmVzb3VyY2UgfHwgdmlld1NwZWMub3B0aW9ucy5ncm91cEJ5RGF0ZUFuZFJlc291cmNlKSAhPSBudWxsID8gcmVmIDogdmlld1NwZWMuZHVyYXRpb24uYXMoJ2RheXMnKSA9PT0gMSkgewogICAgcmV0dXJuIFJlc291cmNlQmFzaWNWaWV3OwogIH0KfTsKCkZDLnZpZXdzLm1vbnRoLnF1ZXJ5UmVzb3VyY2VDbGFzcyA9IGZ1bmN0aW9uKHZpZXdTcGVjKSB7CiAgaWYgKHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeVJlc291cmNlIHx8IHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeURhdGVBbmRSZXNvdXJjZSkgewogICAgcmV0dXJuIFJlc291cmNlTW9udGhWaWV3OwogIH0KfTsKClJFTEVBU0VfREFURSA9ICcyMDE2LTA5LTA0JzsKClVQR1JBREVfV0lORE9XID0gewogIHllYXJzOiAxLAogIHdlZWtzOiAxCn07CgpMSUNFTlNFX0lORk9fVVJMID0gJ2h0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vc2NoZWR1bGVyL2xpY2Vuc2UvJzsKClBSRVNFVF9MSUNFTlNFX0tFWVMgPSBbJ0dQTC1NeS1Qcm9qZWN0LUlzLU9wZW4tU291cmNlJywgJ0NDLUF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwtTm9EZXJpdmF0aXZlcyddOwoKcHJvY2Vzc0xpY2Vuc2VLZXkgPSBmdW5jdGlvbihrZXksIGNvbnRhaW5lckVsKSB7CiAgaWYgKCFpc0ltbXVuZVVybCh3aW5kb3cubG9jYXRpb24uaHJlZikgJiYgIWlzVmFsaWRLZXkoa2V5KSkgewogICAgaWYgKCFkZXRlY3RXYXJuaW5nSW5Db250YWluZXIoY29udGFpbmVyRWwpKSB7CiAgICAgIHJldHVybiByZW5kZXJpbmdXYXJuaW5nSW5Db250YWluZXIoJ1BsZWFzZSB1c2UgYSB2YWxpZCBsaWNlbnNlIGtleS4gPGEgaHJlZj0iJyArIExJQ0VOU0VfSU5GT19VUkwgKyAnIj5Nb3JlIEluZm88L2E+JywgY29udGFpbmVyRWwpOwogICAgfQogIH0KfTsKCgovKgpUaGlzIGRlY3J5cHRpb24gaXMgbm90IG1lYW50IHRvIGJlIGJ1bGxldHByb29mLiBKdXN0IGEgd2F5IHRvIHJlbWluZCBhYm91dCBhbiB1cGdyYWRlLgogKi8KCmlzVmFsaWRLZXkgPSBmdW5jdGlvbihrZXkpIHsKICB2YXIgbWluUHVyY2hhc2VEYXRlLCBwYXJ0cywgcHVyY2hhc2VEYXRlLCByZWxlYXNlRGF0ZTsKICBpZiAoJC5pbkFycmF5KGtleSwgUFJFU0VUX0xJQ0VOU0VfS0VZUykgIT09IC0xKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcGFydHMgPSAoa2V5IHx8ICcnKS5tYXRjaCgvXihcZCspXC1mY3NcLShcZCspJC8pOwogIGlmIChwYXJ0cyAmJiBwYXJ0c1sxXS5sZW5ndGggPT09IDEwKSB7CiAgICBwdXJjaGFzZURhdGUgPSBtb21lbnQudXRjKHBhcnNlSW50KHBhcnRzWzJdKSAqIDEwMDApOwogICAgcmVsZWFzZURhdGUgPSBtb21lbnQudXRjKEZDLm1vY2tTY2hlZHVsZXJSZWxlYXNlRGF0ZSB8fCBSRUxFQVNFX0RBVEUpOwogICAgaWYgKHJlbGVhc2VEYXRlLmlzVmFsaWQoKSkgewogICAgICBtaW5QdXJjaGFzZURhdGUgPSByZWxlYXNlRGF0ZS5jbG9uZSgpLnN1YnRyYWN0KFVQR1JBREVfV0lORE9XKTsKICAgICAgaWYgKHB1cmNoYXNlRGF0ZS5pc0FmdGVyKG1pblB1cmNoYXNlRGF0ZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn07Cgppc0ltbXVuZVVybCA9IGZ1bmN0aW9uKHVybCkgewogIHJldHVybiBCb29sZWFuKHVybC5tYXRjaCgvXHcrXDpcL1wvZnVsbGNhbGVuZGFyXC5pb1wvfFwvZGVtb3NcL1tcdy1dK1wuaHRtbCQvKSk7Cn07CgpyZW5kZXJpbmdXYXJuaW5nSW5Db250YWluZXIgPSBmdW5jdGlvbihtZXNzYWdlSHRtbCwgY29udGFpbmVyRWwpIHsKICByZXR1cm4gY29udGFpbmVyRWwuYXBwZW5kKCQoJzxkaXYgY2xhc3M9ImZjLWxpY2Vuc2UtbWVzc2FnZSIgLz4nKS5odG1sKG1lc3NhZ2VIdG1sKSk7Cn07CgpkZXRlY3RXYXJuaW5nSW5Db250YWluZXIgPSBmdW5jdGlvbihjb250YWluZXJFbCkgewogIHJldHVybiBjb250YWluZXJFbC5maW5kKCcuZmMtbGljZW5zZS1tZXNzYWdlJykubGVuZ3RoID49IDE7Cn07Cgp9KTsK
LyohCkZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgdjEuNC4wCkRvY3MgJiBMaWNlbnNlOiBodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci8KKGMpIDIwMTYgQWRhbSBTaGF3CiAqLwohZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiLCJtb21lbnQiLCJmdWxsY2FsZW5kYXIiXSx0KToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9dChyZXF1aXJlKCJqcXVlcnkiKSxyZXF1aXJlKCJtb21lbnQiKSxyZXF1aXJlKCJmdWxsY2FsZW5kYXIiKSk6dChqUXVlcnksbW9tZW50KX0oZnVuY3Rpb24odCxlKXt2YXIgcixvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHksdix3LG0sUyxSLGIsQyxFLEgsVCxfLEksRCx4LEIsRixHLE0sVyxMLHosayxWLFAsQSxPLHEsTixqLFksVSxYLCQsSyxRLEosWix0dCxldCxydCxvdCxzdCxpdCxudCxsdCx1dCxodCxhdCxjdCxwdCxkdCxmdCxndCx5dCx2dCx3dCxtdCxTdCxSdCxidCxDdCxFdCxIdCxUdCxfdCxJdCxEdCx4dCxCdCxGdCxHdCxNdCxXdCxMdCx6dCxrdCxWdCxQdCxBdCxPdD1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBvIGluIGUpcXQuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5fX3N1cGVyX189ZS5wcm90b3R5cGUsdH0scXQ9e30uaGFzT3duUHJvcGVydHksTnQ9W10uaW5kZXhPZnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj10aGlzLmxlbmd0aDtlPHI7ZSsrKWlmKGUgaW4gdGhpcyYmdGhpc1tlXT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9LGp0PVtdLnNsaWNlO3JldHVybiBkPXQuZnVsbENhbGVuZGFyLGQuc2NoZWR1bGVyVmVyc2lvbj0iMS40LjAiLDYhPT1kLmludGVybmFsQXBpVmVyc2lvbj92b2lkIGQud2FybigidiIrZC5zY2hlZHVsZXJWZXJzaW9uKyIgb2YgRnVsbENhbGVuZGFyIFNjaGVkdWxlciBpcyBpbmNvbXBhdGlibGUgd2l0aCB2IitkLnZlcnNpb24rIiBvZiB0aGUgY29yZS5cblBsZWFzZSBzZWUgaHR0cDovL2Z1bGxjYWxlbmRhci5pby9zdXBwb3J0LyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKToobz1kLkNhbGVuZGFyLGk9ZC5DbGFzcyxYPWQuVmlldyxmPWQuR3JpZCx2dD1kLmludGVyc2VjdFJhbmdlcyxvdD1kLmRlYm91bmNlLFN0PWQuaXNJbnQsZnQ9ZC5nZXRTY3JvbGxiYXJXaWR0aHMsaD1kLkRyYWdMaXN0ZW5lcix5dD1kLmh0bWxFc2NhcGUsSj1kLmNvbXB1dGVJbnRlcnZhbFVuaXQsTXQ9ZC5wcm94eSxLPWQuY2FwaXRhbGlzZUZpcnN0TGV0dGVyLCQ9ZC5hcHBseUFsbCxhPWQuRW1pdHRlck1peGluLHY9ZC5MaXN0ZW5lck1peGluLGx0PWQuZHVyYXRpb25IYXNUaW1lLG50PWQuZGl2aWRlUmFuZ2VCeUR1cmF0aW9uLGl0PWQuZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uLEN0PWQubXVsdGlwbHlEdXJhdGlvbixGdD1kLnBhcnNlRmllbGRTcGVjcyxRPWQuY29tcGFyZUJ5RmllbGRTcGVjcyx1dD1kLmZsZXhpYmxlQ29tcGFyZSx3dD1kLmludGVyc2VjdFJlY3RzLGw9ZC5Db29yZENhY2hlLGh0PWQuZ2V0Q29udGVudFJlY3QsYXQ9ZC5nZXRPdXRlclJlY3QsY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZmluZCgiPiB0ZCIpLmZpbHRlcihmdW5jdGlvbih0LGUpe3JldHVybiBlLnJvd1NwYW48PTF9KX0sTHQ9ZnVuY3Rpb24oZSxyLG8pe3JldHVybiBlJiZlLnRoZW4mJiJyZXNvbHZlZCIhPT1lLnN0YXRlKCk/InJlamVjdGVkIj09PWUuc3RhdGUoKT8obyYmbygpLHQuRGVmZXJyZWQoKS5yZWplY3QoKS5wcm9taXNlKCkpOmUudGhlbihyLG8pOnI/dC53aGVuKHIoKSk6dC53aGVuKCl9LGM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcigpe3IuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlcXVlc3RNb3ZpbmdFbmQ9b3QodGhpcy5yZXBvcnRNb3ZpbmdFbmQsNTAwKX12YXIgbyxzO3JldHVybiBPdChyLGUpLHIubWl4aW4oYSksci5taXhpbih2KSxyLnByb3RvdHlwZS5jYW52YXM9bnVsbCxyLnByb3RvdHlwZS5pc1Njcm9sbGluZz0hMSxyLnByb3RvdHlwZS5pc1RvdWNoaW5nPSExLHIucHJvdG90eXBlLmlzTW92aW5nPSExLHIucHJvdG90eXBlLmlzVG91Y2hTY3JvbGxFbmFibGVkPSEwLHIucHJvdG90eXBlLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXI9bnVsbCxyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gci5fX3N1cGVyX18ucmVuZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNhbnZhcyYmKHRoaXMuY2FudmFzLnJlbmRlcigpLHRoaXMuY2FudmFzLmVsLmFwcGVuZFRvKHRoaXMuc2Nyb2xsRWwpKSx0aGlzLmJpbmRIYW5kbGVycygpfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cmV0dXJuIHIuX19zdXBlcl9fLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudW5iaW5kSGFuZGxlcnMoKX0sci5wcm90b3R5cGUuZGlzYWJsZVRvdWNoU2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNUb3VjaFNjcm9sbEVuYWJsZWQ9ITEsdGhpcy5iaW5kUHJldmVudFRvdWNoU2Nyb2xsKCl9LHIucHJvdG90eXBlLmVuYWJsZVRvdWNoU2Nyb2xsPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1RvdWNoU2Nyb2xsRW5hYmxlZD0hMCwhdGhpcy5pc1RvdWNoaW5nKXJldHVybiB0aGlzLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpfSxyLnByb3RvdHlwZS5iaW5kUHJldmVudFRvdWNoU2Nyb2xsPWZ1bmN0aW9uKCl7aWYoIXRoaXMucHJldmVudFRvdWNoU2Nyb2xsSGFuZGxlcilyZXR1cm4gdGhpcy5zY3JvbGxFbC5vbigidG91Y2htb3ZlIix0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXI9ZC5wcmV2ZW50RGVmYXVsdCl9LHIucHJvdG90eXBlLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbD1mdW5jdGlvbigpe2lmKHRoaXMucHJldmVudFRvdWNoU2Nyb2xsSGFuZGxlcilyZXR1cm4gdGhpcy5zY3JvbGxFbC5vZmYoInRvdWNobW92ZSIsdGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyKSx0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXI9bnVsbH0sci5wcm90b3R5cGUuYmluZEhhbmRsZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGlzdGVuVG8odGhpcy5zY3JvbGxFbCx7c2Nyb2xsOnRoaXMucmVwb3J0U2Nyb2xsLHRvdWNoc3RhcnQ6dGhpcy5yZXBvcnRUb3VjaFN0YXJ0LHRvdWNoZW5kOnRoaXMucmVwb3J0VG91Y2hFbmR9KX0sci5wcm90b3R5cGUudW5iaW5kSGFuZGxlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCl9LHIucHJvdG90eXBlLnJlcG9ydFNjcm9sbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzU2Nyb2xsaW5nfHx0aGlzLnJlcG9ydFNjcm9sbFN0YXJ0KCksdGhpcy50cmlnZ2VyKCJzY3JvbGwiKSx0aGlzLmlzTW92aW5nPSEwLHRoaXMucmVxdWVzdE1vdmluZ0VuZCgpfSxyLnByb3RvdHlwZS5yZXBvcnRTY3JvbGxTdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzU2Nyb2xsaW5nKXJldHVybiB0aGlzLmlzU2Nyb2xsaW5nPSEwLHRoaXMudHJpZ2dlcigic2Nyb2xsU3RhcnQiLHRoaXMuaXNUb3VjaGluZyl9LHIucHJvdG90eXBlLnJlcXVlc3RNb3ZpbmdFbmQ9bnVsbCxyLnByb3RvdHlwZS5yZXBvcnRNb3ZpbmdFbmQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTW92aW5nPSExLCF0aGlzLmlzVG91Y2hpbmcpcmV0dXJuIHRoaXMucmVwb3J0U2Nyb2xsRW5kKCl9LHIucHJvdG90eXBlLnJlcG9ydFNjcm9sbEVuZD1mdW5jdGlvbigpe2lmKHRoaXMuaXNTY3JvbGxpbmcpcmV0dXJuIHRoaXMudHJpZ2dlcigic2Nyb2xsRW5kIiksdGhpcy5pc1Njcm9sbGluZz0hMX0sci5wcm90b3R5cGUucmVwb3J0VG91Y2hTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVG91Y2hpbmc9ITB9LHIucHJvdG90eXBlLnJlcG9ydFRvdWNoRW5kPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1RvdWNoaW5nJiYodGhpcy5pc1RvdWNoaW5nPSExLHRoaXMuaXNUb3VjaFNjcm9sbEVuYWJsZWQmJnRoaXMudW5iaW5kUHJldmVudFRvdWNoU2Nyb2xsKCksIXRoaXMuaXNNb3ZpbmcpKXJldHVybiB0aGlzLnJlcG9ydFNjcm9sbEVuZCgpfSxyLnByb3RvdHlwZS5nZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyO2lmKHQ9dGhpcy5zY3JvbGxFbC5jc3MoImRpcmVjdGlvbiIpLGU9dGhpcy5zY3JvbGxFbFswXSxyPWUuc2Nyb2xsTGVmdCwicnRsIj09PXQpc3dpdGNoKHMpe2Nhc2UicG9zaXRpdmUiOnI9citlLmNsaWVudFdpZHRoLWUuc2Nyb2xsV2lkdGg7YnJlYWs7Y2FzZSJyZXZlcnNlIjpyPS1yfXJldHVybiByfSxyLnByb3RvdHlwZS5zZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKHQpe3ZhciBlLHI7aWYoZT10aGlzLnNjcm9sbEVsLmNzcygiZGlyZWN0aW9uIikscj10aGlzLnNjcm9sbEVsWzBdLCJydGwiPT09ZSlzd2l0Y2gocyl7Y2FzZSJwb3NpdGl2ZSI6dD10LXIuY2xpZW50V2lkdGgrci5zY3JvbGxXaWR0aDticmVhaztjYXNlInJldmVyc2UiOnQ9LXR9cmV0dXJuIHIuc2Nyb2xsTGVmdD10fSxyLnByb3RvdHlwZS5nZXRTY3JvbGxGcm9tTGVmdD1mdW5jdGlvbigpe3ZhciB0LGUscjtpZih0PXRoaXMuc2Nyb2xsRWwuY3NzKCJkaXJlY3Rpb24iKSxlPXRoaXMuc2Nyb2xsRWxbMF0scj1lLnNjcm9sbExlZnQsInJ0bCI9PT10KXN3aXRjaChzKXtjYXNlIm5lZ2F0aXZlIjpyPXItZS5jbGllbnRXaWR0aCtlLnNjcm9sbFdpZHRoO2JyZWFrO2Nhc2UicmV2ZXJzZSI6cj0tci1lLmNsaWVudFdpZHRoK2Uuc2Nyb2xsV2lkdGh9cmV0dXJuIHJ9LHIucHJvdG90eXBlLmdldE5hdGl2ZVNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxFbFswXS5zY3JvbGxMZWZ0fSxyLnByb3RvdHlwZS5zZXROYXRpdmVTY3JvbGxMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjcm9sbEVsWzBdLnNjcm9sbExlZnQ9dH0scz1udWxsLG89ZnVuY3Rpb24oKXt2YXIgZSxyLG87cmV0dXJuIGU9dCgnPGRpdiBzdHlsZT0iIHBvc2l0aW9uOiBhYnNvbHV0ZSB0b3A6IC0xMDAwcHg7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBvdmVyZmxvdzogc2Nyb2xsOyBkaXJlY3Rpb246IHJ0bDsgZm9udC1zaXplOiAxNHB4OyAiPkE8L2Rpdj4nKS5hcHBlbmRUbygiYm9keSIpLHI9ZVswXSxvPXIuc2Nyb2xsTGVmdD4wPyJwb3NpdGl2ZSI6KHIuc2Nyb2xsTGVmdD0xLGUuc2Nyb2xsTGVmdD4wPyJyZXZlcnNlIjoibmVnYXRpdmUiKSxlLnJlbW92ZSgpLG99LHQoZnVuY3Rpb24oKXtyZXR1cm4gcz1vKCl9KSxyfShkLlNjcm9sbGVyKSxuPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyksImNsaXBwZWQtc2Nyb2xsIj09PXRoaXMub3ZlcmZsb3dYJiYodGhpcy5vdmVyZmxvd1g9InNjcm9sbCIsdGhpcy5pc0hTY3JvbGxiYXJzQ2xpcHBlZD0hMCksImNsaXBwZWQtc2Nyb2xsIj09PXRoaXMub3ZlcmZsb3dZJiYodGhpcy5vdmVyZmxvd1k9InNjcm9sbCIsdGhpcy5pc1ZTY3JvbGxiYXJzQ2xpcHBlZD0hMCl9cmV0dXJuIE90KHIsZSksci5wcm90b3R5cGUuaXNIU2Nyb2xsYmFyc0NsaXBwZWQ9ITEsci5wcm90b3R5cGUuaXNWU2Nyb2xsYmFyc0NsaXBwZWQ9ITEsci5wcm90b3R5cGUucmVuZGVyRWw9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gZT1yLl9fc3VwZXJfXy5yZW5kZXJFbC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCgnPGRpdiBjbGFzcz0iZmMtc2Nyb2xsZXItY2xpcCIgLz4nKS5hcHBlbmQoZSl9LHIucHJvdG90eXBlLnVwZGF0ZVNpemU9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7cmV0dXJuIGU9dGhpcy5zY3JvbGxFbCxyPWZ0KGUpLHQ9e21hcmdpbkxlZnQ6MCxtYXJnaW5SaWdodDowLG1hcmdpblRvcDowLG1hcmdpbkJvdHRvbTowfSx0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkJiYodC5tYXJnaW5Ub3A9LXIudG9wLHQubWFyZ2luQm90dG9tPS1yLmJvdHRvbSksdGhpcy5pc1ZTY3JvbGxiYXJzQ2xpcHBlZCYmKHQubWFyZ2luTGVmdD0tci5sZWZ0LHQubWFyZ2luUmlnaHQ9LXIucmlnaHQpLGUuY3NzKHQpLGUudG9nZ2xlQ2xhc3MoImZjLW5vLXNjcm9sbGJhcnMiLCh0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkfHwiaGlkZGVuIj09PXRoaXMub3ZlcmZsb3dYKSYmKHRoaXMuaXNWU2Nyb2xsYmFyc0NsaXBwZWR8fCJoaWRkZW4iPT09dGhpcy5vdmVyZmxvd1kpJiYhKHIudG9wfHxyLmJvdHRvbXx8ci5sZWZ0fHxyLnJpZ2h0KSl9LHIucHJvdG90eXBlLmdldFNjcm9sbGJhcldpZHRocz1mdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PWZ0KHRoaXMuc2Nyb2xsRWwpLHRoaXMuaXNIU2Nyb2xsYmFyc0NsaXBwZWQmJih0LnRvcD0wLHQuYm90dG9tPTApLHRoaXMuaXNWU2Nyb2xsYmFyc0NsaXBwZWQmJih0LmxlZnQ9MCx0LnJpZ2h0PTApLHR9LHJ9KGMpLE89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5ndXR0ZXJzPXt9fXJldHVybiBlLnByb3RvdHlwZS5lbD1udWxsLGUucHJvdG90eXBlLmNvbnRlbnRFbD1udWxsLGUucHJvdG90eXBlLmJnRWw9bnVsbCxlLnByb3RvdHlwZS5ndXR0ZXJzPW51bGwsZS5wcm90b3R5cGUud2lkdGg9bnVsbCxlLnByb3RvdHlwZS5taW5XaWR0aD1udWxsLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVsPXQoJzxkaXYgY2xhc3M9ImZjLXNjcm9sbGVyLWNhbnZhcyI+IDxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPjwvZGl2PiA8ZGl2IGNsYXNzPSJmYy1iZyI+PC9kaXY+IDwvZGl2PicpLHRoaXMuY29udGVudEVsPXRoaXMuZWwuZmluZCgiLmZjLWNvbnRlbnQiKSx0aGlzLmJnRWw9dGhpcy5lbC5maW5kKCIuZmMtYmciKX0sZS5wcm90b3R5cGUuc2V0R3V0dGVycz1mdW5jdGlvbihlKXtyZXR1cm4gZT90LmV4dGVuZCh0aGlzLmd1dHRlcnMsZSk6dGhpcy5ndXR0ZXJzPXt9LHRoaXMudXBkYXRlU2l6ZSgpfSxlLnByb3RvdHlwZS5zZXRXaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53aWR0aD10LHRoaXMudXBkYXRlU2l6ZSgpfSxlLnByb3RvdHlwZS5zZXRNaW5XaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5taW5XaWR0aD10LHRoaXMudXBkYXRlU2l6ZSgpfSxlLnByb3RvdHlwZS5jbGVhcldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2lkdGg9bnVsbCx0aGlzLm1pbldpZHRoPW51bGwsdGhpcy51cGRhdGVTaXplKCl9LGUucHJvdG90eXBlLnVwZGF0ZVNpemU9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdD10aGlzLmd1dHRlcnMsdGhpcy5lbC50b2dnbGVDbGFzcygiZmMtZ3V0dGVyLWxlZnQiLEJvb2xlYW4odC5sZWZ0KSkudG9nZ2xlQ2xhc3MoImZjLWd1dHRlci1yaWdodCIsQm9vbGVhbih0LnJpZ2h0KSkudG9nZ2xlQ2xhc3MoImZjLWd1dHRlci10b3AiLEJvb2xlYW4odC50b3ApKS50b2dnbGVDbGFzcygiZmMtZ3V0dGVyLWJvdHRvbSIsQm9vbGVhbih0LmJvdHRvbSkpLmNzcyh7cGFkZGluZ0xlZnQ6dC5sZWZ0fHwiIixwYWRkaW5nUmlnaHQ6dC5yaWdodHx8IiIscGFkZGluZ1RvcDp0LnRvcHx8IiIscGFkZGluZ0JvdHRvbTp0LmJvdHRvbXx8IiIsd2lkdGg6bnVsbCE9dGhpcy53aWR0aD90aGlzLndpZHRoKyh0LmxlZnR8fDApKyh0LnJpZ2h0fHwwKToiIixtaW5XaWR0aDpudWxsIT10aGlzLm1pbldpZHRoP3RoaXMubWluV2lkdGgrKHQubGVmdHx8MCkrKHQucmlnaHR8fDApOiIifSksdGhpcy5iZ0VsLmNzcyh7bGVmdDp0LmxlZnR8fCIiLHJpZ2h0OnQucmlnaHR8fCIiLHRvcDp0LnRvcHx8IiIsYm90dG9tOnQuYm90dG9tfHwiIn0pfSxlfSgpLEE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIHIsbyxzLGk7Zm9yKHRoaXMuYXhpcz10LHRoaXMuc2Nyb2xsZXJzPWUscz10aGlzLnNjcm9sbGVycyxyPTAsbz1zLmxlbmd0aDtyPG87cisrKWk9c1tyXSx0aGlzLmluaXRTY3JvbGxlcihpKX1yZXR1cm4gdC5wcm90b3R5cGUuYXhpcz1udWxsLHQucHJvdG90eXBlLnNjcm9sbGVycz1udWxsLHQucHJvdG90eXBlLm1hc3RlclNjcm9sbGVyPW51bGwsdC5wcm90b3R5cGUuaW5pdFNjcm9sbGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNjcm9sbEVsLm9uKCJ3aGVlbCBtb3VzZXdoZWVsIERvbU1vdXNlU2Nyb2xsIE1vek1vdXNlUGl4ZWxTY3JvbGwiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2UuYXNzaWduTWFzdGVyU2Nyb2xsZXIodCl9fSh0aGlzKSksdC5vbigic2Nyb2xsU3RhcnQiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2lmKCFlLm1hc3RlclNjcm9sbGVyKXJldHVybiBlLmFzc2lnbk1hc3RlclNjcm9sbGVyKHQpfX0odGhpcykpLm9uKCJzY3JvbGwiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByLG8scyxpLG47aWYodD09PWUubWFzdGVyU2Nyb2xsZXIpe2ZvcihpPWUuc2Nyb2xsZXJzLG49W10scj0wLG89aS5sZW5ndGg7cjxvO3IrKylpZihzPWlbcl0scyE9PXQpc3dpdGNoKGUuYXhpcyl7Y2FzZSJob3Jpem9udGFsIjpuLnB1c2gocy5zZXROYXRpdmVTY3JvbGxMZWZ0KHQuZ2V0TmF0aXZlU2Nyb2xsTGVmdCgpKSk7YnJlYWs7Y2FzZSJ2ZXJ0aWNhbCI6bi5wdXNoKHMuc2V0U2Nyb2xsVG9wKHQuZ2V0U2Nyb2xsVG9wKCkpKTticmVhaztkZWZhdWx0Om4ucHVzaCh2b2lkIDApfWVsc2Ugbi5wdXNoKHZvaWQgMCk7cmV0dXJuIG59fX0odGhpcykpLm9uKCJzY3JvbGxFbmQiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2lmKHQ9PT1lLm1hc3RlclNjcm9sbGVyKXJldHVybiBlLnVuYXNzaWduTWFzdGVyU2Nyb2xsZXIoKX19KHRoaXMpKX0sdC5wcm90b3R5cGUuYXNzaWduTWFzdGVyU2Nyb2xsZXI9ZnVuY3Rpb24odCl7dmFyIGUscixvLHM7Zm9yKHRoaXMudW5hc3NpZ25NYXN0ZXJTY3JvbGxlcigpLHRoaXMubWFzdGVyU2Nyb2xsZXI9dCxzPXRoaXMuc2Nyb2xsZXJzLGU9MCxyPXMubGVuZ3RoO2U8cjtlKyspbz1zW2VdLG8hPT10JiZvLmRpc2FibGVUb3VjaFNjcm9sbCgpfSx0LnByb3RvdHlwZS51bmFzc2lnbk1hc3RlclNjcm9sbGVyPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87aWYodGhpcy5tYXN0ZXJTY3JvbGxlcil7Zm9yKG89dGhpcy5zY3JvbGxlcnMsdD0wLGU9by5sZW5ndGg7dDxlO3QrKylyPW9bdF0sci5lbmFibGVUb3VjaFNjcm9sbCgpO3RoaXMubWFzdGVyU2Nyb2xsZXI9bnVsbH19LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoLGEsYyxwO2Zvcih0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87Zm9yKHI9dGhpcy5zY3JvbGxlcnMsbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKWM9clt0XSxvLnB1c2goYy5nZXRTY3JvbGxiYXJXaWR0aHMoKSk7cmV0dXJuIG99LmNhbGwodGhpcyksbD11PWg9bj0wLHI9MCxzPXQubGVuZ3RoO3I8cztyKyspcD10W3JdLGw9TWF0aC5tYXgobCxwLmxlZnQpLHU9TWF0aC5tYXgodSxwLnJpZ2h0KSxoPU1hdGgubWF4KGgscC50b3ApLG49TWF0aC5tYXgobixwLmJvdHRvbSk7Zm9yKGE9dGhpcy5zY3JvbGxlcnMsZT1vPTAsaT1hLmxlbmd0aDtvPGk7ZT0rK28pYz1hW2VdLHA9dFtlXSxjLmNhbnZhcy5zZXRHdXR0ZXJzKCJob3Jpem9udGFsIj09PXRoaXMuYXhpcz97bGVmdDpsLXAubGVmdCxyaWdodDp1LXAucmlnaHR9Ont0b3A6aC1wLnRvcCxib3R0b206bi1wLmJvdHRvbX0pfSx0fSgpLFY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsZSl7dGhpcy5pc1RvdWNoPWUsdGhpcy5zY3JvbGxlcj10LHRoaXMuc3ByaXRlcz1bXSx0aGlzLmlzVG91Y2gmJih0aGlzLmlzRm9yY2VkUmVsYXRpdmU9ITApLHQub24odGhpcy5pc1RvdWNoPyJzY3JvbGxFbmQiOiJzY3JvbGwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmhhbmRsZVNjcm9sbCgpfX0odGhpcykpfXJldHVybiBlLnByb3RvdHlwZS5zY3JvbGxlcj1udWxsLGUucHJvdG90eXBlLnNjcm9sbGJhcldpZHRocz1udWxsLGUucHJvdG90eXBlLnNwcml0ZXM9bnVsbCxlLnByb3RvdHlwZS52aWV3cG9ydFJlY3Q9bnVsbCxlLnByb3RvdHlwZS5jb250ZW50T2Zmc2V0PW51bGwsZS5wcm90b3R5cGUuaXNIRm9sbG93aW5nPSEwLGUucHJvdG90eXBlLmlzVkZvbGxvd2luZz0hMSxlLnByb3RvdHlwZS5jb250YWluT25OYXR1cmFsTGVmdD0hMSxlLnByb3RvdHlwZS5jb250YWluT25OYXR1cmFsUmlnaHQ9ITEsZS5wcm90b3R5cGUubWluVHJhdmVsPTAsZS5wcm90b3R5cGUuaXNUb3VjaD0hMSxlLnByb3RvdHlwZS5pc0ZvcmNlZFJlbGF0aXZlPSExLGUucHJvdG90eXBlLnNldFNwcml0ZXM9ZnVuY3Rpb24oZSl7dmFyIHIsbyxzO2lmKHRoaXMuY2xlYXJTcHJpdGVzKCksZSBpbnN0YW5jZW9mIHQpcmV0dXJuIHRoaXMuc3ByaXRlcz1mdW5jdGlvbigpe3ZhciByLG8saTtmb3IoaT1bXSxyPTAsbz1lLmxlbmd0aDtyPG87cisrKXM9ZVtyXSxpLnB1c2gobmV3IFAodChzKSx0aGlzKSk7cmV0dXJuIGl9LmNhbGwodGhpcyk7Zm9yKHI9MCxvPWUubGVuZ3RoO3I8bztyKyspcz1lW3JdLHMuZm9sbG93ZXI9dGhpcztyZXR1cm4gdGhpcy5zcHJpdGVzPWV9LGUucHJvdG90eXBlLmNsZWFyU3ByaXRlcz1mdW5jdGlvbigpe3ZhciB0LGUscixvO2ZvcihyPXRoaXMuc3ByaXRlcyx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKW89clt0XSxvLmNsZWFyKCk7cmV0dXJuIHRoaXMuc3ByaXRlcz1bXX0sZS5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXBkYXRlVmlld3BvcnQoKSx0aGlzLnVwZGF0ZVBvc2l0aW9ucygpfSxlLnByb3RvdHlwZS5jYWNoZURpbWVuc2lvbnM9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbztmb3IodGhpcy51cGRhdGVWaWV3cG9ydCgpLHRoaXMuc2Nyb2xsYmFyV2lkdGhzPXRoaXMuc2Nyb2xsZXIuZ2V0U2Nyb2xsYmFyV2lkdGhzKCksdGhpcy5jb250ZW50T2Zmc2V0PXRoaXMuc2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpLHI9dGhpcy5zcHJpdGVzLHQ9MCxlPXIubGVuZ3RoO3Q8ZTt0Kyspbz1yW3RdLG8uY2FjaGVEaW1lbnNpb25zKCl9LGUucHJvdG90eXBlLnVwZGF0ZVZpZXdwb3J0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyO3JldHVybiBlPXRoaXMuc2Nyb2xsZXIsdD1lLmdldFNjcm9sbEZyb21MZWZ0KCkscj1lLmdldFNjcm9sbFRvcCgpLHRoaXMudmlld3BvcnRSZWN0PXtsZWZ0OnQscmlnaHQ6dCtlLmdldENsaWVudFdpZHRoKCksdG9wOnIsYm90dG9tOnIrZS5nZXRDbGllbnRIZWlnaHQoKX19LGUucHJvdG90eXBlLmZvcmNlUmVsYXRpdmU9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2lmKCF0aGlzLmlzRm9yY2VkUmVsYXRpdmUpe2Zvcih0aGlzLmlzRm9yY2VkUmVsYXRpdmU9ITAscj10aGlzLnNwcml0ZXMsbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzLmRvQWJzb2x1dGU/by5wdXNoKHMuYXNzaWduUG9zaXRpb24oKSk6by5wdXNoKHZvaWQgMCk7cmV0dXJuIG99fSxlLnByb3RvdHlwZS5jbGVhckZvcmNlPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztpZih0aGlzLmlzRm9yY2VkUmVsYXRpdmUmJiF0aGlzLmlzVG91Y2gpe2Zvcih0aGlzLmlzRm9yY2VkUmVsYXRpdmU9ITEscj10aGlzLnNwcml0ZXMsbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxvLnB1c2gocy5hc3NpZ25Qb3NpdGlvbigpKTtyZXR1cm4gb319LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhY2hlRGltZW5zaW9ucygpLHRoaXMudXBkYXRlUG9zaXRpb25zKCl9LGUucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9ucz1mdW5jdGlvbigpe3ZhciB0LGUscixvO2ZvcihyPXRoaXMuc3ByaXRlcyx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKW89clt0XSxvLnVwZGF0ZVBvc2l0aW9uKCl9LGUucHJvdG90eXBlLmdldENvbnRlbnRSZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBodCh0LHRoaXMuY29udGVudE9mZnNldCl9LGUucHJvdG90eXBlLmdldEJvdW5kaW5nUmVjdD1mdW5jdGlvbih0KXtyZXR1cm4gYXQodCx0aGlzLmNvbnRlbnRPZmZzZXQpfSxlfSgpLFA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5lbD10LHRoaXMuZm9sbG93ZXI9bnVsbCE9ZT9lOm51bGwsdGhpcy5pc0Jsb2NrPSJibG9jayI9PT10aGlzLmVsLmNzcygiZGlzcGxheSIpLHRoaXMuZWwuY3NzKCJwb3NpdGlvbiIsInJlbGF0aXZlIil9cmV0dXJuIHQucHJvdG90eXBlLmZvbGxvd2VyPW51bGwsdC5wcm90b3R5cGUuZWw9bnVsbCx0LnByb3RvdHlwZS5hYnNvbHV0ZUVsPW51bGwsdC5wcm90b3R5cGUubmF0dXJhbFJlY3Q9bnVsbCx0LnByb3RvdHlwZS5wYXJlbnRSZWN0PW51bGwsdC5wcm90b3R5cGUuY29udGFpbmVyUmVjdD1udWxsLHQucHJvdG90eXBlLmlzRW5hYmxlZD0hMCx0LnByb3RvdHlwZS5pc0hGb2xsb3dpbmc9ITEsdC5wcm90b3R5cGUuaXNWRm9sbG93aW5nPSExLHQucHJvdG90eXBlLmRvQWJzb2x1dGU9ITEsdC5wcm90b3R5cGUuaXNBYnNvbHV0ZT0hMSx0LnByb3RvdHlwZS5pc0NlbnRlcmVkPSExLHQucHJvdG90eXBlLnJlY3Q9bnVsbCx0LnByb3RvdHlwZS5pc0Jsb2NrPSExLHQucHJvdG90eXBlLm5hdHVyYWxXaWR0aD1udWxsLHQucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZClyZXR1cm4gdGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5yZXNldFBvc2l0aW9uKCksdGhpcy51bmFic29sdXRpemUoKX0sdC5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFbmFibGVkKXJldHVybiB0aGlzLmlzRW5hYmxlZD0hMCx0aGlzLmFzc2lnblBvc2l0aW9uKCl9LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZSgpLHRoaXMuZm9sbG93ZXI9bnVsbCx0aGlzLmFic29sdXRlRWw9bnVsbH0sdC5wcm90b3R5cGUuY2FjaGVEaW1lbnNpb25zPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scyxpLG4sbDtyZXR1cm4gbz0hMSxzPSExLHI9ITEsdGhpcy5uYXR1cmFsV2lkdGg9dGhpcy5lbC53aWR0aCgpLHRoaXMucmVzZXRQb3NpdGlvbigpLGU9dGhpcy5mb2xsb3dlcixuPXRoaXMubmF0dXJhbFJlY3Q9ZS5nZXRCb3VuZGluZ1JlY3QodGhpcy5lbCksbD10aGlzLmVsLnBhcmVudCgpLHRoaXMucGFyZW50UmVjdD1lLmdldEJvdW5kaW5nUmVjdChsKSx0PXRoaXMuY29udGFpbmVyUmVjdD1idChlLmdldENvbnRlbnRSZWN0KGwpLG4pLGk9ZS5taW5UcmF2ZWwsZS5jb250YWluT25OYXR1cmFsTGVmdCYmKHQubGVmdD1uLmxlZnQpLGUuY29udGFpbk9uTmF0dXJhbFJpZ2h0JiYodC5yaWdodD1uLnJpZ2h0KSxlLmlzSEZvbGxvd2luZyYmZHQodCktZHQobik+PWkmJihyPSJjZW50ZXIiPT09dGhpcy5lbC5jc3MoInRleHQtYWxpZ24iKSxvPSEwKSxlLmlzVkZvbGxvd2luZyYmcHQodCktcHQobik+PWkmJihzPSEwKSx0aGlzLmlzSEZvbGxvd2luZz1vLHRoaXMuaXNWRm9sbG93aW5nPXMsdGhpcy5pc0NlbnRlcmVkPXJ9LHQucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZVBvc2l0aW9uKCksdGhpcy5hc3NpZ25Qb3NpdGlvbigpfSx0LnByb3RvdHlwZS5yZXNldFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWwuY3NzKHt0b3A6IiIsbGVmdDoiIn0pfSx0LnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzLGksbixsO3JldHVybiBuPXRoaXMuZm9sbG93ZXIudmlld3BvcnRSZWN0LHI9dGhpcy5wYXJlbnRSZWN0LHQ9dGhpcy5jb250YWluZXJSZWN0LGw9d3QobixyKSxvPW51bGwsZT0hMSxsJiYobz1ldCh0aGlzLm5hdHVyYWxSZWN0KSxpPXd0KG8sciksKHRoaXMuaXNDZW50ZXJlZCYmIXp0KG4scil8fGkmJiF6dChuLGkpKSYmKGU9ITAsdGhpcy5pc0hGb2xsb3dpbmcmJih0aGlzLmlzQ2VudGVyZWQ/KHM9ZHQobyksby5sZWZ0PShsLmxlZnQrbC5yaWdodCkvMi1zLzIsby5yaWdodD1vLmxlZnQrcyk6Z3QobyxuKXx8KGU9ITEpLGd0KG8sdCkmJihlPSExKSksdGhpcy5pc1ZGb2xsb3dpbmcmJihBdChvLG4pfHwoZT0hMSksQXQobyx0KSYmKGU9ITEpKSx6dChuLG8pfHwoZT0hMSkpKSx0aGlzLnJlY3Q9byx0aGlzLmRvQWJzb2x1dGU9ZX0sdC5wcm90b3R5cGUuYXNzaWduUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgdCxlO2lmKHRoaXMuaXNFbmFibGVkKXJldHVybiB0aGlzLnJlY3Q/dGhpcy5kb0Fic29sdXRlJiYhdGhpcy5mb2xsb3dlci5pc0ZvcmNlZFJlbGF0aXZlPyh0aGlzLmFic29sdXRpemUoKSx0aGlzLmFic29sdXRlRWwuY3NzKHt0b3A6dGhpcy5yZWN0LnRvcC10aGlzLmZvbGxvd2VyLnZpZXdwb3J0UmVjdC50b3ArdGhpcy5mb2xsb3dlci5zY3JvbGxiYXJXaWR0aHMudG9wLGxlZnQ6dGhpcy5yZWN0LmxlZnQtdGhpcy5mb2xsb3dlci52aWV3cG9ydFJlY3QubGVmdCt0aGlzLmZvbGxvd2VyLnNjcm9sbGJhcldpZHRocy5sZWZ0LHdpZHRoOnRoaXMuaXNCbG9jaz90aGlzLm5hdHVyYWxXaWR0aDoiIn0pKTooZT10aGlzLnJlY3QudG9wLXRoaXMubmF0dXJhbFJlY3QudG9wLHQ9dGhpcy5yZWN0LmxlZnQtdGhpcy5uYXR1cmFsUmVjdC5sZWZ0LHRoaXMudW5hYnNvbHV0aXplKCksdGhpcy5lbC50b2dnbGVDbGFzcygiZmMtZm9sbG93aW5nIixCb29sZWFuKGV8fHQpKS5jc3Moe3RvcDplLGxlZnQ6dH0pKTp0aGlzLnVuYWJzb2x1dGl6ZSgpfSx0LnByb3RvdHlwZS5hYnNvbHV0aXplPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNBYnNvbHV0ZSlyZXR1cm4gdGhpcy5hYnNvbHV0ZUVsfHwodGhpcy5hYnNvbHV0ZUVsPXRoaXMuYnVpbGRBYnNvbHV0ZUVsKCkpLHRoaXMuYWJzb2x1dGVFbC5hcHBlbmRUbyh0aGlzLmZvbGxvd2VyLnNjcm9sbGVyLmVsKSx0aGlzLmVsLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLHRoaXMuaXNBYnNvbHV0ZT0hMH0sdC5wcm90b3R5cGUudW5hYnNvbHV0aXplPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0Fic29sdXRlKXJldHVybiB0aGlzLmFic29sdXRlRWwuZGV0YWNoKCksdGhpcy5lbC5jc3MoInZpc2liaWxpdHkiLCIiKSx0aGlzLmlzQWJzb2x1dGU9ITF9LHQucHJvdG90eXBlLmJ1aWxkQWJzb2x1dGVFbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVsLmNsb25lKCkuYWRkQ2xhc3MoImZjLWZvbGxvd2luZyIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIiwiei1pbmRleCI6MWUzLCJmb250LXdlaWdodCI6dGhpcy5lbC5jc3MoImZvbnQtd2VpZ2h0IiksImZvbnQtc2l6ZSI6dGhpcy5lbC5jc3MoImZvbnQtc2l6ZSIpLCJmb250LWZhbWlseSI6dGhpcy5lbC5jc3MoImZvbnQtZmFtaWx5IiksY29sb3I6dGhpcy5lbC5jc3MoImNvbG9yIiksInBhZGRpbmctdG9wIjp0aGlzLmVsLmNzcygicGFkZGluZy10b3AiKSwicGFkZGluZy1ib3R0b20iOnRoaXMuZWwuY3NzKCJwYWRkaW5nLWJvdHRvbSIpLCJwYWRkaW5nLWxlZnQiOnRoaXMuZWwuY3NzKCJwYWRkaW5nLWxlZnQiKSwicGFkZGluZy1yaWdodCI6dGhpcy5lbC5jc3MoInBhZGRpbmctcmlnaHQiKSwicG9pbnRlci1ldmVudHMiOiJub25lIn0pfSx0fSgpLGV0PWZ1bmN0aW9uKHQpe3JldHVybntsZWZ0OnQubGVmdCxyaWdodDp0LnJpZ2h0LHRvcDp0LnRvcCxib3R0b206dC5ib3R0b219fSxkdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodC10LmxlZnR9LHB0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmJvdHRvbS10LnRvcH0senQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4ga3QodCxlKSYmVnQodCxlKX0sa3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5sZWZ0Pj10LmxlZnQmJmUucmlnaHQ8PXQucmlnaHR9LFZ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudG9wPj10LnRvcCYmZS5ib3R0b208PXQuYm90dG9tfSxndD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmxlZnQ8ZS5sZWZ0Pyh0LnJpZ2h0PWUubGVmdCtkdCh0KSx0LmxlZnQ9ZS5sZWZ0LCEwKTp0LnJpZ2h0PmUucmlnaHQmJih0LmxlZnQ9ZS5yaWdodC1kdCh0KSx0LnJpZ2h0PWUucmlnaHQsITApfSxBdD1mdW5jdGlvbih0LGUpe3JldHVybiB0LnRvcDxlLnRvcD8odC5ib3R0b209ZS50b3ArcHQodCksdC50b3A9ZS50b3AsITApOnQuYm90dG9tPmUuYm90dG9tJiYodC50b3A9ZS5ib3R0b20tcHQodCksdC5ib3R0b209ZS5ib3R0b20sITApfSxidD1mdW5jdGlvbih0LGUpe3JldHVybntsZWZ0Ok1hdGgubWluKHQubGVmdCxlLmxlZnQpLHJpZ2h0Ok1hdGgubWF4KHQucmlnaHQsZS5yaWdodCksdG9wOk1hdGgubWluKHQudG9wLGUudG9wKSxib3R0b206TWF0aC5tYXgodC5ib3R0b20sZS5ib3R0b20pfX0scz1mdW5jdGlvbihlKXtmdW5jdGlvbiByKCl7cmV0dXJuIHIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QocixlKSxyLnByb3RvdHlwZS5yZXNvdXJjZU1hbmFnZXI9bnVsbCxyLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzb3VyY2VNYW5hZ2VyPW5ldyBEKHRoaXMpfSxyLnByb3RvdHlwZS5pbnN0YW50aWF0ZVZpZXc9ZnVuY3Rpb24odCl7dmFyIGUscjtyZXR1cm4gZT10aGlzLmdldFZpZXdTcGVjKHQpLHI9ZVsiY2xhc3MiXSx0aGlzLm9wdGlvbnMucmVzb3VyY2VzJiZlLm9wdGlvbnMucmVzb3VyY2VzIT09ITEmJihlLnF1ZXJ5UmVzb3VyY2VDbGFzcz9yPWUucXVlcnlSZXNvdXJjZUNsYXNzKGUpfHxyOmUucmVzb3VyY2VDbGFzcyYmKHI9ZS5yZXNvdXJjZUNsYXNzKSksbmV3IHIodGhpcyx0LGUub3B0aW9ucyxlLmR1cmF0aW9uKX0sci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKX0sci5wcm90b3R5cGUuYWRkUmVzb3VyY2U9ZnVuY3Rpb24odCxlKXt2YXIgcjtudWxsPT1lJiYoZT0hMSkscj10aGlzLnJlc291cmNlTWFuYWdlci5hZGRSZXNvdXJjZSh0KSxlJiZ0aGlzLnZpZXcuc2Nyb2xsVG9SZXNvdXJjZSYmci5kb25lKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC52aWV3LnNjcm9sbFRvUmVzb3VyY2UoZSl9fSh0aGlzKSl9LHIucHJvdG90eXBlLnJlbW92ZVJlc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc291cmNlTWFuYWdlci5yZW1vdmVSZXNvdXJjZSh0KX0sci5wcm90b3R5cGUucmVmZXRjaFJlc291cmNlcz1mdW5jdGlvbigpe3RoaXMucmVzb3VyY2VNYW5hZ2VyLmZldGNoUmVzb3VyY2VzKCl9LHIucHJvdG90eXBlLnJlcmVuZGVyUmVzb3VyY2VzPWZ1bmN0aW9uKCl7dGhpcy5yZXNvdXJjZU1hbmFnZXIucmVzZXRSZXNvdXJjZXMoKX0sci5wcm90b3R5cGUuaXNTcGFuQWxsb3dlZD1mdW5jdGlvbih0LGUpe3ZhciBvLHM7cmV0dXJuISgib2JqZWN0Ij09dHlwZW9mIGUmJihvPXRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhlKSxvLmxlbmd0aCYmISh0LnJlc291cmNlSWQmJihzPXQucmVzb3VyY2VJZCxOdC5jYWxsKG8scyk+PTApKSkpJiZyLl9fc3VwZXJfXy5pc1NwYW5BbGxvd2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sci5wcm90b3R5cGUuZ2V0UGVlckV2ZW50cz1mdW5jdGlvbih0LGUpe3ZhciBvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHk7Zm9yKGY9ci5fX3N1cGVyX18uZ2V0UGVlckV2ZW50cy5hcHBseSh0aGlzLGFyZ3VtZW50cykscD10LnJlc291cmNlSWQ/W3QucmVzb3VyY2VJZF06ZT90aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZSk6W10sbz1bXSxpPTAsdT1mLmxlbmd0aDtpPHU7aSsrKXtpZihkPWZbaV0scz0hMSx5PXRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhkKSx5Lmxlbmd0aCYmcC5sZW5ndGgpe2ZvcihuPTAsaD15Lmxlbmd0aDtuPGg7bisrKWZvcihnPXlbbl0sbD0wLGE9cC5sZW5ndGg7bDxhO2wrKylpZihjPXBbbF0sYz09PWcpe3M9ITA7YnJlYWt9fWVsc2Ugcz0hMDtzJiZvLnB1c2goZCl9cmV0dXJuIG99LHIucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW49ZnVuY3Rpb24odCxlKXtyZXR1cm4oIXQucmVzb3VyY2VJZHx8dC5yZXNvdXJjZUlkPT09ZS5yZXNvdXJjZUlkKSYmci5fX3N1cGVyX18uc3BhbkNvbnRhaW5zU3Bhbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLmdldEN1cnJlbnRCdXNpbmVzc0hvdXJFdmVudHM9ZnVuY3Rpb24odCl7dmFyIGUsbyxzLGksbixsLHUsaCxhLGMscCxkO2ZvcihuPXRoaXMucmVzb3VyY2VNYW5hZ2VyLmdldEZsYXRSZXNvdXJjZXMoKSxvPSExLGw9MCxhPW4ubGVuZ3RoO2w8YTtsKyspZD1uW2xdLGQuYnVzaW5lc3NIb3VycyYmKG89ITApO2lmKG8pe2ZvcihlPVtdLHU9MCxjPW4ubGVuZ3RoO3U8Yzt1KyspZm9yKGQ9blt1XSxpPXRoaXMuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyh0LGQuYnVzaW5lc3NIb3Vyc3x8dGhpcy5vcHRpb25zLmJ1c2luZXNzSG91cnMpLGg9MCxwPWkubGVuZ3RoO2g8cDtoKyspcz1pW2hdLHMucmVzb3VyY2VJZD1kLmlkLGUucHVzaChzKTtyZXR1cm4gZX1yZXR1cm4gci5fX3N1cGVyX18uZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLmJ1aWxkU2VsZWN0U3Bhbj1mdW5jdGlvbih0LGUsbyl7dmFyIHM7cmV0dXJuIHM9ci5fX3N1cGVyX18uYnVpbGRTZWxlY3RTcGFuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvJiYocy5yZXNvdXJjZUlkPW8pLHN9LHIucHJvdG90eXBlLmdldFJlc291cmNlQnlJZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VCeUlkKHQpfSxyLnByb3RvdHlwZS5ub3JtYWxpemVFdmVudD1mdW5jdGlvbih0KXtyZXR1cm4gci5fX3N1cGVyX18ubm9ybWFsaXplRXZlbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLG51bGw9PXQucmVzb3VyY2VJZCYmKHQucmVzb3VyY2VJZD1udWxsKSxudWxsIT10LnJlc291cmNlSWRzP3QucmVzb3VyY2VJZHM6dC5yZXNvdXJjZUlkcz1udWxsfSxyLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlSWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyh0KVswXX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZUlkcz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbCx1O2lmKHU9U3RyaW5nKG51bGwhPShpPW51bGwhPShuPXRbdGhpcy5nZXRFdmVudFJlc291cmNlRmllbGQoKV0pP246dC5yZXNvdXJjZUlkKT9pOiIiKSlyZXR1cm5bdV07aWYodC5yZXNvdXJjZUlkcyl7Zm9yKHM9W10sbD10LnJlc291cmNlSWRzLGU9MCxyPWwubGVuZ3RoO2U8cjtlKyspdT1sW2VdLG89U3RyaW5nKG51bGwhPXU/dToiIiksbyYmcy5wdXNoKG8pO3JldHVybiBzfXJldHVybltdfSxyLnByb3RvdHlwZS5zZXRFdmVudFJlc291cmNlSWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFt0aGlzLmdldEV2ZW50UmVzb3VyY2VGaWVsZCgpXT1TdHJpbmcobnVsbCE9ZT9lOiIiKX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZUZpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5ldmVudFJlc291cmNlRmllbGR8fCJyZXNvdXJjZUlkIn0sci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VFdmVudHM9ZnVuY3Rpb24oZSl7dmFyIHI7cmV0dXJuIHI9Im9iamVjdCI9PXR5cGVvZiBlP2U6dGhpcy5nZXRSZXNvdXJjZUJ5SWQoZSkscj90aGlzLmNsaWVudEV2ZW50cyhmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obyl7cmV0dXJuIHQuaW5BcnJheShyLmlkLGUuZ2V0RXZlbnRSZXNvdXJjZUlkcyhvKSkhPT0tMX19KHRoaXMpKTpbXX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRFdmVudFJlc291cmNlcyh0KVswXX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaSxuLGw7aWYoZT0ib2JqZWN0Ij09dHlwZW9mIHQ/dDp0aGlzLmNsaWVudEV2ZW50cyh0KVswXSxsPVtdLGUpZm9yKHM9dGhpcy5nZXRFdmVudFJlc291cmNlSWRzKGUpLHI9MCxvPXMubGVuZ3RoO3I8bztyKyspbj1zW3JdLGk9dGhpcy5nZXRSZXNvdXJjZUJ5SWQobiksaSYmbC5wdXNoKGkpO3JldHVybiBsfSxyfShvKSxvLnByb3RvdHlwZT1zLnByb3RvdHlwZSxIdD1YLnByb3RvdHlwZS5kaXNwbGF5Vmlldyx4dD1YLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbixCdD1YLnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uLEV0PVgucHJvdG90eXBlLmRpc3BsYXlFdmVudHMsWC5wcm90b3R5cGUuaXNSZXNvdXJjZXNCb3VuZD0hMSxYLnByb3RvdHlwZS5zZXR0aW5nUmVzb3VyY2VzPW51bGwsWC5wcm90b3R5cGUuZGlzcGxheVZpZXc9ZnVuY3Rpb24oKXtyZXR1cm4gSHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLEd0KHRoaXMuY2FsZW5kYXIub3B0aW9ucy5zY2hlZHVsZXJMaWNlbnNlS2V5LHRoaXMuZWwpLHRoaXMuYmluZFJlc291cmNlcygpLHRoaXMud2hlblJlc291cmNlcygpfSxYLnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uPWZ1bmN0aW9uKCl7cmV0dXJuIEJ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnVuYmluZFJlc291cmNlcyghMCl9LFgucHJvdG90eXBlLmRpc3BsYXlFdmVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud2hlblJlc291cmNlcyhmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRXQuY2FsbChlLHQpfX0odGhpcykpfSxYLnByb3RvdHlwZS5iaW5kUmVzb3VyY2VzPWZ1bmN0aW9uKCl7dmFyIGU7aWYoIXRoaXMuaXNSZXNvdXJjZXNCb3VuZClyZXR1cm4gdGhpcy5pc1Jlc291cmNlc0JvdW5kPSEwLHRoaXMuc2V0dGluZ1Jlc291cmNlcz10LkRlZmVycmVkKCksZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0UmVzb3VyY2VzKGUpLHQuc2V0dGluZ1Jlc291cmNlcy5yZXNvbHZlKCl9fSh0aGlzKSx0aGlzLmxpc3RlblRvKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLHtzZXQ6ZSx1bnNldDp0aGlzLnVuc2V0UmVzb3VyY2VzLHJlc2V0OnRoaXMucmVzZXRSZXNvdXJjZXMsYWRkOnRoaXMuYWRkUmVzb3VyY2UscmVtb3ZlOnRoaXMucmVtb3ZlUmVzb3VyY2V9KSx0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci5oYXNGZXRjaGVkKCk/ZSh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyk6dGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VzKCl9LFgucHJvdG90eXBlLnVuYmluZFJlc291cmNlcz1mdW5jdGlvbih0KXtpZih0aGlzLmlzUmVzb3VyY2VzQm91bmQpcmV0dXJuIHRoaXMuc3RvcExpc3RlbmluZ1RvKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyKSwicmVzb2x2ZWQiPT09dGhpcy5zZXR0aW5nUmVzb3VyY2VzLnN0YXRlKCkmJnRoaXMudW5zZXRSZXNvdXJjZXModCksdGhpcy5zZXR0aW5nUmVzb3VyY2VzPW51bGwsdGhpcy5pc1Jlc291cmNlc0JvdW5kPSExfSxYLnByb3RvdHlwZS53aGVuUmVzb3VyY2VzPWZ1bmN0aW9uKHQpe3JldHVybiBMdCh0aGlzLnNldHRpbmdSZXNvdXJjZXMsdCl9LFgucHJvdG90eXBlLnNldFJlc291cmNlcz1mdW5jdGlvbih0KXt9LFgucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzPWZ1bmN0aW9uKCl7fSxYLnByb3RvdHlwZS5yZXNldFJlc291cmNlcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jYWxlbmRhci5yZXJlbmRlckV2ZW50cygpfSxYLnByb3RvdHlwZS5hZGRSZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXNldFJlc291cmNlcyh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyl9LFgucHJvdG90eXBlLnJlbW92ZVJlc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc2V0UmVzb3VyY2VzKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKX0sVHQ9Zi5wcm90b3R5cGUuZ2V0U2VnQ3VzdG9tQ2xhc3NlcyxfdD1mLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yLEl0PWYucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvcixEdD1mLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0VGV4dENvbG9yLGYucHJvdG90eXBlLmdldFNlZ0N1c3RvbUNsYXNzZXM9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaTtmb3IoZT1UdC5hcHBseSh0aGlzLGFyZ3VtZW50cykscz10aGlzLmdldFNlZ1Jlc291cmNlcyh0KSxyPTAsbz1zLmxlbmd0aDtyPG87cisrKWk9c1tyXSxlPWUuY29uY2F0KGkuZXZlbnRDbGFzc05hbWV8fFtdKTtyZXR1cm4gZX0sZi5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdEJhY2tncm91bmRDb2xvcj1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpO2ZvcihzPXRoaXMuZ2V0U2VnUmVzb3VyY2VzKHQpLHI9MCxvPXMubGVuZ3RoO3I8bztyKyspZm9yKGU9c1tyXTtlOyl7aWYoaT1lLmV2ZW50QmFja2dyb3VuZENvbG9yfHxlLmV2ZW50Q29sb3IpcmV0dXJuIGk7ZT1lLl9wYXJlbnR9cmV0dXJuIF90LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZi5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGk7Zm9yKHM9dGhpcy5nZXRTZWdSZXNvdXJjZXModCkscj0wLG89cy5sZW5ndGg7cjxvO3IrKylmb3IoZT1zW3JdO2U7KXtpZihpPWUuZXZlbnRCb3JkZXJDb2xvcnx8ZS5ldmVudENvbG9yKXJldHVybiBpO2U9ZS5fcGFyZW50fXJldHVybiBJdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGYucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRUZXh0Q29sb3I9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaTtmb3Iocz10aGlzLmdldFNlZ1Jlc291cmNlcyh0KSxyPTAsbz1zLmxlbmd0aDtyPG87cisrKWZvcihlPXNbcl07ZTspe2lmKGk9ZS5ldmVudFRleHRDb2xvcilyZXR1cm4gaTtlPWUuX3BhcmVudH1yZXR1cm4gRHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxmLnByb3RvdHlwZS5nZXRTZWdSZXNvdXJjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzb3VyY2U/W3QucmVzb3VyY2VdOnRoaXMudmlldy5jYWxlbmRhci5nZXRFdmVudFJlc291cmNlcyh0LmV2ZW50KX0sRD1mdW5jdGlvbihlKXtmdW5jdGlvbiByKHQpe3RoaXMuY2FsZW5kYXI9dCx0aGlzLmluaXRpYWxpemVDYWNoZSgpfXJldHVybiBPdChyLGUpLHIubWl4aW4oYSksci5yZXNvdXJjZUd1aWQ9MSxyLmFqYXhEZWZhdWx0cz17ZGF0YVR5cGU6Impzb24iLGNhY2hlOiExfSxyLnByb3RvdHlwZS5jYWxlbmRhcj1udWxsLHIucHJvdG90eXBlLnRvcExldmVsUmVzb3VyY2VzPW51bGwsci5wcm90b3R5cGUucmVzb3VyY2VzQnlJZD1udWxsLHIucHJvdG90eXBlLmZldGNoaW5nPW51bGwsci5wcm90b3R5cGUuaGFzRmV0Y2hlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZldGNoaW5nJiYicmVzb2x2ZWQiPT09dGhpcy5mZXRjaGluZy5zdGF0ZSgpfSxyLnByb3RvdHlwZS5nZXRSZXNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy5mZXRjaGluZz90LkRlZmVycmVkKCkucmVzb2x2ZSh0aGlzLnRvcExldmVsUmVzb3VyY2VzKS5wcm9taXNlKCk6KGU9dC5EZWZlcnJlZCgpLEx0KHRoaXMuZmV0Y2hSZXNvdXJjZXMoKSxmdW5jdGlvbigpe3JldHVybiBlLnJlc29sdmUodGhpcy50b3BMZXZlbFJlc291cmNlcyl9LGZ1bmN0aW9uKCl7cmV0dXJuIGUucmVzb2x2ZShbXSl9KSxlLnByb21pc2UoKSl9LHIucHJvdG90eXBlLmZldGNoUmVzb3VyY2VzPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIGU9dGhpcy5mZXRjaGluZyxMdChlLGZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiByLmZldGNoaW5nPXQuRGVmZXJyZWQoKSxyLmZldGNoUmVzb3VyY2VJbnB1dHMoZnVuY3Rpb24odCl7cmV0dXJuIHIuc2V0UmVzb3VyY2VzKHQsQm9vbGVhbihlKSksci5mZXRjaGluZy5yZXNvbHZlKHIudG9wTGV2ZWxSZXNvdXJjZXMpfSksci5mZXRjaGluZy5wcm9taXNlKCl9fSh0aGlzKSl9LHIucHJvdG90eXBlLmZldGNoUmVzb3VyY2VJbnB1dHM9ZnVuY3Rpb24oZSl7dmFyIG87c3dpdGNoKG89dGhpcy5jYWxlbmRhci5vcHRpb25zLnJlc291cmNlcywic3RyaW5nIj09PXQudHlwZShvKSYmKG89e3VybDpvfSksdC50eXBlKG8pKXtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gdGhpcy5jYWxlbmRhci5wdXNoTG9hZGluZygpLG8oZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0LmNhbGVuZGFyLnBvcExvYWRpbmcoKSxlKHIpfX0odGhpcykpO2Nhc2Uib2JqZWN0IjpyZXR1cm4gdGhpcy5jYWxlbmRhci5wdXNoTG9hZGluZygpLHQuYWpheCh0LmV4dGVuZCh7fSxyLmFqYXhEZWZhdWx0cyxvKSkuZG9uZShmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQuY2FsZW5kYXIucG9wTG9hZGluZygpLGUocil9fSh0aGlzKSk7Y2FzZSJhcnJheSI6cmV0dXJuIGUobyk7ZGVmYXVsdDpyZXR1cm4gZShbXSl9fSxyLnByb3RvdHlwZS5yZXNldFJlc291cmNlcz1mdW5jdGlvbigpe3JldHVybiBMdCh0aGlzLmdldFJlc291cmNlcygpLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LnRyaWdnZXIoInJlc2V0Iix0LnRvcExldmVsUmVzb3VyY2VzKX19KHRoaXMpKX0sci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VCeUlkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc291cmNlc0J5SWRbdF19LHIucHJvdG90eXBlLmdldEZsYXRSZXNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgdCxlO2U9W107Zm9yKHQgaW4gdGhpcy5yZXNvdXJjZXNCeUlkKWUucHVzaCh0aGlzLnJlc291cmNlc0J5SWRbdF0pO3JldHVybiBlfSxyLnByb3RvdHlwZS5pbml0aWFsaXplQ2FjaGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b3BMZXZlbFJlc291cmNlcz1bXSx0aGlzLnJlc291cmNlc0J5SWQ9e319LHIucHJvdG90eXBlLnNldFJlc291cmNlcz1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpLG4sbDtmb3IodGhpcy5pbml0aWFsaXplQ2FjaGUoKSxuPWZ1bmN0aW9uKCl7dmFyIGUscixvO2ZvcihvPVtdLGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspaT10W2VdLG8ucHVzaCh0aGlzLmJ1aWxkUmVzb3VyY2UoaSkpO3JldHVybiBvfS5jYWxsKHRoaXMpLGw9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7Zm9yKHI9W10sdD0wLGU9bi5sZW5ndGg7dDxlO3QrKylzPW5bdF0sdGhpcy5hZGRSZXNvdXJjZVRvSW5kZXgocykmJnIucHVzaChzKTtyZXR1cm4gcn0uY2FsbCh0aGlzKSxyPTAsbz1sLmxlbmd0aDtyPG87cisrKXM9bFtyXSx0aGlzLmFkZFJlc291cmNlVG9UcmVlKHMpO3JldHVybiBlP3RoaXMudHJpZ2dlcigicmVzZXQiLHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOnRoaXMudHJpZ2dlcigic2V0Iix0aGlzLnRvcExldmVsUmVzb3VyY2VzKSx0aGlzLmNhbGVuZGFyLnRyaWdnZXIoInJlc291cmNlc1NldCIsbnVsbCx0aGlzLnRvcExldmVsUmVzb3VyY2VzKX0sci5wcm90b3R5cGUuYWRkUmVzb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEx0KHRoaXMuZmV0Y2hpbmcsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI7cmV0dXJuIHI9ZS5idWlsZFJlc291cmNlKHQpLCEhZS5hZGRSZXNvdXJjZVRvSW5kZXgocikmJihlLmFkZFJlc291cmNlVG9UcmVlKHIpLGUudHJpZ2dlcigiYWRkIixyKSxyKX19KHRoaXMpKX0sci5wcm90b3R5cGUuYWRkUmVzb3VyY2VUb0luZGV4PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO2lmKHRoaXMucmVzb3VyY2VzQnlJZFt0LmlkXSlyZXR1cm4hMTtmb3IodGhpcy5yZXNvdXJjZXNCeUlkW3QuaWRdPXQscz10LmNoaWxkcmVuLHI9MCxvPXMubGVuZ3RoO3I8bztyKyspZT1zW3JdLHRoaXMuYWRkUmVzb3VyY2VUb0luZGV4KGUpO3JldHVybiEwfSxyLnByb3RvdHlwZS5hZGRSZXNvdXJjZVRvVHJlZT1mdW5jdGlvbih0KXt2YXIgZSxyLG8scztpZighdC5wYXJlbnQpe2lmKHI9U3RyaW5nKG51bGwhPShvPXQucGFyZW50SWQpP286IiIpKXtpZihlPXRoaXMucmVzb3VyY2VzQnlJZFtyXSwhZSlyZXR1cm4hMTt0LnBhcmVudD1lLHM9ZS5jaGlsZHJlbn1lbHNlIHM9dGhpcy50b3BMZXZlbFJlc291cmNlcztzLnB1c2godCl9cmV0dXJuITB9LHIucHJvdG90eXBlLnJlbW92ZVJlc291cmNlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPSJvYmplY3QiPT10eXBlb2YgdD90LmlkOnQsTHQodGhpcy5mZXRjaGluZyxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcjtyZXR1cm4gcj10LnJlbW92ZVJlc291cmNlRnJvbUluZGV4KGUpLHImJih0LnJlbW92ZVJlc291cmNlRnJvbVRyZWUociksdC50cmlnZ2VyKCJyZW1vdmUiLHIpKSxyfX0odGhpcykpfSxyLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZUZyb21JbmRleD1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpO2lmKGk9dGhpcy5yZXNvdXJjZXNCeUlkW3RdKXtmb3IoZGVsZXRlIHRoaXMucmVzb3VyY2VzQnlJZFt0XSxzPWkuY2hpbGRyZW4scj0wLG89cy5sZW5ndGg7cjxvO3IrKyllPXNbcl0sdGhpcy5yZW1vdmVSZXNvdXJjZUZyb21JbmRleChlLmlkKTtyZXR1cm4gaX1yZXR1cm4hMX0sci5wcm90b3R5cGUucmVtb3ZlUmVzb3VyY2VGcm9tVHJlZT1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpO2ZvcihudWxsPT1lJiYoZT10aGlzLnRvcExldmVsUmVzb3VyY2VzKSxyPW89MCxzPWUubGVuZ3RoO288cztyPSsrbyl7aWYoaT1lW3JdLGk9PT10KXJldHVybiB0LnBhcmVudD1udWxsLGUuc3BsaWNlKHIsMSksITA7aWYodGhpcy5yZW1vdmVSZXNvdXJjZUZyb21UcmVlKHQsaS5jaGlsZHJlbikpcmV0dXJuITB9cmV0dXJuITF9LHIucHJvdG90eXBlLmJ1aWxkUmVzb3VyY2U9ZnVuY3Rpb24oZSl7dmFyIG8scyxpLG4sbDtyZXR1cm4gbD10LmV4dGVuZCh7fSxlKSxsLmlkPVN0cmluZyhudWxsIT0obj1lLmlkKT9uOiJfZmMiK3IucmVzb3VyY2VHdWlkKyspLGk9ZS5ldmVudENsYXNzTmFtZSxsLmV2ZW50Q2xhc3NOYW1lPWZ1bmN0aW9uKCl7c3dpdGNoKHQudHlwZShpKSl7Y2FzZSJzdHJpbmciOnJldHVybiBpLnNwbGl0KC9ccysvKTtjYXNlImFycmF5IjpyZXR1cm4gaTtkZWZhdWx0OnJldHVybltdfX0oKSxsLmNoaWxkcmVuPWZ1bmN0aW9uKCl7dmFyIHQscixpLG4sdTtmb3Iobj1udWxsIT0oaT1lLmNoaWxkcmVuKT9pOltdLHU9W10sdD0wLHI9bi5sZW5ndGg7dDxyO3QrKylzPW5bdF0sbz10aGlzLmJ1aWxkUmVzb3VyY2Uocyksby5wYXJlbnQ9bCx1LnB1c2gobyk7cmV0dXJuIHV9LmNhbGwodGhpcyksbH0scn0oaSksVz17cmVzb3VyY2VUZXh0RnVuYzpudWxsLHVuc2V0UmVzb3VyY2VzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xlYXJFdmVudHMoKX0scmVzZXRSZXNvdXJjZXM6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGU9dGhpcy5xdWVyeVNjcm9sbCgpLHRoaXMudW5zZXRSZXNvdXJjZXMoKSx0aGlzLnNldFJlc291cmNlcyh0KSx0aGlzLnNldFNjcm9sbChlKSx0aGlzLmNhbGVuZGFyLnJlcmVuZGVyRXZlbnRzKCl9LGlzRXZlbnREcmFnZ2FibGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNFdmVudFJlc291cmNlRWRpdGFibGUodCl8fFgucHJvdG90eXBlLmlzRXZlbnREcmFnZ2FibGUuY2FsbCh0aGlzLHQpfSxpc0V2ZW50UmVzb3VyY2VFZGl0YWJsZTpmdW5jdGlvbih0KXt2YXIgZSxyLG87cmV0dXJuIG51bGwhPShlPW51bGwhPShyPW51bGwhPShvPXQucmVzb3VyY2VFZGl0YWJsZSk/bzoodC5zb3VyY2V8fHt9KS5yZXNvdXJjZUVkaXRhYmxlKT9yOnRoaXMub3B0KCJldmVudFJlc291cmNlRWRpdGFibGUiKSk/ZTp0aGlzLmlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZSh0KX0sZ2V0UmVzb3VyY2VUZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldFJlc291cmNlVGV4dEZ1bmMoKSh0KX0sZ2V0UmVzb3VyY2VUZXh0RnVuYzpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnJlc291cmNlVGV4dEZ1bmM/dGhpcy5yZXNvdXJjZVRleHRGdW5jOih0PXRoaXMub3B0KCJyZXNvdXJjZVRleHQiKSwiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudGl0bGV8fHQuaWR9KSx0aGlzLnJlc291cmNlVGV4dEZ1bmM9dCl9LHRyaWdnZXJEYXlDbGljazpmdW5jdGlvbih0LGUscil7dmFyIG87cmV0dXJuIG89dGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIsdGhpcy50cmlnZ2VyKCJkYXlDbGljayIsZSx0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUodC5zdGFydCkscix0aGlzLG8uZ2V0UmVzb3VyY2VCeUlkKHQucmVzb3VyY2VJZCkpfSx0cmlnZ2VyU2VsZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIsdGhpcy50cmlnZ2VyKCJzZWxlY3QiLG51bGwsdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHQuc3RhcnQpLHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0LmVuZCksZSx0aGlzLHIuZ2V0UmVzb3VyY2VCeUlkKHQucmVzb3VyY2VJZCkpfSx0cmlnZ2VyRXh0ZXJuYWxEcm9wOmZ1bmN0aW9uKHQsZSxyLG8scyl7aWYodGhpcy50cmlnZ2VyKCJkcm9wIixyWzBdLGUuc3RhcnQsbyxzLGUucmVzb3VyY2VJZCksdClyZXR1cm4gdGhpcy50cmlnZ2VyKCJldmVudFJlY2VpdmUiLG51bGwsdCl9LHJlcG9ydEV2ZW50RHJvcDpmdW5jdGlvbigpe3ZhciB0LGUscixvO3JldHVybiBlPWFyZ3VtZW50c1swXSx0PWFyZ3VtZW50c1sxXSxyPTM8PWFyZ3VtZW50cy5sZW5ndGg/anQuY2FsbChhcmd1bWVudHMsMik6W10sdD10aGlzLm5vcm1hbGl6ZURyb3BMb2NhdGlvbih0KSx0LnJlc291cmNlSWQmJmUucmVzb3VyY2VJZHMmJih0LnJlc291cmNlSWRzPW51bGwpLChvPVgucHJvdG90eXBlLnJlcG9ydEV2ZW50RHJvcCkuY2FsbC5hcHBseShvLFt0aGlzLGUsdF0uY29uY2F0KGp0LmNhbGwocikpKX0scmVwb3J0RXh0ZXJuYWxEcm9wOmZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87cmV0dXJuIGU9YXJndW1lbnRzWzBdLHQ9YXJndW1lbnRzWzFdLHI9Mzw9YXJndW1lbnRzLmxlbmd0aD9qdC5jYWxsKGFyZ3VtZW50cywyKTpbXSx0PXRoaXMubm9ybWFsaXplRHJvcExvY2F0aW9uKHQpLChvPVgucHJvdG90eXBlLnJlcG9ydEV4dGVybmFsRHJvcCkuY2FsbC5hcHBseShvLFt0aGlzLGUsdF0uY29uY2F0KGp0LmNhbGwocikpKX0sbm9ybWFsaXplRHJvcExvY2F0aW9uOmZ1bmN0aW9uKGUpe3ZhciByO3JldHVybiByPXQuZXh0ZW5kKHt9LGUpLGRlbGV0ZSByLnJlc291cmNlSWQsdGhpcy5jYWxlbmRhci5zZXRFdmVudFJlc291cmNlSWQocixlLnJlc291cmNlSWQpLHJ9fSxJPXthbGxvd0Nyb3NzUmVzb3VyY2U6ITAsZXZlbnRSYW5nZVRvU3BhbnM6ZnVuY3Rpb24oZSxyKXt2YXIgbyxzLGksbixsO2lmKG49dGhpcy52aWV3LmNhbGVuZGFyLmdldEV2ZW50UmVzb3VyY2VJZHMociksbi5sZW5ndGgpe2ZvcihsPVtdLG89MCxzPW4ubGVuZ3RoO288cztvKyspaT1uW29dLGwucHVzaCh0LmV4dGVuZCh7fSxlLHtyZXNvdXJjZUlkOml9KSk7cmV0dXJuIGx9cmV0dXJuIGQuaXNCZ0V2ZW50KHIpP2YucHJvdG90eXBlLmV2ZW50UmFuZ2VUb1NwYW5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpbXX0sZmFicmljYXRlSGVscGVyRXZlbnQ6ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gcj1mLnByb3RvdHlwZS5mYWJyaWNhdGVIZWxwZXJFdmVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy52aWV3LmNhbGVuZGFyLnNldEV2ZW50UmVzb3VyY2VJZChyLHQucmVzb3VyY2VJZCkscn0sY29tcHV0ZUV2ZW50RHJvcDpmdW5jdGlvbih0LGUscil7dmFyIG87cmV0dXJuIG89dGhpcy52aWV3LmlzRXZlbnRTdGFydEVkaXRhYmxlKHIpP2YucHJvdG90eXBlLmNvbXB1dGVFdmVudERyb3AuYXBwbHkodGhpcyxhcmd1bWVudHMpOmQucGx1Y2tFdmVudERhdGVQcm9wcyhyKSxvJiYodGhpcy52aWV3LmlzRXZlbnRSZXNvdXJjZUVkaXRhYmxlKHIpP28ucmVzb3VyY2VJZD1lLnJlc291cmNlSWQ6by5yZXNvdXJjZUlkPXQucmVzb3VyY2VJZCksb30sY29tcHV0ZUV4dGVybmFsRHJvcDpmdW5jdGlvbih0LGUpe3ZhciByO3JldHVybiByPWYucHJvdG90eXBlLmNvbXB1dGVFeHRlcm5hbERyb3AuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJihyLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkKSxyfSxjb21wdXRlRXZlbnRSZXNpemU6ZnVuY3Rpb24odCxlLHIsbyl7dmFyIHM7aWYodGhpcy5hbGxvd0Nyb3NzUmVzb3VyY2V8fGUucmVzb3VyY2VJZD09PXIucmVzb3VyY2VJZClyZXR1cm4gcz1mLnByb3RvdHlwZS5jb21wdXRlRXZlbnRSZXNpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHMmJihzLnJlc291cmNlSWQ9ZS5yZXNvdXJjZUlkKSxzfSxjb21wdXRlU2VsZWN0aW9uU3BhbjpmdW5jdGlvbih0LGUpe3ZhciByO2lmKHRoaXMuYWxsb3dDcm9zc1Jlc291cmNlfHx0LnJlc291cmNlSWQ9PT1lLnJlc291cmNlSWQpcmV0dXJuIHI9Zi5wcm90b3R5cGUuY29tcHV0ZVNlbGVjdGlvblNwYW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJihyLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkKSxyfX0sXz17ZmxhdHRlbmVkUmVzb3VyY2VzOm51bGwscmVzb3VyY2VDbnQ6MCxkYXRlc0Fib3ZlUmVzb3VyY2VzOiExLGFsbG93Q3Jvc3NSZXNvdXJjZTohMSxzZXRSZXNvdXJjZXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzPXRoaXMuZmxhdHRlblJlc291cmNlcyh0KSx0aGlzLnJlc291cmNlQ250PXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzLmxlbmd0aCx0aGlzLnVwZGF0ZURheVRhYmxlQ29scygpfSx1bnNldFJlc291cmNlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYXR0ZW5lZFJlc291cmNlcz1udWxsLHRoaXMucmVzb3VyY2VDbnQ9MCx0aGlzLnVwZGF0ZURheVRhYmxlQ29scygpfSxmbGF0dGVuUmVzb3VyY2VzOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO3JldHVybiByPXRoaXMudmlldy5vcHQoInJlc291cmNlT3JkZXIiKSxyPyhlPUZ0KHIpLHM9ZnVuY3Rpb24odCxyKXtyZXR1cm4gUSh0LHIsZSl9KTpzPW51bGwsbz1bXSx0aGlzLmFjY3VtdWxhdGVSZXNvdXJjZXModCxzLG8pLG99LGFjY3VtdWxhdGVSZXNvdXJjZXM6ZnVuY3Rpb24odCxlLHIpe3ZhciBvLHMsaSxuLGw7Zm9yKGU/KGw9dC5zbGljZSgwKSxsLnNvcnQoZSkpOmw9dCxuPVtdLG89MCxzPWwubGVuZ3RoO288cztvKyspaT1sW29dLHIucHVzaChpKSxuLnB1c2godGhpcy5hY2N1bXVsYXRlUmVzb3VyY2VzKGkuY2hpbGRyZW4sZSxyKSk7cmV0dXJuIG59LHVwZGF0ZURheVRhYmxlQ29sczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXM9dGhpcy52aWV3Lm9wdCgiZ3JvdXBCeURhdGVBbmRSZXNvdXJjZSIpLGQuRGF5VGFibGVNaXhpbi51cGRhdGVEYXlUYWJsZUNvbHMuY2FsbCh0aGlzKX0sY29tcHV0ZUNvbENudDpmdW5jdGlvbigpe3JldHVybih0aGlzLnJlc291cmNlQ250fHwxKSp0aGlzLmRheXNQZXJSb3d9LGdldENvbERheUluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzUlRMJiYodD10aGlzLmNvbENudC0xLXQpLHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcz9NYXRoLmZsb29yKHQvKHRoaXMucmVzb3VyY2VDbnR8fDEpKTp0JXRoaXMuZGF5c1BlclJvd30sZ2V0Q29sUmVzb3VyY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzW3RoaXMuZ2V0Q29sUmVzb3VyY2VJbmRleCh0KV19LGdldENvbFJlc291cmNlSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNSVEwmJih0PXRoaXMuY29sQ250LTEtdCksdGhpcy5kYXRlc0Fib3ZlUmVzb3VyY2VzP3QlKHRoaXMucmVzb3VyY2VDbnR8fDEpOk1hdGguZmxvb3IodC90aGlzLmRheXNQZXJSb3cpfSxpbmRpY2VzVG9Db2w6ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gcj10aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXM/ZSoodGhpcy5yZXNvdXJjZUNudHx8MSkrdDp0KnRoaXMuZGF5c1BlclJvdytlLHRoaXMuaXNSVEwmJihyPXRoaXMuY29sQ250LTEtcikscn0scmVuZGVySGVhZFRySHRtbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlc291cmNlQ250P3RoaXMuZGF5c1BlclJvdz4xP3RoaXMuZGF0ZXNBYm92ZVJlc291cmNlcz90aGlzLnJlbmRlckhlYWREYXRlQW5kUmVzb3VyY2VIdG1sKCk6dGhpcy5yZW5kZXJIZWFkUmVzb3VyY2VBbmREYXRlSHRtbCgpOnRoaXMucmVuZGVySGVhZFJlc291cmNlSHRtbCgpOmQuRGF5VGFibGVNaXhpbi5yZW5kZXJIZWFkVHJIdG1sLmNhbGwodGhpcyl9LHJlbmRlckhlYWRSZXNvdXJjZUh0bWw6ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2ZvcihzPVtdLHI9dGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMsdD0wLGU9ci5sZW5ndGg7dDxlO3QrKylvPXJbdF0sCnMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKG8pKTtyZXR1cm4gdGhpcy53cmFwVHIocywicmVuZGVySGVhZEludHJvSHRtbCIpfSxyZW5kZXJIZWFkUmVzb3VyY2VBbmREYXRlSHRtbDpmdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoO2ZvcihoPVtdLGU9W10sbj10aGlzLmZsYXR0ZW5lZFJlc291cmNlcyxvPTAsaT1uLmxlbmd0aDtvPGk7bysrKWZvcih1PW5bb10saC5wdXNoKHRoaXMucmVuZGVySGVhZFJlc291cmNlQ2VsbEh0bWwodSxudWxsLHRoaXMuZGF5c1BlclJvdykpLHI9cz0wLGw9dGhpcy5kYXlzUGVyUm93O3M8bDtyPXMrPTEpdD10aGlzLmRheURhdGVzW3JdLmNsb25lKCksZS5wdXNoKHRoaXMucmVuZGVySGVhZFJlc291cmNlRGF0ZUNlbGxIdG1sKHQsdSkpO3JldHVybiB0aGlzLndyYXBUcihoLCJyZW5kZXJIZWFkSW50cm9IdG1sIikrdGhpcy53cmFwVHIoZSwicmVuZGVySGVhZEludHJvSHRtbCIpfSxyZW5kZXJIZWFkRGF0ZUFuZFJlc291cmNlSHRtbDpmdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoO2ZvcihlPVtdLGg9W10scj1vPTAsbj10aGlzLmRheXNQZXJSb3c7bzxuO3I9bys9MSlmb3IodD10aGlzLmRheURhdGVzW3JdLmNsb25lKCksZS5wdXNoKHRoaXMucmVuZGVySGVhZERhdGVDZWxsSHRtbCh0LHRoaXMucmVzb3VyY2VDbnQpKSxsPXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzLHM9MCxpPWwubGVuZ3RoO3M8aTtzKyspdT1sW3NdLGgucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKHUsdCkpO3JldHVybiB0aGlzLndyYXBUcihlLCJyZW5kZXJIZWFkSW50cm9IdG1sIikrdGhpcy53cmFwVHIoaCwicmVuZGVySGVhZEludHJvSHRtbCIpfSxyZW5kZXJIZWFkUmVzb3VyY2VDZWxsSHRtbDpmdW5jdGlvbih0LGUscil7cmV0dXJuJzx0aCBjbGFzcz0iZmMtcmVzb3VyY2UtY2VsbCIgZGF0YS1yZXNvdXJjZS1pZD0iJyt0LmlkKyciJysoZT8nIGRhdGEtZGF0ZT0iJytlLmZvcm1hdCgiWVlZWS1NTS1ERCIpKyciJzoiIikrKHI+MT8nIGNvbHNwYW49IicrcisnIic6IiIpKyI+Iit5dCh0aGlzLnZpZXcuZ2V0UmVzb3VyY2VUZXh0KHQpKSsiPC90aD4ifSxyZW5kZXJIZWFkUmVzb3VyY2VEYXRlQ2VsbEh0bWw6ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLnJlbmRlckhlYWREYXRlQ2VsbEh0bWwodCxyLCdkYXRhLXJlc291cmNlLWlkPSInK2UuaWQrJyInKX0scHJvY2Vzc0hlYWRSZXNvdXJjZUVsczpmdW5jdGlvbihlKXtyZXR1cm4gZS5maW5kKCIuZmMtcmVzb3VyY2UtY2VsbCIpLmVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHIsbyl7dmFyIHM7cmV0dXJuIHM9ZS5kYXRlc0Fib3ZlUmVzb3VyY2VzP2UuZ2V0Q29sUmVzb3VyY2Uocik6ZS5mbGF0dGVuZWRSZXNvdXJjZXNbZS5pc1JUTD9lLmZsYXR0ZW5lZFJlc291cmNlcy5sZW5ndGgtMS1yOnJdLGUudmlldy50cmlnZ2VyKCJyZXNvdXJjZVJlbmRlciIscyxzLHQobyksdCgpKX19KHRoaXMpKX0scmVuZGVyQmdDZWxsc0h0bWw6ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaSxuO2lmKHRoaXMucmVzb3VyY2VDbnQpe2ZvcihvPVtdLGU9cz0wLGk9dGhpcy5jb2xDbnQ7czxpO2U9cys9MSlyPXRoaXMuZ2V0Q2VsbERhdGUodCxlKSxuPXRoaXMuZ2V0Q29sUmVzb3VyY2UoZSksby5wdXNoKHRoaXMucmVuZGVyUmVzb3VyY2VCZ0NlbGxIdG1sKHIsbikpO3JldHVybiBvLmpvaW4oIiIpfXJldHVybiBkLkRheVRhYmxlTWl4aW4ucmVuZGVyQmdDZWxsc0h0bWwuY2FsbCh0aGlzLHQpfSxyZW5kZXJSZXNvdXJjZUJnQ2VsbEh0bWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZW5kZXJCZ0NlbGxIdG1sKHQsJ2RhdGEtcmVzb3VyY2UtaWQ9IicrZS5pZCsnIicpfSx3cmFwVHI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pc1JUTD8odC5yZXZlcnNlKCksIjx0cj4iK3Quam9pbigiIikrdGhpc1tlXSgpKyI8L3RyPiIpOiI8dHI+Iit0aGlzW2VdKCkrdC5qb2luKCIiKSsiPC90cj4ifSxjb21wdXRlUGVyUmVzb3VyY2VCdXNpbmVzc0hvdXJTZWdzOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZztpZih0aGlzLmZsYXR0ZW5lZFJlc291cmNlcyl7Zm9yKHI9ITEscD10aGlzLmZsYXR0ZW5lZFJlc291cmNlcyxuPTAsaD1wLmxlbmd0aDtuPGg7bisrKWY9cFtuXSxmLmJ1c2luZXNzSG91cnMmJihyPSEwKTtpZihyKXtmb3IoZT1bXSxkPXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzLGw9MCxhPWQubGVuZ3RoO2w8YTtsKyspe2ZvcihmPWRbbF0sbz1mLmJ1c2luZXNzSG91cnN8fHRoaXMudmlldy5vcHQoImJ1c2luZXNzSG91cnMiKSxpPXRoaXMudmlldy5jYWxlbmRhci5jb21wdXRlQnVzaW5lc3NIb3VyRXZlbnRzKHQsbyksdT0wLGM9aS5sZW5ndGg7dTxjO3UrKylzPWlbdV0scy5yZXNvdXJjZUlkPWYuaWQ7Zz10aGlzLmV2ZW50c1RvU2VncyhpKSxlLnB1c2guYXBwbHkoZSxnKX1yZXR1cm4gZX19cmV0dXJuIG51bGx9fSxUPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIubWl4aW4oSSksci5taXhpbihfKSxyLnByb3RvdHlwZS5nZXRIaXRTcGFuPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPXIuX19zdXBlcl9fLmdldEhpdFNwYW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucmVzb3VyY2VDbnQmJihlLnJlc291cmNlSWQ9dGhpcy5nZXRDb2xSZXNvdXJjZSh0LmNvbCkuaWQpLGV9LHIucHJvdG90eXBlLnNwYW5Ub1NlZ3M9ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGY7aWYoYT10aGlzLnJlc291cmNlQ250LG89dGhpcy5kYXRlc0Fib3ZlUmVzb3VyY2VzP3RoaXMuc2xpY2VSYW5nZUJ5RGF5KGUpOnRoaXMuc2xpY2VSYW5nZUJ5Um93KGUpLGEpe2ZvcihkPVtdLGk9MCx1PW8ubGVuZ3RoO2k8dTtpKyspZm9yKGY9b1tpXSxjPW49MCxoPWE7bjxoO2M9bis9MSlwPXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzW2NdLGUucmVzb3VyY2VJZCYmZS5yZXNvdXJjZUlkIT09cC5pZHx8KHI9dC5leHRlbmQoe30sZiksci5yZXNvdXJjZT1wLHRoaXMuaXNSVEw/KHIubGVmdENvbD10aGlzLmluZGljZXNUb0NvbChjLGYubGFzdFJvd0RheUluZGV4KSxyLnJpZ2h0Q29sPXRoaXMuaW5kaWNlc1RvQ29sKGMsZi5maXJzdFJvd0RheUluZGV4KSk6KHIubGVmdENvbD10aGlzLmluZGljZXNUb0NvbChjLGYuZmlyc3RSb3dEYXlJbmRleCksci5yaWdodENvbD10aGlzLmluZGljZXNUb0NvbChjLGYubGFzdFJvd0RheUluZGV4KSksZC5wdXNoKHIpKTtyZXR1cm4gZH1mb3Iocz0wLGw9by5sZW5ndGg7czxsO3MrKylmPW9bc10sdGhpcy5pc1JUTD8oZi5sZWZ0Q29sPWYubGFzdFJvd0RheUluZGV4LGYucmlnaHRDb2w9Zi5maXJzdFJvd0RheUluZGV4KTooZi5sZWZ0Q29sPWYuZmlyc3RSb3dEYXlJbmRleCxmLnJpZ2h0Q29sPWYubGFzdFJvd0RheUluZGV4KTtyZXR1cm4gb30sci5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3Vycz1mdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PXRoaXMuY29tcHV0ZVBlclJlc291cmNlQnVzaW5lc3NIb3VyU2VncyghMCksdD90aGlzLnJlbmRlckZpbGwoImJ1c2luZXNzSG91cnMiLHQsImJnZXZlbnQiKTpyLl9fc3VwZXJfXy5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scn0oZC5EYXlHcmlkKSxGPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIubWl4aW4oSSksci5taXhpbihfKSxyLnByb3RvdHlwZS5nZXRIaXRTcGFuPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPXIuX19zdXBlcl9fLmdldEhpdFNwYW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucmVzb3VyY2VDbnQmJihlLnJlc291cmNlSWQ9dGhpcy5nZXRDb2xSZXNvdXJjZSh0LmNvbCkuaWQpLGV9LHIucHJvdG90eXBlLnNwYW5Ub1NlZ3M9ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGY7aWYoYT10aGlzLnJlc291cmNlQ250LG89dGhpcy5zbGljZVJhbmdlQnlUaW1lcyhlKSxhKXtmb3IoZD1bXSxpPTAsdT1vLmxlbmd0aDtpPHU7aSsrKWZvcihmPW9baV0sYz1uPTAsaD1hO248aDtjPW4rPTEpcD10aGlzLmZsYXR0ZW5lZFJlc291cmNlc1tjXSxlLnJlc291cmNlSWQmJmUucmVzb3VyY2VJZCE9PXAuaWR8fChyPXQuZXh0ZW5kKHt9LGYpLHIucmVzb3VyY2U9cCxyLmNvbD10aGlzLmluZGljZXNUb0NvbChjLGYuZGF5SW5kZXgpLGQucHVzaChyKSk7cmV0dXJuIGR9Zm9yKHM9MCxsPW8ubGVuZ3RoO3M8bDtzKyspZj1vW3NdLGYuY29sPWYuZGF5SW5kZXg7cmV0dXJuIG99LHIucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnM9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdD10aGlzLmNvbXB1dGVQZXJSZXNvdXJjZUJ1c2luZXNzSG91clNlZ3MoITEpLHQ/dGhpcy5yZW5kZXJCdXNpbmVzc1NlZ3ModCk6ci5fX3N1cGVyX18ucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHJ9KGQuVGltZUdyaWQpLGo9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE90KGUsdCksZS5wcm90b3R5cGUudGltZUdyaWQ9bnVsbCxlLnByb3RvdHlwZS5pc1Njcm9sbGVkPSExLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZD10aGlzLmluc3RhbnRpYXRlR3JpZCgpLHRoaXMuaW50ZXJ2YWxEdXJhdGlvbj10aGlzLnRpbWVHcmlkLmR1cmF0aW9ufSxlLnByb3RvdHlwZS5pbnN0YW50aWF0ZUdyaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcyl9LGUucHJvdG90eXBlLnNldFJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBlLl9fc3VwZXJfXy5zZXRSYW5nZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy50aW1lR3JpZC5zZXRSYW5nZSh0KX0sZS5wcm90b3R5cGUucmVuZGVyU2tlbGV0b249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5hZGRDbGFzcygiZmMtdGltZWxpbmUiKSx0aGlzLm9wdCgiZXZlbnRPdmVybGFwIik9PT0hMSYmdGhpcy5lbC5hZGRDbGFzcygiZmMtbm8tb3ZlcmxhcCIpLHRoaXMuZWwuaHRtbCh0aGlzLnJlbmRlclNrZWxldG9uSHRtbCgpKSx0aGlzLnJlbmRlclRpbWVHcmlkU2tlbGV0b24oKX0sZS5wcm90b3R5cGUucmVuZGVyU2tlbGV0b25IdG1sPWZ1bmN0aW9uKCl7cmV0dXJuJzx0YWJsZT4gPHRoZWFkIGNsYXNzPSJmYy1oZWFkIj4gPHRyPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnK3RoaXMud2lkZ2V0SGVhZGVyQ2xhc3MrJyI+PC90ZD4gPC90cj4gPC90aGVhZD4gPHRib2R5IGNsYXNzPSJmYy1ib2R5Ij4gPHRyPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnK3RoaXMud2lkZ2V0Q29udGVudENsYXNzKyciPjwvdGQ+IDwvdHI+IDwvdGJvZHk+IDwvdGFibGU+J30sZS5wcm90b3R5cGUucmVuZGVyVGltZUdyaWRTa2VsZXRvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnNldEVsZW1lbnQodGhpcy5lbC5maW5kKCJ0Ym9keSAuZmMtdGltZS1hcmVhIikpLHRoaXMudGltZUdyaWQuaGVhZEVsPXRoaXMuZWwuZmluZCgidGhlYWQgLmZjLXRpbWUtYXJlYSIpLHRoaXMudGltZUdyaWQucmVuZGVyU2tlbGV0b24oKSx0aGlzLmlzU2Nyb2xsZWQ9ITEsdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIub24oInNjcm9sbCIsTXQodGhpcywiaGFuZGxlQm9keVNjcm9sbCIpKX0sZS5wcm90b3R5cGUuaGFuZGxlQm9keVNjcm9sbD1mdW5jdGlvbih0LGUpe2lmKHQpe2lmKCF0aGlzLmlzU2Nyb2xsZWQpcmV0dXJuIHRoaXMuaXNTY3JvbGxlZD0hMCx0aGlzLmVsLmFkZENsYXNzKCJmYy1zY3JvbGxlZCIpfWVsc2UgaWYodGhpcy5pc1Njcm9sbGVkKXJldHVybiB0aGlzLmlzU2Nyb2xsZWQ9ITEsdGhpcy5lbC5yZW1vdmVDbGFzcygiZmMtc2Nyb2xsZWQiKX0sZS5wcm90b3R5cGUudW5yZW5kZXJTa2VsZXRvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbW92ZUVsZW1lbnQoKSx0aGlzLmhhbmRsZUJvZHlTY3JvbGwoMCksZS5fX3N1cGVyX18udW5yZW5kZXJTa2VsZXRvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLnJlbmRlckRhdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyRGF0ZXMoKX0sZS5wcm90b3R5cGUudW5yZW5kZXJEYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyRGF0ZXMoKX0sZS5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3Vycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKX0sZS5wcm90b3R5cGUudW5yZW5kZXJCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCl9LGUucHJvdG90eXBlLmdldE5vd0luZGljYXRvclVuaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXROb3dJbmRpY2F0b3JVbml0KCl9LGUucHJvdG90eXBlLnJlbmRlck5vd0luZGljYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5yZW5kZXJOb3dJbmRpY2F0b3IodCl9LGUucHJvdG90eXBlLnVucmVuZGVyTm93SW5kaWNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJOb3dJbmRpY2F0b3IoKX0sZS5wcm90b3R5cGUucHJlcGFyZUhpdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5wcmVwYXJlSGl0cygpfSxlLnByb3RvdHlwZS5yZWxlYXNlSGl0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbGVhc2VIaXRzKCl9LGUucHJvdG90eXBlLnF1ZXJ5SGl0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudGltZUdyaWQucXVlcnlIaXQodCxlKX0sZS5wcm90b3R5cGUuZ2V0SGl0U3Bhbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRIaXRTcGFuKHQpfSxlLnByb3RvdHlwZS5nZXRIaXRFbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRIaXRFbCh0KX0sZS5wcm90b3R5cGUudXBkYXRlV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC51cGRhdGVXaWR0aCgpfSxlLnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gcj1lPyJhdXRvIjp0LXRoaXMudGltZUdyaWQuaGVhZEhlaWdodCgpLXRoaXMucXVlcnlNaXNjSGVpZ2h0KCksdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuc2V0SGVpZ2h0KHIpfSxlLnByb3RvdHlwZS5xdWVyeU1pc2NIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5vdXRlckhlaWdodCgpLXRoaXMudGltZUdyaWQuaGVhZFNjcm9sbGVyLmVsLm91dGVySGVpZ2h0KCktdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKX0sZS5wcm90b3R5cGUuY29tcHV0ZUluaXRpYWxTY3JvbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGltZUdyaWQuY29tcHV0ZUluaXRpYWxTY3JvbGwodCl9LGUucHJvdG90eXBlLnF1ZXJ5U2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQucXVlcnlTY3JvbGwoKX0sZS5wcm90b3R5cGUuc2V0U2Nyb2xsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVHcmlkLnNldFNjcm9sbCh0KX0sZS5wcm90b3R5cGUucmVuZGVyRXZlbnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckV2ZW50cyh0KSx0aGlzLnVwZGF0ZVdpZHRoKCl9LGUucHJvdG90eXBlLnVucmVuZGVyRXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKSx0aGlzLnVwZGF0ZVdpZHRoKCl9LGUucHJvdG90eXBlLnJlbmRlckRyYWc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5yZW5kZXJEcmFnKHQsZSl9LGUucHJvdG90eXBlLnVucmVuZGVyRHJhZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyRHJhZygpfSxlLnByb3RvdHlwZS5nZXRFdmVudFNlZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRFdmVudFNlZ3MoKX0sZS5wcm90b3R5cGUucmVuZGVyU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlclNlbGVjdGlvbih0KX0sZS5wcm90b3R5cGUudW5yZW5kZXJTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlclNlbGVjdGlvbigpfSxlfShYKSxydD1kLmNzc1RvU3RyLE49ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbygpe3ZhciB0O28uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmluaXRTY2FsZVByb3BzKCksdGhpcy5taW5UaW1lPWUuZHVyYXRpb24odGhpcy5vcHQoIm1pblRpbWUiKXx8IjAwOjAwIiksdGhpcy5tYXhUaW1lPWUuZHVyYXRpb24odGhpcy5vcHQoIm1heFRpbWUiKXx8IjI0OjAwIiksdGhpcy50aW1lV2luZG93TXM9dGhpcy5tYXhUaW1lLXRoaXMubWluVGltZSx0aGlzLnNuYXBEdXJhdGlvbj0odD10aGlzLm9wdCgic25hcER1cmF0aW9uIikpP2UuZHVyYXRpb24odCk6dGhpcy5zbG90RHVyYXRpb24sdGhpcy5taW5SZXNpemVEdXJhdGlvbj10aGlzLnNuYXBEdXJhdGlvbix0aGlzLnNuYXBzUGVyU2xvdD1pdCh0aGlzLnNsb3REdXJhdGlvbix0aGlzLnNuYXBEdXJhdGlvbiksdGhpcy5zbG90V2lkdGg9dGhpcy5vcHQoInNsb3RXaWR0aCIpfXJldHVybiBPdChvLHIpLG8ucHJvdG90eXBlLnNsb3REYXRlcz1udWxsLG8ucHJvdG90eXBlLnNsb3RDbnQ9bnVsbCxvLnByb3RvdHlwZS5zbmFwQ250PW51bGwsby5wcm90b3R5cGUuc25hcHNQZXJTbG90PW51bGwsby5wcm90b3R5cGUuc25hcERpZmZUb0luZGV4PW51bGwsby5wcm90b3R5cGUuc25hcEluZGV4VG9EaWZmPW51bGwsby5wcm90b3R5cGUuaGVhZEVsPW51bGwsby5wcm90b3R5cGUuc2xhdENvbnRhaW5lckVsPW51bGwsby5wcm90b3R5cGUuc2xhdEVscz1udWxsLG8ucHJvdG90eXBlLmNvbnRhaW5lckNvb3JkQ2FjaGU9bnVsbCxvLnByb3RvdHlwZS5zbGF0Q29vcmRDYWNoZT1udWxsLG8ucHJvdG90eXBlLnNsYXRJbm5lckNvb3JkQ2FjaGU9bnVsbCxvLnByb3RvdHlwZS5oZWFkU2Nyb2xsZXI9bnVsbCxvLnByb3RvdHlwZS5ib2R5U2Nyb2xsZXI9bnVsbCxvLnByb3RvdHlwZS5qb2luZXI9bnVsbCxvLnByb3RvdHlwZS5mb2xsb3dlcj1udWxsLG8ucHJvdG90eXBlLmV2ZW50VGl0bGVGb2xsb3dlcj1udWxsLG8ucHJvdG90eXBlLm1pblRpbWU9bnVsbCxvLnByb3RvdHlwZS5tYXhUaW1lPW51bGwsby5wcm90b3R5cGUudGltZVdpbmRvd01zPW51bGwsby5wcm90b3R5cGUuc2xvdER1cmF0aW9uPW51bGwsby5wcm90b3R5cGUuc25hcER1cmF0aW9uPW51bGwsby5wcm90b3R5cGUuZHVyYXRpb249bnVsbCxvLnByb3RvdHlwZS5sYWJlbEludGVydmFsPW51bGwsby5wcm90b3R5cGUuaGVhZGVyRm9ybWF0cz1udWxsLG8ucHJvdG90eXBlLmlzVGltZVNjYWxlPW51bGwsby5wcm90b3R5cGUubGFyZ2VVbml0PW51bGwsby5wcm90b3R5cGUuZW1waGFzaXplV2Vla3M9ITEsby5wcm90b3R5cGUudGl0bGVGb2xsb3dlcj1udWxsLG8ucHJvdG90eXBlLnNlZ0NvbnRhaW5lckVsPW51bGwsby5wcm90b3R5cGUuc2VnQ29udGFpbmVySGVpZ2h0PW51bGwsby5wcm90b3R5cGUuYmdTZWdDb250YWluZXJFbD1udWxsLG8ucHJvdG90eXBlLmhlbHBlckVscz1udWxsLG8ucHJvdG90eXBlLmlubmVyRWw9bnVsbCxvLnByb3RvdHlwZS5vcHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudmlldy5vcHQodCl9LG8ucHJvdG90eXBlLmlzVmFsaWREYXRlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiF0aGlzLnZpZXcuaXNIaWRkZW5EYXkodCkmJighdGhpcy5pc1RpbWVTY2FsZXx8KGU9dC50aW1lKCktdGhpcy5taW5UaW1lLGU9KGUlODY0ZTUrODY0ZTUpJTg2NGU1LGU8dGhpcy50aW1lV2luZG93TXMpKX0sby5wcm90b3R5cGUuY29tcHV0ZURpc3BsYXlFdmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc1RpbWVTY2FsZX0sby5wcm90b3R5cGUuY29tcHV0ZURpc3BsYXlFdmVudEVuZD1mdW5jdGlvbigpe3JldHVybiExfSxvLnByb3RvdHlwZS5jb21wdXRlRXZlbnRUaW1lRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0KCJleHRyYVNtYWxsVGltZUZvcm1hdCIpfSxvLnByb3RvdHlwZS5ub3JtYWxpemVHcmlkRGF0ZT1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gdGhpcy5pc1RpbWVTY2FsZT8oZT10LmNsb25lKCksZS5oYXNUaW1lKCl8fGUudGltZSgwKSk6KGU9dC5jbG9uZSgpLnN0cmlwVGltZSgpLHRoaXMubGFyZ2VVbml0JiZlLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpKSxlfSxvLnByb3RvdHlwZS5ub3JtYWxpemVHcmlkUmFuZ2U9ZnVuY3Rpb24odCl7dmFyIGUscjtyZXR1cm4gdGhpcy5pc1RpbWVTY2FsZT9yPXtzdGFydDp0aGlzLm5vcm1hbGl6ZUdyaWREYXRlKHQuc3RhcnQpLGVuZDp0aGlzLm5vcm1hbGl6ZUdyaWREYXRlKHQuZW5kKX06KHI9dGhpcy52aWV3LmNvbXB1dGVEYXlSYW5nZSh0KSx0aGlzLmxhcmdlVW5pdCYmKHIuc3RhcnQuc3RhcnRPZih0aGlzLmxhcmdlVW5pdCksZT1yLmVuZC5jbG9uZSgpLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpLGUuaXNTYW1lKHIuZW5kKSYmZS5pc0FmdGVyKHIuc3RhcnQpfHxlLmFkZCh0aGlzLnNsb3REdXJhdGlvbiksci5lbmQ9ZSkpLHJ9LG8ucHJvdG90eXBlLnJhbmdlVXBkYXRlZD1mdW5jdGlvbigpe3ZhciB0LGU7Zm9yKHRoaXMuc3RhcnQ9dGhpcy5ub3JtYWxpemVHcmlkRGF0ZSh0aGlzLnN0YXJ0KSx0aGlzLmVuZD10aGlzLm5vcm1hbGl6ZUdyaWREYXRlKHRoaXMuZW5kKSx0aGlzLmlzVGltZVNjYWxlJiYodGhpcy5zdGFydC5hZGQodGhpcy5taW5UaW1lKSx0aGlzLmVuZC5zdWJ0cmFjdCgxLCJkYXkiKS5hZGQodGhpcy5tYXhUaW1lKSksZT1bXSx0PXRoaXMuc3RhcnQuY2xvbmUoKTt0PHRoaXMuZW5kOyl0aGlzLmlzVmFsaWREYXRlKHQpJiZlLnB1c2godC5jbG9uZSgpKSx0LmFkZCh0aGlzLnNsb3REdXJhdGlvbik7cmV0dXJuIHRoaXMuc2xvdERhdGVzPWUsdGhpcy51cGRhdGVHcmlkRGF0ZXMoKX0sby5wcm90b3R5cGUudXBkYXRlR3JpZERhdGVzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iobz0tMSxlPTAscj1bXSxzPVtdLHQ9dGhpcy5zdGFydC5jbG9uZSgpO3Q8dGhpcy5lbmQ7KXRoaXMuaXNWYWxpZERhdGUodCk/KG8rKyxyLnB1c2gobykscy5wdXNoKGUpKTpyLnB1c2gobysuNSksdC5hZGQodGhpcy5zbmFwRHVyYXRpb24pLGUrKztyZXR1cm4gdGhpcy5zbmFwRGlmZlRvSW5kZXg9cix0aGlzLnNuYXBJbmRleFRvRGlmZj1zLHRoaXMuc25hcENudD1vKzEsdGhpcy5zbG90Q250PXRoaXMuc25hcENudC90aGlzLnNuYXBzUGVyU2xvdH0sby5wcm90b3R5cGUuc3BhblRvU2Vncz1mdW5jdGlvbih0KXt2YXIgZSxyO3JldHVybiBlPXRoaXMubm9ybWFsaXplR3JpZFJhbmdlKHQpLHRoaXMuY29tcHV0ZURhdGVTbmFwQ292ZXJhZ2UodC5zdGFydCk8dGhpcy5jb21wdXRlRGF0ZVNuYXBDb3ZlcmFnZSh0LmVuZCkmJihyPXZ0KGUsdGhpcykpPyhyLmlzU3RhcnQmJiF0aGlzLmlzVmFsaWREYXRlKHIuc3RhcnQpJiYoci5pc1N0YXJ0PSExKSxyLmlzRW5kJiZyLmVuZCYmIXRoaXMuaXNWYWxpZERhdGUoci5lbmQuY2xvbmUoKS5zdWJ0cmFjdCgxKSkmJihyLmlzRW5kPSExKSxbcl0pOltdfSxvLnByb3RvdHlwZS5wcmVwYXJlSGl0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1aWxkQ29vcmRzKCl9LG8ucHJvdG90eXBlLnF1ZXJ5SGl0PWZ1bmN0aW9uKHQsZSl7dmFyIHIsbyxzLGksbixsLHUsaCxhLGMscCxkO2lmKGQ9dGhpcy5zbmFwc1BlclNsb3QsaT10aGlzLnNsYXRDb29yZENhY2hlLHI9dGhpcy5jb250YWluZXJDb29yZENhY2hlLHIuaXNUb3BJbkJvdW5kcyhlKSYmKG49aS5nZXRIb3Jpem9udGFsSW5kZXgodCksbnVsbCE9bikpcmV0dXJuIGg9aS5nZXRXaWR0aChuKSx0aGlzLmlzUlRMPyh1PWkuZ2V0UmlnaHRPZmZzZXQobikscz0odS10KS9oLG89TWF0aC5mbG9vcihzKmQpLGE9bipkK28scD11LW8vZCpoLGM9cC0obysxKS9kKmgpOihsPWkuZ2V0TGVmdE9mZnNldChuKSxzPSh0LWwpL2gsbz1NYXRoLmZsb29yKHMqZCksYT1uKmQrbyxjPWwrby9kKmgscD1sKyhvKzEpL2QqaCkse3NuYXA6YSxjb21wb25lbnQ6dGhpcyxsZWZ0OmMscmlnaHQ6cCx0b3A6ci5nZXRUb3BPZmZzZXQoMCksYm90dG9tOnIuZ2V0Qm90dG9tT2Zmc2V0KDApfX0sby5wcm90b3R5cGUuZ2V0SGl0U3Bhbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRTbmFwUmFuZ2UodC5zbmFwKX0sby5wcm90b3R5cGUuZ2V0SGl0RWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0U25hcEVsKHQuc25hcCl9LG8ucHJvdG90eXBlLmdldFNuYXBSYW5nZT1mdW5jdGlvbih0KXt2YXIgZSxyO3JldHVybiByPXRoaXMuc3RhcnQuY2xvbmUoKSxyLmFkZChDdCh0aGlzLnNuYXBEdXJhdGlvbix0aGlzLnNuYXBJbmRleFRvRGlmZlt0XSkpLGU9ci5jbG9uZSgpLmFkZCh0aGlzLnNuYXBEdXJhdGlvbikse3N0YXJ0OnIsZW5kOmV9fSxvLnByb3RvdHlwZS5nZXRTbmFwRWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2xhdEVscy5lcShNYXRoLmZsb29yKHQvdGhpcy5zbmFwc1BlclNsb3QpKX0sby5wcm90b3R5cGUucmVuZGVyU2tlbGV0b249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZWFkU2Nyb2xsZXI9bmV3IG4oe292ZXJmbG93WDoiY2xpcHBlZC1zY3JvbGwiLG92ZXJmbG93WToiaGlkZGVuIn0pLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcz1uZXcgTyx0aGlzLmhlYWRTY3JvbGxlci5yZW5kZXIoKSx0aGlzLmhlYWRFbC5hcHBlbmQodGhpcy5oZWFkU2Nyb2xsZXIuZWwpLHRoaXMuYm9keVNjcm9sbGVyPW5ldyBuLHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcz1uZXcgTyx0aGlzLmJvZHlTY3JvbGxlci5yZW5kZXIoKSx0aGlzLmVsLmFwcGVuZCh0aGlzLmJvZHlTY3JvbGxlci5lbCksdGhpcy5pbm5lckVsPXRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwsdGhpcy5zbGF0Q29udGFpbmVyRWw9dCgnPGRpdiBjbGFzcz0iZmMtc2xhdHMiLz4nKS5hcHBlbmRUbyh0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuYmdFbCksdGhpcy5zZWdDb250YWluZXJFbD10KCc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiLz4nKS5hcHBlbmRUbyh0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuY29udGVudEVsKSx0aGlzLmJnU2VnQ29udGFpbmVyRWw9dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmJnRWwsdGhpcy5jb250YWluZXJDb29yZENhY2hlPW5ldyBsKHtlbHM6dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLGlzSG9yaXpvbnRhbDohMCxpc1ZlcnRpY2FsOiEwfSksdGhpcy5qb2luZXI9bmV3IEEoImhvcml6b250YWwiLFt0aGlzLmhlYWRTY3JvbGxlcix0aGlzLmJvZHlTY3JvbGxlcl0pLHRoaXMuZm9sbG93ZXI9bmV3IFYodGhpcy5oZWFkU2Nyb2xsZXIsdGhpcy52aWV3LmNhbGVuZGFyLmlzVG91Y2gpLHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyPW5ldyBWKHRoaXMuYm9keVNjcm9sbGVyLHRoaXMudmlldy5jYWxlbmRhci5pc1RvdWNoKSx0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5taW5UcmF2ZWw9NTAsdGhpcy5pc1JUTD90aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jb250YWluT25OYXR1cmFsUmlnaHQ9ITA6dGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY29udGFpbk9uTmF0dXJhbExlZnQ9ITAsby5fX3N1cGVyX18ucmVuZGVyU2tlbGV0b24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5oZWFkQ29sRWxzPW51bGwsby5wcm90b3R5cGUuc2xhdENvbEVscz1udWxsLG8ucHJvdG90eXBlLnJlbmRlckRhdGVzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3IodGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5odG1sKHRoaXMucmVuZGVySGVhZEh0bWwoKSksdGhpcy5oZWFkQ29sRWxzPXRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZmluZCgiY29sIiksdGhpcy5zbGF0Q29udGFpbmVyRWwuaHRtbCh0aGlzLnJlbmRlclNsYXRIdG1sKCkpLHRoaXMuc2xhdENvbEVscz10aGlzLnNsYXRDb250YWluZXJFbC5maW5kKCJjb2wiKSx0aGlzLnNsYXRFbHM9dGhpcy5zbGF0Q29udGFpbmVyRWwuZmluZCgidGQiKSx0aGlzLnNsYXRDb29yZENhY2hlPW5ldyBsKHtlbHM6dGhpcy5zbGF0RWxzLGlzSG9yaXpvbnRhbDohMH0pLHRoaXMuc2xhdElubmVyQ29vcmRDYWNoZT1uZXcgbCh7ZWxzOnRoaXMuc2xhdEVscy5maW5kKCI+IGRpdiIpLGlzSG9yaXpvbnRhbDohMCxvZmZzZXRQYXJlbnQ6dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsfSkscz10aGlzLnNsb3REYXRlcyxlPXI9MCxvPXMubGVuZ3RoO3I8bztlPSsrcil0PXNbZV0sdGhpcy52aWV3LnRyaWdnZXIoImRheVJlbmRlciIsbnVsbCx0LHRoaXMuc2xhdEVscy5lcShlKSk7aWYodGhpcy5mb2xsb3dlcilyZXR1cm4gdGhpcy5mb2xsb3dlci5zZXRTcHJpdGVzKHRoaXMuaGVhZEVsLmZpbmQoInRyOm5vdCg6bGFzdC1jaGlsZCkgc3BhbiIpKX0sby5wcm90b3R5cGUudW5yZW5kZXJEYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZvbGxvd2VyJiZ0aGlzLmZvbGxvd2VyLmNsZWFyU3ByaXRlcygpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZW1wdHkoKSx0aGlzLnNsYXRDb250YWluZXJFbC5lbXB0eSgpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jbGVhcldpZHRoKCksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmNsZWFyV2lkdGgoKX0sby5wcm90b3R5cGUucmVuZGVySGVhZEh0bWw9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZyx5LHYsdyxtLFMsUixiLEMsRSxILFQsXyxJLEQseCxCLEYsRyxNLFcsTDtmb3IoZz10aGlzLmxhYmVsSW50ZXJ2YWwsaT10aGlzLmhlYWRlckZvcm1hdHMsZT1mdW5jdGlvbigpe3ZhciB0LGUscjtmb3Iocj1bXSx0PTAsZT1pLmxlbmd0aDt0PGU7dCsrKXM9aVt0XSxyLnB1c2goW10pO3JldHVybiByfSgpLHk9bnVsbCxJPW51bGwsTT10aGlzLnNsb3REYXRlcyxHPVtdLHA9MCx2PU0ubGVuZ3RoO3A8djtwKyspe2ZvcihyPU1bcF0sTD1yLndlZWsoKSxjPXRoaXMuZW1waGFzaXplV2Vla3MmJm51bGwhPT1JJiZJIT09TCx4PWQ9MCx3PWkubGVuZ3RoO2Q8dzt4PSsrZClzPWlbeF0sQj1lW3hdLHk9QltCLmxlbmd0aC0xXSxhPWkubGVuZ3RoPjEmJng8aS5sZW5ndGgtMSxUPW51bGwsYT8oVz1yLmZvcm1hdChzKSxvPXIuZm9ybWF0KCkseSYmeS50ZXh0PT09Vz95LmNvbHNwYW4rPTE6VD17dGV4dDpXLGRhdGVEYXRhOm8sY29sc3BhbjoxfSk6IXl8fFN0KG50KHRoaXMuc3RhcnQscixnKSk/KFc9ci5mb3JtYXQocyksbz1yLmZvcm1hdCgpLFQ9e3RleHQ6VyxkYXRlRGF0YTpvLGNvbHNwYW46MX0pOnkuY29sc3Bhbis9MSxUJiYoVC53ZWVrU3RhcnQ9YyxCLnB1c2goVCkpO0cucHVzaCh7d2Vla1N0YXJ0OmN9KSxJPUx9Zm9yKHU9Zz50aGlzLnNsb3REdXJhdGlvbixuPSI8dGFibGU+IixuKz0iPGNvbGdyb3VwPiIsZj0wLG09TS5sZW5ndGg7ZjxtO2YrKylyPU1bZl0sbis9Ijxjb2wvPiI7Zm9yKG4rPSI8L2NvbGdyb3VwPiIsbis9Ijx0Ym9keT4iLGw9RT0wLFM9ZS5sZW5ndGg7RTxTO2w9KytFKXtmb3IoQj1lW2xdLGg9bD09PWUubGVuZ3RoLTEsbis9Ijx0ciIrKHUmJmg/JyBjbGFzcz0iZmMtY2hyb25vIic6IiIpKyI+IixIPTAsUj1CLmxlbmd0aDtIPFI7SCsrKXQ9QltIXSxuKz0nPHRoIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRIZWFkZXJDbGFzcysiICIrKHQud2Vla1N0YXJ0PyJmYy1lbS1jZWxsIjoiIikrJyIgZGF0YS1kYXRlPSInK3QuZGF0ZURhdGErJyInKyh0LmNvbHNwYW4+MT8nIGNvbHNwYW49IicrdC5jb2xzcGFuKyciJzoiIikrJz48ZGl2IGNsYXNzPSJmYy1jZWxsLWNvbnRlbnQiPjxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicreXQodC50ZXh0KSsiPC9zcGFuPjwvZGl2PjwvdGg+IjtuKz0iPC90cj4ifWZvcihuKz0iPC90Ym9keT48L3RhYmxlPiIsRj0iPHRhYmxlPiIsRis9Ijxjb2xncm91cD4iLF89MCxiPUcubGVuZ3RoO188YjtfKyspdD1HW19dLEYrPSI8Y29sLz4iO2ZvcihGKz0iPC9jb2xncm91cD4iLEYrPSI8dGJvZHk+PHRyPiIsbD1EPTAsQz1HLmxlbmd0aDtEPEM7bD0rK0QpdD1HW2xdLHI9TVtsXSxGKz10aGlzLnNsYXRDZWxsSHRtbChyLHQud2Vla1N0YXJ0KTtyZXR1cm4gRis9IjwvdHI+PC90Ym9keT48L3RhYmxlPiIsdGhpcy5fc2xhdEh0bWw9RixufSxvLnByb3RvdHlwZS5yZW5kZXJTbGF0SHRtbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zbGF0SHRtbH0sby5wcm90b3R5cGUuc2xhdENlbGxIdG1sPWZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHRoaXMuaXNUaW1lU2NhbGU/KHI9W10sci5wdXNoKFN0KG50KHRoaXMuc3RhcnQsdCx0aGlzLmxhYmVsSW50ZXJ2YWwpKT8iZmMtbWFqb3IiOiJmYy1taW5vciIpKToocj10aGlzLmdldERheUNsYXNzZXModCksci5wdXNoKCJmYy1kYXkiKSksci51bnNoaWZ0KHRoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MpLGUmJnIucHVzaCgiZmMtZW0tY2VsbCIpLCc8dGQgY2xhc3M9Iicrci5qb2luKCIgIikrJyIgZGF0YS1kYXRlPSInK3QuZm9ybWF0KCkrJyI+PGRpdiAvPjwvdGQ+J30sby5wcm90b3R5cGUuYnVzaW5lc3NIb3VyU2Vncz1udWxsLG8ucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnM9ZnVuY3Rpb24oKXt2YXIgdDtpZighdGhpcy5sYXJnZVVuaXQpcmV0dXJuIHQ9dGhpcy5idXNpbmVzc0hvdXJTZWdzPXRoaXMuYnVpbGRCdXNpbmVzc0hvdXJTZWdzKCF0aGlzLmlzVGltZVNjYWxlKSx0aGlzLnJlbmRlckZpbGwoImJ1c2luZXNzSG91cnMiLHQsImJnZXZlbnQiKX0sby5wcm90b3R5cGUudW5yZW5kZXJCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5yZW5kZXJGaWxsKCJidXNpbmVzc0hvdXJzIil9LG8ucHJvdG90eXBlLm5vd0luZGljYXRvckVscz1udWxsLG8ucHJvdG90eXBlLmdldE5vd0luZGljYXRvclVuaXQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzVGltZVNjYWxlKXJldHVybiBKKHRoaXMuc2xvdER1cmF0aW9uKX0sby5wcm90b3R5cGUucmVuZGVyTm93SW5kaWNhdG9yPWZ1bmN0aW9uKGUpe3ZhciByLG8scztyZXR1cm4gcz1bXSxlPXRoaXMubm9ybWFsaXplR3JpZERhdGUoZSksZT49dGhpcy5zdGFydCYmZTx0aGlzLmVuZCYmKHI9dGhpcy5kYXRlVG9Db29yZChlKSxvPXRoaXMuaXNSVEw/e3JpZ2h0Oi1yfTp7bGVmdDpyfSxzLnB1c2godCgiPGRpdiBjbGFzcz0nZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWFycm93Jz48L2Rpdj4iKS5jc3MobykuYXBwZW5kVG8odGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmVsKVswXSkscy5wdXNoKHQoIjxkaXYgY2xhc3M9J2ZjLW5vdy1pbmRpY2F0b3IgZmMtbm93LWluZGljYXRvci1saW5lJz48L2Rpdj4iKS5jc3MobykuYXBwZW5kVG8odGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsKVswXSkpLHRoaXMubm93SW5kaWNhdG9yRWxzPXQocyl9LG8ucHJvdG90eXBlLnVucmVuZGVyTm93SW5kaWNhdG9yPWZ1bmN0aW9uKCl7aWYodGhpcy5ub3dJbmRpY2F0b3JFbHMpcmV0dXJuIHRoaXMubm93SW5kaWNhdG9yRWxzLnJlbW92ZSgpLHRoaXMubm93SW5kaWNhdG9yRWxzPW51bGx9LG8ucHJvdG90eXBlLmV4cGxpY2l0U2xvdFdpZHRoPW51bGwsby5wcm90b3R5cGUuZGVmYXVsdFNsb3RXaWR0aD1udWxsLG8ucHJvdG90eXBlLnVwZGF0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztpZihzPU1hdGgucm91bmQodGhpcy5zbG90V2lkdGh8fCh0aGlzLnNsb3RXaWR0aD10aGlzLmNvbXB1dGVTbG90V2lkdGgoKSkpLHI9cyp0aGlzLnNsb3REYXRlcy5sZW5ndGgsZT0iIixvPXMsdD10aGlzLmJvZHlTY3JvbGxlci5nZXRDbGllbnRXaWR0aCgpLHQ+ciYmKGU9dCxyPSIiLG89TWF0aC5mbG9vcih0L3RoaXMuc2xvdERhdGVzLmxlbmd0aCkpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5zZXRXaWR0aChyKSx0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuc2V0TWluV2lkdGgoZSksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLnNldFdpZHRoKHIpLHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5zZXRNaW5XaWR0aChlKSx0aGlzLmhlYWRDb2xFbHMuc2xpY2UoMCwtMSkuYWRkKHRoaXMuc2xhdENvbEVscy5zbGljZSgwLC0xKSkud2lkdGgobyksdGhpcy5oZWFkU2Nyb2xsZXIudXBkYXRlU2l6ZSgpLHRoaXMuYm9keVNjcm9sbGVyLnVwZGF0ZVNpemUoKSx0aGlzLmpvaW5lci51cGRhdGUoKSx0aGlzLmJ1aWxkQ29vcmRzKCksdGhpcy51cGRhdGVTZWdQb3NpdGlvbnMoKSx0aGlzLnZpZXcudXBkYXRlTm93SW5kaWNhdG9yKCksdGhpcy5mb2xsb3dlciYmdGhpcy5mb2xsb3dlci51cGRhdGUoKSx0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcilyZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIudXBkYXRlKCl9LG8ucHJvdG90eXBlLmNvbXB1dGVTbG90V2lkdGg9ZnVuY3Rpb24oKXt2YXIgZSxyLG8scyxpLG47cmV0dXJuIG89MCxyPXRoaXMuaGVhZEVsLmZpbmQoInRyOmxhc3QtY2hpbGQgdGggc3BhbiIpLHIuZWFjaChmdW5jdGlvbihlLHIpe3ZhciBzO3JldHVybiBzPXQocikub3V0ZXJXaWR0aCgpLG89TWF0aC5tYXgobyxzKX0pLGU9bysxLG49aXQodGhpcy5sYWJlbEludGVydmFsLHRoaXMuc2xvdER1cmF0aW9uKSxpPU1hdGguY2VpbChlL24pLHM9dGhpcy5oZWFkQ29sRWxzLmVxKDApLmNzcygibWluLXdpZHRoIikscyYmKHM9cGFyc2VJbnQocywxMCkscyYmKGk9TWF0aC5tYXgoaSxzKSkpLGl9LG8ucHJvdG90eXBlLmJ1aWxkQ29vcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyQ29vcmRDYWNoZS5idWlsZCgpLHRoaXMuc2xhdENvb3JkQ2FjaGUuYnVpbGQoKSx0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGUuYnVpbGQoKX0sby5wcm90b3R5cGUuY29tcHV0ZURhdGVTbmFwQ292ZXJhZ2U9ZnVuY3Rpb24odCl7dmFyIGUscixvO3JldHVybiByPW50KHRoaXMuc3RhcnQsdCx0aGlzLnNuYXBEdXJhdGlvbikscjwwPzA6cj49dGhpcy5zbmFwRGlmZlRvSW5kZXgubGVuZ3RoP3RoaXMuc25hcENudDoobz1NYXRoLmZsb29yKHIpLGU9dGhpcy5zbmFwRGlmZlRvSW5kZXhbb10sU3QoZSk/ZSs9ci1vOmU9TWF0aC5jZWlsKGUpLGUpfSxvLnByb3RvdHlwZS5kYXRlVG9Db29yZD1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpO3JldHVybiBpPXRoaXMuY29tcHV0ZURhdGVTbmFwQ292ZXJhZ2UodCksbz1pL3RoaXMuc25hcHNQZXJTbG90LHM9TWF0aC5mbG9vcihvKSxzPU1hdGgubWluKHMsdGhpcy5zbG90Q250LTEpLHI9by1zLGU9dGhpcy5zbGF0SW5uZXJDb29yZENhY2hlLHRoaXMuaXNSVEw/ZS5nZXRSaWdodFBvc2l0aW9uKHMpLWUuZ2V0V2lkdGgocykqci10aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUuZ2V0V2lkdGgoMCk6ZS5nZXRMZWZ0UG9zaXRpb24ocykrZS5nZXRXaWR0aChzKSpyfSxvLnByb3RvdHlwZS5yYW5nZVRvQ29vcmRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzUlRMP3tyaWdodDp0aGlzLmRhdGVUb0Nvb3JkKHQuc3RhcnQpLGxlZnQ6dGhpcy5kYXRlVG9Db29yZCh0LmVuZCl9OntsZWZ0OnRoaXMuZGF0ZVRvQ29vcmQodC5zdGFydCkscmlnaHQ6dGhpcy5kYXRlVG9Db29yZCh0LmVuZCl9fSxvLnByb3RvdHlwZS5oZWFkSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHQ9dGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5maW5kKCJ0YWJsZSIpLHQuaGVpZ2h0LmFwcGx5KHQsYXJndW1lbnRzKX0sby5wcm90b3R5cGUudXBkYXRlU2VnUG9zaXRpb25zPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocz0odGhpcy5zZWdzfHxbXSkuY29uY2F0KHRoaXMuYnVzaW5lc3NIb3VyU2Vnc3x8W10pLGU9MCxyPXMubGVuZ3RoO2U8cjtlKyspbz1zW2VdLHQ9dGhpcy5yYW5nZVRvQ29vcmRzKG8pLG8uZWwuY3NzKHtsZWZ0Om8ubGVmdD10LmxlZnQscmlnaHQ6LShvLnJpZ2h0PXQucmlnaHQpfSl9LG8ucHJvdG90eXBlLmNvbXB1dGVJbml0aWFsU2Nyb2xsPWZ1bmN0aW9uKHQpe3ZhciByLG87cmV0dXJuIHI9MCx0aGlzLmlzVGltZVNjYWxlJiYobz10aGlzLm9wdCgic2Nyb2xsVGltZSIpLG8mJihvPWUuZHVyYXRpb24obykscj10aGlzLmRhdGVUb0Nvb3JkKHRoaXMuc3RhcnQuY2xvbmUoKS50aW1lKG8pKSkpLHtsZWZ0OnIsdG9wOjB9fSxvLnByb3RvdHlwZS5xdWVyeVNjcm9sbD1mdW5jdGlvbigpe3JldHVybntsZWZ0OnRoaXMuYm9keVNjcm9sbGVyLmdldFNjcm9sbExlZnQoKSx0b3A6dGhpcy5ib2R5U2Nyb2xsZXIuZ2V0U2Nyb2xsVG9wKCl9fSxvLnByb3RvdHlwZS5zZXRTY3JvbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGVhZFNjcm9sbGVyLnNldFNjcm9sbExlZnQodC5sZWZ0KSx0aGlzLmhlYWRTY3JvbGxlci5zZXRTY3JvbGxMZWZ0KHQubGVmdCksdGhpcy5ib2R5U2Nyb2xsZXIuc2V0U2Nyb2xsVG9wKHQudG9wKX0sby5wcm90b3R5cGUucmVuZGVyRmdTZWdzPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMucmVuZGVyRmdTZWdFbHModCksdGhpcy5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnMoW1t0aGlzLHRdXSksdGhpcy51cGRhdGVTZWdGb2xsb3dlcnModCksdH0sby5wcm90b3R5cGUudW5yZW5kZXJGZ1NlZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGVhclNlZ0ZvbGxvd2VycygpLHRoaXMudW5yZW5kZXJGZ0NvbnRhaW5lcnMoW3RoaXNdKX0sby5wcm90b3R5cGUucmVuZGVyRmdTZWdzSW5Db250YWluZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZyx5LHYsdyxtLFMsUixiLEMsRSxIO2ZvcihvPTAsbj10Lmxlbmd0aDtvPG47bysrKWZvcihtPXRbb10sZT1tWzBdLEg9bVsxXSxzPTAsbD1ILmxlbmd0aDtzPGw7cysrKUU9SFtzXSxyPXRoaXMucmFuZ2VUb0Nvb3JkcyhFKSxFLmVsLmNzcyh7bGVmdDpFLmxlZnQ9ci5sZWZ0LHJpZ2h0Oi0oRS5yaWdodD1yLnJpZ2h0KX0pO2ZvcihpPTAsdT10Lmxlbmd0aDtpPHU7aSsrKWZvcihTPXRbaV0sZT1TWzBdLEg9U1sxXSxmPTAsaD1ILmxlbmd0aDtmPGg7ZisrKUU9SFtmXSxFLmVsLmFwcGVuZFRvKGUuc2VnQ29udGFpbmVyRWwpO2ZvcihnPTAsYT10Lmxlbmd0aDtnPGE7ZysrKXtmb3IoUj10W2ddLGU9UlswXSxIPVJbMV0seT0wLGM9SC5sZW5ndGg7eTxjO3krKylFPUhbeV0sRS5oZWlnaHQ9RS5lbC5vdXRlckhlaWdodCghMCk7dGhpcy5idWlsZFNlZ0xldmVscyhIKSxlLnNlZ0NvbnRhaW5lckhlaWdodD10dChIKX1mb3IoQz1bXSx2PTAscD10Lmxlbmd0aDt2PHA7disrKXtmb3IoYj10W3ZdLGU9YlswXSxIPWJbMV0sdz0wLGQ9SC5sZW5ndGg7dzxkO3crKylFPUhbd10sRS5lbC5jc3MoInRvcCIsRS50b3ApO0MucHVzaChlLnNlZ0NvbnRhaW5lckVsLmhlaWdodChlLnNlZ0NvbnRhaW5lckhlaWdodCkpfXJldHVybiBDfSxvLnByb3RvdHlwZS5idWlsZFNlZ0xldmVscz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbCx1LGgsYSxjLHAsZCxmO2ZvcihkPVtdLHRoaXMuc29ydEV2ZW50U2Vncyh0KSxvPTAsbj10Lmxlbmd0aDtvPG47bysrKXtmb3IoZj10W29dLGYuYWJvdmU9W10saD0wO2g8ZC5sZW5ndGg7KXtmb3Iocj0hMSxjPWRbaF0scz0wLGw9Yy5sZW5ndGg7czxsO3MrKylhPWNbc10sUHQoZixhKSYmKGYuYWJvdmUucHVzaChhKSxyPSEwKTtpZighcilicmVhaztoKz0xfWZvcigoZFtoXXx8KGRbaF09W10pKS5wdXNoKGYpLGgrPTE7aDxkLmxlbmd0aDspe2ZvcihwPWRbaF0saT0wLHU9cC5sZW5ndGg7aTx1O2krKyllPXBbaV0sUHQoZixlKSYmZS5hYm92ZS5wdXNoKGYpO2grPTF9fXJldHVybiBkfSxvLnByb3RvdHlwZS51bnJlbmRlckZnQ29udGFpbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scztmb3Iocz1bXSxyPTAsbz10Lmxlbmd0aDtyPG87cisrKWU9dFtyXSxlLnNlZ0NvbnRhaW5lckVsLmVtcHR5KCksZS5zZWdDb250YWluZXJFbC5oZWlnaHQoIiIpLHMucHVzaChlLnNlZ0NvbnRhaW5lckhlaWdodD1udWxsKTtyZXR1cm4gc30sby5wcm90b3R5cGUuZmdTZWdIdG1sPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbyxzLGksbixsO3JldHVybiBvPXQuZXZlbnQscz10aGlzLnZpZXcuaXNFdmVudERyYWdnYWJsZShvKSxuPXQuaXNTdGFydCYmdGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQobyksaT10LmlzRW5kJiZ0aGlzLnZpZXcuaXNFdmVudFJlc2l6YWJsZUZyb21FbmQobykscj10aGlzLmdldFNlZ0NsYXNzZXModCxzLG58fGkpLHIudW5zaGlmdCgiZmMtdGltZWxpbmUtZXZlbnQiLCJmYy1oLWV2ZW50IiksbD10aGlzLmdldEV2ZW50VGltZVRleHQobyksJzxhIGNsYXNzPSInK3Iuam9pbigiICIpKyciIHN0eWxlPSInK3J0KHRoaXMuZ2V0U2VnU2tpbkNzcyh0KSkrJyInKyhvLnVybD8nIGhyZWY9IicreXQoby51cmwpKyciJzoiIikrJz48ZGl2IGNsYXNzPSJmYy1jb250ZW50Ij4nKyhsPyc8c3BhbiBjbGFzcz0iZmMtdGltZSI+Jyt5dChsKSsiPC9zcGFuPiI6IiIpKyc8c3BhbiBjbGFzcz0iZmMtdGl0bGUiPicrKG8udGl0bGU/eXQoby50aXRsZSk6IiZuYnNwOyIpKyc8L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0iZmMtYmciIC8+Jysobj8nPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1zdGFydC1yZXNpemVyIj48L2Rpdj4nOiIiKSsoaT8nPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1lbmQtcmVzaXplciI+PC9kaXY+JzoiIikrIjwvYT4ifSxvLnByb3RvdHlwZS51cGRhdGVTZWdGb2xsb3dlcnM9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaTtpZih0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcil7Zm9yKHM9W10sZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKylvPXRbZV0saT1vLmVsLmZpbmQoIi5mYy10aXRsZSIpLGkubGVuZ3RoJiZzLnB1c2gobmV3IFAoaSkpO3JldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5zZXRTcHJpdGVzKHMpfX0sby5wcm90b3R5cGUuY2xlYXJTZWdGb2xsb3dlcnM9ZnVuY3Rpb24oKXtpZih0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcilyZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY2xlYXJTcHJpdGVzKCl9LG8ucHJvdG90eXBlLnNlZ0RyYWdTdGFydD1mdW5jdGlvbigpe2lmKG8uX19zdXBlcl9fLnNlZ0RyYWdTdGFydC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmZvcmNlUmVsYXRpdmUoKX0sby5wcm90b3R5cGUuc2VnRHJhZ0VuZD1mdW5jdGlvbigpe2lmKG8uX19zdXBlcl9fLnNlZ0RyYWdFbmQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKXJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jbGVhckZvcmNlKCl9LG8ucHJvdG90eXBlLnNlZ1Jlc2l6ZVN0YXJ0PWZ1bmN0aW9uKCl7aWYoby5fX3N1cGVyX18uc2VnUmVzaXplU3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKXJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5mb3JjZVJlbGF0aXZlKCl9LG8ucHJvdG90eXBlLnNlZ1Jlc2l6ZUVuZD1mdW5jdGlvbigpe2lmKG8uX19zdXBlcl9fLnNlZ1Jlc2l6ZUVuZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmNsZWFyRm9yY2UoKX0sby5wcm90b3R5cGUucmVuZGVySGVscGVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5ldmVudFRvU2Vncyh0KSxyPXRoaXMucmVuZGVyRmdTZWdFbHMociksdGhpcy5yZW5kZXJIZWxwZXJTZWdzSW5Db250YWluZXJzKFtbdGhpcyxyXV0sZSl9LG8ucHJvdG90eXBlLnJlbmRlckhlbHBlclNlZ3NJbkNvbnRhaW5lcnM9ZnVuY3Rpb24oZSxyKXt2YXIgbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZyx5LHYsdyxtLFM7Zm9yKG49W10sbT1bXSxsPTAsYT1lLmxlbmd0aDtsPGE7bCsrKWZvcihnPWVbbF0sbz1nWzBdLFM9Z1sxXSx1PTAsYz1TLmxlbmd0aDt1PGM7dSsrKXc9U1t1XSxzPXRoaXMucmFuZ2VUb0Nvb3Jkcyh3KSx3LmVsLmNzcyh7bGVmdDp3LmxlZnQ9cy5sZWZ0LHJpZ2h0Oi0ody5yaWdodD1zLnJpZ2h0KX0pLHImJnIucmVzb3VyY2VJZD09PShudWxsIT0oeT1vLnJlc291cmNlKT95LmlkOnZvaWQgMCk/dy5lbC5jc3MoInRvcCIsci5lbC5jc3MoInRvcCIpKTp3LmVsLmNzcygidG9wIiwwKTtmb3IoaD0wLHA9ZS5sZW5ndGg7aDxwO2grKylmb3Iodj1lW2hdLG89dlswXSxTPXZbMV0saT10KCc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIgZmMtaGVscGVyLWNvbnRhaW5lciIvPicpLmFwcGVuZFRvKG8uaW5uZXJFbCksbi5wdXNoKGlbMF0pLGY9MCxkPVMubGVuZ3RoO2Y8ZDtmKyspdz1TW2ZdLGkuYXBwZW5kKHcuZWwpLG0ucHVzaCh3LmVsWzBdKTtyZXR1cm4gdGhpcy5oZWxwZXJFbHM/dGhpcy5oZWxwZXJFbHM9dGhpcy5oZWxwZXJFbHMuYWRkKHQobikpOnRoaXMuaGVscGVyRWxzPXQobiksdChtKX0sby5wcm90b3R5cGUudW5yZW5kZXJIZWxwZXI9ZnVuY3Rpb24oKXtpZih0aGlzLmhlbHBlckVscylyZXR1cm4gdGhpcy5oZWxwZXJFbHMucmVtb3ZlKCksdGhpcy5oZWxwZXJFbHM9bnVsbH0sby5wcm90b3R5cGUucmVuZGVyRXZlbnRSZXNpemU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWdobGlnaHQodGhpcy5ldmVudFRvU3Bhbih0KSksdGhpcy5yZW5kZXJFdmVudExvY2F0aW9uSGVscGVyKHQsZSl9LG8ucHJvdG90eXBlLnVucmVuZGVyRXZlbnRSZXNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnJlbmRlckhpZ2hsaWdodCgpLHRoaXMudW5yZW5kZXJIZWxwZXIoKX0sby5wcm90b3R5cGUucmVuZGVyRmlsbD1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9dGhpcy5yZW5kZXJGaWxsU2VnRWxzKHQsZSksdGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXJzKHQsW1t0aGlzLGVdXSxyKSxlfSxvLnByb3RvdHlwZS5yZW5kZXJGaWxsSW5Db250YWluZXJzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxzLGksbixsLHU7Zm9yKGw9W10scz0wLGk9ZS5sZW5ndGg7czxpO3MrKyluPWVbc10sbz1uWzBdLHU9blsxXSxsLnB1c2godGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXIodCxvLHUscikpO3JldHVybiBsfSxvLnByb3RvdHlwZS5yZW5kZXJGaWxsSW5Db250YWluZXI9ZnVuY3Rpb24oZSxyLG8scyl7dmFyIGksbixsLHUsaDtpZihvLmxlbmd0aCl7Zm9yKHN8fChzPWUudG9Mb3dlckNhc2UoKSksaT10KCc8ZGl2IGNsYXNzPSJmYy0nK3MrJy1jb250YWluZXIiIC8+JykuYXBwZW5kVG8oci5iZ1NlZ0NvbnRhaW5lckVsKSxsPTAsdT1vLmxlbmd0aDtsPHU7bCsrKWg9b1tsXSxuPXRoaXMucmFuZ2VUb0Nvb3JkcyhoKSxoLmVsLmNzcyh7bGVmdDpoLmxlZnQ9bi5sZWZ0LHJpZ2h0Oi0oaC5yaWdodD1uLnJpZ2h0KX0pLGguZWwuYXBwZW5kVG8oaSk7cmV0dXJuIHRoaXMuZWxzQnlGaWxsW2VdP3RoaXMuZWxzQnlGaWxsW2VdPXRoaXMuZWxzQnlGaWxsW2VdLmFkZChpKTp0aGlzLmVsc0J5RmlsbFtlXT1pfX0sby5wcm90b3R5cGUucmVuZGVyRHJhZz1mdW5jdGlvbih0LGUpe3JldHVybiBlP3RoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcih0LGUpOih0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKHQpKSxudWxsKX0sby5wcm90b3R5cGUudW5yZW5kZXJEcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5yZW5kZXJIZWxwZXIoKSx0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCl9LG99KGYpLHR0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO2ZvcihvPTAsZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKylzPXRbZV0sbz1NYXRoLm1heChvLFoocykpO3JldHVybiBvfSxaPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10LnRvcCYmKHQudG9wPXR0KHQuYWJvdmUpKSx0LnRvcCt0LmhlaWdodH0sUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5sZWZ0PGUucmlnaHQmJnQucmlnaHQ+ZS5sZWZ0fSxSPTE4LG09Nix3PTIwMCxTPTFlMyx1PXttb250aHM6MX0saz1be3llYXJzOjF9LHttb250aHM6MX0se2RheXM6MX0se2hvdXJzOjF9LHttaW51dGVzOjMwfSx7bWludXRlczoxNX0se21pbnV0ZXM6MTB9LHttaW51dGVzOjV9LHttaW51dGVzOjF9LHtzZWNvbmRzOjMwfSx7c2Vjb25kczoxNX0se3NlY29uZHM6MTB9LHtzZWNvbmRzOjV9LHtzZWNvbmRzOjF9LHttaWxsaXNlY29uZHM6NTAwfSx7bWlsbGlzZWNvbmRzOjEwMH0se21pbGxpc2Vjb25kczoxMH0se21pbGxpc2Vjb25kczoxfV0sTi5wcm90b3R5cGUuaW5pdFNjYWxlUHJvcHM9ZnVuY3Rpb24oKXt2YXIgZSxyLG87cmV0dXJuIHRoaXMubGFiZWxJbnRlcnZhbD10aGlzLnF1ZXJ5RHVyYXRpb25PcHRpb24oInNsb3RMYWJlbEludGVydmFsIiksdGhpcy5zbG90RHVyYXRpb249dGhpcy5xdWVyeUR1cmF0aW9uT3B0aW9uKCJzbG90RHVyYXRpb24iKSx0aGlzLmVuc3VyZUdyaWREdXJhdGlvbigpLHRoaXMudmFsaWRhdGVMYWJlbEFuZFNsb3QoKSx0aGlzLmVuc3VyZUxhYmVsSW50ZXJ2YWwoKSx0aGlzLmVuc3VyZVNsb3REdXJhdGlvbigpLGU9dGhpcy5vcHQoInNsb3RMYWJlbEZvcm1hdCIpLG89dC50eXBlKGUpLHRoaXMuaGVhZGVyRm9ybWF0cz0iYXJyYXkiPT09bz9lOiJzdHJpbmciPT09bz9bZV06dGhpcy5jb21wdXRlSGVhZGVyRm9ybWF0cygpLHRoaXMuaXNUaW1lU2NhbGU9bHQodGhpcy5zbG90RHVyYXRpb24pLHRoaXMubGFyZ2VVbml0PXRoaXMuaXNUaW1lU2NhbGU/dm9pZCAwOihyPUoodGhpcy5zbG90RHVyYXRpb24pLC95ZWFyfG1vbnRofHdlZWsvLnRlc3Qocik/cjp2b2lkIDApLHRoaXMuZW1waGFzaXplV2Vla3M9MT09PXRoaXMuc2xvdER1cmF0aW9uLmFzKCJkYXlzIikmJnRoaXMuZHVyYXRpb24uYXMoIndlZWtzIik+PTImJiF0aGlzLm9wdCgiYnVzaW5lc3NIb3VycyIpfSxOLnByb3RvdHlwZS5xdWVyeUR1cmF0aW9uT3B0aW9uPWZ1bmN0aW9uKHQpe3ZhciByLG87aWYobz10aGlzLm9wdCh0KSxudWxsIT1vJiYocj1lLmR1cmF0aW9uKG8pLCtyKSlyZXR1cm4gcn0sTi5wcm90b3R5cGUudmFsaWRhdGVMYWJlbEFuZFNsb3Q9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7aWYodGhpcy5sYWJlbEludGVydmFsJiYodD1pdCh0aGlzLmR1cmF0aW9uLHRoaXMubGFiZWxJbnRlcnZhbCksdD5TJiYoZC53YXJuKCJzbG90TGFiZWxJbnRlcnZhbCByZXN1bHRzIGluIHRvbyBtYW55IGNlbGxzIiksdGhpcy5sYWJlbEludGVydmFsPW51bGwpKSx0aGlzLnNsb3REdXJhdGlvbiYmKGU9aXQodGhpcy5kdXJhdGlvbix0aGlzLnNsb3REdXJhdGlvbiksZT5TJiYoZC53YXJuKCJzbG90RHVyYXRpb24gcmVzdWx0cyBpbiB0b28gbWFueSBjZWxscyIpLHRoaXMuc2xvdER1cmF0aW9uPW51bGwpKSx0aGlzLmxhYmVsSW50ZXJ2YWwmJnRoaXMuc2xvdER1cmF0aW9uJiYocj1pdCh0aGlzLmxhYmVsSW50ZXJ2YWwsdGhpcy5zbG90RHVyYXRpb24pLCFTdChyKXx8cjwxKSlyZXR1cm4gZC53YXJuKCJzbG90TGFiZWxJbnRlcnZhbCBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc2xvdER1cmF0aW9uIiksdGhpcy5zbG90RHVyYXRpb249bnVsbH0sTi5wcm90b3R5cGUuZW5zdXJlR3JpZER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQscixvLHMsaTtpZih0PXRoaXMuZHVyYXRpb24sIXQpe2lmKHQ9dGhpcy52aWV3LmludGVydmFsRHVyYXRpb24sIXQpaWYodGhpcy5sYWJlbEludGVydmFsfHx0aGlzLnNsb3REdXJhdGlvbilmb3IoaT10aGlzLmVuc3VyZUxhYmVsSW50ZXJ2YWwoKSxvPWsubGVuZ3RoLTE7bz49MCYmKHI9a1tvXSx0PWUuZHVyYXRpb24ocikscz1pdCh0LGkpLCEocz49UikpO28rPS0xKTtlbHNlIHQ9ZS5kdXJhdGlvbih1KTt0aGlzLmR1cmF0aW9uPXR9cmV0dXJuIHR9LE4ucHJvdG90eXBlLmVuc3VyZUxhYmVsSW50ZXJ2YWw9ZnVuY3Rpb24oKXt2YXIgdCxyLG8scyxpLG4sbCx1LGg7aWYoaT10aGlzLmxhYmVsSW50ZXJ2YWwsIWkpe2lmKHRoaXMuZHVyYXRpb258fHRoaXMuc2xvdER1cmF0aW9ufHx0aGlzLmVuc3VyZUdyaWREdXJhdGlvbigpLHRoaXMuc2xvdER1cmF0aW9uKXtmb3Iocj0wLG49ay5sZW5ndGg7cjxuO3IrKylpZih0PWtbcl0saD1lLmR1cmF0aW9uKHQpLHU9aXQoaCx0aGlzLnNsb3REdXJhdGlvbiksU3QodSkmJnU8PW0pe2k9aDticmVha31pfHwoaT10aGlzLnNsb3REdXJhdGlvbil9ZWxzZSBmb3Iobz0wLGw9ay5sZW5ndGg7bzxsJiYodD1rW29dLGk9ZS5kdXJhdGlvbih0KSxzPWl0KHRoaXMuZHVyYXRpb24saSksIShzPj1SKSk7bysrKTt0aGlzLmxhYmVsSW50ZXJ2YWw9aX1yZXR1cm4gaX0sTi5wcm90b3R5cGUuZW5zdXJlU2xvdER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQscixvLHMsaSxuLGwsdTtpZihuPXRoaXMuc2xvdER1cmF0aW9uLCFuKXtmb3Iobz10aGlzLmVuc3VyZUxhYmVsSW50ZXJ2YWwoKSxyPTAscz1rLmxlbmd0aDtyPHM7cisrKWlmKHQ9a1tyXSx1PWUuZHVyYXRpb24odCksbD1pdChvLHUpLFN0KGwpJiZsPjEmJmw8PW0pe249dTticmVha31uJiZ0aGlzLmR1cmF0aW9uJiYoaT1pdCh0aGlzLmR1cmF0aW9uLG4pLGk+dyYmKG49bnVsbCkpLG58fChuPW8pLHRoaXMuc2xvdER1cmF0aW9uPW59cmV0dXJuIG59LE4ucHJvdG90eXBlLmNvbXB1dGVIZWFkZXJGb3JtYXRzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scyxpLG4sbDtzd2l0Y2gobj10aGlzLnZpZXcsbz10aGlzLmR1cmF0aW9uLHM9dGhpcy5sYWJlbEludGVydmFsLGk9SihzKSxsPXRoaXMub3B0KCJ3ZWVrTnVtYmVycyIpLHQ9ZT1yPW51bGwsIndlZWsiIT09aXx8bHx8KGk9ImRheSIpLGkpe2Nhc2UieWVhciI6dD0iWVlZWSI7YnJlYWs7Y2FzZSJtb250aCI6by5hc1llYXJzKCk+MSYmKHQ9IllZWVkiKSxlPSJNTU0iO2JyZWFrO2Nhc2Uid2VlayI6by5hc1llYXJzKCk+MSYmKHQ9IllZWVkiKSxlPXRoaXMub3B0KCJzaG9ydFdlZWtGb3JtYXQiKTticmVhaztjYXNlImRheSI6by5hc1llYXJzKCk+MT90PXRoaXMub3B0KCJtb250aFllYXJGb3JtYXQiKTpvLmFzTW9udGhzKCk+MSYmKHQ9Ik1NTU0iKSxsJiYoZT10aGlzLm9wdCgid2Vla0Zvcm1hdCIpKSxyPSJkZCBEIjticmVhaztjYXNlImhvdXIiOmwmJih0PXRoaXMub3B0KCJ3ZWVrRm9ybWF0IikpLG8uYXNEYXlzKCk+MSYmKGU9dGhpcy5vcHQoImRheU9mTW9udGhGb3JtYXQiKSkscj10aGlzLm9wdCgic21hbGxUaW1lRm9ybWF0Iik7YnJlYWs7Y2FzZSJtaW51dGUiOnMuYXNNaW51dGVzKCkvNjA+PW0/KHQ9dGhpcy5vcHQoImhvdXJGb3JtYXQiKSxlPSJbOl1tbSIpOnQ9dGhpcy5vcHQoIm1lZGl1bVRpbWVGb3JtYXQiKTticmVhaztjYXNlInNlY29uZCI6cy5hc1NlY29uZHMoKS82MD49bT8odD0iTFQiLGU9Ils6XXNzIik6dD0iTFRTIjticmVhaztjYXNlIm1pbGxpc2Vjb25kIjp0PSJMVFMiLGU9IlsuXVNTUyJ9cmV0dXJuW10uY29uY2F0KHR8fFtdLGV8fFtdLHJ8fFtdKX0sZC52aWV3cy50aW1lbGluZT17ImNsYXNzIjpqLGRlZmF1bHRzOntldmVudFJlc2l6YWJsZUZyb21TdGFydDohMH19LGQudmlld3MudGltZWxpbmVEYXk9e3R5cGU6InRpbWVsaW5lIixkdXJhdGlvbjp7ZGF5czoxfX0sZC52aWV3cy50aW1lbGluZVdlZWs9e3R5cGU6InRpbWVsaW5lIixkdXJhdGlvbjp7d2Vla3M6MX19LGQudmlld3MudGltZWxpbmVNb250aD17dHlwZToidGltZWxpbmUiLGR1cmF0aW9uOnttb250aHM6MX19LGQudmlld3MudGltZWxpbmVZZWFyPXt0eXBlOiJ0aW1lbGluZSIsZHVyYXRpb246e3llYXJzOjF9fSxNPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIubWl4aW4oVyksci5wcm90b3R5cGUucmVzb3VyY2VHcmlkPW51bGwsci5wcm90b3R5cGUudGJvZHlIYXNoPW51bGwsci5wcm90b3R5cGUuam9pbmVyPW51bGwsci5wcm90b3R5cGUuZGl2aWRlckVscz1udWxsLHIucHJvdG90eXBlLnN1cGVySGVhZGVyVGV4dD1udWxsLHIucHJvdG90eXBlLmlzVkdyb3VwaW5nPW51bGwsci5wcm90b3R5cGUuaXNIR3JvdXBpbmc9bnVsbCxyLnByb3RvdHlwZS5ncm91cFNwZWNzPW51bGwsci5wcm90b3R5cGUuY29sU3BlY3M9bnVsbCxyLnByb3RvdHlwZS5vcmRlclNwZWNzPW51bGwsci5wcm90b3R5cGUucm93SGllcmFyY2h5PW51bGwsci5wcm90b3R5cGUucmVzb3VyY2VSb3dIYXNoPW51bGwsci5wcm90b3R5cGUubmVzdGluZ0NudD0wLHIucHJvdG90eXBlLmlzTmVzdGluZz1udWxsLHIucHJvdG90eXBlLmRpdmlkZXJXaWR0aD1udWxsLHIucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gci5fX3N1cGVyX18uaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wcm9jZXNzUmVzb3VyY2VPcHRpb25zKCksdGhpcy5yZXNvdXJjZUdyaWQ9bmV3IHEodGhpcyksdGhpcy5yb3dIaWVyYXJjaHk9bmV3IHoodGhpcyksdGhpcy5yZXNvdXJjZVJvd0hhc2g9e319LHIucHJvdG90eXBlLmluc3RhbnRpYXRlR3JpZD1mdW5jdGlvbigpe3JldHVybiBuZXcgRyh0aGlzKX0sci5wcm90b3R5cGUucHJvY2Vzc1Jlc291cmNlT3B0aW9ucz1mdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHksdix3LG0sUyxSO2Zvcih0PXRoaXMub3B0KCJyZXNvdXJjZUNvbHVtbnMiKXx8W10sZj10aGlzLm9wdCgicmVzb3VyY2VMYWJlbFRleHQiKSxvPSJSZXNvdXJjZXMiLFI9bnVsbCx0Lmxlbmd0aD9SPWY6dC5wdXNoKHtsYWJlbFRleHQ6Znx8byx0ZXh0OnRoaXMuZ2V0UmVzb3VyY2VUZXh0RnVuYygpfSksbT1bXSxzPVtdLG49W10sYT0hMSxoPSExLGM9MCxnPXQubGVuZ3RoO2M8ZztjKyspcj10W2NdLHIuZ3JvdXA/cy5wdXNoKHIpOm0ucHVzaChyKTtmb3IobVswXS5pc01haW49ITAscy5sZW5ndGg/KG49cyxhPSEwKToobD10aGlzLm9wdCgicmVzb3VyY2VHcm91cEZpZWxkIiksbCYmKGg9ITAsbi5wdXNoKHtmaWVsZDpsLHRleHQ6dGhpcy5vcHQoInJlc291cmNlR3JvdXBUZXh0IikscmVuZGVyOnRoaXMub3B0KCJyZXNvdXJjZUdyb3VwUmVuZGVyIil9KSkpLGU9RnQodGhpcy5vcHQoInJlc291cmNlT3JkZXIiKSksUz1bXSxwPTAseT1lLmxlbmd0aDtwPHk7cCsrKXtmb3Iodz1lW3BdLHU9ITEsZD0wLHY9bi5sZW5ndGg7ZDx2O2QrKylpZihpPW5bZF0saS5maWVsZD09PXcuZmllbGQpe2kub3JkZXI9dy5vcmRlcix1PSEwO2JyZWFrfXV8fFMucHVzaCh3KX1yZXR1cm4gdGhpcy5zdXBlckhlYWRlclRleHQ9Uix0aGlzLmlzVkdyb3VwaW5nPWEsdGhpcy5pc0hHcm91cGluZz1oLHRoaXMuZ3JvdXBTcGVjcz1uLHRoaXMuY29sU3BlY3M9cy5jb25jYXQobSksdGhpcy5vcmRlclNwZWNzPVN9LHIucHJvdG90eXBlLnJlbmRlclNrZWxldG9uPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX19zdXBlcl9fLnJlbmRlclNrZWxldG9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlbmRlclJlc291cmNlR3JpZFNrZWxldG9uKCksdGhpcy50Ym9keUhhc2g9e3NwcmVhZHNoZWV0OnRoaXMucmVzb3VyY2VHcmlkLnRib2R5RWwsZXZlbnQ6dGhpcy50aW1lR3JpZC50Ym9keUVsfSx0aGlzLmpvaW5lcj1uZXcgQSgidmVydGljYWwiLFt0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIsdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXJdKSx0aGlzLmluaXREaXZpZGVyTW92aW5nKCl9LHIucHJvdG90eXBlLnJlbmRlclNrZWxldG9uSHRtbD1mdW5jdGlvbigpe3JldHVybic8dGFibGU+IDx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+IDx0cj4gPHRkIGNsYXNzPSJmYy1yZXNvdXJjZS1hcmVhICcrdGhpcy53aWRnZXRIZWFkZXJDbGFzcysnIj48L3RkPiA8dGQgY2xhc3M9ImZjLWRpdmlkZXIgZmMtY29sLXJlc2l6ZXIgJyt0aGlzLndpZGdldEhlYWRlckNsYXNzKyciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtdGltZS1hcmVhICcrdGhpcy53aWRnZXRIZWFkZXJDbGFzcysnIj48L3RkPiA8L3RyPiA8L3RoZWFkPiA8dGJvZHkgY2xhc3M9ImZjLWJvZHkiPiA8dHI+IDx0ZCBjbGFzcz0iZmMtcmVzb3VyY2UtYXJlYSAnK3RoaXMud2lkZ2V0Q29udGVudENsYXNzKyciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtZGl2aWRlciBmYy1jb2wtcmVzaXplciAnK3RoaXMud2lkZ2V0SGVhZGVyQ2xhc3MrJyI+PC90ZD4gPHRkIGNsYXNzPSJmYy10aW1lLWFyZWEgJyt0aGlzLndpZGdldENvbnRlbnRDbGFzcysnIj48L3RkPiA8L3RyPiA8L3Rib2R5PiA8L3RhYmxlPic7Cn0sci5wcm90b3R5cGUucmVuZGVyUmVzb3VyY2VHcmlkU2tlbGV0b249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNvdXJjZUdyaWQuZWw9dGhpcy5lbC5maW5kKCJ0Ym9keSAuZmMtcmVzb3VyY2UtYXJlYSIpLHRoaXMucmVzb3VyY2VHcmlkLmhlYWRFbD10aGlzLmVsLmZpbmQoInRoZWFkIC5mYy1yZXNvdXJjZS1hcmVhIiksdGhpcy5yZXNvdXJjZUdyaWQucmVuZGVyU2tlbGV0b24oKX0sci5wcm90b3R5cGUuaW5pdERpdmlkZXJNb3Zpbmc9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy5kaXZpZGVyRWxzPXRoaXMuZWwuZmluZCgiLmZjLWRpdmlkZXIiKSx0aGlzLmRpdmlkZXJXaWR0aD1udWxsIT0odD10aGlzLm9wdCgicmVzb3VyY2VBcmVhV2lkdGgiKSk/dDp0aGlzLnJlc291cmNlR3JpZC50YWJsZVdpZHRoLG51bGwhPXRoaXMuZGl2aWRlcldpZHRoJiZ0aGlzLnBvc2l0aW9uRGl2aWRlcih0aGlzLmRpdmlkZXJXaWR0aCksdGhpcy5kaXZpZGVyRWxzLm9uKCJtb3VzZWRvd24iLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5kaXZpZGVyTW91c2Vkb3duKGUpfX0odGhpcykpfSxyLnByb3RvdHlwZS5kaXZpZGVyTW91c2Vkb3duPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGk7cmV0dXJuIHI9dGhpcy5vcHQoImlzUlRMIikscz0zMCxvPXRoaXMuZWwud2lkdGgoKS0zMCxpPXRoaXMuZ2V0TmF0dXJhbERpdmlkZXJXaWR0aCgpLGU9bmV3IGgoe2RyYWdTdGFydDpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5kaXZpZGVyRWxzLmFkZENsYXNzKCJmYy1hY3RpdmUiKX19KHRoaXMpLGRyYWc6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGw7cmV0dXJuIGw9cj9pLWU6aStlLGw9TWF0aC5tYXgobCxzKSxsPU1hdGgubWluKGwsbyksdC5kaXZpZGVyV2lkdGg9bCx0LnBvc2l0aW9uRGl2aWRlcihsKSx0LnVwZGF0ZVdpZHRoKCl9fSh0aGlzKSxkcmFnRW5kOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmRpdmlkZXJFbHMucmVtb3ZlQ2xhc3MoImZjLWFjdGl2ZSIpfX0odGhpcyl9KSxlLnN0YXJ0SW50ZXJhY3Rpb24odCl9LHIucHJvdG90eXBlLmdldE5hdHVyYWxEaXZpZGVyV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5maW5kKCIuZmMtcmVzb3VyY2UtYXJlYSIpLndpZHRoKCl9LHIucHJvdG90eXBlLnBvc2l0aW9uRGl2aWRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbC5maW5kKCIuZmMtcmVzb3VyY2UtYXJlYSIpLndpZHRoKHQpfSxyLnByb3RvdHlwZS5yZW5kZXJFdmVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKHQpLHRoaXMuc3luY1Jvd0hlaWdodHMoKSx0aGlzLnVwZGF0ZVdpZHRoKCl9LHIucHJvdG90eXBlLnVucmVuZGVyRXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKSx0aGlzLnN5bmNSb3dIZWlnaHRzKCksdGhpcy51cGRhdGVXaWR0aCgpfSxyLnByb3RvdHlwZS51cGRhdGVXaWR0aD1mdW5jdGlvbigpe2lmKHIuX19zdXBlcl9fLnVwZGF0ZVdpZHRoLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlc291cmNlR3JpZC51cGRhdGVXaWR0aCgpLHRoaXMuam9pbmVyLnVwZGF0ZSgpLHRoaXMuY2VsbEZvbGxvd2VyKXJldHVybiB0aGlzLmNlbGxGb2xsb3dlci51cGRhdGUoKX0sci5wcm90b3R5cGUudXBkYXRlSGVpZ2h0PWZ1bmN0aW9uKHQpe2lmKHIuX19zdXBlcl9fLnVwZGF0ZUhlaWdodC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdClyZXR1cm4gdGhpcy5zeW5jUm93SGVpZ2h0cygpfSxyLnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24odCxlKXt2YXIgcixvO3JldHVybiBvPXRoaXMuc3luY0hlYWRIZWlnaHRzKCkscj1lPyJhdXRvIjp0LW8tdGhpcy5xdWVyeU1pc2NIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmJvZHlTY3JvbGxlci5zZXRIZWlnaHQociksdGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLnNldEhlaWdodChyKX0sci5wcm90b3R5cGUucXVlcnlNaXNjSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWwub3V0ZXJIZWlnaHQoKS1NYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmhlYWRTY3JvbGxlci5lbC5vdXRlckhlaWdodCgpKS1NYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmJvZHlTY3JvbGxlci5lbC5vdXRlckhlaWdodCgpKX0sci5wcm90b3R5cGUuc3luY0hlYWRIZWlnaHRzPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMucmVzb3VyY2VHcmlkLmhlYWRIZWlnaHQoImF1dG8iKSx0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoImF1dG8iKSx0PU1hdGgubWF4KHRoaXMucmVzb3VyY2VHcmlkLmhlYWRIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoKSksdGhpcy5yZXNvdXJjZUdyaWQuaGVhZEhlaWdodCh0KSx0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQodCksdH0sci5wcm90b3R5cGUuc2Nyb2xsVG9SZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5zY3JvbGxUb1Jlc291cmNlKHQpfSxyLnByb3RvdHlwZS5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7dmFyIGUscixvO2Zvcih0aGlzLmJhdGNoUm93cygpLGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspbz10W2VdLHRoaXMuaW5zZXJ0UmVzb3VyY2Uobyk7cmV0dXJuIHRoaXMucm93SGllcmFyY2h5LnNob3coKSx0aGlzLnVuYmF0Y2hSb3dzKCksdGhpcy5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzKCl9LHIucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xlYXJFdmVudHMoKSx0aGlzLmJhdGNoUm93cygpLHRoaXMucm93SGllcmFyY2h5LnJlbW92ZUNoaWxkcmVuKCksdGhpcy51bmJhdGNoUm93cygpLHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpfSxyLnByb3RvdHlwZS5hZGRSZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnNlcnRSZXNvdXJjZSh0KSx0aGlzLnJlaW5pdGlhbGl6ZUNlbGxGb2xsb3dlcnMoKX0sci5wcm90b3R5cGUucmVtb3ZlUmVzb3VyY2U9ZnVuY3Rpb24odCl7dmFyIGU7aWYoZT10aGlzLmdldFJlc291cmNlUm93KHQuaWQpKXJldHVybiB0aGlzLmJhdGNoUm93cygpLGUucmVtb3ZlKCksdGhpcy51bmJhdGNoUm93cygpLHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpfSxyLnByb3RvdHlwZS5jZWxsRm9sbG93ZXI9bnVsbCxyLnByb3RvdHlwZS5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzPWZ1bmN0aW9uKCl7dmFyIGUscixvLHMsaSxuO2Zvcih0aGlzLmNlbGxGb2xsb3dlciYmdGhpcy5jZWxsRm9sbG93ZXIuY2xlYXJTcHJpdGVzKCksdGhpcy5jZWxsRm9sbG93ZXI9bmV3IFYodGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLHRoaXMuY2FsZW5kYXIuaXNUb3VjaCksdGhpcy5jZWxsRm9sbG93ZXIuaXNIRm9sbG93aW5nPSExLHRoaXMuY2VsbEZvbGxvd2VyLmlzVkZvbGxvd2luZz0hMCxzPVtdLGk9dGhpcy5yb3dIaWVyYXJjaHkuZ2V0Tm9kZXMoKSxyPTAsbz1pLmxlbmd0aDtyPG87cisrKW49aVtyXSxuIGluc3RhbmNlb2YgVSYmbi5ncm91cFRkJiYoZT1uLmdyb3VwVGQuZmluZCgiLmZjLWNlbGwtY29udGVudCIpLGUubGVuZ3RoJiZzLnB1c2goZVswXSkpO3JldHVybiB0aGlzLmNlbGxGb2xsb3dlci5zZXRTcHJpdGVzKHQocykpfSxyLnByb3RvdHlwZS5pbnNlcnRSZXNvdXJjZT1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpLG4sbCx1O2Zvcih1PW5ldyBCKHRoaXMsdCksbnVsbD09ZSYmKGk9dC5wYXJlbnRJZCxpJiYoZT10aGlzLmdldFJlc291cmNlUm93KGkpKSksZT90aGlzLmluc2VydFJvd0FzQ2hpbGQodSxlKTp0aGlzLmluc2VydFJvdyh1KSxuPXQuY2hpbGRyZW4sbD1bXSxvPTAscz1uLmxlbmd0aDtvPHM7bysrKXI9bltvXSxsLnB1c2godGhpcy5pbnNlcnRSZXNvdXJjZShyLHUpKTtyZXR1cm4gbH0sci5wcm90b3R5cGUuaW5zZXJ0Um93PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbztyZXR1cm4gbnVsbD09ZSYmKGU9dGhpcy5yb3dIaWVyYXJjaHkpLG51bGw9PXImJihyPXRoaXMuZ3JvdXBTcGVjcyksci5sZW5ndGg/KG89dGhpcy5lbnN1cmVSZXNvdXJjZUdyb3VwKHQsZSxyWzBdKSxvIGluc3RhbmNlb2YgZz90aGlzLmluc2VydFJvd0FzQ2hpbGQodCxvKTp0aGlzLmluc2VydFJvdyh0LG8sci5zbGljZSgxKSkpOnRoaXMuaW5zZXJ0Um93QXNDaGlsZCh0LGUpfSxyLnByb3RvdHlwZS5pbnNlcnRSb3dBc0NoaWxkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuYWRkQ2hpbGQodCx0aGlzLmNvbXB1dGVDaGlsZFJvd1Bvc2l0aW9uKHQsZSkpfSxyLnByb3RvdHlwZS5jb21wdXRlQ2hpbGRSb3dQb3NpdGlvbj1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpLG4sbDtpZih0aGlzLm9yZGVyU3BlY3MubGVuZ3RoKWZvcihuPWUuY2hpbGRyZW4sbz1zPTAsaT1uLmxlbmd0aDtzPGk7bz0rK3MpaWYobD1uW29dLHI9dGhpcy5jb21wYXJlUmVzb3VyY2VzKGwucmVzb3VyY2V8fHt9LHQucmVzb3VyY2V8fHt9KSxyPjApcmV0dXJuIG87cmV0dXJuIG51bGx9LHIucHJvdG90eXBlLmNvbXBhcmVSZXNvdXJjZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUSh0LGUsdGhpcy5vcmRlclNwZWNzKX0sci5wcm90b3R5cGUuZW5zdXJlUmVzb3VyY2VHcm91cD1mdW5jdGlvbih0LGUscil7dmFyIG8scyxpLG4sbCx1LGgsYSxjLHAsZDtpZihpPSh0LnJlc291cmNlfHx7fSlbci5maWVsZF0scz1udWxsLHIub3JkZXIpZm9yKGM9ZS5jaGlsZHJlbixuPWw9MCxoPWMubGVuZ3RoO2w8aDtuPSsrbCl7aWYoZD1jW25dLG89dXQoZC5ncm91cFZhbHVlLGkpKnIub3JkZXIsMD09PW8pe3M9ZDticmVha31pZihvPjApYnJlYWt9ZWxzZSBmb3IocD1lLmNoaWxkcmVuLG49dT0wLGE9cC5sZW5ndGg7dTxhO249Kyt1KWlmKGQ9cFtuXSxkLmdyb3VwVmFsdWU9PT1pKXtzPWQ7YnJlYWt9cmV0dXJuIHN8fChzPXRoaXMuaXNWR3JvdXBpbmc/bmV3IFUodGhpcyxyLGkpOm5ldyBnKHRoaXMscixpKSxlLmFkZENoaWxkKHMsbikpLHN9LHIucHJvdG90eXBlLnBhaXJTZWdzV2l0aFJvd3M9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaSxuLGwsdTtmb3Iocz1bXSxpPXt9LGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspdT10W2VdLG49dS5yZXNvdXJjZUlkLG4mJihsPXRoaXMuZ2V0UmVzb3VyY2VSb3cobiksbCYmKG89aVtuXSxvfHwobz1bbCxbXV0scy5wdXNoKG8pLGlbbl09byksb1sxXS5wdXNoKHUpKSk7cmV0dXJuIHN9LHIucHJvdG90eXBlLnJvd0FkZGVkPWZ1bmN0aW9uKHQpe3ZhciBlLHI7cmV0dXJuIHQgaW5zdGFuY2VvZiBCJiYodGhpcy5yZXNvdXJjZVJvd0hhc2hbdC5yZXNvdXJjZS5pZF09dCx0aGlzLnRpbWVHcmlkLmFzc2lnblJvd0J1c2luZXNzSG91clNlZ3ModCkpLHI9dGhpcy5pc05lc3RpbmcsZT1Cb29sZWFuKHRoaXMubmVzdGluZ0NudCs9dC5kZXB0aD8xOjApLHIhPT1lJiYodGhpcy5lbC50b2dnbGVDbGFzcygiZmMtbmVzdGVkIixlKSx0aGlzLmVsLnRvZ2dsZUNsYXNzKCJmYy1mbGF0IiwhZSkpLHRoaXMuaXNOZXN0aW5nPWV9LHIucHJvdG90eXBlLnJvd1JlbW92ZWQ9ZnVuY3Rpb24odCl7dmFyIGUscjtyZXR1cm4gdCBpbnN0YW5jZW9mIEImJihkZWxldGUgdGhpcy5yZXNvdXJjZVJvd0hhc2hbdC5yZXNvdXJjZS5pZF0sdGhpcy50aW1lR3JpZC5kZXN0cm95Um93QnVzaW5lc3NIb3VyU2Vncyh0KSkscj10aGlzLmlzTmVzdGluZyxlPUJvb2xlYW4odGhpcy5uZXN0aW5nQ250LT10LmRlcHRoPzE6MCksciE9PWUmJih0aGlzLmVsLnRvZ2dsZUNsYXNzKCJmYy1uZXN0ZWQiLGUpLHRoaXMuZWwudG9nZ2xlQ2xhc3MoImZjLWZsYXQiLCFlKSksdGhpcy5pc05lc3Rpbmc9ZX0sci5wcm90b3R5cGUuYmF0Y2hSb3dEZXB0aD0wLHIucHJvdG90eXBlLnNob3duUm93QmF0Y2g9bnVsbCxyLnByb3RvdHlwZS5oaWRkZW5Sb3dCYXRjaD1udWxsLHIucHJvdG90eXBlLmJhdGNoUm93cz1mdW5jdGlvbigpe2lmKCF0aGlzLmJhdGNoUm93RGVwdGgrKylyZXR1cm4gdGhpcy5zaG93blJvd0JhdGNoPVtdLHRoaXMuaGlkZGVuUm93QmF0Y2g9W119LHIucHJvdG90eXBlLnVuYmF0Y2hSb3dzPWZ1bmN0aW9uKCl7aWYoIS0tdGhpcy5iYXRjaFJvd0RlcHRoKXJldHVybiB0aGlzLmhpZGRlblJvd0JhdGNoLmxlbmd0aCYmdGhpcy5yb3dzSGlkZGVuKHRoaXMuaGlkZGVuUm93QmF0Y2gpLHRoaXMuc2hvd25Sb3dCYXRjaC5sZW5ndGgmJnRoaXMucm93c1Nob3duKHRoaXMuc2hvd25Sb3dCYXRjaCksdGhpcy5oaWRkZW5Sb3dCYXRjaD1udWxsLHRoaXMuc2hvd25Sb3dCYXRjaD1udWxsfSxyLnByb3RvdHlwZS5yb3dTaG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zaG93blJvd0JhdGNoP3RoaXMuc2hvd25Sb3dCYXRjaC5wdXNoKHQpOnRoaXMucm93c1Nob3duKFt0XSl9LHIucHJvdG90eXBlLnJvd0hpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oaWRkZW5Sb3dCYXRjaD90aGlzLmhpZGRlblJvd0JhdGNoLnB1c2godCk6dGhpcy5yb3dzSGlkZGVuKFt0XSl9LHIucHJvdG90eXBlLnJvd3NTaG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zeW5jUm93SGVpZ2h0cyh0KSx0aGlzLnVwZGF0ZVdpZHRoKCl9LHIucHJvdG90eXBlLnJvd3NIaWRkZW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV2lkdGgoKX0sci5wcm90b3R5cGUuc3luY1Jvd0hlaWdodHM9ZnVuY3Rpb24odCxlKXt2YXIgcixvLHMsaSxuLGwsdSxoLGEsYztmb3IobnVsbD09ZSYmKGU9ITEpLG51bGw9PXQmJih0PXRoaXMuZ2V0VmlzaWJsZVJvd3MoKSksbD0wLGg9dC5sZW5ndGg7bDxoO2wrKyljPXRbbF0sYy5zZXRUcklubmVySGVpZ2h0KCIiKTtmb3Iobj1mdW5jdGlvbigpe3ZhciBvLHMsaTtmb3IoaT1bXSxvPTAscz10Lmxlbmd0aDtvPHM7bysrKWM9dFtvXSxyPWMuZ2V0TWF4VHJJbm5lckhlaWdodCgpLGUmJihyKz1yJTIpLGkucHVzaChyKTtyZXR1cm4gaX0oKSxpPXU9MCxhPXQubGVuZ3RoO3U8YTtpPSsrdSljPXRbaV0sYy5zZXRUcklubmVySGVpZ2h0KG5baV0pO2lmKCFlJiYobz10aGlzLnJlc291cmNlR3JpZC50Ym9keUVsLmhlaWdodCgpLHM9dGhpcy50aW1lR3JpZC50Ym9keUVsLmhlaWdodCgpLE1hdGguYWJzKG8tcyk+MSkpcmV0dXJuIHRoaXMuc3luY1Jvd0hlaWdodHModCwhMCl9LHIucHJvdG90eXBlLmdldFZpc2libGVSb3dzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnJvd0hpZXJhcmNoeS5nZXRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzLmlzU2hvd24mJm8ucHVzaChzKTtyZXR1cm4gb30sci5wcm90b3R5cGUuZ2V0RXZlbnRSb3dzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnJvd0hpZXJhcmNoeS5nZXRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzIGluc3RhbmNlb2YgcCYmby5wdXNoKHMpO3JldHVybiBvfSxyLnByb3RvdHlwZS5nZXRSZXNvdXJjZVJvdz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXNvdXJjZVJvd0hhc2hbdF19LHIucHJvdG90eXBlLnNldFNjcm9sbD1mdW5jdGlvbih0KXtyZXR1cm4gci5fX3N1cGVyX18uc2V0U2Nyb2xsLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuc2V0U2Nyb2xsVG9wKHQudG9wKX0scn0oaiksRz1mdW5jdGlvbihlKXtmdW5jdGlvbiByKCl7cmV0dXJuIHIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QocixlKSxyLm1peGluKEkpLHIucHJvdG90eXBlLmV2ZW50Um93cz1udWxsLHIucHJvdG90eXBlLnNob3duRXZlbnRSb3dzPW51bGwsci5wcm90b3R5cGUudGJvZHlFbD1udWxsLHIucHJvdG90eXBlLnJvd0Nvb3JkQ2FjaGU9bnVsbCxyLnByb3RvdHlwZS5zcGFuVG9TZWdzPWZ1bmN0aW9uKHQpe3ZhciBlLG8scyxpLG4sbDtpZihsPXIuX19zdXBlcl9fLnNwYW5Ub1NlZ3MuYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dGhpcy52aWV3LmNhbGVuZGFyLGk9dC5yZXNvdXJjZUlkKWZvcihvPTAscz1sLmxlbmd0aDtvPHM7bysrKW49bFtvXSxuLnJlc291cmNlPWUuZ2V0UmVzb3VyY2VCeUlkKGkpLG4ucmVzb3VyY2VJZD1pO3JldHVybiBsfSxyLnByb3RvdHlwZS5wcmVwYXJlSGl0cz1mdW5jdGlvbigpe3ZhciB0LGU7cmV0dXJuIHIuX19zdXBlcl9fLnByZXBhcmVIaXRzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmV2ZW50Um93cz10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCksdGhpcy5zaG93bkV2ZW50Um93cz1mdW5jdGlvbigpe3ZhciBlLHIsbyxzO2ZvcihvPXRoaXMuZXZlbnRSb3dzLHM9W10sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0sdC5pc1Nob3duJiZzLnB1c2godCk7cmV0dXJuIHN9LmNhbGwodGhpcyksZT1mdW5jdGlvbigpe3ZhciBlLHIsbyxzO2ZvcihvPXRoaXMuc2hvd25FdmVudFJvd3Mscz1bXSxlPTAscj1vLmxlbmd0aDtlPHI7ZSsrKXQ9b1tlXSxzLnB1c2godC5nZXRUcigiZXZlbnQiKVswXSk7cmV0dXJuIHN9LmNhbGwodGhpcyksdGhpcy5yb3dDb29yZENhY2hlPW5ldyBsKHtlbHM6ZSxpc1ZlcnRpY2FsOiEwfSksdGhpcy5yb3dDb29yZENhY2hlLmJ1aWxkKCl9LHIucHJvdG90eXBlLnJlbGVhc2VIaXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX19zdXBlcl9fLnJlbGVhc2VIaXRzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmV2ZW50Um93cz1udWxsLHRoaXMuc2hvd25FdmVudFJvd3M9bnVsbCx0aGlzLnJvd0Nvb3JkQ2FjaGUuY2xlYXIoKX0sci5wcm90b3R5cGUucXVlcnlIaXQ9ZnVuY3Rpb24odCxlKXt2YXIgbyxzO2lmKHM9ci5fX3N1cGVyX18ucXVlcnlIaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHMmJihvPXRoaXMucm93Q29vcmRDYWNoZS5nZXRWZXJ0aWNhbEluZGV4KGUpLG51bGwhPW8pKXJldHVybntyZXNvdXJjZUlkOnRoaXMuc2hvd25FdmVudFJvd3Nbb10ucmVzb3VyY2UuaWQsc25hcDpzLnNuYXAsY29tcG9uZW50OnRoaXMsbGVmdDpzLmxlZnQscmlnaHQ6cy5yaWdodCx0b3A6dGhpcy5yb3dDb29yZENhY2hlLmdldFRvcE9mZnNldChvKSxib3R0b206dGhpcy5yb3dDb29yZENhY2hlLmdldEJvdHRvbU9mZnNldChvKX19LHIucHJvdG90eXBlLmdldEhpdFNwYW49ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGU9dGhpcy5nZXRTbmFwUmFuZ2UodC5zbmFwKSxlLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkLGV9LHIucHJvdG90eXBlLmdldEhpdEVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldFNuYXBFbCh0LnNuYXApfSxyLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbj1mdW5jdGlvbigpe3ZhciBlO3JldHVybiByLl9fc3VwZXJfXy5yZW5kZXJTa2VsZXRvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5zZWdDb250YWluZXJFbC5yZW1vdmUoKSx0aGlzLnNlZ0NvbnRhaW5lckVsPW51bGwsZT10KCc8ZGl2IGNsYXNzPSJmYy1yb3dzIj48dGFibGU+PHRib2R5Lz48L3RhYmxlPjwvZGl2PicpLmFwcGVuZFRvKHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwpLHRoaXMudGJvZHlFbD1lLmZpbmQoInRib2R5Iil9LHIucHJvdG90eXBlLnJlbmRlckZnU2Vncz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbDtmb3IodD10aGlzLnJlbmRlckZnU2VnRWxzKHQpLG49dGhpcy52aWV3LnBhaXJTZWdzV2l0aFJvd3ModCksbD1bXSxvPTAscz1uLmxlbmd0aDtvPHM7bysrKWk9bltvXSxlPWlbMF0scj1pWzFdLGUuZmdTZWdzPXIsZS5pc1Nob3duJiYoZS5pc1NlZ3NSZW5kZXJlZD0hMCxsLnB1c2goaSkpO3JldHVybiB0aGlzLnJlbmRlckZnU2Vnc0luQ29udGFpbmVycyhsKSx0aGlzLnVwZGF0ZVNlZ0ZvbGxvd2Vycyh0KSx0fSxyLnByb3RvdHlwZS51bnJlbmRlckZnU2Vncz1mdW5jdGlvbigpe3ZhciB0LGUscixvO2Zvcih0aGlzLmNsZWFyU2VnRm9sbG93ZXJzKCksZT10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCkscj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl0PWVbcl0sdC5mZ1NlZ3M9bnVsbCx0LmlzU2Vnc1JlbmRlcmVkPSExO3JldHVybiB0aGlzLnVucmVuZGVyRmdDb250YWluZXJzKGUpfSxyLnByb3RvdHlwZS5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vycz0wLHIucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vycz90aGlzLmVuc3VyZUluZGl2aWR1YWxCdXNpbmVzc0hvdXJzKCk6ci5fX3N1cGVyX18ucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLnVucmVuZGVyQnVzaW5lc3NIb3Vycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvd0NudFdpdGhDdXN0b21CdXNpbmVzc0hvdXJzP3RoaXMuY2xlYXJJbmRpdmlkdWFsQnVzaW5lc3NIb3VycygpOnIuX19zdXBlcl9fLnVucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLmVuc3VyZUluZGl2aWR1YWxCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzLmJ1c2luZXNzSG91clNlZ3N8fHRoaXMucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2VncyhzKSxzLmlzU2hvd24/by5wdXNoKHMuZW5zdXJlQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkKCkpOm8ucHVzaCh2b2lkIDApO3JldHVybiBvfSxyLnByb3RvdHlwZS5jbGVhckluZGl2aWR1YWxCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxvLnB1c2gocy5jbGVhckJ1c2luZXNzSG91clNlZ3MoKSk7cmV0dXJuIG99LHIucHJvdG90eXBlLmFzc2lnblJvd0J1c2luZXNzSG91clNlZ3M9ZnVuY3Rpb24odCl7aWYodC5yZXNvdXJjZS5idXNpbmVzc0hvdXJzJiYodGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vyc3x8KE4ucHJvdG90eXBlLnVucmVuZGVyQnVzaW5lc3NIb3Vycy5jYWxsKHRoaXMpLHRoaXMuZW5zdXJlSW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKSksdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vycys9MSksdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3VycylyZXR1cm4gdGhpcy5wb3B1bGF0ZVJvd0J1c2luZXNzSG91cnNTZWdzKHQpfSxyLnByb3RvdHlwZS5kZXN0cm95Um93QnVzaW5lc3NIb3VyU2Vncz1mdW5jdGlvbih0KXtpZih0LmNsZWFyQnVzaW5lc3NIb3VyU2VncygpLHQucmVzb3VyY2UuYnVzaW5lc3NIb3VycyYmKHRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMtPTEsIXRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpKXJldHVybiB0aGlzLmNsZWFySW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKSxOLnByb3RvdHlwZS5yZW5kZXJCdXNpbmVzc0hvdXJzLmNhbGwodGhpcyl9LHIucHJvdG90eXBlLnBvcHVsYXRlUm93QnVzaW5lc3NIb3Vyc1NlZ3M9ZnVuY3Rpb24odCl7dmFyIGUscixvO3I9dC5yZXNvdXJjZS5idXNpbmVzc0hvdXJzfHx0aGlzLnZpZXcub3B0KCJidXNpbmVzc0hvdXJzIiksbz10aGlzLnZpZXcuY2FsZW5kYXIuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyghdGhpcy5pc1RpbWVTY2FsZSxyKSxlPXRoaXMuZXZlbnRzVG9TZWdzKG8pLGU9dGhpcy5yZW5kZXJGaWxsU2VnRWxzKCJidXNpbmVzc0hvdXJzIixlKSx0LmJ1c2luZXNzSG91clNlZ3M9ZX0sci5wcm90b3R5cGUucmVuZGVyRmlsbD1mdW5jdGlvbih0LGUscil7dmFyIG8scyxpLG4sbCx1LGgsYSxjLHAsZCxmO2ZvcihlPXRoaXMucmVuZGVyRmlsbFNlZ0Vscyh0LGUpLGE9W10sbD1bXSxvPTAsaT1lLmxlbmd0aDtvPGk7bysrKWQ9ZVtvXSxkLnJlc291cmNlSWQ/YS5wdXNoKGQpOmwucHVzaChkKTtmb3IoaD10aGlzLnZpZXcucGFpclNlZ3NXaXRoUm93cyhhKSxmPVtdLHM9MCxuPWgubGVuZ3RoO3M8bjtzKyspdT1oW3NdLGM9dVswXSxwPXVbMV0sImJnRXZlbnQiPT09dCYmKGMuYmdTZWdzPXApLGMuaXNTaG93biYmZi5wdXNoKHUpO3JldHVybiBsLmxlbmd0aCYmZi51bnNoaWZ0KFt0aGlzLGxdKSx0aGlzLnJlbmRlckZpbGxJbkNvbnRhaW5lcnModCxmLHIpLGV9LHIucHJvdG90eXBlLnJlbmRlckhlbHBlcj1mdW5jdGlvbih0LGUpe3ZhciByLG87cmV0dXJuIG89dGhpcy5ldmVudFRvU2Vncyh0KSxvPXRoaXMucmVuZGVyRmdTZWdFbHMobykscj10aGlzLnZpZXcucGFpclNlZ3NXaXRoUm93cyhvKSx0aGlzLnJlbmRlckhlbHBlclNlZ3NJbkNvbnRhaW5lcnMocixlKX0sci5wcm90b3R5cGUuY29tcHV0ZUluaXRpYWxTY3JvbGw9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGU9ci5fX3N1cGVyX18uY29tcHV0ZUluaXRpYWxTY3JvbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQmJihlLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkLGUuYm90dG9tPXQuYm90dG9tKSxlfSxyLnByb3RvdHlwZS5xdWVyeVNjcm9sbD1mdW5jdGlvbigpe3ZhciB0LGUsbyxzLGksbixsLHU7Zm9yKHU9ci5fX3N1cGVyX18ucXVlcnlTY3JvbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLGw9dGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwub2Zmc2V0KCkudG9wLGk9dGhpcy52aWV3LmdldFZpc2libGVSb3dzKCksbz0wLHM9aS5sZW5ndGg7bzxzO28rKylpZihuPWlbb10sbi5yZXNvdXJjZSYmKHQ9bi5nZXRUcigiZXZlbnQiKSxlPXQub2Zmc2V0KCkudG9wK3Qub3V0ZXJIZWlnaHQoKSxlPmwpKXt1LnJlc291cmNlSWQ9bi5yZXNvdXJjZS5pZCx1LmJvdHRvbT1lLWw7YnJlYWt9cmV0dXJuIHV9LHIucHJvdG90eXBlLnNldFNjcm9sbD1mdW5jdGlvbih0KXt2YXIgZSxvLHMsaTtyZXR1cm4gdC5yZXNvdXJjZUlkJiYoaT10aGlzLnZpZXcuZ2V0UmVzb3VyY2VSb3codC5yZXNvdXJjZUlkKSxpJiYoZT1pLmdldFRyKCJldmVudCIpLGUmJihzPXRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5lbC5vZmZzZXQoKS50b3Asbz1lLm9mZnNldCgpLnRvcCtlLm91dGVySGVpZ2h0KCksdC50b3A9by10LmJvdHRvbS1zKSkpLHIuX19zdXBlcl9fLnNldFNjcm9sbC5jYWxsKHRoaXMsdCl9LHIucHJvdG90eXBlLnNjcm9sbFRvUmVzb3VyY2U9ZnVuY3Rpb24odCl7dmFyIGUscixvLHM7aWYobz10aGlzLnZpZXcuZ2V0UmVzb3VyY2VSb3codC5pZCksbyYmKGU9by5nZXRUcigiZXZlbnQiKSkpcmV0dXJuIHI9dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpLnRvcCxzPWUub2Zmc2V0KCkudG9wLXIsdGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwuc2Nyb2xsVG9wKHMpfSxyfShOKSxyPTMwLHE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3ZhciBlO3RoaXMudmlldz10LHRoaXMuaXNSVEw9dGhpcy52aWV3Lm9wdCgiaXNSVEwiKSx0aGlzLmdpdmVuQ29sV2lkdGhzPXRoaXMuY29sV2lkdGhzPWZ1bmN0aW9uKCl7dmFyIHQscixvLHM7Zm9yKG89dGhpcy52aWV3LmNvbFNwZWNzLHM9W10sdD0wLHI9by5sZW5ndGg7dDxyO3QrKyllPW9bdF0scy5wdXNoKGUud2lkdGgpO3JldHVybiBzfS5jYWxsKHRoaXMpfXJldHVybiBlLnByb3RvdHlwZS52aWV3PW51bGwsZS5wcm90b3R5cGUuaGVhZEVsPW51bGwsZS5wcm90b3R5cGUuZWw9bnVsbCxlLnByb3RvdHlwZS50Ym9keUVsPW51bGwsZS5wcm90b3R5cGUuaGVhZFNjcm9sbGVyPW51bGwsZS5wcm90b3R5cGUuYm9keVNjcm9sbGVyPW51bGwsZS5wcm90b3R5cGUuam9pbmVyPW51bGwsZS5wcm90b3R5cGUuY29sR3JvdXBIdG1sPSIiLGUucHJvdG90eXBlLmhlYWRUYWJsZT1udWxsLGUucHJvdG90eXBlLmhlYWRDb2xFbHM9bnVsbCxlLnByb3RvdHlwZS5oZWFkQ2VsbEVscz1udWxsLGUucHJvdG90eXBlLmJvZHlDb2xFbHM9bnVsbCxlLnByb3RvdHlwZS5ib2R5VGFibGU9bnVsbCxlLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWRTY3JvbGxlcj1uZXcgbih7b3ZlcmZsb3dYOiJjbGlwcGVkLXNjcm9sbCIsb3ZlcmZsb3dZOiJoaWRkZW4ifSksdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzPW5ldyBPLHRoaXMuaGVhZFNjcm9sbGVyLnJlbmRlcigpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuaHRtbCh0aGlzLnJlbmRlckhlYWRIdG1sKCkpLHRoaXMuaGVhZEVsLmFwcGVuZCh0aGlzLmhlYWRTY3JvbGxlci5lbCksdGhpcy5ib2R5U2Nyb2xsZXI9bmV3IG4oe292ZXJmbG93WToiY2xpcHBlZC1zY3JvbGwifSksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzPW5ldyBPLHRoaXMuYm9keVNjcm9sbGVyLnJlbmRlcigpLHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuaHRtbCgiPHRhYmxlPiIrdGhpcy5jb2xHcm91cEh0bWwrIjx0Ym9keS8+PC90YWJsZT4iKSx0aGlzLnRib2R5RWw9dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5maW5kKCJ0Ym9keSIpLHRoaXMuZWwuYXBwZW5kKHRoaXMuYm9keVNjcm9sbGVyLmVsKSx0aGlzLmpvaW5lcj1uZXcgQSgiaG9yaXpvbnRhbCIsW3RoaXMuaGVhZFNjcm9sbGVyLHRoaXMuYm9keVNjcm9sbGVyXSksdGhpcy5oZWFkVGFibGU9dGhpcy5oZWFkRWwuZmluZCgidGFibGUiKSx0aGlzLmhlYWRDb2xFbHM9dGhpcy5oZWFkRWwuZmluZCgiY29sIiksdGhpcy5oZWFkQ2VsbEVscz10aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoInRyOmxhc3QtY2hpbGQgdGgiKSx0aGlzLmJvZHlDb2xFbHM9dGhpcy5lbC5maW5kKCJjb2wiKSx0aGlzLmJvZHlUYWJsZT10aGlzLmVsLmZpbmQoInRhYmxlIiksdGhpcy5jb2xNaW5XaWR0aHM9dGhpcy5jb21wdXRlQ29sTWluV2lkdGhzKCksdGhpcy5hcHBseUNvbFdpZHRocygpLHRoaXMuaW5pdENvbFJlc2l6aW5nKCl9LGUucHJvdG90eXBlLnJlbmRlckhlYWRIdG1sPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scyxpLG4sbCx1LGgsYTtmb3IoZT10aGlzLnZpZXcuY29sU3BlY3Mscj0iPHRhYmxlPiIsdD0iPGNvbGdyb3VwPiIsbj0wLHU9ZS5sZW5ndGg7bjx1O24rKylhPWVbbl0sdCs9YS5pc01haW4/Jzxjb2wgY2xhc3M9ImZjLW1haW4tY29sIi8+JzoiPGNvbC8+Ijtmb3IodCs9IjwvY29sZ3JvdXA+Iix0aGlzLmNvbEdyb3VwSHRtbD10LHIrPXQscis9Ijx0Ym9keT4iLHRoaXMudmlldy5zdXBlckhlYWRlclRleHQmJihyKz0nPHRyIGNsYXNzPSJmYy1zdXBlciI+PHRoIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRIZWFkZXJDbGFzcysnIiBjb2xzcGFuPSInK2UubGVuZ3RoKyciPjxkaXYgY2xhc3M9ImZjLWNlbGwtY29udGVudCI+PHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+Jyt5dCh0aGlzLnZpZXcuc3VwZXJIZWFkZXJUZXh0KSsiPC9zcGFuPjwvZGl2PjwvdGg+PC90cj4iKSxyKz0iPHRyPiIsaT0hMCxvPWw9MCxoPWUubGVuZ3RoO2w8aDtvPSsrbClhPWVbb10scz1vPT09ZS5sZW5ndGgtMSxyKz0nPHRoIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRIZWFkZXJDbGFzcysnIj48ZGl2PjxkaXYgY2xhc3M9ImZjLWNlbGwtY29udGVudCI+JysoYS5pc01haW4/JzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlci1zcGFjZSI+PHNwYW4gY2xhc3M9ImZjLWljb24iPjwvc3Bhbj48L3NwYW4+JzoiIikrJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicreXQoYS5sYWJlbFRleHR8fCIiKSsiPC9zcGFuPjwvZGl2PiIrKHM/IiI6JzxkaXYgY2xhc3M9ImZjLWNvbC1yZXNpemVyIj48L2Rpdj4nKSsiPC9kaXY+PC90aD4iO3JldHVybiByKz0iPC90cj4iLHIrPSI8L3Rib2R5PjwvdGFibGU+In0sZS5wcm90b3R5cGUuZ2l2ZW5Db2xXaWR0aHM9bnVsbCxlLnByb3RvdHlwZS5jb2xXaWR0aHM9bnVsbCxlLnByb3RvdHlwZS5jb2xNaW5XaWR0aHM9bnVsbCxlLnByb3RvdHlwZS50YWJsZVdpZHRoPW51bGwsZS5wcm90b3R5cGUudGFibGVNaW5XaWR0aD1udWxsLGUucHJvdG90eXBlLmluaXRDb2xSZXNpemluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWRFbC5maW5kKCJ0aCAuZmMtY29sLXJlc2l6ZXIiKS5lYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihyLG8pe3JldHVybiBvPXQobyksby5vbigibW91c2Vkb3duIixmdW5jdGlvbih0KXtyZXR1cm4gZS5jb2xSZXNpemVNb3VzZWRvd24ocix0LG8pfSl9fSh0aGlzKSl9LGUucHJvdG90eXBlLmNvbFJlc2l6ZU1vdXNlZG93bj1mdW5jdGlvbih0LGUsbyl7dmFyIHMsaSxuLGw7cmV0dXJuIHM9dGhpcy5jb2xXaWR0aHM9dGhpcy5xdWVyeUNvbFdpZHRocygpLHMucG9wKCkscy5wdXNoKG51bGwpLGw9c1t0XSxuPU1hdGgubWluKHRoaXMuY29sTWluV2lkdGhzW3RdLHIpLGk9bmV3IGgoe2RyYWdTdGFydDpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gby5hZGRDbGFzcygiZmMtYWN0aXZlIil9fSh0aGlzKSxkcmFnOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihyLG8pe3ZhciBpO3JldHVybiBpPWwrKGUuaXNSVEw/LXI6ciksaT1NYXRoLm1heChpLG4pLHNbdF09aSxlLmFwcGx5Q29sV2lkdGhzKCl9fSh0aGlzKSxkcmFnRW5kOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBvLnJlbW92ZUNsYXNzKCJmYy1hY3RpdmUiKX19KHRoaXMpfSksaS5zdGFydEludGVyYWN0aW9uKGUpfSxlLnByb3RvdHlwZS5hcHBseUNvbFdpZHRocz1mdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHk7Zm9yKHI9dGhpcy5jb2xNaW5XaWR0aHMscz10aGlzLmNvbFdpZHRocyx0PSEwLGU9ITEseT0wLGg9MCxwPXMubGVuZ3RoO2g8cDtoKyspbz1zW2hdLCJudW1iZXIiPT10eXBlb2Ygbz95Kz1vOih0PSExLG8mJihlPSEwKSk7Zm9yKGw9ZSYmIXRoaXMudmlldy5pc0hHcm91cGluZz8iYXV0byI6IiIsbj1mdW5jdGlvbigpe3ZhciB0LGUscjtmb3Iocj1bXSx1PXQ9MCxlPXMubGVuZ3RoO3Q8ZTt1PSsrdClvPXNbdV0sci5wdXNoKG51bGwhPW8/bzpsKTtyZXR1cm4gcn0oKSxnPTAsdT1hPTAsZD1uLmxlbmd0aDthPGQ7dT0rK2EpaT1uW3VdLGcrPSJudW1iZXIiPT10eXBlb2YgaT9pOnJbdV07Zm9yKHU9Yz0wLGY9bi5sZW5ndGg7YzxmO3U9KytjKWk9blt1XSx0aGlzLmhlYWRDb2xFbHMuZXEodSkud2lkdGgoaSksdGhpcy5ib2R5Q29sRWxzLmVxKHUpLndpZHRoKGkpO3JldHVybiB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuc2V0TWluV2lkdGgoZyksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLnNldE1pbldpZHRoKGcpLHRoaXMudGFibGVNaW5XaWR0aD1nLHRoaXMudGFibGVXaWR0aD10P3k6dm9pZCAwfSxlLnByb3RvdHlwZS5jb21wdXRlQ29sTWluV2lkdGhzPWZ1bmN0aW9uKCl7dmFyIHQsZSxvLHMsaSxuO2ZvcihzPXRoaXMuZ2l2ZW5Db2xXaWR0aHMsaT1bXSx0PWU9MCxvPXMubGVuZ3RoO2U8bzt0PSsrZSluPXNbdF0sIm51bWJlciI9PXR5cGVvZiBuP2kucHVzaChuKTppLnB1c2gocGFyc2VJbnQodGhpcy5oZWFkQ29sRWxzLmVxKHQpLmNzcygibWluLXdpZHRoIikpfHxyKTtyZXR1cm4gaX0sZS5wcm90b3R5cGUucXVlcnlDb2xXaWR0aHM9ZnVuY3Rpb24oKXt2YXIgZSxyLG8scyxpO2ZvcihzPXRoaXMuaGVhZENlbGxFbHMsaT1bXSxlPTAscj1zLmxlbmd0aDtlPHI7ZSsrKW89c1tlXSxpLnB1c2godChvKS5vdXRlcldpZHRoKCkpO3JldHVybiBpfSxlLnByb3RvdHlwZS51cGRhdGVXaWR0aD1mdW5jdGlvbigpe2lmKHRoaXMuaGVhZFNjcm9sbGVyLnVwZGF0ZVNpemUoKSx0aGlzLmJvZHlTY3JvbGxlci51cGRhdGVTaXplKCksdGhpcy5qb2luZXIudXBkYXRlKCksdGhpcy5mb2xsb3dlcilyZXR1cm4gdGhpcy5mb2xsb3dlci51cGRhdGUoKX0sZS5wcm90b3R5cGUuaGVhZEhlaWdodD1mdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PXRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZmluZCgidGFibGUiKSx0LmhlaWdodC5hcHBseSh0LGFyZ3VtZW50cyl9LGV9KCksej1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy52aWV3PWUsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnRySGFzaD17fSx0aGlzLnRycz10KCl9cmV0dXJuIGUucHJvdG90eXBlLnZpZXc9bnVsbCxlLnByb3RvdHlwZS5wYXJlbnQ9bnVsbCxlLnByb3RvdHlwZS5wcmV2U2libGluZz1udWxsLGUucHJvdG90eXBlLmNoaWxkcmVuPW51bGwsZS5wcm90b3R5cGUuZGVwdGg9MCxlLnByb3RvdHlwZS5oYXNPd25Sb3c9ITEsZS5wcm90b3R5cGUudHJIYXNoPW51bGwsZS5wcm90b3R5cGUudHJzPW51bGwsZS5wcm90b3R5cGUuaXNSZW5kZXJlZD0hMSxlLnByb3RvdHlwZS5pc0V4cGFuZGVkPSEwLGUucHJvdG90eXBlLmlzU2hvd249ITEsZS5wcm90b3R5cGUuYWRkQ2hpbGQ9ZnVuY3Rpb24odCxlKXt2YXIgcixvLHMsaSxuO2Zvcih0LnJlbW92ZSgpLHI9dGhpcy5jaGlsZHJlbixudWxsIT1lP3Iuc3BsaWNlKGUsMCx0KTooZT1yLmxlbmd0aCxyLnB1c2godCkpLHQucHJldlNpYmxpbmc9ZT4wP3JbZS0xXTpudWxsLGU8ci5sZW5ndGgtMSYmKHJbZSsxXS5wcmV2U2libGluZz10KSx0LnBhcmVudD10aGlzLHQuZGVwdGg9dGhpcy5kZXB0aCsodGhpcy5oYXNPd25Sb3c/MTowKSxuPXQuZ2V0Tm9kZXMoKSxvPTAscz1uLmxlbmd0aDtvPHM7bysrKWk9bltvXSxpLmFkZGVkKCk7aWYodGhpcy5pc1Nob3duJiZ0aGlzLmlzRXhwYW5kZWQpcmV0dXJuIHQuc2hvdygpfSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbCx1LGgsYTtmb3IoZT10aGlzLmNoaWxkcmVuLG89ITEscj1zPTAsbj1lLmxlbmd0aDtzPG47cj0rK3MpaWYoYT1lW3JdLGE9PT10KXtvPSEwO2JyZWFrfWlmKG8pe2ZvcihyPGUubGVuZ3RoLTEmJihlW3IrMV0ucHJldlNpYmxpbmc9dC5wcmV2U2libGluZyksZS5zcGxpY2UociwxKSx0LnJlY3Vyc2l2ZWx5VW5yZW5kZXIoKSx1PXQuZ2V0Tm9kZXMoKSxpPTAsbD11Lmxlbmd0aDtpPGw7aSsrKWg9dVtpXSxoLnJlbW92ZWQoKTtyZXR1cm4gdC5wYXJlbnQ9bnVsbCx0LnByZXZTaWJsaW5nPW51bGwsdH1yZXR1cm4hMX0sZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGRyZW49ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzLGksbjtmb3IoaT10aGlzLmNoaWxkcmVuLGU9MCxvPWkubGVuZ3RoO2U8bztlKyspdD1pW2VdLHQucmVjdXJzaXZlbHlVbnJlbmRlcigpO2ZvcihuPXRoaXMuZ2V0RGVzY2VuZGFudHMoKSxyPTAscz1uLmxlbmd0aDtyPHM7cisrKXQ9bltyXSx0LnJlbW92ZWQoKTtyZXR1cm4gdGhpcy5jaGlsZHJlbj1bXX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7aWYodGhpcy5wYXJlbnQpcmV0dXJuIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpfSxlLnByb3RvdHlwZS5nZXRMYXN0Q2hpbGQ9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdD10aGlzLmNoaWxkcmVuLHRbdC5sZW5ndGgtMV19LGUucHJvdG90eXBlLmdldFByZXZSb3c9ZnVuY3Rpb24oKXt2YXIgdCxlO2ZvcihlPXRoaXM7ZTspe2lmKGUucHJldlNpYmxpbmcpZm9yKGU9ZS5wcmV2U2libGluZzt0PWUuZ2V0TGFzdENoaWxkKCk7KWU9dDtlbHNlIGU9ZS5wYXJlbnQ7aWYoZSYmZS5oYXNPd25Sb3cmJmUuaXNTaG93bilyZXR1cm4gZX1yZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUuZ2V0TGVhZGluZ1Jvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc093blJvdz90aGlzOnRoaXMuaXNFeHBhbmRlZCYmdGhpcy5jaGlsZHJlbi5sZW5ndGg/dGhpcy5jaGlsZHJlblswXS5nZXRMZWFkaW5nUm93KCk6dm9pZCAwfSxlLnByb3RvdHlwZS5nZXRSb3dzPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO2ZvcihudWxsPT10JiYodD1bXSksdGhpcy5oYXNPd25Sb3cmJnQucHVzaCh0aGlzKSxzPXRoaXMuY2hpbGRyZW4scj0wLG89cy5sZW5ndGg7cjxvO3IrKyllPXNbcl0sZS5nZXRSb3dzKHQpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXROb2Rlcz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scztmb3IobnVsbD09dCYmKHQ9W10pLHQucHVzaCh0aGlzKSxzPXRoaXMuY2hpbGRyZW4scj0wLG89cy5sZW5ndGg7cjxvO3IrKyllPXNbcl0sZS5nZXROb2Rlcyh0KTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0RGVzY2VuZGFudHM9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2Zvcih0PVtdLHM9dGhpcy5jaGlsZHJlbixyPTAsbz1zLmxlbmd0aDtyPG87cisrKWU9c1tyXSxlLmdldE5vZGVzKHQpO3JldHVybiB0fSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZSxyLG8scyxpLG4sbDtpZih0aGlzLnRySGFzaD17fSxuPVtdLHRoaXMuaGFzT3duUm93KXtlPXRoaXMuZ2V0UHJldlJvdygpLHI9dGhpcy52aWV3LnRib2R5SGFzaDtmb3IobCBpbiByKXM9cltsXSxpPXQoIjx0ci8+IiksdGhpcy50ckhhc2hbbF09aSxuLnB1c2goaVswXSksbz0icmVuZGVyIitLKGwpKyJDb250ZW50Iix0aGlzW29dJiZ0aGlzW29dKGkpLGU/ZS50ckhhc2hbbF0uYWZ0ZXIoaSk6cy5wcmVwZW5kKGkpfXJldHVybiB0aGlzLnRycz10KG4pLm9uKCJjbGljayIsIi5mYy1leHBhbmRlciIsTXQodGhpcywidG9nZ2xlRXhwYW5kZWQiKSksdGhpcy5pc1JlbmRlcmVkPSEwfSxlLnByb3RvdHlwZS51bnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlLHIsbyxzO2lmKHRoaXMuaXNSZW5kZXJlZCl7ZT10aGlzLnRySGFzaDtmb3IobyBpbiBlKXI9ZVtvXSxzPSJ1bnJlbmRlciIrSyhvKSsiQ29udGVudCIsdGhpc1tzXSYmdGhpc1tzXShyKTtyZXR1cm4gdGhpcy50ckhhc2g9e30sdGhpcy50cnMucmVtb3ZlKCksdGhpcy50cnM9dCgpLHRoaXMuaXNSZW5kZXJlZD0hMSx0aGlzLmlzU2hvd249ITEsdGhpcy5oaWRkZW4oKX19LGUucHJvdG90eXBlLnJlY3Vyc2l2ZWx5VW5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2Zvcih0aGlzLnVucmVuZGVyKCksbz10aGlzLmNoaWxkcmVuLHM9W10sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0scy5wdXNoKHQucmVjdXJzaXZlbHlVbnJlbmRlcigpKTtyZXR1cm4gc30sZS5wcm90b3R5cGUuZ2V0VHI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudHJIYXNoW3RdfSxlLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztpZighdGhpcy5pc1Nob3duJiYodGhpcy5pc1JlbmRlcmVkP3RoaXMudHJzLmNzcygiZGlzcGxheSIsIiIpOnRoaXMucmVuZGVyKCksdGhpcy5lbnN1cmVTZWdzUmVuZGVyZWQmJnRoaXMuZW5zdXJlU2Vnc1JlbmRlcmVkKCksdGhpcy5pc0V4cGFuZGVkP3RoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOnRoaXMuaW5kaWNhdGVDb2xsYXBzZWQoKSx0aGlzLmlzU2hvd249ITAsdGhpcy5zaG93bigpLHRoaXMuaXNFeHBhbmRlZCkpe2ZvcihvPXRoaXMuY2hpbGRyZW4scz1bXSxlPTAscj1vLmxlbmd0aDtlPHI7ZSsrKXQ9b1tlXSxzLnB1c2godC5zaG93KCkpO3JldHVybiBzfX0sZS5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0LGUscixvLHM7aWYodGhpcy5pc1Nob3duJiYodGhpcy5pc1JlbmRlcmVkJiZ0aGlzLnRycy5oaWRlKCksdGhpcy5pc1Nob3duPSExLHRoaXMuaGlkZGVuKCksdGhpcy5pc0V4cGFuZGVkKSl7Zm9yKG89dGhpcy5jaGlsZHJlbixzPVtdLGU9MCxyPW8ubGVuZ3RoO2U8cjtlKyspdD1vW2VdLHMucHVzaCh0LmhpZGUoKSk7cmV0dXJuIHN9fSxlLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbztpZighdGhpcy5pc0V4cGFuZGVkKXtmb3IodGhpcy5pc0V4cGFuZGVkPSEwLHRoaXMuaW5kaWNhdGVFeHBhbmRlZCgpLHRoaXMudmlldy5iYXRjaFJvd3MoKSxvPXRoaXMuY2hpbGRyZW4sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0sdC5zaG93KCk7cmV0dXJuIHRoaXMudmlldy51bmJhdGNoUm93cygpLHRoaXMuYW5pbWF0ZUV4cGFuZCgpfX0sZS5wcm90b3R5cGUuY29sbGFwc2U9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbztpZih0aGlzLmlzRXhwYW5kZWQpe2Zvcih0aGlzLmlzRXhwYW5kZWQ9ITEsdGhpcy5pbmRpY2F0ZUNvbGxhcHNlZCgpLHRoaXMudmlldy5iYXRjaFJvd3MoKSxvPXRoaXMuY2hpbGRyZW4sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0sdC5oaWRlKCk7cmV0dXJuIHRoaXMudmlldy51bmJhdGNoUm93cygpfX0sZS5wcm90b3R5cGUudG9nZ2xlRXhwYW5kZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0V4cGFuZGVkP3RoaXMuY29sbGFwc2UoKTp0aGlzLmV4cGFuZCgpfSxlLnByb3RvdHlwZS5pbmRpY2F0ZUV4cGFuZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJzLmZpbmQoIi5mYy1leHBhbmRlciAuZmMtaWNvbiIpLnJlbW92ZUNsYXNzKHRoaXMuZ2V0Q29sbGFwc2VkSWNvbigpKS5hZGRDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKX0sZS5wcm90b3R5cGUuaW5kaWNhdGVDb2xsYXBzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cnMuZmluZCgiLmZjLWV4cGFuZGVyIC5mYy1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5nZXRFeHBhbmRlZEljb24oKSkuYWRkQ2xhc3ModGhpcy5nZXRDb2xsYXBzZWRJY29uKCkpfSxlLnByb3RvdHlwZS5lbmFibGVFeHBhbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cnMuZmluZCgiLmZjLWV4cGFuZGVyLXNwYWNlIikuYWRkQ2xhc3MoImZjLWV4cGFuZGVyIil9LGUucHJvdG90eXBlLmRpc2FibGVFeHBhbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cnMuZmluZCgiLmZjLWV4cGFuZGVyLXNwYWNlIikucmVtb3ZlQ2xhc3MoImZjLWV4cGFuZGVyIikuZmluZCgiLmZjLWljb24iKS5yZW1vdmVDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKS5yZW1vdmVDbGFzcyh0aGlzLmdldENvbGxhcHNlZEljb24oKSl9LGUucHJvdG90eXBlLmdldEV4cGFuZGVkSWNvbj1mdW5jdGlvbigpe3JldHVybiJmYy1pY29uLWRvd24tdHJpYW5nbGUifSxlLnByb3RvdHlwZS5nZXRDb2xsYXBzZWRJY29uPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHQ9dGhpcy52aWV3LmlzUlRMPyJsZWZ0IjoicmlnaHQiLCJmYy1pY29uLSIrdCsiLXRyaWFuZ2xlIn0sZS5wcm90b3R5cGUuYW5pbWF0ZUV4cGFuZD1mdW5jdGlvbigpe3ZhciB0LGUscjtpZihyPW51bGwhPSh0PXRoaXMuY2hpbGRyZW5bMF0pJiZudWxsIT0oZT10LmdldExlYWRpbmdSb3coKSk/ZS50cnM6dm9pZCAwKXJldHVybiByLmFkZENsYXNzKCJmYy1jb2xsYXBzZWQiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHIuYWRkQ2xhc3MoImZjLXRyYW5zaXRpb25pbmciKSxyLnJlbW92ZUNsYXNzKCJmYy1jb2xsYXBzZWQiKX0pLHIub25lKCJ3ZWJraXRUcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIG9UcmFuc2l0aW9uRW5kIG1zVHJhbnNpdGlvbkVuZCB0cmFuc2l0aW9uZW5kIixmdW5jdGlvbigpe3JldHVybiByLnJlbW92ZUNsYXNzKCJmYy10cmFuc2l0aW9uaW5nIil9KX0sZS5wcm90b3R5cGUuZ2V0TWF4VHJJbm5lckhlaWdodD1mdW5jdGlvbigpe3ZhciBlO3JldHVybiBlPTAsdC5lYWNoKHRoaXMudHJIYXNoLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0LHIpe3ZhciBvO3JldHVybiBvPWN0KHIpLmZpbmQoIj4gZGl2Om5vdCguZmMtY2VsbC1jb250ZW50KTpmaXJzdCIpLGU9TWF0aC5tYXgoby5oZWlnaHQoKSxlKX19KHRoaXMpKSxlfSxlLnByb3RvdHlwZS5zZXRUcklubmVySGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiB0LmVhY2godGhpcy50ckhhc2gsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQscil7cmV0dXJuIGN0KHIpLmZpbmQoIj4gZGl2Om5vdCguZmMtY2VsbC1jb250ZW50KTpmaXJzdCIpLmhlaWdodChlKX19KHRoaXMpKX0sZS5wcm90b3R5cGUuc2hvd249ZnVuY3Rpb24oKXtpZih0aGlzLmhhc093blJvdylyZXR1cm4gdGhpcy5yb3dTaG93bih0aGlzKX0sZS5wcm90b3R5cGUuaGlkZGVuPWZ1bmN0aW9uKCl7aWYodGhpcy5oYXNPd25Sb3cpcmV0dXJuIHRoaXMucm93SGlkZGVuKHRoaXMpfSxlLnByb3RvdHlwZS5yb3dTaG93bj1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5wYXJlbnR8fHRoaXMudmlldykucm93U2hvd24odCl9LGUucHJvdG90eXBlLnJvd0hpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5wYXJlbnR8fHRoaXMudmlldykucm93SGlkZGVuKHQpfSxlLnByb3RvdHlwZS5hZGRlZD1mdW5jdGlvbigpe2lmKHRoaXMuaGFzT3duUm93KXJldHVybiB0aGlzLnJvd0FkZGVkKHRoaXMpfSxlLnByb3RvdHlwZS5yZW1vdmVkPWZ1bmN0aW9uKCl7aWYodGhpcy5oYXNPd25Sb3cpcmV0dXJuIHRoaXMucm93UmVtb3ZlZCh0aGlzKX0sZS5wcm90b3R5cGUucm93QWRkZWQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMucGFyZW50fHx0aGlzLnZpZXcpLnJvd0FkZGVkKHQpfSxlLnByb3RvdHlwZS5yb3dSZW1vdmVkPWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLnBhcmVudHx8dGhpcy52aWV3KS5yb3dSZW1vdmVkKHQpfSxlfSgpLEw9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcih0LGUsbyl7dGhpcy5ncm91cFNwZWM9ZSx0aGlzLmdyb3VwVmFsdWU9byxyLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE90KHIsZSksci5wcm90b3R5cGUuZ3JvdXBTcGVjPW51bGwsci5wcm90b3R5cGUuZ3JvdXBWYWx1ZT1udWxsLHIucHJvdG90eXBlLnJvd1JlbW92ZWQ9ZnVuY3Rpb24odCl7aWYoci5fX3N1cGVyX18ucm93UmVtb3ZlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCE9PXRoaXMmJiF0aGlzLmNoaWxkcmVuLmxlbmd0aClyZXR1cm4gdGhpcy5yZW1vdmUoKX0sci5wcm90b3R5cGUucmVuZGVyR3JvdXBDb250ZW50RWw9ZnVuY3Rpb24oKXt2YXIgZSxyO3JldHVybiBlPXQoJzxkaXYgY2xhc3M9ImZjLWNlbGwtY29udGVudCIgLz4nKS5hcHBlbmQodGhpcy5yZW5kZXJHcm91cFRleHRFbCgpKSxyPXRoaXMuZ3JvdXBTcGVjLnJlbmRlciwiZnVuY3Rpb24iPT10eXBlb2YgciYmKGU9cihlLHRoaXMuZ3JvdXBWYWx1ZSl8fGUpLGV9LHIucHJvdG90eXBlLnJlbmRlckdyb3VwVGV4dEVsPWZ1bmN0aW9uKCl7dmFyIGUscjtyZXR1cm4gcj10aGlzLmdyb3VwVmFsdWV8fCIiLGU9dGhpcy5ncm91cFNwZWMudGV4dCwiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZShyKXx8ciksdCgnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCIgLz4nKS50ZXh0KHIpfSxyfSh6KSxnPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIucHJvdG90eXBlLmhhc093blJvdz0hMCxyLnByb3RvdHlwZS5yZW5kZXJTcHJlYWRzaGVldENvbnRlbnQ9ZnVuY3Rpb24oZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5yZW5kZXJHcm91cENvbnRlbnRFbCgpLHIucHJlcGVuZCgnPHNwYW4gY2xhc3M9ImZjLWV4cGFuZGVyIj48c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPjwvc3Bhbj4nKSx0KCc8dGQgY2xhc3M9ImZjLWRpdmlkZXIiIC8+JykuYXR0cigiY29sc3BhbiIsdGhpcy52aWV3LmNvbFNwZWNzLmxlbmd0aCkuYXBwZW5kKHQoIjxkaXYvPiIpLmFwcGVuZChyKSkuYXBwZW5kVG8oZSl9LHIucHJvdG90eXBlLnJlbmRlckV2ZW50Q29udGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5hcHBlbmQoJzx0ZCBjbGFzcz0iZmMtZGl2aWRlciI+IDxkaXYvPiA8L3RkPicpfSxyfShMKSxVPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIucHJvdG90eXBlLnJvd3NwYW49MCxyLnByb3RvdHlwZS5sZWFkaW5nVHI9bnVsbCxyLnByb3RvdHlwZS5ncm91cFRkPW51bGwsci5wcm90b3R5cGUucm93U2hvd249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucm93c3Bhbis9MSx0aGlzLnJlbmRlclJvd3NwYW4oKSxyLl9fc3VwZXJfXy5yb3dTaG93bi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLnJvd0hpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yb3dzcGFuLT0xLHRoaXMucmVuZGVyUm93c3BhbigpLHIuX19zdXBlcl9fLnJvd0hpZGRlbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLnJlbmRlclJvd3NwYW49ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy5yb3dzcGFuPyh0aGlzLmdyb3VwVGR8fCh0aGlzLmdyb3VwVGQ9dCgnPHRkIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MrJyIvPicpLmFwcGVuZCh0aGlzLnJlbmRlckdyb3VwQ29udGVudEVsKCkpKSx0aGlzLmdyb3VwVGQuYXR0cigicm93c3BhbiIsdGhpcy5yb3dzcGFuKSxlPXRoaXMuZ2V0TGVhZGluZ1JvdygpLmdldFRyKCJzcHJlYWRzaGVldCIpLGUhPT10aGlzLmxlYWRpbmdUcj8oZSYmZS5wcmVwZW5kKHRoaXMuZ3JvdXBUZCksdGhpcy5sZWFkaW5nVHI9ZSk6dm9pZCAwKToodGhpcy5ncm91cFRkJiYodGhpcy5ncm91cFRkLnJlbW92ZSgpLHRoaXMuZ3JvdXBUZD1udWxsKSx0aGlzLmxlYWRpbmdUcj1udWxsKX0scn0oTCkscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QoZSx0KSxlLnByb3RvdHlwZS5oYXNPd25Sb3c9ITAsZS5wcm90b3R5cGUuc2VnQ29udGFpbmVyRWw9bnVsbCxlLnByb3RvdHlwZS5zZWdDb250YWluZXJIZWlnaHQ9bnVsbCxlLnByb3RvdHlwZS5pbm5lckVsPW51bGwsZS5wcm90b3R5cGUuYmdTZWdDb250YWluZXJFbD1udWxsLGUucHJvdG90eXBlLmlzU2Vnc1JlbmRlcmVkPSExLGUucHJvdG90eXBlLmlzQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkPSExLGUucHJvdG90eXBlLmJ1c2luZXNzSG91clNlZ3M9bnVsbCxlLnByb3RvdHlwZS5iZ1NlZ3M9bnVsbCxlLnByb3RvdHlwZS5mZ1NlZ3M9bnVsbCxlLnByb3RvdHlwZS5yZW5kZXJFdmVudENvbnRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaHRtbCgnPHRkIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MrJyI+IDxkaXY+IDxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciIgLz4gPC9kaXY+IDwvdGQ+JyksdGhpcy5zZWdDb250YWluZXJFbD10LmZpbmQoIi5mYy1ldmVudC1jb250YWluZXIiKSx0aGlzLmlubmVyRWw9dGhpcy5iZ1NlZ0NvbnRhaW5lckVsPXQuZmluZCgidGQgPiBkaXYiKSx0aGlzLmVuc3VyZVNlZ3NSZW5kZXJlZCgpfSxlLnByb3RvdHlwZS5lbnN1cmVTZWdzUmVuZGVyZWQ9ZnVuY3Rpb24oKXtpZighdGhpcy5pc1NlZ3NSZW5kZXJlZClyZXR1cm4gdGhpcy5lbnN1cmVCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQoKSx0aGlzLmJnU2VncyYmdGhpcy52aWV3LnRpbWVHcmlkLnJlbmRlckZpbGxJbkNvbnRhaW5lcigiYmdFdmVudCIsdGhpcyx0aGlzLmJnU2VncyksdGhpcy5mZ1NlZ3MmJnRoaXMudmlldy50aW1lR3JpZC5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnMoW1t0aGlzLHRoaXMuZmdTZWdzXV0pLHRoaXMuaXNTZWdzUmVuZGVyZWQ9ITB9LGUucHJvdG90eXBlLmVuc3VyZUJ1c2luZXNzSG91clNlZ3NSZW5kZXJlZD1mdW5jdGlvbigpe2lmKHRoaXMuYnVzaW5lc3NIb3VyU2VncyYmIXRoaXMuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQpcmV0dXJuIHRoaXMudmlldy50aW1lR3JpZC5yZW5kZXJGaWxsSW5Db250YWluZXIoImJ1c2luZXNzSG91cnMiLHRoaXMsdGhpcy5idXNpbmVzc0hvdXJTZWdzLCJiZ2V2ZW50IiksdGhpcy5pc0J1c2luZXNzSG91clNlZ3NSZW5kZXJlZD0hMH0sZS5wcm90b3R5cGUudW5yZW5kZXJFdmVudENvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGVhckJ1c2luZXNzSG91clNlZ3MoKSx0aGlzLmJnU2Vncz1udWxsLHRoaXMuZmdTZWdzPW51bGwsdGhpcy5pc1NlZ3NSZW5kZXJlZD0hMX0sZS5wcm90b3R5cGUuY2xlYXJCdXNpbmVzc0hvdXJTZWdzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87aWYodGhpcy5idXNpbmVzc0hvdXJTZWdzKXtmb3Iocj10aGlzLmJ1c2luZXNzSG91clNlZ3MsdD0wLGU9ci5sZW5ndGg7dDxlO3QrKylvPXJbdF0sby5lbCYmby5lbC5yZW1vdmUoKTt0aGlzLmJ1c2luZXNzSG91clNlZ3M9bnVsbH1yZXR1cm4gdGhpcy5pc0J1c2luZXNzSG91clNlZ3NSZW5kZXJlZD0hMX0sZX0oeiksQj1mdW5jdGlvbihlKXtmdW5jdGlvbiByKHQsZSl7dGhpcy5yZXNvdXJjZT1lLHIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QocixlKSxyLnByb3RvdHlwZS5yZXNvdXJjZT1udWxsLHIucHJvdG90eXBlLnJvd0FkZGVkPWZ1bmN0aW9uKHQpe2lmKHIuX19zdXBlcl9fLnJvd0FkZGVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0IT09dGhpcyYmdGhpcy5pc1JlbmRlcmVkJiYxPT09dGhpcy5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIHRoaXMuZW5hYmxlRXhwYW5kaW5nKCksdGhpcy5pc0V4cGFuZGVkP3RoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOnRoaXMuaW5kaWNhdGVDb2xsYXBzZWQoKX0sci5wcm90b3R5cGUucm93UmVtb3ZlZD1mdW5jdGlvbih0KXtpZihyLl9fc3VwZXJfXy5yb3dSZW1vdmVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0IT09dGhpcyYmdGhpcy5pc1JlbmRlcmVkJiYhdGhpcy5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIHRoaXMuZGlzYWJsZUV4cGFuZGluZygpfSxyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gci5fX3N1cGVyX18ucmVuZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNoaWxkcmVuLmxlbmd0aD4wP3RoaXMuZW5hYmxlRXhwYW5kaW5nKCk6dGhpcy5kaXNhYmxlRXhwYW5kaW5nKCksdGhpcy52aWV3LnRyaWdnZXIoInJlc291cmNlUmVuZGVyIix0aGlzLnJlc291cmNlLHRoaXMucmVzb3VyY2UsdGhpcy5nZXRUcigic3ByZWFkc2hlZXQiKS5maW5kKCI+IHRkIiksdGhpcy5nZXRUcigiZXZlbnQiKS5maW5kKCI+IHRkIikpfSxyLnByb3RvdHlwZS5yZW5kZXJFdmVudENvbnRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHIuX19zdXBlcl9fLnJlbmRlckV2ZW50Q29udGVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5hdHRyKCJkYXRhLXJlc291cmNlLWlkIix0aGlzLnJlc291cmNlLmlkKX0sci5wcm90b3R5cGUucmVuZGVyU3ByZWFkc2hlZXRDb250ZW50PWZ1bmN0aW9uKGUpe3ZhciByLG8scyxpLG4sbCx1LGgsYTtmb3IodT10aGlzLnJlc291cmNlLGw9dGhpcy52aWV3LmNvbFNwZWNzLGk9MCxuPWwubGVuZ3RoO2k8bjtpKyspcj1sW2ldLHIuZ3JvdXB8fChzPXIuZmllbGQ/dVtyLmZpZWxkXXx8bnVsbDp1LGE9ImZ1bmN0aW9uIj09dHlwZW9mIHIudGV4dD9yLnRleHQodSxzKTpzLG89dCgnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nKyhyLmlzTWFpbj90aGlzLnJlbmRlckd1dHRlckh0bWwoKToiIikrJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicrKGE/eXQoYSk6IiZuYnNwOyIpKyI8L3NwYW4+PC9kaXY+IiksImZ1bmN0aW9uIj09dHlwZW9mIHIucmVuZGVyJiYobz1yLnJlbmRlcih1LG8scyl8fG8pLGg9dCgnPHRkIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MrJyIvPicpLmFwcGVuZChvKSxyLmlzTWFpbiYmaC53cmFwSW5uZXIoIjxkaXYvPiIpLGUuYXBwZW5kKGgpKTtyZXR1cm4gZS5hdHRyKCJkYXRhLXJlc291cmNlLWlkIix1LmlkKX0sci5wcm90b3R5cGUucmVuZGVyR3V0dGVySHRtbD1mdW5jdGlvbigpe3ZhciB0LGUscixvO2Zvcih0PSIiLGU9cj0wLG89dGhpcy5kZXB0aDtyPG87ZT1yKz0xKXQrPSc8c3BhbiBjbGFzcz0iZmMtaWNvbiIvPic7cmV0dXJuIHQrPSc8c3BhbiBjbGFzcz0iZmMtZXhwYW5kZXItc3BhY2UiPjxzcGFuIGNsYXNzPSJmYy1pY29uIj48L3NwYW4+PC9zcGFuPid9LHJ9KHApLGQudmlld3MudGltZWxpbmUucmVzb3VyY2VDbGFzcz1NLEU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE90KGUsdCksZS5taXhpbihXKSxlLnByb3RvdHlwZS50aW1lR3JpZENsYXNzPUYsZS5wcm90b3R5cGUuZGF5R3JpZENsYXNzPVQsZS5wcm90b3R5cGUucmVuZGVySGVhZD1mdW5jdGlvbigpe3JldHVybiBlLl9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRpbWVHcmlkLnByb2Nlc3NIZWFkUmVzb3VyY2VFbHModGhpcy5oZWFkQ29udGFpbmVyRWwpfSxlLnByb3RvdHlwZS5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGltZUdyaWQuc2V0UmVzb3VyY2VzKHQpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyh0KSx0aGlzLmNsZWFyVmlldygpLHRoaXMuZGlzcGxheVZpZXcoKX0sZS5wcm90b3R5cGUudW5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7aWYodGhpcy5jbGVhckV2ZW50cygpLHRoaXMudGltZUdyaWQudW5zZXRSZXNvdXJjZXMoKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnNldFJlc291cmNlcygpLCF0KXJldHVybiB0aGlzLmNsZWFyVmlldygpLHRoaXMuZGlzcGxheVZpZXcoKX0sZX0oZC5BZ2VuZGFWaWV3KSxkLnZpZXdzLmFnZW5kYS5xdWVyeVJlc291cmNlQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU7aWYobnVsbCE9KGU9dC5vcHRpb25zLmdyb3VwQnlSZXNvdXJjZXx8dC5vcHRpb25zLmdyb3VwQnlEYXRlQW5kUmVzb3VyY2UpP2U6MT09PXQuZHVyYXRpb24uYXMoImRheXMiKSlyZXR1cm4gRX0sSD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QoZSx0KSxlLm1peGluKFcpLGUucHJvdG90eXBlLmRheUdyaWRDbGFzcz1ULGUucHJvdG90eXBlLnJlbmRlckhlYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZS5fX3N1cGVyX18ucmVuZGVySGVhZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5kYXlHcmlkLnByb2Nlc3NIZWFkUmVzb3VyY2VFbHModGhpcy5oZWFkQ29udGFpbmVyRWwpfSxlLnByb3RvdHlwZS5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF5R3JpZC5zZXRSZXNvdXJjZXModCksdGhpcy5jbGVhclZpZXcoKSx0aGlzLmRpc3BsYXlWaWV3KCl9LGUucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzPWZ1bmN0aW9uKHQpe2lmKHRoaXMuY2xlYXJFdmVudHMoKSx0aGlzLmRheUdyaWQudW5zZXRSZXNvdXJjZXMoKSwhdClyZXR1cm4gdGhpcy5jbGVhclZpZXcoKSx0aGlzLmRpc3BsYXlWaWV3KCl9LGV9KGQuQmFzaWNWaWV3KSx4PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gZS5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChlLHQpLGUubWl4aW4oVyksZS5wcm90b3R5cGUuZGF5R3JpZENsYXNzPVQsZS5wcm90b3R5cGUucmVuZGVySGVhZD1mdW5jdGlvbigpe3JldHVybiBlLl9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmRheUdyaWQucHJvY2Vzc0hlYWRSZXNvdXJjZUVscyh0aGlzLmhlYWRDb250YWluZXJFbCl9LGUucHJvdG90eXBlLnNldFJlc291cmNlcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyh0KSx0aGlzLmNsZWFyVmlldygpLHRoaXMuZGlzcGxheVZpZXcoKX0sZS5wcm90b3R5cGUudW5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGVhckV2ZW50cygpLHRoaXMuZGF5R3JpZC51bnNldFJlc291cmNlcygpLHRoaXMuY2xlYXJWaWV3KCksdGhpcy5kaXNwbGF5VmlldygpfSxlfShkLk1vbnRoVmlldyksZC52aWV3cy5iYXNpYy5xdWVyeVJlc291cmNlQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU7aWYobnVsbCE9KGU9dC5vcHRpb25zLmdyb3VwQnlSZXNvdXJjZXx8dC5vcHRpb25zLmdyb3VwQnlEYXRlQW5kUmVzb3VyY2UpP2U6MT09PXQuZHVyYXRpb24uYXMoImRheXMiKSlyZXR1cm4gSH0sZC52aWV3cy5tb250aC5xdWVyeVJlc291cmNlQ2xhc3M9ZnVuY3Rpb24odCl7aWYodC5vcHRpb25zLmdyb3VwQnlSZXNvdXJjZXx8dC5vcHRpb25zLmdyb3VwQnlEYXRlQW5kUmVzb3VyY2UpcmV0dXJuIHg7Cn0sQz0iMjAxNi0wOS0wNCIsWT17eWVhcnM6MSx3ZWVrczoxfSx5PSJodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci9saWNlbnNlLyIsYj1bIkdQTC1NeS1Qcm9qZWN0LUlzLU9wZW4tU291cmNlIiwiQ0MtQXR0cmlidXRpb24tTm9uQ29tbWVyY2lhbC1Ob0Rlcml2YXRpdmVzIl0sR3Q9ZnVuY3Rpb24odCxlKXtpZighbXQod2luZG93LmxvY2F0aW9uLmhyZWYpJiYhUnQodCkmJiFzdChlKSlyZXR1cm4gV3QoJ1BsZWFzZSB1c2UgYSB2YWxpZCBsaWNlbnNlIGtleS4gPGEgaHJlZj0iJyt5KyciPk1vcmUgSW5mbzwvYT4nLGUpfSxSdD1mdW5jdGlvbihyKXt2YXIgbyxzLGksbjtyZXR1cm4gdC5pbkFycmF5KHIsYikhPT0tMXx8KHM9KHJ8fCIiKS5tYXRjaCgvXihcZCspXC1mY3NcLShcZCspJC8pLCEhKHMmJjEwPT09c1sxXS5sZW5ndGgmJihpPWUudXRjKDFlMypwYXJzZUludChzWzJdKSksbj1lLnV0YyhkLm1vY2tTY2hlZHVsZXJSZWxlYXNlRGF0ZXx8Qyksbi5pc1ZhbGlkKCkmJihvPW4uY2xvbmUoKS5zdWJ0cmFjdChZKSxpLmlzQWZ0ZXIobykpKSkpfSxtdD1mdW5jdGlvbih0KXtyZXR1cm4gQm9vbGVhbih0Lm1hdGNoKC9cdytcOlwvXC9mdWxsY2FsZW5kYXJcLmlvXC98XC9kZW1vc1wvW1x3LV0rXC5odG1sJC8pKX0sV3Q9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gci5hcHBlbmQodCgnPGRpdiBjbGFzcz0iZmMtbGljZW5zZS1tZXNzYWdlIiAvPicpLmh0bWwoZSkpfSx2b2lkKHN0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmZpbmQoIi5mYy1saWNlbnNlLW1lc3NhZ2UiKS5sZW5ndGg+PTF9KSl9KTs=
Ly8hIG1vbWVudC5qcwovLyEgdmVyc2lvbiA6IDIuMTMuMAovLyEgYXV0aG9ycyA6IFRpbSBXb29kLCBJc2tyZW4gQ2hlcm5ldiwgTW9tZW50LmpzIGNvbnRyaWJ1dG9ycwovLyEgbGljZW5zZSA6IE1JVAovLyEgbW9tZW50anMuY29tCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9YigpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGIpOmEubW9tZW50PWIoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKCl7cmV0dXJuIGZkLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBiKGEpe2ZkPWF9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEFycmF5fHwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBEYXRlfHwiW29iamVjdCBEYXRlXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9ZnVuY3Rpb24gZShhLGIpe3ZhciBjLGQ9W107Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylkLnB1c2goYihhW2NdLGMpKTtyZXR1cm4gZH1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpfWZ1bmN0aW9uIGcoYSxiKXtmb3IodmFyIGMgaW4gYilmKGIsYykmJihhW2NdPWJbY10pO3JldHVybiBmKGIsInRvU3RyaW5nIikmJihhLnRvU3RyaW5nPWIudG9TdHJpbmcpLGYoYiwidmFsdWVPZiIpJiYoYS52YWx1ZU9mPWIudmFsdWVPZiksYX1mdW5jdGlvbiBoKGEsYixjLGQpe3JldHVybiBKYShhLGIsYyxkLCEwKS51dGMoKX1mdW5jdGlvbiBpKCl7cmV0dXJue2VtcHR5OiExLHVudXNlZFRva2VuczpbXSx1bnVzZWRJbnB1dDpbXSxvdmVyZmxvdzotMixjaGFyc0xlZnRPdmVyOjAsbnVsbElucHV0OiExLGludmFsaWRNb250aDpudWxsLGludmFsaWRGb3JtYXQ6ITEsdXNlckludmFsaWRhdGVkOiExLGlzbzohMSxwYXJzZWREYXRlUGFydHM6W10sbWVyaWRpZW06bnVsbH19ZnVuY3Rpb24gaihhKXtyZXR1cm4gbnVsbD09YS5fcGYmJihhLl9wZj1pKCkpLGEuX3BmfWZ1bmN0aW9uIGsoYSl7aWYobnVsbD09YS5faXNWYWxpZCl7dmFyIGI9aihhKSxjPWdkLmNhbGwoYi5wYXJzZWREYXRlUGFydHMsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWF9KTthLl9pc1ZhbGlkPSFpc05hTihhLl9kLmdldFRpbWUoKSkmJmIub3ZlcmZsb3c8MCYmIWIuZW1wdHkmJiFiLmludmFsaWRNb250aCYmIWIuaW52YWxpZFdlZWtkYXkmJiFiLm51bGxJbnB1dCYmIWIuaW52YWxpZEZvcm1hdCYmIWIudXNlckludmFsaWRhdGVkJiYoIWIubWVyaWRpZW18fGIubWVyaWRpZW0mJmMpLGEuX3N0cmljdCYmKGEuX2lzVmFsaWQ9YS5faXNWYWxpZCYmMD09PWIuY2hhcnNMZWZ0T3ZlciYmMD09PWIudW51c2VkVG9rZW5zLmxlbmd0aCYmdm9pZCAwPT09Yi5iaWdIb3VyKX1yZXR1cm4gYS5faXNWYWxpZH1mdW5jdGlvbiBsKGEpe3ZhciBiPWgoTmFOKTtyZXR1cm4gbnVsbCE9YT9nKGooYiksYSk6aihiKS51c2VySW52YWxpZGF0ZWQ9ITAsYn1mdW5jdGlvbiBtKGEpe3JldHVybiB2b2lkIDA9PT1hfWZ1bmN0aW9uIG4oYSxiKXt2YXIgYyxkLGU7aWYobShiLl9pc0FNb21lbnRPYmplY3QpfHwoYS5faXNBTW9tZW50T2JqZWN0PWIuX2lzQU1vbWVudE9iamVjdCksbShiLl9pKXx8KGEuX2k9Yi5faSksbShiLl9mKXx8KGEuX2Y9Yi5fZiksbShiLl9sKXx8KGEuX2w9Yi5fbCksbShiLl9zdHJpY3QpfHwoYS5fc3RyaWN0PWIuX3N0cmljdCksbShiLl90em0pfHwoYS5fdHptPWIuX3R6bSksbShiLl9pc1VUQyl8fChhLl9pc1VUQz1iLl9pc1VUQyksbShiLl9vZmZzZXQpfHwoYS5fb2Zmc2V0PWIuX29mZnNldCksbShiLl9wZil8fChhLl9wZj1qKGIpKSxtKGIuX2xvY2FsZSl8fChhLl9sb2NhbGU9Yi5fbG9jYWxlKSxoZC5sZW5ndGg+MClmb3IoYyBpbiBoZClkPWhkW2NdLGU9YltkXSxtKGUpfHwoYVtkXT1lKTtyZXR1cm4gYX1mdW5jdGlvbiBvKGIpe24odGhpcyxiKSx0aGlzLl9kPW5ldyBEYXRlKG51bGwhPWIuX2Q/Yi5fZC5nZXRUaW1lKCk6TmFOKSxpZD09PSExJiYoaWQ9ITAsYS51cGRhdGVPZmZzZXQodGhpcyksaWQ9ITEpfWZ1bmN0aW9uIHAoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBvfHxudWxsIT1hJiZudWxsIT1hLl9pc0FNb21lbnRPYmplY3R9ZnVuY3Rpb24gcShhKXtyZXR1cm4gMD5hP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpfWZ1bmN0aW9uIHIoYSl7dmFyIGI9K2EsYz0wO3JldHVybiAwIT09YiYmaXNGaW5pdGUoYikmJihjPXEoYikpLGN9ZnVuY3Rpb24gcyhhLGIsYyl7dmFyIGQsZT1NYXRoLm1pbihhLmxlbmd0aCxiLmxlbmd0aCksZj1NYXRoLmFicyhhLmxlbmd0aC1iLmxlbmd0aCksZz0wO2ZvcihkPTA7ZT5kO2QrKykoYyYmYVtkXSE9PWJbZF18fCFjJiZyKGFbZF0pIT09cihiW2RdKSkmJmcrKztyZXR1cm4gZytmfWZ1bmN0aW9uIHQoYil7YS5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3M9PT0hMSYmInVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigiRGVwcmVjYXRpb24gd2FybmluZzogIitiKX1mdW5jdGlvbiB1KGIsYyl7dmFyIGQ9ITA7cmV0dXJuIGcoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9YS5kZXByZWNhdGlvbkhhbmRsZXImJmEuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsYiksZCYmKHQoYisiXG5Bcmd1bWVudHM6ICIrQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsICIpKyJcbiIrKG5ldyBFcnJvcikuc3RhY2spLGQ9ITEpLGMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjKX1mdW5jdGlvbiB2KGIsYyl7bnVsbCE9YS5kZXByZWNhdGlvbkhhbmRsZXImJmEuZGVwcmVjYXRpb25IYW5kbGVyKGIsYyksamRbYl18fCh0KGMpLGpkW2JdPSEwKX1mdW5jdGlvbiB3KGEpe3JldHVybiBhIGluc3RhbmNlb2YgRnVuY3Rpb258fCJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9ZnVuY3Rpb24geChhKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKX1mdW5jdGlvbiB5KGEpe3ZhciBiLGM7Zm9yKGMgaW4gYSliPWFbY10sdyhiKT90aGlzW2NdPWI6dGhpc1siXyIrY109Yjt0aGlzLl9jb25maWc9YSx0aGlzLl9vcmRpbmFsUGFyc2VMZW5pZW50PW5ldyBSZWdFeHAodGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSsifCIrL1xkezEsMn0vLnNvdXJjZSl9ZnVuY3Rpb24geihhLGIpe3ZhciBjLGQ9Zyh7fSxhKTtmb3IoYyBpbiBiKWYoYixjKSYmKHgoYVtjXSkmJngoYltjXSk/KGRbY109e30sZyhkW2NdLGFbY10pLGcoZFtjXSxiW2NdKSk6bnVsbCE9YltjXT9kW2NdPWJbY106ZGVsZXRlIGRbY10pO3JldHVybiBkfWZ1bmN0aW9uIEEoYSl7bnVsbCE9YSYmdGhpcy5zZXQoYSl9ZnVuY3Rpb24gQihhKXtyZXR1cm4gYT9hLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgiXyIsIi0iKTphfWZ1bmN0aW9uIEMoYSl7Zm9yKHZhciBiLGMsZCxlLGY9MDtmPGEubGVuZ3RoOyl7Zm9yKGU9QihhW2ZdKS5zcGxpdCgiLSIpLGI9ZS5sZW5ndGgsYz1CKGFbZisxXSksYz1jP2Muc3BsaXQoIi0iKTpudWxsO2I+MDspe2lmKGQ9RChlLnNsaWNlKDAsYikuam9pbigiLSIpKSlyZXR1cm4gZDtpZihjJiZjLmxlbmd0aD49YiYmcyhlLGMsITApPj1iLTEpYnJlYWs7Yi0tfWYrK31yZXR1cm4gbnVsbH1mdW5jdGlvbiBEKGEpe3ZhciBiPW51bGw7aWYoIW5kW2FdJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyl0cnl7Yj1sZC5fYWJicixyZXF1aXJlKCIuL2xvY2FsZS8iK2EpLEUoYil9Y2F0Y2goYyl7fXJldHVybiBuZFthXX1mdW5jdGlvbiBFKGEsYil7dmFyIGM7cmV0dXJuIGEmJihjPW0oYik/SChhKTpGKGEsYiksYyYmKGxkPWMpKSxsZC5fYWJicn1mdW5jdGlvbiBGKGEsYil7cmV0dXJuIG51bGwhPT1iPyhiLmFiYnI9YSxudWxsIT1uZFthXT8odigiZGVmaW5lTG9jYWxlT3ZlcnJpZGUiLCJ1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSBhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGUiKSxiPXoobmRbYV0uX2NvbmZpZyxiKSk6bnVsbCE9Yi5wYXJlbnRMb2NhbGUmJihudWxsIT1uZFtiLnBhcmVudExvY2FsZV0/Yj16KG5kW2IucGFyZW50TG9jYWxlXS5fY29uZmlnLGIpOnYoInBhcmVudExvY2FsZVVuZGVmaW5lZCIsInNwZWNpZmllZCBwYXJlbnRMb2NhbGUgaXMgbm90IGRlZmluZWQgeWV0IikpLG5kW2FdPW5ldyBBKGIpLEUoYSksbmRbYV0pOihkZWxldGUgbmRbYV0sbnVsbCl9ZnVuY3Rpb24gRyhhLGIpe2lmKG51bGwhPWIpe3ZhciBjO251bGwhPW5kW2FdJiYoYj16KG5kW2FdLl9jb25maWcsYikpLGM9bmV3IEEoYiksYy5wYXJlbnRMb2NhbGU9bmRbYV0sbmRbYV09YyxFKGEpfWVsc2UgbnVsbCE9bmRbYV0mJihudWxsIT1uZFthXS5wYXJlbnRMb2NhbGU/bmRbYV09bmRbYV0ucGFyZW50TG9jYWxlOm51bGwhPW5kW2FdJiZkZWxldGUgbmRbYV0pO3JldHVybiBuZFthXX1mdW5jdGlvbiBIKGEpe3ZhciBiO2lmKGEmJmEuX2xvY2FsZSYmYS5fbG9jYWxlLl9hYmJyJiYoYT1hLl9sb2NhbGUuX2FiYnIpLCFhKXJldHVybiBsZDtpZighYyhhKSl7aWYoYj1EKGEpKXJldHVybiBiO2E9W2FdfXJldHVybiBDKGEpfWZ1bmN0aW9uIEkoKXtyZXR1cm4ga2QobmQpfWZ1bmN0aW9uIEooYSxiKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7b2RbY109b2RbYysicyJdPW9kW2JdPWF9ZnVuY3Rpb24gSyhhKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGE/b2RbYV18fG9kW2EudG9Mb3dlckNhc2UoKV06dm9pZCAwfWZ1bmN0aW9uIEwoYSl7dmFyIGIsYyxkPXt9O2ZvcihjIGluIGEpZihhLGMpJiYoYj1LKGMpLGImJihkW2JdPWFbY10pKTtyZXR1cm4gZH1mdW5jdGlvbiBNKGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBudWxsIT1kPyhPKHRoaXMsYixkKSxhLnVwZGF0ZU9mZnNldCh0aGlzLGMpLHRoaXMpOk4odGhpcyxiKX19ZnVuY3Rpb24gTihhLGIpe3JldHVybiBhLmlzVmFsaWQoKT9hLl9kWyJnZXQiKyhhLl9pc1VUQz8iVVRDIjoiIikrYl0oKTpOYU59ZnVuY3Rpb24gTyhhLGIsYyl7YS5pc1ZhbGlkKCkmJmEuX2RbInNldCIrKGEuX2lzVVRDPyJVVEMiOiIiKStiXShjKX1mdW5jdGlvbiBQKGEsYil7dmFyIGM7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWZvcihjIGluIGEpdGhpcy5zZXQoYyxhW2NdKTtlbHNlIGlmKGE9SyhhKSx3KHRoaXNbYV0pKXJldHVybiB0aGlzW2FdKGIpO3JldHVybiB0aGlzfWZ1bmN0aW9uIFEoYSxiLGMpe3ZhciBkPSIiK01hdGguYWJzKGEpLGU9Yi1kLmxlbmd0aCxmPWE+PTA7cmV0dXJuKGY/Yz8iKyI6IiI6Ii0iKStNYXRoLnBvdygxMCxNYXRoLm1heCgwLGUpKS50b1N0cmluZygpLnN1YnN0cigxKStkfWZ1bmN0aW9uIFIoYSxiLGMsZCl7dmFyIGU9ZDsic3RyaW5nIj09dHlwZW9mIGQmJihlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbZF0oKX0pLGEmJihzZFthXT1lKSxiJiYoc2RbYlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gUShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiWzFdLGJbMl0pfSksYyYmKHNkW2NdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYSl9KX1mdW5jdGlvbiBTKGEpe3JldHVybiBhLm1hdGNoKC9cW1tcc1xTXS8pP2EucmVwbGFjZSgvXlxbfFxdJC9nLCIiKTphLnJlcGxhY2UoL1xcL2csIiIpfWZ1bmN0aW9uIFQoYSl7dmFyIGIsYyxkPWEubWF0Y2gocGQpO2ZvcihiPTAsYz1kLmxlbmd0aDtjPmI7YisrKXNkW2RbYl1dP2RbYl09c2RbZFtiXV06ZFtiXT1TKGRbYl0pO3JldHVybiBmdW5jdGlvbihiKXt2YXIgZSxmPSIiO2ZvcihlPTA7Yz5lO2UrKylmKz1kW2VdaW5zdGFuY2VvZiBGdW5jdGlvbj9kW2VdLmNhbGwoYixhKTpkW2VdO3JldHVybiBmfX1mdW5jdGlvbiBVKGEsYil7cmV0dXJuIGEuaXNWYWxpZCgpPyhiPVYoYixhLmxvY2FsZURhdGEoKSkscmRbYl09cmRbYl18fFQoYikscmRbYl0oYSkpOmEubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24gVihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGIubG9uZ0RhdGVGb3JtYXQoYSl8fGF9dmFyIGQ9NTtmb3IocWQubGFzdEluZGV4PTA7ZD49MCYmcWQudGVzdChhKTspYT1hLnJlcGxhY2UocWQsYykscWQubGFzdEluZGV4PTAsZC09MTtyZXR1cm4gYX1mdW5jdGlvbiBXKGEsYixjKXtLZFthXT13KGIpP2I6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gYSYmYz9jOmJ9fWZ1bmN0aW9uIFgoYSxiKXtyZXR1cm4gZihLZCxhKT9LZFthXShiLl9zdHJpY3QsYi5fbG9jYWxlKTpuZXcgUmVnRXhwKFkoYSkpfWZ1bmN0aW9uIFkoYSl7cmV0dXJuIFooYS5yZXBsYWNlKCJcXCIsIiIpLnJlcGxhY2UoL1xcKFxbKXxcXChcXSl8XFsoW15cXVxbXSopXF18XFwoLikvZyxmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBifHxjfHxkfHxlfSkpfWZ1bmN0aW9uIFooYSl7cmV0dXJuIGEucmVwbGFjZSgvWy1cL1xcXiQqKz8uKCl8W1xde31dL2csIlxcJCYiKX1mdW5jdGlvbiAkKGEsYil7dmFyIGMsZD1iO2Zvcigic3RyaW5nIj09dHlwZW9mIGEmJihhPVthXSksIm51bWJlciI9PXR5cGVvZiBiJiYoZD1mdW5jdGlvbihhLGMpe2NbYl09cihhKX0pLGM9MDtjPGEubGVuZ3RoO2MrKylMZFthW2NdXT1kfWZ1bmN0aW9uIF8oYSxiKXskKGEsZnVuY3Rpb24oYSxjLGQsZSl7ZC5fdz1kLl93fHx7fSxiKGEsZC5fdyxkLGUpfSl9ZnVuY3Rpb24gYWEoYSxiLGMpe251bGwhPWImJmYoTGQsYSkmJkxkW2FdKGIsYy5fYSxjLGEpfWZ1bmN0aW9uIGJhKGEsYil7cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGEsYisxLDApKS5nZXRVVENEYXRlKCl9ZnVuY3Rpb24gY2EoYSxiKXtyZXR1cm4gYyh0aGlzLl9tb250aHMpP3RoaXMuX21vbnRoc1thLm1vbnRoKCldOnRoaXMuX21vbnRoc1tWZC50ZXN0KGIpPyJmb3JtYXQiOiJzdGFuZGFsb25lIl1bYS5tb250aCgpXX1mdW5jdGlvbiBkYShhLGIpe3JldHVybiBjKHRoaXMuX21vbnRoc1Nob3J0KT90aGlzLl9tb250aHNTaG9ydFthLm1vbnRoKCldOnRoaXMuX21vbnRoc1Nob3J0W1ZkLnRlc3QoYik/ImZvcm1hdCI6InN0YW5kYWxvbmUiXVthLm1vbnRoKCldfWZ1bmN0aW9uIGVhKGEsYixjKXt2YXIgZCxlLGYsZz1hLnRvTG9jYWxlTG93ZXJDYXNlKCk7aWYoIXRoaXMuX21vbnRoc1BhcnNlKWZvcih0aGlzLl9tb250aHNQYXJzZT1bXSx0aGlzLl9sb25nTW9udGhzUGFyc2U9W10sdGhpcy5fc2hvcnRNb250aHNQYXJzZT1bXSxkPTA7MTI+ZDsrK2QpZj1oKFsyZTMsZF0pLHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbZF09dGhpcy5tb250aHNTaG9ydChmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpLHRoaXMuX2xvbmdNb250aHNQYXJzZVtkXT10aGlzLm1vbnRocyhmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpO3JldHVybiBjPyJNTU0iPT09Yj8oZT1tZC5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCk6KGU9bWQuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCk6Ik1NTSI9PT1iPyhlPW1kLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxnKSwtMSE9PWU/ZTooZT1tZC5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxnKSwtMSE9PWU/ZTpudWxsKSk6KGU9bWQuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpKX1mdW5jdGlvbiBmYShhLGIsYyl7dmFyIGQsZSxmO2lmKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpcmV0dXJuIGVhLmNhbGwodGhpcyxhLGIsYyk7Zm9yKHRoaXMuX21vbnRoc1BhcnNlfHwodGhpcy5fbW9udGhzUGFyc2U9W10sdGhpcy5fbG9uZ01vbnRoc1BhcnNlPVtdLHRoaXMuX3Nob3J0TW9udGhzUGFyc2U9W10pLGQ9MDsxMj5kO2QrKyl7aWYoZT1oKFsyZTMsZF0pLGMmJiF0aGlzLl9sb25nTW9udGhzUGFyc2VbZF0mJih0aGlzLl9sb25nTW9udGhzUGFyc2VbZF09bmV3IFJlZ0V4cCgiXiIrdGhpcy5tb250aHMoZSwiIikucmVwbGFjZSgiLiIsIiIpKyIkIiwiaSIpLHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbZF09bmV3IFJlZ0V4cCgiXiIrdGhpcy5tb250aHNTaG9ydChlLCIiKS5yZXBsYWNlKCIuIiwiIikrIiQiLCJpIikpLGN8fHRoaXMuX21vbnRoc1BhcnNlW2RdfHwoZj0iXiIrdGhpcy5tb250aHMoZSwiIikrInxeIit0aGlzLm1vbnRoc1Nob3J0KGUsIiIpLHRoaXMuX21vbnRoc1BhcnNlW2RdPW5ldyBSZWdFeHAoZi5yZXBsYWNlKCIuIiwiIiksImkiKSksYyYmIk1NTU0iPT09YiYmdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoYyYmIk1NTSI9PT1iJiZ0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoIWMmJnRoaXMuX21vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGR9fWZ1bmN0aW9uIGdhKGEsYil7dmFyIGM7aWYoIWEuaXNWYWxpZCgpKXJldHVybiBhO2lmKCJzdHJpbmciPT10eXBlb2YgYilpZigvXlxkKyQvLnRlc3QoYikpYj1yKGIpO2Vsc2UgaWYoYj1hLmxvY2FsZURhdGEoKS5tb250aHNQYXJzZShiKSwibnVtYmVyIiE9dHlwZW9mIGIpcmV0dXJuIGE7cmV0dXJuIGM9TWF0aC5taW4oYS5kYXRlKCksYmEoYS55ZWFyKCksYikpLGEuX2RbInNldCIrKGEuX2lzVVRDPyJVVEMiOiIiKSsiTW9udGgiXShiLGMpLGF9ZnVuY3Rpb24gaGEoYil7cmV0dXJuIG51bGwhPWI/KGdhKHRoaXMsYiksYS51cGRhdGVPZmZzZXQodGhpcywhMCksdGhpcyk6Tih0aGlzLCJNb250aCIpfWZ1bmN0aW9uIGlhKCl7cmV0dXJuIGJhKHRoaXMueWVhcigpLHRoaXMubW9udGgoKSl9ZnVuY3Rpb24gamEoYSl7cmV0dXJuIHRoaXMuX21vbnRoc1BhcnNlRXhhY3Q/KGYodGhpcywiX21vbnRoc1JlZ2V4Iil8fGxhLmNhbGwodGhpcyksYT90aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1Nob3J0UmVnZXgpOnRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXgmJmE/dGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl9tb250aHNTaG9ydFJlZ2V4fWZ1bmN0aW9uIGthKGEpe3JldHVybiB0aGlzLl9tb250aHNQYXJzZUV4YWN0PyhmKHRoaXMsIl9tb250aHNSZWdleCIpfHxsYS5jYWxsKHRoaXMpLGE/dGhpcy5fbW9udGhzU3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzUmVnZXgpOnRoaXMuX21vbnRoc1N0cmljdFJlZ2V4JiZhP3RoaXMuX21vbnRoc1N0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1JlZ2V4fWZ1bmN0aW9uIGxhKCl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBiLmxlbmd0aC1hLmxlbmd0aH12YXIgYixjLGQ9W10sZT1bXSxmPVtdO2ZvcihiPTA7MTI+YjtiKyspYz1oKFsyZTMsYl0pLGQucHVzaCh0aGlzLm1vbnRoc1Nob3J0KGMsIiIpKSxlLnB1c2godGhpcy5tb250aHMoYywiIikpLGYucHVzaCh0aGlzLm1vbnRocyhjLCIiKSksZi5wdXNoKHRoaXMubW9udGhzU2hvcnQoYywiIikpO2ZvcihkLnNvcnQoYSksZS5zb3J0KGEpLGYuc29ydChhKSxiPTA7MTI+YjtiKyspZFtiXT1aKGRbYl0pLGVbYl09WihlW2JdKSxmW2JdPVooZltiXSk7dGhpcy5fbW9udGhzUmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Yuam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX21vbnRoc1Nob3J0UmVnZXg9dGhpcy5fbW9udGhzUmVnZXgsdGhpcy5fbW9udGhzU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Uuam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Quam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIG1hKGEpe3ZhciBiLGM9YS5fYTtyZXR1cm4gYyYmLTI9PT1qKGEpLm92ZXJmbG93JiYoYj1jW05kXTwwfHxjW05kXT4xMT9OZDpjW09kXTwxfHxjW09kXT5iYShjW01kXSxjW05kXSk/T2Q6Y1tQZF08MHx8Y1tQZF0+MjR8fDI0PT09Y1tQZF0mJigwIT09Y1tRZF18fDAhPT1jW1JkXXx8MCE9PWNbU2RdKT9QZDpjW1FkXTwwfHxjW1FkXT41OT9RZDpjW1JkXTwwfHxjW1JkXT41OT9SZDpjW1NkXTwwfHxjW1NkXT45OTk/U2Q6LTEsaihhKS5fb3ZlcmZsb3dEYXlPZlllYXImJihNZD5ifHxiPk9kKSYmKGI9T2QpLGooYSkuX292ZXJmbG93V2Vla3MmJi0xPT09YiYmKGI9VGQpLGooYSkuX292ZXJmbG93V2Vla2RheSYmLTE9PT1iJiYoYj1VZCksaihhKS5vdmVyZmxvdz1iKSxhfWZ1bmN0aW9uIG5hKGEpe3ZhciBiLGMsZCxlLGYsZyxoPWEuX2ksaT0kZC5leGVjKGgpfHxfZC5leGVjKGgpO2lmKGkpe2ZvcihqKGEpLmlzbz0hMCxiPTAsYz1iZS5sZW5ndGg7Yz5iO2IrKylpZihiZVtiXVsxXS5leGVjKGlbMV0pKXtlPWJlW2JdWzBdLGQ9YmVbYl1bMl0hPT0hMTticmVha31pZihudWxsPT1lKXJldHVybiB2b2lkKGEuX2lzVmFsaWQ9ITEpO2lmKGlbM10pe2ZvcihiPTAsYz1jZS5sZW5ndGg7Yz5iO2IrKylpZihjZVtiXVsxXS5leGVjKGlbM10pKXtmPShpWzJdfHwiICIpK2NlW2JdWzBdO2JyZWFrfWlmKG51bGw9PWYpcmV0dXJuIHZvaWQoYS5faXNWYWxpZD0hMSl9aWYoIWQmJm51bGwhPWYpcmV0dXJuIHZvaWQoYS5faXNWYWxpZD0hMSk7aWYoaVs0XSl7aWYoIWFlLmV4ZWMoaVs0XSkpcmV0dXJuIHZvaWQoYS5faXNWYWxpZD0hMSk7Zz0iWiJ9YS5fZj1lKyhmfHwiIikrKGd8fCIiKSxDYShhKX1lbHNlIGEuX2lzVmFsaWQ9ITF9ZnVuY3Rpb24gb2EoYil7dmFyIGM9ZGUuZXhlYyhiLl9pKTtyZXR1cm4gbnVsbCE9PWM/dm9pZChiLl9kPW5ldyBEYXRlKCtjWzFdKSk6KG5hKGIpLHZvaWQoYi5faXNWYWxpZD09PSExJiYoZGVsZXRlIGIuX2lzVmFsaWQsYS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhiKSkpKX1mdW5jdGlvbiBwYShhLGIsYyxkLGUsZixnKXt2YXIgaD1uZXcgRGF0ZShhLGIsYyxkLGUsZixnKTtyZXR1cm4gMTAwPmEmJmE+PTAmJmlzRmluaXRlKGguZ2V0RnVsbFllYXIoKSkmJmguc2V0RnVsbFllYXIoYSksaH1mdW5jdGlvbiBxYShhKXt2YXIgYj1uZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLGFyZ3VtZW50cykpO3JldHVybiAxMDA+YSYmYT49MCYmaXNGaW5pdGUoYi5nZXRVVENGdWxsWWVhcigpKSYmYi5zZXRVVENGdWxsWWVhcihhKSxifWZ1bmN0aW9uIHJhKGEpe3JldHVybiBzYShhKT8zNjY6MzY1fWZ1bmN0aW9uIHNhKGEpe3JldHVybiBhJTQ9PT0wJiZhJTEwMCE9PTB8fGElNDAwPT09MH1mdW5jdGlvbiB0YSgpe3JldHVybiBzYSh0aGlzLnllYXIoKSl9ZnVuY3Rpb24gdWEoYSxiLGMpe3ZhciBkPTcrYi1jLGU9KDcrcWEoYSwwLGQpLmdldFVUQ0RheSgpLWIpJTc7cmV0dXJuLWUrZC0xfWZ1bmN0aW9uIHZhKGEsYixjLGQsZSl7dmFyIGYsZyxoPSg3K2MtZCklNyxpPXVhKGEsZCxlKSxqPTErNyooYi0xKStoK2k7cmV0dXJuIDA+PWo/KGY9YS0xLGc9cmEoZikraik6aj5yYShhKT8oZj1hKzEsZz1qLXJhKGEpKTooZj1hLGc9aikse3llYXI6ZixkYXlPZlllYXI6Z319ZnVuY3Rpb24gd2EoYSxiLGMpe3ZhciBkLGUsZj11YShhLnllYXIoKSxiLGMpLGc9TWF0aC5mbG9vcigoYS5kYXlPZlllYXIoKS1mLTEpLzcpKzE7cmV0dXJuIDE+Zz8oZT1hLnllYXIoKS0xLGQ9Zyt4YShlLGIsYykpOmc+eGEoYS55ZWFyKCksYixjKT8oZD1nLXhhKGEueWVhcigpLGIsYyksZT1hLnllYXIoKSsxKTooZT1hLnllYXIoKSxkPWcpLHt3ZWVrOmQseWVhcjplfX1mdW5jdGlvbiB4YShhLGIsYyl7dmFyIGQ9dWEoYSxiLGMpLGU9dWEoYSsxLGIsYyk7cmV0dXJuKHJhKGEpLWQrZSkvN31mdW5jdGlvbiB5YShhLGIsYyl7cmV0dXJuIG51bGwhPWE/YTpudWxsIT1iP2I6Y31mdW5jdGlvbiB6YShiKXt2YXIgYz1uZXcgRGF0ZShhLm5vdygpKTtyZXR1cm4gYi5fdXNlVVRDP1tjLmdldFVUQ0Z1bGxZZWFyKCksYy5nZXRVVENNb250aCgpLGMuZ2V0VVRDRGF0ZSgpXTpbYy5nZXRGdWxsWWVhcigpLGMuZ2V0TW9udGgoKSxjLmdldERhdGUoKV19ZnVuY3Rpb24gQWEoYSl7dmFyIGIsYyxkLGUsZj1bXTtpZighYS5fZCl7Zm9yKGQ9emEoYSksYS5fdyYmbnVsbD09YS5fYVtPZF0mJm51bGw9PWEuX2FbTmRdJiZCYShhKSxhLl9kYXlPZlllYXImJihlPXlhKGEuX2FbTWRdLGRbTWRdKSxhLl9kYXlPZlllYXI+cmEoZSkmJihqKGEpLl9vdmVyZmxvd0RheU9mWWVhcj0hMCksYz1xYShlLDAsYS5fZGF5T2ZZZWFyKSxhLl9hW05kXT1jLmdldFVUQ01vbnRoKCksYS5fYVtPZF09Yy5nZXRVVENEYXRlKCkpLGI9MDszPmImJm51bGw9PWEuX2FbYl07KytiKWEuX2FbYl09ZltiXT1kW2JdO2Zvcig7Nz5iO2IrKylhLl9hW2JdPWZbYl09bnVsbD09YS5fYVtiXT8yPT09Yj8xOjA6YS5fYVtiXTsyND09PWEuX2FbUGRdJiYwPT09YS5fYVtRZF0mJjA9PT1hLl9hW1JkXSYmMD09PWEuX2FbU2RdJiYoYS5fbmV4dERheT0hMCxhLl9hW1BkXT0wKSxhLl9kPShhLl91c2VVVEM/cWE6cGEpLmFwcGx5KG51bGwsZiksbnVsbCE9YS5fdHptJiZhLl9kLnNldFVUQ01pbnV0ZXMoYS5fZC5nZXRVVENNaW51dGVzKCktYS5fdHptKSxhLl9uZXh0RGF5JiYoYS5fYVtQZF09MjQpfX1mdW5jdGlvbiBCYShhKXt2YXIgYixjLGQsZSxmLGcsaCxpO2I9YS5fdyxudWxsIT1iLkdHfHxudWxsIT1iLld8fG51bGwhPWIuRT8oZj0xLGc9NCxjPXlhKGIuR0csYS5fYVtNZF0sd2EoS2EoKSwxLDQpLnllYXIpLGQ9eWEoYi5XLDEpLGU9eWEoYi5FLDEpLCgxPmV8fGU+NykmJihpPSEwKSk6KGY9YS5fbG9jYWxlLl93ZWVrLmRvdyxnPWEuX2xvY2FsZS5fd2Vlay5kb3ksYz15YShiLmdnLGEuX2FbTWRdLHdhKEthKCksZixnKS55ZWFyKSxkPXlhKGIudywxKSxudWxsIT1iLmQ/KGU9Yi5kLCgwPmV8fGU+NikmJihpPSEwKSk6bnVsbCE9Yi5lPyhlPWIuZStmLChiLmU8MHx8Yi5lPjYpJiYoaT0hMCkpOmU9ZiksMT5kfHxkPnhhKGMsZixnKT9qKGEpLl9vdmVyZmxvd1dlZWtzPSEwOm51bGwhPWk/aihhKS5fb3ZlcmZsb3dXZWVrZGF5PSEwOihoPXZhKGMsZCxlLGYsZyksYS5fYVtNZF09aC55ZWFyLGEuX2RheU9mWWVhcj1oLmRheU9mWWVhcil9ZnVuY3Rpb24gQ2EoYil7aWYoYi5fZj09PWEuSVNPXzg2MDEpcmV0dXJuIHZvaWQgbmEoYik7Yi5fYT1bXSxqKGIpLmVtcHR5PSEwO3ZhciBjLGQsZSxmLGcsaD0iIitiLl9pLGk9aC5sZW5ndGgsaz0wO2ZvcihlPVYoYi5fZixiLl9sb2NhbGUpLm1hdGNoKHBkKXx8W10sYz0wO2M8ZS5sZW5ndGg7YysrKWY9ZVtjXSxkPShoLm1hdGNoKFgoZixiKSl8fFtdKVswXSxkJiYoZz1oLnN1YnN0cigwLGguaW5kZXhPZihkKSksZy5sZW5ndGg+MCYmaihiKS51bnVzZWRJbnB1dC5wdXNoKGcpLGg9aC5zbGljZShoLmluZGV4T2YoZCkrZC5sZW5ndGgpLGsrPWQubGVuZ3RoKSxzZFtmXT8oZD9qKGIpLmVtcHR5PSExOmooYikudW51c2VkVG9rZW5zLnB1c2goZiksYWEoZixkLGIpKTpiLl9zdHJpY3QmJiFkJiZqKGIpLnVudXNlZFRva2Vucy5wdXNoKGYpO2ooYikuY2hhcnNMZWZ0T3Zlcj1pLWssaC5sZW5ndGg+MCYmaihiKS51bnVzZWRJbnB1dC5wdXNoKGgpLGooYikuYmlnSG91cj09PSEwJiZiLl9hW1BkXTw9MTImJmIuX2FbUGRdPjAmJihqKGIpLmJpZ0hvdXI9dm9pZCAwKSxqKGIpLnBhcnNlZERhdGVQYXJ0cz1iLl9hLnNsaWNlKDApLGooYikubWVyaWRpZW09Yi5fbWVyaWRpZW0sYi5fYVtQZF09RGEoYi5fbG9jYWxlLGIuX2FbUGRdLGIuX21lcmlkaWVtKSxBYShiKSxtYShiKX1mdW5jdGlvbiBEYShhLGIsYyl7dmFyIGQ7cmV0dXJuIG51bGw9PWM/YjpudWxsIT1hLm1lcmlkaWVtSG91cj9hLm1lcmlkaWVtSG91cihiLGMpOm51bGwhPWEuaXNQTT8oZD1hLmlzUE0oYyksZCYmMTI+YiYmKGIrPTEyKSxkfHwxMiE9PWJ8fChiPTApLGIpOmJ9ZnVuY3Rpb24gRWEoYSl7dmFyIGIsYyxkLGUsZjtpZigwPT09YS5fZi5sZW5ndGgpcmV0dXJuIGooYSkuaW52YWxpZEZvcm1hdD0hMCx2b2lkKGEuX2Q9bmV3IERhdGUoTmFOKSk7Zm9yKGU9MDtlPGEuX2YubGVuZ3RoO2UrKylmPTAsYj1uKHt9LGEpLG51bGwhPWEuX3VzZVVUQyYmKGIuX3VzZVVUQz1hLl91c2VVVEMpLGIuX2Y9YS5fZltlXSxDYShiKSxrKGIpJiYoZis9aihiKS5jaGFyc0xlZnRPdmVyLGYrPTEwKmooYikudW51c2VkVG9rZW5zLmxlbmd0aCxqKGIpLnNjb3JlPWYsKG51bGw9PWR8fGQ+ZikmJihkPWYsYz1iKSk7ZyhhLGN8fGIpfWZ1bmN0aW9uIEZhKGEpe2lmKCFhLl9kKXt2YXIgYj1MKGEuX2kpO2EuX2E9ZShbYi55ZWFyLGIubW9udGgsYi5kYXl8fGIuZGF0ZSxiLmhvdXIsYi5taW51dGUsYi5zZWNvbmQsYi5taWxsaXNlY29uZF0sZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnBhcnNlSW50KGEsMTApfSksQWEoYSl9fWZ1bmN0aW9uIEdhKGEpe3ZhciBiPW5ldyBvKG1hKEhhKGEpKSk7cmV0dXJuIGIuX25leHREYXkmJihiLmFkZCgxLCJkIiksYi5fbmV4dERheT12b2lkIDApLGJ9ZnVuY3Rpb24gSGEoYSl7dmFyIGI9YS5faSxlPWEuX2Y7cmV0dXJuIGEuX2xvY2FsZT1hLl9sb2NhbGV8fEgoYS5fbCksbnVsbD09PWJ8fHZvaWQgMD09PWUmJiIiPT09Yj9sKHtudWxsSW5wdXQ6ITB9KTooInN0cmluZyI9PXR5cGVvZiBiJiYoYS5faT1iPWEuX2xvY2FsZS5wcmVwYXJzZShiKSkscChiKT9uZXcgbyhtYShiKSk6KGMoZSk/RWEoYSk6ZT9DYShhKTpkKGIpP2EuX2Q9YjpJYShhKSxrKGEpfHwoYS5fZD1udWxsKSxhKSl9ZnVuY3Rpb24gSWEoYil7dmFyIGY9Yi5faTt2b2lkIDA9PT1mP2IuX2Q9bmV3IERhdGUoYS5ub3coKSk6ZChmKT9iLl9kPW5ldyBEYXRlKGYudmFsdWVPZigpKToic3RyaW5nIj09dHlwZW9mIGY/b2EoYik6YyhmKT8oYi5fYT1lKGYuc2xpY2UoMCksZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGEsMTApfSksQWEoYikpOiJvYmplY3QiPT10eXBlb2YgZj9GYShiKToibnVtYmVyIj09dHlwZW9mIGY/Yi5fZD1uZXcgRGF0ZShmKTphLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGIpfWZ1bmN0aW9uIEphKGEsYixjLGQsZSl7dmFyIGY9e307cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYyYmKGQ9YyxjPXZvaWQgMCksZi5faXNBTW9tZW50T2JqZWN0PSEwLGYuX3VzZVVUQz1mLl9pc1VUQz1lLGYuX2w9YyxmLl9pPWEsZi5fZj1iLGYuX3N0cmljdD1kLEdhKGYpfWZ1bmN0aW9uIEthKGEsYixjLGQpe3JldHVybiBKYShhLGIsYyxkLCExKX1mdW5jdGlvbiBMYShhLGIpe3ZhciBkLGU7aWYoMT09PWIubGVuZ3RoJiZjKGJbMF0pJiYoYj1iWzBdKSwhYi5sZW5ndGgpcmV0dXJuIEthKCk7Zm9yKGQ9YlswXSxlPTE7ZTxiLmxlbmd0aDsrK2UpKCFiW2VdLmlzVmFsaWQoKXx8YltlXVthXShkKSkmJihkPWJbZV0pO3JldHVybiBkfWZ1bmN0aW9uIE1hKCl7dmFyIGE9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIExhKCJpc0JlZm9yZSIsYSl9ZnVuY3Rpb24gTmEoKXt2YXIgYT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gTGEoImlzQWZ0ZXIiLGEpfWZ1bmN0aW9uIE9hKGEpe3ZhciBiPUwoYSksYz1iLnllYXJ8fDAsZD1iLnF1YXJ0ZXJ8fDAsZT1iLm1vbnRofHwwLGY9Yi53ZWVrfHwwLGc9Yi5kYXl8fDAsaD1iLmhvdXJ8fDAsaT1iLm1pbnV0ZXx8MCxqPWIuc2Vjb25kfHwwLGs9Yi5taWxsaXNlY29uZHx8MDt0aGlzLl9taWxsaXNlY29uZHM9K2srMWUzKmorNmU0KmkrMWUzKmgqNjAqNjAsdGhpcy5fZGF5cz0rZys3KmYsdGhpcy5fbW9udGhzPStlKzMqZCsxMipjLHRoaXMuX2RhdGE9e30sdGhpcy5fbG9jYWxlPUgoKSx0aGlzLl9idWJibGUoKX1mdW5jdGlvbiBQYShhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE9hfWZ1bmN0aW9uIFFhKGEsYil7UihhLDAsMCxmdW5jdGlvbigpe3ZhciBhPXRoaXMudXRjT2Zmc2V0KCksYz0iKyI7cmV0dXJuIDA+YSYmKGE9LWEsYz0iLSIpLGMrUSh+fihhLzYwKSwyKStiK1Eofn5hJTYwLDIpfSl9ZnVuY3Rpb24gUmEoYSxiKXt2YXIgYz0oYnx8IiIpLm1hdGNoKGEpfHxbXSxkPWNbYy5sZW5ndGgtMV18fFtdLGU9KGQrIiIpLm1hdGNoKGllKXx8WyItIiwwLDBdLGY9Kyg2MCplWzFdKStyKGVbMl0pO3JldHVybiIrIj09PWVbMF0/ZjotZn1mdW5jdGlvbiBTYShiLGMpe3ZhciBlLGY7cmV0dXJuIGMuX2lzVVRDPyhlPWMuY2xvbmUoKSxmPShwKGIpfHxkKGIpP2IudmFsdWVPZigpOkthKGIpLnZhbHVlT2YoKSktZS52YWx1ZU9mKCksZS5fZC5zZXRUaW1lKGUuX2QudmFsdWVPZigpK2YpLGEudXBkYXRlT2Zmc2V0KGUsITEpLGUpOkthKGIpLmxvY2FsKCl9ZnVuY3Rpb24gVGEoYSl7cmV0dXJuIDE1Ki1NYXRoLnJvdW5kKGEuX2QuZ2V0VGltZXpvbmVPZmZzZXQoKS8xNSl9ZnVuY3Rpb24gVWEoYixjKXt2YXIgZCxlPXRoaXMuX29mZnNldHx8MDtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/bnVsbCE9Yj8oInN0cmluZyI9PXR5cGVvZiBiP2I9UmEoSGQsYik6TWF0aC5hYnMoYik8MTYmJihiPTYwKmIpLCF0aGlzLl9pc1VUQyYmYyYmKGQ9VGEodGhpcykpLHRoaXMuX29mZnNldD1iLHRoaXMuX2lzVVRDPSEwLG51bGwhPWQmJnRoaXMuYWRkKGQsIm0iKSxlIT09YiYmKCFjfHx0aGlzLl9jaGFuZ2VJblByb2dyZXNzP2piKHRoaXMsZGIoYi1lLCJtIiksMSwhMSk6dGhpcy5fY2hhbmdlSW5Qcm9ncmVzc3x8KHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M9ITAsYS51cGRhdGVPZmZzZXQodGhpcywhMCksdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz1udWxsKSksdGhpcyk6dGhpcy5faXNVVEM/ZTpUYSh0aGlzKTpudWxsIT1iP3RoaXM6TmFOfWZ1bmN0aW9uIFZhKGEsYil7cmV0dXJuIG51bGwhPWE/KCJzdHJpbmciIT10eXBlb2YgYSYmKGE9LWEpLHRoaXMudXRjT2Zmc2V0KGEsYiksdGhpcyk6LXRoaXMudXRjT2Zmc2V0KCl9ZnVuY3Rpb24gV2EoYSl7cmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsYSl9ZnVuY3Rpb24gWGEoYSl7cmV0dXJuIHRoaXMuX2lzVVRDJiYodGhpcy51dGNPZmZzZXQoMCxhKSx0aGlzLl9pc1VUQz0hMSxhJiZ0aGlzLnN1YnRyYWN0KFRhKHRoaXMpLCJtIikpLHRoaXN9ZnVuY3Rpb24gWWEoKXtyZXR1cm4gdGhpcy5fdHptP3RoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSk6InN0cmluZyI9PXR5cGVvZiB0aGlzLl9pJiZ0aGlzLnV0Y09mZnNldChSYShHZCx0aGlzLl9pKSksdGhpc31mdW5jdGlvbiBaYShhKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/KGE9YT9LYShhKS51dGNPZmZzZXQoKTowLCh0aGlzLnV0Y09mZnNldCgpLWEpJTYwPT09MCk6ITF9ZnVuY3Rpb24gJGEoKXtyZXR1cm4gdGhpcy51dGNPZmZzZXQoKT50aGlzLmNsb25lKCkubW9udGgoMCkudXRjT2Zmc2V0KCl8fHRoaXMudXRjT2Zmc2V0KCk+dGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpfWZ1bmN0aW9uIF9hKCl7aWYoIW0odGhpcy5faXNEU1RTaGlmdGVkKSlyZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO3ZhciBhPXt9O2lmKG4oYSx0aGlzKSxhPUhhKGEpLGEuX2Epe3ZhciBiPWEuX2lzVVRDP2goYS5fYSk6S2EoYS5fYSk7dGhpcy5faXNEU1RTaGlmdGVkPXRoaXMuaXNWYWxpZCgpJiZzKGEuX2EsYi50b0FycmF5KCkpPjB9ZWxzZSB0aGlzLl9pc0RTVFNoaWZ0ZWQ9ITE7cmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZH1mdW5jdGlvbiBhYigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT8hdGhpcy5faXNVVEM6ITF9ZnVuY3Rpb24gYmIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/dGhpcy5faXNVVEM6ITF9ZnVuY3Rpb24gY2IoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/dGhpcy5faXNVVEMmJjA9PT10aGlzLl9vZmZzZXQ6ITF9ZnVuY3Rpb24gZGIoYSxiKXt2YXIgYyxkLGUsZz1hLGg9bnVsbDtyZXR1cm4gUGEoYSk/Zz17bXM6YS5fbWlsbGlzZWNvbmRzLGQ6YS5fZGF5cyxNOmEuX21vbnRoc306Im51bWJlciI9PXR5cGVvZiBhPyhnPXt9LGI/Z1tiXT1hOmcubWlsbGlzZWNvbmRzPWEpOihoPWplLmV4ZWMoYSkpPyhjPSItIj09PWhbMV0/LTE6MSxnPXt5OjAsZDpyKGhbT2RdKSpjLGg6cihoW1BkXSkqYyxtOnIoaFtRZF0pKmMsczpyKGhbUmRdKSpjLG1zOnIoaFtTZF0pKmN9KTooaD1rZS5leGVjKGEpKT8oYz0iLSI9PT1oWzFdPy0xOjEsZz17eTplYihoWzJdLGMpLE06ZWIoaFszXSxjKSx3OmViKGhbNF0sYyksZDplYihoWzVdLGMpLGg6ZWIoaFs2XSxjKSxtOmViKGhbN10sYyksczplYihoWzhdLGMpfSk6bnVsbD09Zz9nPXt9OiJvYmplY3QiPT10eXBlb2YgZyYmKCJmcm9tImluIGd8fCJ0byJpbiBnKSYmKGU9Z2IoS2EoZy5mcm9tKSxLYShnLnRvKSksZz17fSxnLm1zPWUubWlsbGlzZWNvbmRzLGcuTT1lLm1vbnRocyksZD1uZXcgT2EoZyksUGEoYSkmJmYoYSwiX2xvY2FsZSIpJiYoZC5fbG9jYWxlPWEuX2xvY2FsZSksZH1mdW5jdGlvbiBlYihhLGIpe3ZhciBjPWEmJnBhcnNlRmxvYXQoYS5yZXBsYWNlKCIsIiwiLiIpKTtyZXR1cm4oaXNOYU4oYyk/MDpjKSpifWZ1bmN0aW9uIGZiKGEsYil7dmFyIGM9e21pbGxpc2Vjb25kczowLG1vbnRoczowfTtyZXR1cm4gYy5tb250aHM9Yi5tb250aCgpLWEubW9udGgoKSsxMiooYi55ZWFyKCktYS55ZWFyKCkpLGEuY2xvbmUoKS5hZGQoYy5tb250aHMsIk0iKS5pc0FmdGVyKGIpJiYtLWMubW9udGhzLGMubWlsbGlzZWNvbmRzPStiLSthLmNsb25lKCkuYWRkKGMubW9udGhzLCJNIiksY31mdW5jdGlvbiBnYihhLGIpe3ZhciBjO3JldHVybiBhLmlzVmFsaWQoKSYmYi5pc1ZhbGlkKCk/KGI9U2EoYixhKSxhLmlzQmVmb3JlKGIpP2M9ZmIoYSxiKTooYz1mYihiLGEpLGMubWlsbGlzZWNvbmRzPS1jLm1pbGxpc2Vjb25kcyxjLm1vbnRocz0tYy5tb250aHMpLGMpOnttaWxsaXNlY29uZHM6MCxtb250aHM6MH19ZnVuY3Rpb24gaGIoYSl7cmV0dXJuIDA+YT8tMSpNYXRoLnJvdW5kKC0xKmEpOk1hdGgucm91bmQoYSl9ZnVuY3Rpb24gaWIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyxkKXt2YXIgZSxmO3JldHVybiBudWxsPT09ZHx8aXNOYU4oK2QpfHwodihiLCJtb21lbnQoKS4iK2IrIihwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4iK2IrIihudW1iZXIsIHBlcmlvZCkuIiksZj1jLGM9ZCxkPWYpLGM9InN0cmluZyI9PXR5cGVvZiBjPytjOmMsZT1kYihjLGQpLGpiKHRoaXMsZSxhKSx0aGlzfX1mdW5jdGlvbiBqYihiLGMsZCxlKXt2YXIgZj1jLl9taWxsaXNlY29uZHMsZz1oYihjLl9kYXlzKSxoPWhiKGMuX21vbnRocyk7Yi5pc1ZhbGlkKCkmJihlPW51bGw9PWU/ITA6ZSxmJiZiLl9kLnNldFRpbWUoYi5fZC52YWx1ZU9mKCkrZipkKSxnJiZPKGIsIkRhdGUiLE4oYiwiRGF0ZSIpK2cqZCksaCYmZ2EoYixOKGIsIk1vbnRoIikraCpkKSxlJiZhLnVwZGF0ZU9mZnNldChiLGd8fGgpKX1mdW5jdGlvbiBrYihhLGIpe3ZhciBjPWF8fEthKCksZD1TYShjLHRoaXMpLnN0YXJ0T2YoImRheSIpLGU9dGhpcy5kaWZmKGQsImRheXMiLCEwKSxmPS02PmU/InNhbWVFbHNlIjotMT5lPyJsYXN0V2VlayI6MD5lPyJsYXN0RGF5IjoxPmU/InNhbWVEYXkiOjI+ZT8ibmV4dERheSI6Nz5lPyJuZXh0V2VlayI6InNhbWVFbHNlIixnPWImJih3KGJbZl0pP2JbZl0oKTpiW2ZdKTtyZXR1cm4gdGhpcy5mb3JtYXQoZ3x8dGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZix0aGlzLEthKGMpKSl9ZnVuY3Rpb24gbGIoKXtyZXR1cm4gbmV3IG8odGhpcyl9ZnVuY3Rpb24gbWIoYSxiKXt2YXIgYz1wKGEpP2E6S2EoYSk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZjLmlzVmFsaWQoKT8oYj1LKG0oYik/Im1pbGxpc2Vjb25kIjpiKSwibWlsbGlzZWNvbmQiPT09Yj90aGlzLnZhbHVlT2YoKT5jLnZhbHVlT2YoKTpjLnZhbHVlT2YoKTx0aGlzLmNsb25lKCkuc3RhcnRPZihiKS52YWx1ZU9mKCkpOiExfWZ1bmN0aW9uIG5iKGEsYil7dmFyIGM9cChhKT9hOkthKGEpO3JldHVybiB0aGlzLmlzVmFsaWQoKSYmYy5pc1ZhbGlkKCk/KGI9SyhtKGIpPyJtaWxsaXNlY29uZCI6YiksIm1pbGxpc2Vjb25kIj09PWI/dGhpcy52YWx1ZU9mKCk8Yy52YWx1ZU9mKCk6dGhpcy5jbG9uZSgpLmVuZE9mKGIpLnZhbHVlT2YoKTxjLnZhbHVlT2YoKSk6ITF9ZnVuY3Rpb24gb2IoYSxiLGMsZCl7cmV0dXJuIGQ9ZHx8IigpIiwoIigiPT09ZFswXT90aGlzLmlzQWZ0ZXIoYSxjKTohdGhpcy5pc0JlZm9yZShhLGMpKSYmKCIpIj09PWRbMV0/dGhpcy5pc0JlZm9yZShiLGMpOiF0aGlzLmlzQWZ0ZXIoYixjKSl9ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYyxkPXAoYSk/YTpLYShhKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmQuaXNWYWxpZCgpPyhiPUsoYnx8Im1pbGxpc2Vjb25kIiksIm1pbGxpc2Vjb25kIj09PWI/dGhpcy52YWx1ZU9mKCk9PT1kLnZhbHVlT2YoKTooYz1kLnZhbHVlT2YoKSx0aGlzLmNsb25lKCkuc3RhcnRPZihiKS52YWx1ZU9mKCk8PWMmJmM8PXRoaXMuY2xvbmUoKS5lbmRPZihiKS52YWx1ZU9mKCkpKTohMX1mdW5jdGlvbiBxYihhLGIpe3JldHVybiB0aGlzLmlzU2FtZShhLGIpfHx0aGlzLmlzQWZ0ZXIoYSxiKX1mdW5jdGlvbiByYihhLGIpe3JldHVybiB0aGlzLmlzU2FtZShhLGIpfHx0aGlzLmlzQmVmb3JlKGEsYil9ZnVuY3Rpb24gc2IoYSxiLGMpe3ZhciBkLGUsZixnO3JldHVybiB0aGlzLmlzVmFsaWQoKT8oZD1TYShhLHRoaXMpLGQuaXNWYWxpZCgpPyhlPTZlNCooZC51dGNPZmZzZXQoKS10aGlzLnV0Y09mZnNldCgpKSxiPUsoYiksInllYXIiPT09Ynx8Im1vbnRoIj09PWJ8fCJxdWFydGVyIj09PWI/KGc9dGIodGhpcyxkKSwicXVhcnRlciI9PT1iP2cvPTM6InllYXIiPT09YiYmKGcvPTEyKSk6KGY9dGhpcy1kLGc9InNlY29uZCI9PT1iP2YvMWUzOiJtaW51dGUiPT09Yj9mLzZlNDoiaG91ciI9PT1iP2YvMzZlNToiZGF5Ij09PWI/KGYtZSkvODY0ZTU6IndlZWsiPT09Yj8oZi1lKS82MDQ4ZTU6ZiksYz9nOnEoZykpOk5hTik6TmFOfWZ1bmN0aW9uIHRiKGEsYil7dmFyIGMsZCxlPTEyKihiLnllYXIoKS1hLnllYXIoKSkrKGIubW9udGgoKS1hLm1vbnRoKCkpLGY9YS5jbG9uZSgpLmFkZChlLCJtb250aHMiKTtyZXR1cm4gMD5iLWY/KGM9YS5jbG9uZSgpLmFkZChlLTEsIm1vbnRocyIpLGQ9KGItZikvKGYtYykpOihjPWEuY2xvbmUoKS5hZGQoZSsxLCJtb250aHMiKSxkPShiLWYpLyhjLWYpKSwtKGUrZCl8fDB9ZnVuY3Rpb24gdWIoKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgiZW4iKS5mb3JtYXQoImRkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaIil9ZnVuY3Rpb24gdmIoKXt2YXIgYT10aGlzLmNsb25lKCkudXRjKCk7cmV0dXJuIDA8YS55ZWFyKCkmJmEueWVhcigpPD05OTk5P3coRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpP3RoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTpVKGEsIllZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0iKTpVKGEsIllZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXSIpfWZ1bmN0aW9uIHdiKGIpe2J8fChiPXRoaXMuaXNVdGMoKT9hLmRlZmF1bHRGb3JtYXRVdGM6YS5kZWZhdWx0Rm9ybWF0KTt2YXIgYz1VKHRoaXMsYik7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQoYyl9ZnVuY3Rpb24geGIoYSxiKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJihwKGEpJiZhLmlzVmFsaWQoKXx8S2EoYSkuaXNWYWxpZCgpKT9kYih7dG86dGhpcyxmcm9tOmF9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIWIpOnRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24geWIoYSl7cmV0dXJuIHRoaXMuZnJvbShLYSgpLGEpfWZ1bmN0aW9uIHpiKGEsYil7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiYocChhKSYmYS5pc1ZhbGlkKCl8fEthKGEpLmlzVmFsaWQoKSk/ZGIoe2Zyb206dGhpcyx0bzphfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCFiKTp0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfWZ1bmN0aW9uIEFiKGEpe3JldHVybiB0aGlzLnRvKEthKCksYSl9ZnVuY3Rpb24gQmIoYSl7dmFyIGI7cmV0dXJuIHZvaWQgMD09PWE/dGhpcy5fbG9jYWxlLl9hYmJyOihiPUgoYSksbnVsbCE9YiYmKHRoaXMuX2xvY2FsZT1iKSx0aGlzKX1mdW5jdGlvbiBDYigpe3JldHVybiB0aGlzLl9sb2NhbGV9ZnVuY3Rpb24gRGIoYSl7c3dpdGNoKGE9SyhhKSl7Y2FzZSJ5ZWFyIjp0aGlzLm1vbnRoKDApO2Nhc2UicXVhcnRlciI6Y2FzZSJtb250aCI6dGhpcy5kYXRlKDEpO2Nhc2Uid2VlayI6Y2FzZSJpc29XZWVrIjpjYXNlImRheSI6Y2FzZSJkYXRlIjp0aGlzLmhvdXJzKDApO2Nhc2UiaG91ciI6dGhpcy5taW51dGVzKDApO2Nhc2UibWludXRlIjp0aGlzLnNlY29uZHMoMCk7Y2FzZSJzZWNvbmQiOnRoaXMubWlsbGlzZWNvbmRzKDApfXJldHVybiJ3ZWVrIj09PWEmJnRoaXMud2Vla2RheSgwKSwiaXNvV2VlayI9PT1hJiZ0aGlzLmlzb1dlZWtkYXkoMSksInF1YXJ0ZXIiPT09YSYmdGhpcy5tb250aCgzKk1hdGguZmxvb3IodGhpcy5tb250aCgpLzMpKSx0aGlzfWZ1bmN0aW9uIEViKGEpe3JldHVybiBhPUsoYSksdm9pZCAwPT09YXx8Im1pbGxpc2Vjb25kIj09PWE/dGhpczooImRhdGUiPT09YSYmKGE9ImRheSIpLHRoaXMuc3RhcnRPZihhKS5hZGQoMSwiaXNvV2VlayI9PT1hPyJ3ZWVrIjphKS5zdWJ0cmFjdCgxLCJtcyIpKX1mdW5jdGlvbiBGYigpe3JldHVybiB0aGlzLl9kLnZhbHVlT2YoKS02ZTQqKHRoaXMuX29mZnNldHx8MCl9ZnVuY3Rpb24gR2IoKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKS8xZTMpfWZ1bmN0aW9uIEhiKCl7cmV0dXJuIHRoaXMuX29mZnNldD9uZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk6dGhpcy5fZH1mdW5jdGlvbiBJYigpe3ZhciBhPXRoaXM7cmV0dXJuW2EueWVhcigpLGEubW9udGgoKSxhLmRhdGUoKSxhLmhvdXIoKSxhLm1pbnV0ZSgpLGEuc2Vjb25kKCksYS5taWxsaXNlY29uZCgpXX1mdW5jdGlvbiBKYigpe3ZhciBhPXRoaXM7cmV0dXJue3llYXJzOmEueWVhcigpLG1vbnRoczphLm1vbnRoKCksZGF0ZTphLmRhdGUoKSxob3VyczphLmhvdXJzKCksbWludXRlczphLm1pbnV0ZXMoKSxzZWNvbmRzOmEuc2Vjb25kcygpLG1pbGxpc2Vjb25kczphLm1pbGxpc2Vjb25kcygpfX1mdW5jdGlvbiBLYigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLnRvSVNPU3RyaW5nKCk6bnVsbH1mdW5jdGlvbiBMYigpe3JldHVybiBrKHRoaXMpfWZ1bmN0aW9uIE1iKCl7cmV0dXJuIGcoe30saih0aGlzKSl9ZnVuY3Rpb24gTmIoKXtyZXR1cm4gaih0aGlzKS5vdmVyZmxvd31mdW5jdGlvbiBPYigpe3JldHVybntpbnB1dDp0aGlzLl9pLGZvcm1hdDp0aGlzLl9mLGxvY2FsZTp0aGlzLl9sb2NhbGUsaXNVVEM6dGhpcy5faXNVVEMsc3RyaWN0OnRoaXMuX3N0cmljdH19ZnVuY3Rpb24gUGIoYSxiKXtSKDAsW2EsYS5sZW5ndGhdLDAsYil9ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIFViLmNhbGwodGhpcyxhLHRoaXMud2VlaygpLHRoaXMud2Vla2RheSgpLHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyx0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpfWZ1bmN0aW9uIFJiKGEpe3JldHVybiBVYi5jYWxsKHRoaXMsYSx0aGlzLmlzb1dlZWsoKSx0aGlzLmlzb1dlZWtkYXkoKSwxLDQpfWZ1bmN0aW9uIFNiKCl7cmV0dXJuIHhhKHRoaXMueWVhcigpLDEsNCl9ZnVuY3Rpb24gVGIoKXt2YXIgYT10aGlzLmxvY2FsZURhdGEoKS5fd2VlaztyZXR1cm4geGEodGhpcy55ZWFyKCksYS5kb3csYS5kb3kpfWZ1bmN0aW9uIFViKGEsYixjLGQsZSl7dmFyIGY7cmV0dXJuIG51bGw9PWE/d2EodGhpcyxkLGUpLnllYXI6KGY9eGEoYSxkLGUpLGI+ZiYmKGI9ZiksVmIuY2FsbCh0aGlzLGEsYixjLGQsZSkpfWZ1bmN0aW9uIFZiKGEsYixjLGQsZSl7dmFyIGY9dmEoYSxiLGMsZCxlKSxnPXFhKGYueWVhciwwLGYuZGF5T2ZZZWFyKTtyZXR1cm4gdGhpcy55ZWFyKGcuZ2V0VVRDRnVsbFllYXIoKSksdGhpcy5tb250aChnLmdldFVUQ01vbnRoKCkpLHRoaXMuZGF0ZShnLmdldFVUQ0RhdGUoKSksdGhpc31mdW5jdGlvbiBXYihhKXtyZXR1cm4gbnVsbD09YT9NYXRoLmNlaWwoKHRoaXMubW9udGgoKSsxKS8zKTp0aGlzLm1vbnRoKDMqKGEtMSkrdGhpcy5tb250aCgpJTMpfWZ1bmN0aW9uIFhiKGEpe3JldHVybiB3YShhLHRoaXMuX3dlZWsuZG93LHRoaXMuX3dlZWsuZG95KS53ZWVrfWZ1bmN0aW9uIFliKCl7cmV0dXJuIHRoaXMuX3dlZWsuZG93fWZ1bmN0aW9uIFpiKCl7cmV0dXJuIHRoaXMuX3dlZWsuZG95fWZ1bmN0aW9uICRiKGEpe3ZhciBiPXRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7cmV0dXJuIG51bGw9PWE/Yjp0aGlzLmFkZCg3KihhLWIpLCJkIil9ZnVuY3Rpb24gX2IoYSl7dmFyIGI9d2EodGhpcywxLDQpLndlZWs7cmV0dXJuIG51bGw9PWE/Yjp0aGlzLmFkZCg3KihhLWIpLCJkIil9ZnVuY3Rpb24gYWMoYSxiKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGE/YTppc05hTihhKT8oYT1iLndlZWtkYXlzUGFyc2UoYSksIm51bWJlciI9PXR5cGVvZiBhP2E6bnVsbCk6cGFyc2VJbnQoYSwxMCl9ZnVuY3Rpb24gYmMoYSxiKXtyZXR1cm4gYyh0aGlzLl93ZWVrZGF5cyk/dGhpcy5fd2Vla2RheXNbYS5kYXkoKV06dGhpcy5fd2Vla2RheXNbdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChiKT8iZm9ybWF0Ijoic3RhbmRhbG9uZSJdW2EuZGF5KCldfWZ1bmN0aW9uIGNjKGEpe3JldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0W2EuZGF5KCldfWZ1bmN0aW9uIGRjKGEpe3JldHVybiB0aGlzLl93ZWVrZGF5c01pblthLmRheSgpXX1mdW5jdGlvbiBlYyhhLGIsYyl7dmFyIGQsZSxmLGc9YS50b0xvY2FsZUxvd2VyQ2FzZSgpO2lmKCF0aGlzLl93ZWVrZGF5c1BhcnNlKWZvcih0aGlzLl93ZWVrZGF5c1BhcnNlPVtdLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZT1bXSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlPVtdLGQ9MDs3PmQ7KytkKWY9aChbMmUzLDFdKS5kYXkoZCksdGhpcy5fbWluV2Vla2RheXNQYXJzZVtkXT10aGlzLndlZWtkYXlzTWluKGYsIiIpLnRvTG9jYWxlTG93ZXJDYXNlKCksdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2RdPXRoaXMud2Vla2RheXNTaG9ydChmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpLHRoaXMuX3dlZWtkYXlzUGFyc2VbZF09dGhpcy53ZWVrZGF5cyhmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpO3JldHVybiBjPyJkZGRkIj09PWI/KGU9bWQuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpOiJkZGQiPT09Yj8oZT1tZC5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxnKSwtMSE9PWU/ZTpudWxsKTooZT1tZC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCk6ImRkZGQiPT09Yj8oZT1tZC5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpKSk6ImRkZCI9PT1iPyhlPW1kLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOihlPW1kLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSxnKSwtMSE9PWU/ZTooZT1tZC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCkpKTooZT1tZC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOihlPW1kLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpKSl9ZnVuY3Rpb24gZmMoYSxiLGMpe3ZhciBkLGUsZjtpZih0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpcmV0dXJuIGVjLmNhbGwodGhpcyxhLGIsYyk7Zm9yKHRoaXMuX3dlZWtkYXlzUGFyc2V8fCh0aGlzLl93ZWVrZGF5c1BhcnNlPVtdLHRoaXMuX21pbldlZWtkYXlzUGFyc2U9W10sdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlPVtdLHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlPVtdKSxkPTA7Nz5kO2QrKyl7aWYoZT1oKFsyZTMsMV0pLmRheShkKSxjJiYhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbZF0mJih0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKCJeIit0aGlzLndlZWtkYXlzKGUsIiIpLnJlcGxhY2UoIi4iLCIuPyIpKyIkIiwiaSIpLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKCJeIit0aGlzLndlZWtkYXlzU2hvcnQoZSwiIikucmVwbGFjZSgiLiIsIi4/IikrIiQiLCJpIiksdGhpcy5fbWluV2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKCJeIit0aGlzLndlZWtkYXlzTWluKGUsIiIpLnJlcGxhY2UoIi4iLCIuPyIpKyIkIiwiaSIpKSx0aGlzLl93ZWVrZGF5c1BhcnNlW2RdfHwoZj0iXiIrdGhpcy53ZWVrZGF5cyhlLCIiKSsifF4iK3RoaXMud2Vla2RheXNTaG9ydChlLCIiKSsifF4iK3RoaXMud2Vla2RheXNNaW4oZSwiIiksdGhpcy5fd2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKGYucmVwbGFjZSgiLiIsIiIpLCJpIikpLGMmJiJkZGRkIj09PWImJnRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoYyYmImRkZCI9PT1iJiZ0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbZF0udGVzdChhKSlyZXR1cm4gZDtpZihjJiYiZGQiPT09YiYmdGhpcy5fbWluV2Vla2RheXNQYXJzZVtkXS50ZXN0KGEpKXJldHVybiBkO2lmKCFjJiZ0aGlzLl93ZWVrZGF5c1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGR9fWZ1bmN0aW9uIGdjKGEpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbnVsbCE9YT90aGlzOk5hTjt2YXIgYj10aGlzLl9pc1VUQz90aGlzLl9kLmdldFVUQ0RheSgpOnRoaXMuX2QuZ2V0RGF5KCk7cmV0dXJuIG51bGwhPWE/KGE9YWMoYSx0aGlzLmxvY2FsZURhdGEoKSksdGhpcy5hZGQoYS1iLCJkIikpOmJ9ZnVuY3Rpb24gaGMoYSl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBudWxsIT1hP3RoaXM6TmFOO3ZhciBiPSh0aGlzLmRheSgpKzctdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93KSU3O3JldHVybiBudWxsPT1hP2I6dGhpcy5hZGQoYS1iLCJkIil9ZnVuY3Rpb24gaWMoYSl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP251bGw9PWE/dGhpcy5kYXkoKXx8Nzp0aGlzLmRheSh0aGlzLmRheSgpJTc/YTphLTcpOm51bGwhPWE/dGhpczpOYU59ZnVuY3Rpb24gamMoYSl7cmV0dXJuIHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdD8oZih0aGlzLCJfd2Vla2RheXNSZWdleCIpfHxtYy5jYWxsKHRoaXMpLGE/dGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c1JlZ2V4KTp0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4JiZhP3RoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNSZWdleH1mdW5jdGlvbiBrYyhhKXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhmKHRoaXMsIl93ZWVrZGF5c1JlZ2V4Iil8fG1jLmNhbGwodGhpcyksYT90aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4KTp0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXgmJmE/dGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleH1mdW5jdGlvbiBsYyhhKXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhmKHRoaXMsIl93ZWVrZGF5c1JlZ2V4Iil8fG1jLmNhbGwodGhpcyksYT90aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzTWluUmVnZXgpOnRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXgmJmE/dGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c01pblJlZ2V4fWZ1bmN0aW9uIG1jKCl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBiLmxlbmd0aC1hLmxlbmd0aH12YXIgYixjLGQsZSxmLGc9W10saT1bXSxqPVtdLGs9W107Zm9yKGI9MDs3PmI7YisrKWM9aChbMmUzLDFdKS5kYXkoYiksZD10aGlzLndlZWtkYXlzTWluKGMsIiIpLGU9dGhpcy53ZWVrZGF5c1Nob3J0KGMsIiIpLGY9dGhpcy53ZWVrZGF5cyhjLCIiKSxnLnB1c2goZCksaS5wdXNoKGUpLGoucHVzaChmKSxrLnB1c2goZCksay5wdXNoKGUpLGsucHVzaChmKTtmb3IoZy5zb3J0KGEpLGkuc29ydChhKSxqLnNvcnQoYSksay5zb3J0KGEpLGI9MDs3PmI7YisrKWlbYl09WihpW2JdKSxqW2JdPVooaltiXSksa1tiXT1aKGtbYl0pO3RoaXMuX3dlZWtkYXlzUmVnZXg9bmV3IFJlZ0V4cCgiXigiK2suam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleD10aGlzLl93ZWVrZGF5c1JlZ2V4LHRoaXMuX3dlZWtkYXlzTWluUmVnZXg9dGhpcy5fd2Vla2RheXNSZWdleCx0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIitqLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2kuam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2cuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIG5jKGEpe3ZhciBiPU1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKCJkYXkiKS10aGlzLmNsb25lKCkuc3RhcnRPZigieWVhciIpKS84NjRlNSkrMTtyZXR1cm4gbnVsbD09YT9iOnRoaXMuYWRkKGEtYiwiZCIpfWZ1bmN0aW9uIG9jKCl7cmV0dXJuIHRoaXMuaG91cnMoKSUxMnx8MTJ9ZnVuY3Rpb24gcGMoKXtyZXR1cm4gdGhpcy5ob3VycygpfHwyNH1mdW5jdGlvbiBxYyhhLGIpe1IoYSwwLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLHRoaXMubWludXRlcygpLGIpfSl9ZnVuY3Rpb24gcmMoYSxiKXtyZXR1cm4gYi5fbWVyaWRpZW1QYXJzZX1mdW5jdGlvbiBzYyhhKXtyZXR1cm4icCI9PT0oYSsiIikudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCl9ZnVuY3Rpb24gdGMoYSxiLGMpe3JldHVybiBhPjExP2M/InBtIjoiUE0iOmM/ImFtIjoiQU0ifWZ1bmN0aW9uIHVjKGEsYil7YltTZF09cigxZTMqKCIwLiIrYSkpfWZ1bmN0aW9uIHZjKCl7cmV0dXJuIHRoaXMuX2lzVVRDPyJVVEMiOiIifWZ1bmN0aW9uIHdjKCl7cmV0dXJuIHRoaXMuX2lzVVRDPyJDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSI6IiJ9ZnVuY3Rpb24geGMoYSl7cmV0dXJuIEthKDFlMyphKX1mdW5jdGlvbiB5Yygpe3JldHVybiBLYS5hcHBseShudWxsLGFyZ3VtZW50cykucGFyc2Vab25lKCl9ZnVuY3Rpb24gemMoYSxiLGMpe3ZhciBkPXRoaXMuX2NhbGVuZGFyW2FdO3JldHVybiB3KGQpP2QuY2FsbChiLGMpOmR9ZnVuY3Rpb24gQWMoYSl7dmFyIGI9dGhpcy5fbG9uZ0RhdGVGb3JtYXRbYV0sYz10aGlzLl9sb25nRGF0ZUZvcm1hdFthLnRvVXBwZXJDYXNlKCldO3JldHVybiBifHwhYz9iOih0aGlzLl9sb25nRGF0ZUZvcm1hdFthXT1jLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLGZ1bmN0aW9uKGEpe3JldHVybiBhLnNsaWNlKDEpfSksdGhpcy5fbG9uZ0RhdGVGb3JtYXRbYV0pfWZ1bmN0aW9uIEJjKCl7cmV0dXJuIHRoaXMuX2ludmFsaWREYXRlfWZ1bmN0aW9uIENjKGEpe3JldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoIiVkIixhKX1mdW5jdGlvbiBEYyhhKXtyZXR1cm4gYX1mdW5jdGlvbiBFYyhhLGIsYyxkKXt2YXIgZT10aGlzLl9yZWxhdGl2ZVRpbWVbY107cmV0dXJuIHcoZSk/ZShhLGIsYyxkKTplLnJlcGxhY2UoLyVkL2ksYSl9ZnVuY3Rpb24gRmMoYSxiKXt2YXIgYz10aGlzLl9yZWxhdGl2ZVRpbWVbYT4wPyJmdXR1cmUiOiJwYXN0Il07cmV0dXJuIHcoYyk/YyhiKTpjLnJlcGxhY2UoLyVzL2ksYil9ZnVuY3Rpb24gR2MoYSxiLGMsZCl7dmFyIGU9SCgpLGY9aCgpLnNldChkLGIpO3JldHVybiBlW2NdKGYsYSl9ZnVuY3Rpb24gSGMoYSxiLGMpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiIixudWxsIT1iKXJldHVybiBHYyhhLGIsYywibW9udGgiKTt2YXIgZCxlPVtdO2ZvcihkPTA7MTI+ZDtkKyspZVtkXT1HYyhhLGQsYywibW9udGgiKTtyZXR1cm4gZX1mdW5jdGlvbiBJYyhhLGIsYyxkKXsiYm9vbGVhbiI9PXR5cGVvZiBhPygibnVtYmVyIj09dHlwZW9mIGImJihjPWIsYj12b2lkIDApLGI9Ynx8IiIpOihiPWEsYz1iLGE9ITEsIm51bWJlciI9PXR5cGVvZiBiJiYoYz1iLGI9dm9pZCAwKSxiPWJ8fCIiKTt2YXIgZT1IKCksZj1hP2UuX3dlZWsuZG93OjA7aWYobnVsbCE9YylyZXR1cm4gR2MoYiwoYytmKSU3LGQsImRheSIpO3ZhciBnLGg9W107Zm9yKGc9MDs3Pmc7ZysrKWhbZ109R2MoYiwoZytmKSU3LGQsImRheSIpO3JldHVybiBofWZ1bmN0aW9uIEpjKGEsYil7cmV0dXJuIEhjKGEsYiwibW9udGhzIil9ZnVuY3Rpb24gS2MoYSxiKXtyZXR1cm4gSGMoYSxiLCJtb250aHNTaG9ydCIpfWZ1bmN0aW9uIExjKGEsYixjKXtyZXR1cm4gSWMoYSxiLGMsIndlZWtkYXlzIil9ZnVuY3Rpb24gTWMoYSxiLGMpe3JldHVybiBJYyhhLGIsYywid2Vla2RheXNTaG9ydCIpfWZ1bmN0aW9uIE5jKGEsYixjKXtyZXR1cm4gSWMoYSxiLGMsIndlZWtkYXlzTWluIil9ZnVuY3Rpb24gT2MoKXt2YXIgYT10aGlzLl9kYXRhO3JldHVybiB0aGlzLl9taWxsaXNlY29uZHM9TGUodGhpcy5fbWlsbGlzZWNvbmRzKSx0aGlzLl9kYXlzPUxlKHRoaXMuX2RheXMpLHRoaXMuX21vbnRocz1MZSh0aGlzLl9tb250aHMpLGEubWlsbGlzZWNvbmRzPUxlKGEubWlsbGlzZWNvbmRzKSxhLnNlY29uZHM9TGUoYS5zZWNvbmRzKSxhLm1pbnV0ZXM9TGUoYS5taW51dGVzKSxhLmhvdXJzPUxlKGEuaG91cnMpLGEubW9udGhzPUxlKGEubW9udGhzKSxhLnllYXJzPUxlKGEueWVhcnMpLHRoaXN9ZnVuY3Rpb24gUGMoYSxiLGMsZCl7dmFyIGU9ZGIoYixjKTtyZXR1cm4gYS5fbWlsbGlzZWNvbmRzKz1kKmUuX21pbGxpc2Vjb25kcyxhLl9kYXlzKz1kKmUuX2RheXMsYS5fbW9udGhzKz1kKmUuX21vbnRocyxhLl9idWJibGUoKX1mdW5jdGlvbiBRYyhhLGIpe3JldHVybiBQYyh0aGlzLGEsYiwxKX1mdW5jdGlvbiBSYyhhLGIpe3JldHVybiBQYyh0aGlzLGEsYiwtMSl9ZnVuY3Rpb24gU2MoYSl7cmV0dXJuIDA+YT9NYXRoLmZsb29yKGEpOk1hdGguY2VpbChhKX1mdW5jdGlvbiBUYygpe3ZhciBhLGIsYyxkLGUsZj10aGlzLl9taWxsaXNlY29uZHMsZz10aGlzLl9kYXlzLGg9dGhpcy5fbW9udGhzLGk9dGhpcy5fZGF0YTtyZXR1cm4gZj49MCYmZz49MCYmaD49MHx8MD49ZiYmMD49ZyYmMD49aHx8KGYrPTg2NGU1KlNjKFZjKGgpK2cpLGc9MCxoPTApLGkubWlsbGlzZWNvbmRzPWYlMWUzLGE9cShmLzFlMyksaS5zZWNvbmRzPWElNjAsYj1xKGEvNjApLGkubWludXRlcz1iJTYwLGM9cShiLzYwKSxpLmhvdXJzPWMlMjQsZys9cShjLzI0KSxlPXEoVWMoZykpLGgrPWUsZy09U2MoVmMoZSkpLGQ9cShoLzEyKSxoJT0xMixpLmRheXM9ZyxpLm1vbnRocz1oLGkueWVhcnM9ZCx0aGlzfWZ1bmN0aW9uIFVjKGEpe3JldHVybiA0ODAwKmEvMTQ2MDk3fWZ1bmN0aW9uIFZjKGEpe3JldHVybiAxNDYwOTcqYS80ODAwfWZ1bmN0aW9uIFdjKGEpe3ZhciBiLGMsZD10aGlzLl9taWxsaXNlY29uZHM7aWYoYT1LKGEpLCJtb250aCI9PT1hfHwieWVhciI9PT1hKXJldHVybiBiPXRoaXMuX2RheXMrZC84NjRlNSxjPXRoaXMuX21vbnRocytVYyhiKSwibW9udGgiPT09YT9jOmMvMTI7c3dpdGNoKGI9dGhpcy5fZGF5cytNYXRoLnJvdW5kKFZjKHRoaXMuX21vbnRocykpLGEpe2Nhc2Uid2VlayI6cmV0dXJuIGIvNytkLzYwNDhlNTtjYXNlImRheSI6cmV0dXJuIGIrZC84NjRlNTtjYXNlImhvdXIiOnJldHVybiAyNCpiK2QvMzZlNTtjYXNlIm1pbnV0ZSI6cmV0dXJuIDE0NDAqYitkLzZlNDtjYXNlInNlY29uZCI6cmV0dXJuIDg2NDAwKmIrZC8xZTM7Y2FzZSJtaWxsaXNlY29uZCI6cmV0dXJuIE1hdGguZmxvb3IoODY0ZTUqYikrZDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biB1bml0ICIrYSl9fWZ1bmN0aW9uIFhjKCl7cmV0dXJuIHRoaXMuX21pbGxpc2Vjb25kcys4NjRlNSp0aGlzLl9kYXlzK3RoaXMuX21vbnRocyUxMioyNTkyZTYrMzE1MzZlNipyKHRoaXMuX21vbnRocy8xMil9ZnVuY3Rpb24gWWMoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXMoYSl9fWZ1bmN0aW9uIFpjKGEpewpyZXR1cm4gYT1LKGEpLHRoaXNbYSsicyJdKCl9ZnVuY3Rpb24gJGMoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGFbYV19fWZ1bmN0aW9uIF9jKCl7cmV0dXJuIHEodGhpcy5kYXlzKCkvNyl9ZnVuY3Rpb24gYWQoYSxiLGMsZCxlKXtyZXR1cm4gZS5yZWxhdGl2ZVRpbWUoYnx8MSwhIWMsYSxkKX1mdW5jdGlvbiBiZChhLGIsYyl7dmFyIGQ9ZGIoYSkuYWJzKCksZT1fZShkLmFzKCJzIikpLGY9X2UoZC5hcygibSIpKSxnPV9lKGQuYXMoImgiKSksaD1fZShkLmFzKCJkIikpLGk9X2UoZC5hcygiTSIpKSxqPV9lKGQuYXMoInkiKSksaz1lPGFmLnMmJlsicyIsZV18fDE+PWYmJlsibSJdfHxmPGFmLm0mJlsibW0iLGZdfHwxPj1nJiZbImgiXXx8ZzxhZi5oJiZbImhoIixnXXx8MT49aCYmWyJkIl18fGg8YWYuZCYmWyJkZCIsaF18fDE+PWkmJlsiTSJdfHxpPGFmLk0mJlsiTU0iLGldfHwxPj1qJiZbInkiXXx8WyJ5eSIsal07cmV0dXJuIGtbMl09YixrWzNdPSthPjAsa1s0XT1jLGFkLmFwcGx5KG51bGwsayl9ZnVuY3Rpb24gY2QoYSxiKXtyZXR1cm4gdm9pZCAwPT09YWZbYV0/ITE6dm9pZCAwPT09Yj9hZlthXTooYWZbYV09YiwhMCl9ZnVuY3Rpb24gZGQoYSl7dmFyIGI9dGhpcy5sb2NhbGVEYXRhKCksYz1iZCh0aGlzLCFhLGIpO3JldHVybiBhJiYoYz1iLnBhc3RGdXR1cmUoK3RoaXMsYykpLGIucG9zdGZvcm1hdChjKX1mdW5jdGlvbiBlZCgpe3ZhciBhLGIsYyxkPWJmKHRoaXMuX21pbGxpc2Vjb25kcykvMWUzLGU9YmYodGhpcy5fZGF5cyksZj1iZih0aGlzLl9tb250aHMpO2E9cShkLzYwKSxiPXEoYS82MCksZCU9NjAsYSU9NjAsYz1xKGYvMTIpLGYlPTEyO3ZhciBnPWMsaD1mLGk9ZSxqPWIsaz1hLGw9ZCxtPXRoaXMuYXNTZWNvbmRzKCk7cmV0dXJuIG0/KDA+bT8iLSI6IiIpKyJQIisoZz9nKyJZIjoiIikrKGg/aCsiTSI6IiIpKyhpP2krIkQiOiIiKSsoanx8a3x8bD8iVCI6IiIpKyhqP2orIkgiOiIiKSsoaz9rKyJNIjoiIikrKGw/bCsiUyI6IiIpOiJQMEQifXZhciBmZCxnZDtnZD1BcnJheS5wcm90b3R5cGUuc29tZT9BcnJheS5wcm90b3R5cGUuc29tZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9T2JqZWN0KHRoaXMpLGM9Yi5sZW5ndGg+Pj4wLGQ9MDtjPmQ7ZCsrKWlmKGQgaW4gYiYmYS5jYWxsKHRoaXMsYltkXSxkLGIpKXJldHVybiEwO3JldHVybiExfTt2YXIgaGQ9YS5tb21lbnRQcm9wZXJ0aWVzPVtdLGlkPSExLGpkPXt9O2Euc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzPSExLGEuZGVwcmVjYXRpb25IYW5kbGVyPW51bGw7dmFyIGtkO2tkPU9iamVjdC5rZXlzP09iamVjdC5rZXlzOmZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGIgaW4gYSlmKGEsYikmJmMucHVzaChiKTtyZXR1cm4gY307dmFyIGxkLG1kLG5kPXt9LG9kPXt9LHBkPS8oXFtbXlxbXSpcXSl8KFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nLHFkPS8oXFtbXlxbXSpcXSl8KFxcKT8oTFRTfExUfExMP0w/TD98bHsxLDR9KS9nLHJkPXt9LHNkPXt9LHRkPS9cZC8sdWQ9L1xkXGQvLHZkPS9cZHszfS8sd2Q9L1xkezR9Lyx4ZD0vWystXT9cZHs2fS8seWQ9L1xkXGQ/Lyx6ZD0vXGRcZFxkXGQ/LyxBZD0vXGRcZFxkXGRcZFxkPy8sQmQ9L1xkezEsM30vLENkPS9cZHsxLDR9LyxEZD0vWystXT9cZHsxLDZ9LyxFZD0vXGQrLyxGZD0vWystXT9cZCsvLEdkPS9afFsrLV1cZFxkOj9cZFxkL2dpLEhkPS9afFsrLV1cZFxkKD86Oj9cZFxkKT8vZ2ksSWQ9L1srLV0/XGQrKFwuXGR7MSwzfSk/LyxKZD0vWzAtOV0qWydhLXpcdTAwQTAtXHUwNUZGXHUwNzAwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSt8W1x1MDYwMC1cdTA2RkZcL10rKFxzKj9bXHUwNjAwLVx1MDZGRl0rKXsxLDJ9L2ksS2Q9e30sTGQ9e30sTWQ9MCxOZD0xLE9kPTIsUGQ9MyxRZD00LFJkPTUsU2Q9NixUZD03LFVkPTg7bWQ9QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/QXJyYXkucHJvdG90eXBlLmluZGV4T2Y6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGI9MDtiPHRoaXMubGVuZ3RoOysrYilpZih0aGlzW2JdPT09YSlyZXR1cm4gYjtyZXR1cm4tMX0sUigiTSIsWyJNTSIsMl0sIk1vIixmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vbnRoKCkrMX0pLFIoIk1NTSIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLGEpfSksUigiTU1NTSIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcyxhKX0pLEooIm1vbnRoIiwiTSIpLFcoIk0iLHlkKSxXKCJNTSIseWQsdWQpLFcoIk1NTSIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5tb250aHNTaG9ydFJlZ2V4KGEpfSksVygiTU1NTSIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5tb250aHNSZWdleChhKX0pLCQoWyJNIiwiTU0iXSxmdW5jdGlvbihhLGIpe2JbTmRdPXIoYSktMX0pLCQoWyJNTU0iLCJNTU1NIl0sZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Yy5fbG9jYWxlLm1vbnRoc1BhcnNlKGEsZCxjLl9zdHJpY3QpO251bGwhPWU/YltOZF09ZTpqKGMpLmludmFsaWRNb250aD1hfSk7dmFyIFZkPS9EW29EXT8oXFtbXlxbXF1dKlxdfFxzKykrTU1NTT8vLFdkPSJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyIi5zcGxpdCgiXyIpLFhkPSJKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYyIuc3BsaXQoIl8iKSxZZD1KZCxaZD1KZCwkZD0vXlxzKigoPzpbKy1dXGR7Nn18XGR7NH0pLSg/OlxkXGQtXGRcZHxXXGRcZC1cZHxXXGRcZHxcZFxkXGR8XGRcZCkpKD86KFR8ICkoXGRcZCg/OjpcZFxkKD86OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8vLF9kPS9eXHMqKCg/OlsrLV1cZHs2fXxcZHs0fSkoPzpcZFxkXGRcZHxXXGRcZFxkfFdcZFxkfFxkXGRcZHxcZFxkKSkoPzooVHwgKShcZFxkKD86XGRcZCg/OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8vLGFlPS9afFsrLV1cZFxkKD86Oj9cZFxkKT8vLGJlPVtbIllZWVlZWS1NTS1ERCIsL1srLV1cZHs2fS1cZFxkLVxkXGQvXSxbIllZWVktTU0tREQiLC9cZHs0fS1cZFxkLVxkXGQvXSxbIkdHR0ctW1ddV1ctRSIsL1xkezR9LVdcZFxkLVxkL10sWyJHR0dHLVtXXVdXIiwvXGR7NH0tV1xkXGQvLCExXSxbIllZWVktREREIiwvXGR7NH0tXGR7M30vXSxbIllZWVktTU0iLC9cZHs0fS1cZFxkLywhMV0sWyJZWVlZWVlNTUREIiwvWystXVxkezEwfS9dLFsiWVlZWU1NREQiLC9cZHs4fS9dLFsiR0dHR1tXXVdXRSIsL1xkezR9V1xkezN9L10sWyJHR0dHW1ddV1ciLC9cZHs0fVdcZHsyfS8sITFdLFsiWVlZWURERCIsL1xkezd9L11dLGNlPVtbIkhIOm1tOnNzLlNTU1MiLC9cZFxkOlxkXGQ6XGRcZFwuXGQrL10sWyJISDptbTpzcyxTU1NTIiwvXGRcZDpcZFxkOlxkXGQsXGQrL10sWyJISDptbTpzcyIsL1xkXGQ6XGRcZDpcZFxkL10sWyJISDptbSIsL1xkXGQ6XGRcZC9dLFsiSEhtbXNzLlNTU1MiLC9cZFxkXGRcZFxkXGRcLlxkKy9dLFsiSEhtbXNzLFNTU1MiLC9cZFxkXGRcZFxkXGQsXGQrL10sWyJISG1tc3MiLC9cZFxkXGRcZFxkXGQvXSxbIkhIbW0iLC9cZFxkXGRcZC9dLFsiSEgiLC9cZFxkL11dLGRlPS9eXC8/RGF0ZVwoKFwtP1xkKykvaTthLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrPXUoIm1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlLiBUaGlzIGlzIGRpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdXBjb21pbmcgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDA3IGZvciBtb3JlIGluZm8uIixmdW5jdGlvbihhKXthLl9kPW5ldyBEYXRlKGEuX2krKGEuX3VzZVVUQz8iIFVUQyI6IiIpKX0pLFIoIlkiLDAsMCxmdW5jdGlvbigpe3ZhciBhPXRoaXMueWVhcigpO3JldHVybiA5OTk5Pj1hPyIiK2E6IisiK2F9KSxSKDAsWyJZWSIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLnllYXIoKSUxMDB9KSxSKDAsWyJZWVlZIiw0XSwwLCJ5ZWFyIiksUigwLFsiWVlZWVkiLDVdLDAsInllYXIiKSxSKDAsWyJZWVlZWVkiLDYsITBdLDAsInllYXIiKSxKKCJ5ZWFyIiwieSIpLFcoIlkiLEZkKSxXKCJZWSIseWQsdWQpLFcoIllZWVkiLENkLHdkKSxXKCJZWVlZWSIsRGQseGQpLFcoIllZWVlZWSIsRGQseGQpLCQoWyJZWVlZWSIsIllZWVlZWSJdLE1kKSwkKCJZWVlZIixmdW5jdGlvbihiLGMpe2NbTWRdPTI9PT1iLmxlbmd0aD9hLnBhcnNlVHdvRGlnaXRZZWFyKGIpOnIoYil9KSwkKCJZWSIsZnVuY3Rpb24oYixjKXtjW01kXT1hLnBhcnNlVHdvRGlnaXRZZWFyKGIpfSksJCgiWSIsZnVuY3Rpb24oYSxiKXtiW01kXT1wYXJzZUludChhLDEwKX0pLGEucGFyc2VUd29EaWdpdFllYXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHIoYSkrKHIoYSk+Njg/MTkwMDoyZTMpfTt2YXIgZWU9TSgiRnVsbFllYXIiLCEwKTthLklTT184NjAxPWZ1bmN0aW9uKCl7fTt2YXIgZmU9dSgibW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNTQ4IixmdW5jdGlvbigpe3ZhciBhPUthLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmEuaXNWYWxpZCgpP3RoaXM+YT90aGlzOmE6bCgpfSksZ2U9dSgibW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNTQ4IixmdW5jdGlvbigpe3ZhciBhPUthLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmEuaXNWYWxpZCgpP2E+dGhpcz90aGlzOmE6bCgpfSksaGU9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3c/RGF0ZS5ub3coKTorbmV3IERhdGV9O1FhKCJaIiwiOiIpLFFhKCJaWiIsIiIpLFcoIloiLEhkKSxXKCJaWiIsSGQpLCQoWyJaIiwiWloiXSxmdW5jdGlvbihhLGIsYyl7Yy5fdXNlVVRDPSEwLGMuX3R6bT1SYShIZCxhKX0pO3ZhciBpZT0vKFtcK1wtXXxcZFxkKS9naTthLnVwZGF0ZU9mZnNldD1mdW5jdGlvbigpe307dmFyIGplPS9eKFwtKT8oPzooXGQqKVsuIF0pPyhcZCspXDooXGQrKSg/Olw6KFxkKylcLj8oXGR7M30pP1xkKik/JC8sa2U9L14oLSk/UCg/OigtP1swLTksLl0qKVkpPyg/OigtP1swLTksLl0qKU0pPyg/OigtP1swLTksLl0qKVcpPyg/OigtP1swLTksLl0qKUQpPyg/OlQoPzooLT9bMC05LC5dKilIKT8oPzooLT9bMC05LC5dKilNKT8oPzooLT9bMC05LC5dKilTKT8pPyQvO2RiLmZuPU9hLnByb3RvdHlwZTt2YXIgbGU9aWIoMSwiYWRkIiksbWU9aWIoLTEsInN1YnRyYWN0Iik7YS5kZWZhdWx0Rm9ybWF0PSJZWVlZLU1NLUREVEhIOm1tOnNzWiIsYS5kZWZhdWx0Rm9ybWF0VXRjPSJZWVlZLU1NLUREVEhIOm1tOnNzW1pdIjt2YXIgbmU9dSgibW9tZW50KCkubGFuZygpIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBtb21lbnQoKS5sb2NhbGVEYXRhKCkgdG8gZ2V0IHRoZSBsYW5ndWFnZSBjb25maWd1cmF0aW9uLiBVc2UgbW9tZW50KCkubG9jYWxlKCkgdG8gY2hhbmdlIGxhbmd1YWdlcy4iLGZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hP3RoaXMubG9jYWxlRGF0YSgpOnRoaXMubG9jYWxlKGEpfSk7UigwLFsiZ2ciLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZWVrWWVhcigpJTEwMH0pLFIoMCxbIkdHIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSUxMDB9KSxQYigiZ2dnZyIsIndlZWtZZWFyIiksUGIoImdnZ2dnIiwid2Vla1llYXIiKSxQYigiR0dHRyIsImlzb1dlZWtZZWFyIiksUGIoIkdHR0dHIiwiaXNvV2Vla1llYXIiKSxKKCJ3ZWVrWWVhciIsImdnIiksSigiaXNvV2Vla1llYXIiLCJHRyIpLFcoIkciLEZkKSxXKCJnIixGZCksVygiR0ciLHlkLHVkKSxXKCJnZyIseWQsdWQpLFcoIkdHR0ciLENkLHdkKSxXKCJnZ2dnIixDZCx3ZCksVygiR0dHR0ciLERkLHhkKSxXKCJnZ2dnZyIsRGQseGQpLF8oWyJnZ2dnIiwiZ2dnZ2ciLCJHR0dHIiwiR0dHR0ciXSxmdW5jdGlvbihhLGIsYyxkKXtiW2Quc3Vic3RyKDAsMildPXIoYSl9KSxfKFsiZ2ciLCJHRyJdLGZ1bmN0aW9uKGIsYyxkLGUpe2NbZV09YS5wYXJzZVR3b0RpZ2l0WWVhcihiKX0pLFIoIlEiLDAsIlFvIiwicXVhcnRlciIpLEooInF1YXJ0ZXIiLCJRIiksVygiUSIsdGQpLCQoIlEiLGZ1bmN0aW9uKGEsYil7YltOZF09MyoocihhKS0xKX0pLFIoInciLFsid3ciLDJdLCJ3byIsIndlZWsiKSxSKCJXIixbIldXIiwyXSwiV28iLCJpc29XZWVrIiksSigid2VlayIsInciKSxKKCJpc29XZWVrIiwiVyIpLFcoInciLHlkKSxXKCJ3dyIseWQsdWQpLFcoIlciLHlkKSxXKCJXVyIseWQsdWQpLF8oWyJ3Iiwid3ciLCJXIiwiV1ciXSxmdW5jdGlvbihhLGIsYyxkKXtiW2Quc3Vic3RyKDAsMSldPXIoYSl9KTt2YXIgb2U9e2RvdzowLGRveTo2fTtSKCJEIixbIkREIiwyXSwiRG8iLCJkYXRlIiksSigiZGF0ZSIsIkQiKSxXKCJEIix5ZCksVygiREQiLHlkLHVkKSxXKCJEbyIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT9iLl9vcmRpbmFsUGFyc2U6Yi5fb3JkaW5hbFBhcnNlTGVuaWVudH0pLCQoWyJEIiwiREQiXSxPZCksJCgiRG8iLGZ1bmN0aW9uKGEsYil7YltPZF09cihhLm1hdGNoKHlkKVswXSwxMCl9KTt2YXIgcGU9TSgiRGF0ZSIsITApO1IoImQiLDAsImRvIiwiZGF5IiksUigiZGQiLDAsMCxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcyxhKX0pLFIoImRkZCIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsYSl9KSxSKCJkZGRkIiwwLDAsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsYSl9KSxSKCJlIiwwLDAsIndlZWtkYXkiKSxSKCJFIiwwLDAsImlzb1dlZWtkYXkiKSxKKCJkYXkiLCJkIiksSigid2Vla2RheSIsImUiKSxKKCJpc29XZWVrZGF5IiwiRSIpLFcoImQiLHlkKSxXKCJlIix5ZCksVygiRSIseWQpLFcoImRkIixmdW5jdGlvbihhLGIpe3JldHVybiBiLndlZWtkYXlzTWluUmVnZXgoYSl9KSxXKCJkZGQiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIud2Vla2RheXNTaG9ydFJlZ2V4KGEpfSksVygiZGRkZCIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi53ZWVrZGF5c1JlZ2V4KGEpfSksXyhbImRkIiwiZGRkIiwiZGRkZCJdLGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWMuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGEsZCxjLl9zdHJpY3QpO251bGwhPWU/Yi5kPWU6aihjKS5pbnZhbGlkV2Vla2RheT1hfSksXyhbImQiLCJlIiwiRSJdLGZ1bmN0aW9uKGEsYixjLGQpe2JbZF09cihhKX0pO3ZhciBxZT0iU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXkiLnNwbGl0KCJfIikscmU9IlN1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCIuc3BsaXQoIl8iKSxzZT0iU3VfTW9fVHVfV2VfVGhfRnJfU2EiLnNwbGl0KCJfIiksdGU9SmQsdWU9SmQsdmU9SmQ7UigiREREIixbIkREREQiLDNdLCJERERvIiwiZGF5T2ZZZWFyIiksSigiZGF5T2ZZZWFyIiwiREREIiksVygiREREIixCZCksVygiRERERCIsdmQpLCQoWyJEREQiLCJEREREIl0sZnVuY3Rpb24oYSxiLGMpe2MuX2RheU9mWWVhcj1yKGEpfSksUigiSCIsWyJISCIsMl0sMCwiaG91ciIpLFIoImgiLFsiaGgiLDJdLDAsb2MpLFIoImsiLFsia2siLDJdLDAscGMpLFIoImhtbSIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuIiIrb2MuYXBwbHkodGhpcykrUSh0aGlzLm1pbnV0ZXMoKSwyKX0pLFIoImhtbXNzIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm4iIitvYy5hcHBseSh0aGlzKStRKHRoaXMubWludXRlcygpLDIpK1EodGhpcy5zZWNvbmRzKCksMil9KSxSKCJIbW0iLDAsMCxmdW5jdGlvbigpe3JldHVybiIiK3RoaXMuaG91cnMoKStRKHRoaXMubWludXRlcygpLDIpfSksUigiSG1tc3MiLDAsMCxmdW5jdGlvbigpe3JldHVybiIiK3RoaXMuaG91cnMoKStRKHRoaXMubWludXRlcygpLDIpK1EodGhpcy5zZWNvbmRzKCksMil9KSxxYygiYSIsITApLHFjKCJBIiwhMSksSigiaG91ciIsImgiKSxXKCJhIixyYyksVygiQSIscmMpLFcoIkgiLHlkKSxXKCJoIix5ZCksVygiSEgiLHlkLHVkKSxXKCJoaCIseWQsdWQpLFcoImhtbSIsemQpLFcoImhtbXNzIixBZCksVygiSG1tIix6ZCksVygiSG1tc3MiLEFkKSwkKFsiSCIsIkhIIl0sUGQpLCQoWyJhIiwiQSJdLGZ1bmN0aW9uKGEsYixjKXtjLl9pc1BtPWMuX2xvY2FsZS5pc1BNKGEpLGMuX21lcmlkaWVtPWF9KSwkKFsiaCIsImhoIl0sZnVuY3Rpb24oYSxiLGMpe2JbUGRdPXIoYSksaihjKS5iaWdIb3VyPSEwfSksJCgiaG1tIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtMjtiW1BkXT1yKGEuc3Vic3RyKDAsZCkpLGJbUWRdPXIoYS5zdWJzdHIoZCkpLGooYykuYmlnSG91cj0hMH0pLCQoImhtbXNzIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtNCxlPWEubGVuZ3RoLTI7YltQZF09cihhLnN1YnN0cigwLGQpKSxiW1FkXT1yKGEuc3Vic3RyKGQsMikpLGJbUmRdPXIoYS5zdWJzdHIoZSkpLGooYykuYmlnSG91cj0hMH0pLCQoIkhtbSIsZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEubGVuZ3RoLTI7YltQZF09cihhLnN1YnN0cigwLGQpKSxiW1FkXT1yKGEuc3Vic3RyKGQpKX0pLCQoIkhtbXNzIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtNCxlPWEubGVuZ3RoLTI7YltQZF09cihhLnN1YnN0cigwLGQpKSxiW1FkXT1yKGEuc3Vic3RyKGQsMikpLGJbUmRdPXIoYS5zdWJzdHIoZSkpfSk7dmFyIHdlPS9bYXBdXC4/bT9cLj8vaSx4ZT1NKCJIb3VycyIsITApO1IoIm0iLFsibW0iLDJdLDAsIm1pbnV0ZSIpLEooIm1pbnV0ZSIsIm0iKSxXKCJtIix5ZCksVygibW0iLHlkLHVkKSwkKFsibSIsIm1tIl0sUWQpO3ZhciB5ZT1NKCJNaW51dGVzIiwhMSk7UigicyIsWyJzcyIsMl0sMCwic2Vjb25kIiksSigic2Vjb25kIiwicyIpLFcoInMiLHlkKSxXKCJzcyIseWQsdWQpLCQoWyJzIiwic3MiXSxSZCk7dmFyIHplPU0oIlNlY29uZHMiLCExKTtSKCJTIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm5+fih0aGlzLm1pbGxpc2Vjb25kKCkvMTAwKX0pLFIoMCxbIlNTIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJufn4odGhpcy5taWxsaXNlY29uZCgpLzEwKX0pLFIoMCxbIlNTUyIsM10sMCwibWlsbGlzZWNvbmQiKSxSKDAsWyJTU1NTIiw0XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDEwKnRoaXMubWlsbGlzZWNvbmQoKX0pLFIoMCxbIlNTU1NTIiw1XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDEwMCp0aGlzLm1pbGxpc2Vjb25kKCl9KSxSKDAsWyJTU1NTU1MiLDZdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWUzKnRoaXMubWlsbGlzZWNvbmQoKX0pLFIoMCxbIlNTU1NTU1MiLDddLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU0KnRoaXMubWlsbGlzZWNvbmQoKX0pLFIoMCxbIlNTU1NTU1NTIiw4XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlNSp0aGlzLm1pbGxpc2Vjb25kKCl9KSxSKDAsWyJTU1NTU1NTU1MiLDldLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU2KnRoaXMubWlsbGlzZWNvbmQoKX0pLEooIm1pbGxpc2Vjb25kIiwibXMiKSxXKCJTIixCZCx0ZCksVygiU1MiLEJkLHVkKSxXKCJTU1MiLEJkLHZkKTt2YXIgQWU7Zm9yKEFlPSJTU1NTIjtBZS5sZW5ndGg8PTk7QWUrPSJTIilXKEFlLEVkKTtmb3IoQWU9IlMiO0FlLmxlbmd0aDw9OTtBZSs9IlMiKSQoQWUsdWMpO3ZhciBCZT1NKCJNaWxsaXNlY29uZHMiLCExKTtSKCJ6IiwwLDAsInpvbmVBYmJyIiksUigienoiLDAsMCwiem9uZU5hbWUiKTt2YXIgQ2U9by5wcm90b3R5cGU7Q2UuYWRkPWxlLENlLmNhbGVuZGFyPWtiLENlLmNsb25lPWxiLENlLmRpZmY9c2IsQ2UuZW5kT2Y9RWIsQ2UuZm9ybWF0PXdiLENlLmZyb209eGIsQ2UuZnJvbU5vdz15YixDZS50bz16YixDZS50b05vdz1BYixDZS5nZXQ9UCxDZS5pbnZhbGlkQXQ9TmIsQ2UuaXNBZnRlcj1tYixDZS5pc0JlZm9yZT1uYixDZS5pc0JldHdlZW49b2IsQ2UuaXNTYW1lPXBiLENlLmlzU2FtZU9yQWZ0ZXI9cWIsQ2UuaXNTYW1lT3JCZWZvcmU9cmIsQ2UuaXNWYWxpZD1MYixDZS5sYW5nPW5lLENlLmxvY2FsZT1CYixDZS5sb2NhbGVEYXRhPUNiLENlLm1heD1nZSxDZS5taW49ZmUsQ2UucGFyc2luZ0ZsYWdzPU1iLENlLnNldD1QLENlLnN0YXJ0T2Y9RGIsQ2Uuc3VidHJhY3Q9bWUsQ2UudG9BcnJheT1JYixDZS50b09iamVjdD1KYixDZS50b0RhdGU9SGIsQ2UudG9JU09TdHJpbmc9dmIsQ2UudG9KU09OPUtiLENlLnRvU3RyaW5nPXViLENlLnVuaXg9R2IsQ2UudmFsdWVPZj1GYixDZS5jcmVhdGlvbkRhdGE9T2IsQ2UueWVhcj1lZSxDZS5pc0xlYXBZZWFyPXRhLENlLndlZWtZZWFyPVFiLENlLmlzb1dlZWtZZWFyPVJiLENlLnF1YXJ0ZXI9Q2UucXVhcnRlcnM9V2IsQ2UubW9udGg9aGEsQ2UuZGF5c0luTW9udGg9aWEsQ2Uud2Vlaz1DZS53ZWVrcz0kYixDZS5pc29XZWVrPUNlLmlzb1dlZWtzPV9iLENlLndlZWtzSW5ZZWFyPVRiLENlLmlzb1dlZWtzSW5ZZWFyPVNiLENlLmRhdGU9cGUsQ2UuZGF5PUNlLmRheXM9Z2MsQ2Uud2Vla2RheT1oYyxDZS5pc29XZWVrZGF5PWljLENlLmRheU9mWWVhcj1uYyxDZS5ob3VyPUNlLmhvdXJzPXhlLENlLm1pbnV0ZT1DZS5taW51dGVzPXllLENlLnNlY29uZD1DZS5zZWNvbmRzPXplLENlLm1pbGxpc2Vjb25kPUNlLm1pbGxpc2Vjb25kcz1CZSxDZS51dGNPZmZzZXQ9VWEsQ2UudXRjPVdhLENlLmxvY2FsPVhhLENlLnBhcnNlWm9uZT1ZYSxDZS5oYXNBbGlnbmVkSG91ck9mZnNldD1aYSxDZS5pc0RTVD0kYSxDZS5pc0RTVFNoaWZ0ZWQ9X2EsQ2UuaXNMb2NhbD1hYixDZS5pc1V0Y09mZnNldD1iYixDZS5pc1V0Yz1jYixDZS5pc1VUQz1jYixDZS56b25lQWJicj12YyxDZS56b25lTmFtZT13YyxDZS5kYXRlcz11KCJkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLiIscGUpLENlLm1vbnRocz11KCJtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQiLGhhKSxDZS55ZWFycz11KCJ5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkIixlZSksQ2Uuem9uZT11KCJtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE3NzkiLFZhKTt2YXIgRGU9Q2UsRWU9e3NhbWVEYXk6IltUb2RheSBhdF0gTFQiLG5leHREYXk6IltUb21vcnJvdyBhdF0gTFQiLG5leHRXZWVrOiJkZGRkIFthdF0gTFQiLGxhc3REYXk6IltZZXN0ZXJkYXkgYXRdIExUIixsYXN0V2VlazoiW0xhc3RdIGRkZGQgW2F0XSBMVCIsc2FtZUVsc2U6IkwifSxGZT17TFRTOiJoOm1tOnNzIEEiLExUOiJoOm1tIEEiLEw6Ik1NL0REL1lZWVkiLExMOiJNTU1NIEQsIFlZWVkiLExMTDoiTU1NTSBELCBZWVlZIGg6bW0gQSIsTExMTDoiZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSJ9LEdlPSJJbnZhbGlkIGRhdGUiLEhlPSIlZCIsSWU9L1xkezEsMn0vLEplPXtmdXR1cmU6ImluICVzIixwYXN0OiIlcyBhZ28iLHM6ImEgZmV3IHNlY29uZHMiLG06ImEgbWludXRlIixtbToiJWQgbWludXRlcyIsaDoiYW4gaG91ciIsaGg6IiVkIGhvdXJzIixkOiJhIGRheSIsZGQ6IiVkIGRheXMiLE06ImEgbW9udGgiLE1NOiIlZCBtb250aHMiLHk6ImEgeWVhciIseXk6IiVkIHllYXJzIn0sS2U9QS5wcm90b3R5cGU7S2UuX2NhbGVuZGFyPUVlLEtlLmNhbGVuZGFyPXpjLEtlLl9sb25nRGF0ZUZvcm1hdD1GZSxLZS5sb25nRGF0ZUZvcm1hdD1BYyxLZS5faW52YWxpZERhdGU9R2UsS2UuaW52YWxpZERhdGU9QmMsS2UuX29yZGluYWw9SGUsS2Uub3JkaW5hbD1DYyxLZS5fb3JkaW5hbFBhcnNlPUllLEtlLnByZXBhcnNlPURjLEtlLnBvc3Rmb3JtYXQ9RGMsS2UuX3JlbGF0aXZlVGltZT1KZSxLZS5yZWxhdGl2ZVRpbWU9RWMsS2UucGFzdEZ1dHVyZT1GYyxLZS5zZXQ9eSxLZS5tb250aHM9Y2EsS2UuX21vbnRocz1XZCxLZS5tb250aHNTaG9ydD1kYSxLZS5fbW9udGhzU2hvcnQ9WGQsS2UubW9udGhzUGFyc2U9ZmEsS2UuX21vbnRoc1JlZ2V4PVpkLEtlLm1vbnRoc1JlZ2V4PWthLEtlLl9tb250aHNTaG9ydFJlZ2V4PVlkLEtlLm1vbnRoc1Nob3J0UmVnZXg9amEsS2Uud2Vlaz1YYixLZS5fd2Vlaz1vZSxLZS5maXJzdERheU9mWWVhcj1aYixLZS5maXJzdERheU9mV2Vlaz1ZYixLZS53ZWVrZGF5cz1iYyxLZS5fd2Vla2RheXM9cWUsS2Uud2Vla2RheXNNaW49ZGMsS2UuX3dlZWtkYXlzTWluPXNlLEtlLndlZWtkYXlzU2hvcnQ9Y2MsS2UuX3dlZWtkYXlzU2hvcnQ9cmUsS2Uud2Vla2RheXNQYXJzZT1mYyxLZS5fd2Vla2RheXNSZWdleD10ZSxLZS53ZWVrZGF5c1JlZ2V4PWpjLEtlLl93ZWVrZGF5c1Nob3J0UmVnZXg9dWUsS2Uud2Vla2RheXNTaG9ydFJlZ2V4PWtjLEtlLl93ZWVrZGF5c01pblJlZ2V4PXZlLEtlLndlZWtkYXlzTWluUmVnZXg9bGMsS2UuaXNQTT1zYyxLZS5fbWVyaWRpZW1QYXJzZT13ZSxLZS5tZXJpZGllbT10YyxFKCJlbiIse29yZGluYWxQYXJzZTovXGR7MSwyfSh0aHxzdHxuZHxyZCkvLG9yZGluYWw6ZnVuY3Rpb24oYSl7dmFyIGI9YSUxMCxjPTE9PT1yKGElMTAwLzEwKT8idGgiOjE9PT1iPyJzdCI6Mj09PWI/Im5kIjozPT09Yj8icmQiOiJ0aCI7cmV0dXJuIGErY319KSxhLmxhbmc9dSgibW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4iLEUpLGEubGFuZ0RhdGE9dSgibW9tZW50LmxhbmdEYXRhIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlRGF0YSBpbnN0ZWFkLiIsSCk7dmFyIExlPU1hdGguYWJzLE1lPVljKCJtcyIpLE5lPVljKCJzIiksT2U9WWMoIm0iKSxQZT1ZYygiaCIpLFFlPVljKCJkIiksUmU9WWMoInciKSxTZT1ZYygiTSIpLFRlPVljKCJ5IiksVWU9JGMoIm1pbGxpc2Vjb25kcyIpLFZlPSRjKCJzZWNvbmRzIiksV2U9JGMoIm1pbnV0ZXMiKSxYZT0kYygiaG91cnMiKSxZZT0kYygiZGF5cyIpLFplPSRjKCJtb250aHMiKSwkZT0kYygieWVhcnMiKSxfZT1NYXRoLnJvdW5kLGFmPXtzOjQ1LG06NDUsaDoyMixkOjI2LE06MTF9LGJmPU1hdGguYWJzLGNmPU9hLnByb3RvdHlwZTtjZi5hYnM9T2MsY2YuYWRkPVFjLGNmLnN1YnRyYWN0PVJjLGNmLmFzPVdjLGNmLmFzTWlsbGlzZWNvbmRzPU1lLGNmLmFzU2Vjb25kcz1OZSxjZi5hc01pbnV0ZXM9T2UsY2YuYXNIb3Vycz1QZSxjZi5hc0RheXM9UWUsY2YuYXNXZWVrcz1SZSxjZi5hc01vbnRocz1TZSxjZi5hc1llYXJzPVRlLGNmLnZhbHVlT2Y9WGMsY2YuX2J1YmJsZT1UYyxjZi5nZXQ9WmMsY2YubWlsbGlzZWNvbmRzPVVlLGNmLnNlY29uZHM9VmUsY2YubWludXRlcz1XZSxjZi5ob3Vycz1YZSxjZi5kYXlzPVllLGNmLndlZWtzPV9jLGNmLm1vbnRocz1aZSxjZi55ZWFycz0kZSxjZi5odW1hbml6ZT1kZCxjZi50b0lTT1N0cmluZz1lZCxjZi50b1N0cmluZz1lZCxjZi50b0pTT049ZWQsY2YubG9jYWxlPUJiLGNmLmxvY2FsZURhdGE9Q2IsY2YudG9Jc29TdHJpbmc9dSgidG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscykiLGVkKSxjZi5sYW5nPW5lLFIoIlgiLDAsMCwidW5peCIpLFIoIngiLDAsMCwidmFsdWVPZiIpLFcoIngiLEZkKSxXKCJYIixJZCksJCgiWCIsZnVuY3Rpb24oYSxiLGMpe2MuX2Q9bmV3IERhdGUoMWUzKnBhcnNlRmxvYXQoYSwxMCkpfSksJCgieCIsZnVuY3Rpb24oYSxiLGMpe2MuX2Q9bmV3IERhdGUocihhKSl9KSxhLnZlcnNpb249IjIuMTMuMCIsYihLYSksYS5mbj1EZSxhLm1pbj1NYSxhLm1heD1OYSxhLm5vdz1oZSxhLnV0Yz1oLGEudW5peD14YyxhLm1vbnRocz1KYyxhLmlzRGF0ZT1kLGEubG9jYWxlPUUsYS5pbnZhbGlkPWwsYS5kdXJhdGlvbj1kYixhLmlzTW9tZW50PXAsYS53ZWVrZGF5cz1MYyxhLnBhcnNlWm9uZT15YyxhLmxvY2FsZURhdGE9SCxhLmlzRHVyYXRpb249UGEsYS5tb250aHNTaG9ydD1LYyxhLndlZWtkYXlzTWluPU5jLGEuZGVmaW5lTG9jYWxlPUYsYS51cGRhdGVMb2NhbGU9RyxhLmxvY2FsZXM9SSxhLndlZWtkYXlzU2hvcnQ9TWMsYS5ub3JtYWxpemVVbml0cz1LLGEucmVsYXRpdmVUaW1lVGhyZXNob2xkPWNkLGEucHJvdG90eXBlPURlO3ZhciBkZj1hO3JldHVybiBkZn0pOw==
LyohCiAqIGNsaXBib2FyZC5qcyB2MS41LjEyCiAqIGh0dHBzOi8vemVub3JvY2hhLmdpdGh1Yi5pby9jbGlwYm9hcmQuanMKICoKICogTGljZW5zZWQgTUlUIMKpIFplbm8gUm9jaGEKICovCihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLkNsaXBib2FyZCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK28rIiciKTt0aHJvdyBmLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkoezE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewp2YXIgbWF0Y2hlcyA9IHJlcXVpcmUoJ21hdGNoZXMtc2VsZWN0b3InKQ0KDQptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlbGVtZW50LCBzZWxlY3RvciwgY2hlY2tZb1NlbGYpIHsNCiAgdmFyIHBhcmVudCA9IGNoZWNrWW9TZWxmID8gZWxlbWVudCA6IGVsZW1lbnQucGFyZW50Tm9kZQ0KDQogIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBkb2N1bWVudCkgew0KICAgIGlmIChtYXRjaGVzKHBhcmVudCwgc2VsZWN0b3IpKSByZXR1cm4gcGFyZW50Ow0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlDQogIH0NCn0NCgp9LHsibWF0Y2hlcy1zZWxlY3RvciI6NX1dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewp2YXIgY2xvc2VzdCA9IHJlcXVpcmUoJ2Nsb3Nlc3QnKTsKCi8qKgogKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci4KICoKICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvcgogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmUKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gZGVsZWdhdGUoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrLCB1c2VDYXB0dXJlKSB7CiAgICB2YXIgbGlzdGVuZXJGbiA9IGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUpOwoKICAgIHJldHVybiB7CiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBGaW5kcyBjbG9zZXN0IG1hdGNoIGFuZCBpbnZva2VzIGNhbGxiYWNrLgogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQKICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yCiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAqIEByZXR1cm4ge0Z1bmN0aW9ufQogKi8KZnVuY3Rpb24gbGlzdGVuZXIoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgIGUuZGVsZWdhdGVUYXJnZXQgPSBjbG9zZXN0KGUudGFyZ2V0LCBzZWxlY3RvciwgdHJ1ZSk7CgogICAgICAgIGlmIChlLmRlbGVnYXRlVGFyZ2V0KSB7CiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoZWxlbWVudCwgZSk7CiAgICAgICAgfQogICAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IGRlbGVnYXRlOwoKfSx7ImNsb3Nlc3QiOjF9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKLyoqCiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgSFRNTCBlbGVtZW50LgogKgogKiBAcGFyYW0ge09iamVjdH0gdmFsdWUKICogQHJldHVybiB7Qm9vbGVhbn0KICovCmV4cG9ydHMubm9kZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZAogICAgICAgICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQKICAgICAgICAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMTsKfTsKCi8qKgogKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50cy4KICoKICogQHBhcmFtIHtPYmplY3R9IHZhbHVlCiAqIEByZXR1cm4ge0Jvb2xlYW59CiAqLwpleHBvcnRzLm5vZGVMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTsKCiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZAogICAgICAgICYmICh0eXBlID09PSAnW29iamVjdCBOb2RlTGlzdF0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXScpCiAgICAgICAgJiYgKCdsZW5ndGgnIGluIHZhbHVlKQogICAgICAgICYmICh2YWx1ZS5sZW5ndGggPT09IDAgfHwgZXhwb3J0cy5ub2RlKHZhbHVlWzBdKSk7Cn07CgovKioKICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBzdHJpbmcuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZQogKiBAcmV0dXJuIHtCb29sZWFufQogKi8KZXhwb3J0cy5zdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycKICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZzsKfTsKCi8qKgogKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLgogKgogKiBAcGFyYW0ge09iamVjdH0gdmFsdWUKICogQHJldHVybiB7Qm9vbGVhbn0KICovCmV4cG9ydHMuZm4gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpOwoKICAgIHJldHVybiB0eXBlID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwp9OwoKfSx7fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CnZhciBpcyA9IHJlcXVpcmUoJy4vaXMnKTsKdmFyIGRlbGVnYXRlID0gcmVxdWlyZSgnZGVsZWdhdGUnKTsKCi8qKgogKiBWYWxpZGF0ZXMgYWxsIHBhcmFtcyBhbmQgY2FsbHMgdGhlIHJpZ2h0CiAqIGxpc3RlbmVyIGZ1bmN0aW9uIGJhc2VkIG9uIGl0cyB0YXJnZXQgdHlwZS4KICoKICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRhcmdldAogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogKiBAcmV0dXJuIHtPYmplY3R9CiAqLwpmdW5jdGlvbiBsaXN0ZW4odGFyZ2V0LCB0eXBlLCBjYWxsYmFjaykgewogICAgaWYgKCF0YXJnZXQgJiYgIXR5cGUgJiYgIWNhbGxiYWNrKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50cycpOwogICAgfQoKICAgIGlmICghaXMuc3RyaW5nKHR5cGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcnKTsKICAgIH0KCiAgICBpZiAoIWlzLmZuKGNhbGxiYWNrKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSBGdW5jdGlvbicpOwogICAgfQoKICAgIGlmIChpcy5ub2RlKHRhcmdldCkpIHsKICAgICAgICByZXR1cm4gbGlzdGVuTm9kZSh0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzLm5vZGVMaXN0KHRhcmdldCkpIHsKICAgICAgICByZXR1cm4gbGlzdGVuTm9kZUxpc3QodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7CiAgICB9CiAgICBlbHNlIGlmIChpcy5zdHJpbmcodGFyZ2V0KSkgewogICAgICAgIHJldHVybiBsaXN0ZW5TZWxlY3Rvcih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcsIEhUTUxFbGVtZW50LCBIVE1MQ29sbGVjdGlvbiwgb3IgTm9kZUxpc3QnKTsKICAgIH0KfQoKLyoqCiAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBIVE1MIGVsZW1lbnQKICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uCiAqCiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUKICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gbGlzdGVuTm9kZShub2RlLCB0eXBlLCBjYWxsYmFjaykgewogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTsKCiAgICByZXR1cm4gewogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50cwogKiBhbmQgcmV0dXJucyBhIHJlbW92ZSBsaXN0ZW5lciBmdW5jdGlvbi4KICoKICogQHBhcmFtIHtOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbn0gbm9kZUxpc3QKICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gbGlzdGVuTm9kZUxpc3Qobm9kZUxpc3QsIHR5cGUsIGNhbGxiYWNrKSB7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTsKICAgIH0pOwoKICAgIHJldHVybiB7CiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobm9kZUxpc3QsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIHNlbGVjdG9yCiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLgogKgogKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IKICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gbGlzdGVuU2VsZWN0b3Ioc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7CiAgICByZXR1cm4gZGVsZWdhdGUoZG9jdW1lbnQuYm9keSwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBsaXN0ZW47Cgp9LHsiLi9pcyI6MywiZGVsZWdhdGUiOjJ9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKDQovKioNCiAqIEVsZW1lbnQgcHJvdG90eXBlLg0KICovDQoNCnZhciBwcm90byA9IEVsZW1lbnQucHJvdG90eXBlOw0KDQovKioNCiAqIFZlbmRvciBmdW5jdGlvbi4NCiAqLw0KDQp2YXIgdmVuZG9yID0gcHJvdG8ubWF0Y2hlc1NlbGVjdG9yDQogIHx8IHByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcg0KICB8fCBwcm90by5tb3pNYXRjaGVzU2VsZWN0b3INCiAgfHwgcHJvdG8ubXNNYXRjaGVzU2VsZWN0b3INCiAgfHwgcHJvdG8ub01hdGNoZXNTZWxlY3RvcjsNCg0KLyoqDQogKiBFeHBvc2UgYG1hdGNoKClgLg0KICovDQoNCm1vZHVsZS5leHBvcnRzID0gbWF0Y2g7DQoNCi8qKg0KICogTWF0Y2ggYGVsYCB0byBgc2VsZWN0b3JgLg0KICoNCiAqIEBwYXJhbSB7RWxlbWVudH0gZWwNCiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3Rvcg0KICogQHJldHVybiB7Qm9vbGVhbn0NCiAqIEBhcGkgcHVibGljDQogKi8NCg0KZnVuY3Rpb24gbWF0Y2goZWwsIHNlbGVjdG9yKSB7DQogIGlmICh2ZW5kb3IpIHJldHVybiB2ZW5kb3IuY2FsbChlbCwgc2VsZWN0b3IpOw0KICB2YXIgbm9kZXMgPSBlbC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7DQogICAgaWYgKG5vZGVzW2ldID09IGVsKSByZXR1cm4gdHJ1ZTsNCiAgfQ0KICByZXR1cm4gZmFsc2U7DQp9Cn0se31dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewpmdW5jdGlvbiBzZWxlY3QoZWxlbWVudCkgewogICAgdmFyIHNlbGVjdGVkVGV4dDsKCiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50Lm5vZGVOYW1lID09PSAnVEVYVEFSRUEnKSB7CiAgICAgICAgZWxlbWVudC5mb2N1cygpOwogICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgZWxlbWVudC52YWx1ZS5sZW5ndGgpOwoKICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSkgewogICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CgogICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTsKICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTsKCiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICB9CgogICAgcmV0dXJuIHNlbGVjdGVkVGV4dDsKfQoKbW9kdWxlLmV4cG9ydHMgPSBzZWxlY3Q7Cgp9LHt9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKZnVuY3Rpb24gRSAoKSB7CgkvLyBLZWVwIHRoaXMgZW1wdHkgc28gaXQncyBlYXNpZXIgdG8gaW5oZXJpdCBmcm9tCiAgLy8gKHZpYSBodHRwczovL2dpdGh1Yi5jb20vbGlwc21hY2sgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRjb3JnYW4vdGlueS1lbWl0dGVyL2lzc3Vlcy8zKQp9CgpFLnByb3RvdHlwZSA9IHsKCW9uOiBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2ssIGN0eCkgewogICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTsKCiAgICAoZVtuYW1lXSB8fCAoZVtuYW1lXSA9IFtdKSkucHVzaCh7CiAgICAgIGZuOiBjYWxsYmFjaywKICAgICAgY3R4OiBjdHgKICAgIH0pOwoKICAgIHJldHVybiB0aGlzOwogIH0sCgogIG9uY2U6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgY3R4KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBmdW5jdGlvbiBsaXN0ZW5lciAoKSB7CiAgICAgIHNlbGYub2ZmKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgY2FsbGJhY2suYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgfTsKCiAgICBsaXN0ZW5lci5fID0gY2FsbGJhY2sKICAgIHJldHVybiB0aGlzLm9uKG5hbWUsIGxpc3RlbmVyLCBjdHgpOwogIH0sCgogIGVtaXQ6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICB2YXIgZGF0YSA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgIHZhciBldnRBcnIgPSAoKHRoaXMuZSB8fCAodGhpcy5lID0ge30pKVtuYW1lXSB8fCBbXSkuc2xpY2UoKTsKICAgIHZhciBpID0gMDsKICAgIHZhciBsZW4gPSBldnRBcnIubGVuZ3RoOwoKICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGV2dEFycltpXS5mbi5hcHBseShldnRBcnJbaV0uY3R4LCBkYXRhKTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAoKICBvZmY6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykgewogICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTsKICAgIHZhciBldnRzID0gZVtuYW1lXTsKICAgIHZhciBsaXZlRXZlbnRzID0gW107CgogICAgaWYgKGV2dHMgJiYgY2FsbGJhY2spIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV2dHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBpZiAoZXZ0c1tpXS5mbiAhPT0gY2FsbGJhY2sgJiYgZXZ0c1tpXS5mbi5fICE9PSBjYWxsYmFjaykKICAgICAgICAgIGxpdmVFdmVudHMucHVzaChldnRzW2ldKTsKICAgICAgfQogICAgfQoKICAgIC8vIFJlbW92ZSBldmVudCBmcm9tIHF1ZXVlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIC8vIFN1Z2dlc3RlZCBieSBodHRwczovL2dpdGh1Yi5jb20vbGF6ZAogICAgLy8gUmVmOiBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRjb3JnYW4vdGlueS1lbWl0dGVyL2NvbW1pdC9jNmViZmFhOWJjOTczYjMzZDExMGE4NGEzMDc3NDJiN2NmOTRjOTUzI2NvbW1pdGNvbW1lbnQtNTAyNDkxMAoKICAgIChsaXZlRXZlbnRzLmxlbmd0aCkKICAgICAgPyBlW25hbWVdID0gbGl2ZUV2ZW50cwogICAgICA6IGRlbGV0ZSBlW25hbWVdOwoKICAgIHJldHVybiB0aGlzOwogIH0KfTsKCm1vZHVsZS5leHBvcnRzID0gRTsKCn0se31dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIGRlZmluZShbJ21vZHVsZScsICdzZWxlY3QnXSwgZmFjdG9yeSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIGZhY3RvcnkobW9kdWxlLCByZXF1aXJlKCdzZWxlY3QnKSk7CiAgICB9IGVsc2UgewogICAgICAgIHZhciBtb2QgPSB7CiAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgfTsKICAgICAgICBmYWN0b3J5KG1vZCwgZ2xvYmFsLnNlbGVjdCk7CiAgICAgICAgZ2xvYmFsLmNsaXBib2FyZEFjdGlvbiA9IG1vZC5leHBvcnRzOwogICAgfQp9KSh0aGlzLCBmdW5jdGlvbiAobW9kdWxlLCBfc2VsZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9zZWxlY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2VsZWN0KTsKCiAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgIH07CiAgICB9CgogICAgdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiID8gZnVuY3Rpb24gKG9iaikgewogICAgICAgIHJldHVybiB0eXBlb2Ygb2JqOwogICAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7CiAgICB9OwoKICAgIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICAgICAgICB9CiAgICB9CgogICAgdmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsKICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgICAgICAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgICAgICAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgICAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yOwogICAgICAgIH07CiAgICB9KCk7CgogICAgdmFyIENsaXBib2FyZEFjdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwogICAgICAgICAqLwoKICAgICAgICBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb24ob3B0aW9ucykgewogICAgICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xpcGJvYXJkQWN0aW9uKTsKCiAgICAgICAgICAgIHRoaXMucmVzb2x2ZU9wdGlvbnMob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuaW5pdFNlbGVjdGlvbigpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmaW5lcyBiYXNlIHByb3BlcnRpZXMgcGFzc2VkIGZyb20gY29uc3RydWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAgICAgKi8KCgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUucmVzb2x2ZU9wdGlvbnMgPSBmdW5jdGlvbiByZXNvbHZlT3B0aW9ucygpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTsKCiAgICAgICAgICAgIHRoaXMuYWN0aW9uID0gb3B0aW9ucy5hY3Rpb247CiAgICAgICAgICAgIHRoaXMuZW1pdHRlciA9IG9wdGlvbnMuZW1pdHRlcjsKICAgICAgICAgICAgdGhpcy50YXJnZXQgPSBvcHRpb25zLnRhcmdldDsKICAgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0OwogICAgICAgICAgICB0aGlzLnRyaWdnZXIgPSBvcHRpb25zLnRyaWdnZXI7CgogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICcnOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuaW5pdFNlbGVjdGlvbiA9IGZ1bmN0aW9uIGluaXRTZWxlY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRleHQpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RmFrZSgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFyZ2V0KSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRhcmdldCgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgQ2xpcGJvYXJkQWN0aW9uLnByb3RvdHlwZS5zZWxlY3RGYWtlID0gZnVuY3Rpb24gc2VsZWN0RmFrZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpc1JUTCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpID09ICdydGwnOwoKICAgICAgICAgICAgdGhpcy5yZW1vdmVGYWtlKCk7CgogICAgICAgICAgICB0aGlzLmZha2VIYW5kbGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVtb3ZlRmFrZSgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmZha2VIYW5kbGVyID0gZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZmFrZUhhbmRsZXJDYWxsYmFjaykgfHwgdHJ1ZTsKCiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgICAgICAgICAvLyBQcmV2ZW50IHpvb21pbmcgb24gaU9TCiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUuZm9udFNpemUgPSAnMTJwdCc7CiAgICAgICAgICAgIC8vIFJlc2V0IGJveCBtb2RlbAogICAgICAgICAgICB0aGlzLmZha2VFbGVtLnN0eWxlLmJvcmRlciA9ICcwJzsKICAgICAgICAgICAgdGhpcy5mYWtlRWxlbS5zdHlsZS5wYWRkaW5nID0gJzAnOwogICAgICAgICAgICB0aGlzLmZha2VFbGVtLnN0eWxlLm1hcmdpbiA9ICcwJzsKICAgICAgICAgICAgLy8gTW92ZSBlbGVtZW50IG91dCBvZiBzY3JlZW4gaG9yaXpvbnRhbGx5CiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwogICAgICAgICAgICB0aGlzLmZha2VFbGVtLnN0eWxlW2lzUlRMID8gJ3JpZ2h0JyA6ICdsZWZ0J10gPSAnLTk5OTlweCc7CiAgICAgICAgICAgIC8vIE1vdmUgZWxlbWVudCB0byB0aGUgc2FtZSBwb3NpdGlvbiB2ZXJ0aWNhbGx5CiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUudG9wID0gKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSArICdweCc7CiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTsKICAgICAgICAgICAgdGhpcy5mYWtlRWxlbS52YWx1ZSA9IHRoaXMudGV4dDsKCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5mYWtlRWxlbSk7CgogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICgwLCBfc2VsZWN0Mi5kZWZhdWx0KSh0aGlzLmZha2VFbGVtKTsKICAgICAgICAgICAgdGhpcy5jb3B5VGV4dCgpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUucmVtb3ZlRmFrZSA9IGZ1bmN0aW9uIHJlbW92ZUZha2UoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmZha2VIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIHRoaXMuZmFrZUhhbmRsZXIgPSBudWxsOwogICAgICAgICAgICAgICAgdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZmFrZUVsZW0pIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5mYWtlRWxlbSk7CiAgICAgICAgICAgICAgICB0aGlzLmZha2VFbGVtID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuc2VsZWN0VGFyZ2V0ID0gZnVuY3Rpb24gc2VsZWN0VGFyZ2V0KCkgewogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICgwLCBfc2VsZWN0Mi5kZWZhdWx0KSh0aGlzLnRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuY29weVRleHQoKTsKICAgICAgICB9OwoKICAgICAgICBDbGlwYm9hcmRBY3Rpb24ucHJvdG90eXBlLmNvcHlUZXh0ID0gZnVuY3Rpb24gY29weVRleHQoKSB7CiAgICAgICAgICAgIHZhciBzdWNjZWVkZWQgPSB1bmRlZmluZWQ7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc3VjY2VlZGVkID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQodGhpcy5hY3Rpb24pOwogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmhhbmRsZVJlc3VsdChzdWNjZWVkZWQpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuaGFuZGxlUmVzdWx0ID0gZnVuY3Rpb24gaGFuZGxlUmVzdWx0KHN1Y2NlZWRlZCkgewogICAgICAgICAgICBpZiAoc3VjY2VlZGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdCgnc3VjY2VzcycsIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuc2VsZWN0ZWRUZXh0LAogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRoaXMudHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICBjbGVhclNlbGVjdGlvbjogdGhpcy5jbGVhclNlbGVjdGlvbi5iaW5kKHRoaXMpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KCdlcnJvcicsIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRoaXMudHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICBjbGVhclNlbGVjdGlvbjogdGhpcy5jbGVhclNlbGVjdGlvbi5iaW5kKHRoaXMpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuY2xlYXJTZWxlY3Rpb24gPSBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7CiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5ibHVyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICB9OwoKICAgICAgICBDbGlwYm9hcmRBY3Rpb24ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUZha2UoKTsKICAgICAgICB9OwoKICAgICAgICBfY3JlYXRlQ2xhc3MoQ2xpcGJvYXJkQWN0aW9uLCBbewogICAgICAgICAgICBrZXk6ICdhY3Rpb24nLAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAnY29weScgOiBhcmd1bWVudHNbMF07CgogICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uID0gYWN0aW9uOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hY3Rpb24gIT09ICdjb3B5JyAmJiB0aGlzLl9hY3Rpb24gIT09ICdjdXQnKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJhY3Rpb24iIHZhbHVlLCB1c2UgZWl0aGVyICJjb3B5IiBvciAiY3V0IicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb247CiAgICAgICAgICAgIH0KICAgICAgICB9LCB7CiAgICAgICAgICAgIGtleTogJ3RhcmdldCcsCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0KHRhcmdldCkgewogICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAodHlwZW9mIHRhcmdldCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodGFyZ2V0KSkgPT09ICdvYmplY3QnICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3Rpb24gPT09ICdjb3B5JyAmJiB0YXJnZXQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBQbGVhc2UgdXNlICJyZWFkb25seSIgaW5zdGVhZCBvZiAiZGlzYWJsZWQiIGF0dHJpYnV0ZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3Rpb24gPT09ICdjdXQnICYmICh0YXJnZXQuaGFzQXR0cmlidXRlKCdyZWFkb25seScpIHx8IHRhcmdldC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBZb3UgY2FuXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCAicmVhZG9ubHkiIG9yICJkaXNhYmxlZCIgYXR0cmlidXRlcycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJ0YXJnZXQiIHZhbHVlLCB1c2UgYSB2YWxpZCBFbGVtZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90YXJnZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9XSk7CgogICAgICAgIHJldHVybiBDbGlwYm9hcmRBY3Rpb247CiAgICB9KCk7CgogICAgbW9kdWxlLmV4cG9ydHMgPSBDbGlwYm9hcmRBY3Rpb247Cn0pOwoKfSx7InNlbGVjdCI6Nn1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIGRlZmluZShbJ21vZHVsZScsICcuL2NsaXBib2FyZC1hY3Rpb24nLCAndGlueS1lbWl0dGVyJywgJ2dvb2QtbGlzdGVuZXInXSwgZmFjdG9yeSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIGZhY3RvcnkobW9kdWxlLCByZXF1aXJlKCcuL2NsaXBib2FyZC1hY3Rpb24nKSwgcmVxdWlyZSgndGlueS1lbWl0dGVyJyksIHJlcXVpcmUoJ2dvb2QtbGlzdGVuZXInKSk7CiAgICB9IGVsc2UgewogICAgICAgIHZhciBtb2QgPSB7CiAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgfTsKICAgICAgICBmYWN0b3J5KG1vZCwgZ2xvYmFsLmNsaXBib2FyZEFjdGlvbiwgZ2xvYmFsLnRpbnlFbWl0dGVyLCBnbG9iYWwuZ29vZExpc3RlbmVyKTsKICAgICAgICBnbG9iYWwuY2xpcGJvYXJkID0gbW9kLmV4cG9ydHM7CiAgICB9Cn0pKHRoaXMsIGZ1bmN0aW9uIChtb2R1bGUsIF9jbGlwYm9hcmRBY3Rpb24sIF90aW55RW1pdHRlciwgX2dvb2RMaXN0ZW5lcikgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBfY2xpcGJvYXJkQWN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsaXBib2FyZEFjdGlvbik7CgogICAgdmFyIF90aW55RW1pdHRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90aW55RW1pdHRlcik7CgogICAgdmFyIF9nb29kTGlzdGVuZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ29vZExpc3RlbmVyKTsKCiAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7CiAgICAgICAgaWYgKCFzZWxmKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSA/IGNhbGwgOiBzZWxmOwogICAgfQoKICAgIGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgewogICAgICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIiArIHR5cGVvZiBzdXBlckNsYXNzKTsKICAgICAgICB9CgogICAgICAgIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgewogICAgICAgICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgICAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOwogICAgfQoKICAgIHZhciBDbGlwYm9hcmQgPSBmdW5jdGlvbiAoX0VtaXR0ZXIpIHsKICAgICAgICBfaW5oZXJpdHMoQ2xpcGJvYXJkLCBfRW1pdHRlcik7CgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSB0cmlnZ2VyCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAgICAgKi8KCiAgICAgICAgZnVuY3Rpb24gQ2xpcGJvYXJkKHRyaWdnZXIsIG9wdGlvbnMpIHsKICAgICAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsaXBib2FyZCk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfRW1pdHRlci5jYWxsKHRoaXMpKTsKCiAgICAgICAgICAgIF90aGlzLnJlc29sdmVPcHRpb25zKG9wdGlvbnMpOwogICAgICAgICAgICBfdGhpcy5saXN0ZW5DbGljayh0cmlnZ2VyKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmaW5lcyBpZiBhdHRyaWJ1dGVzIHdvdWxkIGJlIHJlc29sdmVkIHVzaW5nIGludGVybmFsIHNldHRlciBmdW5jdGlvbnMKICAgICAgICAgKiBvciBjdXN0b20gZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgICAgICovCgoKICAgICAgICBDbGlwYm9hcmQucHJvdG90eXBlLnJlc29sdmVPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZU9wdGlvbnMoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgogICAgICAgICAgICB0aGlzLmFjdGlvbiA9IHR5cGVvZiBvcHRpb25zLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMuYWN0aW9uIDogdGhpcy5kZWZhdWx0QWN0aW9uOwogICAgICAgICAgICB0aGlzLnRhcmdldCA9IHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGFyZ2V0IDogdGhpcy5kZWZhdWx0VGFyZ2V0OwogICAgICAgICAgICB0aGlzLnRleHQgPSB0eXBlb2Ygb3B0aW9ucy50ZXh0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50ZXh0IDogdGhpcy5kZWZhdWx0VGV4dDsKICAgICAgICB9OwoKICAgICAgICBDbGlwYm9hcmQucHJvdG90eXBlLmxpc3RlbkNsaWNrID0gZnVuY3Rpb24gbGlzdGVuQ2xpY2sodHJpZ2dlcikgewogICAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIgPSAoMCwgX2dvb2RMaXN0ZW5lcjIuZGVmYXVsdCkodHJpZ2dlciwgJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIub25DbGljayhlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgQ2xpcGJvYXJkLnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24gb25DbGljayhlKSB7CiAgICAgICAgICAgIHZhciB0cmlnZ2VyID0gZS5kZWxlZ2F0ZVRhcmdldCB8fCBlLmN1cnJlbnRUYXJnZXQ7CgogICAgICAgICAgICBpZiAodGhpcy5jbGlwYm9hcmRBY3Rpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkQWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRBY3Rpb24gPSBuZXcgX2NsaXBib2FyZEFjdGlvbjIuZGVmYXVsdCh7CiAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uKHRyaWdnZXIpLAogICAgICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCh0cmlnZ2VyKSwKICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMudGV4dCh0cmlnZ2VyKSwKICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsCiAgICAgICAgICAgICAgICBlbWl0dGVyOiB0aGlzCiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVmYXVsdEFjdGlvbiA9IGZ1bmN0aW9uIGRlZmF1bHRBY3Rpb24odHJpZ2dlcikgewogICAgICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ2FjdGlvbicsIHRyaWdnZXIpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVmYXVsdFRhcmdldCA9IGZ1bmN0aW9uIGRlZmF1bHRUYXJnZXQodHJpZ2dlcikgewogICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgndGFyZ2V0JywgdHJpZ2dlcik7CgogICAgICAgICAgICBpZiAoc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVmYXVsdFRleHQgPSBmdW5jdGlvbiBkZWZhdWx0VGV4dCh0cmlnZ2VyKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgndGV4dCcsIHRyaWdnZXIpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZGVzdHJveSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2xpcGJvYXJkQWN0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZEFjdGlvbi5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZEFjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICByZXR1cm4gQ2xpcGJvYXJkOwogICAgfShfdGlueUVtaXR0ZXIyLmRlZmF1bHQpOwoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJldHJpZXZlIGF0dHJpYnV0ZSB2YWx1ZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWZmaXgKICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShzdWZmaXgsIGVsZW1lbnQpIHsKICAgICAgICB2YXIgYXR0cmlidXRlID0gJ2RhdGEtY2xpcGJvYXJkLScgKyBzdWZmaXg7CgogICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKICAgIH0KCiAgICBtb2R1bGUuZXhwb3J0cyA9IENsaXBib2FyZDsKfSk7Cgp9LHsiLi9jbGlwYm9hcmQtYWN0aW9uIjo4LCJnb29kLWxpc3RlbmVyIjo0LCJ0aW55LWVtaXR0ZXIiOjd9XX0se30sWzldKSg5KQp9KTs=
LyohCiAqIGNsaXBib2FyZC5qcyB2MS41LjEyCiAqIGh0dHBzOi8vemVub3JvY2hhLmdpdGh1Yi5pby9jbGlwYm9hcmQuanMKICoKICogTGljZW5zZWQgTUlUIMKpIFplbm8gUm9jaGEKICovCiFmdW5jdGlvbih0KXtpZigib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPXQoKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtdLHQpO2Vsc2V7dmFyIGU7ZT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZS5DbGlwYm9hcmQ9dCgpfX0oZnVuY3Rpb24oKXt2YXIgdCxlLG47cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLG8pe2Z1bmN0aW9uIGkoYSxjKXtpZighblthXSl7aWYoIWVbYV0pe3ZhciBzPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFjJiZzKXJldHVybiBzKGEsITApO2lmKHIpcmV0dXJuIHIoYSwhMCk7dmFyIGw9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrYSsiJyIpO3Rocm93IGwuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsbH12YXIgdT1uW2FdPXtleHBvcnRzOnt9fTtlW2FdWzBdLmNhbGwodS5leHBvcnRzLGZ1bmN0aW9uKHQpe3ZhciBuPWVbYV1bMV1bdF07cmV0dXJuIGkobj9uOnQpfSx1LHUuZXhwb3J0cyx0LGUsbixvKX1yZXR1cm4gblthXS5leHBvcnRzfWZvcih2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxhPTA7YTxvLmxlbmd0aDthKyspaShvW2FdKTtyZXR1cm4gaX0oezE6W2Z1bmN0aW9uKHQsZSxuKXt2YXIgbz10KCJtYXRjaGVzLXNlbGVjdG9yIik7ZS5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9bj90OnQucGFyZW50Tm9kZTtpJiZpIT09ZG9jdW1lbnQ7KXtpZihvKGksZSkpcmV0dXJuIGk7aT1pLnBhcmVudE5vZGV9fX0seyJtYXRjaGVzLXNlbGVjdG9yIjo1fV0sMjpbZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIG8odCxlLG4sbyxyKXt2YXIgYT1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKG4sYSxyKSx7ZGVzdHJveTpmdW5jdGlvbigpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLGEscil9fX1mdW5jdGlvbiBpKHQsZSxuLG8pe3JldHVybiBmdW5jdGlvbihuKXtuLmRlbGVnYXRlVGFyZ2V0PXIobi50YXJnZXQsZSwhMCksbi5kZWxlZ2F0ZVRhcmdldCYmby5jYWxsKHQsbil9fXZhciByPXQoImNsb3Nlc3QiKTtlLmV4cG9ydHM9b30se2Nsb3Nlc3Q6MX1dLDM6W2Z1bmN0aW9uKHQsZSxuKXtuLm5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmMT09PXQubm9kZVR5cGV9LG4ubm9kZUxpc3Q9ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO3JldHVybiB2b2lkIDAhPT10JiYoIltvYmplY3QgTm9kZUxpc3RdIj09PWV8fCJbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSI9PT1lKSYmImxlbmd0aCJpbiB0JiYoMD09PXQubGVuZ3RofHxuLm5vZGUodFswXSkpfSxuLnN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBTdHJpbmd9LG4uZm49ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1lfX0se31dLDQ6W2Z1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiBvKHQsZSxuKXtpZighdCYmIWUmJiFuKXRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudHMiKTtpZighYy5zdHJpbmcoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmciKTtpZighYy5mbihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGlyZCBhcmd1bWVudCBtdXN0IGJlIGEgRnVuY3Rpb24iKTtpZihjLm5vZGUodCkpcmV0dXJuIGkodCxlLG4pO2lmKGMubm9kZUxpc3QodCkpcmV0dXJuIHIodCxlLG4pO2lmKGMuc3RyaW5nKHQpKXJldHVybiBhKHQsZSxuKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nLCBIVE1MRWxlbWVudCwgSFRNTENvbGxlY3Rpb24sIG9yIE5vZGVMaXN0Iil9ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcihlLG4pLHtkZXN0cm95OmZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9fX1mdW5jdGlvbiByKHQsZSxuKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLG4pfSkse2Rlc3Ryb3k6ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9KX19fWZ1bmN0aW9uIGEodCxlLG4pe3JldHVybiBzKGRvY3VtZW50LmJvZHksdCxlLG4pfXZhciBjPXQoIi4vaXMiKSxzPXQoImRlbGVnYXRlIik7ZS5leHBvcnRzPW99LHsiLi9pcyI6MyxkZWxlZ2F0ZToyfV0sNTpbZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIG8odCxlKXtpZihyKXJldHVybiByLmNhbGwodCxlKTtmb3IodmFyIG49dC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoZSksbz0wO288bi5sZW5ndGg7KytvKWlmKG5bb109PXQpcmV0dXJuITA7cmV0dXJuITF9dmFyIGk9RWxlbWVudC5wcm90b3R5cGUscj1pLm1hdGNoZXNTZWxlY3Rvcnx8aS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGkubW96TWF0Y2hlc1NlbGVjdG9yfHxpLm1zTWF0Y2hlc1NlbGVjdG9yfHxpLm9NYXRjaGVzU2VsZWN0b3I7ZS5leHBvcnRzPW99LHt9XSw2OltmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gbyh0KXt2YXIgZTtpZigiSU5QVVQiPT09dC5ub2RlTmFtZXx8IlRFWFRBUkVBIj09PXQubm9kZU5hbWUpdC5mb2N1cygpLHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCx0LnZhbHVlLmxlbmd0aCksZT10LnZhbHVlO2Vsc2V7dC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpJiZ0LmZvY3VzKCk7dmFyIG49d2luZG93LmdldFNlbGVjdGlvbigpLG89ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtvLnNlbGVjdE5vZGVDb250ZW50cyh0KSxuLnJlbW92ZUFsbFJhbmdlcygpLG4uYWRkUmFuZ2UobyksZT1uLnRvU3RyaW5nKCl9cmV0dXJuIGV9ZS5leHBvcnRzPW99LHt9XSw3OltmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gbygpe31vLnByb3RvdHlwZT17b246ZnVuY3Rpb24odCxlLG4pe3ZhciBvPXRoaXMuZXx8KHRoaXMuZT17fSk7cmV0dXJuKG9bdF18fChvW3RdPVtdKSkucHVzaCh7Zm46ZSxjdHg6bn0pLHRoaXN9LG9uY2U6ZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIG8oKXtpLm9mZih0LG8pLGUuYXBwbHkobixhcmd1bWVudHMpfXZhciBpPXRoaXM7cmV0dXJuIG8uXz1lLHRoaXMub24odCxvLG4pfSxlbWl0OmZ1bmN0aW9uKHQpe3ZhciBlPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG49KCh0aGlzLmV8fCh0aGlzLmU9e30pKVt0XXx8W10pLnNsaWNlKCksbz0wLGk9bi5sZW5ndGg7Zm9yKG87aT5vO28rKyluW29dLmZuLmFwcGx5KG5bb10uY3R4LGUpO3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmV8fCh0aGlzLmU9e30pLG89blt0XSxpPVtdO2lmKG8mJmUpZm9yKHZhciByPTAsYT1vLmxlbmd0aDthPnI7cisrKW9bcl0uZm4hPT1lJiZvW3JdLmZuLl8hPT1lJiZpLnB1c2gob1tyXSk7cmV0dXJuIGkubGVuZ3RoP25bdF09aTpkZWxldGUgblt0XSx0aGlzfX0sZS5leHBvcnRzPW99LHt9XSw4OltmdW5jdGlvbihlLG4sbyl7IWZ1bmN0aW9uKGkscil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuYW1kKXQoWyJtb2R1bGUiLCJzZWxlY3QiXSxyKTtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgbylyKG4sZSgic2VsZWN0IikpO2Vsc2V7dmFyIGE9e2V4cG9ydHM6e319O3IoYSxpLnNlbGVjdCksaS5jbGlwYm9hcmRBY3Rpb249YS5leHBvcnRzfX0odGhpcyxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ImRlZmF1bHQiOnR9fWZ1bmN0aW9uIG8odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX12YXIgaT1uKGUpLHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbD8ic3ltYm9sIjp0eXBlb2YgdH0sYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxuLG8pe3JldHVybiBuJiZ0KGUucHJvdG90eXBlLG4pLG8mJnQoZSxvKSxlfX0oKSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCksdGhpcy5yZXNvbHZlT3B0aW9ucyhlKSx0aGlzLmluaXRTZWxlY3Rpb24oKX1yZXR1cm4gdC5wcm90b3R5cGUucmVzb2x2ZU9wdGlvbnM9ZnVuY3Rpb24gdCgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg8PTB8fHZvaWQgMD09PWFyZ3VtZW50c1swXT97fTphcmd1bWVudHNbMF07dGhpcy5hY3Rpb249ZS5hY3Rpb24sdGhpcy5lbWl0dGVyPWUuZW1pdHRlcix0aGlzLnRhcmdldD1lLnRhcmdldCx0aGlzLnRleHQ9ZS50ZXh0LHRoaXMudHJpZ2dlcj1lLnRyaWdnZXIsdGhpcy5zZWxlY3RlZFRleHQ9IiJ9LHQucHJvdG90eXBlLmluaXRTZWxlY3Rpb249ZnVuY3Rpb24gdCgpe3RoaXMudGV4dD90aGlzLnNlbGVjdEZha2UoKTp0aGlzLnRhcmdldCYmdGhpcy5zZWxlY3RUYXJnZXQoKX0sdC5wcm90b3R5cGUuc2VsZWN0RmFrZT1mdW5jdGlvbiB0KCl7dmFyIGU9dGhpcyxuPSJydGwiPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkaXIiKTt0aGlzLnJlbW92ZUZha2UoKSx0aGlzLmZha2VIYW5kbGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZW1vdmVGYWtlKCl9LHRoaXMuZmFrZUhhbmRsZXI9ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKXx8ITAsdGhpcy5mYWtlRWxlbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpLHRoaXMuZmFrZUVsZW0uc3R5bGUuZm9udFNpemU9IjEycHQiLHRoaXMuZmFrZUVsZW0uc3R5bGUuYm9yZGVyPSIwIix0aGlzLmZha2VFbGVtLnN0eWxlLnBhZGRpbmc9IjAiLHRoaXMuZmFrZUVsZW0uc3R5bGUubWFyZ2luPSIwIix0aGlzLmZha2VFbGVtLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5mYWtlRWxlbS5zdHlsZVtuPyJyaWdodCI6ImxlZnQiXT0iLTk5OTlweCIsdGhpcy5mYWtlRWxlbS5zdHlsZS50b3A9KHdpbmRvdy5wYWdlWU9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCkrInB4Iix0aGlzLmZha2VFbGVtLnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCIiKSx0aGlzLmZha2VFbGVtLnZhbHVlPXRoaXMudGV4dCxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZmFrZUVsZW0pLHRoaXMuc2VsZWN0ZWRUZXh0PSgwLGkuZGVmYXVsdCkodGhpcy5mYWtlRWxlbSksdGhpcy5jb3B5VGV4dCgpfSx0LnByb3RvdHlwZS5yZW1vdmVGYWtlPWZ1bmN0aW9uIHQoKXt0aGlzLmZha2VIYW5kbGVyJiYoZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKSx0aGlzLmZha2VIYW5kbGVyPW51bGwsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrPW51bGwpLHRoaXMuZmFrZUVsZW0mJihkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMuZmFrZUVsZW0pLHRoaXMuZmFrZUVsZW09bnVsbCl9LHQucHJvdG90eXBlLnNlbGVjdFRhcmdldD1mdW5jdGlvbiB0KCl7dGhpcy5zZWxlY3RlZFRleHQ9KDAsaS5kZWZhdWx0KSh0aGlzLnRhcmdldCksdGhpcy5jb3B5VGV4dCgpfSx0LnByb3RvdHlwZS5jb3B5VGV4dD1mdW5jdGlvbiB0KCl7dmFyIGU9dm9pZCAwO3RyeXtlPWRvY3VtZW50LmV4ZWNDb21tYW5kKHRoaXMuYWN0aW9uKX1jYXRjaChuKXtlPSExfXRoaXMuaGFuZGxlUmVzdWx0KGUpfSx0LnByb3RvdHlwZS5oYW5kbGVSZXN1bHQ9ZnVuY3Rpb24gdChlKXtlP3RoaXMuZW1pdHRlci5lbWl0KCJzdWNjZXNzIix7YWN0aW9uOnRoaXMuYWN0aW9uLHRleHQ6dGhpcy5zZWxlY3RlZFRleHQsdHJpZ2dlcjp0aGlzLnRyaWdnZXIsY2xlYXJTZWxlY3Rpb246dGhpcy5jbGVhclNlbGVjdGlvbi5iaW5kKHRoaXMpfSk6dGhpcy5lbWl0dGVyLmVtaXQoImVycm9yIix7YWN0aW9uOnRoaXMuYWN0aW9uLHRyaWdnZXI6dGhpcy50cmlnZ2VyLGNsZWFyU2VsZWN0aW9uOnRoaXMuY2xlYXJTZWxlY3Rpb24uYmluZCh0aGlzKX0pfSx0LnByb3RvdHlwZS5jbGVhclNlbGVjdGlvbj1mdW5jdGlvbiB0KCl7dGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0LmJsdXIoKSx3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCl9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24gdCgpe3RoaXMucmVtb3ZlRmFrZSgpfSxhKHQsW3trZXk6ImFjdGlvbiIsc2V0OmZ1bmN0aW9uIHQoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/ImNvcHkiOmFyZ3VtZW50c1swXTtpZih0aGlzLl9hY3Rpb249ZSwiY29weSIhPT10aGlzLl9hY3Rpb24mJiJjdXQiIT09dGhpcy5fYWN0aW9uKXRocm93IG5ldyBFcnJvcignSW52YWxpZCAiYWN0aW9uIiB2YWx1ZSwgdXNlIGVpdGhlciAiY29weSIgb3IgImN1dCInKX0sZ2V0OmZ1bmN0aW9uIHQoKXtyZXR1cm4gdGhpcy5fYWN0aW9ufX0se2tleToidGFyZ2V0IixzZXQ6ZnVuY3Rpb24gdChlKXtpZih2b2lkIDAhPT1lKXtpZighZXx8Im9iamVjdCIhPT0oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOnIoZSkpfHwxIT09ZS5ub2RlVHlwZSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgdmFsdWUsIHVzZSBhIHZhbGlkIEVsZW1lbnQnKTtpZigiY29weSI9PT10aGlzLmFjdGlvbiYmZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJ0YXJnZXQiIGF0dHJpYnV0ZS4gUGxlYXNlIHVzZSAicmVhZG9ubHkiIGluc3RlYWQgb2YgImRpc2FibGVkIiBhdHRyaWJ1dGUnKTtpZigiY3V0Ij09PXRoaXMuYWN0aW9uJiYoZS5oYXNBdHRyaWJ1dGUoInJlYWRvbmx5Iil8fGUuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBZb3UgY2FuXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCAicmVhZG9ubHkiIG9yICJkaXNhYmxlZCIgYXR0cmlidXRlcycpO3RoaXMuX3RhcmdldD1lfX0sZ2V0OmZ1bmN0aW9uIHQoKXtyZXR1cm4gdGhpcy5fdGFyZ2V0fX1dKSx0fSgpO3QuZXhwb3J0cz1jfSl9LHtzZWxlY3Q6Nn1dLDk6W2Z1bmN0aW9uKGUsbixvKXshZnVuY3Rpb24oaSxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5hbWQpdChbIm1vZHVsZSIsIi4vY2xpcGJvYXJkLWFjdGlvbiIsInRpbnktZW1pdHRlciIsImdvb2QtbGlzdGVuZXIiXSxyKTtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgbylyKG4sZSgiLi9jbGlwYm9hcmQtYWN0aW9uIiksZSgidGlueS1lbWl0dGVyIiksZSgiZ29vZC1saXN0ZW5lciIpKTtlbHNle3ZhciBhPXtleHBvcnRzOnt9fTtyKGEsaS5jbGlwYm9hcmRBY3Rpb24saS50aW55RW1pdHRlcixpLmdvb2RMaXN0ZW5lciksaS5jbGlwYm9hcmQ9YS5leHBvcnRzfX0odGhpcyxmdW5jdGlvbih0LGUsbixvKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6eyJkZWZhdWx0Ijp0fX1mdW5jdGlvbiByKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gYSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIGModCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfWZ1bmN0aW9uIHModCxlKXt2YXIgbj0iZGF0YS1jbGlwYm9hcmQtIit0O2lmKGUuaGFzQXR0cmlidXRlKG4pKXJldHVybiBlLmdldEF0dHJpYnV0ZShuKX12YXIgbD1pKGUpLHU9aShuKSxmPWkobyksZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4sbyl7cih0aGlzLGUpO3ZhciBpPWEodGhpcyx0LmNhbGwodGhpcykpO3JldHVybiBpLnJlc29sdmVPcHRpb25zKG8pLGkubGlzdGVuQ2xpY2sobiksaX1yZXR1cm4gYyhlLHQpLGUucHJvdG90eXBlLnJlc29sdmVPcHRpb25zPWZ1bmN0aW9uIHQoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/e306YXJndW1lbnRzWzBdO3RoaXMuYWN0aW9uPSJmdW5jdGlvbiI9PXR5cGVvZiBlLmFjdGlvbj9lLmFjdGlvbjp0aGlzLmRlZmF1bHRBY3Rpb24sdGhpcy50YXJnZXQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUudGFyZ2V0P2UudGFyZ2V0OnRoaXMuZGVmYXVsdFRhcmdldCx0aGlzLnRleHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUudGV4dD9lLnRleHQ6dGhpcy5kZWZhdWx0VGV4dH0sZS5wcm90b3R5cGUubGlzdGVuQ2xpY2s9ZnVuY3Rpb24gdChlKXt2YXIgbj10aGlzO3RoaXMubGlzdGVuZXI9KDAsZi5kZWZhdWx0KShlLCJjbGljayIsZnVuY3Rpb24odCl7cmV0dXJuIG4ub25DbGljayh0KX0pfSxlLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uIHQoZSl7dmFyIG49ZS5kZWxlZ2F0ZVRhcmdldHx8ZS5jdXJyZW50VGFyZ2V0O3RoaXMuY2xpcGJvYXJkQWN0aW9uJiYodGhpcy5jbGlwYm9hcmRBY3Rpb249bnVsbCksdGhpcy5jbGlwYm9hcmRBY3Rpb249bmV3IGwuZGVmYXVsdCh7YWN0aW9uOnRoaXMuYWN0aW9uKG4pLHRhcmdldDp0aGlzLnRhcmdldChuKSx0ZXh0OnRoaXMudGV4dChuKSx0cmlnZ2VyOm4sZW1pdHRlcjp0aGlzfSl9LGUucHJvdG90eXBlLmRlZmF1bHRBY3Rpb249ZnVuY3Rpb24gdChlKXtyZXR1cm4gcygiYWN0aW9uIixlKX0sZS5wcm90b3R5cGUuZGVmYXVsdFRhcmdldD1mdW5jdGlvbiB0KGUpe3ZhciBuPXMoInRhcmdldCIsZSk7cmV0dXJuIG4/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuKTp2b2lkIDB9LGUucHJvdG90eXBlLmRlZmF1bHRUZXh0PWZ1bmN0aW9uIHQoZSl7cmV0dXJuIHMoInRleHQiLGUpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uIHQoKXt0aGlzLmxpc3RlbmVyLmRlc3Ryb3koKSx0aGlzLmNsaXBib2FyZEFjdGlvbiYmKHRoaXMuY2xpcGJvYXJkQWN0aW9uLmRlc3Ryb3koKSx0aGlzLmNsaXBib2FyZEFjdGlvbj1udWxsKX0sZX0odS5kZWZhdWx0KTt0LmV4cG9ydHM9ZH0pfSx7Ii4vY2xpcGJvYXJkLWFjdGlvbiI6OCwiZ29vZC1saXN0ZW5lciI6NCwidGlueS1lbWl0dGVyIjo3fV19LHt9LFs5XSkoOSl9KTs=
Ly8gU3BlY3RydW0gQ29sb3JwaWNrZXIgdjEuOC4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZ3JpbnMvc3BlY3RydW0KLy8gQXV0aG9yOiBCcmlhbiBHcmluc3RlYWQKLy8gTGljZW5zZTogTUlUCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7IC8vIEFNRAogICAgICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIHsgLy8gQ29tbW9uSlMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfQogICAgZWxzZSB7IC8vIEJyb3dzZXIKICAgICAgICBmYWN0b3J5KGpRdWVyeSk7CiAgICB9Cn0pKGZ1bmN0aW9uKCQsIHVuZGVmaW5lZCkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIHZhciBkZWZhdWx0T3B0cyA9IHsKCiAgICAgICAgLy8gQ2FsbGJhY2tzCiAgICAgICAgYmVmb3JlU2hvdzogbm9vcCwKICAgICAgICBtb3ZlOiBub29wLAogICAgICAgIGNoYW5nZTogbm9vcCwKICAgICAgICBzaG93OiBub29wLAogICAgICAgIGhpZGU6IG5vb3AsCgogICAgICAgIC8vIE9wdGlvbnMKICAgICAgICBjb2xvcjogZmFsc2UsCiAgICAgICAgZmxhdDogZmFsc2UsCiAgICAgICAgc2hvd0lucHV0OiBmYWxzZSwKICAgICAgICBhbGxvd0VtcHR5OiBmYWxzZSwKICAgICAgICBzaG93QnV0dG9uczogdHJ1ZSwKICAgICAgICBjbGlja291dEZpcmVzQ2hhbmdlOiB0cnVlLAogICAgICAgIHNob3dJbml0aWFsOiBmYWxzZSwKICAgICAgICBzaG93UGFsZXR0ZTogZmFsc2UsCiAgICAgICAgc2hvd1BhbGV0dGVPbmx5OiBmYWxzZSwKICAgICAgICBoaWRlQWZ0ZXJQYWxldHRlU2VsZWN0OiBmYWxzZSwKICAgICAgICB0b2dnbGVQYWxldHRlT25seTogZmFsc2UsCiAgICAgICAgc2hvd1NlbGVjdGlvblBhbGV0dGU6IHRydWUsCiAgICAgICAgbG9jYWxTdG9yYWdlS2V5OiBmYWxzZSwKICAgICAgICBhcHBlbmRUbzogImJvZHkiLAogICAgICAgIG1heFNlbGVjdGlvblNpemU6IDcsCiAgICAgICAgY2FuY2VsVGV4dDogImNhbmNlbCIsCiAgICAgICAgY2hvb3NlVGV4dDogImNob29zZSIsCiAgICAgICAgdG9nZ2xlUGFsZXR0ZU1vcmVUZXh0OiAibW9yZSIsCiAgICAgICAgdG9nZ2xlUGFsZXR0ZUxlc3NUZXh0OiAibGVzcyIsCiAgICAgICAgY2xlYXJUZXh0OiAiQ2xlYXIgQ29sb3IgU2VsZWN0aW9uIiwKICAgICAgICBub0NvbG9yU2VsZWN0ZWRUZXh0OiAiTm8gQ29sb3IgU2VsZWN0ZWQiLAogICAgICAgIHByZWZlcnJlZEZvcm1hdDogZmFsc2UsCiAgICAgICAgY2xhc3NOYW1lOiAiIiwgLy8gRGVwcmVjYXRlZCAtIHVzZSBjb250YWluZXJDbGFzc05hbWUgYW5kIHJlcGxhY2VyQ2xhc3NOYW1lIGluc3RlYWQuCiAgICAgICAgY29udGFpbmVyQ2xhc3NOYW1lOiAiIiwKICAgICAgICByZXBsYWNlckNsYXNzTmFtZTogIiIsCiAgICAgICAgc2hvd0FscGhhOiBmYWxzZSwKICAgICAgICB0aGVtZTogInNwLWxpZ2h0IiwKICAgICAgICBwYWxldHRlOiBbWyIjZmZmZmZmIiwgIiMwMDAwMDAiLCAiI2ZmMDAwMCIsICIjZmY4MDAwIiwgIiNmZmZmMDAiLCAiIzAwODAwMCIsICIjMDAwMGZmIiwgIiM0YjAwODIiLCAiIzk0MDBkMyJdXSwKICAgICAgICBzZWxlY3Rpb25QYWxldHRlOiBbXSwKICAgICAgICBkaXNhYmxlZDogZmFsc2UsCiAgICAgICAgb2Zmc2V0OiBudWxsCiAgICB9LAogICAgc3BlY3RydW1zID0gW10sCiAgICBJRSA9ICEhL21zaWUvaS5leGVjKCB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCApLAogICAgcmdiYVN1cHBvcnQgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gY29udGFpbnMoIHN0ciwgc3Vic3RyICkgewogICAgICAgICAgICByZXR1cm4gISF+KCcnICsgc3RyKS5pbmRleE9mKHN1YnN0cik7CiAgICAgICAgfQoKICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHZhciBzdHlsZSA9IGVsZW0uc3R5bGU7CiAgICAgICAgc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjUpJzsKICAgICAgICByZXR1cm4gY29udGFpbnMoc3R5bGUuYmFja2dyb3VuZENvbG9yLCAncmdiYScpIHx8IGNvbnRhaW5zKHN0eWxlLmJhY2tncm91bmRDb2xvciwgJ2hzbGEnKTsKICAgIH0pKCksCiAgICByZXBsYWNlSW5wdXQgPSBbCiAgICAgICAgIjxkaXYgY2xhc3M9J3NwLXJlcGxhY2VyJz4iLAogICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtcHJldmlldyc+PGRpdiBjbGFzcz0nc3AtcHJldmlldy1pbm5lcic+PC9kaXY+PC9kaXY+IiwKICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWRkJz4mIzk2NjA7PC9kaXY+IiwKICAgICAgICAiPC9kaXY+IgogICAgXS5qb2luKCcnKSwKICAgIG1hcmt1cCA9IChmdW5jdGlvbiAoKSB7CgogICAgICAgIC8vIElFIGRvZXMgbm90IHN1cHBvcnQgZ3JhZGllbnRzIHdpdGggbXVsdGlwbGUgc3RvcHMsIHNvIHdlIG5lZWQgdG8gc2ltdWxhdGUKICAgICAgICAvLyAgdGhhdCBmb3IgdGhlIHJhaW5ib3cgc2xpZGVyIHdpdGggOCBkaXZzIHRoYXQgZWFjaCBoYXZlIGEgc2luZ2xlIGdyYWRpZW50CiAgICAgICAgdmFyIGdyYWRpZW50Rml4ID0gIiI7CiAgICAgICAgaWYgKElFKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IDY7IGkrKykgewogICAgICAgICAgICAgICAgZ3JhZGllbnRGaXggKz0gIjxkaXYgY2xhc3M9J3NwLSIgKyBpICsgIic+PC9kaXY+IjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWNvbnRhaW5lciBzcC1oaWRkZW4nPiIsCiAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtcGFsZXR0ZS1jb250YWluZXInPiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLXBhbGV0dGUgc3AtdGh1bWIgc3AtY2YnPjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLXBhbGV0dGUtYnV0dG9uLWNvbnRhaW5lciBzcC1jZic+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nc3AtcGFsZXR0ZS10b2dnbGUnPjwvYnV0dG9uPiIsCiAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1waWNrZXItY29udGFpbmVyJz4iLAogICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC10b3Agc3AtY2YnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1maWxsJz48L2Rpdj4iLAogICAgICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtdG9wLWlubmVyJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWNvbG9yJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1zYXQnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC12YWwnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtZHJhZ2dlcic+PC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1jbGVhciBzcC1jbGVhci1kaXNwbGF5Jz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtaHVlJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1zbGlkZXInPjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnRGaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1hbHBoYSc+PGRpdiBjbGFzcz0nc3AtYWxwaGEtaW5uZXInPjxkaXYgY2xhc3M9J3NwLWFscGhhLWhhbmRsZSc+PC9kaXY+PC9kaXY+PC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtaW5wdXQtY29udGFpbmVyIHNwLWNmJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAiPGlucHV0IGNsYXNzPSdzcC1pbnB1dCcgdHlwZT0ndGV4dCcgc3BlbGxjaGVjaz0nZmFsc2UnICAvPiIsCiAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWluaXRpYWwgc3AtdGh1bWIgc3AtY2YnPjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWJ1dHRvbi1jb250YWluZXIgc3AtY2YnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICI8YSBjbGFzcz0nc3AtY2FuY2VsJyBocmVmPScjJz48L2E+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nc3AtY2hvb3NlJz48L2J1dHRvbj4iLAogICAgICAgICAgICAgICAgICAgICI8L2Rpdj4iLAogICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICI8L2Rpdj4iCiAgICAgICAgXS5qb2luKCIiKTsKICAgIH0pKCk7CgogICAgZnVuY3Rpb24gcGFsZXR0ZVRlbXBsYXRlIChwLCBjb2xvciwgY2xhc3NOYW1lLCBvcHRzKSB7CiAgICAgICAgdmFyIGh0bWwgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBwW2ldOwogICAgICAgICAgICBpZihjdXJyZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgdGlueSA9IHRpbnljb2xvcihjdXJyZW50KTsKICAgICAgICAgICAgICAgIHZhciBjID0gdGlueS50b0hzbCgpLmwgPCAwLjUgPyAic3AtdGh1bWItZWwgc3AtdGh1bWItZGFyayIgOiAic3AtdGh1bWItZWwgc3AtdGh1bWItbGlnaHQiOwogICAgICAgICAgICAgICAgYyArPSAodGlueWNvbG9yLmVxdWFscyhjb2xvciwgY3VycmVudCkpID8gIiBzcC10aHVtYi1hY3RpdmUiIDogIiI7CiAgICAgICAgICAgICAgICB2YXIgZm9ybWF0dGVkU3RyaW5nID0gdGlueS50b1N0cmluZyhvcHRzLnByZWZlcnJlZEZvcm1hdCB8fCAicmdiIik7CiAgICAgICAgICAgICAgICB2YXIgc3dhdGNoU3R5bGUgPSByZ2JhU3VwcG9ydCA/ICgiYmFja2dyb3VuZC1jb2xvcjoiICsgdGlueS50b1JnYlN0cmluZygpKSA6ICJmaWx0ZXI6IiArIHRpbnkudG9GaWx0ZXIoKTsKICAgICAgICAgICAgICAgIGh0bWwucHVzaCgnPHNwYW4gdGl0bGU9IicgKyBmb3JtYXR0ZWRTdHJpbmcgKyAnIiBkYXRhLWNvbG9yPSInICsgdGlueS50b1JnYlN0cmluZygpICsgJyIgY2xhc3M9IicgKyBjICsgJyI+PHNwYW4gY2xhc3M9InNwLXRodW1iLWlubmVyIiBzdHlsZT0iJyArIHN3YXRjaFN0eWxlICsgJzsiIC8+PC9zcGFuPicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGNscyA9ICdzcC1jbGVhci1kaXNwbGF5JzsKICAgICAgICAgICAgICAgIGh0bWwucHVzaCgkKCc8ZGl2IC8+JykKICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuIGRhdGEtY29sb3I9IiIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7IiBjbGFzcz0iJyArIGNscyArICciPjwvc3Bhbj4nKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBvcHRzLm5vQ29sb3JTZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIC5odG1sKCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPSdzcC1jZiAiICsgY2xhc3NOYW1lICsgIic+IiArIGh0bWwuam9pbignJykgKyAiPC9kaXY+IjsKICAgIH0KCiAgICBmdW5jdGlvbiBoaWRlQWxsKCkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BlY3RydW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChzcGVjdHJ1bXNbaV0pIHsKICAgICAgICAgICAgICAgIHNwZWN0cnVtc1tpXS5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2VPcHRpb25zKG8sIGNhbGxiYWNrQ29udGV4dCkgewogICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRzLCBvKTsKICAgICAgICBvcHRzLmNhbGxiYWNrcyA9IHsKICAgICAgICAgICAgJ21vdmUnOiBiaW5kKG9wdHMubW92ZSwgY2FsbGJhY2tDb250ZXh0KSwKICAgICAgICAgICAgJ2NoYW5nZSc6IGJpbmQob3B0cy5jaGFuZ2UsIGNhbGxiYWNrQ29udGV4dCksCiAgICAgICAgICAgICdzaG93JzogYmluZChvcHRzLnNob3csIGNhbGxiYWNrQ29udGV4dCksCiAgICAgICAgICAgICdoaWRlJzogYmluZChvcHRzLmhpZGUsIGNhbGxiYWNrQ29udGV4dCksCiAgICAgICAgICAgICdiZWZvcmVTaG93JzogYmluZChvcHRzLmJlZm9yZVNob3csIGNhbGxiYWNrQ29udGV4dCkKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb3B0czsKICAgIH0KCiAgICBmdW5jdGlvbiBzcGVjdHJ1bShlbGVtZW50LCBvKSB7CgogICAgICAgIHZhciBvcHRzID0gaW5zdGFuY2VPcHRpb25zKG8sIGVsZW1lbnQpLAogICAgICAgICAgICBmbGF0ID0gb3B0cy5mbGF0LAogICAgICAgICAgICBzaG93U2VsZWN0aW9uUGFsZXR0ZSA9IG9wdHMuc2hvd1NlbGVjdGlvblBhbGV0dGUsCiAgICAgICAgICAgIGxvY2FsU3RvcmFnZUtleSA9IG9wdHMubG9jYWxTdG9yYWdlS2V5LAogICAgICAgICAgICB0aGVtZSA9IG9wdHMudGhlbWUsCiAgICAgICAgICAgIGNhbGxiYWNrcyA9IG9wdHMuY2FsbGJhY2tzLAogICAgICAgICAgICByZXNpemUgPSB0aHJvdHRsZShyZWZsb3csIDEwKSwKICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlLAogICAgICAgICAgICBpc0RyYWdnaW5nID0gZmFsc2UsCiAgICAgICAgICAgIGRyYWdXaWR0aCA9IDAsCiAgICAgICAgICAgIGRyYWdIZWlnaHQgPSAwLAogICAgICAgICAgICBkcmFnSGVscGVySGVpZ2h0ID0gMCwKICAgICAgICAgICAgc2xpZGVIZWlnaHQgPSAwLAogICAgICAgICAgICBzbGlkZVdpZHRoID0gMCwKICAgICAgICAgICAgYWxwaGFXaWR0aCA9IDAsCiAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXJXaWR0aCA9IDAsCiAgICAgICAgICAgIHNsaWRlSGVscGVySGVpZ2h0ID0gMCwKICAgICAgICAgICAgY3VycmVudEh1ZSA9IDAsCiAgICAgICAgICAgIGN1cnJlbnRTYXR1cmF0aW9uID0gMCwKICAgICAgICAgICAgY3VycmVudFZhbHVlID0gMCwKICAgICAgICAgICAgY3VycmVudEFscGhhID0gMSwKICAgICAgICAgICAgcGFsZXR0ZSA9IFtdLAogICAgICAgICAgICBwYWxldHRlQXJyYXkgPSBbXSwKICAgICAgICAgICAgcGFsZXR0ZUxvb2t1cCA9IHt9LAogICAgICAgICAgICBzZWxlY3Rpb25QYWxldHRlID0gb3B0cy5zZWxlY3Rpb25QYWxldHRlLnNsaWNlKDApLAogICAgICAgICAgICBtYXhTZWxlY3Rpb25TaXplID0gb3B0cy5tYXhTZWxlY3Rpb25TaXplLAogICAgICAgICAgICBkcmFnZ2luZ0NsYXNzID0gInNwLWRyYWdnaW5nIiwKICAgICAgICAgICAgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9IG51bGw7CgogICAgICAgIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQsCiAgICAgICAgICAgIGJvZHkgPSBkb2MuYm9keSwKICAgICAgICAgICAgYm91bmRFbGVtZW50ID0gJChlbGVtZW50KSwKICAgICAgICAgICAgZGlzYWJsZWQgPSBmYWxzZSwKICAgICAgICAgICAgY29udGFpbmVyID0gJChtYXJrdXAsIGRvYykuYWRkQ2xhc3ModGhlbWUpLAogICAgICAgICAgICBwaWNrZXJDb250YWluZXIgPSBjb250YWluZXIuZmluZCgiLnNwLXBpY2tlci1jb250YWluZXIiKSwKICAgICAgICAgICAgZHJhZ2dlciA9IGNvbnRhaW5lci5maW5kKCIuc3AtY29sb3IiKSwKICAgICAgICAgICAgZHJhZ0hlbHBlciA9IGNvbnRhaW5lci5maW5kKCIuc3AtZHJhZ2dlciIpLAogICAgICAgICAgICBzbGlkZXIgPSBjb250YWluZXIuZmluZCgiLnNwLWh1ZSIpLAogICAgICAgICAgICBzbGlkZUhlbHBlciA9IGNvbnRhaW5lci5maW5kKCIuc3Atc2xpZGVyIiksCiAgICAgICAgICAgIGFscGhhU2xpZGVySW5uZXIgPSBjb250YWluZXIuZmluZCgiLnNwLWFscGhhLWlubmVyIiksCiAgICAgICAgICAgIGFscGhhU2xpZGVyID0gY29udGFpbmVyLmZpbmQoIi5zcC1hbHBoYSIpLAogICAgICAgICAgICBhbHBoYVNsaWRlSGVscGVyID0gY29udGFpbmVyLmZpbmQoIi5zcC1hbHBoYS1oYW5kbGUiKSwKICAgICAgICAgICAgdGV4dElucHV0ID0gY29udGFpbmVyLmZpbmQoIi5zcC1pbnB1dCIpLAogICAgICAgICAgICBwYWxldHRlQ29udGFpbmVyID0gY29udGFpbmVyLmZpbmQoIi5zcC1wYWxldHRlIiksCiAgICAgICAgICAgIGluaXRpYWxDb2xvckNvbnRhaW5lciA9IGNvbnRhaW5lci5maW5kKCIuc3AtaW5pdGlhbCIpLAogICAgICAgICAgICBjYW5jZWxCdXR0b24gPSBjb250YWluZXIuZmluZCgiLnNwLWNhbmNlbCIpLAogICAgICAgICAgICBjbGVhckJ1dHRvbiA9IGNvbnRhaW5lci5maW5kKCIuc3AtY2xlYXIiKSwKICAgICAgICAgICAgY2hvb3NlQnV0dG9uID0gY29udGFpbmVyLmZpbmQoIi5zcC1jaG9vc2UiKSwKICAgICAgICAgICAgdG9nZ2xlQnV0dG9uID0gY29udGFpbmVyLmZpbmQoIi5zcC1wYWxldHRlLXRvZ2dsZSIpLAogICAgICAgICAgICBpc0lucHV0ID0gYm91bmRFbGVtZW50LmlzKCJpbnB1dCIpLAogICAgICAgICAgICBpc0lucHV0VHlwZUNvbG9yID0gaXNJbnB1dCAmJiBib3VuZEVsZW1lbnQuYXR0cigidHlwZSIpID09PSAiY29sb3IiICYmIGlucHV0VHlwZUNvbG9yU3VwcG9ydCgpLAogICAgICAgICAgICBzaG91bGRSZXBsYWNlID0gaXNJbnB1dCAmJiAhZmxhdCwKICAgICAgICAgICAgcmVwbGFjZXIgPSAoc2hvdWxkUmVwbGFjZSkgPyAkKHJlcGxhY2VJbnB1dCkuYWRkQ2xhc3ModGhlbWUpLmFkZENsYXNzKG9wdHMuY2xhc3NOYW1lKS5hZGRDbGFzcyhvcHRzLnJlcGxhY2VyQ2xhc3NOYW1lKSA6ICQoW10pLAogICAgICAgICAgICBvZmZzZXRFbGVtZW50ID0gKHNob3VsZFJlcGxhY2UpID8gcmVwbGFjZXIgOiBib3VuZEVsZW1lbnQsCiAgICAgICAgICAgIHByZXZpZXdFbGVtZW50ID0gcmVwbGFjZXIuZmluZCgiLnNwLXByZXZpZXctaW5uZXIiKSwKICAgICAgICAgICAgaW5pdGlhbENvbG9yID0gb3B0cy5jb2xvciB8fCAoaXNJbnB1dCAmJiBib3VuZEVsZW1lbnQudmFsKCkpLAogICAgICAgICAgICBjb2xvck9uU2hvdyA9IGZhbHNlLAogICAgICAgICAgICBjdXJyZW50UHJlZmVycmVkRm9ybWF0ID0gb3B0cy5wcmVmZXJyZWRGb3JtYXQsCiAgICAgICAgICAgIGNsaWNrb3V0RmlyZXNDaGFuZ2UgPSAhb3B0cy5zaG93QnV0dG9ucyB8fCBvcHRzLmNsaWNrb3V0RmlyZXNDaGFuZ2UsCiAgICAgICAgICAgIGlzRW1wdHkgPSAhaW5pdGlhbENvbG9yLAogICAgICAgICAgICBhbGxvd0VtcHR5ID0gb3B0cy5hbGxvd0VtcHR5ICYmICFpc0lucHV0VHlwZUNvbG9yOwoKICAgICAgICBmdW5jdGlvbiBhcHBseU9wdGlvbnMoKSB7CgogICAgICAgICAgICBpZiAob3B0cy5zaG93UGFsZXR0ZU9ubHkpIHsKICAgICAgICAgICAgICAgIG9wdHMuc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0b2dnbGVCdXR0b24udGV4dChvcHRzLnNob3dQYWxldHRlT25seSA/IG9wdHMudG9nZ2xlUGFsZXR0ZU1vcmVUZXh0IDogb3B0cy50b2dnbGVQYWxldHRlTGVzc1RleHQpOwoKICAgICAgICAgICAgaWYgKG9wdHMucGFsZXR0ZSkgewogICAgICAgICAgICAgICAgcGFsZXR0ZSA9IG9wdHMucGFsZXR0ZS5zbGljZSgwKTsKICAgICAgICAgICAgICAgIHBhbGV0dGVBcnJheSA9ICQuaXNBcnJheShwYWxldHRlWzBdKSA/IHBhbGV0dGUgOiBbcGFsZXR0ZV07CiAgICAgICAgICAgICAgICBwYWxldHRlTG9va3VwID0ge307CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbGV0dGVBcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFsZXR0ZUFycmF5W2ldLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZ2IgPSB0aW55Y29sb3IocGFsZXR0ZUFycmF5W2ldW2pdKS50b1JnYlN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlTG9va3VwW3JnYl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyLnRvZ2dsZUNsYXNzKCJzcC1mbGF0IiwgZmxhdCk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtaW5wdXQtZGlzYWJsZWQiLCAhb3B0cy5zaG93SW5wdXQpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLWFscGhhLWVuYWJsZWQiLCBvcHRzLnNob3dBbHBoYSk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtY2xlYXItZW5hYmxlZCIsIGFsbG93RW1wdHkpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLWJ1dHRvbnMtZGlzYWJsZWQiLCAhb3B0cy5zaG93QnV0dG9ucyk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtcGFsZXR0ZS1idXR0b25zLWRpc2FibGVkIiwgIW9wdHMudG9nZ2xlUGFsZXR0ZU9ubHkpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLXBhbGV0dGUtZGlzYWJsZWQiLCAhb3B0cy5zaG93UGFsZXR0ZSk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtcGFsZXR0ZS1vbmx5Iiwgb3B0cy5zaG93UGFsZXR0ZU9ubHkpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLWluaXRpYWwtZGlzYWJsZWQiLCAhb3B0cy5zaG93SW5pdGlhbCk7CiAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhvcHRzLmNsYXNzTmFtZSkuYWRkQ2xhc3Mob3B0cy5jb250YWluZXJDbGFzc05hbWUpOwoKICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewoKICAgICAgICAgICAgaWYgKElFKSB7CiAgICAgICAgICAgICAgICBjb250YWluZXIuZmluZCgiKjpub3QoaW5wdXQpIikuYXR0cigidW5zZWxlY3RhYmxlIiwgIm9uIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFwcGx5T3B0aW9ucygpOwoKICAgICAgICAgICAgaWYgKHNob3VsZFJlcGxhY2UpIHsKICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5hZnRlcihyZXBsYWNlcikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWFsbG93RW1wdHkpIHsKICAgICAgICAgICAgICAgIGNsZWFyQnV0dG9uLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZsYXQpIHsKICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5hZnRlcihjb250YWluZXIpLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICB2YXIgYXBwZW5kVG8gPSBvcHRzLmFwcGVuZFRvID09PSAicGFyZW50IiA/IGJvdW5kRWxlbWVudC5wYXJlbnQoKSA6ICQob3B0cy5hcHBlbmRUbyk7CiAgICAgICAgICAgICAgICBpZiAoYXBwZW5kVG8ubGVuZ3RoICE9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG8gPSAkKCJib2R5Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXBwZW5kVG8uYXBwZW5kKGNvbnRhaW5lcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvblBhbGV0dGVGcm9tU3RvcmFnZSgpOwoKICAgICAgICAgICAgb2Zmc2V0RWxlbWVudC5iaW5kKCJjbGljay5zcGVjdHJ1bSB0b3VjaHN0YXJ0LnNwZWN0cnVtIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0b2dnbGUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgICAgIGlmICghJChlLnRhcmdldCkuaXMoImlucHV0IikpIHsKICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYoYm91bmRFbGVtZW50LmlzKCI6ZGlzYWJsZWQiKSB8fCAob3B0cy5kaXNhYmxlZCA9PT0gdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIGRpc2FibGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJldmVudCBjbGlja3MgZnJvbSBidWJibGluZyB1cCB0byBkb2N1bWVudC4gIFRoaXMgd291bGQgY2F1c2UgaXQgdG8gYmUgaGlkZGVuLgogICAgICAgICAgICBjb250YWluZXIuY2xpY2soc3RvcFByb3BhZ2F0aW9uKTsKCiAgICAgICAgICAgIC8vIEhhbmRsZSB1c2VyIHR5cGVkIGlucHV0CiAgICAgICAgICAgIHRleHRJbnB1dC5jaGFuZ2Uoc2V0RnJvbVRleHRJbnB1dCk7CiAgICAgICAgICAgIHRleHRJbnB1dC5iaW5kKCJwYXN0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc2V0RnJvbVRleHRJbnB1dCwgMSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0ZXh0SW5wdXQua2V5ZG93bihmdW5jdGlvbiAoZSkgeyBpZiAoZS5rZXlDb2RlID09IDEzKSB7IHNldEZyb21UZXh0SW5wdXQoKTsgfSB9KTsKCiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi50ZXh0KG9wdHMuY2FuY2VsVGV4dCk7CiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi5iaW5kKCJjbGljay5zcGVjdHJ1bSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgcmV2ZXJ0KCk7CiAgICAgICAgICAgICAgICBoaWRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY2xlYXJCdXR0b24uYXR0cigidGl0bGUiLCBvcHRzLmNsZWFyVGV4dCk7CiAgICAgICAgICAgIGNsZWFyQnV0dG9uLmJpbmQoImNsaWNrLnNwZWN0cnVtIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBpc0VtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIG1vdmUoKTsKCiAgICAgICAgICAgICAgICBpZihmbGF0KSB7CiAgICAgICAgICAgICAgICAgICAgLy9mb3IgdGhlIGZsYXQgc3R5bGUsIHRoaXMgaXMgYSBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGNob29zZUJ1dHRvbi50ZXh0KG9wdHMuY2hvb3NlVGV4dCk7CiAgICAgICAgICAgIGNob29zZUJ1dHRvbi5iaW5kKCJjbGljay5zcGVjdHJ1bSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgIGlmIChJRSAmJiB0ZXh0SW5wdXQuaXMoIjpmb2N1cyIpKSB7CiAgICAgICAgICAgICAgICAgICAgdGV4dElucHV0LnRyaWdnZXIoJ2NoYW5nZScpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKCkpIHsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0b2dnbGVCdXR0b24udGV4dChvcHRzLnNob3dQYWxldHRlT25seSA/IG9wdHMudG9nZ2xlUGFsZXR0ZU1vcmVUZXh0IDogb3B0cy50b2dnbGVQYWxldHRlTGVzc1RleHQpOwogICAgICAgICAgICB0b2dnbGVCdXR0b24uYmluZCgiY2xpY2suc3BlY3RydW0iLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICBvcHRzLnNob3dQYWxldHRlT25seSA9ICFvcHRzLnNob3dQYWxldHRlT25seTsKCiAgICAgICAgICAgICAgICAvLyBUbyBtYWtlIHN1cmUgdGhlIFBpY2tlciBhcmVhIGlzIGRyYXduIG9uIHRoZSByaWdodCwgbmV4dCB0byB0aGUKICAgICAgICAgICAgICAgIC8vIFBhbGV0dGUgYXJlYSAoYW5kIG5vdCBiZWxvdyB0aGUgcGFsZXR0ZSksIGZpcnN0IG1vdmUgdGhlIFBhbGV0dGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBsZWZ0IHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBwaWNrZXIsIHBsdXMgNXB4IGV4dHJhLgogICAgICAgICAgICAgICAgLy8gVGhlICdhcHBseU9wdGlvbnMnIGZ1bmN0aW9uIHB1dHMgdGhlIHdob2xlIGNvbnRhaW5lciBiYWNrIGludG8gcGxhY2UKICAgICAgICAgICAgICAgIC8vIGFuZCB0YWtlcyBjYXJlIG9mIHRoZSBidXR0b24tdGV4dCBhbmQgdGhlIHNwLXBhbGV0dGUtb25seSBDU1MgY2xhc3MuCiAgICAgICAgICAgICAgICBpZiAoIW9wdHMuc2hvd1BhbGV0dGVPbmx5ICYmICFmbGF0KSB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmNzcygnbGVmdCcsICctPScgKyAocGlja2VyQ29udGFpbmVyLm91dGVyV2lkdGgodHJ1ZSkgKyA1KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhcHBseU9wdGlvbnMoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkcmFnZ2FibGUoYWxwaGFTbGlkZXIsIGZ1bmN0aW9uIChkcmFnWCwgZHJhZ1ksIGUpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRBbHBoYSA9IChkcmFnWCAvIGFscGhhV2lkdGgpOwogICAgICAgICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50QWxwaGEgPSBNYXRoLnJvdW5kKGN1cnJlbnRBbHBoYSAqIDEwKSAvIDEwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgICAgfSwgZHJhZ1N0YXJ0LCBkcmFnU3RvcCk7CgogICAgICAgICAgICBkcmFnZ2FibGUoc2xpZGVyLCBmdW5jdGlvbiAoZHJhZ1gsIGRyYWdZKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50SHVlID0gcGFyc2VGbG9hdChkcmFnWSAvIHNsaWRlSGVpZ2h0KTsKICAgICAgICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICghb3B0cy5zaG93QWxwaGEpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50QWxwaGEgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICB9LCBkcmFnU3RhcnQsIGRyYWdTdG9wKTsKCiAgICAgICAgICAgIGRyYWdnYWJsZShkcmFnZ2VyLCBmdW5jdGlvbiAoZHJhZ1gsIGRyYWdZLCBlKSB7CgogICAgICAgICAgICAgICAgLy8gc2hpZnQrZHJhZyBzaG91bGQgc25hcCB0aGUgbW92ZW1lbnQgdG8gZWl0aGVyIHRoZSB4IG9yIHkgYXhpcy4KICAgICAgICAgICAgICAgIGlmICghZS5zaGlmdEtleSkgewogICAgICAgICAgICAgICAgICAgIHNoaWZ0TW92ZW1lbnREaXJlY3Rpb24gPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIXNoaWZ0TW92ZW1lbnREaXJlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkRHJhZ1ggPSBjdXJyZW50U2F0dXJhdGlvbiAqIGRyYWdXaWR0aDsKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkRHJhZ1kgPSBkcmFnSGVpZ2h0IC0gKGN1cnJlbnRWYWx1ZSAqIGRyYWdIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHZhciBmdXJ0aGVyRnJvbVggPSBNYXRoLmFicyhkcmFnWCAtIG9sZERyYWdYKSA+IE1hdGguYWJzKGRyYWdZIC0gb2xkRHJhZ1kpOwoKICAgICAgICAgICAgICAgICAgICBzaGlmdE1vdmVtZW50RGlyZWN0aW9uID0gZnVydGhlckZyb21YID8gIngiIDogInkiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBzZXRTYXR1cmF0aW9uID0gIXNoaWZ0TW92ZW1lbnREaXJlY3Rpb24gfHwgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9PT0gIngiOwogICAgICAgICAgICAgICAgdmFyIHNldFZhbHVlID0gIXNoaWZ0TW92ZW1lbnREaXJlY3Rpb24gfHwgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9PT0gInkiOwoKICAgICAgICAgICAgICAgIGlmIChzZXRTYXR1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNhdHVyYXRpb24gPSBwYXJzZUZsb2F0KGRyYWdYIC8gZHJhZ1dpZHRoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZXRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHBhcnNlRmxvYXQoKGRyYWdIZWlnaHQgLSBkcmFnWSkgLyBkcmFnSGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoIW9wdHMuc2hvd0FscGhhKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudEFscGhhID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb3ZlKCk7CgogICAgICAgICAgICB9LCBkcmFnU3RhcnQsIGRyYWdTdG9wKTsKCiAgICAgICAgICAgIGlmICghIWluaXRpYWxDb2xvcikgewogICAgICAgICAgICAgICAgc2V0KGluaXRpYWxDb2xvcik7CgogICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBjb2xvciB3YXMgYmxhY2sgLSB1cGRhdGUgdGhlIHByZXZpZXcgVUkgYW5kIHNldCB0aGUgZm9ybWF0CiAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc2V0IGZ1bmN0aW9uIHdpbGwgbm90IHJ1biAoZGVmYXVsdCBjb2xvciBpcyBibGFjaykuCiAgICAgICAgICAgICAgICB1cGRhdGVVSSgpOwogICAgICAgICAgICAgICAgY3VycmVudFByZWZlcnJlZEZvcm1hdCA9IG9wdHMucHJlZmVycmVkRm9ybWF0IHx8IHRpbnljb2xvcihpbml0aWFsQ29sb3IpLmZvcm1hdDsKCiAgICAgICAgICAgICAgICBhZGRDb2xvclRvU2VsZWN0aW9uUGFsZXR0ZShpbml0aWFsQ29sb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdXBkYXRlVUkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZsYXQpIHsKICAgICAgICAgICAgICAgIHNob3coKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gcGFsZXR0ZUVsZW1lbnRDbGljayhlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhICYmIGUuZGF0YS5pZ25vcmUpIHsKICAgICAgICAgICAgICAgICAgICBzZXQoJChlLnRhcmdldCkuY2xvc2VzdCgiLnNwLXRodW1iLWVsIikuZGF0YSgiY29sb3IiKSk7CiAgICAgICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0KCQoZS50YXJnZXQpLmNsb3Nlc3QoIi5zcC10aHVtYi1lbCIpLmRhdGEoImNvbG9yIikpOwogICAgICAgICAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmhpZGVBZnRlclBhbGV0dGVTZWxlY3QpIHsKICAgICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcGFsZXR0ZUV2ZW50ID0gSUUgPyAibW91c2Vkb3duLnNwZWN0cnVtIiA6ICJjbGljay5zcGVjdHJ1bSB0b3VjaHN0YXJ0LnNwZWN0cnVtIjsKICAgICAgICAgICAgcGFsZXR0ZUNvbnRhaW5lci5kZWxlZ2F0ZSgiLnNwLXRodW1iLWVsIiwgcGFsZXR0ZUV2ZW50LCBwYWxldHRlRWxlbWVudENsaWNrKTsKICAgICAgICAgICAgaW5pdGlhbENvbG9yQ29udGFpbmVyLmRlbGVnYXRlKCIuc3AtdGh1bWItZWw6bnRoLWNoaWxkKDEpIiwgcGFsZXR0ZUV2ZW50LCB7IGlnbm9yZTogdHJ1ZSB9LCBwYWxldHRlRWxlbWVudENsaWNrKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGlvblBhbGV0dGVGcm9tU3RvcmFnZSgpIHsKCiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VLZXkgJiYgd2luZG93LmxvY2FsU3RvcmFnZSkgewoKICAgICAgICAgICAgICAgIC8vIE1pZ3JhdGUgb2xkIHBhbGV0dGVzIG92ZXIgdG8gbmV3IGZvcm1hdC4gIE1heSB3YW50IHRvIHJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHZhciBvbGRQYWxldHRlID0gd2luZG93LmxvY2FsU3RvcmFnZVtsb2NhbFN0b3JhZ2VLZXldLnNwbGl0KCIsIyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRQYWxldHRlLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5sb2NhbFN0b3JhZ2VbbG9jYWxTdG9yYWdlS2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9sZFBhbGV0dGUsIGZ1bmN0aW9uKGksIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRDb2xvclRvU2VsZWN0aW9uUGFsZXR0ZShjKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2goZSkgeyB9CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYWxldHRlID0gd2luZG93LmxvY2FsU3RvcmFnZVtsb2NhbFN0b3JhZ2VLZXldLnNwbGl0KCI7Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFkZENvbG9yVG9TZWxlY3Rpb25QYWxldHRlKGNvbG9yKSB7CiAgICAgICAgICAgIGlmIChzaG93U2VsZWN0aW9uUGFsZXR0ZSkgewogICAgICAgICAgICAgICAgdmFyIHJnYiA9IHRpbnljb2xvcihjb2xvcikudG9SZ2JTdHJpbmcoKTsKICAgICAgICAgICAgICAgIGlmICghcGFsZXR0ZUxvb2t1cFtyZ2JdICYmICQuaW5BcnJheShyZ2IsIHNlbGVjdGlvblBhbGV0dGUpID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblBhbGV0dGUucHVzaChyZ2IpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlKHNlbGVjdGlvblBhbGV0dGUubGVuZ3RoID4gbWF4U2VsZWN0aW9uU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYWxldHRlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VLZXkgJiYgd2luZG93LmxvY2FsU3RvcmFnZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2VbbG9jYWxTdG9yYWdlS2V5XSA9IHNlbGVjdGlvblBhbGV0dGUuam9pbigiOyIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlKSB7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0VW5pcXVlU2VsZWN0aW9uUGFsZXR0ZSgpIHsKICAgICAgICAgICAgdmFyIHVuaXF1ZSA9IFtdOwogICAgICAgICAgICBpZiAob3B0cy5zaG93UGFsZXR0ZSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rpb25QYWxldHRlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJnYiA9IHRpbnljb2xvcihzZWxlY3Rpb25QYWxldHRlW2ldKS50b1JnYlN0cmluZygpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhbGV0dGVMb29rdXBbcmdiXSkgewogICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUucHVzaChzZWxlY3Rpb25QYWxldHRlW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB1bmlxdWUucmV2ZXJzZSgpLnNsaWNlKDAsIG9wdHMubWF4U2VsZWN0aW9uU2l6ZSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkcmF3UGFsZXR0ZSgpIHsKCiAgICAgICAgICAgIHZhciBjdXJyZW50Q29sb3IgPSBnZXQoKTsKCiAgICAgICAgICAgIHZhciBodG1sID0gJC5tYXAocGFsZXR0ZUFycmF5LCBmdW5jdGlvbiAocGFsZXR0ZSwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHBhbGV0dGVUZW1wbGF0ZShwYWxldHRlLCBjdXJyZW50Q29sb3IsICJzcC1wYWxldHRlLXJvdyBzcC1wYWxldHRlLXJvdy0iICsgaSwgb3B0cyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uUGFsZXR0ZUZyb21TdG9yYWdlKCk7CgogICAgICAgICAgICBpZiAoc2VsZWN0aW9uUGFsZXR0ZSkgewogICAgICAgICAgICAgICAgaHRtbC5wdXNoKHBhbGV0dGVUZW1wbGF0ZShnZXRVbmlxdWVTZWxlY3Rpb25QYWxldHRlKCksIGN1cnJlbnRDb2xvciwgInNwLXBhbGV0dGUtcm93IHNwLXBhbGV0dGUtcm93LXNlbGVjdGlvbiIsIG9wdHMpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcGFsZXR0ZUNvbnRhaW5lci5odG1sKGh0bWwuam9pbigiIikpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZHJhd0luaXRpYWwoKSB7CiAgICAgICAgICAgIGlmIChvcHRzLnNob3dJbml0aWFsKSB7CiAgICAgICAgICAgICAgICB2YXIgaW5pdGlhbCA9IGNvbG9yT25TaG93OwogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBnZXQoKTsKICAgICAgICAgICAgICAgIGluaXRpYWxDb2xvckNvbnRhaW5lci5odG1sKHBhbGV0dGVUZW1wbGF0ZShbaW5pdGlhbCwgY3VycmVudF0sIGN1cnJlbnQsICJzcC1wYWxldHRlLXJvdy1pbml0aWFsIiwgb3B0cykpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkcmFnU3RhcnQoKSB7CiAgICAgICAgICAgIGlmIChkcmFnSGVpZ2h0IDw9IDAgfHwgZHJhZ1dpZHRoIDw9IDAgfHwgc2xpZGVIZWlnaHQgPD0gMCkgewogICAgICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhkcmFnZ2luZ0NsYXNzKTsKICAgICAgICAgICAgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIGJvdW5kRWxlbWVudC50cmlnZ2VyKCdkcmFnc3RhcnQuc3BlY3RydW0nLCBbIGdldCgpIF0pOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZHJhZ1N0b3AoKSB7CiAgICAgICAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKGRyYWdnaW5nQ2xhc3MpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignZHJhZ3N0b3Auc3BlY3RydW0nLCBbIGdldCgpIF0pOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc2V0RnJvbVRleHRJbnB1dCgpIHsKCiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRleHRJbnB1dC52YWwoKTsKCiAgICAgICAgICAgIGlmICgodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICIiKSAmJiBhbGxvd0VtcHR5KSB7CiAgICAgICAgICAgICAgICBzZXQobnVsbCk7CiAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHRpbnkgPSB0aW55Y29sb3IodmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKHRpbnkuaXNWYWxpZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0KHRpbnkpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9yaWdpbmFsSW5wdXQodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0SW5wdXQuYWRkQ2xhc3MoInNwLXZhbGlkYXRpb24tZXJyb3IiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdG9nZ2xlKCkgewogICAgICAgICAgICBpZiAodmlzaWJsZSkgewogICAgICAgICAgICAgICAgaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc2hvdygpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzaG93KCkgewogICAgICAgICAgICB2YXIgZXZlbnQgPSAkLkV2ZW50KCdiZWZvcmVTaG93LnNwZWN0cnVtJyk7CgogICAgICAgICAgICBpZiAodmlzaWJsZSkgewogICAgICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJvdW5kRWxlbWVudC50cmlnZ2VyKGV2ZW50LCBbIGdldCgpIF0pOwoKICAgICAgICAgICAgaWYgKGNhbGxiYWNrcy5iZWZvcmVTaG93KGdldCgpKSA9PT0gZmFsc2UgfHwgZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaGlkZUFsbCgpOwogICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTsKCiAgICAgICAgICAgICQoZG9jKS5iaW5kKCJrZXlkb3duLnNwZWN0cnVtIiwgb25rZXlkb3duKTsKICAgICAgICAgICAgJChkb2MpLmJpbmQoImNsaWNrLnNwZWN0cnVtIiwgY2xpY2tvdXQpOwogICAgICAgICAgICAkKHdpbmRvdykuYmluZCgicmVzaXplLnNwZWN0cnVtIiwgcmVzaXplKTsKICAgICAgICAgICAgcmVwbGFjZXIuYWRkQ2xhc3MoInNwLWFjdGl2ZSIpOwogICAgICAgICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3MoInNwLWhpZGRlbiIpOwoKICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgICAgIHVwZGF0ZVVJKCk7CgogICAgICAgICAgICBjb2xvck9uU2hvdyA9IGdldCgpOwoKICAgICAgICAgICAgZHJhd0luaXRpYWwoKTsKICAgICAgICAgICAgY2FsbGJhY2tzLnNob3coY29sb3JPblNob3cpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignc2hvdy5zcGVjdHJ1bScsIFsgY29sb3JPblNob3cgXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbmtleWRvd24oZSkgewogICAgICAgICAgICAvLyBDbG9zZSBvbiBFU0MKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHsKICAgICAgICAgICAgICAgIGhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY2xpY2tvdXQoZSkgewogICAgICAgICAgICAvLyBSZXR1cm4gb24gcmlnaHQgY2xpY2suCiAgICAgICAgICAgIGlmIChlLmJ1dHRvbiA9PSAyKSB7IHJldHVybjsgfQoKICAgICAgICAgICAgLy8gSWYgYSBkcmFnIGV2ZW50IHdhcyBoYXBwZW5pbmcgZHVyaW5nIHRoZSBtb3VzZXVwLCBkb24ndCBoaWRlCiAgICAgICAgICAgIC8vIG9uIGNsaWNrLgogICAgICAgICAgICBpZiAoaXNEcmFnZ2luZykgeyByZXR1cm47IH0KCiAgICAgICAgICAgIGlmIChjbGlja291dEZpcmVzQ2hhbmdlKSB7CiAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV2ZXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaGlkZSgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaGlkZSgpIHsKICAgICAgICAgICAgLy8gUmV0dXJuIGlmIGhpZGluZyBpcyB1bm5lY2Vzc2FyeQogICAgICAgICAgICBpZiAoIXZpc2libGUgfHwgZmxhdCkgeyByZXR1cm47IH0KICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlOwoKICAgICAgICAgICAgJChkb2MpLnVuYmluZCgia2V5ZG93bi5zcGVjdHJ1bSIsIG9ua2V5ZG93bik7CiAgICAgICAgICAgICQoZG9jKS51bmJpbmQoImNsaWNrLnNwZWN0cnVtIiwgY2xpY2tvdXQpOwogICAgICAgICAgICAkKHdpbmRvdykudW5iaW5kKCJyZXNpemUuc3BlY3RydW0iLCByZXNpemUpOwoKICAgICAgICAgICAgcmVwbGFjZXIucmVtb3ZlQ2xhc3MoInNwLWFjdGl2ZSIpOwogICAgICAgICAgICBjb250YWluZXIuYWRkQ2xhc3MoInNwLWhpZGRlbiIpOwoKICAgICAgICAgICAgY2FsbGJhY2tzLmhpZGUoZ2V0KCkpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignaGlkZS5zcGVjdHJ1bScsIFsgZ2V0KCkgXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZXZlcnQoKSB7CiAgICAgICAgICAgIHNldChjb2xvck9uU2hvdywgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZXQoY29sb3IsIGlnbm9yZUZvcm1hdENoYW5nZSkgewogICAgICAgICAgICBpZiAodGlueWNvbG9yLmVxdWFscyhjb2xvciwgZ2V0KCkpKSB7CiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgVUkganVzdCBpbiBjYXNlIGEgdmFsaWRhdGlvbiBlcnJvciBuZWVkcwogICAgICAgICAgICAgICAgLy8gdG8gYmUgY2xlYXJlZC4KICAgICAgICAgICAgICAgIHVwZGF0ZVVJKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBuZXdDb2xvciwgbmV3SHN2OwogICAgICAgICAgICBpZiAoIWNvbG9yICYmIGFsbG93RW1wdHkpIHsKICAgICAgICAgICAgICAgIGlzRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgbmV3Q29sb3IgPSB0aW55Y29sb3IoY29sb3IpOwogICAgICAgICAgICAgICAgbmV3SHN2ID0gbmV3Q29sb3IudG9Ic3YoKTsKCiAgICAgICAgICAgICAgICBjdXJyZW50SHVlID0gKG5ld0hzdi5oICUgMzYwKSAvIDM2MDsKICAgICAgICAgICAgICAgIGN1cnJlbnRTYXR1cmF0aW9uID0gbmV3SHN2LnM7CiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBuZXdIc3YudjsKICAgICAgICAgICAgICAgIGN1cnJlbnRBbHBoYSA9IG5ld0hzdi5hOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVwZGF0ZVVJKCk7CgogICAgICAgICAgICBpZiAobmV3Q29sb3IgJiYgbmV3Q29sb3IuaXNWYWxpZCgpICYmICFpZ25vcmVGb3JtYXRDaGFuZ2UpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRQcmVmZXJyZWRGb3JtYXQgPSBvcHRzLnByZWZlcnJlZEZvcm1hdCB8fCBuZXdDb2xvci5nZXRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0KG9wdHMpIHsKICAgICAgICAgICAgb3B0cyA9IG9wdHMgfHwgeyB9OwoKICAgICAgICAgICAgaWYgKGFsbG93RW1wdHkgJiYgaXNFbXB0eSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aW55Y29sb3IuZnJvbVJhdGlvKHsKICAgICAgICAgICAgICAgIGg6IGN1cnJlbnRIdWUsCiAgICAgICAgICAgICAgICBzOiBjdXJyZW50U2F0dXJhdGlvbiwKICAgICAgICAgICAgICAgIHY6IGN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgIGE6IE1hdGgucm91bmQoY3VycmVudEFscGhhICogMTAwKSAvIDEwMAogICAgICAgICAgICB9LCB7IGZvcm1hdDogb3B0cy5mb3JtYXQgfHwgY3VycmVudFByZWZlcnJlZEZvcm1hdCB9KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGlzVmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiAhdGV4dElucHV0Lmhhc0NsYXNzKCJzcC12YWxpZGF0aW9uLWVycm9yIik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlKCkgewogICAgICAgICAgICB1cGRhdGVVSSgpOwoKICAgICAgICAgICAgY2FsbGJhY2tzLm1vdmUoZ2V0KCkpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignbW92ZS5zcGVjdHJ1bScsIFsgZ2V0KCkgXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB1cGRhdGVVSSgpIHsKCiAgICAgICAgICAgIHRleHRJbnB1dC5yZW1vdmVDbGFzcygic3AtdmFsaWRhdGlvbi1lcnJvciIpOwoKICAgICAgICAgICAgdXBkYXRlSGVscGVyTG9jYXRpb25zKCk7CgogICAgICAgICAgICAvLyBVcGRhdGUgZHJhZ2dlciBiYWNrZ3JvdW5kIGNvbG9yIChncmFkaWVudHMgdGFrZSBjYXJlIG9mIHNhdHVyYXRpb24gYW5kIHZhbHVlKS4KICAgICAgICAgICAgdmFyIGZsYXRDb2xvciA9IHRpbnljb2xvci5mcm9tUmF0aW8oeyBoOiBjdXJyZW50SHVlLCBzOiAxLCB2OiAxIH0pOwogICAgICAgICAgICBkcmFnZ2VyLmNzcygiYmFja2dyb3VuZC1jb2xvciIsIGZsYXRDb2xvci50b0hleFN0cmluZygpKTsKCiAgICAgICAgICAgIC8vIEdldCBhIGZvcm1hdCB0aGF0IGFscGhhIHdpbGwgYmUgaW5jbHVkZWQgaW4gKGhleCBhbmQgbmFtZXMgaWdub3JlIGFscGhhKQogICAgICAgICAgICB2YXIgZm9ybWF0ID0gY3VycmVudFByZWZlcnJlZEZvcm1hdDsKICAgICAgICAgICAgaWYgKGN1cnJlbnRBbHBoYSA8IDEgJiYgIShjdXJyZW50QWxwaGEgPT09IDAgJiYgZm9ybWF0ID09PSAibmFtZSIpKSB7CiAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAiaGV4IiB8fCBmb3JtYXQgPT09ICJoZXgzIiB8fCBmb3JtYXQgPT09ICJoZXg2IiB8fCBmb3JtYXQgPT09ICJuYW1lIikgewogICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJyZ2IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVhbENvbG9yID0gZ2V0KHsgZm9ybWF0OiBmb3JtYXQgfSksCiAgICAgICAgICAgICAgICBkaXNwbGF5Q29sb3IgPSAnJzsKCiAgICAgICAgICAgICAvL3Jlc2V0IGJhY2tncm91bmQgaW5mbyBmb3IgcHJldmlldyBlbGVtZW50CiAgICAgICAgICAgIHByZXZpZXdFbGVtZW50LnJlbW92ZUNsYXNzKCJzcC1jbGVhci1kaXNwbGF5Iik7CiAgICAgICAgICAgIHByZXZpZXdFbGVtZW50LmNzcygnYmFja2dyb3VuZC1jb2xvcicsICd0cmFuc3BhcmVudCcpOwoKICAgICAgICAgICAgaWYgKCFyZWFsQ29sb3IgJiYgYWxsb3dFbXB0eSkgewogICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZXBsYWNlZCBlbGVtZW50cyBiYWNrZ3JvdW5kIHdpdGggaWNvbiBpbmRpY2F0aW5nIG5vIGNvbG9yIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgcHJldmlld0VsZW1lbnQuYWRkQ2xhc3MoInNwLWNsZWFyLWRpc3BsYXkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZWFsSGV4ID0gcmVhbENvbG9yLnRvSGV4U3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgcmVhbFJnYiA9IHJlYWxDb2xvci50b1JnYlN0cmluZygpOwoKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVwbGFjZWQgZWxlbWVudHMgYmFja2dyb3VuZCBjb2xvciAod2l0aCBhY3R1YWwgc2VsZWN0ZWQgY29sb3IpCiAgICAgICAgICAgICAgICBpZiAocmdiYVN1cHBvcnQgfHwgcmVhbENvbG9yLmFscGhhID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldmlld0VsZW1lbnQuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIiwgcmVhbFJnYik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RWxlbWVudC5jc3MoImJhY2tncm91bmQtY29sb3IiLCAidHJhbnNwYXJlbnQiKTsKICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RWxlbWVudC5jc3MoImZpbHRlciIsIHJlYWxDb2xvci50b0ZpbHRlcigpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAob3B0cy5zaG93QWxwaGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmdiID0gcmVhbENvbG9yLnRvUmdiKCk7CiAgICAgICAgICAgICAgICAgICAgcmdiLmEgPSAwOwogICAgICAgICAgICAgICAgICAgIHZhciByZWFsQWxwaGEgPSB0aW55Y29sb3IocmdiKS50b1JnYlN0cmluZygpOwogICAgICAgICAgICAgICAgICAgIHZhciBncmFkaWVudCA9ICJsaW5lYXItZ3JhZGllbnQobGVmdCwgIiArIHJlYWxBbHBoYSArICIsICIgKyByZWFsSGV4ICsgIikiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoSUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTbGlkZXJJbm5lci5jc3MoImZpbHRlciIsIHRpbnljb2xvcihyZWFsQWxwaGEpLnRvRmlsdGVyKHsgZ3JhZGllbnRUeXBlOiAxIH0sIHJlYWxIZXgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2xpZGVySW5uZXIuY3NzKCJiYWNrZ3JvdW5kIiwgIi13ZWJraXQtIiArIGdyYWRpZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTbGlkZXJJbm5lci5jc3MoImJhY2tncm91bmQiLCAiLW1vei0iICsgZ3JhZGllbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNsaWRlcklubmVyLmNzcygiYmFja2dyb3VuZCIsICItbXMtIiArIGdyYWRpZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGN1cnJlbnQgc3ludGF4IGdyYWRpZW50IG9uIHVucHJlZml4ZWQgcHJvcGVydHkuCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2xpZGVySW5uZXIuY3NzKCJiYWNrZ3JvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICIgKyByZWFsQWxwaGEgKyAiLCAiICsgcmVhbEhleCArICIpIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRpc3BsYXlDb2xvciA9IHJlYWxDb2xvci50b1N0cmluZyhmb3JtYXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRleHQgZW50cnkgaW5wdXQgYXMgaXQgY2hhbmdlcyBoYXBwZW4KICAgICAgICAgICAgaWYgKG9wdHMuc2hvd0lucHV0KSB7CiAgICAgICAgICAgICAgICB0ZXh0SW5wdXQudmFsKGRpc3BsYXlDb2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvcHRzLnNob3dQYWxldHRlKSB7CiAgICAgICAgICAgICAgICBkcmF3UGFsZXR0ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkcmF3SW5pdGlhbCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdXBkYXRlSGVscGVyTG9jYXRpb25zKCkgewogICAgICAgICAgICB2YXIgcyA9IGN1cnJlbnRTYXR1cmF0aW9uOwogICAgICAgICAgICB2YXIgdiA9IGN1cnJlbnRWYWx1ZTsKCiAgICAgICAgICAgIGlmKGFsbG93RW1wdHkgJiYgaXNFbXB0eSkgewogICAgICAgICAgICAgICAgLy9pZiBzZWxlY3RlZCBjb2xvciBpcyBlbXB0eSwgaGlkZSB0aGUgaGVscGVycwogICAgICAgICAgICAgICAgYWxwaGFTbGlkZUhlbHBlci5oaWRlKCk7CiAgICAgICAgICAgICAgICBzbGlkZUhlbHBlci5oaWRlKCk7CiAgICAgICAgICAgICAgICBkcmFnSGVscGVyLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIGhlbHBlcnMgYXJlIHZpc2libGUKICAgICAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXIuc2hvdygpOwogICAgICAgICAgICAgICAgc2xpZGVIZWxwZXIuc2hvdygpOwogICAgICAgICAgICAgICAgZHJhZ0hlbHBlci5zaG93KCk7CgogICAgICAgICAgICAgICAgLy8gV2hlcmUgdG8gc2hvdyB0aGUgbGl0dGxlIGNpcmNsZSBpbiB0aGF0IGRpc3BsYXlzIHlvdXIgY3VycmVudCBzZWxlY3RlZCBjb2xvcgogICAgICAgICAgICAgICAgdmFyIGRyYWdYID0gcyAqIGRyYWdXaWR0aDsKICAgICAgICAgICAgICAgIHZhciBkcmFnWSA9IGRyYWdIZWlnaHQgLSAodiAqIGRyYWdIZWlnaHQpOwogICAgICAgICAgICAgICAgZHJhZ1ggPSBNYXRoLm1heCgKICAgICAgICAgICAgICAgICAgICAtZHJhZ0hlbHBlckhlaWdodCwKICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihkcmFnV2lkdGggLSBkcmFnSGVscGVySGVpZ2h0LCBkcmFnWCAtIGRyYWdIZWxwZXJIZWlnaHQpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZHJhZ1kgPSBNYXRoLm1heCgKICAgICAgICAgICAgICAgICAgICAtZHJhZ0hlbHBlckhlaWdodCwKICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihkcmFnSGVpZ2h0IC0gZHJhZ0hlbHBlckhlaWdodCwgZHJhZ1kgLSBkcmFnSGVscGVySGVpZ2h0KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRyYWdIZWxwZXIuY3NzKHsKICAgICAgICAgICAgICAgICAgICAidG9wIjogZHJhZ1kgKyAicHgiLAogICAgICAgICAgICAgICAgICAgICJsZWZ0IjogZHJhZ1ggKyAicHgiCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB2YXIgYWxwaGFYID0gY3VycmVudEFscGhhICogYWxwaGFXaWR0aDsKICAgICAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXIuY3NzKHsKICAgICAgICAgICAgICAgICAgICAibGVmdCI6IChhbHBoYVggLSAoYWxwaGFTbGlkZUhlbHBlcldpZHRoIC8gMikpICsgInB4IgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gV2hlcmUgdG8gc2hvdyB0aGUgYmFyIHRoYXQgZGlzcGxheXMgeW91ciBjdXJyZW50IHNlbGVjdGVkIGh1ZQogICAgICAgICAgICAgICAgdmFyIHNsaWRlWSA9IChjdXJyZW50SHVlKSAqIHNsaWRlSGVpZ2h0OwogICAgICAgICAgICAgICAgc2xpZGVIZWxwZXIuY3NzKHsKICAgICAgICAgICAgICAgICAgICAidG9wIjogKHNsaWRlWSAtIHNsaWRlSGVscGVySGVpZ2h0KSArICJweCIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB1cGRhdGVPcmlnaW5hbElucHV0KGZpcmVDYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY29sb3IgPSBnZXQoKSwKICAgICAgICAgICAgICAgIGRpc3BsYXlDb2xvciA9ICcnLAogICAgICAgICAgICAgICAgaGFzQ2hhbmdlZCA9ICF0aW55Y29sb3IuZXF1YWxzKGNvbG9yLCBjb2xvck9uU2hvdyk7CgogICAgICAgICAgICBpZiAoY29sb3IpIHsKICAgICAgICAgICAgICAgIGRpc3BsYXlDb2xvciA9IGNvbG9yLnRvU3RyaW5nKGN1cnJlbnRQcmVmZXJyZWRGb3JtYXQpOwogICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3Rpb24gcGFsZXR0ZSB3aXRoIHRoZSBjdXJyZW50IGNvbG9yCiAgICAgICAgICAgICAgICBhZGRDb2xvclRvU2VsZWN0aW9uUGFsZXR0ZShjb2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0lucHV0KSB7CiAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnQudmFsKGRpc3BsYXlDb2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmaXJlQ2FsbGJhY2sgJiYgaGFzQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2tzLmNoYW5nZShjb2xvcik7CiAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJywgWyBjb2xvciBdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVmbG93KCkgewogICAgICAgICAgICBpZiAoIXZpc2libGUpIHsKICAgICAgICAgICAgICAgIHJldHVybjsgLy8gQ2FsY3VsYXRpb25zIHdvdWxkIGJlIHVzZWxlc3MgYW5kIHdvdWxkbid0IGJlIHJlbGlhYmxlIGFueXdheXMKICAgICAgICAgICAgfQogICAgICAgICAgICBkcmFnV2lkdGggPSBkcmFnZ2VyLndpZHRoKCk7CiAgICAgICAgICAgIGRyYWdIZWlnaHQgPSBkcmFnZ2VyLmhlaWdodCgpOwogICAgICAgICAgICBkcmFnSGVscGVySGVpZ2h0ID0gZHJhZ0hlbHBlci5oZWlnaHQoKTsKICAgICAgICAgICAgc2xpZGVXaWR0aCA9IHNsaWRlci53aWR0aCgpOwogICAgICAgICAgICBzbGlkZUhlaWdodCA9IHNsaWRlci5oZWlnaHQoKTsKICAgICAgICAgICAgc2xpZGVIZWxwZXJIZWlnaHQgPSBzbGlkZUhlbHBlci5oZWlnaHQoKTsKICAgICAgICAgICAgYWxwaGFXaWR0aCA9IGFscGhhU2xpZGVyLndpZHRoKCk7CiAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXJXaWR0aCA9IGFscGhhU2xpZGVIZWxwZXIud2lkdGgoKTsKCiAgICAgICAgICAgIGlmICghZmxhdCkgewogICAgICAgICAgICAgICAgY29udGFpbmVyLmNzcygicG9zaXRpb24iLCAiYWJzb2x1dGUiKTsKICAgICAgICAgICAgICAgIGlmIChvcHRzLm9mZnNldCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5vZmZzZXQob3B0cy5vZmZzZXQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb250YWluZXIub2Zmc2V0KGdldE9mZnNldChjb250YWluZXIsIG9mZnNldEVsZW1lbnQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXBkYXRlSGVscGVyTG9jYXRpb25zKCk7CgogICAgICAgICAgICBpZiAob3B0cy5zaG93UGFsZXR0ZSkgewogICAgICAgICAgICAgICAgZHJhd1BhbGV0dGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYm91bmRFbGVtZW50LnRyaWdnZXIoJ3JlZmxvdy5zcGVjdHJ1bScpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZGVzdHJveSgpIHsKICAgICAgICAgICAgYm91bmRFbGVtZW50LnNob3coKTsKICAgICAgICAgICAgb2Zmc2V0RWxlbWVudC51bmJpbmQoImNsaWNrLnNwZWN0cnVtIHRvdWNoc3RhcnQuc3BlY3RydW0iKTsKICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpOwogICAgICAgICAgICByZXBsYWNlci5yZW1vdmUoKTsKICAgICAgICAgICAgc3BlY3RydW1zW3NwZWN0LmlkXSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvcHRpb24ob3B0aW9uTmFtZSwgb3B0aW9uVmFsdWUpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbk5hbWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICQuZXh0ZW5kKHt9LCBvcHRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9uVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG9wdHNbb3B0aW9uTmFtZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9wdHNbb3B0aW9uTmFtZV0gPSBvcHRpb25WYWx1ZTsKCiAgICAgICAgICAgIGlmIChvcHRpb25OYW1lID09PSAicHJlZmVycmVkRm9ybWF0IikgewogICAgICAgICAgICAgICAgY3VycmVudFByZWZlcnJlZEZvcm1hdCA9IG9wdHMucHJlZmVycmVkRm9ybWF0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGx5T3B0aW9ucygpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZW5hYmxlKCkgewogICAgICAgICAgICBkaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBib3VuZEVsZW1lbnQuYXR0cigiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIG9mZnNldEVsZW1lbnQucmVtb3ZlQ2xhc3MoInNwLWRpc2FibGVkIik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkaXNhYmxlKCkgewogICAgICAgICAgICBoaWRlKCk7CiAgICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgYm91bmRFbGVtZW50LmF0dHIoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIG9mZnNldEVsZW1lbnQuYWRkQ2xhc3MoInNwLWRpc2FibGVkIik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZXRPZmZzZXQoY29vcmQpIHsKICAgICAgICAgICAgb3B0cy5vZmZzZXQgPSBjb29yZDsKICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgfQoKICAgICAgICBpbml0aWFsaXplKCk7CgogICAgICAgIHZhciBzcGVjdCA9IHsKICAgICAgICAgICAgc2hvdzogc2hvdywKICAgICAgICAgICAgaGlkZTogaGlkZSwKICAgICAgICAgICAgdG9nZ2xlOiB0b2dnbGUsCiAgICAgICAgICAgIHJlZmxvdzogcmVmbG93LAogICAgICAgICAgICBvcHRpb246IG9wdGlvbiwKICAgICAgICAgICAgZW5hYmxlOiBlbmFibGUsCiAgICAgICAgICAgIGRpc2FibGU6IGRpc2FibGUsCiAgICAgICAgICAgIG9mZnNldDogc2V0T2Zmc2V0LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgICBzZXQoYyk7CiAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldDogZ2V0LAogICAgICAgICAgICBkZXN0cm95OiBkZXN0cm95LAogICAgICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcgogICAgICAgIH07CgogICAgICAgIHNwZWN0LmlkID0gc3BlY3RydW1zLnB1c2goc3BlY3QpIC0gMTsKCiAgICAgICAgcmV0dXJuIHNwZWN0OwogICAgfQoKICAgIC8qKgogICAgKiBjaGVja09mZnNldCAtIGdldCB0aGUgb2Zmc2V0IGJlbG93L2Fib3ZlIGFuZCBsZWZ0L3JpZ2h0IGVsZW1lbnQgZGVwZW5kaW5nIG9uIHNjcmVlbiBwb3NpdGlvbgogICAgKiBUaGFua3MgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkvYmxvYi9tYXN0ZXIvdWkvanF1ZXJ5LnVpLmRhdGVwaWNrZXIuanMKICAgICovCiAgICBmdW5jdGlvbiBnZXRPZmZzZXQocGlja2VyLCBpbnB1dCkgewogICAgICAgIHZhciBleHRyYVkgPSAwOwogICAgICAgIHZhciBkcFdpZHRoID0gcGlja2VyLm91dGVyV2lkdGgoKTsKICAgICAgICB2YXIgZHBIZWlnaHQgPSBwaWNrZXIub3V0ZXJIZWlnaHQoKTsKICAgICAgICB2YXIgaW5wdXRIZWlnaHQgPSBpbnB1dC5vdXRlckhlaWdodCgpOwogICAgICAgIHZhciBkb2MgPSBwaWNrZXJbMF0ub3duZXJEb2N1bWVudDsKICAgICAgICB2YXIgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CiAgICAgICAgdmFyIHZpZXdXaWR0aCA9IGRvY0VsZW0uY2xpZW50V2lkdGggKyAkKGRvYykuc2Nyb2xsTGVmdCgpOwogICAgICAgIHZhciB2aWV3SGVpZ2h0ID0gZG9jRWxlbS5jbGllbnRIZWlnaHQgKyAkKGRvYykuc2Nyb2xsVG9wKCk7CiAgICAgICAgdmFyIG9mZnNldCA9IGlucHV0Lm9mZnNldCgpOwogICAgICAgIG9mZnNldC50b3AgKz0gaW5wdXRIZWlnaHQ7CgogICAgICAgIG9mZnNldC5sZWZ0IC09CiAgICAgICAgICAgIE1hdGgubWluKG9mZnNldC5sZWZ0LCAob2Zmc2V0LmxlZnQgKyBkcFdpZHRoID4gdmlld1dpZHRoICYmIHZpZXdXaWR0aCA+IGRwV2lkdGgpID8KICAgICAgICAgICAgTWF0aC5hYnMob2Zmc2V0LmxlZnQgKyBkcFdpZHRoIC0gdmlld1dpZHRoKSA6IDApOwoKICAgICAgICBvZmZzZXQudG9wIC09CiAgICAgICAgICAgIE1hdGgubWluKG9mZnNldC50b3AsICgob2Zmc2V0LnRvcCArIGRwSGVpZ2h0ID4gdmlld0hlaWdodCAmJiB2aWV3SGVpZ2h0ID4gZHBIZWlnaHQpID8KICAgICAgICAgICAgTWF0aC5hYnMoZHBIZWlnaHQgKyBpbnB1dEhlaWdodCAtIGV4dHJhWSkgOiBleHRyYVkpKTsKCiAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgIH0KCiAgICAvKioKICAgICogbm9vcCAtIGRvIG5vdGhpbmcKICAgICovCiAgICBmdW5jdGlvbiBub29wKCkgewoKICAgIH0KCiAgICAvKioKICAgICogc3RvcFByb3BhZ2F0aW9uIC0gbWFrZXMgdGhlIGNvZGUgb25seSBkb2luZyB0aGlzIGEgbGl0dGxlIGVhc2llciB0byByZWFkIGluIGxpbmUKICAgICovCiAgICBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oZSkgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgLyoqCiAgICAqIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0CiAgICAqIFRoYW5rcyB0byB1bmRlcnNjb3JlLmpzCiAgICAqLwogICAgZnVuY3Rpb24gYmluZChmdW5jLCBvYmopIHsKICAgICAgICB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqLCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTsKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgKiBMaWdodHdlaWdodCBkcmFnIGhlbHBlci4gIEhhbmRsZXMgY29udGFpbm1lbnQgd2l0aGluIHRoZSBlbGVtZW50LCBzbyB0aGF0CiAgICAqIHdoZW4gZHJhZ2dpbmcsIHRoZSB4IGlzIHdpdGhpbiBbMCxlbGVtZW50LndpZHRoXSBhbmQgeSBpcyB3aXRoaW4gWzAsZWxlbWVudC5oZWlnaHRdCiAgICAqLwogICAgZnVuY3Rpb24gZHJhZ2dhYmxlKGVsZW1lbnQsIG9ubW92ZSwgb25zdGFydCwgb25zdG9wKSB7CiAgICAgICAgb25tb3ZlID0gb25tb3ZlIHx8IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICBvbnN0YXJ0ID0gb25zdGFydCB8fCBmdW5jdGlvbiAoKSB7IH07CiAgICAgICAgb25zdG9wID0gb25zdG9wIHx8IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICB2YXIgZG9jID0gZG9jdW1lbnQ7CiAgICAgICAgdmFyIGRyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgdmFyIG9mZnNldCA9IHt9OwogICAgICAgIHZhciBtYXhIZWlnaHQgPSAwOwogICAgICAgIHZhciBtYXhXaWR0aCA9IDA7CiAgICAgICAgdmFyIGhhc1RvdWNoID0gKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyk7CgogICAgICAgIHZhciBkdXJpbmdEcmFnRXZlbnRzID0ge307CiAgICAgICAgZHVyaW5nRHJhZ0V2ZW50c1sic2VsZWN0c3RhcnQiXSA9IHByZXZlbnQ7CiAgICAgICAgZHVyaW5nRHJhZ0V2ZW50c1siZHJhZ3N0YXJ0Il0gPSBwcmV2ZW50OwogICAgICAgIGR1cmluZ0RyYWdFdmVudHNbInRvdWNobW92ZSBtb3VzZW1vdmUiXSA9IG1vdmU7CiAgICAgICAgZHVyaW5nRHJhZ0V2ZW50c1sidG91Y2hlbmQgbW91c2V1cCJdID0gc3RvcDsKCiAgICAgICAgZnVuY3Rpb24gcHJldmVudChlKSB7CiAgICAgICAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmUoZSkgewogICAgICAgICAgICBpZiAoZHJhZ2dpbmcpIHsKICAgICAgICAgICAgICAgIC8vIE1vdXNldXAgaGFwcGVuZWQgb3V0c2lkZSBvZiB3aW5kb3cKICAgICAgICAgICAgICAgIGlmIChJRSAmJiBkb2MuZG9jdW1lbnRNb2RlIDwgOSAmJiAhZS5idXR0b24pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0MCA9IGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcyAmJiBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXTsKICAgICAgICAgICAgICAgIHZhciBwYWdlWCA9IHQwICYmIHQwLnBhZ2VYIHx8IGUucGFnZVg7CiAgICAgICAgICAgICAgICB2YXIgcGFnZVkgPSB0MCAmJiB0MC5wYWdlWSB8fCBlLnBhZ2VZOwoKICAgICAgICAgICAgICAgIHZhciBkcmFnWCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VYIC0gb2Zmc2V0LmxlZnQsIG1heFdpZHRoKSk7CiAgICAgICAgICAgICAgICB2YXIgZHJhZ1kgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlWSAtIG9mZnNldC50b3AsIG1heEhlaWdodCkpOwoKICAgICAgICAgICAgICAgIGlmIChoYXNUb3VjaCkgewogICAgICAgICAgICAgICAgICAgIC8vIFN0b3Agc2Nyb2xsaW5nIGluIGlPUwogICAgICAgICAgICAgICAgICAgIHByZXZlbnQoZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgb25tb3ZlLmFwcGx5KGVsZW1lbnQsIFtkcmFnWCwgZHJhZ1ksIGVdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc3RhcnQoZSkgewogICAgICAgICAgICB2YXIgcmlnaHRjbGljayA9IChlLndoaWNoKSA/IChlLndoaWNoID09IDMpIDogKGUuYnV0dG9uID09IDIpOwoKICAgICAgICAgICAgaWYgKCFyaWdodGNsaWNrICYmICFkcmFnZ2luZykgewogICAgICAgICAgICAgICAgaWYgKG9uc3RhcnQuYXBwbHkoZWxlbWVudCwgYXJndW1lbnRzKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBkcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gJChlbGVtZW50KS5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aCA9ICQoZWxlbWVudCkud2lkdGgoKTsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAkKGVsZW1lbnQpLm9mZnNldCgpOwoKICAgICAgICAgICAgICAgICAgICAkKGRvYykuYmluZChkdXJpbmdEcmFnRXZlbnRzKTsKICAgICAgICAgICAgICAgICAgICAkKGRvYy5ib2R5KS5hZGRDbGFzcygic3AtZHJhZ2dpbmciKTsKCiAgICAgICAgICAgICAgICAgICAgbW92ZShlKTsKCiAgICAgICAgICAgICAgICAgICAgcHJldmVudChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgICAgICAgICAkKGRvYykudW5iaW5kKGR1cmluZ0RyYWdFdmVudHMpOwogICAgICAgICAgICAgICAgJChkb2MuYm9keSkucmVtb3ZlQ2xhc3MoInNwLWRyYWdnaW5nIik7CgogICAgICAgICAgICAgICAgLy8gV2FpdCBhIHRpY2sgYmVmb3JlIG5vdGlmeWluZyBvYnNlcnZlcnMgdG8gYWxsb3cgdGhlIGNsaWNrIGV2ZW50CiAgICAgICAgICAgICAgICAvLyB0byBmaXJlIGluIENocm9tZS4KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb25zdG9wLmFwcGx5KGVsZW1lbnQsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkcmFnZ2luZyA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJChlbGVtZW50KS5iaW5kKCJ0b3VjaHN0YXJ0IG1vdXNlZG93biIsIHN0YXJ0KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBkZWJvdW5jZSkgewogICAgICAgIHZhciB0aW1lb3V0OwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsKICAgICAgICAgICAgdmFyIHRocm90dGxlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsOwogICAgICAgICAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKGRlYm91bmNlKSBjbGVhclRpbWVvdXQodGltZW91dCk7CiAgICAgICAgICAgIGlmIChkZWJvdW5jZSB8fCAhdGltZW91dCkgdGltZW91dCA9IHNldFRpbWVvdXQodGhyb3R0bGVyLCB3YWl0KTsKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGlucHV0VHlwZUNvbG9yU3VwcG9ydCgpIHsKICAgICAgICByZXR1cm4gJC5mbi5zcGVjdHJ1bS5pbnB1dFR5cGVDb2xvclN1cHBvcnQoKTsKICAgIH0KCiAgICAvKioKICAgICogRGVmaW5lIGEgalF1ZXJ5IHBsdWdpbgogICAgKi8KICAgIHZhciBkYXRhSUQgPSAic3BlY3RydW0uaWQiOwogICAgJC5mbi5zcGVjdHJ1bSA9IGZ1bmN0aW9uIChvcHRzLCBleHRyYSkgewoKICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT0gInN0cmluZyIpIHsKCiAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHRoaXM7CiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApOwoKICAgICAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzcGVjdCA9IHNwZWN0cnVtc1skKHRoaXMpLmRhdGEoZGF0YUlEKV07CiAgICAgICAgICAgICAgICBpZiAoc3BlY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gc3BlY3Rbb3B0c107CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAiU3BlY3RydW06IG5vIHN1Y2ggbWV0aG9kOiAnIiArIG9wdHMgKyAiJyIgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRzID09ICJnZXQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gc3BlY3QuZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdHMgPT0gImNvbnRhaW5lciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzcGVjdC5jb250YWluZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdHMgPT0gIm9wdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzcGVjdC5vcHRpb24uYXBwbHkoc3BlY3QsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRzID09ICJkZXN0cm95IikgewogICAgICAgICAgICAgICAgICAgICAgICBzcGVjdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlRGF0YShkYXRhSUQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmFwcGx5KHNwZWN0LCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5pdGlhbGl6aW5nIGEgbmV3IGluc3RhbmNlIG9mIHNwZWN0cnVtCiAgICAgICAgcmV0dXJuIHRoaXMuc3BlY3RydW0oImRlc3Ryb3kiKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgb3B0cywgJCh0aGlzKS5kYXRhKCkpOwogICAgICAgICAgICB2YXIgc3BlY3QgPSBzcGVjdHJ1bSh0aGlzLCBvcHRpb25zKTsKICAgICAgICAgICAgJCh0aGlzKS5kYXRhKGRhdGFJRCwgc3BlY3QuaWQpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLnNwZWN0cnVtLmxvYWQgPSB0cnVlOwogICAgJC5mbi5zcGVjdHJ1bS5sb2FkT3B0cyA9IHt9OwogICAgJC5mbi5zcGVjdHJ1bS5kcmFnZ2FibGUgPSBkcmFnZ2FibGU7CiAgICAkLmZuLnNwZWN0cnVtLmRlZmF1bHRzID0gZGVmYXVsdE9wdHM7CiAgICAkLmZuLnNwZWN0cnVtLmlucHV0VHlwZUNvbG9yU3VwcG9ydCA9IGZ1bmN0aW9uIGlucHV0VHlwZUNvbG9yU3VwcG9ydCgpIHsKICAgICAgICBpZiAodHlwZW9mIGlucHV0VHlwZUNvbG9yU3VwcG9ydC5fY2FjaGVkUmVzdWx0ID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB2YXIgY29sb3JJbnB1dCA9ICQoIjxpbnB1dCB0eXBlPSdjb2xvcicvPiIpWzBdOyAvLyBpZiBjb2xvciBlbGVtZW50IGlzIHN1cHBvcnRlZCwgdmFsdWUgd2lsbCBkZWZhdWx0IHRvIG5vdCBudWxsCiAgICAgICAgICAgIGlucHV0VHlwZUNvbG9yU3VwcG9ydC5fY2FjaGVkUmVzdWx0ID0gY29sb3JJbnB1dC50eXBlID09PSAiY29sb3IiICYmIGNvbG9ySW5wdXQudmFsdWUgIT09ICIiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5wdXRUeXBlQ29sb3JTdXBwb3J0Ll9jYWNoZWRSZXN1bHQ7CiAgICB9OwoKICAgICQuc3BlY3RydW0gPSB7IH07CiAgICAkLnNwZWN0cnVtLmxvY2FsaXphdGlvbiA9IHsgfTsKICAgICQuc3BlY3RydW0ucGFsZXR0ZXMgPSB7IH07CgogICAgJC5mbi5zcGVjdHJ1bS5wcm9jZXNzTmF0aXZlQ29sb3JJbnB1dHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGNvbG9ySW5wdXRzID0gJCgiaW5wdXRbdHlwZT1jb2xvcl0iKTsKICAgICAgICBpZiAoY29sb3JJbnB1dHMubGVuZ3RoICYmICFpbnB1dFR5cGVDb2xvclN1cHBvcnQoKSkgewogICAgICAgICAgICBjb2xvcklucHV0cy5zcGVjdHJ1bSh7CiAgICAgICAgICAgICAgICBwcmVmZXJyZWRGb3JtYXQ6ICJoZXg2IgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9OwoKICAgIC8vIFRpbnlDb2xvciB2MS4xLjIKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZ3JpbnMvVGlueUNvbG9yCiAgICAvLyBCcmlhbiBHcmluc3RlYWQsIE1JVCBMaWNlbnNlCgogICAgKGZ1bmN0aW9uKCkgewoKICAgIHZhciB0cmltTGVmdCA9IC9eW1xzLCNdKy8sCiAgICAgICAgdHJpbVJpZ2h0ID0gL1xzKyQvLAogICAgICAgIHRpbnlDb3VudGVyID0gMCwKICAgICAgICBtYXRoID0gTWF0aCwKICAgICAgICBtYXRoUm91bmQgPSBtYXRoLnJvdW5kLAogICAgICAgIG1hdGhNaW4gPSBtYXRoLm1pbiwKICAgICAgICBtYXRoTWF4ID0gbWF0aC5tYXgsCiAgICAgICAgbWF0aFJhbmRvbSA9IG1hdGgucmFuZG9tOwoKICAgIHZhciB0aW55Y29sb3IgPSBmdW5jdGlvbihjb2xvciwgb3B0cykgewoKICAgICAgICBjb2xvciA9IChjb2xvcikgPyBjb2xvciA6ICcnOwogICAgICAgIG9wdHMgPSBvcHRzIHx8IHsgfTsKCiAgICAgICAgLy8gSWYgaW5wdXQgaXMgYWxyZWFkeSBhIHRpbnljb2xvciwgcmV0dXJuIGl0c2VsZgogICAgICAgIGlmIChjb2xvciBpbnN0YW5jZW9mIHRpbnljb2xvcikgewogICAgICAgICAgIHJldHVybiBjb2xvcjsKICAgICAgICB9CiAgICAgICAgLy8gSWYgd2UgYXJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBjYWxsIHVzaW5nIG5ldyBpbnN0ZWFkCiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHRpbnljb2xvcikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyB0aW55Y29sb3IoY29sb3IsIG9wdHMpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJnYiA9IGlucHV0VG9SR0IoY29sb3IpOwogICAgICAgIHRoaXMuX29yaWdpbmFsSW5wdXQgPSBjb2xvciwKICAgICAgICB0aGlzLl9yID0gcmdiLnIsCiAgICAgICAgdGhpcy5fZyA9IHJnYi5nLAogICAgICAgIHRoaXMuX2IgPSByZ2IuYiwKICAgICAgICB0aGlzLl9hID0gcmdiLmEsCiAgICAgICAgdGhpcy5fcm91bmRBID0gbWF0aFJvdW5kKDEwMCp0aGlzLl9hKSAvIDEwMCwKICAgICAgICB0aGlzLl9mb3JtYXQgPSBvcHRzLmZvcm1hdCB8fCByZ2IuZm9ybWF0OwogICAgICAgIHRoaXMuX2dyYWRpZW50VHlwZSA9IG9wdHMuZ3JhZGllbnRUeXBlOwoKICAgICAgICAvLyBEb24ndCBsZXQgdGhlIHJhbmdlIG9mIFswLDI1NV0gY29tZSBiYWNrIGluIFswLDFdLgogICAgICAgIC8vIFBvdGVudGlhbGx5IGxvc2UgYSBsaXR0bGUgYml0IG9mIHByZWNpc2lvbiBoZXJlLCBidXQgd2lsbCBmaXggaXNzdWVzIHdoZXJlCiAgICAgICAgLy8gLjUgZ2V0cyBpbnRlcnByZXRlZCBhcyBoYWxmIG9mIHRoZSB0b3RhbCwgaW5zdGVhZCBvZiBoYWxmIG9mIDEKICAgICAgICAvLyBJZiBpdCB3YXMgc3VwcG9zZWQgdG8gYmUgMTI4LCB0aGlzIHdhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgYnkgYGlucHV0VG9SZ2JgCiAgICAgICAgaWYgKHRoaXMuX3IgPCAxKSB7IHRoaXMuX3IgPSBtYXRoUm91bmQodGhpcy5fcik7IH0KICAgICAgICBpZiAodGhpcy5fZyA8IDEpIHsgdGhpcy5fZyA9IG1hdGhSb3VuZCh0aGlzLl9nKTsgfQogICAgICAgIGlmICh0aGlzLl9iIDwgMSkgeyB0aGlzLl9iID0gbWF0aFJvdW5kKHRoaXMuX2IpOyB9CgogICAgICAgIHRoaXMuX29rID0gcmdiLm9rOwogICAgICAgIHRoaXMuX3RjX2lkID0gdGlueUNvdW50ZXIrKzsKICAgIH07CgogICAgdGlueWNvbG9yLnByb3RvdHlwZSA9IHsKICAgICAgICBpc0Rhcms6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCcmlnaHRuZXNzKCkgPCAxMjg7CiAgICAgICAgfSwKICAgICAgICBpc0xpZ2h0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGFyaygpOwogICAgICAgIH0sCiAgICAgICAgaXNWYWxpZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vazsKICAgICAgICB9LAogICAgICAgIGdldE9yaWdpbmFsSW5wdXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsSW5wdXQ7CiAgICAgICAgfSwKICAgICAgICBnZXRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0OwogICAgICAgIH0sCiAgICAgICAgZ2V0QWxwaGE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYTsKICAgICAgICB9LAogICAgICAgIGdldEJyaWdodG5lc3M6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpOwogICAgICAgICAgICByZXR1cm4gKHJnYi5yICogMjk5ICsgcmdiLmcgKiA1ODcgKyByZ2IuYiAqIDExNCkgLyAxMDAwOwogICAgICAgIH0sCiAgICAgICAgc2V0QWxwaGE6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2EgPSBib3VuZEFscGhhKHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fcm91bmRBID0gbWF0aFJvdW5kKDEwMCp0aGlzLl9hKSAvIDEwMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICB0b0hzdjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBoc3YgPSByZ2JUb0hzdih0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTsKICAgICAgICAgICAgcmV0dXJuIHsgaDogaHN2LmggKiAzNjAsIHM6IGhzdi5zLCB2OiBoc3YudiwgYTogdGhpcy5fYSB9OwogICAgICAgIH0sCiAgICAgICAgdG9Ic3ZTdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaHN2ID0gcmdiVG9Ic3YodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYik7CiAgICAgICAgICAgIHZhciBoID0gbWF0aFJvdW5kKGhzdi5oICogMzYwKSwgcyA9IG1hdGhSb3VuZChoc3YucyAqIDEwMCksIHYgPSBtYXRoUm91bmQoaHN2LnYgKiAxMDApOwogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgPwogICAgICAgICAgICAgICJoc3YoIiAgKyBoICsgIiwgIiArIHMgKyAiJSwgIiArIHYgKyAiJSkiIDoKICAgICAgICAgICAgICAiaHN2YSgiICsgaCArICIsICIgKyBzICsgIiUsICIgKyB2ICsgIiUsICIrIHRoaXMuX3JvdW5kQSArICIpIjsKICAgICAgICB9LAogICAgICAgIHRvSHNsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGhzbCA9IHJnYlRvSHNsKHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IpOwogICAgICAgICAgICByZXR1cm4geyBoOiBoc2wuaCAqIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sLCBhOiB0aGlzLl9hIH07CiAgICAgICAgfSwKICAgICAgICB0b0hzbFN0cmluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBoc2wgPSByZ2JUb0hzbCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTsKICAgICAgICAgICAgdmFyIGggPSBtYXRoUm91bmQoaHNsLmggKiAzNjApLCBzID0gbWF0aFJvdW5kKGhzbC5zICogMTAwKSwgbCA9IG1hdGhSb3VuZChoc2wubCAqIDEwMCk7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5fYSA9PSAxKSA/CiAgICAgICAgICAgICAgImhzbCgiICArIGggKyAiLCAiICsgcyArICIlLCAiICsgbCArICIlKSIgOgogICAgICAgICAgICAgICJoc2xhKCIgKyBoICsgIiwgIiArIHMgKyAiJSwgIiArIGwgKyAiJSwgIisgdGhpcy5fcm91bmRBICsgIikiOwogICAgICAgIH0sCiAgICAgICAgdG9IZXg6IGZ1bmN0aW9uKGFsbG93M0NoYXIpIHsKICAgICAgICAgICAgcmV0dXJuIHJnYlRvSGV4KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IsIGFsbG93M0NoYXIpOwogICAgICAgIH0sCiAgICAgICAgdG9IZXhTdHJpbmc6IGZ1bmN0aW9uKGFsbG93M0NoYXIpIHsKICAgICAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXgoYWxsb3czQ2hhcik7CiAgICAgICAgfSwKICAgICAgICB0b0hleDg6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gcmdiYVRvSGV4KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IsIHRoaXMuX2EpOwogICAgICAgIH0sCiAgICAgICAgdG9IZXg4U3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXg4KCk7CiAgICAgICAgfSwKICAgICAgICB0b1JnYjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IG1hdGhSb3VuZCh0aGlzLl9yKSwgZzogbWF0aFJvdW5kKHRoaXMuX2cpLCBiOiBtYXRoUm91bmQodGhpcy5fYiksIGE6IHRoaXMuX2EgfTsKICAgICAgICB9LAogICAgICAgIHRvUmdiU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9hID09IDEpID8KICAgICAgICAgICAgICAicmdiKCIgICsgbWF0aFJvdW5kKHRoaXMuX3IpICsgIiwgIiArIG1hdGhSb3VuZCh0aGlzLl9nKSArICIsICIgKyBtYXRoUm91bmQodGhpcy5fYikgKyAiKSIgOgogICAgICAgICAgICAgICJyZ2JhKCIgKyBtYXRoUm91bmQodGhpcy5fcikgKyAiLCAiICsgbWF0aFJvdW5kKHRoaXMuX2cpICsgIiwgIiArIG1hdGhSb3VuZCh0aGlzLl9iKSArICIsICIgKyB0aGlzLl9yb3VuZEEgKyAiKSI7CiAgICAgICAgfSwKICAgICAgICB0b1BlcmNlbnRhZ2VSZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4geyByOiBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArICIlIiwgZzogbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fZywgMjU1KSAqIDEwMCkgKyAiJSIsIGI6IG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX2IsIDI1NSkgKiAxMDApICsgIiUiLCBhOiB0aGlzLl9hIH07CiAgICAgICAgfSwKICAgICAgICB0b1BlcmNlbnRhZ2VSZ2JTdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgPwogICAgICAgICAgICAgICJyZ2IoIiAgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArICIlLCAiICsgbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fZywgMjU1KSAqIDEwMCkgKyAiJSwgIiArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX2IsIDI1NSkgKiAxMDApICsgIiUpIiA6CiAgICAgICAgICAgICAgInJnYmEoIiArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX3IsIDI1NSkgKiAxMDApICsgIiUsICIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9nLCAyNTUpICogMTAwKSArICIlLCAiICsgbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fYiwgMjU1KSAqIDEwMCkgKyAiJSwgIiArIHRoaXMuX3JvdW5kQSArICIpIjsKICAgICAgICB9LAogICAgICAgIHRvTmFtZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zcGFyZW50IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuX2EgPCAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBoZXhOYW1lc1tyZ2JUb0hleCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iLCB0cnVlKV0gfHwgZmFsc2U7CiAgICAgICAgfSwKICAgICAgICB0b0ZpbHRlcjogZnVuY3Rpb24oc2Vjb25kQ29sb3IpIHsKICAgICAgICAgICAgdmFyIGhleDhTdHJpbmcgPSAnIycgKyByZ2JhVG9IZXgodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYiwgdGhpcy5fYSk7CiAgICAgICAgICAgIHZhciBzZWNvbmRIZXg4U3RyaW5nID0gaGV4OFN0cmluZzsKICAgICAgICAgICAgdmFyIGdyYWRpZW50VHlwZSA9IHRoaXMuX2dyYWRpZW50VHlwZSA/ICJHcmFkaWVudFR5cGUgPSAxLCAiIDogIiI7CgogICAgICAgICAgICBpZiAoc2Vjb25kQ29sb3IpIHsKICAgICAgICAgICAgICAgIHZhciBzID0gdGlueWNvbG9yKHNlY29uZENvbG9yKTsKICAgICAgICAgICAgICAgIHNlY29uZEhleDhTdHJpbmcgPSBzLnRvSGV4OFN0cmluZygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudCgiK2dyYWRpZW50VHlwZSsic3RhcnRDb2xvcnN0cj0iK2hleDhTdHJpbmcrIixlbmRDb2xvcnN0cj0iK3NlY29uZEhleDhTdHJpbmcrIikiOwogICAgICAgIH0sCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKGZvcm1hdCkgewogICAgICAgICAgICB2YXIgZm9ybWF0U2V0ID0gISFmb3JtYXQ7CiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCB0aGlzLl9mb3JtYXQ7CgogICAgICAgICAgICB2YXIgZm9ybWF0dGVkU3RyaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBoYXNBbHBoYSA9IHRoaXMuX2EgPCAxICYmIHRoaXMuX2EgPj0gMDsKICAgICAgICAgICAgdmFyIG5lZWRzQWxwaGFGb3JtYXQgPSAhZm9ybWF0U2V0ICYmIGhhc0FscGhhICYmIChmb3JtYXQgPT09ICJoZXgiIHx8IGZvcm1hdCA9PT0gImhleDYiIHx8IGZvcm1hdCA9PT0gImhleDMiIHx8IGZvcm1hdCA9PT0gIm5hbWUiKTsKCiAgICAgICAgICAgIGlmIChuZWVkc0FscGhhRm9ybWF0KSB7CiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yICJ0cmFuc3BhcmVudCIsIGFsbCBvdGhlciBub24tYWxwaGEgZm9ybWF0cwogICAgICAgICAgICAgICAgLy8gd2lsbCByZXR1cm4gcmdiYSB3aGVuIHRoZXJlIGlzIHRyYW5zcGFyZW5jeS4KICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJuYW1lIiAmJiB0aGlzLl9hID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9OYW1lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b1JnYlN0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJyZ2IiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUmdiU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gInByZ2IiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUGVyY2VudGFnZVJnYlN0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJoZXgiIHx8IGZvcm1hdCA9PT0gImhleDYiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4U3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gImhleDMiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4U3RyaW5nKHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJoZXg4IikgewogICAgICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b0hleDhTdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAibmFtZSIpIHsKICAgICAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9OYW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gImhzbCIpIHsKICAgICAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9Ic2xTdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAiaHN2IikgewogICAgICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b0hzdlN0cmluZygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVkU3RyaW5nIHx8IHRoaXMudG9IZXhTdHJpbmcoKTsKICAgICAgICB9LAoKICAgICAgICBfYXBwbHlNb2RpZmljYXRpb246IGZ1bmN0aW9uKGZuLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBjb2xvciA9IGZuLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmdzKSkpOwogICAgICAgICAgICB0aGlzLl9yID0gY29sb3IuX3I7CiAgICAgICAgICAgIHRoaXMuX2cgPSBjb2xvci5fZzsKICAgICAgICAgICAgdGhpcy5fYiA9IGNvbG9yLl9iOwogICAgICAgICAgICB0aGlzLnNldEFscGhhKGNvbG9yLl9hKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICBsaWdodGVuOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKGxpZ2h0ZW4sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBicmlnaHRlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihicmlnaHRlbiwgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIGRhcmtlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihkYXJrZW4sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBkZXNhdHVyYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKGRlc2F0dXJhdGUsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBzYXR1cmF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihzYXR1cmF0ZSwgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIGdyZXlzY2FsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihncmV5c2NhbGUsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBzcGluOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKHNwaW4sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKCiAgICAgICAgX2FwcGx5Q29tYmluYXRpb246IGZ1bmN0aW9uKGZuLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBbdGhpc10uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncykpKTsKICAgICAgICB9LAogICAgICAgIGFuYWxvZ291czogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKGFuYWxvZ291cywgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIGNvbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihjb21wbGVtZW50LCBhcmd1bWVudHMpOwogICAgICAgIH0sCiAgICAgICAgbW9ub2Nocm9tYXRpYzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKG1vbm9jaHJvbWF0aWMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBzcGxpdGNvbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihzcGxpdGNvbXBsZW1lbnQsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICB0cmlhZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKHRyaWFkLCBhcmd1bWVudHMpOwogICAgICAgIH0sCiAgICAgICAgdGV0cmFkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24odGV0cmFkLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgIH07CgogICAgLy8gSWYgaW5wdXQgaXMgYW4gb2JqZWN0LCBmb3JjZSAxIGludG8gIjEuMCIgdG8gaGFuZGxlIHJhdGlvcyBwcm9wZXJseQogICAgLy8gU3RyaW5nIGlucHV0IHJlcXVpcmVzICIxLjAiIGFzIGlucHV0LCBzbyAxIHdpbGwgYmUgdHJlYXRlZCBhcyAxCiAgICB0aW55Y29sb3IuZnJvbVJhdGlvID0gZnVuY3Rpb24oY29sb3IsIG9wdHMpIHsKICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHZhciBuZXdDb2xvciA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpIGluIGNvbG9yKSB7CiAgICAgICAgICAgICAgICBpZiAoY29sb3IuaGFzT3duUHJvcGVydHkoaSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gImEiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbG9yW2ldID0gY29sb3JbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2xvcltpXSA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3JbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb2xvciA9IG5ld0NvbG9yOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihjb2xvciwgb3B0cyk7CiAgICB9OwoKICAgIC8vIEdpdmVuIGEgc3RyaW5nIG9yIG9iamVjdCwgY29udmVydCB0aGF0IGlucHV0IHRvIFJHQgogICAgLy8gUG9zc2libGUgc3RyaW5nIGlucHV0czoKICAgIC8vCiAgICAvLyAgICAgInJlZCIKICAgIC8vICAgICAiI2YwMCIgb3IgImYwMCIKICAgIC8vICAgICAiI2ZmMDAwMCIgb3IgImZmMDAwMCIKICAgIC8vICAgICAiI2ZmMDAwMDAwIiBvciAiZmYwMDAwMDAiCiAgICAvLyAgICAgInJnYiAyNTUgMCAwIiBvciAicmdiICgyNTUsIDAsIDApIgogICAgLy8gICAgICJyZ2IgMS4wIDAgMCIgb3IgInJnYiAoMSwgMCwgMCkiCiAgICAvLyAgICAgInJnYmEgKDI1NSwgMCwgMCwgMSkiIG9yICJyZ2JhIDI1NSwgMCwgMCwgMSIKICAgIC8vICAgICAicmdiYSAoMS4wLCAwLCAwLCAxKSIgb3IgInJnYmEgMS4wLCAwLCAwLCAxIgogICAgLy8gICAgICJoc2woMCwgMTAwJSwgNTAlKSIgb3IgImhzbCAwIDEwMCUgNTAlIgogICAgLy8gICAgICJoc2xhKDAsIDEwMCUsIDUwJSwgMSkiIG9yICJoc2xhIDAgMTAwJSA1MCUsIDEiCiAgICAvLyAgICAgImhzdigwLCAxMDAlLCAxMDAlKSIgb3IgImhzdiAwIDEwMCUgMTAwJSIKICAgIC8vCiAgICBmdW5jdGlvbiBpbnB1dFRvUkdCKGNvbG9yKSB7CgogICAgICAgIHZhciByZ2IgPSB7IHI6IDAsIGc6IDAsIGI6IDAgfTsKICAgICAgICB2YXIgYSA9IDE7CiAgICAgICAgdmFyIG9rID0gZmFsc2U7CiAgICAgICAgdmFyIGZvcm1hdCA9IGZhbHNlOwoKICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGNvbG9yID0gc3RyaW5nSW5wdXRUb09iamVjdChjb2xvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGlmIChjb2xvci5oYXNPd25Qcm9wZXJ0eSgiciIpICYmIGNvbG9yLmhhc093blByb3BlcnR5KCJnIikgJiYgY29sb3IuaGFzT3duUHJvcGVydHkoImIiKSkgewogICAgICAgICAgICAgICAgcmdiID0gcmdiVG9SZ2IoY29sb3IuciwgY29sb3IuZywgY29sb3IuYik7CiAgICAgICAgICAgICAgICBvayA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3JtYXQgPSBTdHJpbmcoY29sb3Iucikuc3Vic3RyKC0xKSA9PT0gIiUiID8gInByZ2IiIDogInJnYiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY29sb3IuaGFzT3duUHJvcGVydHkoImgiKSAmJiBjb2xvci5oYXNPd25Qcm9wZXJ0eSgicyIpICYmIGNvbG9yLmhhc093blByb3BlcnR5KCJ2IikpIHsKICAgICAgICAgICAgICAgIGNvbG9yLnMgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLnMpOwogICAgICAgICAgICAgICAgY29sb3IudiA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3Iudik7CiAgICAgICAgICAgICAgICByZ2IgPSBoc3ZUb1JnYihjb2xvci5oLCBjb2xvci5zLCBjb2xvci52KTsKICAgICAgICAgICAgICAgIG9rID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJoc3YiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNvbG9yLmhhc093blByb3BlcnR5KCJoIikgJiYgY29sb3IuaGFzT3duUHJvcGVydHkoInMiKSAmJiBjb2xvci5oYXNPd25Qcm9wZXJ0eSgibCIpKSB7CiAgICAgICAgICAgICAgICBjb2xvci5zID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci5zKTsKICAgICAgICAgICAgICAgIGNvbG9yLmwgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLmwpOwogICAgICAgICAgICAgICAgcmdiID0gaHNsVG9SZ2IoY29sb3IuaCwgY29sb3IucywgY29sb3IubCk7CiAgICAgICAgICAgICAgICBvayA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3JtYXQgPSAiaHNsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNvbG9yLmhhc093blByb3BlcnR5KCJhIikpIHsKICAgICAgICAgICAgICAgIGEgPSBjb2xvci5hOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBhID0gYm91bmRBbHBoYShhKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgb2s6IG9rLAogICAgICAgICAgICBmb3JtYXQ6IGNvbG9yLmZvcm1hdCB8fCBmb3JtYXQsCiAgICAgICAgICAgIHI6IG1hdGhNaW4oMjU1LCBtYXRoTWF4KHJnYi5yLCAwKSksCiAgICAgICAgICAgIGc6IG1hdGhNaW4oMjU1LCBtYXRoTWF4KHJnYi5nLCAwKSksCiAgICAgICAgICAgIGI6IG1hdGhNaW4oMjU1LCBtYXRoTWF4KHJnYi5iLCAwKSksCiAgICAgICAgICAgIGE6IGEKICAgICAgICB9OwogICAgfQoKCiAgICAvLyBDb252ZXJzaW9uIEZ1bmN0aW9ucwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyBgcmdiVG9Ic2xgLCBgcmdiVG9Ic3ZgLCBgaHNsVG9SZ2JgLCBgaHN2VG9SZ2JgIG1vZGlmaWVkIGZyb206CiAgICAvLyA8aHR0cDovL21qaWphY2tzb24uY29tLzIwMDgvMDIvcmdiLXRvLWhzbC1hbmQtcmdiLXRvLWhzdi1jb2xvci1tb2RlbC1jb252ZXJzaW9uLWFsZ29yaXRobXMtaW4tamF2YXNjcmlwdD4KCiAgICAvLyBgcmdiVG9SZ2JgCiAgICAvLyBIYW5kbGUgYm91bmRzIC8gcGVyY2VudGFnZSBjaGVja2luZyB0byBjb25mb3JtIHRvIENTUyBjb2xvciBzcGVjCiAgICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci8+CiAgICAvLyAqQXNzdW1lczoqIHIsIGcsIGIgaW4gWzAsIDI1NV0gb3IgWzAsIDFdCiAgICAvLyAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIFswLCAyNTVdCiAgICBmdW5jdGlvbiByZ2JUb1JnYihyLCBnLCBiKXsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICByOiBib3VuZDAxKHIsIDI1NSkgKiAyNTUsCiAgICAgICAgICAgIGc6IGJvdW5kMDEoZywgMjU1KSAqIDI1NSwKICAgICAgICAgICAgYjogYm91bmQwMShiLCAyNTUpICogMjU1CiAgICAgICAgfTsKICAgIH0KCiAgICAvLyBgcmdiVG9Ic2xgCiAgICAvLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNMLgogICAgLy8gKkFzc3VtZXM6KiByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIFswLCAyNTVdIG9yIFswLCAxXQogICAgLy8gKlJldHVybnM6KiB7IGgsIHMsIGwgfSBpbiBbMCwxXQogICAgZnVuY3Rpb24gcmdiVG9Ic2wociwgZywgYikgewoKICAgICAgICByID0gYm91bmQwMShyLCAyNTUpOwogICAgICAgIGcgPSBib3VuZDAxKGcsIDI1NSk7CiAgICAgICAgYiA9IGJvdW5kMDEoYiwgMjU1KTsKCiAgICAgICAgdmFyIG1heCA9IG1hdGhNYXgociwgZywgYiksIG1pbiA9IG1hdGhNaW4ociwgZywgYik7CiAgICAgICAgdmFyIGgsIHMsIGwgPSAobWF4ICsgbWluKSAvIDI7CgogICAgICAgIGlmKG1heCA9PSBtaW4pIHsKICAgICAgICAgICAgaCA9IHMgPSAwOyAvLyBhY2hyb21hdGljCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgZCA9IG1heCAtIG1pbjsKICAgICAgICAgICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pOwogICAgICAgICAgICBzd2l0Y2gobWF4KSB7CiAgICAgICAgICAgICAgICBjYXNlIHI6IGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIGc6IGggPSAoYiAtIHIpIC8gZCArIDI7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBiOiBoID0gKHIgLSBnKSAvIGQgKyA0OyBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaCAvPSA2OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsgaDogaCwgczogcywgbDogbCB9OwogICAgfQoKICAgIC8vIGBoc2xUb1JnYmAKICAgIC8vIENvbnZlcnRzIGFuIEhTTCBjb2xvciB2YWx1ZSB0byBSR0IuCiAgICAvLyAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgbCBhcmUgY29udGFpbmVkIFswLCAxXSBvciBbMCwgMTAwXQogICAgLy8gKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiB0aGUgc2V0IFswLCAyNTVdCiAgICBmdW5jdGlvbiBoc2xUb1JnYihoLCBzLCBsKSB7CiAgICAgICAgdmFyIHIsIGcsIGI7CgogICAgICAgIGggPSBib3VuZDAxKGgsIDM2MCk7CiAgICAgICAgcyA9IGJvdW5kMDEocywgMTAwKTsKICAgICAgICBsID0gYm91bmQwMShsLCAxMDApOwoKICAgICAgICBmdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHsKICAgICAgICAgICAgaWYodCA8IDApIHQgKz0gMTsKICAgICAgICAgICAgaWYodCA+IDEpIHQgLT0gMTsKICAgICAgICAgICAgaWYodCA8IDEvNikgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHQ7CiAgICAgICAgICAgIGlmKHQgPCAxLzIpIHJldHVybiBxOwogICAgICAgICAgICBpZih0IDwgMi8zKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMi8zIC0gdCkgKiA2OwogICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICB9CgogICAgICAgIGlmKHMgPT09IDApIHsKICAgICAgICAgICAgciA9IGcgPSBiID0gbDsgLy8gYWNocm9tYXRpYwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzOwogICAgICAgICAgICB2YXIgcCA9IDIgKiBsIC0gcTsKICAgICAgICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEvMyk7CiAgICAgICAgICAgIGcgPSBodWUycmdiKHAsIHEsIGgpOwogICAgICAgICAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMS8zKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7IHI6IHIgKiAyNTUsIGc6IGcgKiAyNTUsIGI6IGIgKiAyNTUgfTsKICAgIH0KCiAgICAvLyBgcmdiVG9Ic3ZgCiAgICAvLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNWCiAgICAvLyAqQXNzdW1lczoqIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMjU1XSBvciBbMCwgMV0KICAgIC8vICpSZXR1cm5zOiogeyBoLCBzLCB2IH0gaW4gWzAsMV0KICAgIGZ1bmN0aW9uIHJnYlRvSHN2KHIsIGcsIGIpIHsKCiAgICAgICAgciA9IGJvdW5kMDEociwgMjU1KTsKICAgICAgICBnID0gYm91bmQwMShnLCAyNTUpOwogICAgICAgIGIgPSBib3VuZDAxKGIsIDI1NSk7CgogICAgICAgIHZhciBtYXggPSBtYXRoTWF4KHIsIGcsIGIpLCBtaW4gPSBtYXRoTWluKHIsIGcsIGIpOwogICAgICAgIHZhciBoLCBzLCB2ID0gbWF4OwoKICAgICAgICB2YXIgZCA9IG1heCAtIG1pbjsKICAgICAgICBzID0gbWF4ID09PSAwID8gMCA6IGQgLyBtYXg7CgogICAgICAgIGlmKG1heCA9PSBtaW4pIHsKICAgICAgICAgICAgaCA9IDA7IC8vIGFjaHJvbWF0aWMKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHN3aXRjaChtYXgpIHsKICAgICAgICAgICAgICAgIGNhc2UgcjogaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgZzogaCA9IChiIC0gcikgLyBkICsgMjsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIGI6IGggPSAociAtIGcpIC8gZCArIDQ7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGggLz0gNjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgaDogaCwgczogcywgdjogdiB9OwogICAgfQoKICAgIC8vIGBoc3ZUb1JnYmAKICAgIC8vIENvbnZlcnRzIGFuIEhTViBjb2xvciB2YWx1ZSB0byBSR0IuCiAgICAvLyAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgdiBhcmUgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMTAwXQogICAgLy8gKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiB0aGUgc2V0IFswLCAyNTVdCiAgICAgZnVuY3Rpb24gaHN2VG9SZ2IoaCwgcywgdikgewoKICAgICAgICBoID0gYm91bmQwMShoLCAzNjApICogNjsKICAgICAgICBzID0gYm91bmQwMShzLCAxMDApOwogICAgICAgIHYgPSBib3VuZDAxKHYsIDEwMCk7CgogICAgICAgIHZhciBpID0gbWF0aC5mbG9vcihoKSwKICAgICAgICAgICAgZiA9IGggLSBpLAogICAgICAgICAgICBwID0gdiAqICgxIC0gcyksCiAgICAgICAgICAgIHEgPSB2ICogKDEgLSBmICogcyksCiAgICAgICAgICAgIHQgPSB2ICogKDEgLSAoMSAtIGYpICogcyksCiAgICAgICAgICAgIG1vZCA9IGkgJSA2LAogICAgICAgICAgICByID0gW3YsIHEsIHAsIHAsIHQsIHZdW21vZF0sCiAgICAgICAgICAgIGcgPSBbdCwgdiwgdiwgcSwgcCwgcF1bbW9kXSwKICAgICAgICAgICAgYiA9IFtwLCBwLCB0LCB2LCB2LCBxXVttb2RdOwoKICAgICAgICByZXR1cm4geyByOiByICogMjU1LCBnOiBnICogMjU1LCBiOiBiICogMjU1IH07CiAgICB9CgogICAgLy8gYHJnYlRvSGV4YAogICAgLy8gQ29udmVydHMgYW4gUkdCIGNvbG9yIHRvIGhleAogICAgLy8gQXNzdW1lcyByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0KICAgIC8vIFJldHVybnMgYSAzIG9yIDYgY2hhcmFjdGVyIGhleAogICAgZnVuY3Rpb24gcmdiVG9IZXgociwgZywgYiwgYWxsb3czQ2hhcikgewoKICAgICAgICB2YXIgaGV4ID0gWwogICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChyKS50b1N0cmluZygxNikpLAogICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLAogICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChiKS50b1N0cmluZygxNikpCiAgICAgICAgXTsKCiAgICAgICAgLy8gUmV0dXJuIGEgMyBjaGFyYWN0ZXIgaGV4IGlmIHBvc3NpYmxlCiAgICAgICAgaWYgKGFsbG93M0NoYXIgJiYgaGV4WzBdLmNoYXJBdCgwKSA9PSBoZXhbMF0uY2hhckF0KDEpICYmIGhleFsxXS5jaGFyQXQoMCkgPT0gaGV4WzFdLmNoYXJBdCgxKSAmJiBoZXhbMl0uY2hhckF0KDApID09IGhleFsyXS5jaGFyQXQoMSkpIHsKICAgICAgICAgICAgcmV0dXJuIGhleFswXS5jaGFyQXQoMCkgKyBoZXhbMV0uY2hhckF0KDApICsgaGV4WzJdLmNoYXJBdCgwKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBoZXguam9pbigiIik7CiAgICB9CiAgICAgICAgLy8gYHJnYmFUb0hleGAKICAgICAgICAvLyBDb252ZXJ0cyBhbiBSR0JBIGNvbG9yIHBsdXMgYWxwaGEgdHJhbnNwYXJlbmN5IHRvIGhleAogICAgICAgIC8vIEFzc3VtZXMgciwgZywgYiBhbmQgYSBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0KICAgICAgICAvLyBSZXR1cm5zIGFuIDggY2hhcmFjdGVyIGhleAogICAgICAgIGZ1bmN0aW9uIHJnYmFUb0hleChyLCBnLCBiLCBhKSB7CgogICAgICAgICAgICB2YXIgaGV4ID0gWwogICAgICAgICAgICAgICAgcGFkMihjb252ZXJ0RGVjaW1hbFRvSGV4KGEpKSwKICAgICAgICAgICAgICAgIHBhZDIobWF0aFJvdW5kKHIpLnRvU3RyaW5nKDE2KSksCiAgICAgICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLAogICAgICAgICAgICAgICAgcGFkMihtYXRoUm91bmQoYikudG9TdHJpbmcoMTYpKQogICAgICAgICAgICBdOwoKICAgICAgICAgICAgcmV0dXJuIGhleC5qb2luKCIiKTsKICAgICAgICB9CgogICAgLy8gYGVxdWFsc2AKICAgIC8vIENhbiBiZSBjYWxsZWQgd2l0aCBhbnkgdGlueWNvbG9yIGlucHV0CiAgICB0aW55Y29sb3IuZXF1YWxzID0gZnVuY3Rpb24gKGNvbG9yMSwgY29sb3IyKSB7CiAgICAgICAgaWYgKCFjb2xvcjEgfHwgIWNvbG9yMikgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2JTdHJpbmcoKSA9PSB0aW55Y29sb3IoY29sb3IyKS50b1JnYlN0cmluZygpOwogICAgfTsKICAgIHRpbnljb2xvci5yYW5kb20gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGlueWNvbG9yLmZyb21SYXRpbyh7CiAgICAgICAgICAgIHI6IG1hdGhSYW5kb20oKSwKICAgICAgICAgICAgZzogbWF0aFJhbmRvbSgpLAogICAgICAgICAgICBiOiBtYXRoUmFuZG9tKCkKICAgICAgICB9KTsKICAgIH07CgoKICAgIC8vIE1vZGlmaWNhdGlvbiBGdW5jdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIFRoYW5rcyB0byBsZXNzLmpzIGZvciBzb21lIG9mIHRoZSBiYXNpY3MgaGVyZQogICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91ZGhlYWQvbGVzcy5qcy9ibG9iL21hc3Rlci9saWIvbGVzcy9mdW5jdGlvbnMuanM+CgogICAgZnVuY3Rpb24gZGVzYXR1cmF0ZShjb2xvciwgYW1vdW50KSB7CiAgICAgICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCAxMCk7CiAgICAgICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTsKICAgICAgICBoc2wucyAtPSBhbW91bnQgLyAxMDA7CiAgICAgICAgaHNsLnMgPSBjbGFtcDAxKGhzbC5zKTsKICAgICAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2F0dXJhdGUoY29sb3IsIGFtb3VudCkgewogICAgICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApOwogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgaHNsLnMgKz0gYW1vdW50IC8gMTAwOwogICAgICAgIGhzbC5zID0gY2xhbXAwMShoc2wucyk7CiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihoc2wpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdyZXlzY2FsZShjb2xvcikgewogICAgICAgIHJldHVybiB0aW55Y29sb3IoY29sb3IpLmRlc2F0dXJhdGUoMTAwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaWdodGVuIChjb2xvciwgYW1vdW50KSB7CiAgICAgICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCAxMCk7CiAgICAgICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTsKICAgICAgICBoc2wubCArPSBhbW91bnQgLyAxMDA7CiAgICAgICAgaHNsLmwgPSBjbGFtcDAxKGhzbC5sKTsKICAgICAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7CiAgICB9CgogICAgZnVuY3Rpb24gYnJpZ2h0ZW4oY29sb3IsIGFtb3VudCkgewogICAgICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApOwogICAgICAgIHZhciByZ2IgPSB0aW55Y29sb3IoY29sb3IpLnRvUmdiKCk7CiAgICAgICAgcmdiLnIgPSBtYXRoTWF4KDAsIG1hdGhNaW4oMjU1LCByZ2IuciAtIG1hdGhSb3VuZCgyNTUgKiAtIChhbW91bnQgLyAxMDApKSkpOwogICAgICAgIHJnYi5nID0gbWF0aE1heCgwLCBtYXRoTWluKDI1NSwgcmdiLmcgLSBtYXRoUm91bmQoMjU1ICogLSAoYW1vdW50IC8gMTAwKSkpKTsKICAgICAgICByZ2IuYiA9IG1hdGhNYXgoMCwgbWF0aE1pbigyNTUsIHJnYi5iIC0gbWF0aFJvdW5kKDI1NSAqIC0gKGFtb3VudCAvIDEwMCkpKSk7CiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihyZ2IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRhcmtlbiAoY29sb3IsIGFtb3VudCkgewogICAgICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApOwogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgaHNsLmwgLT0gYW1vdW50IC8gMTAwOwogICAgICAgIGhzbC5sID0gY2xhbXAwMShoc2wubCk7CiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihoc2wpOwogICAgfQoKICAgIC8vIFNwaW4gdGFrZXMgYSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBhbW91bnQgd2l0aGluIFstMzYwLCAzNjBdIGluZGljYXRpbmcgdGhlIGNoYW5nZSBvZiBodWUuCiAgICAvLyBWYWx1ZXMgb3V0c2lkZSBvZiB0aGlzIHJhbmdlIHdpbGwgYmUgd3JhcHBlZCBpbnRvIHRoaXMgcmFuZ2UuCiAgICBmdW5jdGlvbiBzcGluKGNvbG9yLCBhbW91bnQpIHsKICAgICAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpOwogICAgICAgIHZhciBodWUgPSAobWF0aFJvdW5kKGhzbC5oKSArIGFtb3VudCkgJSAzNjA7CiAgICAgICAgaHNsLmggPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlOwogICAgICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTsKICAgIH0KCiAgICAvLyBDb21iaW5hdGlvbiBGdW5jdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gVGhhbmtzIHRvIGpRdWVyeSB4Q29sb3IgZm9yIHNvbWUgb2YgdGhlIGlkZWFzIGJlaGluZCB0aGVzZQogICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9pbmZ1c2lvbi9qUXVlcnkteGNvbG9yL2Jsb2IvbWFzdGVyL2pxdWVyeS54Y29sb3IuanM+CgogICAgZnVuY3Rpb24gY29tcGxlbWVudChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgaHNsLmggPSAoaHNsLmggKyAxODApICUgMzYwOwogICAgICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmlhZChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIGggPSBoc2wuaDsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB0aW55Y29sb3IoY29sb3IpLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDEyMCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KSwKICAgICAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAyNDApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSkKICAgICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIHRldHJhZChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIGggPSBoc2wuaDsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB0aW55Y29sb3IoY29sb3IpLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDkwKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDE4MCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KSwKICAgICAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAyNzApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSkKICAgICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIHNwbGl0Y29tcGxlbWVudChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIGggPSBoc2wuaDsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB0aW55Y29sb3IoY29sb3IpLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDcyKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sfSksCiAgICAgICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgMjE2KSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sfSkKICAgICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIGFuYWxvZ291cyhjb2xvciwgcmVzdWx0cywgc2xpY2VzKSB7CiAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMgfHwgNjsKICAgICAgICBzbGljZXMgPSBzbGljZXMgfHwgMzA7CgogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIHBhcnQgPSAzNjAgLyBzbGljZXM7CiAgICAgICAgdmFyIHJldCA9IFt0aW55Y29sb3IoY29sb3IpXTsKCiAgICAgICAgZm9yIChoc2wuaCA9ICgoaHNsLmggLSAocGFydCAqIHJlc3VsdHMgPj4gMSkpICsgNzIwKSAlIDM2MDsgLS1yZXN1bHRzOyApIHsKICAgICAgICAgICAgaHNsLmggPSAoaHNsLmggKyBwYXJ0KSAlIDM2MDsKICAgICAgICAgICAgcmV0LnB1c2godGlueWNvbG9yKGhzbCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG1vbm9jaHJvbWF0aWMoY29sb3IsIHJlc3VsdHMpIHsKICAgICAgICByZXN1bHRzID0gcmVzdWx0cyB8fCA2OwogICAgICAgIHZhciBoc3YgPSB0aW55Y29sb3IoY29sb3IpLnRvSHN2KCk7CiAgICAgICAgdmFyIGggPSBoc3YuaCwgcyA9IGhzdi5zLCB2ID0gaHN2LnY7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIHZhciBtb2RpZmljYXRpb24gPSAxIC8gcmVzdWx0czsKCiAgICAgICAgd2hpbGUgKHJlc3VsdHMtLSkgewogICAgICAgICAgICByZXQucHVzaCh0aW55Y29sb3IoeyBoOiBoLCBzOiBzLCB2OiB2fSkpOwogICAgICAgICAgICB2ID0gKHYgKyBtb2RpZmljYXRpb24pICUgMTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgLy8gVXRpbGl0eSBGdW5jdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHRpbnljb2xvci5taXggPSBmdW5jdGlvbihjb2xvcjEsIGNvbG9yMiwgYW1vdW50KSB7CiAgICAgICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCA1MCk7CgogICAgICAgIHZhciByZ2IxID0gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2IoKTsKICAgICAgICB2YXIgcmdiMiA9IHRpbnljb2xvcihjb2xvcjIpLnRvUmdiKCk7CgogICAgICAgIHZhciBwID0gYW1vdW50IC8gMTAwOwogICAgICAgIHZhciB3ID0gcCAqIDIgLSAxOwogICAgICAgIHZhciBhID0gcmdiMi5hIC0gcmdiMS5hOwoKICAgICAgICB2YXIgdzE7CgogICAgICAgIGlmICh3ICogYSA9PSAtMSkgewogICAgICAgICAgICB3MSA9IHc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdzEgPSAodyArIGEpIC8gKDEgKyB3ICogYSk7CiAgICAgICAgfQoKICAgICAgICB3MSA9ICh3MSArIDEpIC8gMjsKCiAgICAgICAgdmFyIHcyID0gMSAtIHcxOwoKICAgICAgICB2YXIgcmdiYSA9IHsKICAgICAgICAgICAgcjogcmdiMi5yICogdzEgKyByZ2IxLnIgKiB3MiwKICAgICAgICAgICAgZzogcmdiMi5nICogdzEgKyByZ2IxLmcgKiB3MiwKICAgICAgICAgICAgYjogcmdiMi5iICogdzEgKyByZ2IxLmIgKiB3MiwKICAgICAgICAgICAgYTogcmdiMi5hICogcCAgKyByZ2IxLmEgKiAoMSAtIHApCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihyZ2JhKTsKICAgIH07CgoKICAgIC8vIFJlYWRhYmlsaXR5IEZ1bmN0aW9ucwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvQUVSVCNjb2xvci1jb250cmFzdD4KCiAgICAvLyBgcmVhZGFiaWxpdHlgCiAgICAvLyBBbmFseXplIHRoZSAyIGNvbG9ycyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgICAvLyAgICBgYnJpZ2h0bmVzc2A6IGRpZmZlcmVuY2UgaW4gYnJpZ2h0bmVzcyBiZXR3ZWVuIHRoZSB0d28gY29sb3JzCiAgICAvLyAgICBgY29sb3JgOiBkaWZmZXJlbmNlIGluIGNvbG9yL2h1ZSBiZXR3ZWVuIHRoZSB0d28gY29sb3JzCiAgICB0aW55Y29sb3IucmVhZGFiaWxpdHkgPSBmdW5jdGlvbihjb2xvcjEsIGNvbG9yMikgewogICAgICAgIHZhciBjMSA9IHRpbnljb2xvcihjb2xvcjEpOwogICAgICAgIHZhciBjMiA9IHRpbnljb2xvcihjb2xvcjIpOwogICAgICAgIHZhciByZ2IxID0gYzEudG9SZ2IoKTsKICAgICAgICB2YXIgcmdiMiA9IGMyLnRvUmdiKCk7CiAgICAgICAgdmFyIGJyaWdodG5lc3NBID0gYzEuZ2V0QnJpZ2h0bmVzcygpOwogICAgICAgIHZhciBicmlnaHRuZXNzQiA9IGMyLmdldEJyaWdodG5lc3MoKTsKICAgICAgICB2YXIgY29sb3JEaWZmID0gKAogICAgICAgICAgICBNYXRoLm1heChyZ2IxLnIsIHJnYjIucikgLSBNYXRoLm1pbihyZ2IxLnIsIHJnYjIucikgKwogICAgICAgICAgICBNYXRoLm1heChyZ2IxLmcsIHJnYjIuZykgLSBNYXRoLm1pbihyZ2IxLmcsIHJnYjIuZykgKwogICAgICAgICAgICBNYXRoLm1heChyZ2IxLmIsIHJnYjIuYikgLSBNYXRoLm1pbihyZ2IxLmIsIHJnYjIuYikKICAgICAgICApOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBicmlnaHRuZXNzOiBNYXRoLmFicyhicmlnaHRuZXNzQSAtIGJyaWdodG5lc3NCKSwKICAgICAgICAgICAgY29sb3I6IGNvbG9yRGlmZgogICAgICAgIH07CiAgICB9OwoKICAgIC8vIGByZWFkYWJsZWAKICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0FFUlQjY29sb3ItY29udHJhc3QKICAgIC8vIEVuc3VyZSB0aGF0IGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3IgY29tYmluYXRpb25zIHByb3ZpZGUgc3VmZmljaWVudCBjb250cmFzdC4KICAgIC8vICpFeGFtcGxlKgogICAgLy8gICAgdGlueWNvbG9yLmlzUmVhZGFibGUoIiMwMDAiLCAiIzExMSIpID0+IGZhbHNlCiAgICB0aW55Y29sb3IuaXNSZWFkYWJsZSA9IGZ1bmN0aW9uKGNvbG9yMSwgY29sb3IyKSB7CiAgICAgICAgdmFyIHJlYWRhYmlsaXR5ID0gdGlueWNvbG9yLnJlYWRhYmlsaXR5KGNvbG9yMSwgY29sb3IyKTsKICAgICAgICByZXR1cm4gcmVhZGFiaWxpdHkuYnJpZ2h0bmVzcyA+IDEyNSAmJiByZWFkYWJpbGl0eS5jb2xvciA+IDUwMDsKICAgIH07CgogICAgLy8gYG1vc3RSZWFkYWJsZWAKICAgIC8vIEdpdmVuIGEgYmFzZSBjb2xvciBhbmQgYSBsaXN0IG9mIHBvc3NpYmxlIGZvcmVncm91bmQgb3IgYmFja2dyb3VuZAogICAgLy8gY29sb3JzIGZvciB0aGF0IGJhc2UsIHJldHVybnMgdGhlIG1vc3QgcmVhZGFibGUgY29sb3IuCiAgICAvLyAqRXhhbXBsZSoKICAgIC8vICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUoIiMxMjMiLCBbIiNmZmYiLCAiIzAwMCJdKSA9PiAiIzAwMCIKICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUgPSBmdW5jdGlvbihiYXNlQ29sb3IsIGNvbG9yTGlzdCkgewogICAgICAgIHZhciBiZXN0Q29sb3IgPSBudWxsOwogICAgICAgIHZhciBiZXN0U2NvcmUgPSAwOwogICAgICAgIHZhciBiZXN0SXNSZWFkYWJsZSA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIGk9MDsgaSA8IGNvbG9yTGlzdC5sZW5ndGg7IGkrKykgewoKICAgICAgICAgICAgLy8gV2Ugbm9ybWFsaXplIGJvdGggYXJvdW5kIHRoZSAiYWNjZXB0YWJsZSIgYnJlYWtpbmcgcG9pbnQsCiAgICAgICAgICAgIC8vIGJ1dCByYW5rIGJyaWdodG5lc3MgY29uc3RyYXN0IGhpZ2hlciB0aGFuIGh1ZS4KCiAgICAgICAgICAgIHZhciByZWFkYWJpbGl0eSA9IHRpbnljb2xvci5yZWFkYWJpbGl0eShiYXNlQ29sb3IsIGNvbG9yTGlzdFtpXSk7CiAgICAgICAgICAgIHZhciByZWFkYWJsZSA9IHJlYWRhYmlsaXR5LmJyaWdodG5lc3MgPiAxMjUgJiYgcmVhZGFiaWxpdHkuY29sb3IgPiA1MDA7CiAgICAgICAgICAgIHZhciBzY29yZSA9IDMgKiAocmVhZGFiaWxpdHkuYnJpZ2h0bmVzcyAvIDEyNSkgKyAocmVhZGFiaWxpdHkuY29sb3IgLyA1MDApOwoKICAgICAgICAgICAgaWYgKChyZWFkYWJsZSAmJiAhIGJlc3RJc1JlYWRhYmxlKSB8fAogICAgICAgICAgICAgICAgKHJlYWRhYmxlICYmIGJlc3RJc1JlYWRhYmxlICYmIHNjb3JlID4gYmVzdFNjb3JlKSB8fAogICAgICAgICAgICAgICAgKCghIHJlYWRhYmxlKSAmJiAoISBiZXN0SXNSZWFkYWJsZSkgJiYgc2NvcmUgPiBiZXN0U2NvcmUpKSB7CiAgICAgICAgICAgICAgICBiZXN0SXNSZWFkYWJsZSA9IHJlYWRhYmxlOwogICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CiAgICAgICAgICAgICAgICBiZXN0Q29sb3IgPSB0aW55Y29sb3IoY29sb3JMaXN0W2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYmVzdENvbG9yOwogICAgfTsKCgogICAgLy8gQmlnIExpc3Qgb2YgQ29sb3JzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNzdmctY29sb3I+CiAgICB2YXIgbmFtZXMgPSB0aW55Y29sb3IubmFtZXMgPSB7CiAgICAgICAgYWxpY2VibHVlOiAiZjBmOGZmIiwKICAgICAgICBhbnRpcXVld2hpdGU6ICJmYWViZDciLAogICAgICAgIGFxdWE6ICIwZmYiLAogICAgICAgIGFxdWFtYXJpbmU6ICI3ZmZmZDQiLAogICAgICAgIGF6dXJlOiAiZjBmZmZmIiwKICAgICAgICBiZWlnZTogImY1ZjVkYyIsCiAgICAgICAgYmlzcXVlOiAiZmZlNGM0IiwKICAgICAgICBibGFjazogIjAwMCIsCiAgICAgICAgYmxhbmNoZWRhbG1vbmQ6ICJmZmViY2QiLAogICAgICAgIGJsdWU6ICIwMGYiLAogICAgICAgIGJsdWV2aW9sZXQ6ICI4YTJiZTIiLAogICAgICAgIGJyb3duOiAiYTUyYTJhIiwKICAgICAgICBidXJseXdvb2Q6ICJkZWI4ODciLAogICAgICAgIGJ1cm50c2llbm5hOiAiZWE3ZTVkIiwKICAgICAgICBjYWRldGJsdWU6ICI1ZjllYTAiLAogICAgICAgIGNoYXJ0cmV1c2U6ICI3ZmZmMDAiLAogICAgICAgIGNob2NvbGF0ZTogImQyNjkxZSIsCiAgICAgICAgY29yYWw6ICJmZjdmNTAiLAogICAgICAgIGNvcm5mbG93ZXJibHVlOiAiNjQ5NWVkIiwKICAgICAgICBjb3Juc2lsazogImZmZjhkYyIsCiAgICAgICAgY3JpbXNvbjogImRjMTQzYyIsCiAgICAgICAgY3lhbjogIjBmZiIsCiAgICAgICAgZGFya2JsdWU6ICIwMDAwOGIiLAogICAgICAgIGRhcmtjeWFuOiAiMDA4YjhiIiwKICAgICAgICBkYXJrZ29sZGVucm9kOiAiYjg4NjBiIiwKICAgICAgICBkYXJrZ3JheTogImE5YTlhOSIsCiAgICAgICAgZGFya2dyZWVuOiAiMDA2NDAwIiwKICAgICAgICBkYXJrZ3JleTogImE5YTlhOSIsCiAgICAgICAgZGFya2toYWtpOiAiYmRiNzZiIiwKICAgICAgICBkYXJrbWFnZW50YTogIjhiMDA4YiIsCiAgICAgICAgZGFya29saXZlZ3JlZW46ICI1NTZiMmYiLAogICAgICAgIGRhcmtvcmFuZ2U6ICJmZjhjMDAiLAogICAgICAgIGRhcmtvcmNoaWQ6ICI5OTMyY2MiLAogICAgICAgIGRhcmtyZWQ6ICI4YjAwMDAiLAogICAgICAgIGRhcmtzYWxtb246ICJlOTk2N2EiLAogICAgICAgIGRhcmtzZWFncmVlbjogIjhmYmM4ZiIsCiAgICAgICAgZGFya3NsYXRlYmx1ZTogIjQ4M2Q4YiIsCiAgICAgICAgZGFya3NsYXRlZ3JheTogIjJmNGY0ZiIsCiAgICAgICAgZGFya3NsYXRlZ3JleTogIjJmNGY0ZiIsCiAgICAgICAgZGFya3R1cnF1b2lzZTogIjAwY2VkMSIsCiAgICAgICAgZGFya3Zpb2xldDogIjk0MDBkMyIsCiAgICAgICAgZGVlcHBpbms6ICJmZjE0OTMiLAogICAgICAgIGRlZXBza3libHVlOiAiMDBiZmZmIiwKICAgICAgICBkaW1ncmF5OiAiNjk2OTY5IiwKICAgICAgICBkaW1ncmV5OiAiNjk2OTY5IiwKICAgICAgICBkb2RnZXJibHVlOiAiMWU5MGZmIiwKICAgICAgICBmaXJlYnJpY2s6ICJiMjIyMjIiLAogICAgICAgIGZsb3JhbHdoaXRlOiAiZmZmYWYwIiwKICAgICAgICBmb3Jlc3RncmVlbjogIjIyOGIyMiIsCiAgICAgICAgZnVjaHNpYTogImYwZiIsCiAgICAgICAgZ2FpbnNib3JvOiAiZGNkY2RjIiwKICAgICAgICBnaG9zdHdoaXRlOiAiZjhmOGZmIiwKICAgICAgICBnb2xkOiAiZmZkNzAwIiwKICAgICAgICBnb2xkZW5yb2Q6ICJkYWE1MjAiLAogICAgICAgIGdyYXk6ICI4MDgwODAiLAogICAgICAgIGdyZWVuOiAiMDA4MDAwIiwKICAgICAgICBncmVlbnllbGxvdzogImFkZmYyZiIsCiAgICAgICAgZ3JleTogIjgwODA4MCIsCiAgICAgICAgaG9uZXlkZXc6ICJmMGZmZjAiLAogICAgICAgIGhvdHBpbms6ICJmZjY5YjQiLAogICAgICAgIGluZGlhbnJlZDogImNkNWM1YyIsCiAgICAgICAgaW5kaWdvOiAiNGIwMDgyIiwKICAgICAgICBpdm9yeTogImZmZmZmMCIsCiAgICAgICAga2hha2k6ICJmMGU2OGMiLAogICAgICAgIGxhdmVuZGVyOiAiZTZlNmZhIiwKICAgICAgICBsYXZlbmRlcmJsdXNoOiAiZmZmMGY1IiwKICAgICAgICBsYXduZ3JlZW46ICI3Y2ZjMDAiLAogICAgICAgIGxlbW9uY2hpZmZvbjogImZmZmFjZCIsCiAgICAgICAgbGlnaHRibHVlOiAiYWRkOGU2IiwKICAgICAgICBsaWdodGNvcmFsOiAiZjA4MDgwIiwKICAgICAgICBsaWdodGN5YW46ICJlMGZmZmYiLAogICAgICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAiZmFmYWQyIiwKICAgICAgICBsaWdodGdyYXk6ICJkM2QzZDMiLAogICAgICAgIGxpZ2h0Z3JlZW46ICI5MGVlOTAiLAogICAgICAgIGxpZ2h0Z3JleTogImQzZDNkMyIsCiAgICAgICAgbGlnaHRwaW5rOiAiZmZiNmMxIiwKICAgICAgICBsaWdodHNhbG1vbjogImZmYTA3YSIsCiAgICAgICAgbGlnaHRzZWFncmVlbjogIjIwYjJhYSIsCiAgICAgICAgbGlnaHRza3libHVlOiAiODdjZWZhIiwKICAgICAgICBsaWdodHNsYXRlZ3JheTogIjc4OSIsCiAgICAgICAgbGlnaHRzbGF0ZWdyZXk6ICI3ODkiLAogICAgICAgIGxpZ2h0c3RlZWxibHVlOiAiYjBjNGRlIiwKICAgICAgICBsaWdodHllbGxvdzogImZmZmZlMCIsCiAgICAgICAgbGltZTogIjBmMCIsCiAgICAgICAgbGltZWdyZWVuOiAiMzJjZDMyIiwKICAgICAgICBsaW5lbjogImZhZjBlNiIsCiAgICAgICAgbWFnZW50YTogImYwZiIsCiAgICAgICAgbWFyb29uOiAiODAwMDAwIiwKICAgICAgICBtZWRpdW1hcXVhbWFyaW5lOiAiNjZjZGFhIiwKICAgICAgICBtZWRpdW1ibHVlOiAiMDAwMGNkIiwKICAgICAgICBtZWRpdW1vcmNoaWQ6ICJiYTU1ZDMiLAogICAgICAgIG1lZGl1bXB1cnBsZTogIjkzNzBkYiIsCiAgICAgICAgbWVkaXVtc2VhZ3JlZW46ICIzY2IzNzEiLAogICAgICAgIG1lZGl1bXNsYXRlYmx1ZTogIjdiNjhlZSIsCiAgICAgICAgbWVkaXVtc3ByaW5nZ3JlZW46ICIwMGZhOWEiLAogICAgICAgIG1lZGl1bXR1cnF1b2lzZTogIjQ4ZDFjYyIsCiAgICAgICAgbWVkaXVtdmlvbGV0cmVkOiAiYzcxNTg1IiwKICAgICAgICBtaWRuaWdodGJsdWU6ICIxOTE5NzAiLAogICAgICAgIG1pbnRjcmVhbTogImY1ZmZmYSIsCiAgICAgICAgbWlzdHlyb3NlOiAiZmZlNGUxIiwKICAgICAgICBtb2NjYXNpbjogImZmZTRiNSIsCiAgICAgICAgbmF2YWpvd2hpdGU6ICJmZmRlYWQiLAogICAgICAgIG5hdnk6ICIwMDAwODAiLAogICAgICAgIG9sZGxhY2U6ICJmZGY1ZTYiLAogICAgICAgIG9saXZlOiAiODA4MDAwIiwKICAgICAgICBvbGl2ZWRyYWI6ICI2YjhlMjMiLAogICAgICAgIG9yYW5nZTogImZmYTUwMCIsCiAgICAgICAgb3JhbmdlcmVkOiAiZmY0NTAwIiwKICAgICAgICBvcmNoaWQ6ICJkYTcwZDYiLAogICAgICAgIHBhbGVnb2xkZW5yb2Q6ICJlZWU4YWEiLAogICAgICAgIHBhbGVncmVlbjogIjk4ZmI5OCIsCiAgICAgICAgcGFsZXR1cnF1b2lzZTogImFmZWVlZSIsCiAgICAgICAgcGFsZXZpb2xldHJlZDogImRiNzA5MyIsCiAgICAgICAgcGFwYXlhd2hpcDogImZmZWZkNSIsCiAgICAgICAgcGVhY2hwdWZmOiAiZmZkYWI5IiwKICAgICAgICBwZXJ1OiAiY2Q4NTNmIiwKICAgICAgICBwaW5rOiAiZmZjMGNiIiwKICAgICAgICBwbHVtOiAiZGRhMGRkIiwKICAgICAgICBwb3dkZXJibHVlOiAiYjBlMGU2IiwKICAgICAgICBwdXJwbGU6ICI4MDAwODAiLAogICAgICAgIHJlYmVjY2FwdXJwbGU6ICI2NjMzOTkiLAogICAgICAgIHJlZDogImYwMCIsCiAgICAgICAgcm9zeWJyb3duOiAiYmM4ZjhmIiwKICAgICAgICByb3lhbGJsdWU6ICI0MTY5ZTEiLAogICAgICAgIHNhZGRsZWJyb3duOiAiOGI0NTEzIiwKICAgICAgICBzYWxtb246ICJmYTgwNzIiLAogICAgICAgIHNhbmR5YnJvd246ICJmNGE0NjAiLAogICAgICAgIHNlYWdyZWVuOiAiMmU4YjU3IiwKICAgICAgICBzZWFzaGVsbDogImZmZjVlZSIsCiAgICAgICAgc2llbm5hOiAiYTA1MjJkIiwKICAgICAgICBzaWx2ZXI6ICJjMGMwYzAiLAogICAgICAgIHNreWJsdWU6ICI4N2NlZWIiLAogICAgICAgIHNsYXRlYmx1ZTogIjZhNWFjZCIsCiAgICAgICAgc2xhdGVncmF5OiAiNzA4MDkwIiwKICAgICAgICBzbGF0ZWdyZXk6ICI3MDgwOTAiLAogICAgICAgIHNub3c6ICJmZmZhZmEiLAogICAgICAgIHNwcmluZ2dyZWVuOiAiMDBmZjdmIiwKICAgICAgICBzdGVlbGJsdWU6ICI0NjgyYjQiLAogICAgICAgIHRhbjogImQyYjQ4YyIsCiAgICAgICAgdGVhbDogIjAwODA4MCIsCiAgICAgICAgdGhpc3RsZTogImQ4YmZkOCIsCiAgICAgICAgdG9tYXRvOiAiZmY2MzQ3IiwKICAgICAgICB0dXJxdW9pc2U6ICI0MGUwZDAiLAogICAgICAgIHZpb2xldDogImVlODJlZSIsCiAgICAgICAgd2hlYXQ6ICJmNWRlYjMiLAogICAgICAgIHdoaXRlOiAiZmZmIiwKICAgICAgICB3aGl0ZXNtb2tlOiAiZjVmNWY1IiwKICAgICAgICB5ZWxsb3c6ICJmZjAiLAogICAgICAgIHllbGxvd2dyZWVuOiAiOWFjZDMyIgogICAgfTsKCiAgICAvLyBNYWtlIGl0IGVhc3kgdG8gYWNjZXNzIGNvbG9ycyB2aWEgYGhleE5hbWVzW2hleF1gCiAgICB2YXIgaGV4TmFtZXMgPSB0aW55Y29sb3IuaGV4TmFtZXMgPSBmbGlwKG5hbWVzKTsKCgogICAgLy8gVXRpbGl0aWVzCiAgICAvLyAtLS0tLS0tLS0KCiAgICAvLyBgeyAnbmFtZTEnOiAndmFsMScgfWAgYmVjb21lcyBgeyAndmFsMSc6ICduYW1lMScgfWAKICAgIGZ1bmN0aW9uIGZsaXAobykgewogICAgICAgIHZhciBmbGlwcGVkID0geyB9OwogICAgICAgIGZvciAodmFyIGkgaW4gbykgewogICAgICAgICAgICBpZiAoby5oYXNPd25Qcm9wZXJ0eShpKSkgewogICAgICAgICAgICAgICAgZmxpcHBlZFtvW2ldXSA9IGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZsaXBwZWQ7CiAgICB9CgogICAgLy8gUmV0dXJuIGEgdmFsaWQgYWxwaGEgdmFsdWUgWzAsMV0gd2l0aCBhbGwgaW52YWxpZCB2YWx1ZXMgYmVpbmcgc2V0IHRvIDEKICAgIGZ1bmN0aW9uIGJvdW5kQWxwaGEoYSkgewogICAgICAgIGEgPSBwYXJzZUZsb2F0KGEpOwoKICAgICAgICBpZiAoaXNOYU4oYSkgfHwgYSA8IDAgfHwgYSA+IDEpIHsKICAgICAgICAgICAgYSA9IDE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYTsKICAgIH0KCiAgICAvLyBUYWtlIGlucHV0IGZyb20gWzAsIG5dIGFuZCByZXR1cm4gaXQgYXMgWzAsIDFdCiAgICBmdW5jdGlvbiBib3VuZDAxKG4sIG1heCkgewogICAgICAgIGlmIChpc09uZVBvaW50WmVybyhuKSkgeyBuID0gIjEwMCUiOyB9CgogICAgICAgIHZhciBwcm9jZXNzUGVyY2VudCA9IGlzUGVyY2VudGFnZShuKTsKICAgICAgICBuID0gbWF0aE1pbihtYXgsIG1hdGhNYXgoMCwgcGFyc2VGbG9hdChuKSkpOwoKICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGNvbnZlcnQgcGVyY2VudGFnZSBpbnRvIG51bWJlcgogICAgICAgIGlmIChwcm9jZXNzUGVyY2VudCkgewogICAgICAgICAgICBuID0gcGFyc2VJbnQobiAqIG1heCwgMTApIC8gMTAwOwogICAgICAgIH0KCiAgICAgICAgLy8gSGFuZGxlIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycwogICAgICAgIGlmICgobWF0aC5hYnMobiAtIG1heCkgPCAwLjAwMDAwMSkpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQoKICAgICAgICAvLyBDb252ZXJ0IGludG8gWzAsIDFdIHJhbmdlIGlmIGl0IGlzbid0IGFscmVhZHkKICAgICAgICByZXR1cm4gKG4gJSBtYXgpIC8gcGFyc2VGbG9hdChtYXgpOwogICAgfQoKICAgIC8vIEZvcmNlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMQogICAgZnVuY3Rpb24gY2xhbXAwMSh2YWwpIHsKICAgICAgICByZXR1cm4gbWF0aE1pbigxLCBtYXRoTWF4KDAsIHZhbCkpOwogICAgfQoKICAgIC8vIFBhcnNlIGEgYmFzZS0xNiBoZXggdmFsdWUgaW50byBhIGJhc2UtMTAgaW50ZWdlcgogICAgZnVuY3Rpb24gcGFyc2VJbnRGcm9tSGV4KHZhbCkgewogICAgICAgIHJldHVybiBwYXJzZUludCh2YWwsIDE2KTsKICAgIH0KCiAgICAvLyBOZWVkIHRvIGhhbmRsZSAxLjAgYXMgMTAwJSwgc2luY2Ugb25jZSBpdCBpcyBhIG51bWJlciwgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGl0IGFuZCAxCiAgICAvLyA8aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NDIyMDcyL2phdmFzY3JpcHQtaG93LXRvLWRldGVjdC1udW1iZXItYXMtYS1kZWNpbWFsLWluY2x1ZGluZy0xLTA+CiAgICBmdW5jdGlvbiBpc09uZVBvaW50WmVybyhuKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBuID09ICJzdHJpbmciICYmIG4uaW5kZXhPZignLicpICE9IC0xICYmIHBhcnNlRmxvYXQobikgPT09IDE7CiAgICB9CgogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHN0cmluZyBwYXNzZWQgaW4gaXMgYSBwZXJjZW50YWdlCiAgICBmdW5jdGlvbiBpc1BlcmNlbnRhZ2UobikgewogICAgICAgIHJldHVybiB0eXBlb2YgbiA9PT0gInN0cmluZyIgJiYgbi5pbmRleE9mKCclJykgIT0gLTE7CiAgICB9CgogICAgLy8gRm9yY2UgYSBoZXggdmFsdWUgdG8gaGF2ZSAyIGNoYXJhY3RlcnMKICAgIGZ1bmN0aW9uIHBhZDIoYykgewogICAgICAgIHJldHVybiBjLmxlbmd0aCA9PSAxID8gJzAnICsgYyA6ICcnICsgYzsKICAgIH0KCiAgICAvLyBSZXBsYWNlIGEgZGVjaW1hbCB3aXRoIGl0J3MgcGVyY2VudGFnZSB2YWx1ZQogICAgZnVuY3Rpb24gY29udmVydFRvUGVyY2VudGFnZShuKSB7CiAgICAgICAgaWYgKG4gPD0gMSkgewogICAgICAgICAgICBuID0gKG4gKiAxMDApICsgIiUiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgLy8gQ29udmVydHMgYSBkZWNpbWFsIHRvIGEgaGV4IHZhbHVlCiAgICBmdW5jdGlvbiBjb252ZXJ0RGVjaW1hbFRvSGV4KGQpIHsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGQpICogMjU1KS50b1N0cmluZygxNik7CiAgICB9CiAgICAvLyBDb252ZXJ0cyBhIGhleCB2YWx1ZSB0byBhIGRlY2ltYWwKICAgIGZ1bmN0aW9uIGNvbnZlcnRIZXhUb0RlY2ltYWwoaCkgewogICAgICAgIHJldHVybiAocGFyc2VJbnRGcm9tSGV4KGgpIC8gMjU1KTsKICAgIH0KCiAgICB2YXIgbWF0Y2hlcnMgPSAoZnVuY3Rpb24oKSB7CgogICAgICAgIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXZhbHVlcy8jaW50ZWdlcnM+CiAgICAgICAgdmFyIENTU19JTlRFR0VSID0gIlstXFwrXT9cXGQrJT8iOwoKICAgICAgICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy12YWx1ZXMvI251bWJlci12YWx1ZT4KICAgICAgICB2YXIgQ1NTX05VTUJFUiA9ICJbLVxcK10/XFxkKlxcLlxcZCslPyI7CgogICAgICAgIC8vIEFsbG93IHBvc2l0aXZlL25lZ2F0aXZlIGludGVnZXIvbnVtYmVyLiAgRG9uJ3QgY2FwdHVyZSB0aGUgZWl0aGVyL29yLCBqdXN0IHRoZSBlbnRpcmUgb3V0Y29tZS4KICAgICAgICB2YXIgQ1NTX1VOSVQgPSAiKD86IiArIENTU19OVU1CRVIgKyAiKXwoPzoiICsgQ1NTX0lOVEVHRVIgKyAiKSI7CgogICAgICAgIC8vIEFjdHVhbCBtYXRjaGluZy4KICAgICAgICAvLyBQYXJlbnRoZXNlcyBhbmQgY29tbWFzIGFyZSBvcHRpb25hbCwgYnV0IG5vdCByZXF1aXJlZC4KICAgICAgICAvLyBXaGl0ZXNwYWNlIGNhbiB0YWtlIHRoZSBwbGFjZSBvZiBjb21tYXMgb3Igb3BlbmluZyBwYXJlbgogICAgICAgIHZhciBQRVJNSVNTSVZFX01BVENIMyA9ICJbXFxzfFxcKF0rKCIgKyBDU1NfVU5JVCArICIpWyx8XFxzXSsoIiArIENTU19VTklUICsgIilbLHxcXHNdKygiICsgQ1NTX1VOSVQgKyAiKVxccypcXCk/IjsKICAgICAgICB2YXIgUEVSTUlTU0lWRV9NQVRDSDQgPSAiW1xcc3xcXChdKygiICsgQ1NTX1VOSVQgKyAiKVssfFxcc10rKCIgKyBDU1NfVU5JVCArICIpWyx8XFxzXSsoIiArIENTU19VTklUICsgIilbLHxcXHNdKygiICsgQ1NTX1VOSVQgKyAiKVxccypcXCk/IjsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmdiOiBuZXcgUmVnRXhwKCJyZ2IiICsgUEVSTUlTU0lWRV9NQVRDSDMpLAogICAgICAgICAgICByZ2JhOiBuZXcgUmVnRXhwKCJyZ2JhIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSwKICAgICAgICAgICAgaHNsOiBuZXcgUmVnRXhwKCJoc2wiICsgUEVSTUlTU0lWRV9NQVRDSDMpLAogICAgICAgICAgICBoc2xhOiBuZXcgUmVnRXhwKCJoc2xhIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSwKICAgICAgICAgICAgaHN2OiBuZXcgUmVnRXhwKCJoc3YiICsgUEVSTUlTU0lWRV9NQVRDSDMpLAogICAgICAgICAgICBoc3ZhOiBuZXcgUmVnRXhwKCJoc3ZhIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSwKICAgICAgICAgICAgaGV4MzogL14oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkkLywKICAgICAgICAgICAgaGV4NjogL14oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkkLywKICAgICAgICAgICAgaGV4ODogL14oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pJC8KICAgICAgICB9OwogICAgfSkoKTsKCiAgICAvLyBgc3RyaW5nSW5wdXRUb09iamVjdGAKICAgIC8vIFBlcm1pc3NpdmUgc3RyaW5nIHBhcnNpbmcuICBUYWtlIGluIGEgbnVtYmVyIG9mIGZvcm1hdHMsIGFuZCBvdXRwdXQgYW4gb2JqZWN0CiAgICAvLyBiYXNlZCBvbiBkZXRlY3RlZCBmb3JtYXQuICBSZXR1cm5zIGB7IHIsIGcsIGIgfWAgb3IgYHsgaCwgcywgbCB9YCBvciBgeyBoLCBzLCB2fWAKICAgIGZ1bmN0aW9uIHN0cmluZ0lucHV0VG9PYmplY3QoY29sb3IpIHsKCiAgICAgICAgY29sb3IgPSBjb2xvci5yZXBsYWNlKHRyaW1MZWZ0LCcnKS5yZXBsYWNlKHRyaW1SaWdodCwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgdmFyIG5hbWVkID0gZmFsc2U7CiAgICAgICAgaWYgKG5hbWVzW2NvbG9yXSkgewogICAgICAgICAgICBjb2xvciA9IG5hbWVzW2NvbG9yXTsKICAgICAgICAgICAgbmFtZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb2xvciA9PSAndHJhbnNwYXJlbnQnKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IDAsIGc6IDAsIGI6IDAsIGE6IDAsIGZvcm1hdDogIm5hbWUiIH07CiAgICAgICAgfQoKICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggc3RyaW5nIGlucHV0IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCiAgICAgICAgLy8gS2VlcCBtb3N0IG9mIHRoZSBudW1iZXIgYm91bmRpbmcgb3V0IG9mIHRoaXMgZnVuY3Rpb24gLSBkb24ndCB3b3JyeSBhYm91dCBbMCwxXSBvciBbMCwxMDBdIG9yIFswLDM2MF0KICAgICAgICAvLyBKdXN0IHJldHVybiBhbiBvYmplY3QgYW5kIGxldCB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMgaGFuZGxlIHRoYXQuCiAgICAgICAgLy8gVGhpcyB3YXkgdGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBzYW1lIHdoZXRoZXIgdGhlIHRpbnljb2xvciBpcyBpbml0aWFsaXplZCB3aXRoIHN0cmluZyBvciBvYmplY3QuCiAgICAgICAgdmFyIG1hdGNoOwogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5yZ2IuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IG1hdGNoWzFdLCBnOiBtYXRjaFsyXSwgYjogbWF0Y2hbM10gfTsKICAgICAgICB9CiAgICAgICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLnJnYmEuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IG1hdGNoWzFdLCBnOiBtYXRjaFsyXSwgYjogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oc2wuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgbDogbWF0Y2hbM10gfTsKICAgICAgICB9CiAgICAgICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhzbGEuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgbDogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oc3YuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgdjogbWF0Y2hbM10gfTsKICAgICAgICB9CiAgICAgICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhzdmEuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgdjogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXg4LmV4ZWMoY29sb3IpKSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgYTogY29udmVydEhleFRvRGVjaW1hbChtYXRjaFsxXSksCiAgICAgICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0pLAogICAgICAgICAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzNdKSwKICAgICAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFs0XSksCiAgICAgICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gIm5hbWUiIDogImhleDgiCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXg2LmV4ZWMoY29sb3IpKSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdKSwKICAgICAgICAgICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSksCiAgICAgICAgICAgICAgICBiOiBwYXJzZUludEZyb21IZXgobWF0Y2hbM10pLAogICAgICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/ICJuYW1lIiA6ICJoZXgiCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXgzLmV4ZWMoY29sb3IpKSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdICsgJycgKyBtYXRjaFsxXSksCiAgICAgICAgICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0gKyAnJyArIG1hdGNoWzJdKSwKICAgICAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSArICcnICsgbWF0Y2hbM10pLAogICAgICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/ICJuYW1lIiA6ICJoZXgiCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgd2luZG93LnRpbnljb2xvciA9IHRpbnljb2xvcjsKICAgIH0pKCk7CgogICAgJChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCQuZm4uc3BlY3RydW0ubG9hZCkgewogICAgICAgICAgICAkLmZuLnNwZWN0cnVtLnByb2Nlc3NOYXRpdmVDb2xvcklucHV0cygpOwogICAgICAgIH0KICAgIH0pOwoKfSk7Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogKiBAbWVtYmVyb2YgQ29yZS5BZ2VudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIGFwcG9pbnRtZW50IGNhbGVuZGFyIGZ1bmN0aW9ucy4KICovCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhciA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvLyBBcHBvaW50bWVudCBkYXlzIGNhY2hlIGFuZCByZWFkeSBmbGFnCiAgICB2YXIgQXBwb2ludG1lbnREYXlzQ2FjaGUsCiAgICAgICAgQXBwb2ludG1lbnREYXlzQ2FjaGVSZWZyZXNoZWQgPSBmYWxzZSwKICAgICAgICBBSkFYQ291bnRlciA9IDAsCiAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5ncywKICAgICAgICBDdXJyZW50VmlldzsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiAtIFVzZXIgY2hhbGxlbmdlIHRva2VuLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5BbGxEYXlUZXh0IC0gTG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIHdvcmQgIkFsbC1kYXkiLgogICAgICogQHBhcmFtIHtCb29sZWFufSBQYXJhbXMuSXNSVEwgLSBJcyBjdXJyZW50IGxvY2FsZSBpcyByaWdodCB0ZXh0IGJhc2VkPwogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk1vbnRoTmFtZXMgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZWFjaCBtb250aC4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5Nb250aE5hbWVzU2hvcnQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZWFjaCBtb250aCBvbiBzaG9ydGggZm9ybWF0LgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkRheU5hbWVzIC0gQXJyYXkgY29udGFpbmluZyB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIGVhY2ggd2VlayBkYXkuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuRGF5TmFtZXNTaG9ydCAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciBlYWNoIHdlZWsgZGF5IG9uIHNob3J0IGZvcm1hdC4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5CdXR0b25UZXh0IC0gQXJyYXkgY29udGFpbmluZyB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIGVhY2ggd2VlayBkYXkgb24gc2hvcnQgZm9ybWF0LgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5CdXR0b25UZXh0LnRvZGF5IC0gTG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIHdvcmQgIlRvZGF5Ii4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC5tb250aCAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJNb250aCIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkJ1dHRvblRleHQud2VlayAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJXZWVrIi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC5kYXkgLSBMb2NhbGl6ZWQgc3RyaW5nIGZvciB0aGUgd29yZCAiRGF5Ii4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC50aW1lbGluZSAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJUaW1lbGluZSIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkJ1dHRvblRleHQuanVtcCAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJKdW1wIi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRmlyc3REYXkgLSBGaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDA6IFN1bmRheSkuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRlZmF1bHRWaWV3IC0gRGVmYXVsdCB2aWV3IHRvIGRpc3BsYXkgKG1vbnRofGFnZW5kYVdlZWt8YWdlbmRhRGF5fHRpbWVsaW5lTW9udGh8dGltZWxpbmVXZWVrfHRpbWVsaW5lRGF5KS4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5IZWFkZXIgLSBBcnJheSBjb250YWluaW5nIHZpZXcgYnV0dG9ucyBpbiB0aGUgaGVhZGVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5IZWFkZXIubGVmdCAtIFN0cmluZyB3aXRoIHZpZXcgbmFtZXMgZm9yIGxlZnQgc2lkZSBvZiB0aGUgaGVhZGVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5IZWFkZXIuY2VudGVyIC0gU3RyaW5nIHdpdGggdmlldyBuYW1lcyBmb3IgaGVhZGVyIGNlbnRlci4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuSGVhZGVyLnJpZ2h0IC0gU3RyaW5nIHdpdGggdmlldyBuYW1lcyBmb3IgcmlnaHQgc2lkZSBvZiB0aGUgaGVhZGVyLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkRpYWxvZ1RleHQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZGlhbG9ncy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5FZGl0VGl0bGUgLSBUaXRsZSBvZiB0aGUgYWRkL2VkaXQgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUaXRsZSAtIFRpdGxlIG9mIHRoZSBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGV4dCAtIFRleHQgb2YgdGhlIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VBbGwgLSBUZXh0IG9mICdhbGwnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlSnVzdFRoaXMgLSBUZXh0IG9mICdqdXN0IHRoaXMnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5EaXNtaXNzIC0gVGV4dCBvZiAnRGlzbWlzcycgYnV0dG9uIGluIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5PdmVydmlld1NjcmVlbiAtIE5hbWUgb2YgdGhlIHNjcmVlbiAoQ2FsZW5kYXJPdmVydmlld3xSZXNvdXJjZU92ZXJ2aWV3KS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbiAtIElEIG9mIHRoZSBzZXR0aW5ncyBidXR0b24uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXIgLSBJRCBvZiB0aGUgc2V0dGluZ3MgZGlhbG9nIGNvbnRhaW5lci4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc1Nob3cgLSBTaG93IHRoZSBzZXR0aW5ncyBkaWFsb2cgaW1tZWRpYXRlbHkuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzIC0gQXJyYXkgY29udGFpbmluZyBuYW1lcyBvZiB0aGUgY2FsbGJhY2tzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRNYXNrU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBtYXNrIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdFN1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5BZGRTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBhZGQgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgcHJlZmVyZW5jZXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5MaXN0QWN0aW9uIC0gTmFtZSBvZiB0aGUgbGlzdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkRheXNTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBhcHBvaW50bWVudCBkYXlzIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuVGlja2V0QXBwb2ludG1lbnRUeXBlcyAtIE9iamVjdCB3aXRoIHRpY2tldCBhcHBvaW50bWVudCB0eXBlcy4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuV29ya2luZ0hvdXJzIC0gT2JqZWN0IHdpdGggd29ya2luZyBob3VyIGFwcG9pbnRtZW50cy4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuUmVzb3VyY2VzIC0gT2JqZWN0IHdpdGggcmVzb3VyY2UgcGFyYW1ldGVycyAob3B0aW9uYWwpLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5BcHBvaW50bWVudCAtIE9iamVjdCB3aXRoIGFwcG9pbnRtZW50IHNjcmVlbiByZWxhdGVkIGRhdGEgKG9wdGlvbmFsKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUgLSBBdXRvIG9wZW4gYXBwb2ludG1lbnQgY3JlYXRlIHNjcmVlbiBwYXJhbWV0ZXJzIChvcHRpb25hbCkuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlN0YXJ0IC0gU3RhcnQgZGF0ZSBvZiBuZXcgYXBwb2ludG1lbnQgKG1vbWVudCByZWFkeSkuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLkVuZCAtIEVuZCBkYXRlIG9mIG5ldyBhcHBvaW50bWVudCAobW9tZW50IHJlYWR5KS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuUGx1Z2luS2V5IC0gTmFtZSBvZiB0aGUgcGx1Z2luIG1vZHVsZSB0byB1c2UuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlNlYXJjaCAtIFNlYXJjaCBzdHJpbmcgZm9yIHRoZSBwbHVnaW4gbW9kdWxlIHNlYXJjaC4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuT2JqZWN0SUQgLSBPYmplY3QgSUQgZm9yIHRoZSBwbHVnaW4gbW9kdWxlIHNlYXJjaC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50SUQgLSBBdXRvIG9wZW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4gd2l0aCBzcGVjaWZpZWQgYXBwb2ludG1lbnQgKG9wdGlvbmFsKS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGVCdXR0b24gLSBJRCBvZiB0aGUgYWRkIGFwcG9pbnRtZW50IGJ1dHRvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuQ2FsZW5kYXJzIC0gT2JqZWN0IHdpdGggY2FsZW5kYXIgcGFyYW1ldGVycy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxlbmRhcnMuU291cmNlcyAtIEFycmF5IG9mIGNhbGVuZGFyIHNvdXJjZXMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdHN9IFBhcmFtcy5DYWxlbmRhcnMuU3dpdGNoZXMgLSBBcnJheSBvZiBjYWxlbmRhciBzd2l0Y2ggZWxlbWVudHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdHN9IFBhcmFtcy5DYWxlbmRhcnMuTGltaXQgLSBNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXIgc3dpdGNoZXMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZXMgdGhlIGFwcG9pbnRtZW50IGNhbGVuZGFyIGNvbnRyb2wuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoUGFyYW1zKSB7CiAgICAgICAgdmFyICRDYWxlbmRhck9iaiA9ICQoJyNjYWxlbmRhcicpLAogICAgICAgICAgICAkRGF0ZXBpY2tlck9iaiA9ICQoJzxkaXYgLz4nKQogICAgICAgICAgICAgICAgLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXInKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdIaWRkZW4nKQogICAgICAgICAgICAgICAgLmluc2VydEFmdGVyKCQoJyNjYWxlbmRhcicpKSwKICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50ID0gW107CgogICAgICAgIGlmICghUGFyYW1zLkNoYWxsZW5nZVRva2VuKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFBhcmFtcy5SZXNvdXJjZXMgPSBQYXJhbXMuUmVzb3VyY2VzIHx8IHsKICAgICAgICAgICAgUmVzb3VyY2VDb2x1bW5zOiBudWxsLAogICAgICAgICAgICBSZXNvdXJjZVRleHQ6IG51bGwsCiAgICAgICAgICAgIFJlc291cmNlU2V0dGluZ3NCdXR0b246IG51bGwsCiAgICAgICAgICAgIFJlc291cmNlU2V0dGluZ3NEaWFsb2dDb250YWluZXI6IG51bGwsCiAgICAgICAgICAgIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3M6IGZhbHNlLAogICAgICAgICAgICBSZXNvdXJjZUpTT046IG51bGwKICAgICAgICB9OwoKICAgICAgICAvLyBJbml0aWFsaXplIGNhbGVuZGFyCiAgICAgICAgJENhbGVuZGFyT2JqLmZ1bGxDYWxlbmRhcih7CiAgICAgICAgICAgIGhlYWRlcjogUGFyYW1zLkhlYWRlciwKICAgICAgICAgICAgY3VzdG9tQnV0dG9uczogewogICAgICAgICAgICAgICAganVtcDogewogICAgICAgICAgICAgICAgICAgIHRleHQ6IFBhcmFtcy5CdXR0b25UZXh0Lmp1bXAsCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBTaG93RGF0ZXBpY2tlcigkQ2FsZW5kYXJPYmosICREYXRlcGlja2VyT2JqLCAkKHRoaXMpLCBQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGVmYXVsdFZpZXc6IFBhcmFtcy5EZWZhdWx0VmlldywKICAgICAgICAgICAgYWxsRGF5VGV4dDogUGFyYW1zLkFsbERheVRleHQsCiAgICAgICAgICAgIGlzUlRMOiBQYXJhbXMuSXNSVEwsCiAgICAgICAgICAgIGNvbHVtbkZvcm1hdDogJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICB0aW1lRm9ybWF0OiAnSEg6bW0nLAogICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6ICdISDptbScsCiAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnRCBNTU0gWVlZWScsCiAgICAgICAgICAgIHdlZWtOdW1iZXJzOiB0cnVlLAogICAgICAgICAgICB3ZWVrTnVtYmVyVGl0bGU6ICcjJywKICAgICAgICAgICAgd2Vla051bWJlckNhbGN1bGF0aW9uOiAnSVNPJywKICAgICAgICAgICAgZXZlbnRMaW1pdDogdHJ1ZSwKICAgICAgICAgICAgZXZlbnRMaW1pdFRleHQ6IFBhcmFtcy5FdmVudExpbWl0VGV4dCwKICAgICAgICAgICAgaGVpZ2h0OiA2MDAsCiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLAogICAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLAogICAgICAgICAgICBmaXJzdERheTogUGFyYW1zLkZpcnN0RGF5LAogICAgICAgICAgICBtb250aE5hbWVzOiBQYXJhbXMuTW9udGhOYW1lcywKICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBQYXJhbXMuTW9udGhOYW1lc1Nob3J0LAogICAgICAgICAgICBkYXlOYW1lczogUGFyYW1zLkRheU5hbWVzLAogICAgICAgICAgICBkYXlOYW1lc1Nob3J0OiBQYXJhbXMuRGF5TmFtZXNTaG9ydCwKICAgICAgICAgICAgYnV0dG9uVGV4dDogUGFyYW1zLkJ1dHRvblRleHQsCiAgICAgICAgICAgIHNjaGVkdWxlckxpY2Vuc2VLZXk6ICdHUEwtTXktUHJvamVjdC1Jcy1PcGVuLVNvdXJjZScsCiAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAwOjMwOjAwJywKICAgICAgICAgICAgZm9yY2VFdmVudER1cmF0aW9uOiB0cnVlLAogICAgICAgICAgICBub3dJbmRpY2F0b3I6IHRydWUsCiAgICAgICAgICAgIHRpbWV6b25lOiAnbG9jYWwnLAogICAgICAgICAgICByZXNvdXJjZUFyZWFXaWR0aDogJzIxJScsCiAgICAgICAgICAgIHZpZXdzOiB7CiAgICAgICAgICAgICAgICBtb250aDogewogICAgICAgICAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnTU1NTSBZWVlZJywKICAgICAgICAgICAgICAgICAgICBjb2x1bW5Gb3JtYXQ6ICdkZGRkJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFnZW5kYURheTogewogICAgICAgICAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnRCBNTU0gWVlZWScsCiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBmYWxzZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lTW9udGg6IHsKICAgICAgICAgICAgICAgICAgICBzbG90RHVyYXRpb246ICcyNDowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhzOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lV2VlazogewogICAgICAgICAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAyOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICB3ZWVrOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICAgICAgICAgICAgICAnSEgnCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lRGF5OiB7CiAgICAgICAgICAgICAgICAgICAgc2xvdER1cmF0aW9uOiAnMDA6MzA6MDAnLAogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRheXM6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNsb3RMYWJlbEZvcm1hdDogWwogICAgICAgICAgICAgICAgICAgICAgICAnZGRkLCBEIE1NTScsCiAgICAgICAgICAgICAgICAgICAgICAgICdISDptbScKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxvYWRpbmc6IGZ1bmN0aW9uKElzTG9hZGluZykgewogICAgICAgICAgICAgICAgaWYgKElzTG9hZGluZykgewogICAgICAgICAgICAgICAgICAgICQoJy5DYWxlbmRhcldpZGdldCcpLmFkZENsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoJy5DYWxlbmRhcldpZGdldCcpLnJlbW92ZUNsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHZpZXdSZW5kZXI6IGZ1bmN0aW9uKFZpZXcpIHsKCiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgb24gYSB0aW1lbGluZSB2aWV3LgogICAgICAgICAgICAgICAgaWYgKFZpZXcubmFtZSA9PT0gJ3RpbWVsaW5lV2VlaycgfHwgVmlldy5uYW1lID09PSAndGltZWxpbmVEYXknKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjYWxlbmRhciB3ZWVrIG51bWJlciB0byB0aW1lbGluZSB2aWV3IHRpdGxlcy4KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5maW5kKCcuZmMtdG9vbGJhciA+IGRpdiA+IGgyJykuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnZmMtd2Vlay1udW1iZXInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KFZpZXcuc3RhcnQuZm9ybWF0KCcgI1cnKSkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSByZXN0b3JlIHNldHRpbmdzIGJ1dHRvbi4KICAgICAgICAgICAgICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzSW5pdCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHZpZXcgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICBpZiAoQ3VycmVudFZpZXcgIT09IHVuZGVmaW5lZCAmJiBDdXJyZW50VmlldyAhPT0gVmlldy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIDogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIDogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3U2NyZWVuOiBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gPyBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gOiAnQ2FsZW5kYXJPdmVydmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmlldzogVmlldy5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5EZWJ1Zy5Mb2coJ0Vycm9yIHVwZGF0aW5nIHVzZXIgcHJlZmVyZW5jZXMhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQ3VycmVudFZpZXcgPSBWaWV3Lm5hbWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNlbGVjdDogZnVuY3Rpb24oU3RhcnQsIEVuZCwgSlNFdmVudCwgVmlldywgUmVzb3VyY2UpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIFN0YXJ0OiBTdGFydCwKICAgICAgICAgICAgICAgICAgICBFbmQ6IEVuZCwKICAgICAgICAgICAgICAgICAgICBKU0V2ZW50OiBKU0V2ZW50LAogICAgICAgICAgICAgICAgICAgIFZpZXc6IFZpZXcsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2U6IFJlc291cmNlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coUGFyYW1zLCBEYXRhKTsKICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ3Vuc2VsZWN0Jyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50Q2xpY2s6IGZ1bmN0aW9uKENhbEV2ZW50LCBKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBTdGFydDogQ2FsRXZlbnQuc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgRW5kOiBDYWxFdmVudC5lbmQsCiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coUGFyYW1zLCBEYXRhKTsKICAgICAgICAgICAgICAgIEpTRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50RHJvcDogZnVuY3Rpb24oQ2FsRXZlbnQsIERlbHRhLCBSZXZlcnRGdW5jKSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBDYWxFdmVudDogQ2FsRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgUHJldmlvdXNBcHBvaW50bWVudDogQ3VycmVudEFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgICAgIERlbHRhOiBEZWx0YSwKICAgICAgICAgICAgICAgICAgICBSZXZlcnRGdW5jOiBSZXZlcnRGdW5jCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVXBkYXRlQXBwb2ludG1lbnQoUGFyYW1zLCBEYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRSZXNpemU6IGZ1bmN0aW9uKENhbEV2ZW50LCBEZWx0YSwgUmV2ZXJ0RnVuYykgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50LAogICAgICAgICAgICAgICAgICAgIFByZXZpb3VzQXBwb2ludG1lbnQ6IEN1cnJlbnRBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICAgICBEZWx0YTogRGVsdGEsCiAgICAgICAgICAgICAgICAgICAgUmV2ZXJ0RnVuYzogUmV2ZXJ0RnVuYwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFVwZGF0ZUFwcG9pbnRtZW50KFBhcmFtcywgRGF0YSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50UmVuZGVyOiBmdW5jdGlvbihDYWxFdmVudCwgJEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciAkSWNvbkNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAkSWNvbjsKCiAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5CiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucmVjdXJyaW5nCiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucGFyZW50SWQKICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5ub3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC50aWNrZXRBcHBvaW50bWVudFR5cGUpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbnRhaW5lciBhbmQgaWNvbiBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgJEljb25Db250YWluZXIgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ0ljb25zJyk7CiAgICAgICAgICAgICAgICAgICAgJEljb24gPSAkKCc8aSAvPicpLmFkZENsYXNzKCdmYScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFwcG9pbnRtZW50IHdpdGggYXBwcm9wcmlhdGUgaWNvbihzKQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1zdW4tbycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucmVjdXJyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtcmVwZWF0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWxpbmsnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50Lm5vdGlmaWNhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWJlbGwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWNoYXItJyArIFBhcmFtcy5UaWNrZXRBcHBvaW50bWVudE1hcmtzW0NhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUHJlcGVuZCBjb250YWluZXIgdG8gdGhlIGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuZmluZCgnLmZjLWNvbnRlbnQnKQogICAgICAgICAgICAgICAgICAgICAgICAucHJlcGVuZCgkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50UmVzaXplU3RhcnQ6IGZ1bmN0aW9uKENhbEV2ZW50KSB7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuc3RhcnQgPSBDYWxFdmVudC5zdGFydDsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5lbmQgPSBDYWxFdmVudC5lbmQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50RHJhZ1N0YXJ0OiBmdW5jdGlvbihDYWxFdmVudCkgewogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnN0YXJ0ID0gQ2FsRXZlbnQuc3RhcnQ7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuZW5kID0gQ2FsRXZlbnQuZW5kOwogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnJlc291cmNlSWRzID0gQ2FsRXZlbnQucmVzb3VyY2VJZHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50TW91c2VvdmVyOiBmdW5jdGlvbihDYWxFdmVudCwgSlNFdmVudCkgewogICAgICAgICAgICAgICAgdmFyICRUb29sdGlwT2JqLAogICAgICAgICAgICAgICAgICAgIFBvc1ggPSAwLAogICAgICAgICAgICAgICAgICAgIFBvc1kgPSAwLAogICAgICAgICAgICAgICAgICAgIFRvb2x0aXBIVE1MID0gJCgnI0FwcG9pbnRtZW50VG9vbHRpcFRlbXBsYXRlJykuaHRtbCgpIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZUxlZnQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgKyAkKHdpbmRvdykud2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFZpc2libGVUb3AgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArICQod2luZG93KS5oZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgJEljb25Db250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgJEljb247CgogICAgICAgICAgICAgICAgaWYgKCFKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgSlNFdmVudCA9IHdpbmRvdy5ldmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChKU0V2ZW50LnBhZ2VYIHx8IEpTRXZlbnQucGFnZVkpIHsKICAgICAgICAgICAgICAgICAgICBQb3NYID0gSlNFdmVudC5wYWdlWDsKICAgICAgICAgICAgICAgICAgICBQb3NZID0gSlNFdmVudC5wYWdlWTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSlNFdmVudC5jbGllbnRYIHx8IEpTRXZlbnQuY2xpZW50WSkgewogICAgICAgICAgICAgICAgICAgIFBvc1ggPSBKU0V2ZW50LmNsaWVudFggKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgICAgICBQb3NZID0gSlNFdmVudC5jbGllbnRZICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvc2l0aW9ucyBzbyB0aGUgdG9vbHRpcCBkbyBub3Qgb3ZlcmxhcCB3aXRoIG1vdXNlIHBvaW50ZXIKICAgICAgICAgICAgICAgIFBvc1ggKz0gMTA7CiAgICAgICAgICAgICAgICBQb3NZICs9IDEwOwoKICAgICAgICAgICAgICAgIGlmIChUb29sdGlwSFRNTC5sZW5ndGggPiAwKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggYXBwb2ludG1lbnQgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAgICAgICBUb29sdGlwSFRNTCA9IFJlcGxhY2VBcHBvaW50bWVudEluZm9ybWF0aW9uKFRvb2x0aXBIVE1MLCBDYWxFdmVudCk7CgogICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0b29sdGlwIG9iamVjdAogICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqID0gJCgnPGRpdi8+JykuYWRkQ2xhc3MoJ0FwcG9pbnRtZW50VG9vbHRpcCBIaWRkZW4nKQogICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogUG9zWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IFBvc1gKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLmh0bWwoVG9vbHRpcEhUTUwpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygnYm9keScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdG9wIHBvc2l0aW9uIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24gPSBQb3NZICsgJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RZUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IFBvc1kgLSAkVG9vbHRpcE9iai5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCd0b3AnLCBQb3NZICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgbGVmdCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uID0gUG9zWCArICRUb29sdGlwT2JqLndpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RYUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVMZWZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSBQb3NYIC0gJFRvb2x0aXBPYmoud2lkdGgoKSAtIDMwOwogICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ2xlZnQnLCBQb3NYICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIGFwcG9pbnRtZW50IGljb25zCiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LmFsbERheQogICAgICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5yZWN1cnJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucGFyZW50SWQKICAgICAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQubm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbkNvbnRhaW5lciA9ICRUb29sdGlwT2JqLmZpbmQoJy5JY29ucycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGljb24gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbiA9ICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFwcG9pbnRtZW50IHdpdGggYXBwcm9wcmlhdGUgaWNvbihzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1zdW4tbycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucmVjdXJyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1yZXBlYXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnBhcmVudElkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1saW5rJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5ub3RpZmljYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWJlbGwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtY2hhci0nICsgUGFyYW1zLlRpY2tldEFwcG9pbnRtZW50TWFya3NbQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBTaG93IHRoZSB0b29sdGlwCiAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouZmFkZUluKCdmYXN0Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIENvbGxhcHNlIGZpZWxkc2V0IGxlZ2VuZCBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmZpbmQoJ2ZpZWxkc2V0JykuZWFjaChmdW5jdGlvbiAoSW5kZXgsIEZpZWxkc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKEZpZWxkc2V0KS5maW5kKCc6dmlzaWJsZScpLmxlbmd0aCA8PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEZpZWxkc2V0KS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRNb3VzZW91dDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKCcuQXBwb2ludG1lbnRUb29sdGlwJykuZmFkZU91dCgiZmFzdCIpLnJlbW92ZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudHM6IFBhcmFtcy5Xb3JraW5nSG91cnMsCiAgICAgICAgICAgIHJlc291cmNlczogUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZUpTT04sCiAgICAgICAgICAgIHJlc291cmNlQ29sdW1uczogUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZUNvbHVtbnMsCiAgICAgICAgICAgIHJlc291cmNlTGFiZWxUZXh0OiBQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlVGV4dAogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0aWFsaXplIGRhdGVwaWNrZXIKICAgICAgICAkRGF0ZXBpY2tlck9iai5kYXRlcGlja2VyKHsKICAgICAgICAgICAgc2hvd09uOiAnYnV0dG9uJywKICAgICAgICAgICAgYnV0dG9uVGV4dDogUGFyYW1zLkJ1dHRvblRleHQuanVtcCwKICAgICAgICAgICAgY29uc3RyYWluSW5wdXQ6IHRydWUsCiAgICAgICAgICAgIHByZXZUZXh0OiBQYXJhbXMuQnV0dG9uVGV4dC5wcmV2RGF0ZXBpY2tlciwKICAgICAgICAgICAgbmV4dFRleHQ6IFBhcmFtcy5CdXR0b25UZXh0Lm5leHREYXRlcGlja2VyLAogICAgICAgICAgICBmaXJzdERheTogUGFyYW1zLkZpcnN0RGF5LAogICAgICAgICAgICBzaG93TW9udGhBZnRlclllYXI6IDAsCiAgICAgICAgICAgIG1vbnRoTmFtZXM6IFBhcmFtcy5Nb250aE5hbWVzLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFBhcmFtcy5Nb250aE5hbWVzU2hvcnQsCiAgICAgICAgICAgIGRheU5hbWVzOiBQYXJhbXMuRGF5TmFtZXMsCiAgICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFBhcmFtcy5EYXlOYW1lc1Nob3J0LAogICAgICAgICAgICBkYXlOYW1lc01pbjogUGFyYW1zLkRheU5hbWVzTWluLAogICAgICAgICAgICBpc1JUTDogUGFyYW1zLklzUlRMLAogICAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24oRGF0ZVRleHQpIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ2dvdG9EYXRlJywgbmV3IERhdGUoRGF0ZVRleHQpKTsKICAgICAgICAgICAgICAgICQoJyNEYXRlcGlja2VyT3ZlcmxheScpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmouaGlkZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBiZWZvcmVTaG93RGF5OiBmdW5jdGlvbihEYXRlT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBpZiAoQXBwb2ludG1lbnREYXlzQ2FjaGVSZWZyZXNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tEYXRlKERhdGVPYmplY3QpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RydWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkNoYW5nZU1vbnRoWWVhcjogZnVuY3Rpb24oWWVhciwgTW9udGgpIHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgsIFBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgUGFyYW1zLkNhbGVuZGFycy5Td2l0Y2hlcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ2FsZW5kYXJTd2l0Y2hJbml0KCQodGhpcyksIFBhcmFtcyk7CiAgICAgICAgfSk7CgogICAgICAgIGlmIChQYXJhbXMuQXBwb2ludG1lbnQpIHsKCiAgICAgICAgICAgIC8vIEF1dG8gb3BlbiBhcHBvaW50bWVudCBjcmVhdGUgc2NyZWVuCiAgICAgICAgICAgIGlmIChQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUpIHsKICAgICAgICAgICAgICAgIFRhcmdldE5TLk9wZW5FZGl0RGlhbG9nKFBhcmFtcywgewogICAgICAgICAgICAgICAgICAgIFN0YXJ0OiBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuU3RhcnQgPyAkLmZ1bGxDYWxlbmRhci5tb21lbnQoUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlN0YXJ0KSA6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICAgICAgRW5kOiBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuRW5kID8gJC5mdWxsQ2FsZW5kYXIubW9tZW50KFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5FbmQpIDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KCkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgICAgICAgICAgICAgICAgICBQbHVnaW5LZXk6IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5QbHVnaW5LZXkgPyBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuUGx1Z2luS2V5IDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBTZWFyY2g6IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5TZWFyY2ggPyBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuU2VhcmNoIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRDogUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLk9iamVjdElEID8gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLk9iamVjdElEIDogbnVsbAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEF1dG8gb3BlbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbgogICAgICAgICAgICBlbHNlIGlmIChQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRJRCkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coUGFyYW1zLCB7IENhbEV2ZW50OiB7IGlkOiBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRJRCB9IH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZUJ1dHRvbikpCiAgICAgICAgICAgICAgICAub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgIC5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyhQYXJhbXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQ6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEVuZDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KCkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbikgewogICAgICAgICAgICBDYWxlbmRhclNldHRpbmdzSW5pdChQYXJhbXMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFBhcmFtcy5SZXNvdXJjZXMuUmVzb3VyY2VTZXR0aW5nc0J1dHRvbikgewogICAgICAgICAgICBSZXNvdXJjZVNldHRpbmdzSW5pdChQYXJhbXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgU2hvd0RhdGVwaWNrZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkQ2FsZW5kYXJPYmogLSBDYWxlbmRhciBjb250cm9sIG9iamVjdC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRGF0ZXBpY2tlck9iaiAtIERhdGVwaWNrZXIgY29udHJvbCBvYmplY3QuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEp1bXBCdXR0b24gLSBEYXRlcGlja2VyIGJ1dHRvbiBvYmplY3QuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGRpZmZlcmVudCBjb25maWcgb3B0aW9ucy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBTaG93IGRhdGUgcGlja2VyIGNvbnRyb2wuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dEYXRlcGlja2VyKCRDYWxlbmRhck9iaiwgJERhdGVwaWNrZXJPYmosICRKdW1wQnV0dG9uLCBQYXJhbXMpIHsKICAgICAgICB2YXIgQ3VycmVudERhdGUgPSAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKCdnZXREYXRlJyksCiAgICAgICAgICAgIFllYXIgPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVknKSwKICAgICAgICAgICAgTW9udGggPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ00nKTsKCiAgICAgICAgJCgnPGRpdiAvPicpLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXJPdmVybGF5JykKICAgICAgICAgICAgLmFwcGVuZFRvKCQoJ2JvZHknKSkKICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmhpZGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgsIFBhcmFtcyk7CgogICAgICAgICREYXRlcGlja2VyT2JqLmRhdGVwaWNrZXIoJ3NldERhdGUnLCBDdXJyZW50RGF0ZS50b0RhdGUoKSkKICAgICAgICAgICAgLmNzcyh7CiAgICAgICAgICAgICAgICBsZWZ0OiBwYXJzZUludCgkSnVtcEJ1dHRvbi5vZmZzZXQoKS5sZWZ0IC0gJERhdGVwaWNrZXJPYmoub3V0ZXJXaWR0aCgpICsgJEp1bXBCdXR0b24ub3V0ZXJXaWR0aCgpLCAxMCksCiAgICAgICAgICAgICAgICB0b3A6IHBhcnNlSW50KCRKdW1wQnV0dG9uLm9mZnNldCgpLnRvcCAtICREYXRlcGlja2VyT2JqLm91dGVySGVpZ2h0KCkgKyAkSnVtcEJ1dHRvbi5vdXRlckhlaWdodCgpLCAxMCkKICAgICAgICAgICAgfSkuZmFkZUluKCdmYXN0Jyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2hlY2tEYXRlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7RGF0ZU9iamVjdH0gRGF0ZU9iamVjdCAtIEEgSlMgZGF0ZSBvYmplY3QgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IEZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIHRydWUsIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgQ1NTCiAgICAgKiAgICAgICAgICAgICAgICAgIGNsYXNzLCB0aGlyZCBlbGVtZW50IGEgZGVzY3JpcHRpb24gZm9yIHRoZSBkYXRlLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIENoZWNrIGlmIGRhdGUgaGFzIGFuIGFwcG9pbnRtZW50LgogICAgICovCiAgICBmdW5jdGlvbiBDaGVja0RhdGUoRGF0ZU9iamVjdCkgewogICAgICAgIHZhciBEYXRlTW9tZW50ID0gJC5mdWxsQ2FsZW5kYXIubW9tZW50KERhdGVPYmplY3QpLAogICAgICAgICAgICBEYXlBcHBvaW50bWVudHMgPSBBcHBvaW50bWVudERheXNDYWNoZVtEYXRlTW9tZW50LmZvcm1hdCgnWVlZWS1NTS1ERCcpXSwKICAgICAgICAgICAgRGF5Q2xhc3MgPSBEYXlBcHBvaW50bWVudHMgPyAnSGlnaGxpZ2h0JyA6ICcnLAogICAgICAgICAgICBEYXlEZXNjcmlwdGlvbiA9IERheUFwcG9pbnRtZW50cyA/IERheUFwcG9pbnRtZW50cy50b1N0cmluZygpIDogJyc7CgogICAgICAgIHJldHVybiBbdHJ1ZSwgRGF5Q2xhc3MsIERheURlc2NyaXB0aW9uXTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBBcHBvaW50bWVudERheXMKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRGF0ZXBpY2tlck9iaiAtIERhdGVwaWNrZXIgY29udHJvbCBvYmplY3QuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IFllYXIgLSBTZWxlY3RlZCB5ZWFyLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBNb250aCAtIFNlbGVjdGVkIG1vbnRoICgxLTEyKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIENhY2hlcyB0aGUgbGlzdCBvZiBhcHBvaW50bWVudCBkYXlzIGZvciBsYXRlciB1c2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgsIFBhcmFtcykgewogICAgICAgIHZhciBTdGFydFRpbWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoWWVhciArICctJyArIE1vbnRoLCAnWVlZWS1NJykuc3RhcnRPZignbW9udGgnKSwKICAgICAgICAgICAgRW5kVGltZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChZZWFyICsgJy0nICsgTW9udGgsICdZWVlZLU0nKS5hZGQoMSwgJ21vbnRocycpLnN0YXJ0T2YoJ21vbnRoJyksCiAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgQWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkxpc3RBY3Rpb24sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRGF5c1N1YmFjdG9uLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lOiBTdGFydFRpbWUuZm9ybWF0KCdZWVlZLU1NLUREJyksCiAgICAgICAgICAgICAgICBFbmRUaW1lOiBFbmRUaW1lLmZvcm1hdCgnWVlZWS1NTS1ERCcpCiAgICAgICAgICAgIH07CgogICAgICAgICREYXRlcGlja2VyT2JqLmFkZENsYXNzKCdBSkFYTG9hZGluZycpOwogICAgICAgIEFwcG9pbnRtZW50RGF5c0NhY2hlUmVmcmVzaGVkID0gZmFsc2U7CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXlzQ2FjaGUgPSBSZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmoucmVtb3ZlQ2xhc3MoJ0FKQVhMb2FkaW5nJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIGRhdGUgcGlja2VyIGJlY2F1c2UgdGhpcyBjYWxsIGlzIGFzeW5jaHJvbm91cwogICAgICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmRhdGVwaWNrZXIoJ3JlZnJlc2gnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBTaG93V2FpdGluZ0RpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3dzIHdhaXRpbmcgZGlhbG9nLgogICAgICovCiAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygnPGRpdiBjbGFzcz0iU3BhY2luZyBDZW50ZXIiPjxzcGFuIGNsYXNzPSJBSkFYTG9hZGVyIiB0aXRsZT0iJyArIENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc0xvYWRpbmcnKSArICciPjwvc3Bhbj48L2Rpdj4nLCBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNMb2FkaW5nJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFJlcGxhY2VBcHBvaW50bWVudEluZm9ybWF0aW9uCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUmVwbGFjZUhUTUwgLSBTdHJpbmcgY29udGFpbmluZyAlcGxhY2Vob2xkZXJzJS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBDYWxFdmVudCAtIENhbGVuZGFyIGFwcG9pbnRtZW50IG9iamVjdC4KICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge1N0cmluZ30gU3RyaW5nIHdpdGggcmVwbGFjZWQgcGxhY2Vob2xkZXJzLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFJlcGxhY2VzIHBsYWNlaG9sZGVycyBpbiBzdXBwbGllZCBzdHJpbmcgd2l0aCBjYWxlbmRhciBhcHBvaW50bWVudCBpbmZvcm1hdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gUmVwbGFjZUFwcG9pbnRtZW50SW5mb3JtYXRpb24oUmVwbGFjZUhUTUwsIENhbEV2ZW50KSB7CiAgICAgICAgdmFyIFBsYWNlaG9sZGVyLAogICAgICAgICAgICBTZWFyY2hQbGFjZWhvbGRlciwKICAgICAgICAgICAgUmVwbGFjZVZhbHVlOwoKICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHByb3BlcnRpZXMKICAgICAgICBmb3IgKFBsYWNlaG9sZGVyIGluIENhbEV2ZW50KSB7CiAgICAgICAgICAgIFNlYXJjaFBsYWNlaG9sZGVyID0gbmV3IFJlZ0V4cCgnJScgKyBQbGFjZWhvbGRlciArICclJywgJ2cnKTsKICAgICAgICAgICAgUmVwbGFjZVZhbHVlID0gQ2FsRXZlbnRbUGxhY2Vob2xkZXJdOwoKICAgICAgICAgICAgLy8gU3BlY2lhbCBwcm9wZXJ0aWVzCiAgICAgICAgICAgIGlmIChQbGFjZWhvbGRlciA9PT0gJ3JlY3VycmluZycpIHsKICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoUGxhY2Vob2xkZXIgPT09ICdzdGFydCcgfHwgUGxhY2Vob2xkZXIgPT09ICdlbmQnKSB7CiAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFBsYWNlaG9sZGVyID09PSAnZW5kJykgewogICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlVmFsdWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoUmVwbGFjZVZhbHVlKS5zdWJ0cmFjdCgxLCAnZGF5Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChSZXBsYWNlVmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBSZXBsYWNlVmFsdWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoUmVwbGFjZVZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChQbGFjZWhvbGRlciA9PT0gJ3BsdWdpbkRhdGEnKSB7CiAgICAgICAgICAgICAgICAkLmVhY2goQ2FsRXZlbnQucGx1Z2luRGF0YSwgZnVuY3Rpb24gKEtleSwgVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IFZhbHVlLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpOwogICAgICAgICAgICAgICAgICAgIFJlcGxhY2VIVE1MID0gUmVwbGFjZUhUTUwucmVwbGFjZSgnJScgKyBLZXkgKyAnJScsIFZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERlZmF1bHQgSlNPTiB2YWx1ZXMKICAgICAgICAgICAgaWYgKFJlcGxhY2VWYWx1ZSA9PT0gbnVsbCB8fCBSZXBsYWNlVmFsdWUgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBSZXBsYWNlVmFsdWUgPSAnJzsKICAgICAgICAgICAgfSBlbHNlIGlmIChSZXBsYWNlVmFsdWUgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9IENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1llcycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBSZXBsYWNlIG5ld2xpbmVzCiAgICAgICAgICAgIGlmIChSZXBsYWNlVmFsdWUucmVwbGFjZSkgewogICAgICAgICAgICAgICAgUmVwbGFjZVZhbHVlID0gUmVwbGFjZVZhbHVlLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVycwogICAgICAgICAgICBSZXBsYWNlSFRNTCA9IFJlcGxhY2VIVE1MLnJlcGxhY2UoU2VhcmNoUGxhY2Vob2xkZXIsIFJlcGxhY2VWYWx1ZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gUmVwbGFjZUhUTUw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBPcGVuRWRpdERpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBjb25maWd1cmF0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkRpYWxvZ1RleHQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZGlhbG9ncy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5FZGl0VGl0bGUgLSBUaXRsZSBvZiB0aGUgYWRkL2VkaXQgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUaXRsZSAtIFRpdGxlIG9mIHRoZSBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGV4dCAtIFRleHQgb2YgdGhlIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VBbGwgLSBUZXh0IG9mICdhbGwnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlSnVzdFRoaXMgLSBUZXh0IG9mICdqdXN0IHRoaXMnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MgLSBBcnJheSBjb250YWluaW5nIG5hbWVzIG9mIHRoZSBjYWxsYmFja3MuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdE1hc2tTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IG1hc2sgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YSAtIEhhc2ggd2l0aCBhcHBvaW50bWVudCBkYXRhLgogICAgICogQHBhcmFtIHtNb21lbnR9IEFwcG9pbnRtZW50RGF0YS5TdGFydCAtIE1vbWVudCBvYmplY3Qgd2l0aCBzdGFydCBkYXRlL3RpbWUuCiAgICAgKiBAcGFyYW0ge01vbWVudH0gQXBwb2ludG1lbnREYXRhLkVuZCAtIE1vbWVudCBvYmplY3Qgd2l0aCBlbmQgZGF0ZS90aW1lLgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCAtIENhbGVuZGFyIGV2ZW50IG9iamVjdCAoRnVsbENhbGVuZGFyKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgLSBDYWxlbmRhciByZXNvdXJjZSBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2Qgb3BlbnMgdGhlIGFwcG9pbnRtZW50IGRpYWxvZyBhZnRlciBzZWxlY3RpbmcgYSB0aW1lIHBlcmlvZCBvciBhbiBhcHBvaW50bWVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2cgPSBmdW5jdGlvbiAoUGFyYW1zLCBBcHBvaW50bWVudERhdGEpIHsKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgQWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICBTdWJhY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdE1hc2tTdWJhY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRNYXNrU3ViYWN0aW9uIDogJ0VkaXRNYXNrJywKICAgICAgICAgICAgQXBwb2ludG1lbnRJRDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmlkIDogbnVsbCwKICAgICAgICAgICAgU3RhcnRZZWFyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0LnllYXIoKSA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0TW9udGg6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQubW9udGgoKSArIDEgOiBudWxsLAogICAgICAgICAgICBTdGFydERheTogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5TdGFydC5kYXRlKCkgOiBudWxsLAogICAgICAgICAgICBTdGFydEhvdXI6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQuaG91cigpIDogbnVsbCwKICAgICAgICAgICAgU3RhcnRNaW51dGU6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQubWludXRlKCkgOiBudWxsLAogICAgICAgICAgICBFbmRZZWFyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC55ZWFyKCkgOiBudWxsLAogICAgICAgICAgICBFbmRNb250aDogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5FbmQubW9udGgoKSArIDEgOiBudWxsLAogICAgICAgICAgICBFbmREYXk6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLmRhdGUoKSA6IG51bGwsCiAgICAgICAgICAgIEVuZEhvdXI6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLmhvdXIoKSA6IG51bGwsCiAgICAgICAgICAgIEVuZE1pbnV0ZTogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5FbmQubWludXRlKCkgOiBudWxsLAogICAgICAgICAgICBBbGxEYXk6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyAoQXBwb2ludG1lbnREYXRhLkVuZC5oYXNUaW1lKCkgPyAnMCcgOiAnMScpIDogbnVsbCwKICAgICAgICAgICAgVGVhbUlEOiBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgPyBbIEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZS5UZWFtSUQgXSA6IG51bGwsCiAgICAgICAgICAgIFJlc291cmNlSUQ6IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZSA/IFsgQXBwb2ludG1lbnREYXRhLlJlc291cmNlLmlkIF0gOiBudWxsLAogICAgICAgICAgICBQbHVnaW5LZXk6IEFwcG9pbnRtZW50RGF0YS5QbHVnaW5LZXkgPyBBcHBvaW50bWVudERhdGEuUGx1Z2luS2V5IDogbnVsbCwKICAgICAgICAgICAgU2VhcmNoOiBBcHBvaW50bWVudERhdGEuU2VhcmNoID8gQXBwb2ludG1lbnREYXRhLlNlYXJjaCA6IG51bGwsCiAgICAgICAgICAgIE9iamVjdElEOiBBcHBvaW50bWVudERhdGEuT2JqZWN0SUQgPyBBcHBvaW50bWVudERhdGEuT2JqZWN0SUQgOiBudWxsCiAgICAgICAgfTsKCiAgICAgICAgLy8gTWFrZSBlbmQgdGltZSBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgaW5jbHVzaXZlCiAgICAgICAgaWYgKERhdGEuQWxsRGF5ICYmIERhdGEuQWxsRGF5ID09PSAnMScpIHsKICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkVuZC5zdWJ0cmFjdCgxLCAnZGF5Jyk7CiAgICAgICAgICAgIERhdGEuRW5kWWVhciA9IEFwcG9pbnRtZW50RGF0YS5FbmQueWVhcigpOwogICAgICAgICAgICBEYXRhLkVuZE1vbnRoID0gQXBwb2ludG1lbnREYXRhLkVuZC5tb250aCgpICsgMTsKICAgICAgICAgICAgRGF0YS5FbmREYXkgPSBBcHBvaW50bWVudERhdGEuRW5kLmRhdGUoKTsKICAgICAgICAgICAgRGF0YS5FbmRIb3VyID0gQXBwb2ludG1lbnREYXRhLkVuZC5ob3VyKCk7CiAgICAgICAgICAgIERhdGEuRW5kTWludXRlID0gQXBwb2ludG1lbnREYXRhLkVuZC5taW51dGUoKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIEVkaXREaWFsb2coKSB7CiAgICAgICAgICAgIFRhcmdldE5TLlNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChIVE1MKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coSFRNTCwgUGFyYW1zLkRpYWxvZ1RleHQuRWRpdFRpdGxlLCAnMTBweCcsICdDZW50ZXInLCB0cnVlLCB1bmRlZmluZWQsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgfSwgJ2h0bWwnCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXBlYXRpbmcgZXZlbnQKICAgICAgICBpZiAoQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ICYmIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgIFRpdGxlOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGl0bGUsCiAgICAgICAgICAgICAgICBIVE1MOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGV4dCwKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogdHJ1ZSwKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzIwJScsCiAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnUHJpbWFyeSBDYWxsRm9yQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5BcHBvaW50bWVudElEID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnBhcmVudElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdERpYWxvZygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlSnVzdFRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnQ2FsbEZvckFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBFZGl0RGlhbG9nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdDbG9zZScsCiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBQYXJhbXMuRGlhbG9nVGV4dC5DbG9zZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRWRpdERpYWxvZygpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBVcGRhdGVBcHBvaW50bWVudAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBjb25maWd1cmF0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkRpYWxvZ1RleHQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZGlhbG9ncy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGl0bGUgLSBUaXRsZSBvZiB0aGUgb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZVRleHQgLSBUZXh0IG9mIHRoZSBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlQWxsIC0gVGV4dCBvZiAnYWxsJyBidXR0b24gaW4gb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZUp1c3RUaGlzIC0gVGV4dCBvZiAnanVzdCB0aGlzJyBidXR0b24gaW4gb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzIC0gQXJyYXkgY29udGFpbmluZyBuYW1lcyBvZiB0aGUgY2FsbGJhY2tzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEgLSBIYXNoIHdpdGggYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgLSBDYWxlbmRhciBldmVudCBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgYXBwb2ludG1lbnQgd2l0aCBzdXBwbGllZCBkYXRhLgogICAgICovCiAgICBmdW5jdGlvbiBVcGRhdGVBcHBvaW50bWVudChQYXJhbXMsIEFwcG9pbnRtZW50RGF0YSkgewogICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICBBY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA6ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0U3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0U3ViYWN0aW9uIDogJ0VkaXRBcHBvaW50bWVudCcsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5pZCwKICAgICAgICAgICAgU3RhcnRZZWFyOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQueWVhcigpLAogICAgICAgICAgICBTdGFydE1vbnRoOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQubW9udGgoKSArIDEsCiAgICAgICAgICAgIFN0YXJ0RGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQuZGF0ZSgpLAogICAgICAgICAgICBTdGFydEhvdXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC5ob3VyKCksCiAgICAgICAgICAgIFN0YXJ0TWludXRlOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQubWludXRlKCksCiAgICAgICAgICAgIEVuZFllYXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQueWVhcigpLAogICAgICAgICAgICBFbmRNb250aDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5tb250aCgpICsgMSwKICAgICAgICAgICAgRW5kRGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRhdGUoKSwKICAgICAgICAgICAgRW5kSG91cjogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5ob3VyKCksCiAgICAgICAgICAgIEVuZE1pbnV0ZTogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5taW51dGUoKSwKICAgICAgICAgICAgQWxsRGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmhhc1RpbWUoKSA/ICcwJyA6ICcxJywKICAgICAgICAgICAgUmVjdXJyaW5nOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVjdXJyaW5nID8gJzEnIDogJzAnLAogICAgICAgICAgICBUZWFtSUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC50ZWFtSWRzID8gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnRlYW1JZHMgOiB1bmRlZmluZWQsCiAgICAgICAgICAgIFJlc291cmNlSUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkcyA/IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkcyA6CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVzb3VyY2VJZCA/IFsgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlc291cmNlSWQgXSA6IHVuZGVmaW5lZAogICAgICAgIH07CgogICAgICAgIC8vIEFzc2lnbmVkIHJlc291cmNlIGRpZG4ndCBjaGFuZ2UKICAgICAgICBpZiAoCiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkCiAgICAgICAgICAgICYmIEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LnJlc291cmNlSWRzCiAgICAgICAgICAgICYmICQuaW5BcnJheSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkLAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHMKICAgICAgICAgICAgKSAhPT0gLTEKICAgICAgICApIHsKICAgICAgICAgICAgRGF0YS5SZXNvdXJjZUlEID0gQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBVcGRhdGUoKSB7CiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICBEYXRhLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdyZWZldGNoRXZlbnRzJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlJldmVydEZ1bmMoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkaWFsb2cKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAvLyBNYWtlIGVuZCB0aW1lIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBpbmNsdXNpdmUKICAgICAgICBpZiAoQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmFsbERheSkgewogICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLnN1YnRyYWN0KDEsICdkYXknKTsKICAgICAgICAgICAgRGF0YS5FbmRZZWFyID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC55ZWFyKCk7CiAgICAgICAgICAgIERhdGEuRW5kTW9udGggPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLm1vbnRoKCkgKyAxOwogICAgICAgICAgICBEYXRhLkVuZERheSA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuZGF0ZSgpOwogICAgICAgICAgICBEYXRhLkVuZEhvdXIgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmhvdXIoKTsKICAgICAgICAgICAgRGF0YS5FbmRNaW51dGUgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLm1pbnV0ZSgpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVwZWF0aW5nIGV2ZW50CiAgICAgICAgaWYgKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgIFRpdGxlOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGl0bGUsCiAgICAgICAgICAgICAgICBIVE1MOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGV4dCwKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogdHJ1ZSwKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzIwJScsCiAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnUHJpbWFyeSBDYWxsRm9yQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5BcHBvaW50bWVudElEID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnBhcmVudElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5SZWN1cnJpbmcgPSAnMSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZURlbHRhID0gQXBwb2ludG1lbnREYXRhLkRlbHRhLmFzU2Vjb25kcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC5kaWZmKEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LnN0YXJ0LCAnc2Vjb25kcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IERhdGEuVXBkYXRlRGVsdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuZGlmZihBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5lbmQsICdzZWNvbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gRGF0YS5VcGRhdGVEZWx0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5VcGRhdGVUeXBlID0gJ0JvdGgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQuc3RhcnQuZGlmZihBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQsICdzZWNvbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gRGF0YS5VcGRhdGVEZWx0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5VcGRhdGVUeXBlID0gJ1N0YXJ0VGltZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5VcGRhdGVEZWx0YSA9IERhdGEuVXBkYXRlRGVsdGEgKiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuZGlmZihBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5lbmQsICdzZWNvbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gRGF0YS5VcGRhdGVEZWx0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5VcGRhdGVUeXBlID0gJ0VuZFRpbWUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VKdXN0VGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdDYWxsRm9yQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnBhcmVudElkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdDbG9zZScsCiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBQYXJhbXMuRGlhbG9nVGV4dC5DbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlJldmVydEZ1bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVXBkYXRlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENhbGVuZGFyU3dpdGNoSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhclN3aXRjaCAtIGNhbGVuZGFyIGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGRpZmZlcmVudCBjb25maWcgb3B0aW9ucy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgcHJlZmVyZW5jZXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIC0gTmFtZSBvZiB0aGUgc2NyZWVuIChDYWxlbmRhck92ZXJ2aWV3fFJlc291cmNlT3ZlcnZpZXcpLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5DYWxlbmRhcnMgLSBPYmplY3Qgd2l0aCBjYWxlbmRhciBwYXJhbWV0ZXJzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGVuZGFycy5Tb3VyY2VzIC0gQXJyYXkgb2YgY2FsZW5kYXIgc291cmNlcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0c30gUGFyYW1zLkNhbGVuZGFycy5Td2l0Y2hlcyAtIEFycmF5IG9mIGNhbGVuZGFyIHN3aXRjaCBlbGVtZW50cy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0c30gUGFyYW1zLkNhbGVuZGFycy5MaW1pdCAtIE1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhciBzd2l0Y2hlcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBjYWxlbmRhciBjaGVja2JveCBiZWhhdmlvciBhbmQgbG9hZHMgbXVsdGlwbGUgY2FsZW5kYXJzIHRvIHRoZQogICAgICogICAgICBGdWxsQ2FsZW5kYXIgY29udHJvbC4KICAgICAqLwogICAgZnVuY3Rpb24gQ2FsZW5kYXJTd2l0Y2hJbml0KCRDYWxlbmRhclN3aXRjaCwgUGFyYW1zKSB7CgogICAgICAgIC8vIEluaXRpYWxpemUgZW5hYmxlZCBzb3VyY2VzCiAgICAgICAgaWYgKCRDYWxlbmRhclN3aXRjaC5wcm9wKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdhZGRFdmVudFNvdXJjZScsIFBhcmFtcy5DYWxlbmRhcnMuU291cmNlc1skQ2FsZW5kYXJTd2l0Y2guZGF0YSgnaWQnKV0pOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVnaXN0ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXIKICAgICAgICAkQ2FsZW5kYXJTd2l0Y2gub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoJCgnLkNhbGVuZGFyU3dpdGNoIGlucHV0OmNoZWNrZWQnKS5sZW5ndGggPiBQYXJhbXMuQ2FsZW5kYXJzLkxpbWl0KSB7CiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJTd2l0Y2gucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dBbGVydChDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNUb29NYW55Q2FsZW5kYXJzSGVhZGxpbmUnKSwgQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zVG9vTWFueUNhbGVuZGFyc1RleHQnKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBDYWxlbmRhclN3aXRjaFNvdXJjZSgkQ2FsZW5kYXJTd2l0Y2gsIFBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclN3aXRjaFNvdXJjZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhclN3aXRjaCAtIGNhbGVuZGFyIGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGRpZmZlcmVudCBjb25maWcgb3B0aW9ucy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgcHJlZmVyZW5jZXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIC0gTmFtZSBvZiB0aGUgc2NyZWVuIChDYWxlbmRhck92ZXJ2aWV3fFJlc291cmNlT3ZlcnZpZXcpLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5DYWxlbmRhcnMgLSBPYmplY3Qgd2l0aCBjYWxlbmRhciBwYXJhbWV0ZXJzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGVuZGFycy5Tb3VyY2VzIC0gQXJyYXkgb2YgY2FsZW5kYXIgc291cmNlcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBlbmFibGVzL2Rpc2FibGVzIGNhbGVuZGFyIHNvdXJjZSBpbiBGdWxsQ2FsZW5kYXIgY29udHJvbCBhbmQgc3RvcmVzCiAgICAgKiAgICAgIHNlbGVjdGlvbiB0byB1c2VyIHByZWZlcmVuY2VzLgogICAgICovCiAgICBmdW5jdGlvbiBDYWxlbmRhclN3aXRjaFNvdXJjZSgkQ2FsZW5kYXJTd2l0Y2gsIFBhcmFtcykgewogICAgICAgIHZhciBDYWxlbmRhclNlbGVjdGlvbiA9IFtdOwoKICAgICAgICAvLyBTaG93L2hpZGUgdGhlIGNhbGVuZGFyIGFwcG9pbnRtZW50cwogICAgICAgIGlmICgkQ2FsZW5kYXJTd2l0Y2gucHJvcCgnY2hlY2tlZCcpKSB7CiAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcignYWRkRXZlbnRTb3VyY2UnLCBQYXJhbXMuQ2FsZW5kYXJzLlNvdXJjZXNbJENhbGVuZGFyU3dpdGNoLmRhdGEoJ2lkJyldKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ3JlbW92ZUV2ZW50U291cmNlJywgUGFyYW1zLkNhbGVuZGFycy5Tb3VyY2VzWyRDYWxlbmRhclN3aXRjaC5kYXRhKCdpZCcpXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBHZXQgYWxsIGNoZWNrZWQgY2FsZW5kYXJzCiAgICAgICAgJC5lYWNoKCQoJy5DYWxlbmRhclN3aXRjaCBpbnB1dDpjaGVja2VkJyksIGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICBDYWxlbmRhclNlbGVjdGlvbi5wdXNoKCQoRWxlbWVudCkuZGF0YSgnaWQnKSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFN0b3JlIHNlbGVjdGlvbiBpbiB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgICAgIEFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIDogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIDogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgIE92ZXJ2aWV3U2NyZWVuOiBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gPyBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gOiAnQ2FsZW5kYXJPdmVydmlldycsCiAgICAgICAgICAgICAgICBDYWxlbmRhclNlbGVjdGlvbjogSlNPTi5zdHJpbmdpZnkoQ2FsZW5kYXJTZWxlY3Rpb24pCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5EZWJ1Zy5Mb2coJ0Vycm9yIHVwZGF0aW5nIHVzZXIgcHJlZmVyZW5jZXMhJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgTG9jYXRpb25MaW5rSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRMb2NhdGlvbk9iaiAtIGxvY2F0aW9uIGZpZWxkLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRMb2NhdGlvbkxpbmtzIC0gbG9jYXRpb24gbGlua3MuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgbG9jYXRpb24gbGluayBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuTG9jYXRpb25MaW5rSW5pdCA9IGZ1bmN0aW9uICgkTG9jYXRpb25PYmosICRMb2NhdGlvbkxpbmtzKSB7CiAgICAgICAgdmFyIExvY2F0aW9uVmFsdWUgPSAkTG9jYXRpb25PYmoudmFsKCkgfHwgJExvY2F0aW9uT2JqLnRleHQoKTsKCiAgICAgICAgJExvY2F0aW9uTGlua3MuZWFjaChmdW5jdGlvbiAoSW5kZXgsIEVsZW1lbnQpIHsKICAgICAgICAgICAgdmFyICRMaW5rT2JqID0gJChFbGVtZW50KSwKICAgICAgICAgICAgICAgIEJhc2VVUkwgID0gJExpbmtPYmouZGF0YSgnYmFzZVVybCcpOwoKICAgICAgICAgICAgLy8gVXBkYXRlIGxpbmsgVVJMIGFuZCBzaG93IGl0IGlmIGxvY2F0aW9uIGlzIHNldAogICAgICAgICAgICBpZiAoTG9jYXRpb25WYWx1ZS5sZW5ndGggPiAwICYmIExvY2F0aW9uVmFsdWUgIT09ICctJykgewogICAgICAgICAgICAgICAgJExpbmtPYmouYXR0cignaHJlZicsIEJhc2VVUkwgKyBlbmNvZGVVUklDb21wb25lbnQoTG9jYXRpb25WYWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgLmZhZGVJbignZmFzdCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPdGhlcndpc2UsIGhpZGUgdGhlIGxpbmsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGlua09iai5mYWRlT3V0KCdmYXN0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gUmVnaXN0ZXIga2V5IHVwIGV2ZW50IGhhbmRsZXIKICAgICAgICAkTG9jYXRpb25PYmoub2ZmKCdrZXl1cC5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2tleXVwLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuTG9jYXRpb25MaW5rSW5pdCgkTG9jYXRpb25PYmosICRMb2NhdGlvbkxpbmtzKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEFsbERheUluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkQWxsRGF5IC0gYWxsIGRheSBjaGVja2JveCBlbGVtZW50LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGFsbCBkYXkgY2hlY2tib3ggYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLkFsbERheUluaXQgPSBmdW5jdGlvbiAoJEFsbERheSkgewogICAgICAgIGlmICgkKCcjU3RhcnRNb250aDpkaXNhYmxlZCcpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gU2hvdy9oaWRlIHRoZSBzdGFydCBob3VyL21pbnV0ZSBhbmQgY29tcGxldGUgZW5kIHRpbWUKICAgICAgICBpZiAoJEFsbERheS5wcm9wKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgJCgnI1N0YXJ0SG91ciwjU3RhcnRNaW51dGUsI0VuZEhvdXIsI0VuZE1pbnV0ZScpLnZhbCgnMCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCB0cnVlKQogICAgICAgICAgICAgICAgLnByb3AoJ3JlYWRvbmx5JywgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJCgnI1N0YXJ0SG91ciwjU3RhcnRNaW51dGUsI0VuZEhvdXIsI0VuZE1pbnV0ZScpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wcm9wKCdyZWFkb25seScsIGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlZ2lzdGVyIGNoYW5nZSBldmVudCBoYW5kbGVyCiAgICAgICAgJEFsbERheS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFRhcmdldE5TLkFsbERheUluaXQoJEFsbERheSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBSZWN1cnJpbmdJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRmllbGRzIC0gQXJyYXkgd2l0aCByZWZlcmVuY2VzIHRvIHJlY3VycmluZyBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJpbmcgLSBmaWVsZCB3aXRoIHJlY3VycmluZyBmbGFnLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZVR5cGUgLSBkcm9wIGRvd24gd2l0aCByZWN1cnJlbmNlIHR5cGUKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlIC0gUmVjdXJyZW5jZSBwYXR0ZXJuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdiAtIEN1c3RvbSB0eXBlIGRyb3AtZG93bgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUludGVydmFsVGV4dCAtIGludGVydmFsIHRleHQKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgLSBjb250YWlucyB3ZWVrIGRheXMgdGFibGUKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IC0gY29udGFpbnMgbW9udGggZGF5cyB0YWJsZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiAtIGNvbnRhaW5zIG1vbnRocyB0YWJsZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2IC0gbGF5ZXIgd2l0aCByZWN1cnJlbmNlIGxpbWl0IGZpZWxkcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdCAtIGRyb3AgZG93biB3aXRoIHJlY3VycmVuY2UgbGltaXQgZmllbGQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYgLSBsYXllciB3aXRoIHJlY2N1cmVuY2UgY291bnQgZmllbGQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYgLSBsYXllciB3aXRoIHJlY2N1cmVuY2UgdW50aWwgZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5IC0gc2VsZWN0IGZpZWxkIGZvciByZWNjdXJlbmNlIHVudGlsIGRheS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyByZWN1cnJlbmNlIGZpZWxkcyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuUmVjdXJyaW5nSW5pdCA9IGZ1bmN0aW9uIChGaWVsZHMpIHsKCiAgICAgICAgZnVuY3Rpb24gUmVjSW5pdChGaWVsZHMpIHsKICAgICAgICAgICAgdmFyIERheXMgPSBbXSwKICAgICAgICAgICAgICAgIE1vbnRoRGF5cyA9IFtdLAogICAgICAgICAgICAgICAgTW9udGhzID0gW10sCiAgICAgICAgICAgICAgICBJbmRleDsKCiAgICAgICAgICAgIGlmICgkKCdpbnB1dCNEYXlzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBEYXlzID0gJCgnaW5wdXQjRGF5cycpLnZhbCgpLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQoJ2lucHV0I01vbnRoRGF5cycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgTW9udGhEYXlzID0gJCgnaW5wdXQjTW9udGhEYXlzJykudmFsKCkuc3BsaXQoJywnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJCgnaW5wdXQjTW9udGhEYXlzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBNb250aHMgPSAkKCdpbnB1dCNNb250aHMnKS52YWwoKS5zcGxpdCgnLCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBEYXlzLmxlbmd0aDsgSW5kZXgrKykgewogICAgICAgICAgICAgICAgaWYgKERheXNbSW5kZXhdICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPSIgKyBEYXlzW0luZGV4XSArICJdIikKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTW9udGhEYXlzLmxlbmd0aDsgSW5kZXgrKykgewogICAgICAgICAgICAgICAgaWYgKE1vbnRoRGF5c1tJbmRleF0gIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uW3ZhbHVlPSIgKyBNb250aERheXNbSW5kZXhdICsgIl0iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBNb250aHMubGVuZ3RoOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9udGhzW0luZGV4XSAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvblt2YWx1ZT0iICsgTW9udGhzW0luZGV4XSArICJdIikKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZVR5cGUudmFsKCkgPT0gMCkgewogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJpbmcudmFsKDApOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0Rpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuaGlkZSgpOwoKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LmhpZGUoKTsKCiAgICAgICAgICAgICAgICAvLyBTa2lwIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkuYWRkQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChGaWVsZHMuJFJlY3VycmVuY2VUeXBlLnZhbCgpID09ICdDdXN0b20nKSB7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmluZy52YWwoMSk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICBpZiAoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS52YWwoKT09IkN1c3RvbURhaWx5IikgewogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dERheScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlLnZhbCgpPT0iQ3VzdG9tV2Vla2x5IikgewogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0LmZpbmQoJ3NwYW4nKQogICAgICAgICAgICAgICAgICAgICAgICAuaGlkZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLlRleHRXZWVrJykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21Nb250aGx5IikgewogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0LmZpbmQoJ3NwYW4nKQogICAgICAgICAgICAgICAgICAgICAgICAuaGlkZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLlRleHRNb250aCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlLnZhbCgpPT0iQ3VzdG9tWWVhcmx5IikgewogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0LmZpbmQoJ3NwYW4nKQogICAgICAgICAgICAgICAgICAgICAgICAuaGlkZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLlRleHRZZWFyJykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdERpdi5zaG93KCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykudmFsKCkgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3VtZSB2YWxpZGF0aW9uIG9mIFJlY3VycmVuY2VVbnRpbCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkucmVtb3ZlQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5LmFkZENsYXNzKCdWYWxpZGF0aW9uSWdub3JlJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkudHJpZ2dlcignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKCiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYpOwogICAgICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZShGaWVsZHMuJFJlY3VycmVuY2VMaW1pdERpdik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmluZy52YWwoMSk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0Rpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuaGlkZSgpOwoKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdW1lIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5yZW1vdmVDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB2YWxpZGF0aW9uIG9mIFJlY3VycmVuY2VVbnRpbCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkuYWRkQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpOwogICAgICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZShGaWVsZHMuJFJlY3VycmVuY2VMaW1pdERpdik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuUmVjdXJyaW5nSW5pdChGaWVsZHMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVR5cGUub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBSZWNJbml0KEZpZWxkcyk7CiAgICAgICAgfSkudHJpZ2dlcignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIE5vdGlmaWNhdGlvbkluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBGaWVsZHMgLSBBcnJheSB3aXRoIHJlZmVyZW5jZXMgdG8gcmVtaW5kZXIgZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kTm90aWZpY2F0aW9uIC0gZHJvcCBkb3duIHdpdGggc3lzdGVtIG5vdGlmaWNhdGlvbiBzZWxlY3Rpb24uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYgLSBjdXN0b20gc2VsZWN0aW9uIG9mIHN5c3RlbSBub3RpZmljYXRpb24gZGF0ZQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSByZW1pbmRlciBzZWN0aW9uIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5Ob3RpZmljYXRpb25Jbml0ID0gZnVuY3Rpb24gKEZpZWxkcykgewogICAgICAgIHZhciBOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYgPSBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0Rpdi5hdHRyKCdpZCcpOwoKICAgICAgICBpZiAoRmllbGRzLiROb3RpZmljYXRpb25UZW1wbGF0ZS52YWwoKSAhPT0gJ0N1c3RvbScpIHsKCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIGN1c3RvbSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYuaGlkZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIC8vIGN1c3RvbSBmaWVsZCBpcyBuZWVkZWQKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYuc2hvdygpOwoKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBtb2Rlcm4gZmllbGRzIG9uIGN1c3RvbSBzZWxlY3Rpb24KICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5Jbml0U2VsZWN0KCQoJ3NlbGVjdC5Nb2Rlcm5pemUnKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBkaXNhYmxlIGVuYWJsZSB0aGUgZGlmZmVyZW50IGN1c3RvbSBmaWVsZHMKICAgICAgICBpZiAoRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnKSkgewoKICAgICAgICAgICAgLy8gZW5hYmxlIHJlbGF0aXZlIGRhdGUgZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC52YWwoMSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkucHJvcCgncmVhZG9ubHknLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0LnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHRoZSBjdXN0b20gZGF0ZSB0aW1lIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQudmFsKCcnKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXIucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXIucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIC8vIGVuYWJsZSB0aGUgY3VzdG9tIGRhdGUgdGltZSBpbnB1dAogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQudmFsKDEpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQucHJvcCgnY2hlY2tlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5LnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVZZWFyLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91ci5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgcmVsYXRpdmUgZGF0ZSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnZhbCgnJyk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkucHJvcCgncmVhZG9ubHknLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBUT0RPOiBXb3JrYXJvdW5kIGZvciBJbnB1dEZpZWxkcyBidWcgaW4gdGhlIGZyYW1ld29yayAoZGlzYWJsZWQgYXR0cmlidXRlIG5vdCBjaGVja2VkIGFmdGVyIGluaXRpYWxpemF0aW9uKQogICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuRGVhY3RpdmF0ZSgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYpKTsKICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdikpOwoKICAgICAgICAvLyBSZWdpc3RlciBjaGFuZ2UgZXZlbnQgaGFuZGxlcgogICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uVGVtcGxhdGUub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBUYXJnZXROUy5Ob3RpZmljYXRpb25Jbml0KEZpZWxkcyk7CiAgICAgICAgfSk7CgogICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBoYW5kbGUgcmFkaW8gYnV0dG9ucwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIHByb2Nlc3MgY2hhbmdlcwogICAgICAgICAgICBUYXJnZXROUy5Ob3RpZmljYXRpb25Jbml0KEZpZWxkcyk7CiAgICAgICAgfSk7CgogICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBoYW5kbGUgcmFkaW8gYnV0dG9ucwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQucHJvcCgnY2hlY2tlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIHByb2Nlc3MgY2hhbmdlcwogICAgICAgICAgICBUYXJnZXROUy5Ob3RpZmljYXRpb25Jbml0KEZpZWxkcyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBUZWFtSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZWFtSURPYmogLSBmaWVsZCB3aXRoIGxpc3Qgb2YgdGVhbXMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJlc291cmNlSURPYmogLSBmaWVsZCB3aXRoIGxpc3Qgb2YgcmVzb3VyY2VzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IENoYWxsZW5nZVRva2VuIC0gVXNlciBjaGFsbGVuZ2UgdG9rZW4uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFRlYW1WYWx1ZU9iaiAtIGZpZWxkIHdpdGggcmVhZCBvbmx5IHZhbHVlcyBmb3IgdGVhbS4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkUmVzb3VyY2VWYWx1ZU9iaiAtIGZpZWxkIHdpdGggcmVhZCBvbmx5IHZhbHVlcyBmb3IgcmVzb3VyY2VzLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRlYW0gZmllbGRzIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5UZWFtSW5pdCA9IGZ1bmN0aW9uICgkVGVhbUlET2JqLCAkUmVzb3VyY2VJRE9iaiwgQ2hhbGxlbmdlVG9rZW4sICRUZWFtVmFsdWVPYmosICRSZXNvdXJjZVZhbHVlT2JqKSB7CiAgICAgICAgJFRlYW1JRE9iai5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1RlYW1Vc2VyTGlzdCcsCiAgICAgICAgICAgICAgICBUZWFtSUQ6ICRUZWFtSURPYmoudmFsKCkKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvZ2dsZUFKQVhMb2FkZXIoJFJlc291cmNlSURPYmosIHRydWUpOwoKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICBEYXRhLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFNlbGVjdGVkSUQgPSAkUmVzb3VyY2VJRE9iai52YWwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuVGVhbVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXNwb25zZS5UZWFtVXNlckxpc3QsIGZ1bmN0aW9uIChJbmRleCwgVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBOZXdPcHRpb24gPSBuZXcgT3B0aW9uKFZhbHVlLCBJbmRleCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIG9wdGlvbiB0ZXh0LCBiZWNhdXNlIG9mIHdyb25nIGh0bWwgcXVvdGluZyBvZiB0ZXh0IGNvbnRlbnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoVGhpcyBpcyBuZWVkZWQgZm9yIElFLikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld09wdGlvbi5pbm5lckhUTUwgPSBWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNlbGVjdGVkSUQgJiYgU2VsZWN0ZWRJRC5pbmRleE9mKEluZGV4KSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3T3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVzb3VyY2VJRE9iai5hcHBlbmQoTmV3T3B0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGN1c3RvbSByZWRyYXcgZXZlbnQgZm9yIElucHV0RmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRvZ2dsZUFKQVhMb2FkZXIoJFJlc291cmNlSURPYmosIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gQ29sbGFwc2VWYWx1ZXMoJFZhbHVlT2JqLCBWYWx1ZXMpIHsKICAgICAgICAgICAgJFZhbHVlT2JqLmh0bWwoJycpOwogICAgICAgICAgICAkLmVhY2goVmFsdWVzLCBmdW5jdGlvbiAoSW5kZXgsIFZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YXIgQ291bnQgPSBWYWx1ZXMubGVuZ3RoOwoKICAgICAgICAgICAgICAgIGlmIChJbmRleCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWVPYmouaHRtbCgkVmFsdWVPYmouaHRtbCgpICsgVmFsdWUgKyAnPGJyPicpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZXMuc3BsaWNlKC1Db3VudCwgMik7CiAgICAgICAgICAgICAgICAgICAgJCgnPGEgLz4nKS5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0RpYWxvZ1Rvb2x0aXBMaW5rJykKICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQoJysnICsgKENvdW50LTIpICsgJyBtb3JlJykKICAgICAgICAgICAgICAgICAgICAgICAgLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRUb29sdGlwT2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvb2x0aXBIVE1MID0gJzxwPicgKyBWYWx1ZXMuam9pbignPGJyPicpICsgJzwvcD4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZUxlZnQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgKyAkKHdpbmRvdykud2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFZpc2libGVUb3AgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArICQod2luZG93KS5oZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb247CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgZXhpc3RpbmcgdG9vbHRpcHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2dUb29sdGlwJykucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEV2ZW50LnBhZ2VYIHx8IEV2ZW50LnBhZ2VZKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCA9IEV2ZW50LnBhZ2VYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBFdmVudC5wYWdlWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRXZlbnQuY2xpZW50WCB8fCBFdmVudC5jbGllbnRZKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCA9IEV2ZW50LmNsaWVudFggKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NZID0gRXZlbnQuY2xpZW50WSArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmNyZWFzZSBwb3NpdGlvbnMgc28gdGhlIHRvb2x0aXAgZG8gbm90IG92ZXJsYXAgd2l0aCBtb3VzZSBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYICs9IDEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSArPSA1OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0b29sdGlwIG9iamVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmogPSAkKCc8ZGl2Lz4nKS5hZGRDbGFzcygnQXBwb2ludG1lbnRUb29sdGlwIERpYWxvZ1Rvb2x0aXAgSGlkZGVuJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBQb3NZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBQb3NYCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaHRtbChUb29sdGlwSFRNTCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKCd6LWluZGV4JywgNDAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKCd3aWR0aCcsICdhdXRvJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJ2JvZHknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdG9wIHBvc2l0aW9uIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFlQb3NpdGlvbiA9IFBvc1kgKyAkVG9vbHRpcE9iai5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMYXN0WVBvc2l0aW9uID4gRG9jdW1lbnRWaXNpYmxlVG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IFBvc1kgLSAkVG9vbHRpcE9iai5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ3RvcCcsIFBvc1kgKyAncHgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgbGVmdCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RYUG9zaXRpb24gPSBQb3NYICsgJFRvb2x0aXBPYmoud2lkdGgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMYXN0WFBvc2l0aW9uID4gRG9jdW1lbnRWaXNpYmxlTGVmdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSBQb3NYIC0gJFRvb2x0aXBPYmoud2lkdGgoKSAtIDMwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmNzcygnbGVmdCcsIFBvc1ggKyAncHgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG93IHRoZSB0b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5mYWRlSW4oJ2Zhc3QnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0b29sdGlwIG9uIGFueSBvdXRzaWRlIGNsaWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISQoRXZlbnQudGFyZ2V0KS5jbG9zZXN0KCcuRGlhbG9nVG9vbHRpcExpbmsnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2dUb29sdGlwJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJFZhbHVlT2JqKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29sbGFwc2UgcmVhZCBvbmx5IHZhbHVlcwogICAgICAgIGlmICgkVGVhbVZhbHVlT2JqLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYXBzZVZhbHVlcygkVGVhbVZhbHVlT2JqLCAkVGVhbVZhbHVlT2JqLmh0bWwoKS5zcGxpdCgnPGJyPicpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRSZXNvdXJjZVZhbHVlT2JqLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYXBzZVZhbHVlcygkUmVzb3VyY2VWYWx1ZU9iaiwgJFJlc291cmNlVmFsdWVPYmouaHRtbCgpLnNwbGl0KCc8YnI+JykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclNldHRpbmdzSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBkaWZmZXJlbnQgY29uZmlnIG9wdGlvbnMuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzIC0gQXJyYXkgY29udGFpbmluZyBuYW1lcyBvZiB0aGUgY2FsbGJhY2tzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBwcmVmZXJlbmNlcyBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gLSBOYW1lIG9mIHRoZSBzY3JlZW4gKFJlc291cmNlT3ZlcnZpZXcpLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5DYWxlbmRhclNldHRpbmdzQnV0dG9uIC0gSUQgb2YgdGhlIHNldHRpbmdzIGJ1dHRvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lciAtIElEIG9mIHRoZSBzZXR0aW5ncyBkaWFsb2cgY29udGFpbmVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5DYWxlbmRhclNldHRpbmdzU2hvdyAtIFNob3cgdGhlIHNldHRpbmdzIGRpYWxvZyBpbW1lZGlhdGVseS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBjYWxlbmRhciBzZXR0aW5ncyBiZWhhdmlvci4KICAgICAqLwogICAgZnVuY3Rpb24gQ2FsZW5kYXJTZXR0aW5nc0luaXQoUGFyYW1zKSB7CiAgICAgICAgdmFyICRDYWxlbmRhclNldHRpbmdzT2JqID0gJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbikpLAogICAgICAgICAgICAkQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZyA9ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXIpKTsKCiAgICAgICAgLy8gQ2FsZW5kYXIgc2V0dGluZ3MgYnV0dG9uCiAgICAgICAgJENhbGVuZGFyU2V0dGluZ3NPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coJENhbGVuZGFyU2V0dGluZ3NEaWFsb2csIENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1NldHRpbmdzJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zU2F2ZScpLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ1ByaW1hcnknLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRTaG93bkFwcG9pbnRtZW50cyA9ICQoJyNTaG93bkFwcG9pbnRtZW50cycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBQYXJhbXMuQ2hhbGxlbmdlVG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIDogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVydmlld1NjcmVlbjogUGFyYW1zLk92ZXJ2aWV3U2NyZWVuID8gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIDogJ0NhbGVuZGFyT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93bkFwcG9pbnRtZW50czogJFNob3duQXBwb2ludG1lbnRzLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICdBY3Rpb249QWdlbnRBcHBvaW50bWVudCcgKyAoUGFyYW1zLk92ZXJ2aWV3U2NyZWVuID8gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIDogJ0NhbGVuZGFyT3ZlcnZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwgdHJ1ZSk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gU2hvdyBzZXR0aW5ncyBkaWFsb2cgaW1tZWRpYXRlbHkKICAgICAgICBpZiAoUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NTaG93KSB7CiAgICAgICAgICAgICRDYWxlbmRhclNldHRpbmdzT2JqLnRyaWdnZXIoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgUmVzb3VyY2VTZXR0aW5nc0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcyAtIEFycmF5IGNvbnRhaW5pbmcgbmFtZXMgb2YgdGhlIGNhbGxiYWNrcy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgcHJlZmVyZW5jZXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIC0gTmFtZSBvZiB0aGUgc2NyZWVuIChSZXNvdXJjZU92ZXJ2aWV3KS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuUmVzb3VyY2VzIC0gT2JqZWN0IHdpdGggcmVzb3VyY2VzIHBhcmFtZXRlcnMuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZVNldHRpbmdzQnV0dG9uIC0gSUQgb2YgdGhlIGVsZW1lbnQgZm9yIHNldHRpbmdzIGJ1dHRvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlU2V0dGluZ3NEaWFsb2dDb250YWluZXIgLSBJRCBvZiB0aGUgZWxlbWVudCB3aXRoIGRpYWxvZyBjb250ZW50LgogICAgICogQHBhcmFtIHtCb29sZWFufSBQYXJhbXMuUmVzb3VyY2VzLlJlc3RvcmVEZWZhdWx0U2V0dGluZ3MgLSB3aGV0aGVyIHRvIGRpc3BsYXkgcmVzdG9yZSBzZXR0aW5ncyBidXR0b24uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgcmVzb3VyY2Ugc2V0dGluZ3MgYmVoYXZpb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlc291cmNlU2V0dGluZ3NJbml0KFBhcmFtcykgewogICAgICAgIHZhciAkUmVzb3VyY2VTZXR0aW5nc09iaiA9ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZVNldHRpbmdzQnV0dG9uKSksCiAgICAgICAgICAgICRSZXNvdXJjZVNldHRpbmdzRGlhbG9nID0gJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlU2V0dGluZ3NEaWFsb2dDb250YWluZXIpKTsKCiAgICAgICAgLy8gUmVzb3VyY2Ugc2V0dGluZ3MgYnV0dG9uCiAgICAgICAgJFJlc291cmNlU2V0dGluZ3NPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coJFJlc291cmNlU2V0dGluZ3NEaWFsb2csIENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1NldHRpbmdzJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zU2F2ZScpLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ1ByaW1hcnknLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRMaXN0Q29udGFpbmVyID0gJCgnLkFsbG9jYXRpb25MaXN0Q29udGFpbmVyJykuZmluZCgnLkFzc2lnbmVkRmllbGRzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd25SZXNvdXJjZXMgPSBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA6ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIDogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IFBhcmFtcy5PdmVydmlld1NjcmVlbiA/IFBhcmFtcy5PdmVydmlld1NjcmVlbiA6ICdSZXNvdXJjZU92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbUlEOiAkKCcjVGVhbScpLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJExpc3RDb250YWluZXIpICYmICRMaXN0Q29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCgkTGlzdENvbnRhaW5lci5maW5kKCdsaScpLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd25SZXNvdXJjZXMucHVzaCgkKHRoaXMpLmF0dHIoJ2RhdGEtZmllbGRuYW1lJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5TaG93blJlc291cmNlcyA9IEpTT04uc3RyaW5naWZ5KFNob3duUmVzb3VyY2VzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwgdHJ1ZSk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLlNldEFsbG9jYXRpb25MaXN0KCk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3MgPSBQYXJhbXMuUmVzb3VyY2VzLlJlc3RvcmVEZWZhdWx0U2V0dGluZ3M7CgogICAgICAgIC8vIEluaXRpYWxpemUgcmVzdG9yZSBzZXR0aW5ncyBidXR0b24uCiAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5nc0luaXQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBSZXN0b3JlRGVmYXVsdFNldHRpbmdzSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEFkZHMgcmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzIGJ1dHRvbiAodHJhc2ggY2FuKSB0byB2aWV3IGFuZCBpbml0aWFsaXplcyBpdHMgYmVoYXZpb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3NJbml0KCkgewogICAgICAgIHZhciAkUmVzdG9yZVNldHRpbmdzT2JqOwoKICAgICAgICAvLyBTa2lwIGlmIGJ1dHRvbiBpcyBub3QgbmVlZGVkIG9yIHdlIGFscmVhZHkgaGF2ZSBvbmUuCiAgICAgICAgaWYgKAogICAgICAgICAgICAhUmVzdG9yZURlZmF1bHRTZXR0aW5ncwogICAgICAgICAgICB8fCAkKCcjUmVzdG9yZURlZmF1bHRTZXR0aW5ncycpLmxlbmd0aCA+IDAKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gQ3JlYXRlIHRoZSBidXR0b24uCiAgICAgICAgJFJlc3RvcmVTZXR0aW5nc09iaiA9ICQoJzxhIC8+JykuYXR0cignaWQnLCAnUmVzdG9yZURlZmF1bHRTZXR0aW5ncycpCiAgICAgICAgICAgIC5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAuYXR0cigndGl0bGUnLCBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNSZXN0b3JlJykpCiAgICAgICAgICAgIC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmEgZmEtdHJhc2gnKSk7CgogICAgICAgIC8vIEFkZCBpdCB0byB0aGUgY29sdW1uIGhlYWRlci4KICAgICAgICAkKCd0ci5mYy1zdXBlciArIHRyIC5mYy1jZWxsLWNvbnRlbnQnKS5hcHBlbmQoJFJlc3RvcmVTZXR0aW5nc09iaik7CgogICAgICAgIC8vIFJlZ2lzdGVyIGNsaWNrIGhhbmRsZXIuCiAgICAgICAgJFJlc3RvcmVTZXR0aW5nc09iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICBPdmVydmlld1NjcmVlbjogJ1Jlc291cmNlT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgICAgIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3M6ICdTaG93blJlc291cmNlcycsCiAgICAgICAgICAgICAgICAgICAgVGVhbUlEOiAkKCcjVGVhbScpLnZhbCgpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuRGVidWcuTG9nKCdFcnJvciB1cGRhdGluZyB1c2VyIHByZWZlcmVuY2VzIScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFRvZ2dsZUFKQVhMb2FkZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFbGVtZW50IC0gT2JqZWN0IHJlZmVyZW5jZSBvZiB0aGUgZmllbGQgd2hpY2ggaXMgdXBkYXRlZAogICAgICogQHBhcmFtIHtCb29sZWFufSBTaG93IC0gU2hvdyBvciBoaWRlIHRoZSBBSkFYIGxvYWRlciBpbWFnZQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3dzIGFuZCBoaWRlcyBhbiBhamF4IGxvYWRlciBmb3IgZXZlcnkgZWxlbWVudCB3aGljaCBpcyB1cGRhdGVzIHZpYSBhamF4LgogICAgICovCiAgICBmdW5jdGlvbiBUb2dnbGVBSkFYTG9hZGVyKCRFbGVtZW50LCBTaG93KSB7CiAgICAgICAgdmFyICRMb2FkZXIgPSAkKCcjQUpBWExvYWRlcicgKyAkRWxlbWVudC5hdHRyKCdpZCcpKSwKICAgICAgICAgICAgTG9hZGVySFRNTCA9ICc8c3BhbiBpZD0iQUpBWExvYWRlcicgKyAkRWxlbWVudC5hdHRyKCdpZCcpICsgJyIgY2xhc3M9IkFKQVhMb2FkZXIiPjwvc3Bhbj4nOwoKICAgICAgICAvLyBFbGVtZW50IG5vdCBwcmVzZW50CiAgICAgICAgaWYgKCEkRWxlbWVudC5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gU2hvdyBvciBoaWRlIHRoZSBsb2FkZXIKICAgICAgICBpZiAoU2hvdykgewogICAgICAgICAgICBpZiAoISRMb2FkZXIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAkRWxlbWVudC5hZnRlcihMb2FkZXJIVE1MKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRMb2FkZXIuc2hvdygpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRMb2FkZXIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAkTG9hZGVyLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIFBsdWdpbkluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkUGx1Z2luRmllbGRzIC0gZmllbGRzIHdpdGggZGlmZmVyZW50IHBsdWdpbiBzZWFyY2hlcy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBDaGFsbGVuZ2VUb2tlbiAtIFVzZXIgY2hhbGxlbmdlIHRva2VuLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHBsdWdpbiBmaWVsZHMgYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLlBsdWdpbkluaXQgPSBmdW5jdGlvbiAoJFBsdWdpbkZpZWxkcywgQ2hhbGxlbmdlVG9rZW4pIHsKCiAgICAgICAgZnVuY3Rpb24gSW5pdFJlbW92ZUJ1dHRvbnMoKSB7CiAgICAgICAgICAgICQoJy5SZW1vdmVCdXR0b24nKS5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciAkUmVtb3ZlT2JqID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICBQbHVnaW5LZXkgPSAkUmVtb3ZlT2JqLmRhdGEoJ3BsdWdpbktleScpLAogICAgICAgICAgICAgICAgICAgICRQbHVnaW5EYXRhT2JqID0gJCgnI1BsdWdpbl8nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGx1Z2luS2V5KSksCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luRGF0YSA9IEpTT04ucGFyc2UoJFBsdWdpbkRhdGFPYmoudmFsKCkpLAogICAgICAgICAgICAgICAgICAgIExpbmtJRCA9ICRSZW1vdmVPYmouZGF0YSgnbGlua0lkJykudG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAkUGFyZW50ID0gJFJlbW92ZU9iai5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICBQbHVnaW5EYXRhLnNwbGljZShQbHVnaW5EYXRhLmluZGV4T2YoTGlua0lEKSwgMSk7CiAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iai52YWwoSlNPTi5zdHJpbmdpZnkoUGx1Z2luRGF0YSkpOwoKICAgICAgICAgICAgICAgICRQYXJlbnQucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIEFkZExpbmsoUGx1Z2luS2V5LCBQbHVnaW5VUkwsIExpbmtJRCwgTGlua05hbWUpIHsKICAgICAgICAgICAgdmFyICRQbHVnaW5Db250YWluZXJPYmogPSAkKCcjUGx1Z2luQ29udGFpbmVyXycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQbHVnaW5LZXkpKSwKICAgICAgICAgICAgICAgICRQbHVnaW5EYXRhT2JqID0gJCgnI1BsdWdpbl8nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGx1Z2luS2V5KSksCiAgICAgICAgICAgICAgICBQbHVnaW5EYXRhID0gSlNPTi5wYXJzZSgkUGx1Z2luRGF0YU9iai52YWwoKSksCiAgICAgICAgICAgICAgICAkRXhpc3RpbmdMaW5rcyA9ICRQbHVnaW5Db250YWluZXJPYmouZmluZCgnLkxpbmtfJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKExpbmtJRCkpLAogICAgICAgICAgICAgICAgJExpbmtDb250YWluZXJPYmogPSAkKCc8ZGl2IC8+JyksCiAgICAgICAgICAgICAgICAkVVJMT2JqID0gJCgnPGEgLz4nKSwKICAgICAgICAgICAgICAgICRSZW1vdmVPYmogPSAkKCc8YSAvPicpLAogICAgICAgICAgICAgICAgTGlua1VSTCA9IFBsdWdpblVSTC5yZXBsYWNlKCclcycsIExpbmtJRCk7CgogICAgICAgICAgICBpZiAoJEV4aXN0aW5nTGlua3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBQbHVnaW5EYXRhLnB1c2goTGlua0lEKTsKICAgICAgICAgICAgJFBsdWdpbkRhdGFPYmoudmFsKEpTT04uc3RyaW5naWZ5KFBsdWdpbkRhdGEpKTsKCiAgICAgICAgICAgICRMaW5rQ29udGFpbmVyT2JqLmFkZENsYXNzKCdMaW5rXycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihMaW5rSUQpKTsKCiAgICAgICAgICAgICRVUkxPYmouYXR0cignaHJlZicsIExpbmtVUkwpCiAgICAgICAgICAgICAgICAuYXR0cigndGFyZ2V0JywgJ19ibGFuaycpCiAgICAgICAgICAgICAgICAudGV4dChMaW5rTmFtZSkKICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkTGlua0NvbnRhaW5lck9iaik7CgogICAgICAgICAgICAkUmVtb3ZlT2JqLmF0dHIoJ2hyZWYnLCAnIycpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ1JlbW92ZUJ1dHRvbicpCiAgICAgICAgICAgICAgICAuZGF0YSgncGx1Z2luS2V5JywgUGx1Z2luS2V5KQogICAgICAgICAgICAgICAgLmRhdGEoJ2xpbmtJZCcsIExpbmtJRCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgJCgnPGkgLz4nKS5hZGRDbGFzcygnZmEgZmEtbWludXMtc3F1YXJlLW8nKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRMaW5rQ29udGFpbmVyT2JqKTsKCiAgICAgICAgICAgICRMaW5rQ29udGFpbmVyT2JqLmFwcGVuZFRvKCRQbHVnaW5Db250YWluZXJPYmopOwogICAgICAgICAgICBJbml0UmVtb3ZlQnV0dG9ucygpOwogICAgICAgIH0KCiAgICAgICAgJFBsdWdpbkZpZWxkcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyICRFbGVtZW50ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIFBsdWdpbktleSA9ICRFbGVtZW50LmRhdGEoJ3BsdWdpbktleScpLAogICAgICAgICAgICAgICAgUGx1Z2luVVJMID0gJEVsZW1lbnQuZGF0YSgncGx1Z2luVXJsJyk7CgogICAgICAgICAgICAvLyBTa2lwIGFscmVhZHkgaW5pdGlhbGl6ZWQgZmllbGRzCiAgICAgICAgICAgIGlmICgkRWxlbWVudC5oYXNDbGFzcygndWktYXV0b2NvbXBsZXRlLWlucHV0JykpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoewogICAgICAgICAgICAgICAgbWluTGVuZ3RoOiAyLAogICAgICAgICAgICAgICAgZGVsYXk6IDUwMCwKICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBSkFYTnVtYmVyID0gKytBSkFYQ291bnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRQbHVnaW5TZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5OiBQbHVnaW5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtOiBSZXF1ZXN0LnRlcm0gKyAnKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiAyMAogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKFVSTCwgRGF0YSwgZnVuY3Rpb24gKFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IFtdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBmcm9tIHRoZSBsYXRlc3QgYWpheCByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBSkFYQ291bnRlciAhPT0gQ3VycmVudEFKQVhOdW1iZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKFJlc3VsdCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5WYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICB0aGlzLktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5WYWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZShEYXRhKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChFdmVudCwgVUkpIHsKICAgICAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC52YWwoJycpOwogICAgICAgICAgICAgICAgICAgIEFkZExpbmsoUGx1Z2luS2V5LCBQbHVnaW5VUkwsIFVJLml0ZW0ua2V5LCBVSS5pdGVtLmxhYmVsKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEVkaXRBcHBvaW50bWVudAogICAgICogQHBhcmFtIHtPYmplY3R9IERhdGEgLSBIYXNoIHdpdGggY2FsbCBhbmQgYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5DYWxlbmRhcklEIC0gQXBwb2ludG1lbnQgY2FsZW5kYXIgSUQuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuQXBwb2ludG1lbnRJRCAtIEFwcG9pbnRtZW50IElELgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkFjdGlvbiAtIEVkaXQgYWN0aW9uLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLlN1YmFjdGlvbiAtIEVkaXQgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLlRpdGxlIC0gQXBwb2ludG1lbnQgdGl0bGUuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRGVzY3JpcHRpb24gLSBBcHBvaW50bWVudCBkZXNjcmlwdGlvbi4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5Mb2NhdGlvbiAtIEFwcG9pbnRtZW50IGxvY2F0aW9uLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLlN0YXJ0WWVhciAtIEFwcG9pbnRtZW50IHN0YXJ0IHllYXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRNb250aCAtIEFwcG9pbnRtZW50IHN0YXJ0IG1vbnRoLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLlN0YXJ0RGF5IC0gQXBwb2ludG1lbnQgc3RhcnQgZGF5LgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLlN0YXJ0SG91ciAtIEFwcG9pbnRtZW50IHN0YXJ0IGhvdXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRNaW51dGUgLSBBcHBvaW50bWVudCBzdGFydCBtaW51dGUuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kWWVhciAtIEFwcG9pbnRtZW50IGVuZCB5ZWFyLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkVuZE1vbnRoIC0gQXBwb2ludG1lbnQgZW5kIG1vbnRoLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkVuZERheSAtIEFwcG9pbnRtZW50IGVuZCBkYXkuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kSG91ciAtIEFwcG9pbnRtZW50IGVuZCBob3VyLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkVuZE1pbnV0ZSAtIEFwcG9pbnRtZW50IGVuZCBtaW51dGUuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuQWxsRGF5IC0gSXMgYXBwb2ludG1lbnQgYW4gYWxsLWRheSBhcHBvaW50bWVudCAoMHwxKT8KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBzdWJtaXRzIGFuIGVkaXQgYXBwb2ludG1lbnQgY2FsbCB0byB0aGUgYmFja2VuZCBhbmQgcmVmcmVzaGVzIHRoZSB2aWV3LgogICAgICAqLwogICAgVGFyZ2V0TlMuRWRpdEFwcG9pbnRtZW50ID0gZnVuY3Rpb24gKERhdGEpIHsKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyQWdlbmRhT3ZlcnZpZXcnKSkgewogICAgICAgICAgICAkKCcuT3ZlcnZpZXdDb250cm9sJykuYWRkQ2xhc3MoJ0xvYWRpbmcnKTsKICAgICAgICB9CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ3JlZmV0Y2hFdmVudHMnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRpYWxvZwogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmVsb2FkIHBhZ2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhckFnZW5kYU92ZXJ2aWV3JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBhbGVydChSZXNwb25zZS5FcnJvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH07CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhciB8fCB7fSkpOwo=
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyID0gQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyIHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZQogKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAqIEBhdXRob3IgT1RSUyBBRwogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgYXBwb2ludG1lbnQgY2FsZW5kYXIgbWFuYWdlbWVudCBmdW5jdGlvbnMuCiAqLwpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIHZhciBSdWxlQ291bnQgPSAwOwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdFRpY2tldEFwcG9pbnRtZW50cwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UKICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gSW5pdGlhbFJ1bGVDb3VudCAtIEZyb20gd2hpY2ggcnVsZSB0aGUgY291bnQgc2hvdWxkIHN0YXJ0IChvcHRpb25hbCkKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBJbml0aWFsaXplIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgZmllbGRzIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0VGlja2V0QXBwb2ludG1lbnRzID0gZnVuY3Rpb24gKEluaXRpYWxSdWxlQ291bnQpIHsKICAgICAgICB2YXIgJEFkZFJ1bGVPYmogPSAkKCcjQWRkUnVsZUJ1dHRvbicpLAogICAgICAgICAgICAkVGVtcGxhdGVPYmogPSAkKCcjVGlja2V0QXBwb2ludG1lbnRSdWxlc1RlbXBsYXRlJyk7CgogICAgICAgIGlmIChJbml0aWFsUnVsZUNvdW50KSB7CiAgICAgICAgICAgIFJ1bGVDb3VudCA9IHBhcnNlSW50KEluaXRpYWxSdWxlQ291bnQsIDEwKTsKICAgICAgICB9CgogICAgICAgICRBZGRSdWxlT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgUnVsZUlEID0gKytSdWxlQ291bnQsCiAgICAgICAgICAgICAgICAkUnVsZU9iaiA9ICQoJFRlbXBsYXRlT2JqLmh0bWwoKSksCiAgICAgICAgICAgICAgICAkQ29udGFpbmVyT2JqID0gJEFkZFJ1bGVPYmoucGFyZW50cygnZmllbGRzZXQnKTsKCiAgICAgICAgICAgICRSdWxlT2JqCgogICAgICAgICAgICAgICAgLy8gUnVsZSBudW1iZXIKICAgICAgICAgICAgICAgIC5maW5kKCcuUnVsZU51bWJlcicpCiAgICAgICAgICAgICAgICAudGV4dChSdWxlSUQpCiAgICAgICAgICAgICAgICAuZW5kKCkKCiAgICAgICAgICAgICAgICAvLyBTdGFydCBkYXRlIGZpZWxkIGFuZCBsYWJlbAogICAgICAgICAgICAgICAgLmZpbmQoJyNTdGFydERhdGUnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1N0YXJ0RGF0ZV8nICsgUnVsZUlEKQogICAgICAgICAgICAgICAgLmF0dHIoJ25hbWUnLCAnU3RhcnREYXRlXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAucGFyZW50KCkKICAgICAgICAgICAgICAgIC5wcmV2KCdsYWJlbCcpCiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgJ1N0YXJ0RGF0ZV8nICsgUnVsZUlEKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC5lbmQoKQoKICAgICAgICAgICAgICAgIC8vIEVuZCBkYXRlIGZpZWxkIGFuZCBsYWJlbAogICAgICAgICAgICAgICAgLmZpbmQoJyNFbmREYXRlJykKICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICdFbmREYXRlXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdFbmREYXRlXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAucGFyZW50KCkKICAgICAgICAgICAgICAgIC5wcmV2KCdsYWJlbCcpCiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgJ0VuZERhdGVfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZW5kKCkKCiAgICAgICAgICAgICAgICAvLyBRdWV1ZXMgZmllbGQsIGxhYmVsIGFuZCBlcnJvcgogICAgICAgICAgICAgICAgLmZpbmQoJyNRdWV1ZUlEJykKICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICdRdWV1ZUlEXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdRdWV1ZUlEXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC5maW5kKCdsYWJlbFtmb3I9IlF1ZXVlSUQiXScpCiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgJ1F1ZXVlSURfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmZpbmQoJyNRdWV1ZUlERXJyb3InKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1F1ZXVlSURfJyArIFJ1bGVJRCArICdFcnJvcicpCiAgICAgICAgICAgICAgICAuZW5kKCkKCiAgICAgICAgICAgICAgICAuaW5zZXJ0QmVmb3JlKCRDb250YWluZXJPYmopOwoKICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkUnVsZU9iaik7CgogICAgICAgICAgICAvLyBJbml0aWFsaXplIHJ1bGUgYnV0dG9ucwogICAgICAgICAgICBUYXJnZXROUy5Jbml0VGlja2V0QXBwb2ludG1lbnRSdWxlKFJ1bGVJRCwgJFJ1bGVPYmopOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdFRpY2tldEFwcG9pbnRtZW50UnVsZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UKICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gUnVsZUlEIC0gSUQgb2YgdGhlIHJ1bGUgKDEsIDIsIDMuLi4pCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJ1bGVPYmogLSBSdWxlIG9iamVjdAogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemUgdGhlIHRpY2tldCBhcHBvaW50bWVudCBydWxlIGJ1dHRvbnMgYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRUaWNrZXRBcHBvaW50bWVudFJ1bGUgPSBmdW5jdGlvbiAoUnVsZUlELCAkUnVsZU9iaikgewogICAgICAgIHZhciAkUmVtb3ZlT2JqID0gJFJ1bGVPYmouZmluZCgnbGVnZW5kIC5SZW1vdmVCdXR0b24nKSwKICAgICAgICAgICAgJFJlbW92ZVBhcmFtT2JqID0gJFJ1bGVPYmouZmluZCgnLkZpZWxkID4gLlJlbW92ZUJ1dHRvbicpLAogICAgICAgICAgICAkQWRkUGFyYW1PYmogPSAkUnVsZU9iai5maW5kKCcuQWRkQnV0dG9uJyksCiAgICAgICAgICAgICRQYXJhbU9iaiA9ICRSdWxlT2JqLmZpbmQoJy5TZWFyY2hQYXJhbXMnKSwKICAgICAgICAgICAgJFRlbXBsYXRlT2JqID0gJCgnI1RpY2tldEFwcG9pbnRtZW50U2VhcmNoUGFyYW1UZW1wbGF0ZScpOwoKICAgICAgICAkUGFyYW1PYmoudmFsKCRQYXJhbU9iai5maW5kKCdvcHRpb246ZW5hYmxlZCcpLmZpcnN0KCkuYXR0cigndmFsdWUnKSk7CgogICAgICAgICRSZW1vdmVPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRSdWxlT2JqLnJlbW92ZSgpOwogICAgICAgICAgICBVcGRhdGVSdWxlQ291bnQoKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgJFJlbW92ZVBhcmFtT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJFNlYXJjaFBhcmFtT2JqID0gJCh0aGlzKS5wYXJlbnQoKSwKICAgICAgICAgICAgICAgIFBhcmFtTmFtZSA9ICRTZWFyY2hQYXJhbU9iai5maW5kKCcuU2VhcmNoUGFyYW0nKS5kYXRhKCdwYXJhbScpOwoKICAgICAgICAgICAgJFNlYXJjaFBhcmFtT2JqLnJlbW92ZSgpOwogICAgICAgICAgICAkUGFyYW1PYmouZmluZCgnb3B0aW9uW3ZhbHVlPSInICsgUGFyYW1OYW1lICsgJyJdJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAudmFsKCRQYXJhbU9iai5maW5kKCdvcHRpb246ZW5hYmxlZCcpLmZpcnN0KCkuYXR0cigndmFsdWUnKSkKICAgICAgICAgICAgICAgIC50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkQWRkUGFyYW1PYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkU2VhcmNoUGFyYW1PYmogPSAkKCRUZW1wbGF0ZU9iai5odG1sKCkpLAogICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtQ29udGFpbmVyT2JqID0gJFJ1bGVPYmouZmluZCgnLlNlYXJjaFBhcmFtc0NvbnRhaW5lcicpLAogICAgICAgICAgICAgICAgJFJlbW92ZVBhcmFtT2JqID0gJFNlYXJjaFBhcmFtT2JqLmZpbmQoJy5SZW1vdmVCdXR0b24nKSwKICAgICAgICAgICAgICAgIFBhcmFtTmFtZSA9ICRQYXJhbU9iai52YWwoKTsKCiAgICAgICAgICAgIGlmICghUGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbU9iai5maW5kKCdvcHRpb25bdmFsdWU9IicgKyBQYXJhbU5hbWUgKyAnIl0nKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLnZhbCgkUGFyYW1PYmouZmluZCgnb3B0aW9uOmVuYWJsZWQnKS5maXJzdCgpLmF0dHIoJ3ZhbHVlJykpCiAgICAgICAgICAgICAgICAudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKTsKCiAgICAgICAgICAgIC8vIExhYmVsCiAgICAgICAgICAgICRTZWFyY2hQYXJhbU9iagogICAgICAgICAgICAgICAgLmZpbmQoJ2xhYmVsJykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCAnU2VhcmNoUGFyYW1fJyArIFJ1bGVJRCArICdfJyArIFBhcmFtTmFtZSkKICAgICAgICAgICAgICAgIC5maW5kKCdzcGFuJykKICAgICAgICAgICAgICAgIC5hZnRlcignICcgKyAkUGFyYW1PYmouZmluZCgnb3B0aW9uW3ZhbHVlPSInICsgUGFyYW1OYW1lICsgJyJdJykudGV4dCgpICsgJzonKTsKCiAgICAgICAgICAgIC8vIE93bmVySURzIGFuZCBSZXNwb25zaWJsZUlEcyBhcmUgbXVsdGktc2VsZWN0IGZpZWxkcy4KICAgICAgICAgICAgaWYgKFBhcmFtTmFtZSA9PT0gJ093bmVySURzJyB8fCBQYXJhbU5hbWUgPT09ICdSZXNwb25zaWJsZUlEcycpIHsKICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbU9iagogICAgICAgICAgICAgICAgICAgIC5maW5kKCdzZWxlY3QnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICdTZWFyY2hQYXJhbV8nICsgUnVsZUlEICsgJ18nICsgUGFyYW1OYW1lKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ1NlYXJjaFBhcmFtXycgKyBSdWxlSUQgKyAnXycgKyBQYXJhbU5hbWUpCiAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJyNTZWFyY2hQYXJhbUVycm9yJykKICAgICAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAnU2VhcmNoUGFyYW1fJyArIFJ1bGVJRCArICdfJyArIFBhcmFtTmFtZSArICdFcnJvcicpCiAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2lucHV0JykKICAgICAgICAgICAgICAgICAgICAucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElucHV0IGZpZWxkIGFuZCBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtT2JqCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2lucHV0JykKICAgICAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAnU2VhcmNoUGFyYW1fJyArIFJ1bGVJRCArICdfJyArIFBhcmFtTmFtZSkKICAgICAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdTZWFyY2hQYXJhbV8nICsgUnVsZUlEICsgJ18nICsgUGFyYW1OYW1lKQogICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcjU2VhcmNoUGFyYW1FcnJvcicpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1NlYXJjaFBhcmFtXycgKyBSdWxlSUQgKyAnXycgKyBQYXJhbU5hbWUgKyAnRXJyb3InKQogICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCdzZWxlY3QnKQogICAgICAgICAgICAgICAgICAgIC5yZW1vdmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlYXJjaFBhcmFtT2JqLmFwcGVuZFRvKCRTZWFyY2hQYXJhbUNvbnRhaW5lck9iaik7CiAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJFNlYXJjaFBhcmFtQ29udGFpbmVyT2JqKTsKCiAgICAgICAgICAgICRSZW1vdmVQYXJhbU9iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbU9iai5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICRQYXJhbU9iai5maW5kKCdvcHRpb25bdmFsdWU9IicgKyBQYXJhbU5hbWUgKyAnIl0nKQogICAgICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKQogICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgIC52YWwoJFBhcmFtT2JqLmZpbmQoJ29wdGlvbjplbmFibGVkJykuZmlyc3QoKS5hdHRyKCd2YWx1ZScpKQogICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gVXBkYXRlUnVsZUNvdW50KCkgewogICAgICAgIHZhciAkUnVsZU51bWJlck9iaiA9ICQoJy5SdWxlTnVtYmVyOnZpc2libGUnKTsKCiAgICAgICAgJFJ1bGVOdW1iZXJPYmouZWFjaChmdW5jdGlvbiAoSW5kZXgsIEVsZW1lbnQpIHsKICAgICAgICAgICAgJChFbGVtZW50KS50ZXh0KEluZGV4ICsgMSk7CiAgICAgICAgfSk7CgogICAgICAgIFJ1bGVDb3VudCA9ICRSdWxlTnVtYmVyT2JqLmxlbmd0aDsKICAgIH0KCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZSB8fCB7fSkpOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpPVFJTQXBwb2ludG1lbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb25FdmVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpPVFJTQnVzaW5lc3MucG0gLSBjb2RlIHRvIGV4ZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5fQXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSgpOwogICAgJFNlbGYtPl9BcHBvaW50bWVudE5vdGlmaWNhdGlvbkFkZCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZS1pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9BcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlKCk7CiAgICAkU2VsZi0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uQWRkKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0FwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9BcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlKCkKClVwZGF0ZSBwb3NzaWJsZSBjaGFuZ2VzIG9uIHRoZSBjYWxlbmRhciBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MuCgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhIGxvY2FsIGFwcG9pbnRtZW50IG9iamVjdAogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgICMgdXBkYXRlIHRoZSBmdXR1cmUgdGFza3MKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlKCk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgdXBkYXRlIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpCgpEZWxldGUgYWxsIGNhbGVuZGFyIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcy4KCj1jdXQKCnN1YiBfQXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGEgbG9jYWwgYXBwb2ludG1lbnQgb2JqZWN0CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBkZWxldGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9BcHBvaW50bWVudE5vdGlmaWNhdGlvbkFkZCgpCgpBZGQgYmFzaWMgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIGZvciByZW1pbmRlcnMuCgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUFwcG9pbnRtZW50Tm90aWZpY2F0aW9ucyA9ICgKICAgICAgICAnQXBwb2ludG1lbnQgcmVtaW5kZXIgbm90aWZpY2F0aW9uJyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVHlwZSAgICAgICA9PiBbJ0FwcG9pbnRtZW50J10sCiAgICAgICAgICAgICAgICBWaXNpYmxlRm9yQWdlbnQgICAgICAgID0+IFsxXSwKICAgICAgICAgICAgICAgIFZpc2libGVGb3JBZ2VudFRvb2x0aXAgPT4gWwogICAgICAgICAgICAgICAgICAgICdZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLicKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBFdmVudHMgICAgICAgICAgICAgICAgPT4gWydBcHBvaW50bWVudE5vdGlmaWNhdGlvbiddLAogICAgICAgICAgICAgICAgUmVjaXBpZW50cyAgICAgICAgICAgID0+IFsnQXBwb2ludG1lbnRBZ2VudFJlYWRQZXJtaXNzaW9ucyddLAogICAgICAgICAgICAgICAgU2VuZE9uT3V0T2ZPZmZpY2UgICAgID0+IFsxXSwKICAgICAgICAgICAgICAgIFRyYW5zcG9ydHMgICAgICAgICAgICA9PiBbJ0VtYWlsJ10sCiAgICAgICAgICAgICAgICBBZ2VudEVuYWJsZWRCeURlZmF1bHQgPT4gWydFbWFpbCddLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNZXNzYWdlID0+IHsKICAgICAgICAgICAgICAgICdkZScgPT4gewogICAgICAgICAgICAgICAgICAgICdCb2R5JyA9PiAnSGFsbG8gJmx0O09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF9Vc2VyRmlyc3RuYW1lJmd0Oyw8YnIgLz4KPGJyIC8+ClRlcm1pbiAmcXVvdDsmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDsmcXVvdDsgaGF0IHNlaW5lIEJlbmFjaHJpY2h0aWd1bmdzemVpdCBlcnJlaWNodC48YnIgLz4KPGJyIC8+CkJlc2NocmVpYnVuZzogJmx0O09UUlNfQVBQT0lOVE1FTlRfREVTQ1JJUFRJT04mZ3Q7PGJyIC8+ClN0YW5kb3J0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9MT0NBVElPTiZndDs8YnIgLz4KS2FsZW5kZXI6IDxzcGFuIHN0eWxlPSJjb2xvcjogJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7OyI+4pagPC9zcGFuPiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7PGJyIC8+ClN0YXJ0emVpdHB1bmt0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9TVEFSVFRJTUUmZ3Q7PGJyIC8+CkVuZHplaXRwdW5rdDogJmx0O09UUlNfQVBQT0lOVE1FTlRfRU5EVElNRSZndDs8YnIgLz4KR2FuenTDpGdpZzogJmx0O09UUlNfQVBQT0lOVE1FTlRfQUxMREFZJmd0OzxiciAvPgpXaWVkZXJob2x1bmc6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1JFQ1VSUklORyZndDs8YnIgLz4KPGJyIC8+CjxhIGhyZWY9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7IiB0aXRsZT0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiPiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7PC9hPjxiciAvPgo8YnIgLz4KLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7JywKICAgICAgICAgICAgICAgICAgICAnQ29udGVudFR5cGUnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JyAgICAgPT4gJ0VyaW5uZXJ1bmc6IDxPVFJTX0FQUE9JTlRNRU5UX1RJVExFPicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2VuJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0JvZHknID0+ICdIaSAmbHQ7T1RSU19OT1RJRklDQVRJT05fUkVDSVBJRU5UX1VzZXJGaXJzdG5hbWUmZ3Q7LDxiciAvPgo8YnIgLz4KYXBwb2ludG1lbnQgJnF1b3Q7Jmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEUmZ3Q7JnF1b3Q7IGhhcyByZWFjaGVkIGl0cyBub3RpZmljYXRpb24gdGltZS48YnIgLz4KPGJyIC8+CkRlc2NyaXB0aW9uOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9ERVNDUklQVElPTiZndDs8YnIgLz4KTG9jYXRpb246ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0xPQ0FUSU9OJmd0OzxiciAvPgpDYWxlbmRhcjogPHNwYW4gc3R5bGU9ImNvbG9yOiAmbHQ7T1RSU19DQUxFTkRBUl9DT0xPUiZndDs7Ij7ilqA8L3NwYW4+ICZsdDtPVFJTX0NBTEVOREFSX0NBTEVOREFSTkFNRSZndDs8YnIgLz4KU3RhcnQgZGF0ZTogJmx0O09UUlNfQVBQT0lOVE1FTlRfU1RBUlRUSU1FJmd0OzxiciAvPgpFbmQgZGF0ZTogJmx0O09UUlNfQVBQT0lOVE1FTlRfRU5EVElNRSZndDs8YnIgLz4KQWxsLWRheTogJmx0O09UUlNfQVBQT0lOVE1FTlRfQUxMREFZJmd0OzxiciAvPgpSZXBlYXQ6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1JFQ1VSUklORyZndDs8YnIgLz4KPGJyIC8+CjxhIGhyZWY9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7IiB0aXRsZT0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiPiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7PC9hPjxiciAvPgo8YnIgLz4KLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7JywKICAgICAgICAgICAgICAgICAgICAnQ29udGVudFR5cGUnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JyAgICAgPT4gJ1JlbWluZGVyOiA8T1RSU19BUFBPSU5UTUVOVF9USVRMRT4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdodScgPT4gewogICAgICAgICAgICAgICAgICAgICdCb2R5JyA9PiAnS2VkdmVzICZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfVXNlckZpcnN0bmFtZSZndDshPGJyIC8+CjxiciAvPgpBIGvDtnZldGtlesWRIGVzZW3DqW55IGVsw6lydGUgYXogw6lydGVzw610w6lzaSBpZGVqw6l0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDs8YnIgLz4KPGJyIC8+Ckxlw61yw6FzOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9ERVNDUklQVElPTiZndDs8YnIgLz4KSGVseTogJmx0O09UUlNfQVBQT0lOVE1FTlRfTE9DQVRJT04mZ3Q7PGJyIC8+Ck5hcHTDoXI6IDxzcGFuIHN0eWxlPSJjb2xvcjogJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7OyI+4pagPC9zcGFuPiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7PGJyIC8+CktlemTDqXNpIGTDoXR1bTogJmx0O09UUlNfQVBQT0lOVE1FTlRfU1RBUlRUSU1FJmd0OzxiciAvPgpCZWZlamV6w6lzaSBkw6F0dW06ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0VORFRJTUUmZ3Q7PGJyIC8+CkVnw6lzeiBuYXBvczogJmx0O09UUlNfQVBQT0lOVE1FTlRfQUxMREFZJmd0OzxiciAvPgpJc23DqXRsxZFkw6lzOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9SRUNVUlJJTkcmZ3Q7PGJyIC8+CjxiciAvPgo8YSBocmVmPSImbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OyIgdGl0bGU9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7Ij4mbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OzwvYT48YnIgLz4KPGJyIC8+Ci0tICZsdDtPVFJTX0NPTkZJR19Ob3RpZmljYXRpb25TZW5kZXJOYW1lJmd0OycsCiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnRUeXBlJyA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgICAgICAgICAnU3ViamVjdCcgICAgID0+ICdFbWzDqWtlenRldMWROiA8T1RSU19BUFBPSU5UTUVOVF9USVRMRT4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdzcl9DeXJsJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0JvZHknID0+ICfQl9C00YDQsNCy0L4gJmx0O09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF9Vc2VyRmlyc3RuYW1lJmd0Oyw8YnIgLz4KPGJyIC8+CtCy0YDQtdC80LUg0ZjQtSDQt9CwINC+0LHQsNCy0LXRiNGC0LXRmtC1INGDINCy0LXQt9C4INGC0LXRgNC80LjQvdCwICZxdW90OyZsdDtPVFJTX0FQUE9JTlRNRU5UX1RJVExFJmd0OyZxdW90Oy48YnIgLz4KPGJyIC8+CtCe0L/QuNGBOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9ERVNDUklQVElPTiZndDs8YnIgLz4K0JvQvtC60LDRhtC40ZjQsDogJmx0O09UUlNfQVBQT0lOVE1FTlRfTE9DQVRJT04mZ3Q7PGJyIC8+CtCa0LDQu9C10L3QtNCw0YA6IDxzcGFuIHN0eWxlPSJjb2xvcjogJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7OyI+4pagPC9zcGFuPiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7PGJyIC8+CtCU0LDRgtGD0Lwg0L/QvtGH0LXRgtC60LA6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1NUQVJUVElNRSZndDs8YnIgLz4K0JTQsNGC0YPQvCDQutGA0LDRmNCwOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9FTkRUSU1FJmd0OzxiciAvPgrQptC10LvQvtC00L3QtdCy0L3QvjogJmx0O09UUlNfQVBQT0lOVE1FTlRfQUxMREFZJmd0OzxiciAvPgrQn9C+0L3QsNCy0ZnQsNGa0LU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1JFQ1VSUklORyZndDs8YnIgLz4KPGJyIC8+CjxhIGhyZWY9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7IiB0aXRsZT0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiPiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7PC9hPjxiciAvPgo8YnIgLz4KLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7JywKICAgICAgICAgICAgICAgICAgICAnQ29udGVudFR5cGUnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JyAgICAgPT4gJ9Cf0L7QtNGB0LXRgtC90LjQujogPE9UUlNfQVBQT0lOVE1FTlRfVElUTEU+JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnc3JfTGF0bicgPT4gewogICAgICAgICAgICAgICAgICAgICdCb2R5JyA9PiAnWmRyYXZvICZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfVXNlckZpcnN0bmFtZSZndDssPGJyIC8+CjxiciAvPgp2cmVtZSBqZSB6YSBvYmF2ZcWhdGVuamUgdSB2ZXppIHRlcm1pbmEgJnF1b3Q7Jmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEUmZ3Q7JnF1b3Q7LjxiciAvPgo8YnIgLz4KT3BpczogJmx0O09UUlNfQVBQT0lOVE1FTlRfREVTQ1JJUFRJT04mZ3Q7PGJyIC8+Ckxva2FjaWplOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9MT0NBVElPTiZndDs8YnIgLz4KS2FsZW5kYXI6IDxzcGFuIHN0eWxlPSJjb2xvcjogJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7OyI+4pagPC9zcGFuPiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7PGJyIC8+CkRhdHVtIHBvxI1ldGthOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9TVEFSVFRJTUUmZ3Q7PGJyIC8+CkRhdHVtIGtyYWphOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9FTkRUSU1FJmd0OzxiciAvPgpDZWxvZG5ldm5vOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9BTExEQVkmZ3Q7PGJyIC8+ClBvbmF2bGphbmplOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9SRUNVUlJJTkcmZ3Q7PGJyIC8+CjxiciAvPgo8YSBocmVmPSImbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OyIgdGl0bGU9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7Ij4mbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OzwvYT48YnIgLz4KPGJyIC8+Ci0tICZsdDtPVFJTX0NPTkZJR19Ob3RpZmljYXRpb25TZW5kZXJOYW1lJmd0OycsCiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnRUeXBlJyA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgICAgICAgICAnU3ViamVjdCcgICAgID0+ICdQb2RzZXRuaWs6IDxPVFJTX0FQUE9JTlRNRU5UX1RJVExFPicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50Jyk7CgogICAgIyBHZXQgYWxsIG5vdGlmaWNhdGlvbnMgb2YgYXBwb2ludG1lbnQgdHlwZS4KICAgIG15ICVOb3RpZmljYXRpb25MaXN0ID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25MaXN0KAogICAgICAgIFR5cGUgPT4gJ0FwcG9pbnRtZW50JywKICAgICk7CiAgICBteSAlTm90aWZpY2F0aW9uTGlzdFJldmVyc2UgPSByZXZlcnNlICVOb3RpZmljYXRpb25MaXN0OwoKICAgIE5FV05PVElGSUNBVElPTjoKICAgIGZvciBteSAkTm90aWZpY2F0aW9uTmFtZSAoIHNvcnQga2V5cyAlQXBwb2ludG1lbnROb3RpZmljYXRpb25zICkgewoKICAgICAgICAjIERvIG5vdCBhZGQgbmV3IG5vdGlmaWNhdGlvbiBpZiBvbmUgd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXN0cy4KICAgICAgICBuZXh0IE5FV05PVElGSUNBVElPTiBpZiAkTm90aWZpY2F0aW9uTGlzdFJldmVyc2V7JE5vdGlmaWNhdGlvbk5hbWV9OwoKICAgICAgICAjIEFkZCBuZXcgZXZlbnQgbm90aWZpY2F0aW9uLgogICAgICAgIG15ICRJRCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICROb3RpZmljYXRpb25OYW1lLAogICAgICAgICAgICBEYXRhICAgID0+ICRBcHBvaW50bWVudE5vdGlmaWNhdGlvbnN7JE5vdGlmaWNhdGlvbk5hbWV9LT57RGF0YX0sCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJEFwcG9pbnRtZW50Tm90aWZpY2F0aW9uc3skTm90aWZpY2F0aW9uTmFtZX0tPntNZXNzYWdlfSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISRJRDsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
JVBERi0xLjQKJaqrrK0KMSAwIG9iago8PAovQ3JlYXRvciAoQXBhY2hlIEZPUCBWZXJzaW9uIDIuMSkKL1Byb2R1Y2VyIChBcGFjaGUgRk9QIFZlcnNpb24gMi4xKQovQ3JlYXRpb25EYXRlIChEOjIwMTkwMjI2MDEzOTM1WikKPj4KZW5kb2JqCjIgMCBvYmoKPDwKICAvTiAzCiAgL0xlbmd0aCAzIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nO2ZZ1BUWRaA73uvc6Chu2kyNDlJlNCA5JwkSBYV6G4yLTQ5mJDBERhBRCQpgogCDjg6BBlFRRQDoqCAeRoZBJRxcBRRUVnAH7NVu7VbW7W1f7bPj/e+OufWO+e+ulXvq3oAyJDi2QnJsD4ACbwUvq+zHTMoOISJvQ9wgAxIgAow4ezkRFtvbw+wHCtrwT/E+1EArdzv6fzz+r8MEieBxwEAoi9zLIebzF7mncsczUngrOSnVzg9JTEFANh7men85QGXmbPCEd84Y4WjvnHR6ho/X/tlPgoAjhS1yoRTKxyxytSuFWZH8xMAkO5bXq/CTuQvP196pZfitxlWQ3RlP8woLo/LD0/hcpj/4db+ffxdL3Ty8sv/rzf4H/dZOTvf6K3l6pmAGBV/5baWAcB6DQBS8ldO5TAAlN0AdPT8lYs4DkBnCQCSz9ip/LRvOdTq7IAAKIAOpIA8UAYaQAcYAlNgAWyAI3ADXsAPBIPNgA2iQQLgg3SQA3aBfFAISsBBUAVqQQNoAq3gDOgE58FlcA3cAnfBCHgMBGASvAJz4D1YhCAIC5EhGiQFKUCqkDZkCLEgK8gR8oB8oWAoDIqCeFAqlAPthgqhUqgKqoOaoJ+gc9Bl6AY0BD2ExqEZ6E/oE4zAJJgOy8FqsB7Mgm1hd9gP3gRHwUlwFpwH74Mr4Hr4FNwBX4ZvwSOwAH4FzyMAISIMRBHRQViIPeKFhCCRCB/ZjhQg5Ug90op0I/3IPUSAzCIfURgUDcVE6aAsUC4ofxQblYTajipCVaFOojpQfah7qHHUHOormoyWRWujzdGu6CB0FDodnY8uRzei29FX0SPoSfR7DAbDwKhjTDEumGBMLCYbU4Q5jGnDXMIMYSYw81gsVgqrjbXEemHDsSnYfGwl9hT2InYYO4n9gCPiFHCGOCdc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IG9iagpbL0lDQ0Jhc2VkIDIgMCBSXQplbmRvYmoKNSAwIG9iago8PAogIC9UeXBlIC9NZXRhZGF0YQogIC9TdWJ0eXBlIC9YTUwKICAvTGVuZ3RoIDYgMCBSCj4+CnN0cmVhbQo8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPgo8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgo8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgcmRmOmFib3V0PSIiPgo8ZGM6Zm9ybWF0PmFwcGxpY2F0aW9uL3BkZjwvZGM6Zm9ybWF0Pgo8ZGM6bGFuZ3VhZ2U+ZW48L2RjOmxhbmd1YWdlPgo8ZGM6ZGF0ZT4yMDE5LTAyLTI2VDAxOjM5OjM1WjwvZGM6ZGF0ZT4KPC9yZGY6RGVzY3JpcHRpb24+CjxyZGY6RGVzY3JpcHRpb24geG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvIiByZGY6YWJvdXQ9IiI+CjxwZGY6UHJvZHVjZXI+QXBhY2hlIEZPUCBWZXJzaW9uIDIuMTwvcGRmOlByb2R1Y2VyPgo8cGRmOlBERlZlcnNpb24+MS40PC9wZGY6UERGVmVyc2lvbj4KPC9yZGY6RGVzY3JpcHRpb24+CjxyZGY6RGVzY3JpcHRpb24geG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiByZGY6YWJvdXQ9IiI+Cjx4bXA6Q3JlYXRvclRvb2w+QXBhY2hlIEZPUCBWZXJzaW9uIDIuMTwveG1wOkNyZWF0b3JUb29sPgo8eG1wOk1ldGFkYXRhRGF0ZT4yMDE5LTAyLTI2VDAxOjM5OjM1WjwveG1wOk1ldGFkYXRhRGF0ZT4KPHhtcDpDcmVhdGVEYXRlPjIwMTktMDItMjZUMDE6Mzk6MzVaPC94bXA6Q3JlYXRlRGF0ZT4KPC9yZGY6RGVzY3JpcHRpb24+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b1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago1NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDY2Ny42MjkgMTU1Ljc1NCA2NzcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDU2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjU4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNjY3LjYyOSA1MzkuOTk4IDY3Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTkgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjggMCBSIC9YWVogNzIuMCA3MDAuOCBudWxsXQo+PgplbmRvYmoKNjAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjU1LjYyOSAyOTQuNjc3IDY2NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTkgMCBSCi9IIC9JCgo+PgplbmRvYmoKNjEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA2NTUuNjI5IDUzOS45OTggNjY1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1OSAwIFIKL0ggL0kKCj4+CmVuZG9iago2MiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDYyNC4yNyBudWxsXQo+PgplbmRvYmoKNjMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjQzLjYyOSAyMjEuNDg3IDY1My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNjIgMCBSCi9IIC9JCgo+PgplbmRvYmoKNjQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA2NDMuNjI5IDUzOS45OTggNjUzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2MiAwIFIKL0ggL0kKCj4+CmVuZG9iago2NSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDQ3Ny42OSBudWxsXQo+PgplbmRvYmoKNjYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjMxLjYyOSAzMTcuNTkzIDY0MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNjUgMCBSCi9IIC9JCgo+PgplbmRvYmoKNjcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA2MzEuNjI5IDUzOS45OTggNjQxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2NSAwIFIKL0ggL0kKCj4+CmVuZG9iago2OCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDIyNy4wMSBudWxsXQo+PgplbmRvYmoKNjkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjE5LjYyOSAyNDEuOTc2IDYyOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNjggMCBSCi9IIC9JCgo+PgplbmRvYmoKNzAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA2MTkuNjI5IDUzOS45OTggNjI5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2OCAwIFIKL0ggL0kKCj4+CmVuZG9iago3MSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDEyNi40OCBudWxsXQo+PgplbmRvYmoKNzIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjA3LjYyOSAxODAuNTYgNjE3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA3MSAwIFIKL0ggL0kKCj4+CmVuZG9iago3MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDYwNy42MjkgNTM5Ljk5OCA2MTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDcxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjc0IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzMxIDAgUiAvWFlaIDcyLjAgNjYyLjAgbnVsbF0KPj4KZW5kb2JqCjc1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU5NS42MjkgMzU5LjU1NSA2MDUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDc0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjc2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgNTk1LjYyOSA1MzkuOTk3IDYwNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNzQgMCBSCi9IIC9JCgo+PgplbmRvYmoKNzcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzEgMCBSIC9YWVogNzIuMCA1NDkuNiBudWxsXQo+PgplbmRvYmoKNzggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTgzLjYyOSAyNjkuMzcyIDU5My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNzcgMCBSCi9IIC9JCgo+PgplbmRvYmoKNzkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjk4OCA1ODMuNjI5IDU0MC4zNDggNTkzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA3NyAwIFIKL0ggL0kKCj4+CmVuZG9iago4MCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszMSAwIFIgL1hZWiA3Mi4wIDQ3MS4yIG51bGxdCj4+CmVuZG9iago4MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1NzEuNjI5IDI2My4zMDkgNTgxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA4MCAwIFIKL0ggL0kKCj4+CmVuZG9iago4MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg4IDU3MS42MjkgNTQwLjM0OCA1ODEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDgwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjgzIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzMxIDAgUiAvWFlaIDcyLjAgMzA0LjggbnVsbF0KPj4KZW5kb2JqCjg0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU1OS42MjkgMzUzLjkxOCA1NjkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDgzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjg1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNTU5LjYyOSA1MzkuOTk4IDU2OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODMgMCBSCi9IIC9JCgo+PgplbmRvYmoKODYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzQgMCBSIC9YWVogNzIuMCA3MjAuMCBudWxsXQo+PgplbmRvYmoKODcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA1NDcuNjI5IDIwNC45NzYgNTU3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA4NiAwIFIKL0ggL0kKCj4+CmVuZG9iago4OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDU0Ny42MjkgNTM5Ljk5OCA1NTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDg2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjg5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzM0IDAgUiAvWFlaIDcyLjAgNzAwLjggbnVsbF0KPj4KZW5kb2JqCjkwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDUzNS42MjkgMTczLjQwOCA1NDUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDg5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjkxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNTM1LjYyOSA1MzkuOTk4IDU0NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODkgMCBSCi9IIC9JCgo+PgplbmRvYmoKOTIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzQgMCBSIC9YWVogNzIuMCA2MjYuNCBudWxsXQo+PgplbmRvYmoKOTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTIzLjYyOSAxNjQuOTEzIDUzMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgOTIgMCBSCi9IIC9JCgo+PgplbmRvYmoKOTQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjgwNyA1MjMuNjI5IDU0MC4xNjcgNTMzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA5MiAwIFIKL0ggL0kKCj4+CmVuZG9iago5NSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszNCAwIFIgL1hZWiA3Mi4wIDU1OC4wIG51bGxdCj4+CmVuZG9iago5NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1MTEuNjI5IDIwOS41NTIgNTIxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA5NSAwIFIKL0ggL0kKCj4+CmVuZG9iago5NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDUxMS42MjkgNTM5Ljk5OCA1MjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDk1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjk4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzM0IDAgUiAvWFlaIDcyLjAgNDg5LjYgbnVsbF0KPj4KZW5kb2JqCjk5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDQ5OS42MjkgMjIxLjc5NCA1MDkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDk4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwMCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQ5OS42MjkgNTM5Ljk5OCA1MDkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDk4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwMSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MCAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iagoxMDIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA0ODcuNjI5IDE0OS4zOSA0OTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEwMSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMDMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA0ODcuNjI5IDUzOS45OTggNDk3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMDEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTA0IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQwIDAgUiAvWFlaIDcyLjAgNjc4LjggbnVsbF0KPj4KZW5kb2JqCjEwNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0NzUuNjI5IDE5OS4wMDYgNDg1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMDQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTA2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNDc1LjYyOSA1MzkuOTk4IDQ4NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTA0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwNyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MCAwIFIgL1hZWiA3Mi4wIDYwMi40IG51bGxdCj4+CmVuZG9iagoxMDggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDYzLjYyOSAxOTQuNjQxIDQ3My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTA3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQ2My42MjkgNTM5Ljk5OCA0NzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEwNyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTAgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA3MjAuMCBudWxsXQo+PgplbmRvYmoKMTExIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgNDUxLjYyOSAxNjEuNzg0IDQ2MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTEwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjExMiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQ1MS42MjkgNTM5Ljk5OCA0NjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExMCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA2NjcuNjUyIG51bGxdCj4+CmVuZG9iagoxMTQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDM5LjYyOSAzMzUuOTk0IDQ0OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTEzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjExNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDQzOS42MjkgNTM5Ljk5NyA0NDkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExMyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA2MDUuNDY3IG51bGxdCj4+CmVuZG9iagoxMTcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDI3LjYyOSA0MTcuOTU5IDQzNy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTE2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjExOCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQyNy42MjkgNTM5Ljk5OCA0MzcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExNiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTkgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA1NDMuMjgyIG51bGxdCj4+CmVuZG9iagoxMjAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDE1LjYyOSAzNDYuNTMyIDQyNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTE5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEyMSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQxNS42MjkgNTM5Ljk5OCA0MjUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExOSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMjIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA0ODEuMDk3IG51bGxdCj4+CmVuZG9iagoxMjMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDAzLjYyOSAzNDQuNjYgNDEzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMjIgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTI0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgNDAzLjYyOSA1MzkuOTk3IDQxMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTIyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjEyNSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDQxOC45MTIgbnVsbF0KPj4KZW5kb2JqCjEyNiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzOTEuNjI5IDM5MS45MTMgNDAxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMjUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTI3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMzkxLjYyOSA1MzkuOTk3IDQwMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTI1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEyOCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDM1Ni43MjcgbnVsbF0KPj4KZW5kb2JqCjEyOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNzkuNjI5IDQxMS41MzUgMzg5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMjggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTMwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMzc5LjYyOSA1MzkuOTk3IDM4OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTI4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEzMSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDI5NC41NDIgbnVsbF0KPj4KZW5kb2JqCjEzMiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNjcuNjI5IDM2MC4yOTggMzc3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTMzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMzY3LjYyOSA1MzkuOTk3IDM3Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTMxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjEzNCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDIzMi4zNTcgbnVsbF0KPj4KZW5kb2JqCjEzNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNTUuNjI5IDM1Mi42MTggMzY1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTM2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMzU1LjYyOSA1MzkuOTk3IDM2NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTM0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEzNyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDE0Ni4xNzIgbnVsbF0KPj4KZW5kb2JqCjEzOCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNDMuNjI5IDMxMy4xNTUgMzUzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTM5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMzQzLjYyOSA1MzkuOTk3IDM1My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTM3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0MCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iagoxNDEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMzMxLjYyOSAzNTYuODczIDM0MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg3IDMzMS42MjkgNTQwLjM0NyAzNDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE0MCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNDMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYgMCBSIC9YWVogNzIuMCA2NjIuMzUgbnVsbF0KPj4KZW5kb2JqCjE0NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzMTkuNjI5IDI5OC4wNjQgMzI5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDMgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQ1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggMzE5LjYyOSA1MzkuOTk4IDMyOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0NiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDU5OC45MjUgbnVsbF0KPj4KZW5kb2JqCjE0NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzMDcuNjI5IDM5Mi4yOTIgMzE3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDYgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQ4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy44MDcgMzA3LjYyOSA1NDAuMTY3IDMxNy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQ2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0OSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDQ5OS41IG51bGxdCj4+CmVuZG9iagoxNTAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjk1LjYyOSA1MDcuODI2IDMwNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQ5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE1MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuMDQ1IDI5NS42MjkgNTQwLjQwNSAzMDUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE0OSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNTIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYgMCBSIC9YWVogNzIuMCA0MDkuNjc1IG51bGxdCj4+CmVuZG9iagoxNTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjgzLjYyOSA0NzUuMTI0IDI5My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTUyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE1NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg3IDI4My42MjkgNTQwLjM0NyAyOTMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE1MiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNTUgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYgMCBSIC9YWVogNzIuMCAzMTkuODUgbnVsbF0KPj4KZW5kb2JqCjE1NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyNzEuNjI5IDQ3OS42MDYgMjgxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNTUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTU3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODggMjcxLjYyOSA1NDAuMzQ4IDI4MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTU1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE1OCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDIzMC4wMjUgbnVsbF0KPj4KZW5kb2JqCjE1OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyNTkuNjI5IDQ3OC44NjkgMjY5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNTggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTYwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODcgMjU5LjYyOSA1NDAuMzQ3IDI2OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTU4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE2MSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDE0MC4yIG51bGxdCj4+CmVuZG9iagoxNjIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjQ3LjYyOSA0ODEuNTc5IDI1Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTYxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE2MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg3IDI0Ny42MjkgNTQwLjM0NyAyNTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE2MSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNjQgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCA3MDguMCBudWxsXQo+PgplbmRvYmoKMTY1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDIzNS42MjkgNDA4Ljg1NyAyNDUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE2NCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNjYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjk4NyAyMzUuNjI5IDU0MC4zNDcgMjQ1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNjQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTY3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ5IDAgUiAvWFlaIDcyLjAgNjMwLjQ5OCBudWxsXQo+PgplbmRvYmoKMTY4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDIyMy42MjkgNDQ4LjEyIDIzMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTY3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE2OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDIyMy42MjkgNTM5Ljk5NyAyMzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE2NyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNzAgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCA1NjQuOTk2IG51bGxdCj4+CmVuZG9iagoxNzEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjExLjYyOSAyNTEuMDIxIDIyMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTcwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDIxMS42MjkgNTM5Ljk5NyAyMjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE3MCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNzMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCA0OTkuNDk0IG51bGxdCj4+CmVuZG9iagoxNzQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMTk5LjYyOSA0MzMuNzg3IDIwOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTczIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3NSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDE5OS42MjkgNTM5Ljk5NyAyMDkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE3MyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNzYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCA0MzMuOTkyIG51bGxdCj4+CmVuZG9iagoxNzcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMTg3LjYyOSA0NzUuMzEzIDE5Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTc2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg4IDE4Ny42MjkgNTQwLjM0OCAxOTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE3NiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNzkgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCAzNDIuMDkgbnVsbF0KPj4KZW5kb2JqCjE4MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxNzUuNjI5IDM4Ni43ODQgMTg1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNzkgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTgxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODcgMTc1LjYyOSA1NDAuMzQ3IDE4NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTc5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE4MiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDIyOC41ODggbnVsbF0KPj4KZW5kb2JqCjE4MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxNjMuNjI5IDM5MC4zNCAxNzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE4MiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxODQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjk4NyAxNjMuNjI5IDU0MC4zNDcgMTczLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODIgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTg1IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ5IDAgUiAvWFlaIDcyLjAgMTE1LjA4NiBudWxsXQo+PgplbmRvYmoKMTg2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDE1MS42MjkgNDE3LjUyMSAxNjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE4NSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxODcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyAxNTEuNjI5IDUzOS45OTcgMTYxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTg4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzUyIDAgUiAvWFlaIDcyLjAgNzA4LjAgbnVsbF0KPj4KZW5kb2JqCjE4OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMzkuNjI5IDQxMy4wMTkgMTQ5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTkwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMTM5LjYyOSA1MzkuOTk3IDE0OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTg4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE5MSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDYzMS41MDEgbnVsbF0KPj4KZW5kb2JqCjE5MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMjcuNjI5IDQ0Mi45MjMgMTM3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTkzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC4yODcgMTI3LjYyOSA1NDAuNjQ3IDEzNy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTkxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE5NCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDU1NS4wMDIgbnVsbF0KPj4KZW5kb2JqCjE5NSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMTUuNjI5IDQyNC4yNzQgMTI1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTk2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMTE1LjYyOSA1MzkuOTk3IDEyNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTk0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE5NyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDQ3OC41MDMgbnVsbF0KPj4KZW5kb2JqCjE5OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMDMuNjI5IDQwMi4xMTIgMTEzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTk5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMTAzLjYyOSA1MzkuOTk3IDExMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTk3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjIwMCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDQwMi4wMDQgbnVsbF0KPj4KZW5kb2JqCjIwMSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA5MS42MjkgNDAyLjExMiAxMDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDIwMCAwIFIKL0ggL0kKCj4+CmVuZG9iagoyMDIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA5MS42MjkgNTM5Ljk5NyAxMDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDIwMCAwIFIKL0ggL0kKCj4+CmVuZG9iagoyMDMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNTIgMCBSIC9YWVogNzIuMCAzMjUuNTA1IG51bGxdCj4+CmVuZG9iagoyMDQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNzkuNjI5IDM1Ni4wNDUgODkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDIwMyAwIFIKL0ggL0kKCj4+CmVuZG9iagoyMDUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA3OS42MjkgNTM5Ljk5NyA4OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMjAzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjIwNiAwIG9iago8PCAvTGVu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8s85wF1/+e/f/vMP/+MH9+0//PAP/2g//S/28/ztf/0wj/HlY/6Tnf55AfPX4tmOcq/y9Z/u+KtyhgccZ+e+/bcffvrjD3//3b5T77798b8eN+lVZyl3++a9gbAgCPVezGAN4x5vU0jwniq/75uC//1vti44FQplbmRzdHJlYW0KZW5kb2JqCjIwNyAwIG9iagoyMjU3NQplbmRvYmoKMjA4IDAgb2JqClsKNTQgMCBSCjU1IDAgUgo1NyAwIFIKNTggMCBSCjYwIDAgUgo2MSAwIFIKNjMgMCBSCjY0IDAgUgo2NiAwIFIKNjcgMCBSCjY5IDAgUgo3MCAwIFIKNzIgMCBSCjczIDAgUgo3NSAwIFIKNzYgMCBSCjc4IDAgUgo3OSAwIFIKODEgMCBSCjgyIDAgUgo4NCAwIFIKODUgMCBSCjg3IDAgUgo4OCAwIFIKOTAgMCBSCjkxIDAgUgo5MyAwIFIKOTQgMCBSCjk2IDAgUgo5NyAwIFIKOTkgMCBSCjEwMCAwIFIKMTAyIDAgUgoxMDMgMCBSCjEwNSAwIFIKMTA2IDAgUgoxMDggMCBSCjEwOSAwIFIKMTExIDAgUgoxMTIgMCBSCjExNCAwIFIKMTE1IDAgUgoxMTcgMCBSCjExOCAwIFIKMTIwIDAgUgoxMjEgMCBSCjEyMyAwIFIKMTI0IDAgUgoxMjYgMCBSCjEyNyAwIFIKMTI5IDAgUgoxMzAgMCBSCjEzMiAwIFIKMTMzIDAgUgoxMzUgMCBSCjEzNiAwIFIKMTM4IDAgUgoxMzkgMCBSCjE0MSAwIFIKMTQyIDAgUgoxNDQgMCBSCjE0NSAwIFIKMTQ3IDAgUgoxNDggMCBSCjE1MCAwIFIKMTUxIDAgUgoxNTMgMCBSCjE1NCAwIFIKMTU2IDAgUgoxNTcgMCBSCjE1OSAwIFIKMTYwIDAgUgoxNjIgMCBSCjE2MyAwIFIKMTY1IDAgUgoxNjYgMCBSCjE2OCAwIFIKMTY5IDAgUgoxNzEgMCBSCjE3MiAwIFIKMTc0IDAgUgoxNzUgMCBSCjE3NyAwIFIKMTc4IDAgUgoxODAgMCBSCjE4MSAwIFIKMTgzIDAgUgoxODQgMCBSCjE4NiAwIFIKMTg3IDAgUgoxODkgMCBSCjE5MCAwIFIKMTkyIDAgUgoxOTMgMCBSCjE5NSAwIFIK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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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dHJlYW0KeJztwTEBAAAAwqD+qWcLL6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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JEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouRb/BQCAAAAoAjHQrDMJEo+lRJOooSTKOEkSr7ilZpCsMwkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLky5hCnD156IkTp0fvnj7xRM+hk2c3+drCBdp347aBG/dVTpYoeU7tua6WqUoJ0U1zbBypRIkxivS6PafGp0qUBPVNaG0zKlGCjEvd3J2mC5hCdGcQT4ymEOOJxMRsYjOuLVyIyl7dxA6eREnT3/abQhBo3431eyRDEiXEONHOW5U5hESJI1FCjdPs3iPdzErXPYU4e/LQoRMnxvOG0ycaBhKbdW1ho+pjCImSpdPndTfe6FgIEnXrrD6+PCJRMsyak0mUNPUZhETJUftVX9uotj2F6M4gTp6tjBv6Jww+evpE/VkZblOkcSwEwfqbfs/IINP4iW0O1yFRbwu650bPyCDd5K95iRIk9FiI4cihMoWoDR5MIQg2eJaTeyaEGo6fTSGIVLs7UnuwRKJE6P2WHz/90uHuhJo8EOK8RMmyr2ma2+oUYnzYg2Mh2LpqG3+JkmJ8n9kUgi2gepimRIkweSCx3/VEahhCSJQY1UccutOIiGdk9F+Usqo3cfC6EGwx7jwTaPqls0d3UlRKIBtS8uy70RSCeE1DCIkSoxbo5m5IN/yXOrtv9w+A8DcyCLXAGxRsmGMhiFTbdnYq9TK/xBkPxzwjg1DNL/MrUVJEHgtRMTFvOH2icmxEldsUISoPNHtdCMKZQhDKhpR4o9dQ3dw/cw8XqvFQCImSZPxa1Jv7u/6CphBr5TZFOImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSzxQCCpIo+VRKOIkSTqKEkyj5TCGgIImST6WEkyjhJEo4iZLPFAIKkij5VEo4iRJOooSTKPlMIaAgiZJPpYSTKOEkSjiJks8UAgqSKPlUSjiJEk6ihJMo+UwhoCCJkk+lhJMo4SRKOImSb/FTCAAAAIAiNvtYiPfPPWZZsWuDhcMCqJRwEiWcRAknUfIVr9QUwlrmZbNPPpUSTqKEkyjhJEo+UwjLKrhs9smnUsJJlHASJZxEyZcxhTh78tATJ06vfpophNXaev7vrtv21/vHp9z8yW09f/l3/1Y5m80+LTu157ptN+6be4pKac1Ejd13B6qNSpTWTCS678amQiVKe6Z/yzedKlHaVO+x8qu+ti1NmEJ05w1P1CcOp0888cTkaedNIay21mN/3bvhjKYQd371L7d98rHu2//2pcu3/e3No3Pa7NOmwR3m6bvQ7j8TYLLGzvvX7TnVe7N7H2X4tkRpy0SilTvSE/t4EqUdTb/Tzw/38kwhiDBVaeeE6cHZ+YQpxNmThw6dOFE57qE3gTh08rRjIayItf9vOzely7/6WPVYiJs/OXq7foyEzT5t6W31r9uzb3xfefqUPpWyeA011u+XVN+TKIs3a4M5UB9DSJTFm5loJ87rbrzRsRAEaKq0G+joUYaqtqcQ3RnEybOekWHFr+q0ofP2+IkYN39y2+VffX5wNpt9WuYZGSRrPpb4fO24CInSohmJOhaCFJOJ9nfxPCODJLUex09s2+wjdtY1hejPILwuhLUFVnUK8dhfbzOFIJMpBMlmP6O5+kiJRGlN8ya09+he5bE8idKaqWfc99I0hSBJtcfab/jacRFtTiGGMwhTCGsLLMdCsCWYQpCsYQrRfZRk4mBNidIah+sQbmL/blClKQRJZm5IN/fZl2ufQvRflLJqMJMYf9gUwopZz3tdCLYCUwiSNf2NjOl7KhKlNS3deYa1mnjR1LrRpEyitCl+ClHhWAgrftWmDd2/kXHdl+5839/III0pBMkmj9Jc0Otmw1pVE60d/uBYCDL4S53km7kh7Xwg6y91mkJYW2DVj3noHQ7RM35qRnfZ7NMyUwiSzX0UzwPNtG/mn7n3uhBkMIUgX0sb0guaQqyVKYQVvmz2yadSwkmUcBIlnETJZwphWQWXzT75VEo4iRJOooSTKPlMISyr4LLZJ59KCSdRwkmUcBIlnymEZRVcNvvkUynhJEo4iRJOouQzhbCsgstmn3wqJZxECSdRwkmUfKYQllVw2eyTT6WEkyjhJEo4iZLPFMKyCi6bffKNKv3P/3rn5p8f+sgPHrniwTssq8X1V48+0ElRolbskqgVviRq5a9ZlZZiCmEt8zKFIN+o0t2/+NlV3757++EffPjn+yxrEevYD7cf/uH2oz+eOH37wceu+s69ozsnErU2ug48dPkdt13yT7dd9u3/de06Puv+y/7pyx888OT0hyRqtbnW0LNErZbXBiotxRTCWuZlCkG+UaV/9egDnd8I7f/msi7+9eS1+++/4mud+ye7Butre6760fc//LPvXf3QXdcc7p7n2qOP/8W3viFRq8A68MDle3Zdctc3rv7u1y69fdelD39r9UHEz777wfv++7DP2y6978EP/WzyPBK12llr7lmiVmtrY5WWYgphLfMyhSDfqNIrHryj/d9c1sW/ntz+/a9e2tu5u+TOPVd88+tX3P3Fwb7eHZ03vvzBg4NzdoKUqLXh9cOr7+ncGb5/e2+McO2Pv969S/yd7879lB9cfU9lRNZf9zy0feqcErUWvtbXs0StNtZGKy3FFMJa5mUKQb7pOydXffbKbT1/9tn7+qdc8rFtAx+7beLXx/SZp08ZrNs/sq3uA7ev8rvsks/+/VWjdx/9+z/b9pFLNvrL8bYPzL6Q2pfbwCp1ORfn6h7lvuuS279y1f4fjk689uD9lw9299Y0hZDoBtcyJfr9D96165KHHuk+Evez73/oye9e853dl3z9/umRwng9/cBlEyOI7vrKB5+ePKdEV/lyG1jLlOi61vp6lugqX24DS6Kz10YrLcUUwlrmZQpBvsk7J937AFf++aOVN7p3KuqnjH59TJ95+o3J3zjz7h5MnvPq8W/5zh2kD3zsI5N3eEqu2pcLuJyLcj15zcO3XfJP/3jFjx6vnPjY1fd98ZK1TyEkmnI5W2Nd++M7L/2n2y795reu/em9vYNwdl36yP+e9ykH72+aQozLHC2Jzv9yAZdzEa519SzR+V8u4HIuzrXBSksxhbCWeZlCkG/yzkn3rkj/zkPnXkTvUYw5dzymzzx9yvTv7sqdk9GDL4N7HcOHUTqfOPjQ4EGZ/m/8yud2rsPHPvKB6gM306c0PLgzvITOma++8s/6H+rdlxh/ucrldK7V4PTh/Y3JKzznctq+GxC5/veVX911ye1fv6Z24uMfevKRa37UX9/ZPnwC/sz7zxKV6PrWk9f+qHeX+K6vXHp777k/D9171b1fvGTPFy9vfNm0H985NYLorit/PHlOiUo0vGeJSnQrVlqKKYS1zMsUgnwTd066h1kOfhFX7l1U7jNUf3dMn7n502fdOelc7PCXeOcTe3dIBo+qXPXofdXHGvofrb5RPW6z++jJ7U2nVC5/cErtzkn/wu/786v7X3T45caXM/4Wpi9wcE3mXI7VsL51ZWeHbv7x8MM16/6zRCW6/vXktfsfvOqhr13xnUc+9Pgd3anCV2+/8tvd1yeZftm07d/7SuMU4rLvfV+iEs1Ya+1ZohLdipWWYgphLfMyhSDf6g+RzHnUY2MPkYyeWDp+0KF7x2D0AMTot/xtH6ieb3QXYvQwxO0fGXxu/ZTxPZnReap3Tsb3W6bunAw+1Lm/Ubu303yFZ12O1bAeveqOzg7d/7z62OpnXsejeBKV6FrXk9d88x8v2dP9+3FXPjk8bPjb1UOFe6+r1jSFmH6BSolKtO21Ss8SlWjAWnelpZhCWMu8TCHIt+rTRXu/kYe/0Cfub2zw6aK3z3j65+Bxh+Fv+coDEx+e84DIeh8iWf+dk4Yr7M7JOteHvvOl7sPKj35v4vRrf/rd7fU/hrj2ZzRL9MMSXevqDRnu27v96BP9B+O2P/rl2lOEfnLPpY0jiO760lU/eVKiEk1aq/QsUYkGrHVXWoophLXMyxSCfBfy0tmVOx7reOnswWp+uui2bZWniG4b3ZHYtu3qj3zg6vqdnM5djs5v/40/XXT6TkX/8Zc5d06mrvC8y2n/V3/kOvqtK/+5+yzRy775yPZjvX26n/3gmu/2jtL85rfXciyxRCW6kdV/JO6yR3rPTe7UeMdt3bvHtThnr3++85qjEpVo0JrXs0QlmrHWW2kpphDWMi9TCPJt1T8jXj0sc9YpVuY68MDle6b2727/H1fuq/7hjK3/l+4lGroGL5t22X1fu7xzZ/iOr48GC9t/+M/zRhDdddvlPxz/hVmJWgFrZs8flqiVstZXaSmmENYyL1MI8o0q/atHH7j26OOb9juo9HLnZEuvn33/mu927o18sfvS2Xd8+fJv7/3Qkdqx7tsP/+AvvvUNiVqbs57c/qNvXP71L132wP0fOjrjPPu/ccV9e3qTh3+8cn/DGSRqxazmniVqJa11VFqKKYS1zMsUgnyjSm/++aGrvnPvVrp/Yl2ka/vBxz742IOdICVqtbcev+bbX738ri83/jVPiVrhS6JW/ppVaSmmENYyL1MI8lUr7fwuuOLBOyyr3fUX3/rGZ4/s/8//ekeiVuaSqBW+JGrlrzmVFmEKYS3zMoUgn0oJJ1HCSZRwEiWfKYRlFVw2++RTKeEkSjiJEk6i5DOFsKyCy2affColnEQJJ1HCSZR8phCWVXDZ7JNPpYSTKOEkSjiJks8UwrIKLpt98qmUcBIlnEQJJ1HymUJYVsFls08+lRJOooSTKOEkSj5TCMsquGz2yadSwkmUcBIlnETJZwphWQWXzT75VEo4iRJOooSTKPlMISyr4LLZJ59KCSdRwkmUcBIlnymEZRVcNvvkUynhJEo4iRJOouQzhbCsgstmn3wqJZxECSdRwkmUfKYQllVw2eyTT6WEkyjhJEo4iZLPFMKyCi6bffKplHASJZxECSdR8plCWFbBZbNPPpUSTqKEkyjhJEo+UwjLKrhs9smnUsJJlHASJZxEyWcKYVkFl80++VRKOIkSTqKEkyj5TCEsq+Cy2SefSgknUcJJlHASJZ8phGUVXDb75FMp4SRKOIkSTqLkM4WwrILLZp98KiWcRAknUcJJlHymEJZVcNnsk0+lhJMo4SRKOImSzxTCsgoum33yqZRwEiWcRAknUfKZQlhWwWWzTz6VEk6ihJMo4SRKPlMIyyq4bPbJp1LCSZRwEiWcRMlnCmFZBZfNPvlUSjiJEk6ihJMo+UwhLKvgstknn0oJJ1HCSZRwEiWfKYRlFVw2++RTKeEkSjiJEk6i5DOFsKyCy2affColnEQJJ1HCSZR8phCWVXDZ7JNPpYSTKOEkSjiJks8UwrIKLpt98qmUcBIlnEQJJ1HymUJYVsFls08+lRJOooSTKOEkSj5TCMsquGz2yadSwkmUcBIlnETJZwphWQWXzT75VEo4iRJOooSTKPlMISyr4LLZJ59KCSdRwkmUcBIlnymEZRVcNvvkUynhJEo4iRJOouQzhbCsgstmn3wqJZxECSdRwkmUfKYQllVw2eyTT6WEkyjhJEo4iZLPFMKyCi6bffKplHASJZxECSdR8plCWFbBZbNPPpUSTqKEkyjhJEo+UwjLKrhs9smnUsJJlHASJZxEyWcKYVkFl80++VRKOIkSTqKEkyj5TCEsq+Cy2SefSgknUcJJlHASJZ8phGUVXDb75FMp4SRKOIkSTqLkM4WwrILLZp98KiWcRAknUcJJlHymEJZVcNnsk0+lhJMo4SRKOImSzxTCsgoum33yqZRwEiWcRAknUfKZQlhWwWWzTz6VEk6ihJMo4SRKPlMIyyq4bPbJp1LCSZRwEiWcRMlnCmFZBZfNPvlUSjiJEk6ihJMo+UwhLKvgstknn0oJJ1HCSZRwEiWfKYRlFVw2++RTKeEkSjiJEk6i5DOFsKyCy2affColnEQJJ1HCSZR8phCWVXDZ7JNPpYSTKOEkSjiJks8UwrIKLpt98qmUcBIlnEQJJ1HymUJYVsFls08+lRJOooSTKOEkSj5TCMsquGz2yadSwkmUcBIlnETJZwphWQWXzT75VEo4iRJOooSTKPkWP4UAAAAAKGKzj4UoMyuBzSFR8qmUcBIlnEQJJ1HyFa/UFIJlJlHyqZRwEiWcRAknUfKZQkBBEiWfSgknUcJJlHASJV/GFOLsyUNPnDhdfW9gfOLmXFtYq1N7rtt2477Rm3WDD0iUdlUqHb47UWiXSmmNRIlV+dVeyXHfjf2TrttzqnJeidKC5kRHH7IVJUBjpTPSTZhC9KcOw4HD6RNPHDp5dvSB4dubc21hTQZ3Qya3+oMPVe6cSJTWTFY6TrO7+VcprWtIdPCORGlb5Xf5OMfxrt3ETp5EWbjGRIcfMcslQmOlM9Ntfwpx9uShQydOjI6FOH2iegBE/T23KVrQ27pft2ff5Jx5+MHaAyQSpRUNlXY29eM2Ox8f16tSFm8NiW7iPRNYRW0bOXqvcmp9DCFRFq050Zn3USVKCxornZHu+fanEN0ZxMmz9WdkjFWOi9icawtrNXW0W+NpEqVNtSIdC0GeU6YQ5BvWKFFCTT4E5hkZ5JmqdOrEdqcQ/RnE5OtCjD9Yn0G4TdGihilEw+1LorRpslLPaCbM5KCscri7XTwiVKa2tV/yphCEmHhgYXSaKQQ5miqdOrHNKcRwBtE0hTh94onJEcRmXFtYq+kpRNOQT6K0aeKB5lGg4729LpXSmhmvTtk7ntguHq3rbivHIToWgjj1REdMIQjSWGnDiS1OISp/CmOgMpNofIKG2xTtmdrCNx5pJFHaVK3Uo3gEanpqW4+XLqFtvZnY1IMNXheCGA2JVj9kCkGAxkpnpNv260L0VY6FmD2C2IxrC2s1uYWvPUYyIlHa5FgIws156RJ/gIAWNd9JbvprGT0SZdHmjCDOm0KQYT0jiPN5U4jpAyT8jQwiNDzj3hSCMBOVDl8WYuIgOJXSmlmJeukSWlX5a/YTf9Teq+sQYXaiow+bQtCyxkrnpJsxhVgrtynCSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJZwoBBUmUfColnEQJJ1HCSZR8phBQkETJp1LCSZRwEiWcRMlnCgEFSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJZwoBBUmUfColnEQJJ1HCSZR8phBQkETJp1LCSZRwEiWcRMlnCgEFSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJZwoBBUmUfColnEQJJ1HCSZR8phBQkETJp1LCSZRwEiWcRMlnCgEFSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJZwoBBUmUfColnEQJJ1HCSZR8phBQkETJp1LCSZRwEiWcRMlnCgEFSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJZwoBBUmUfColnEQJJ1HCSZR8phBQkETJp1LCSZRwEiWcRMlnCgEFSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJZwoBBUmUfColnEQJJ1HCSZR8phBQkETJp1LCSZRwEiWcRMlnCgEFSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJZwoBBUmUfColnEQJJ1HCSZR8phBQkETJp1LCSZRwEiWcRMlnCgEFSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJZwoBBUmUfColnEQJJ1HCSZR8phBQkETJp1LCSZRwEiWcRMlnCgEFSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJZwoBBUmUfColnEQJJ1HCSZR8phBQkETJp1LCSZRwEiWcRMlnCgEFSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJZwoBBUmUfColnEQJJ1HCSZR8phBQkETJp1LCSZRwEiWcRMlnCgEFSZR8KiWcRAknUcJJlHymEFCQRMmnUsJJlHASJZxEyWcKAQVJlHwqJZxECSdRwkmUfKYQUJBEyadSwkmUcBIlnETJV7zS/w8rnEyfCmVuZHN0cmVhbQplbmRvYmoKMjYzIDAgb2JqCjE0Nzc2CmVuZG9iagoyNjQgMCBvYmoKPDwKICAvTmFtZSAvSW0yMwogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAyNjUgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggMjEzCiAgL0hlaWdodCAxMjUKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgL0RldmljZUdyYXkKPj4Kc3RyZWFtCnic7cExAQAAAMKg/qlnBn+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDbAIu5nwkKZW5kc3RyZWFtCmVuZG9iagoyNjUgMCBvYmoKNDkKZW5kb2JqCjI2NiAwIG9iago8PAogIC9OYW1lIC9JbTI0CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDI2NyAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAyMTMKICAvSGVpZ2h0IDEyNQogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDIgMCBSXQogIC9TTWFzayAyNjQgMCBSCj4+CnN0cmVhbQp4nO2cz2sTaRjH/6iBQnGpBw8Kwh4UsdU9ePJQkF5WUqgreNigB9d6EBdRN5SurYiHPdS20RWKF1FXqS1soQarh7ru6jSJSUrahu77zq/Mz3femczMk7TfD1imb+b9zpuZT593JplxdxcAAAAAAAAAUucfADIB+gFCoB8gBPoBQqAfIAT6AUKgHyAE+gFCoB8gBPoBQqAfIAT6AUKgHyAE+gFCoB8gBPoBQqAfIAT6AUKgHyAE+gFCoB8gBPoBQqAfIAT6AUKgHyDEV786AJkA/QAh0A8QAv0AIdAPEAL9ACHQDxCSmX41jW906ANI460lSzY7qlqtWj/TRrDns9FP35+vSHnw4MF8N0G4o16+fPnixYu0t2JHl5BQP/aHxoZRoYPp96/Gf12AQL8MdlS5XFZVNbPDwTbE3hShfkx+fRgqHUy/z58/d7l+2eyoL1++sP2Q2eHQPWdvjVA/9hcH/SwE+mWwo5h+bFdkqR97U9AP+ulAv+yBfhbQL3ugnwX0yx7oZwH9sicx/VZmrl6dWYF+0vSCfos3TyqckzcX09kJAfoxmXIuQuRanR8fn1/tPv3ePhw73v/9zwvha8bRb+Hy8e+O/njvbYyB9YJ+lc3W7u77wqlTt5divEMJAvRTa80dzqen4+NPP2mLzZraa/p9eHRlcEBRDg5PlWrha8fRr1aaGjnUpwwMXnn0IeLgekE/jaXbXD9WCK0aqC/zn6OjWnkcnTHq5OiM/qrRbrQEEzL5uqRqF8WJ5+6WXE5b09ag10veYK79fEJYRJPUb/31xMjhPu7e9FqrWZXoEWvyrTZ31qaHDypK3+GRidfrEXr2mH76T1eLMnSntLu7cFFRBm/rC4M3F632Xf0lkYBR9GPy5KaWjKKoKdVu0eokX9Osmzs7S1PaOmptcTo3qfn3fDI3vSgooonpp824CndvcrUm5Z4a/9yv2qytTnIDlf7jYw+l5+G9oN+p31Yqqvr3HduCrZ1R//OiMnQr+MQxgn4rc2wi/ljhi+rak3GmlK2lvaajHs7xUld5o/vH7XtTCZQvMf0e549x95QD5+5vNKsbcp06ufTYqDY37p87wLfZfyz/WK7TntBPa3Et2NdUixcU0YljBP1cy7l7r7yvcveuPfnkqIemf6H2JaVffXtt/tIJrfqdufFMekKMr9/6sxtntOp34tL82nZdrlPP6Dc7phhT7dis1rD465Aiqd8M62tWQj8i6Kf+NWWe863MXuMq8ZZrsytmC1uTr/9kTbW1aF0rH9lsnbMqZcr6sflwc7v+bpJfFCgD0gbG1G/99a2z7Pqm79DI5Lv69qbkTN8D+s2MGlcPQ4XSZqWyWSoM6b8Pjv0UUv0UiwsLrc1g+yKd+1Ua/JxPZ2qpUeEt7ARP45ffp/ia7ETPaDBbDHXZbG16mYF+qjYh7pQXrv/AqtLA2bsyZ2Sx9Ht7l7vXf+LyQnknwkSv9oB+9S1jy4ZA2qcw2u9bW60WF7Klv+Ja4BIW3ht9t8RzQYh+7ELC/oFL+7qiUTGV1H9vNhr6mmZDu4XDrlHC7Uv8g5dyY7u19sf5I/2nr0t0jaPfq+un+4+cf8jKXqMccXBdr19cHOd+IWTzpVvYJW9K+kUD33okg1UMJchGP1YSG+LTPui3Z/SLAm45sIB+2QP9LPahfpVK5TEpTL+5ublMH2YTQrijisUi2xVpb8WC/FkP/QEu/QGrrxSw7bKtBz1v1T1ks6NY9bPqMFtOb0Nfw/Z8Zvp90x5q1p/yyx62Xf2R6u7XL4MdteEkvQ2Vw/Z8NvrV8b8cSIP/5SDjHQ72LdAPEAL9ACHQDxAC/QAh0A8QAv0AIdAPEAL9ACG++pUASJRI+mVzH073wPYP9RD2MtBPDPRLFegnBvqlCvQTk6J+xfxRk3zR/cpwYZkvLReGj7owXvGLa8cEZztDHS+223lzhE3HB/qJSUs/fnDNY8+XbUeW/ZovsH8uM4THXtfN6iJY3bEx3s3oZG9v6y+x6Y6AfmJS1C/goOpVbNnpn9ABfV1b9bO7HbJds5ezfXm5uAz9uoD0Jl9zfvROvH4+hDtg049Xr+FhYbw72N3uXSMVoJ+Y9C89HPOm/VjbjYimH+9gVC9XFYV+vUU2V742CfxP9iPr504O+t2/2IoSEgX6iUlLP9tJf/tcLag0xZh8baeBTiklLz3a60A/QtKrfvYPNrTj6zFF9S1OQdOk/wcvfuYEffDSrr32XtCPkC782LmYDzhL60Ggn5ju02+5UNgz9kG/ELpPvz0F9BMD/VIF+omBfqkC/cRAv1SJql/a976C/UaM6ldKtCYgbd+mQT+kEaZBP6QRpkE/pBGmpaOf4/tH5z3ckYbq9+1kwH1ysdKCvv2USfMbSfyxefsmPTYzNOgL3EhpHRxTR1oK+jlv/HbcteE/2KA0Wwdr0bwPPPiGXvk0v3zZNL+RxB+bt2/SY7OSAh/YiJDWwTF1pSWtn9+N32E3DckUaqNzsmnClpA070g6GZuwbwJjM5fz+ejVz5Mmcw+MZFoGk69ZqQOHLCGMGeh/U1vcNFFLWJp3JJ2MTdQ3ibGZhz3O5OtJ4z8LBf+b+SOmpa6f86HBWMLYHrxKQD/HY1wBLRJpGemX0Ni8FbqDNPvdqB2+07T1c7zfgLGK0rwPIXYy+brSfFsk0zKYfJMbm+uZ3Q6ncpmHULpl8nWWrshDDXoCO8bpvbeL4IHE0LSULz2SHptBrCtfT1pHc1Cqlx4+g2rfwx3xPMH14I2x3+J+uOFN88+XS/MfSXIfvCQ/No3EP3jpMA0fOyONMA36IY0wDfohjTAN+iGNMA36IY0wLap+JQASJZJ+LQ3Wq5Uc8mlVCVZXV2VWkwRpqaZBP6QRpkE/pBGmQT+kEaZBP6QRpkE/pBGmQT+kEaZBP6QRpkE/pBGmQT+kEaZBP6QRpkE/pBGmQT+kEaZBP6QRpkE/pBGmRdXvf6Hl4mkKZW5kc3RyZWFtCmVuZG9iagoyNjcgMCBvYmoKMjIyNgplbmRvYmoKMjY4IDAgb2JqCjw8CiAgL05hbWUgL0ltMjUKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMjY5IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDI1MQogIC9IZWlnaHQgMjA5CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BMQEAAADCoP6pZwo/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIMBv30qCgplbmRzdHJlYW0KZW5kb2JqCjI2OSAwIG9iago3NAplbmRvYmoKMjcwIDAgb2JqCjw8CiAgL05hbWUgL0ltMjYKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMjcxIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDI1MQogIC9IZWlnaHQgMjA5CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIFsvSUNDQmFzZWQgMiAwIFJdCiAgL1NNYXNrIDI2OCAwIFIKPj4Kc3RyZWFtCnic7Z1NbxxFGse/Sz4AR3+AfUNilZVW2l4BiWMnwc46IY5txmuyARSxCJEgS2a0yiEHMC/isGgkhLQiThBKbiMBcRzngBRFHAbIG5gI2ANoJW/3zHR3VXVVTU3VU9Xd7v9fJSVd3f4/1V2/rqluz+Pa3YUgCIIgCIIgCIIgCIIgCCpf/4agGsoFeMLbB4ICCMBDjRKAhxolKuB3IKjCAvBQowTgoUYJwEONEoCHGiUADzVKAB5qlAA81CgFBv7KlSsvvPDCPkbxZlwZ5mShvSQ7lkIC/9Zbb+1TKN5FejGgPS5rloIB//HHH6taOFB8gIcLU2Ftrj2x74m1zbKbUUO5sBQM+JWVFaFVcSW7GR/g5eo4KsEykxmfhiRTA69uKbOnGFDejA9PjXfOQSWwtMODpGcpGPBF2lWVFVK/2099qNhUqRzgY7usaX3C062k1cP/c/XMfcA3gz+qgnJhqRTg9S2vjBJSBCIFFmSDKlcnqcwcB8CvZUMph1g+wmb13PEjeGRuJob3wpZwaHZIBUd1VipsALyTpCOwQBKz/8NTPJmb3M9IxtvBTcDWpz/EUpmb8cfrxUdhGlM8KbEm4f2J/J6tIvu1A35fLaY0xcGQrdVMSPSMZZuG9UnEfjOMp0DcDTYu8JJZT+WYd2EpGPCLi4vFJrGb8QHkV8ZJ+hE++Y9itJUgxB6ZThl0wAuS3ggKCR88NsALt1vl5vMCSzsF2jUsBQP+o48+EruRV3yAl6tjL+0c3ssInznLEDMAXva4Oe4cXjiiisC7sBQM+FgXLlxQtTDe5eHCOEv7lkY5hxch0czhuSdY2XuVnfz1yyjgJfen6Ca7IWQPrVlFZV/YWLMUEvid/r05Pz/PNi/erN7Yzkj7Hp55l1KYR3CVqrc0jHisOGfp46co7ieUkQoP09IWSN4RVU92LAUGHoLKFYCHGiUADzVKAB5qlMYF/p5MAB6qi1jgpTCbCMBDdRGAhxolAA81SgAeapTIgYegWgjAQ40SgIcaJQAPNUoAHmqUADzUKAF4qFEC8FCjBOCrrjsX9ydpPfsv3im7JXtCnoH/ZHmYhrX8ybBm2H9MjYsyN0Ek5gXW0mipOyGL6hMhCyIJQXgXZT3twZvSPBTwKST5Vadhkg9EPQwOWyu2PQ3jI2jBkxp4Dx8Vw15mejSuoYpDbB4M+EGLmVEmOwP29rW+C/ScWJPJXe1kY//y8v50m78dhCHU9kzUJ3Jx2W10UwGfnuPF/n7XiyTfZz8ya8ytujgM8MvLy/02J03s/5+DiG+zHSmegGd/su+4/Em/pt9Irr3FE7EDU3Ui2fWzvkQjgLdGkrvRNT9u13iNeZWB72PSH0OGxAxOXOgDB1B8AZ9TPeR9ONDHVpwpH6GKJyKbwzP3rdMUU/t4IAzyY8dRmlcaeOn/xJu+ipzcST/oU85T8u+wMwDpM2e1TmTklIbkmYqhOwkkabxDnNHmFQJ+N5sK1GuEHxoNZrjMXH4wpc4syZ5faw484xgH4kM6A8+bVx14eZ23OTwXxgnHwpsmSU3xTOPesDqTGgIvvDVhP7aL3TtuHI25VReXDfwuiw/lWxrJNMN2/E0bWHgfLzRXDNgg4AUxMZjBYdlmQNOaW3QxftMKNUoAHmqUDIH/r0wAHqqdYmilMJsIwEO1E4CHGiUADzVKAB5qlAA81CgBeKhRAvBQoxRD+3NfAB5qgmJoP/jgg41RAvDQQNt+NDD/9dZjPgrb/gHwD/p6qBaAhwaK4fyRWizwu4/WaYsU+Pv37wN4yETegf/hTdoC4CEXeQd+5yJtAfCQi7wD//0F2gLgIRc5A391NVp6/0sN8G9YlN5701Gu411mF4CHXOQAfIz6QFrgv1sdv7zSWZzrppu9d6eixaVeugngIRe5jvBfvr+kB/7ha67l5qlWdKybbgJ4yEXegX/wimu5PBstnOylm8bAf/mf1ZVMAB4ayD/wZ53K1olWFLUv5zXGwO/8/Mv/Et39dG3tUwAPDeQd+Ptn7MvWXEL7Blc59pTm9sbaGr5aAA3lHfh7K5Zl43AUHejcEOsBPOQi78Dffc6mXJqOoumubBeAh1xE8VpSfDfJAz8/fpltR4Ke7mwO9wJ4yEXef9P67XHaAuAhF3kH/psZ2gLgIRd5B/7rw7RlbOB3fv7lF3k+FIBvoLwDf+952oLftEIu2hsZTwAeaogAPNQoEQLv6fMo+0jy+mHqyTxwOK8dUd9eKAJ/6dIl979a0M/AfZe8sJfa3+OSD/PA4ba5VGj0gmieAf/o0aO43uJP00iAp87AZZNwa3epA4fbDpIKXbteKAIfV/700080wFNn4LJJuLW71IHDccCjFwrmGfBUf3msn5D4L/JS30sdOBwHPHqhYJ4Bb4G6Gvg1u1JIws13EV7q5Jt6/Ff1vFzqfhhGq1eJw+XfwsqtReAteuHFwlew8o6g6AX2urANJ7ksjDnn7Rn47163Ki93Fqc628PNfhLuYi/dSwZ8fElihQFe/AIsXbh+x/JdKpo7dARTrvwtev0fu2S9wH0tWPiOsPNlYf3EC+QX+IevEpSb861otptuEgEfj4qrVwtfxq4d8P3TkO/igHfthZc6i4c6N/MaEuDzlvN/q8P1svDewqZf4B+87F6656No4dleukkC/JCTYMDL5jMU4RJQlnJ3+bkQdMTlmeh8i61x7wV25BX+Ng0x8Ly9Z+BfdCh/7ywM+vFol6knudTD8w8DPKNktk08lOV2woc3D7xLRyy0o4OdLa6SYthhE0DIxwHhuoQC/v5pgrJxJIqOdNNN10vNTjCCA6/6ePU6lDl2RO+dg9H5k0KlM/D8oJ4QSvosb/CiwAvw91oU5Xg7ycYdbhIAL758yC9HzYAX5wJq4IkuflYoemH0rUrTC/xzjl/g7y5YlWPthaO9dLP39tNRNNVNNynfAIcY4eMY2eVWvjFweWjl3kcoM0PtOqJ/8c8dK9ZTjPD8Wxr6t7WZtbyLxwL+jkwy4E/Yle45dgCe7DK76gY8n6useCfs+AAue2YVgLfqiM3pFn/xSXvB3xxe9asJzjwDXgqzoB2ZJMB/O0te6vs7vsDhOODRCwXzDHgpzCaSAP/NEfJS30sdOBwHPHqhYO4F+LtL5KW+lzpwOH5Kg14QzX0Aj9SDcsN57Yj69oIn4CGo+gLwUKOEKY3vxkvPBebhu9gH8OSryrILy27XbUlczbn4CLcHzL12sRfga5vT6qnxqnPxEW4PmNcP+NrmtHpqvOpcfITbA+b1A556VVl2YVnvwHtovOpcfITbA+Y1BN5wJdnlsxOPr99ga/65/tTEUE/NfiVbWNb4akiWvlXV88DbLIm7+/1L7Wi6c2u8RXKNwwU156NwuwjMb7Va3FdW88YTdfGIVF8vwI9eQ3bp7BDrx9c38/prpycmTi8V/88uLGtwNVRL33paEvdMmvU81dkeb5Fcg3Aq83yT2jwt20utxakWv4vAPLHNW8sWgi42SPX1Arzh0rGbhycn/rC+mdWcOstuJnv/cq2wsKzp7S9bRUhVzwFvvwzuoc7N8RbJNQ1Xgvnz7dizsIvAPK5ZPNWTHezexSapvl6AN1w69vrU5MTv168bbYYD3m4Z3K2TSc9ujbdIrmk4rXk/+ZfYPPZsX5bsIjBPajLNdh9IzG272CjV1w/wZqvHXp+cnPjd+nV288/X8gPmzjJ7AwJvvRLuZGdrvEVyTcPJzU+nyb/PdB9QmvfemWy9c1q6i6jlw9K/VU/0CuaWXWyW6usFeMMFZL84MDnx2/UvjDbDAW+/GO7BztZ4i+SahlOZD8rG0SThnco83lyY6yniErc82StpuQPwY/zVAhO2TTOeDNeQ/fzJyYnfrH+e1Rw9y24me/90rbCwrHfg7dbDvXGsVVwPd9QiuabhpOZ5ebbN7HU1TzZFtTf8tDzZe7hL1sVGqb4Z8OYZT0Lqk+z78GbLyH721wT4z/KaaysTEyvTxf+zC8t6B95uSdzNmaRnN8dbJNc0nGg+116Y6aV7e28fYAM5m+t2OZvPdxayps4nU7Jzc4RdbJLqO9YIbwz8yDVkJ9PXkn09+ZevhvUz608WK7mFZcd5ZyU8u3haEpdfD3fhSM94kVyDcFLzeT7591BXdqGszfOyeaTFNJu+5edmd2Utd+ji0am+XoCnXlWWXVjW+29aPTRedS4+wu0B86r9pnU08NSryrILy3oH3kPjVefiI9weMK8f8NSryrILy3oH3kPjVefiI9weMC8J+Fvrx/841KuXBzWmwFOvKssuLOsdeA+NV52Lj3B7wLwU4BPcU84H/43/MQTeU8muhg/5brz0XGAevovVIzwH//H1W4ZTGgiqvrTAX341HesBPLQ3pAY+pp0d3UcD7+nzKPtIqqN54HAw15jrgE8m7yLtJsCTP3GwDx0+/L2aBw4Hc725EnjmqTWrAfDVDwdzvbkK+Hgqwyoe6OMaAF/9cDDXmytHeLUAfJXDwVxvXirwxe9zCnJZHqKY4et1SVxtONsFEfiFelgXZo/iW1IO5qozIjDXBA1jXhLwynxq7hDLZWKk5v6WxB0ZznrJG3bdHM6RXQ2MXxmMwNwk293WXBOUxFy1iF/pwMvaJO5zW5VGNPe5JG4xnNkiueOFy0341hObK86I1txry7XmYwFvkvFEA3wh/9wZeJ9L4hbD+ViuLvPQ5nK6mqvOiNZcVk9rrlobNwPeJONp8LO3b99mnT0A7zR7VJv7XE5Lkm42epHcMa9V2mjyu0n651yogFf9rZhCPZF5NpEfMYc3DeEfeOlnlDPwAZbElfxRIJoHcKFbaUd4HZAkw44R7ZTmAym6uHrAyz+iXIH3vSSu7nnE5QG88NlcaLzTTFhiztq6Aa8yV9STtTw/QpfEPTpEKq/Aqx5BKEZ4n0viaoB3WRZWeAUjq7Z9S6M0VzWbxlwd1Nn86qowDFRohFck4apwt3wtKbxa8zSHV4QzWCR3VLjiLyb4W1b27pDCfHS2u625JihBy/kd1ZvDjyOK3w2VYx44HMz15gDet3ngcDDXmwN43+aBw8Fcbw7gfZsHDgdzvbkP4D3Jq7/vxocMB3ONOTnwEFR9AXioUcKUxnfjQ4aDucbcB/DmVubaru3jUuBwMNebA3jf5oHDwVxvDuB9mwcOB3O9OYD3bR44HMz15qUAPyp9eHCA5TcMleaEX1A3PZcRq0LbngtNtrtRhjh1nnXpue1lAK/L5B1WJett2gGvNhfTZC3Mxww3alVo+3NhZflle00qtHu2u4m5S267PJnM5FvTpYzwYvPF1IzVqy7fIVeZewFeGc5kVWj7c+FqaS+Uh2z3zLICue3lA1/IvUtaSQU8a859EJL/XRohnNGq0PbnwlY6ZrsXzOmz3bn0c+K8szyxxyzzsWTg+Y+1fLQiAV49qVCltDsBL+ZZ8x+7jkOZ/Fwost0l5qSZMpw5YW57IVnb7G4qE/hibrJq7kie4UvyYaoJRzuUKc6FLttdoJ0u273YcvJXB1kLKz7CF5NwxUvBXY7xrsbIDF9a4EfmWbsArzwXimx3eS8Q3aoje8Elt13SwgrP4fXpwz/6SHxm3xtYvx8wD2e0KrTtuaSejtnuqlRokmx3j12sTNau6lsaXSYvcxq2V0Nhzu0gedAbdS4jV4W2PheKbHfDJG67ObzanCC3XZOsXc338DYie5ES3DxwOJjrzQG8b/PA4WCuNwfwvs0Dh4O53twH8J7k1d9340OGg7nGnBx4CKq+ADzUKBEC/+utxzyVsi4OtPdEC/zuo3XyAuAhQhED/8Ob5AXAQ4QiBn7nInkB8BChiIH//gJ5AfAQoaiBf0Nfeu9NM9+FON4VD3ipHU13bnGVAB4iFDHw361qyyudxanO9nCz9+5UtLjUG+460x7eBfkBgwLgIUIRA//wtTHKzVOt6FhXrDnUuckdBuAhQhED/+AV89I9H0ULJ3ts5dbJBPgt7jAADxGKGvizBuV0Z2Ewe3mmK+zaOtGKJjtbXCWAhwhFDPz9M2OUjaNRdLTL1mzNtaKDnS3uMAAPEYoY+Hsr45Rn29GBzg2m5saxllBzbwXAQ4QiBv7uc9oy116Y6aWbvbcPRNF0lz1gcyYBfpP7KQAPEYoa+Hl96Z5jcxIPdfNds212z8KRXroLwEOEIgb+2+PkBcBDhCIG/psZ8gLgIUIRA//1YfIC4CFCUb+leZ68AHiIUMh4ghol5LRCjRKAhxolAA81SgAeapQAPNQoAXioUXIEHoJqJ2vgHQU3uFXcrfQGwA1uId1KbwDc4BbSrfQGwA1uId1KbwDc4BbSrfQGwA1uId1KbwDc4BbSrfQGwA1uId1KbwDc4BbSrfQGwA1uId1KbwDc4BbG7f+MQWgSCmVuZHN0cmVhbQplbmRvYmoKMjcxIDAgb2JqCjQ3NzUKZW5kb2JqCjI3MiAwIG9iago8PCAvTGVuZ3RoIDI3MyAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCniczVjJjhs3EL33V/AHpk0W1wYMAWNIHSS3wAJyMHxykOTgsTGn/H64FVVFUhrNIIfxQO7u2vhYG5fnRQkZ/x7Sw28gvj0tz5WmhAehHScp64SWa7BOShVZRVPiIxLSI/3/IFew4nvWoO8Sn4Uk8eUf8cfyY5Hil+XL10j9M9Kt+Hcp5lDx8/J7B0a+O3wUoVbwDhE+L96UMcGtarPbtokAAvwKBdKHX59AHH/myWRxSLnwJKyR6eV7fUn2Mqu9xGfC8LwYK8sI6SUo4QANGzTM8szX1DOu6imjVxu/pBVBKGNWa1UGtyRwFZ0Ufy+fzsuHXVmhpDj/dUnnqORCVJLbZoIX5yfx5aOUWsZ/p/hT8bdLCY/xaev3MT5c+WWaqXRTHspU+b3Qla50X+T1fsWuL7r5+1T4STfzQuE3TL7SQpHPY+grdk9FHtQFX9bf67cidgP5TjjNQcSIfCxUBXWU7fBVnH9bTucUHLutPoZW6uLSTa/e6ehX8GH1oFPS1GjUkF6NhJZQNSS0SCg6m0PMVZ/hQCW5g1CZkuECE0KPZc8T8ixQUMVNs8emDjszAVDyIKvuF5+VGHAAzU43hZxHusavQ4gmCelGFHvDmABsBnk4nPFEuPOv5+a7iWWD7h5DOUOPc8fSTO9nnyiJbUuq0SxRZsgSid44kRraSk7zDLoeu8QzPslHpG5rSV89AcfCbiZqFuGQV8tvUtbNRi1jsBfdEveJnbsdOUavt52x1mRi/Ob1S5FTz+vwYn0+xKq+USBEJDnT7DUxbemnxjORjEcz0qxqkEWqBklX+yQXIZ9VMmfUXsMnB/Cjhxkra/DwhAoQSipRX1XPY8SxWrEsrgA9VcN3OSJnaOcbSxLADKj4DMdcsHLIBeYn0GtomWDr7PYL5kGQoW7EWwFkQozwUhBRcBpGZBqo1VCrv82EWcDE7hnZnVW7bBEoQMLIq6okgAfzAxE61FHA5HW5E9SDpwIZrzWe2XT6yLAaZ7EdqnzMFTeu67m14g6KrJwP1rKQls9pnCrL0ekcYmI2BxvcbDVhwBJDhUfOfpRsZ4CuojuFCdAsBjcBd1p34OD9eRiv6y6+DNlqmAjXrapSpAZ20udP03nlTwwpGytPbWPCWo8x9+Mqnbs8bkWwhyvehbJVHxAC9kOgCP08Kyv5JNuS0iq2M0x2L6j1Fk8V1b59dxBbS7uN+hXbJJxFXxMbY2s9DDCtfD/WvedddTbcGO/ghnj/H9ukm1sinpddV1SeWJAkjNhS+/2iIrSqi2t5XnbcZQw4kpmwDvCGVGKnqRBW8PnIX1xrHZ6ugrDxqLWlxHV4onIvnKhs0EXDBjeebWOzVPPNe6NPz7QXfn+2ZTxSZS+Ng8usmmDD+lI0QzocealW83m1leaN2O4/PxPMN86HRnf2fYcN50g2DtQXDSPmfGeL3U3gHmNs0HazQ2rQo9CsWWd617DxOmO+pF3KR3a2WHligd+61sCzF7GZnoBrNDa3HZfBEmLkXTZL2GG1bYXX3TI5A6uL9cQu5KTYwhrCQM23apPrOAC3mhQ/mJFk9/maO7rOTH+ZWNivRKvsKjfXf0ry+rpbxKb++fb9m1pV8HHViNJKRaUUIWj3cPJTDN5pGiYwarXave+gpL//AFFZjPgKZW5kc3RyZWFtCmVuZG9iagoyNzMgMCBvYmoKMTIzNwplbmRvYmoKMjc0IDAgb2JqCjw8CiAgL1Jlc291cmNlcyAxNCAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMTUgMCBSCiAgL0NvbnRlbnRzIDI3MiAwIFIKPj4KZW5kb2JqCjI3NSAwIG9iago8PAogIC9OYW1lIC9JbTI3CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDI3NiAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA0MzUKICAvSGVpZ2h0IDE3MgogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztwQEBAAAAgqD/q21IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPBuezcwygplbmRzdHJlYW0KZW5kb2JqCjI3NiAwIG9iago5NAplbmRvYmoKMjc3IDAgb2JqCjw8CiAgL05hbWUgL0ltMjgKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMjc4IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDQzNQogIC9IZWlnaHQgMTcyCiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIFsvSUNDQmFzZWQgMiAwIFJdCiAgL1NNYXNrIDI3NSAwIFIKPj4Kc3RyZWFtCnic7d09bBTpGcBxd0hXXEWTK60UUSQKCyt1Uqc3YIkispQiTaRTpFxMjlCQkhQ0YHSIi7QNTaqsTwlC6IIMBW7QRYA5RdcQWYBkMJHBNl4778w7H+987Yf3fd5nx/7/xJ3W49nx3sPsn3d2je+zzwAAAAAAAAAAAAAAaIcNABiCdquC0h42gHbQblVQ2sMG0A7arQpKe9gA2kG7VUFpDxtAO2i3KijtYQNoB+1WBSU0w0ePHtXeBtBS2q0KapiB3D4/lTt/e9Dujy7PTM1cflS5bQ6T3gTQNtqtCmrgNKIq5jGMQjeojU1hBNBi2q0KatAwKsu8QijjTlrJXs6W85ed27edQ8U3bmefdI+fLU5nLl/Ov1D1ywAITLtVQQ0aRp8lYmE16Hww8FLa1i85aPRBsodzM0lhvI+b4uL6FcCo1jq/+snPf7+8Zj9av/+XX87OXX+0PviO2q0KaohBOi8xlhd3bqOilsUfDxXG/J7ZR8XFaV5kYgj48q8//fRE9FQ+MfP58tr6/T//7JP4mX3yN38feFftVgU1ykzTQmb5q4jDdsgwZmEtbXe/FH0ExmJWiL84aZ9NJz799JPk1syl+4OXjNqtCmrkwaapa35bxXsYnQ28zAiMyWnj8FXcIIyumsvYdFPjFa7vS+nGgwM4hPX7l2ZO5F38PH29cQDtVgU1aBhxn+p7VfxU/s7JYcNY3rnuzRe6CIwlf11xasQ2arcqqGFGWfgG70KW3Bca80+4byk7tweG0f1S8bfrFCvJy4zAuP7x2x+lNfzjnTv5641DPK+0WxVUgN+KQ+IvygD+rf3t1z8+Yap470X0kX298eSZv/6bN18KxH8fhud8GyPXzICY9Rcv3Ay+ePFiqLtptyoomckfUv2VOYAJoN2qoLSHDaAdtFsVlPawAbSDdquC0h42gHbQblVQ2sMG0A7arQpKe9gA2kG7VUGtAsAQtFsV1AEADEG7VUFpDxtAO2i3KijtYQNoB+1WBaU9bADtoN2qoLSHDaAdtFsVlPawAbSDdquC0h42gHbQblVQ2sMG0A7arQpKe9gA2kG7VUFpDxtAO2i3KijtYQNoB+1WBaU9bADtoN2qoLSHDaAdtFsVlPawj42laX7xS/aXMO1WBSU9TCSWpt++fbu5ufku9j/AE3NSvXnzhjD6JT1MJJamzQlsTuOtra33799/AMZmTiRzOtk2Eka/pIeJxNK0WSia03h7e3t3d/cjMB5zFu3s7JjTybaRMPolPUwk4jCaP+LN+by3t9fr9faB8ZizyLTRnFSE0TvpYSKxNG3OXnP5Y/6sP336tDmrtR8QWs+cRebPWXNSEUbvpIeJRDGM2o8GR4EJozmdCKME6WFOjLXlq5nlNbvt9cNOdlsaYYRvhFGO9DAnQ1TF7pNda32lc7Xz8LXZ/PpB52r3WZiHQBjhG2GUIz3MiRAH8Gkv+Wh/72nXljHevrxcWkceOMtLu81ZWUY3bVXjvczNIZedhBG+EUY50sOcCPsvzSIx69nBQe/j7se9fRvGq52V9Wgd+aRbCF5hY3T/zoN4jWkqaBafNpcPOp2Vl/v7e+ZovYavnCOM8I0wypEe5mSI4rVr1omJtIB2JbkXv0H8yrTTBs90Md3Ye+qUMbrTWrezstKNV4imkVEXh30IhBG+2TBub28TRu+khzlBeh/LLzK6rzFmtwsvPL5Klor7ppAmm3Ezo+WnKeOa2fJ0+G+6IYzwjTDKkR7mRDA9c18FjF9kjFaHtWGMG5iG0dTPXkNHa8flhw863ac9e2H9cNl52XIIhBG+EUY50sOcCFHVSu+tdFZeNYQxu35Od3yZXVVftXezL1mO1kXCCO94jVGO9DAng7mKftLNv4+xs7KevflSDaPZO9u5++TjXnK5HL0ImVQyWlRmXeRdaSghjHKkhzkxslcYox/hkMTOfUO58OZytrPzdnO8Q3LH6PO1d2xGGOEbYZQjPUwk0jCa2hJGjM/+EAnCKER6mEjEYXz//v3Ozo79IRLAOEwV9/b2zJ+z5qR69+4dYfRLephIxGG0P4/RtJEfyYjxmbPI/jxGwuid9DCROH4/wXt7AmjPQBY/wVuO9DCRWJp+8+aNbSPghf3/B5mT6u3bt4TRL+lhIqH+v5Dj15H/JUy7VUFJDxPW6urqfwAx5gSTPoe1WxWU9DBhEUaIIox+SQ8TFmGEKMLol/QwYRFGiCKMfkkPExZhhCjC6Jf0MGHVhvHm3NSpxbv5x3cXT5mP7b+9P3MaD3tzzsOX83IQHB5h9Et6mLBqwmhKNbdo/rnpbpELYxMvXy7wY0YFYfRLepiwqmE0y0XTxLtuGRvCaDZMWXbXaIe5uVN9tzj3Sg6WHXxubi4/WrpX8nWTg5xavLl4yrnvzbnyA2g6iPNgKWVIhNEv6WHCqoTRdrG41qoNY/6hc5ekOtGttEzVLbZi6fV6dvB8e/EBZAdxbxQfT3KfPgdJN7i3EABh9Et6mLBKYXTjlxek6VK6tApzdkhuVrc4WcprVjh4essNY+2NbLnorgr7HMRdWyIUwuiX9DBhFcNYbE122VkbxmjfurVf/MlAYSxVrs9Bsh2oY1iE0S/pYcIqhLGcmmJeqmHMuli61D3cpfSoYaw9eMNB8i9bfc8dkgijX9LDhOWEsfB+SyJ7J6bmUjpdXsbvd6RdGuHNl4brdPdlwezNl4ZCVt98aTqIuxomiwERRr+khwnL5zd4174ISYWON8Lol/QwYRFGiCKMfkkPExZ/JRCiCKNf0sOERRghijD6JT1MWIQRogijX9LDhBXgvMVxRhj9kh4mLMIIUYTRL+lhwiKMEEUY/ZIeJizCCFGE8ZJX0sOERRghKsAJ5rc8E056mLBqz9vuwtTslefjHvr5ldn6o3QXPBzdy0HqND7sUY8ytdB1t4g94MlGGP2SHiasmvPWPKcXrph/unX7e+ClPH7yJacSxkl/wFIIo1/Sw4RVPW/NctE8o5+7ZYye1AsLs/FPYLBbq1tsC2JJAGwKogMtLExle6Z72U+lB5m90r0y69y3m9wj/3JNB8m/bM0qN/9c8iCrO1e2ZAVLHkP6h0T5MRzUPM7scPF/lxNG9wFXBuXuNeRA2oMw+iU9TFiV89Z2sbjCiZ7J9oN0IVS/xT5p0wvxLIz59uKRs4O4N5JgJl86uU+fg6Qb3FsH2cPOsxJ/qrpzdUtyr+zlhChJAx5D9XHG7atfMVYH5e4z5EDagzD6JT1MWKXz1s1h/hx0tiY3q1ucZ2xeicKTOr3lJqL2RrY6cleFfQ7SZylVWg9Wd67d0hTn0mOoPM766ZUmWx1UdZ+BA2kPwujXKkJxTrHiMzB7EoYPY6lyfQ6S7VCtY7rWK6/Nqju7W0YKY9MS1XsY27VMdAQ4gbVbFdR/EUQhjE1P1DEvpUcNY+3BGw7ivslRvjTN/nOiQqYvRxZ3rrl7n0vp6mPoN4RDXUoPOZD2MCeY9Dms3aqgpIcJywnj85p3orN3YkZ586VwAV7tiV2Xup+q3qi++dJ0EHeZW77ITD8Tv2mSB6u4c3lL+TFEd64PY/VxOu+yzFa/Xaf5gj7/HRhyIO1BGP2SHias1WFeAipdt9ZuObKO0X+qBMLol/QwYRHGBs3rUIyCMPolPUxYQ4UROCzC6Jf0MGERRogijH5JDxMWYYQowuiX9DBhBfg2Mxxz0uewdquCkh4mAluNl6YbqsIsYBCYdquC0h42PCOMEKLdqqC0hw3PCCOEaLcqKO1hwzPCCCHarQpKe9jwjDBCiHargtIeNjwjjBCi3aqgtIcNzwgjhGi3KijtYcOzAWHsfnHacebaY8KIIWm3KijtYcOzfmG0Vbz4bfbXJXofNgkjhqTdqqC0hw3P+oTx8Y1zpovzN58Wt147U15DJpu+6Do72MWlu+BsXm4SxiNJu1VBaQ8bnvUJ4+adL2uuozc/9JL14w9fz5vNZ6893vxw72K0x4WojI+vxzm99WwzLuT81z9E+3570e5KGI8P7VYFpT1seNbvUnprNylaJl4UFteM8199Z/a8G+127sbjpIsX733YtLcKLnxDGI8P7VYFpT1seDboXekojvny8NyNblxFuw6MoxmHMS3j9cffXIi6eHdrY+O7r+azPRO7W4Tx+NBuVVDaw4Znw367Thy801/e+eeFbJmYvAYZh3Fj6/uonOfOno1a+H0UwPRK/A/dQccmjEeSdquC0h42POsTxuK36sRrv92trd3s4vrsufk8jBubz27N2/1uPdtMF5t2nTno7RfCeCRptyoo7WHDsz5hTK+iS9+rk23u9Xrut/Ck78q439OTv1PT77t9COORpN2qoLSHDc/4my8Qot2qoLSHDc8II4Rotyoo7WHDM8IIIdqtCkp72PCMMEKIdquC0h42PCOMEKLdqqC0hw3PCCOEaLcqKO1hwzPCCCHarQpKe9jw7M5kIIxHj3argtIeNoB20G5VUNrDBtAO2q0KSnvYANpBu1VBaQ8bQDtotyoo7WEDaAftVgEARvM7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0LAIAAAAAAAAAAAAAAAAAAAAAAAAAAABAC/0f8RKMHAplbmRzdHJlYW0KZW5kb2JqCjI3OCAwIG9iagozNDYyCmVuZG9iagoyNzkgMCBvYmoKPDwKICAvTmFtZSAvSW0yOQogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAyODAgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggMTkxMwogIC9IZWlnaHQgMzM3CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BAQ0AAADCoP6pbw8HFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYD1UFuwplbmRzdHJlYW0KZW5kb2JqCjI4MCAwIG9iago2NDcKZW5kb2JqCjI4MSAwIG9iago8PAogIC9OYW1lIC9JbTMwCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDI4MiAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxOTEzCiAgL0hlaWdodCAzMzcKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCAyIDAgUl0KICAvU01hc2sgMjc5IDAgUgo+PgpzdHJlYW0KeJzt3X2PLNdhH+h8BX8F/29ogIsAkrCC4wCO8gIE3gWvh5cBQcdZKEhWxgK2F6SWQwZcQTCMIAZk5YaCxRFJBHmxTa+Y9eVyRUJDc0NICHDt3BsyKzrUQHEMi/+NRVkUHcpjbVd1vZxTdaq6qnp6uqv7eXBZ7K6uc6q6p87p7l+dOfOjHwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCr3vrVj/yVwsMvbm//H/nVt6YXLk2rZA1rHTwAAAAAwL6IwtptZM2T09pGzLyVJyFqBgAAAACostKHH354W1nzxLT2xYdbA5mr7Hkro7MBAAAAAA5VmTS/WEa3zZS2Hjr8kV99q7VNOLC4tbYu0EqSw/UvNqPmeLRyOjYut+k43Kyy+qm1H2seRXh45ZMswvfyRmKLF1M5eeolaRxKs9CLzR0AAAAAAMxJmIGmsuYgjG2nv+0Hi7S0Y2aLsuZ0pd1lUxlsRzDelzXHAW9iP+mnVQXmjWR4uXkjNe56SaIaql0X9yXNAAAAAMCsxUFp55jlYk08P0U6yA0faoW3y7vFvWY6u7y/LNp4rDdQbgqC2+gQ4+NNpsdhLJwYxpxKhqMD6XlJUjuIXi1JMwAAAAAwU+mJHOpktzXctj1zRHIQb9dMFenB0+nYOBwfPDVqDsPeVNLcsmJ0d15p/KKEB9L3kgTF8lsf+Uh5OK15PgAAAAAA5qQjGm2OYm7PQ9wTNacnMO6NmlNjhpPHExo43rk64Eag2xE1B1lyo+rqGBvx+4CoORrMXR7Jwy8uE+dypmpJMwAAAAAwT51Jc2NM8NC/h9eqOR019/61vvKYuqb0aB18z58FDO8Xf9qvMV47HfCmHysi5ocfjme7SBx811QYRQ0fWSbN5bwZH5E0AwAAAAAz1jtvRZQ1987V3JiSIvW38hrpbd9czXHMG8/x3FANTG7PLR09qWAAc2skdXLG5Y4YOkjm2+O8k69Xo6JmBcF9STMAAAAAME9dQ3DjDDaeaKIYgts94XEquQ22bEbW7bLphzqS2P4JK5rPqLE+UTidELdLhK9Z46l2viSpCtIHBgAAAAAwG10TULQGHdeR7GLTVgobRqvpWSXCzRLjj+vZittp7ZC/mddIjJOTV6zMjpPPadjfIuycZCR1OM0XvfFSAwAAAADso8bMyasmIwYAAAAAgJbkFBWSZgAAAAAARhkyQwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA++h85z28w7b92gAAAAAAXD1R8zXb9msDAAAAAHD1RM3XbNuvDQAAAADA1RM1X7NtvzYAAAAAAFdP1HzNtv3aAAAAAABcPVHzNdv2awMAAAAAcPVEzdds268NAAAAAMDVEzVfs22/NgAAAAAAV2+DUfNrT338x37skeeT91Z6/pGPP/XastjyxhgDU98v3fvRvS/Vt3/07stPLu88+fK71e1+w7ccGzU//8iP1ca/BAAAAAAA12izUfNCkS5Hd4aV3XjUHOTEX7r37ssv3yuC5xH58Uaj5iimH57SAwAAAABctw1HzU8t5EHx84888tRTQe4cjdZd3H/kkWIUb7ZJ+fji4aySRx75ePXQIENj3ydffneZLj/58r2Xn6zuZblzmUAXzzka/RysKaPmxf/rba48ag7uVS/d8v5ifZ3Ex0UAAAAAAK7NpqPm5596JItCs/kwni+i5nqMbhmURmvKbapRzUWYOiJIHTzEuJhCowiZi4i5nFcjGvRcbpdcU2fTm4qai9ejHuMdvFBBCC1pBgAAAAC2YtNR82vPP/LI84ubj+QDlMuRuGUkWtysE9TyVmICjRFTaQyOmpfpcjycObgXPussTG6vyUYzh4OeNxw1n4fDmussPn4NAQAAAACu28aj5nrqjF2MmvNcuRqUHN8L/2pgGUw31+Sjmr80ZsLmoa9ecgKN7G8FxgPCy8ckzQAAAADAFm0+an7tqUeWfw/wtb4JNLYUNWezNL9bB8X5IOXyXnZnebuciTm5phjuPDRsHvrqJf8sYLUyy5yrVyN7GUf8yUUAAAAAgKu2+ag5/H/zzwLW95t5cpalln8WcJNRcz4pRj1UOb43/M8CDg+bh756zxd/JjH884n12vyvKLajaAAAAACArdhg1Lw9Y6Lm67aBp2vyDAAAAABgy0TN1+yKn+pymLMhzQAAAADAVomar9m2XxsAAAAAgKsnar5m235tAAAAAACunqj5mm37tQEAAAAAuHqi5mu27dcGAAAAAODqiZqv2bZfGwAAAACAqydqvmbbfm0AAAAAAK6eqPmabfu1AQAAAAC4ehOi5gsAAAAAAAiImgEAAAAAWJOoGQAAAACANYmaAQAAAABY0zpR8122pP1z3PYRHYRrbJcAAAAAHK5Nh1obqn/NqHlCcdbUdXps+7j2XPJlBwAAAGCOrjZrXVPy8DYaam2o/gnFG4e0iZ81XfpPj+s/ngPR9bIDAAAAMEdXmLWuaaNZ3zXXP+HpX/khMdymTw+Sul52AAAAAOZoR8I0UfOVHxLDiZq3QtQMAAAAsE92JEwTNV/5ITGcqHkrRM0AAAAA+2RHwjRR88hDevdbb977wz+OV7z5rXfXfyYHSdS8FaJmAAAAgH2yI2Ha+lnfu9/6w56kdWL9f/yHUZzb7Zqj5n//aw984q/99Cd++hd/61vLFb97sri3+Hfyu4MOl9g6p98f/9d7995J/Ts/l/z3EzUDwD5788uf+uQnP/nZV1qrctH6i1c++8lPfurLb65dNrud2KizbMe+gnrCo5rmil+HzmPb2uvw9hsvvvjKH/y3i4v/9gevFLfiB1988Y234yL5lq21AMA+2I+o+d37//J//Ws3PvrAP329I92bUv83//Uv/vRHP/rAUy99c+X+rzFqzoYz33vm0zd++cV7X3jgZz730r3clz/9wBfuLVZ8+sv37hncPNrU0+/d33vt1v/wb//qX03/+9jf+H9+63xzBz1/omYA2Fd1RBlEl0H+2XgoSzmrLHNy2eY25UbdZcfuy+uQkMfGWWqcSJqXQXMcKpfrRM0AsJ86w7T7Tx/faDh++n5XNdnWj700/TDWiZqXOXPmp/7Bl964svq/9X/9k7/7sazWj95cnTZfW9T8jV97YPnD+KUXvvH5B4IfzgOf/0a54oFf+0ZUJv9RVj+d+N41qM+kzr0uNuk5ubqrvaqnMfX0+63/7TeDbPmFv/eLr/7v//ArHw/S5p97+p10yZce62pO7efV+Uy7Kxmj88V/6bErqL2vElEzAOyjYujspz71qSifLFYv7y9TzPKx/KH8zjpll+uXaWtQoLNsx76ibeJ9bf116Dm2rb0OdcCcZ8hBfLwcuhyFysWqV155RdQMAPuqM0x774PLPAL99nMPPfTct/Oblx+811XNm888dONk+gX/6VFzkDP/z1/+/R/89z+7svq/+4Mf/slXh6bN1xc1l/ny3/m5f3zzJ4Oo+WN/9+d/fnmwWeoclVn8cB566Nbjy7Dy/hdvLe6t87MaJYtJbz27PH9eP+lKRrMjfGbkLyeue8qFpp5+L/xSOIz5q1/5ix/+8D/++5tB1PzA5/+/VLn7Tz948tyztz6Tyo/bz6vjmfZVMsaipSdb9v3fuDX6hzKuElEzAOyjN7/8qTznbMST8d38XjjdQxV7Ti27TEyjGSQSVQVl+/a1/rQZm3sd0se2hdchiJJDxbjmYo6MP4imylisrFNpUTMA7KWVWW6YAlbjU6vEsFhz/JnHyzSsMYY1Gni5uNMxDnVa1tfMmb//p11bTqv/vcFp83VGzT/5s7/wmcxjn0n6+b+Tipqfffb0N/Ifw8uPP/Hss2XU3BxwvLj/2GOPxUOQE4OSX1pu8tjTi81fCte0Bi5nwfZz50WQ+f47337t7TdTdVYnWaOenuPpPuXyYbqPPXa8vF8/2DNE94qi5heyH9DrD0RRc+qceekzN5742gdvP1vG//3PK1izopL6ibdfisQPtHhBlqOamy/1/acfLDcKKjl++qXioJZlV/y8gkrGvOwAwD7ojS6bQ2YbmeY6ZastgukkkmX79vXZz5azGq8xfcaGXofUsW3tdaimz6inbL64CLLk9KzMomYA2F8jouYsN3ri9Xx46hM3HszCo2rN+emtG3katlhTjGF9/ckbWQb2/jvPPXTjMy+V5Z/82vvJvUzK+n73ZJkz3/gf/9l/6MuZp9afydLm3/6FT+S7+ejPfXHgVAAbjZof+PU/+GGPr/xyKmp+5tVnHs+O/qXHb52++swyam79sJbjZ78Wrmlvk8WLt/Jx7l97vPyhHz94mm+TDVyOwuaXH7/xxKvViNn33nv/vfc69rs4ydr1JI9n1SmXl7p1er5Y8+H7WSD7+o+Kk7ZzAPBaUfNv/+PP//7v/M7i339+a7Hqj/7L/53d/v1//gsvdEXNLz2et4P33n721oP1NZvE82qsWVlJ/cS//dyt6gWM17Rb8fLFb77U731wnv8+w+UH71WVfHvRlh98Znnj1hfvr/55BZWMedkBgH0wNGKtp364yrKJcb2Jirv2FUvvYNVmm3odUjvdyuuQSU+fkd9exs6iZgA4NCOi5pcfL5Pi97/25I3HX14OWX0nW/PeB689madh731wef7Mg8VIx1vZONr33n72oTwBrLdOmJb1vfmv/5efWg5q/vv/ousPAq5Tf+abL/0fP/ux5QwV/+Tl/9o1g8i1Rs2NJLnhhV9KRs3ffPUk+5H9xsmzb3+ziJrbP6xsy9M8HP3m6UPLH19rm2xKhGffzl6I7DTIKlqcGIFbvxHk8a+cJMbjpvf7zJvtelrHM+iUy0dxv738US3KFYNsX/nwRx92nH3rRc0v/vrdP8+9/73Fqu9+/wf5nQ+/8tV01JxF49VTKOPv9vNKPNNVlQRPPGt15QsYr2m14jpqbvzoq5ZfVRLdGPTz6p8aRdQMAPts6MQR9bQR65ct5h0OB/j2TFixel/RBMdxgbWi5qt4HcJj28rr0DWBxhtvJNe3/zSgqBkA9tGIqDmIDZc3wxipeDD7hfrHXyuGNS4fzJOyx1/KorMy/2ublPX96ff+/P3/XKXNP3e7J22emCV+86Wnbn60yJm/+ic//EHnXNW7HzW/+f7XTh5/+ou3Tl7NRqnmP8j2D6v+iZa3+rYpf+iL/z35evVEohGsZeIY6aqzXU/reAadcuFGyynHs+G44RwSTWtFzf/2E3/9hb/1txb/vvo7i1Xf+L1/kN1+4W/85G8mo+aXPnMjFowsDp9X4pmuqiQs0369iputVhxEzfGPPoqaUzcG/LxEzQBwuBrRZdefpUtO/TCpbJmvxoFoz5/h69lXFMmuN4nGlb8O7WPb2uuQnD6jI4IWNQPAYRgRNWcDRIspFB6/kQ1ezAcsf6ZcU6WO+ZjJbEWZMWXDJx988NYTr3X/WcGpWd/QtHlK/YNz5nb9uxg1L35+J7duPbH46ZRRc/uH1Y4K29u89+oTN27lM4mUP/TsxFhmndk0wFGcm58i5QQPWSiczdrbtd92Pa3jGXTKBfFmUVEeOL/+5I127J388Q38WbTmav7ti5VzNWfzXrwe/NiXU1Eknlfima6qZDldRv6juf/FW/nMJe01rVY8PWoe8PMSNQPA4Wqlk83RwNW0EV2TDI8r2znjQ7LsiH2tOV3zRl+H/LGtvQ7p6TPam5hAAwAOyIioOZt49dZyEOXJ6/nY1XrNg7eWf7ksS5Vzj58sbmS/np/JJ2x+omOa5tzUrO8iSps/9rOff+PK6v/WC7/8U8Ny5nb9Oxk1v/f26UNltpgnl+0fVjsqTPxA3//w9SeqVcUUFsWaGzeeeD2epSJ8LJviOTtvuvbbrqd9PENOuSDezKo8qXd/3nGx44qi5uzPAr7xe/9Td9R8/+kHT+IXqJz/ov282mtWVpI98Scef7DxAsZr2q24K2rOrink1wa6ouZBP6+ykjEvOwCwDxIDYcvxtvX61CTD08qmprUoH2yX7d9XWNlV/1nAIc9l3LFt73WoAuZ6dHOTqBkADs3qv4v3wWU1JcJyNoIf/aie9LZcc3l5uVz5/ofFFh9+WG/WO01zbo2o+aJIm3/nC//q93/w4Z9dWf3f/eAv/uSrv/7rA3Lmdv27FTWXP8Lg/8ufTOuHVf+wq1upH2ix7p3TW8XMvNVWqemQq8equTW699uoJ3E8A0658JRN7b5t6un3//7T/zOImtv/fvPT/yYaZl+98vHL8+H7qeeVWLOiknyq5HcugxewvabdipcvV9ePPnyofWP1z6usZMzLDgAAAMAcDcty15DNmnDjRt/kGZn1ouaLLG3+4MM///6fXm397/3gww8H5Mzt+ncrar5iy59oPkz42a5hwjMz9fT7/p9968uf/spPfjyVM3/ihb/32f/0x3/+3c0ddUt7tore+Su2TtQMAAAAsE82HjUvxz0mBrtG1o6aV7jm+jcXNf/Rv3viZ/5m+7fiAn/zZ574d3+0/jPqNmSY8MxMPj3+9Pv//S/+8i/TP9G/vBwyHv4qxcO502t2iagZAAAAYJ9sPGoeRtQ88JC++8EPL/+y3+UPP7jOobT7YNOnB0miZgAAAIB9siNhmqj5yg+J4UTNWyFqBgAAANgnOxKmiZqv/JAYTtS8FaJmAAAAgH2yI2GaqPnKD4nhRM1bIWoGAAAA2Cc7EqaJmq/8kBhO1LwVomYAAACAfbIjYZqo+coPieFEzVshagYAAADYJzsSpnWFTq9eneusf52o+QoPieE2fXqQJGoGAAAA2Bvbjppq+xQ6rRM1AwAAAADAhagZAAAAAIC1TYia7wIAAAAAQGBC1AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1+/8/PwuAAAAAADkzs/Pp0XNFztgcfzbPgRgg7RxOCiaPDAjuixgLvRXTOPMYRpRM7CztHE4KJo8MCO6LGAu9FdM48xhGlEzsLO0cTgomjwwI7osYC70V0zjzGEaUTOws7RxOCiaPDAjuixgLvRXTOPMYRpRM7CztHE4KJo8MCO6LGAu9FdM48xhGlEzsLO0cTgomjwwI7osYC70V0zjzGGa/Y2a33ruH/3tpc+9Ej3wyuf+9j967q1ow+h+vkUtfyyrrNqoLNDerH8vwdbNYwJS0m280ZqWDfCV9spy/coGDuyGvrf1oOVmb6HJfuCtYsMV77/dZRs76ntzT1bynO4FDkhnl3UVXyX0RcAVWhkYrg5J2msa5Yd0WXmftSKfYZd0njnJgCv99hev6T5VVry1OUdmZU+j5vDzXNx1LR753HOL/14Jt20nUY3ub3mqFyuDz4fVZo0uc8Ve9KYwSP+HoqhVBXe61hfaDRzYDb2fZst2GyU2rSY+5v03/Z1p1Jt7u3rdCxyMvqh5za8SF/oi4CqtiJqHhCQro+ahXVZckf5qt/V9OG9/wE6+/VWbLbfq+omvfGtjVvYzao7PyLfeeuWt+JPXW+EZPDBqzgYILLdLfT6M763ciw4VhhA1w0EZ+Lbe88io99/VUfPKN3fxDhywcVHzmK8S7fv6ImAd/d+qBoUkw6PmEdnIK5+TJO62gR/Oi594f9S8vN3xDrX6rY1Z2c+oufPzVflA+4RvbNUYp7/cpjjv058Pg2pW7sWoZhhkU1GzX8SBndTT5MuG23x3TwfJw95/h0TNK97c29XrXuBgDJpAY8pXibISfRFwRXq/VQ0LScZEzQO7LEHz7hs9qjn59hdulX6HGvDWxqwcVNTcOM0bv8TWV7z+SLj8mNj3+bBzLyaagZGMaoaDMuAvjyw/nqYH3Yx9/x0VNacrN5IQDtjYUc0Dv0okK9EXAevo+Yg1NCSZFDV3dVkXht/NxMC5mqtR6un5oxpzNbfeoQa9tTEr+xk1d357TM0sPiZqLieQ6fmtt5V70afCUKJmOCgD/8h1R7w8+v13zAQaHZWLd+CATYiaB3yVSN/XFwHr6P6INTgkaa2pSy46nJFd1oWOaiYGZG7BB+z+CTQuOrYZ+NbGrOxn1JxfOwm/e2a3m6d0edqOipqLZtD6fPhWOfX9kL281f6zq0CCqBkOSu9vo6f/2Ez0OXfk++/qqHnlm7t4Bw7YlKh55VeJZCX6ImA9g/ur7pBk+KjmAV1W4kF20qDhnZ0/8WFfxge+tTErexo1X4RXRsq+stWTVTOPhxdQlpfk4hWtdtSaiKa++Ne9l/gSnqHNsNLVRM0rGziwG/p/uzM1Iib8RjT6/XfAr0CtenPvmR9V9wL7btBczeO+SnRVoi8C1tLRX40JSdprGqXGdFkXouaZGP5nAZvzMLff/upNw20Gv7UxK/sbNQOzp43DQdHkgRnRZQFzob9iGmcO04iagZ2ljcNB0eSBGdFlAXOhv2IaZw7TiJqBnaWNw0HR5IEZ0WUBc6G/YhpnDtOImoGdpY3DQdHkgRnRZQFzob9iGmcO04iagZ2ljcNB0eSBGdFlAXOhv2IaZw7TiJqBnaWNw0HR5IEZ0WUBc6G/YhpnDtOImoGdpY3DQdHkgRnRZQFzob9iGmcO00yOmu8CAAAAAEBu1qOaAQAAAADYBaJmAAAAAADWJGoGAAAAAGBNomYAAAAAANYkagYAAAAAYE2iZgAAAAAA1iRqBgAAAABgTaJmAAAAAADWtPGo+d7tm0eP3qnv33n0KHfz9r1oo+B+o0h2txCvzYukH03uJXk8Vfn2pgAAAAAADLLZqLlIfKtot855o8Q3TJqbRRb3y8eyMsHt7Gby0Y69JCrPVhR3gpoAAAAAABhlc1FzHuvevH0nTHvrZDdKgcvViSJBiYtGMry4lX40vZcVxwMAAAAAwFTXOoFGNE9GPYy4Gfg2xyJXuouEj3bspet4bnfOtQEAAAAAwCDXGjVHuW91J56o+aIrak5Mn5F+NL2XVOX5PM3FnXaVAAAAAAAMs/1RzenYuBE1Z7Nf1Fs1i/Q8unpUc+eWAAAAAAAMc61Rc3IW5fZcGI2oORx73Kom8WjXjNDJ4xE1AwAAAACs7Xqj5nqai56kuXOOi1JdJPVoci8dxxNXJWkGAAAAAJjkeqPmi+VkF8Ff4UslvEGRPEuOPHqnLpJ6NLmXAceT/kOEAAAAAACstvGoGQAAAACAfSdqBgAAAABgTaJmAAAAAADWJGoGAAAAAGBNomYAAAAAANYkagYAAAAAYE2iZgAAAAAA1iRqBgAAAABgTZOj5rt37y6KW1paWlpaWlpaWlpaWlpaWlpaWlpaWk6Omi93wOIpbPsQgA3SxuGgaPLAjOiygLnQXzGNM4dpZh01AwAAAACwC2YdNbvCAvtNG4eDoskDM6LLAuZCf8U0zhymmXXUDAAAAADALph11Lz6Csv56fHR0dHJWbXi7CS+H28ZPZCtSW05UL6nwvHp+YqDXGNHa5eHnbWqjS9beKy/uTVLh01n0WiHFx5b+ZhHN7FHmIMRAycS7bfdAyw2Cu43igT9R7w2L5J+NLmX5PFU5ZO9Sqqeeo/JhpzcdffxTCwCjHAoXdbYyjsf1WXB1gxMTq4yD2EvDPo+3nhvcNYw86h5tezEPz4+qT6cnJ0cH6c7zOJDVOMT3cRG0mhvWXPr+YAkaoY1TWsEjVJnJwvX9FVG1AzrKLKH6oSvz/6oHYSxTbNIcGkp/6hQ385uJh/t2Eui8mxFcSdxCStZT71deDi9RbqPZ2IRYDPm3WWNrLzzCeqyYLddaR7CAWm8KzlnyG0uav7xL/zK2H9jD37YtbkgPTo/ze7kJ3/9mWr5IW3ZKOq1jWZSjVFOfggq6y8+i7U/pTW2jwcG9O2oOLzT5tpgy+PyKXVVnm/g2hJzNHS8UNdgoVSLKVe2G/Wi2Z4FWXPWHZwWTSr87tdemdpjdUiJJhxuHD1c9B/N2od0C6mnDHMzpMnn5/rx6VnjrbPV9ILViSLh230jZlncSj+a3suK40k/g3RHcd7YoN5Lctcd9YwtAkx1EF3W8Mp1WbDDBiYng/MQDsXQd7ryvSGIxlZ+H2efbTRq/ok37gz/NyFqHvD0ig6zzJJO6k9WVaS0vFF2pFEE3brC3/5SeB5M0dEeWdDSGBjQ+JSV2NFyB9WhNlPty3BOkK7KtWT2XfwFJNGOki07LFU26eDjVfFt7Pwy/EWg5Mq4PbY7i3YTbrTw4Gb72IZ2C76FcVBS7TcXNceoSXS2ke4i4aMde+k6ntP2VaO+o+0d1ZwssvJ4xhYBNme+Xda0ynVZMDvD8hBtkZT8tDirO+2h38fZX7OOmodem1ssszM5/194obxIlqopzqL18SX1aExjmDVnW58u1yWyql7JYUupHfVf5U+31FRxmJtJo5pT7Sj5qSj+bYPW17YgSq4f71rZ2nvqWlJqZfg9KrydCKBWdAsaO/M3ceLTqH2Hn227o5V4beN30dOPpveSqjy8yNuusrOexK809BXpP54JRYCRDqLLmlC5Lgt2z9DkJLuVzEOSX7XYfwPf6cIxUyO+j7O/Zh01D3h6y+4xG86cjTbOb8YJT7sjLT9kRV1rKAyX8mWxZTOF7hJU146aWzsakCk1uv6OymF/pX+9K05tzqvpZVqD/4PHgt/oaX7Daf7uQLUy2nvZ/q8yap7SLcCeWzlEMJ3BNNrIWfS3FJpFeh5dPUSwb8vk0Ua/cRgfpyGCMHfz7bKmVa7LgtnpyUOSX3YgNO37OPtr1lHz8Gtzy7HHcYCcj3Ku5nFu959nYQKcCHDOlnO2VuOZT3v+okZVe/AFMtF1p3Y0YlRzf+UwP1NHNfee8+3f54k/MaVS5XAAc3LlRkc1D+sWNHbmb+IQwbCZhG+JjQbRaCPhQL5WNYlHk3vpOp6+eKTjaMcW6T+eKUWAcQ6jyxpfuS4Lds+YUc2XvXmI6z6HZbPfx9lfs46aBzy9MIVNjgZsj2+s7h71TcRa1BlEVkedH/fqcQDJvQcrEztKR83xlketoZWpymFvtcb5N9tRo+XGjet8ecnoMii/vEKVGOCcXNnbcteNmgd3Cxo7B6X5hajZOBKfcZsNpzvpSD2a3EvH8cRVNT9Lp+rpH9Wc3nXv8UwpAmzMfLusCZXrsmCOJuQhUJn2fZz9NeuoecS1uXQaEyRMrU8w8Qer6lcAgibR/8Uw/KWBRqFi5clJlXP17Kgjaq5rqupZXTnMzKSrqJfJBtucW6Ysttjm+Lj97e04m11n2ZCiepIrw+p7E+A4V8o3Xh01D+4WGpe8YH6mDhG8rJtJ/atKyYF5YTATySfDCn7Pqfloci8DjifdJFP11J1U8iJ4ctetlROKAFMdQpc1onJdFuywkaOayxWJmMJ3jcOy4e/j7K2NRs1j/23+6caaYxkBKsmrrS7BAgAAAKRtLmq+BiPGErTkF+lERrDT1mnjaxM1w3XbapMHGEeXBcyF/oppnDlMM+uoGQAAAACAXTDrqNkVFthv2jgcFE0emBFdFjAX+iumceYwzayjZgAAAAAAdsHkqPnu3bsXFxeWlpaWlpaWlpaWlpaWlpaWlpaWlpaWk6PmCwAAAAAAyImaAQAAAABYk6gZAAAAAIA1iZoBAAAAAFiTqBkAAAAAgDWJmgEAAAAAWJOoGQAAAACANYmaAQAAAABY08aj5nu3bx49eqe+f+fRo9zN2/eijYL7jSJliaOonrJItnH74eReksdTlW9vCgAAAADAIJuNmovEt4p265w3SnzDpLlRJNguVWSxdVkye3h5u2MviePJVhR3gpoAAAAAABhlc1FzHuvevH0nTHvrZDdKgcvVqSKBdpGgvriaxF5WHA8AAAAAAFNd6wQa0TwZ9TDiZuDbHIucWJ3KiMsKO/bSdTy3O+faAAAAAABgkGuNmqPct7oTT9R8kYqaiwmVq81aRYLpMzr2kqo8r7aenkPYDAAAAAAwyfZHNadj4+S8Fl1Fsrkx6hUjRzV3bgkAAAAAwDDXGjUnZ1Fuz4XRGTWX24ZFwpHJPXvpOh5RMwAAAADA2q43aq6nuehJmlfOuVEXSeTM6b10HE9claQZAAAAAGCS642aL5aTXQTzLqcS3rhIMU9zXaYuEjxUCBLqjr/113U8HeOoAQAAAABYaeNRMwAAAAAA+07UDAAAAADAmkTNAAAAAACsSdQMAAAAAMCaRM0AAAAAAKxJ1AwAAAAAwJpEzQAAAAAArEnUDAAAAADAmiZHzXfv3l0Ut7S0tLS0tLS0tLS0tLS0tLS0tLS0tJwcNV/ugMVT2PYhABukjcNB0eSBGdFlAXOhv2IaZw7TzDpqBgAAAABgF8w6anaFBfabNg4HRZMHZkSXBcyF/oppnDlMM+uoGQAAAACAXTDrqHn1FZbz0+Ojo6OTs2rF2Ul8P94yeiBbk9pyoHxPhePT8xUHucaO1i4PO2tVG1+28Fh/c2uWDpvOotEOLzy28jGPbmKPMAcjBk4k2m+7B1hsFNxvFKnfpsN6yiJB75Io0+4qmsdTlU/2Kql66j0mG3Jy193HM7EIMMKhdFljK+98VJcFWzMwObnKPIS94MxhmllHzatlJ/nx8Un14eTs5Pg4fdoXH6KCh9ZoII3Wln1I6vmAJGqGNU1rBK0vcQvX9FVG1AzrKLKH6oSvz/6oHYSxTaNIsF2qSHDhKf8gkd/u2EvieLIVxZ3EJaxkPfV29Q5XFOk+nolFgM2Yd5c1svLOJ6jLgt12pXkIB8SZQ8rmouYf/8KvjP039uCHXWEJ0qPz0+xOftrXn6mWH9KWzaFe22gg1UiC5Iegsv7is1j7U1pj+3hgQN+OisM7ba4Ntjwun1JX5fkGHaOkYKcNHS/UNViobzhQu1Evmu1ZkDVn3cFp0aTC737tlak9VoeUaMLhxtHDRf/RrH1It5B6yjA3Q5p8fq4fn5413joTgUy1OlUk0C4SfhiIqknsZcXxpJ9BuqM4b2xQ7yW56456xhYBpjqILmt45bos2GEDk5PBeQiHwpnDNBuNmn/ijTvD/02Imgc8veK0L7Okk/qTVRUpLW+UzSGKoFtX+NtfCs+DKTraIwtaGgMDGp+yEjta7qA61GaqfRnOCdJVuVbNvou/gCTaUbJlh6XKJh28SRbfxs6Lm0FA3VwZt8d2Z9Fuwo0WHtxsH9vQbsG3MA5Kqv3mouYYNYmONpJKekJlhR176Tqe0/ZVo76j7R3VnCyy8njGFgE2Z75d1rTKdVkwO8PyEG2RJmcOKbOOmodeYVksszM9/194obxIlqopzqL18SX1aExjmDVnW58u1yWyql7JYUupHfVf5U9/Ek0Vh7mZNKo51Y6S723xbxu0vukFUXL9eNfK1t5T15JSK8PvUeHtRAC1olvQ2Jm/iROfRu07vPrSHa3Ua8JopVUkzH3Te0lVHl7kbVfZWU/iVxr6ivQfz4QiwEgH0WVNqFyXBbtnaHKS3UrmIcmvWuw/Zw7TzDpqHvD0lid5Npw5G22c34wTnnZzKD9kRQ0kFIZL+bLYsplCdwmqa0fNrR0NyJQaDbijcthf6V/SiVOb82p6mdbg/+Cx4Ld7mt9wmr87UK2M9l62/6uMmqd0C7DnVg4RTGcwyTbSVeQs+ksLI4cI9m2ZPNrw15ba+ZIhgjBr8+2yplWuy4LZ6clDkl92YMmZQ8qso+bhV1iWY4/jADkf5VzN49xuBfUkZulhymfLOVur8cynPX9Ro6o9+AKZaICpHY0Y1dxfOczP1FHNved8e8aJ+H0vlSqHA5iTKzc6qnlYt6CxM38ThwiGzSR8S2w0iO42UmzbfGttbJ3aS9fx9MUjHUc7tkj/8UwpAoxzGF3W+Mp1WbB7xoxNvezNQ1z3OSzOHKaZddQ84OmFKWxyNGB7fGN196hvItaiziCyOur8uFePA0juPViZ2FE6ao63PGoNrUxVDnurNc6/2Y4aLTduXOfLS0aXQfniK1x7gHNyZW/LXTdqHtwtaOwclObH2mbjSFykCYukot26SCJXSe+l43jiqpofq1P19I9qTu+693imFAE2Zr5d1oTKdVkwRxPyELh05pA266h5xBWWdBoTJEytTzDxB6vqd9iD5tH/xTD8rfdGoWLlyUmVc/XsqCNqrmuq6lldOczMpFHNl8kG25xbpiy22Ob4uNFGlm+E2TJrSFE9yZVh9b0JcJwr5RuvjpoHdwuNS14wP1OHCF7WzaT+VaXkwLy6SP2O2ZooNXio0bDPOqdT7uyFkk0yVU/dSSUvgid33Vo5oQgw1SF0WSMq12XBDhs5NrVckYgpfNc4LM4cptlo1Dz23+afbqw5lhGgkrzy6nIsAAAAQNrmouZrMGIsQUt+qUVkBDttnTa+NlEzXLetNnmAcXRZwFzor5jGmcM0s46aAQAAAADYBbOOml1hgf2mjcNB0eSBGdFlAXOhv2IaZw7TzDpqBgAAAABgF0yOmu/evXtxcWFpaWlpaWlpaWlpaWlpaWlpaWlpaWk5OWq+AAAAAACAnKgZAAAAAIA1iZoBAAAAAFiTqBkAAAAAgDWJmgEAAAAAWJOoGQAAAACANYmaAQAAAABYk6gZAAAAAIA1bTxqvnf75tGjd+r7dx49yt28fS/aKLjfLJJcWxbJVheCR5N7SVZelW9vCgAAAADAIJuNmovEt4p265w3SnzDpLlZJCgZri2KLLYuS2ZbLG937CVV+WJFcSeoCQAAAACAUTYXNeex7s3bd8K0t052oxS4XJ0qUm5889FHb7Yy4qC+uJrEXlYcDwAAAAAAU13rBBrRPBn1MOJm4JuY42Kx5b1VGXFZYcdeuo7ndudcGwAAAAAADHKtUXOU+1Z34omaL5pRczgpczKzrsrUyfXwqLmaTaNdJQAAAAAAw2x/VHM6Nm4XCdY2i2RzY9QrRo5q7twSAAAAAIBhrjVqTs6i3J4LIw6Vj2LFHwOM/tJgo4KOGaGTxyNqBgAAAABY2/VGzfU0Fz1JcyIfjtfWRRI5c3ovXZVHVUmaAQAAAAAmud6o+WI52UXwV/hSCe+KqDmeUyMWzArd8bf+uo4nsUcAAAAAAAbZeNQMAAAAAMC+EzUDAAAAALAmUTMAAAAAAGsSNQMAAAAAsCZRMwAAAAAAaxI1AwAAAACwJlEzAAAAAABrEjUDAAAAALCmyVHz3bt3F8UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tJ0fNlztg8RS2fQjABmnjcFA0eWBGdFnAXOivmMaZwzSzjpoBAAAAANgFs46aXWGB/aaNw0HR5IEZ0WUBc6G/YhpnDtPMOmoGAAAAAGAXzDpqXn2F5fz0+Ojo6OSsWnF2Et+Pt4weyNakthwo31Ph+PR8xUGusaO1y8POWtXGly081t/cmqXDprNotMMLj618zKOb2CPMwYiBE4n22+4BFhsF99NtpLG2LBL0Ls0PEcl+pll5VT7Zq6TqqfeYbMjJXXcfz8QiwAiH0mWNrbzzUV0WbM3A5OQq8xD2gjOHaWYdNa+WneTHxyfVh5Ozk+Pj9GlffIiKP7tNbSCN1pZ9SOr5gCRqhjVNawSNUmcnC9f0VUbUDOsosofqhK/P/qgdhLFNs0hQMlxbFAkuPOUfJPLbHXtJVb5YUdxJXMJK1lNvV+9wRZHu45lYBNiMeXdZIyvvfIK6LNhtV5qHcECcOaRsLmr+8S/8yth/Yw9+2BWWID06P83u5Kd9/Zlq+SFt2RzqtY0GUo1RTn4IKusvPou1P6U1to8HBvTtqDi80+baYMvj8il1VZ5v0DFKCnba0PFCXYOFUi2mXNlu1ItmexZkzVl3cFo0qfC7X3tlao/VISWacLhx9HDRfzRrH9ItpJ4yzM2QJp+f68enZ423zlbTC1anipQbh++hVZHww0BUTWIvK44n/QzSHcV5Y4N6L8ldd9Qztggw1UF0WcMr12XBDhuYnAzOQzgUzhym2WjU/BNv3Bn+b0LUPODpFad9mSWd1J+sqkhpeaNsDlEE3brC3/5SGI4uaI8saGkMDGh8ykrsaLmD6lCbqfZlOCdIV+VaNfsu/gKSaEfJlh2WKpt08CZZfBs7L24GAXVzZdwe251Fuwk3Wnhws31sQ7sF38I4KKn2m4uaY9Qkmm0kvNJcF261orLCjr10Hc9p+6pR39H2jmpOFll5PGOLAJsz3y5rWuW6LJidYXmItkiTM4eUWUfNQ6+wLJbZmZ7/L7xQXiRL1RRn0fr4kno0pjHMmrOtT5frEllVr+SwpdSO+q/ypwOmVHGYm0mjmlPtKPneFv+2QeubXhAl1493rWztPXUtKbUy/B4V3k4EUCu6BY2d+Zs48WnUvsOrL93RSv1wZwBUlUl9Ql6V2xy1O5fLVNFGA+9IepJF+o9nQhFgpIPosiZUrsuC3TM0OcluJfOQ5Fct9p8zh2lmHTUPeHrLkzwbzpyNNs5vxglPuzmUH7KiBhIKw6V8WWzZTKG7BNW1o+bWjgZkSo0G3FE57K/0L+nEqc15Nb1Ma/B/8Fjw2z3NbzjN3x2oVkZ7b30XvIKoeUq3AHtu5RDBdAbTLpK85lRVFTT4kUME+7ZMHm34a0uNtmyIIMzdfLusaZXrsmB2evKQ5JcdWHLmkDLrqHn4FZbl2OM4QM5HOVfzOLdbQT2JWXqY8tlyztZqPPNpz1/UqGoPvkAmGmBqRyNGNfdXDvMzdVRz7zmfnOMiaLKpVDkcwJxcudFRzcO6BY2d+Zs4RDBsJuFbYqNBxB8Ajo5aV3Gab62NClJ76Tqevnik42jHFuk/nilFgHEOo8saX7kuC3bPmLGpl715iOs+h8WZwzSzjpoHPL0whU2OBmyPb6zuHvVNxFrUGURWR50f9+pxAMm9BysTO0pHzfGWR62hlanKYW/F53miHTVabty4zpeXjC6D8ssrVIkBzsmVvS133ah5cLegsXNQmh9rm40jcZEm3UZSoUYiV0nvpavyqKrmx+pUPf2jmtO77j2eKUWAjZlvlzWhcl0WzNGEPAQunTmkzTpqHnGFJZ3GBAlT6xNM/MGq+h32oHn0fzEMf+u9UahYWf4J6eY4h67f8U98TI3qWV05zMykUc2XyQbbnFumLLbY5vi40UaWb4TZMmtIUT3JlWH1vQlwnCvlG6+Omgd3C41LXjA/U4cIXtbNpP5VpeTAvJ7c5jz6BfVYWeysczrlzl4o2SRT9dSdVPIieHLXrZUTigBTHUKXNaJyXRbssJFjU8sViZjCd43D4sxhmo1GzWP/bf7pxppjGQEqySuvLscCAAAApG0uar4GI8YStOSXWkRGsNPWaeNrEzXDddtqkwcYR5cFzIX+immcOUwz66gZAAAAAIBdMOuo2RUW2G/aOBwUTR6YEV0WMBf6K6Zx5jDNrKNmAAAAAAB2weSo+e7duxcXF5aWlpaWlpaWlpaWlpaWlpaWlpaWlpaTo+YLAAAAAADIiZoBAAAAAFiTqBkAAAAAgDWJmgEAAAAAWJOoGQAAAACANYmaAQAAAABYk6gZAAAAAIA1iZoBAAAAAFjTxqPme7dvHj16p75/59Gj3M3b96KNgvtxkexerVpfFgkeDnaT3EvyeKry7U0BAAAAABhks1FzkfiG+XBxJ0p8w6S5WSRbEUbDcZHFg2XJrMbl7Y699Fce1AQAAAAAwCibi5rzWPfm7Tth2hvExmEKXK5OFYkHPIe1LzaJY+igmsReVhwPAAAAAABTXesEGlFsXA8jbga+9xppcGL6jFRGXFbYsZeu47ndOdcGAAAAAACDXGvUHOW+1Z3WuOVGGlyXqbZsD3UOtkvvpavy8k7H6GkAAAAAAFba/qjmdGycnteiGMzcLJKNfK5XjBzV3LklAAAAAADDXGvUnJxFuT0XxsqoOSwSjkzu2UvX8YiaAQAAAADWdr1Rcz3NRU/S3D3nxuKBOGlO5MzpvXQcT1yVpBkAAAAAYJLrjZov6j/zV+S6qYQ3LpLHyWGZukjwUOPvBt7p/Ft/XcfTMY4aAAAAAICVNh41AwAAAACw70TNAAAAAACsSdQMAAAAAMCaRM0AAAAAAKxJ1AwAAAAAwJpEzQAAAAAArEnUDAAAAADAmkTNAAAAAACsaXLUfPfu3UVxS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8lR8+UOWDyFbR8CsEHaOBwUTR6YEV0WMBf6K6Zx5jDNrKNmAAAAAAB2wayjZldYYL9p43BQNHlgRnRZwFzor5jGmcM0s46aAQAAAADYBbOOmldfYTk/PT46Ojo5q1acncT34y2jB7I1qS0HyvdUOD49X3GQa+xo7fKws1a18WULj/U3t2bpsOksGu3wwmMrH/PoJvYIczBi4ESi/bZ7gMVGwf24SNx9VOvLIsHDzQ8RyX6meTxV+WSvkqqn3mOyISd33X08E4sAIxxKlzW28s5HdVmwNQOTk6vMQ9gLzhymmXXUvFp2kh8fn1QfTs5Ojo/Tp33xISp4aI0G0mht2Yekng9IomZY07RG0Ch1drJwTV9lRM2wjiJ7CMOW4k7UDsLYplkkW5FoMEWR4MJT/kEiv92xl/7KE5ewkvXU29U7XFGk+3gmFgE2Y95d1sjKO5+gLgt225XmIRwQZw4pm4uaf/wLvzL239iDH3aFJUiPzk+zO/lpX3+mWn5IWzaH8GNc1ECqMcrJD0Fl/cVnsfantMb28cCAvh0Vh3faXBtseVw+pa7K8w06RknBThs6XqhrsFCqxZQr24160WzPgqw56w5OiyYVfvdrr0ztsTqkRBMON44eLvqPZu1DuoXUU4a5GdLk83P9+PSs8dbZanrB6lSRePRgWPtikzjTCapJ7GXF8aSfQbqjOG9sUO8lueuOesYWAaY6iC5reOW6LNhhA5OTwXkIh8KZwzQbjZp/4o07w/9NiJoHPL3itC+zpJP6k1UVKS1vlM0hiqBbV/jbXwrPgyk62iMLWhoDAxqfshI7Wu6gOtRmqn0ZzgnSVblWzb6Lv4Ak2lGyZYelyiYdvEkW38bOi5tBQN1cGbfHdmfRbsKNFh7cbB/b0G7BtzAOSqr95qLmGDWJ9Ofe6LNvKnApK+zYS9fxnLavGvUdbe+o5mSRlccztgiwOfPtsqZVrsuC2RmWh2iLNDlzSJl11Dz0CstimZ3p+f/CC+VFslRNcRatjy+pR2Maw6w52/p0uS6RVfVKDltK7aj/Kn86YEoVh7mZNKo51Y6S723xbxu0vukFUXL9eNfK1t5T15JSK8PvUeHtRAC1olvQ2Jm/iROfRu07vPrSG60ctZtee9xgsF16L12VtzuXy1TRRgPvSHqSRfqPZ0IRYKSD6LImVK7Lgt0zNDnJbiXzkORXLfafM4dpZh01D3h6y5M8G86cjTbOb8YJT7s5lB+yogYSCsOlfFls2UyhuwTVtaPm1o4GZEqNBtxROeyv7pE/dWpzXk0v0xr8HzwWDBdqfsNp/u5AtTLae9n+rzJqntItwJ5bOUQwncGk28hZfMU4WB00+JFDBPu2TB5t+GtLjeM0RBDmbr5d1rTKdVkwOz15SPLLDiw5c0iZddQ8/ArLcuxxHCDno5yreZzbraCexCw9TPlsOWdr9VHvtOcvalS1B18gEw0wtaMRo5r7K4f5mTqqufecb884Eb/vpVLlcABzcuVGRzUP6xY0duZv4hDBsJmEb4mNBrEyt2m+tTa2Tu2l63j64pGOox1bpP94phQBxjmMLmt85bos2D1jxqZe9uYhrvscFmcO08w6ah7w9MIUNjkasD2+sbp71DcRa1FnEFkddX7cq8cBJPcerEzsKB01x1setYZWpiqHvdUa599sR42WGzeu8+Ulo8ugfPEVrj3AObmyt+WuGzUP7hY0dg5K82Nts3EkLtKERaJPu0UfUBdJ5CrpvXQcT1xV82N1qp7+Uc3pXfcez5QiwMbMt8uaULkuC+ZoQh4Cl84c0mYdNY+4wpJOY4KEqfUJJv5gVf0Oe9A8+r8Yhr/13ihUrDw5qXKunh11RM11TVU9qyuHmZk0qvky2WCbc8uUxRbbHB832sjyjTBbZg0pqie5Mqy+NwGOc6V849VR8+BuoXHJC+Zn6hDBy7qZ1L+qlByYVxep3zFbE6UGDzUa9lnndMqdvVCySabqqTup5EXw5K5bKycUAaY6hC5rROW6LNhhI8emlisSMYXvGofFmcM0G42ax/7b/NONNccyAlSSV15djgUAAABI21zUfA1GjCVoyS+1iIxgp63TxtcmaobrttUmDzCOLguYC/0V0zhzmGbWUTMAAAAAALtg1lGzKyyw37RxOCiaPDAjuixgLvRXTOPMYZpZR80AAAAAAOyCyVHzXQAAAAAAyE2LmgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBAXAAAAAACwnm1H3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7JjvvfP1VwNff+d7m9/nd+7Hu1kcw/3vDC4dHnFZ7Dv3X41lDzSeWrltqjwAAAAAAGv43jtfD3Lf+N6mrBE1Z5lyvW18L78f3I2qLZ9Z9Ayv5+kCAAAAAOy7jqi5HiZcjA9ehraL1eXj+f+rzZZrs+Jf//qyTOOhoM779xNR8/37wTjjOjJupNDNkLpx+MOi5usZug0AAAAAcDiSE2gEke3yZpHafuf+179e3lhsGGy23CCrrMqk44eCNVVeHR5D/ViYbTeS5sTw5yh8bkXNqQk0ouk2zKABAAAAALC+1BwSUaK7zHLzVd975/4738luVOsaKXVVWfKhqs72BBr3q/vFY8vN4+g4UXLgqOZWsaCAIc4AAOy4/x/cVLGkCmVuZHN0cmVhbQplbmRvYmoKMjgyIDAgb2JqCjE1NjU3CmVuZG9iagoyODMgMCBvYmoKPDwgL0xlbmd0aCAyODQgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1YS28cNwy+z6/QH/CEot5AYCBre4v2VsRAD0FOLdoe4hY+9e9XD1Kjl9e7OSXGZjSU+NRHiprXTQqIf3fp4QKK31+2V6JJ4VAo25OksULB7o0FkHGqcAI/IiE90v93sKMR3zJHOwZ+FhLw4G/x2/bPBuKn7cvXSP0j0o34byvimPHz9utgDPxw9rUWKok/oIWvm9NFJ9pdBhNCEB4Fuh2LSR9+fkHx+G92Ji/HhIUXYTSkwTcaJHl5qg7iM9nwumkDRUMaeCkssmDNgjucOYKeihZhsohigmEH6QGM8ELGsAGqbOKWTPRFFIi/ttPz9uEsjZAgnv88QB2ZjI5MGIIRzy/iy0cA9QBRXvzpexGt+khvMr7Bnt/xMb7KSHvs6RANARd/TzMdPxWe/FNFpjr365JIsNfpwnOja5CT3jNPK5t0jr4kGRLLb6SjpHmg+UTjtSs5ln6SfCHbJOvld7XwPTHonqZ88TvbvvAxxXS0I8t5KvTMt+JxC3mu3/H7r+L5lw4o1g5AkRSaASienMSyecBBVPRLJN0Y6WhN3bRh00MxJcLXilguWvjG5PB2DzrtidLVrsQd3cRAWxHIqkBbcSqSU3QSPW1ZHj+Ud+WrxkXCoJS7xeSIZIV44gDkcFCUKwJilO+C2d1q244JR2EhnOSwuGFR8iaD0hSwIAPNlIRgUHVSZxsGVTBy5V1QC64R/J1bnHGHGHeIymnBKfR4U1BuSKopWFxNeolNuvfuXcz3KSMQ1YgETVwZbv7IQgZ+G0DNBksgE/xh3wQD3XjIDB3CqhQ3Es6LzaNxtsncC2XaOn8ouIi3exFK1oeBTckjA2aj38Hw5OEswTWBXVaTwfuKTCZyEax2XAwg6+NAVnhkfTMslBlhwaFuC/mdsruacMrEXPYt1SdZ0M7bLfW4+HvSpKpvQdRK7Fex5brYxlU+j7v6L0fWJf7CsAjdm2C8bOhYOurEO8k0bcG7mLwm2oAzHLSb4PDWnkgwO646qWMG2/Lbr++PYT7jaUvUeeIxR4luV/ar2r6koXIKsjUtfxhXv1EP2KN1AWBN6kgGjni2Zx232X4DR0/EJzO1JnNMkPzIthhomphJy9MyWq4vEfg448GEiAcM3vijY1lBSbalYRWmxjE6uN5vWL+jWFD/9fScri2Wri1e7qBUCC56pIzbwdrgLV08FJSLR7l0LLo25dweAxACalWbqBRu6towdWgnglJ81g6Oj9b0/on80aV6AOfviSrk0PFJimMec0zSuodG3iBfPlzqBDXgbqPfAWW4oRV0llA0lq46cU3p4sVXt4St2nogVqKjWuDGiachMTuOW8+cajTFRtvFJJg+eOxZL4HVvtFcXeGyh3ou5wvqyHUk13LTpsTWUs9wwFK9ckKfB5l8oOhUntW9kEfXPJ6hSl0fbT2d3W0Jb8/Hpfsd19XH7U0naCLk7WgvImeYuwKFC5x05zDS9svRnmvw0Xo1S+BsYyMvuTsYNmMD7YQNFl5buuNUl7ueOsNKnfagzrwZ14m/6YhZl2rWc/PZ87mJUjsOvqwnrdm2WSM0SJ00Z23c74RpxSPURj9Ln31KvJZTiLuRpm8ZY0fdkVpL6rVTB1HPdpxWcBfFiJQNZDrJnMO1Q8vXuhkuys+lpCuH/ae5ERSHsdx85zVdU9m2kkdBqTDQRxhz+2hqFzB8mbQ6noLxeOw+4oIIfvd+ouYvsYtPuBjzQyeVuCLB8HrLd91BzPgBukzfaK00OwQ7vkIzvO3Lc2X/fPlrrdyldyH+iy1V7L9Cvsi7Wk9O6Vq/3CbUcjfK/tibkv7+B06V95EKZW5kc3RyZWFtCmVuZG9iagoyODQgMCBvYmoKMTM2NQplbmRvYmoKMjg1IDAgb2JqCjw8CiAgL1Jlc291cmNlcyAxNCAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMTUgMCBSCiAgL0NvbnRlbnRzIDI4MyAwIFIKPj4KZW5kb2JqCjI4NiAwIG9iago8PAogIC9OYW1lIC9JbTMxCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDI4NyAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA1OTEKICAvSGVpZ2h0IDcxNwogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztwTEBAAAAwqD+qWcLL6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBqJYMsXQplbmRzdHJlYW0KZW5kb2JqCjI4NyAwIG9iago0MzMKZW5kb2JqCjI4OCAwIG9iago8PAogIC9OYW1lIC9JbTMyCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDI4OSAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA1OTEKICAvSGVpZ2h0IDcxNwogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDIgMCBSXQogIC9TTWFzayAyODYgMCBSCj4+CnN0cmVhbQp4nO3de3Acx2HncfznqvyRv/LP/Zu6P65cpUu5gLpy7Eti1Z3jOI59VFmBJUqqi4goySWHc2zzYpGSebbLqrNkwYmhSmxFpk1He0mUmBQpa+HIKlpiZBCHWKqYFg0QtEWeY6v4UoiHTBDAvq4fMz09Mz2PfQxmgP1+CkXu9sz09C52+4fu6QWuXwcAAAAAAAAA9OW73/3uDq0cALBTfPczbxsZGbnnqSLqfuqekbd9Ji1t5MnT9+hDoZUDAHYQkUcjb3tbWalA2AEAiiez7p6norGgRmRPqSHfiD3sSyq/7g8QlaAmM7KLHKgLrUNETboNn7knKHnqnth5ks+SXjkAYIj5aRRJOx0zXkio2NC3k8qtm95YUddlh11woLWDdV57OtXePdgl1EjrTo7KAQA7x1Lt3n/3ro/PLOl7l176/PvGxr/03Uu9VheNGnsEZ4+HzN2EcnmwPXyy9w/CLtgjuJfUAnt//3bk5MFZc1QOANgp/vF/vfUtcgzzlrd9dGbp0ksP/YefU7N0v/CHz/ZWXzgMIvlip4TZMaE8ug4lvn/OsDO12DV6e1vzkgH/LIQdAOwWYiR36y/oTv4tP//zP+fdetsnX+ptaGcuiUXDo7ph544uwg4Adhcr7/pLuvisoH25q6xpzLSwczTY+UgIOwDY8S699Mm3vSXIuo/61++65ooOe0TmXPKRthQkc4FKv2GnzxIqzl05AGDHCK7TjfSZdwk54IeWCox7/GnOyHU9R7l/qPNDAWl55B8WnaZ0hl34LO4dEioHAOwUz3343/gJ9+DzzwfX7wbfmSfNGCbOJAIAMCBLx37v375FJN0LP5X39PW7X/jQ1872/NmDJIQdAKBEl376UzvafvrTnxZxFsIOAAAAAAAAAAAAAAAAAADA8zIAALtdBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIMn5qbGRkLGp893VUJ8QR03U+91NbR/JVVU/xOPVJ8jZbADALqDCzgRc+N52UtlT+JlJOAAYSpF4s9LAHvOF0zA8BLMDxNocDS6zmz7jxMRYsFus1qDAVKPTcGxMF06pe34loqA+NRY5INb+cOPczfaPdjQSALBjhcMuSABZ7hWHC73SYCQWbLbyIz6ECoedOlTfsg7IPKGpUt+zMyzSAmf73Tddp3M3EgCwM6VfszMX0uK5Et5HFqXPEUZGdkGARcMuFL/BnXDt7myMTcNG2u8KO/fp3I0EAOxMrmnMYEAThJi/SxAf0YFRxhCot7BLitLMsHO3PyvsXKWEHQDseM6x0ETdLnb29kG0VXJkl9B+RnYAMJQSRnbWMM26POaMGOc1u/iyztxhZw8REzMnV9jF2u/MPefpCDsA2E1i1+ziKxQnJqzu3prGdAz8HIs1ffnDLlSPY+1MdHd3xrrb7zd/op5nNSZhBwAAAAAAAAAAAAAAAAAAAAAAAOxGrwEAUAFl5yEAAAAAAAAAAAAAAAAAAAAAAAAAAMAQmZ+ffxHANir7TQ8MIxF2Kysrq6ura8qbAIoh3mXLy8viHVf2mx4YRuKtJ96D4p1448aN9fX1mwAGTbyzxPtL5x1hB5RCvPXEgE68Ezc2NjY3NxsABmdLEe8s8f7SeUfYAaXQYSd+8hRvyWaz2Wq12gAGSrytRN6JdxlhB5RFvPXEG/DmzZvip1CTdGU3CthVxHtK/DAp3mWEHVAWO+yIOaAI4p0l3l+EHRB2fmpsJGps6rwsnqh728M3+mCF3Y++unc0au+Rizkrunhk7+ihU8H9U4e6OLjbyrvZWsQZgW4QdoBLu6kvay88Mjpy7zP6Cnej2ZbFjZbYvvS50ZF9z9o3+uAY2fXWz0eOOnVIGFzadXPqytaJYUXYYWidffiXRkZ+6eGzqTtFsswbx9UnvMHeRD20g1Ue2j9DjrATYzQtlGWjocLIPqIKEXSnrLQTOxw6cmRveLjoLHSd0TRJVXwktNneObRZ1njKup1SeVqdQL8IOwyj4/eM3HO8deyukZG7jn1fZF5y5EXCzrvbangjvkbL2kFE3egjC95wUEecGQmmygw7Mx1pFcuQ0reCQvsonXX2fjo+dEXyphWR0UJrAjR+bnkjeavebN2Mty3poOQ6gX4RdhhCx++OXo67++mEXd1h55zGrO8bGf3cooyqdvOZe0f25b+QlxV29qU3k12u63HWUX7W2WlnhVmwPakwdvZQ2LmGe6ERZaRCu8Guh5NRJ9AvHXYbGxuEHYaHvh539C4Zc3cd1ZfjEnbtIuye3RfKz9FHz+dtT46wcy1YuXhkr6PEHlMZjnz0Y8ZVGDq7H1iDDLvYwyHsUDDCDsNJXbC766gMvNTLdt2Fnb+UxVvOkrcxOcIutc93zjSGr5DFcs0exDkLCx3ZxR4OYYeCEXYYRsfvUWO6RrPZUOO7e44n7dlF2LWeuVd+OkHerE/4t3LJf80ucS4wHHbi/1BIePGihlTRQZ6zMPOaXT9hl1p50omA/nDNDsNIzWPqqUvrpktS2LUXxa3IasxW4xl/JnP0kUU1sBv8aszQlGN4lrLjz17u3bs3khE6VOS/hw7FV2PGC+3qUzMoOnHqr8a8aDY7ws7xcDLqBPpF2AFpIsspg7v6g3iNVmiHViMyh9nzasxCOD9jPtAPngNVRdgBpTNhJ2Ky1crMxp4RdhhG5hdBE3ZAuXTYra+vb25u8icPgIETb6tmsyl+mBTvsrW1NcIOKIUOO/P37OQ0KICBEm8r/ffsCDugLPyl8uJs7HxlP4W7BH+pHCideOstLy/rvANQhDVFvMtWVlYIO6AU8wC2V9lvegAAAAAAAAAAAAAAAAAAAAAAAAAh8/PzLwLYRmW/6YFhJMJuZWVldXVV/5KHsn/VBLBriXfZ8vIyHyoHSjHP78YECsbvxgRKJ956YkBn/upB2b8eHthV9B9UFu+sDfVXD97k79kBJdFhJ37yFG/JZrPJn7QDBk68rUTeiXcZYQeUZd7/S+Xip1CTdGU3CthVxHtK/DB5k79Ujsq6NlebDplZKuIUybWarem79cEOu/axydGQPVNnO2en9oyOTh5zHy0OSNqUR5+Hdyf1gQzKTnpCsG1E2In3F2GH6rp2ujZdX9gyFuoDz7t2s7HVaKU24Fzmbn2IhJ3qas9OTYqU8/+TXfAu6YEr80Aq0xBsC8IOVWeyxtNqXJqt1eaueXeXZuIDPlMWSkVTqg4Ww7TazExN7RMM2cQ+M3PeUFKfw6o/NLKLnVdWODcXKc03GAyFnTeBaVLOI7rmKTks8sZ6HW8nXRLptc3gcHIytUPv8/Bgxz2hpqacSZwqyJhgDGsf7zy7OX7PlHDWlIgD9f7envFHJDfvmToWnD9cX6g08wnx26kqnZyMfjtQZYQdqi4aduJVu1j3kkhGTm32khjviQD0U0WUeSNBq1Cmjle6oI6W1U7XF8X9Ris4xbm6TDlVozeCVNkqD7V3C87r1ea1M1aYbzCYL+z8Plj0yOHOODJECY6UfXf26KX3w48dM7GV2uMHE4PWNKZ9THDbeXZrYlHcjGT9ntAA2PGI7KlTcdscnjiyix1uHWI/kIRvB6qJsEPVxcOuc1UM7U57w67a7BWZDu2mSEAdbCKw9FYralTWLerUaYnCZltV65WEw66+2JQ1ti57ZzFbg91knuq9Oi0/eXWFuvCqzMf8U605R3bBMCdxk7d9T3TIkqb3w63Li2lhFzqBnw2uS5MJZ09MpegT4X5E4TQKjskXdpFz+Nus4qRWoFoIO1SdI+yW/DhTA7GALtRjMWvGUldSm72aVG0o7Mx+cgApEysedqEmXY1morvNaQYcdvaWHHNsvR5ujbfS+3tn2GVHhDl732Fn70XYDSvCDlUXD45gPCeyyV670tDjKjWi24rNMYaHWslhd/qaKVXBF884FYN+k/zkrUrY2QOZHsIu/+Ghi28Z05ihi28p03/us9vtsGcVc4/sRl2HmFqj07UpWWk2EXY7DmGHqosGh1wZEptD1Anorygxy1dMdrWvhC/fzSwlht10sFZFR6pjQBc5b3g3R5szRMLOXj1hgiH0KQRvQ2SZxR5r5Uaeecg+D7dWjai1Gik723OTk5Mpp0o6uzXpGVzHS50DtR/R5NTUpKNSa9VLyuGu2VqvRNSVsKQF1UPYoerUwg+bWizibWw1FvyZzNrsZX2tLSiS+3qjPTHYs/a8FFptEhnZ1eu1UIUqKKfD+WidxD+Fs8LeV2NiUBh5QSLsUHVmTtJMVoZWN7YakTlMqyi8b3hPe51kcFtds7vcCFeoW9BohZZWBrXFKrFu974aE4MRfJKBsddwI+wAi33NbvsQdkDRCDvAoj+WsN1nJeyAohF2QOkIO6BohB1QOsIOKBphB5SOsAOKRtgBpSPsgKIRdkDpCDugaIQdUDrCDigaYQeUjrADikbYAaUj7ICiEXZA6Qg7oGiEHVA6wg4oGmEHlI6wA4pG2AGlI+yAohF2QOkIO6BohB1QOsIOKBphB5SOsAOKRtgBpSPsgKLpsNvY2CDsgLK4wu7Y5Khnz9TZktu3G4jnc/JY2Y0IE03ie7t9CDugdI6wOzZZsa65zwZV7vEkKKKdSXWendqzM56U3YGwA0oXCbtgUBca15liUyR6S31Xb0rqOdVue/bsUbuoXVUN5uhO+HZCBQFzHvfo05ROTupePulwp9ijlAV7po75deijnYUJz5I5f2SvPZOTe0J7OtqZ8NQ5H3veOu2nlbDbPoQdULocIzvRMZreOzQjp7tjHV6TiZNi3iHexJm/p31E2tGuBskSO4iD3n3S6uetXMzZrx87dixe5R4TE+Z5SCp0P0vxFgStC2WO62E6nrqkx56zTtMEwm77EHZA6bLDLhJF1taskAodcMwfak2a0YhXUWYYxXYIjT/dY5nQUCpv2E26arQO9hrvKkx+luItsPa1D3OFXfypS3jsuevM2oACEHZA6coLO39Ykt3txvbIPnF4+JOrX7eGY/YQ0T6TCbt44baFXcJj7zbssJ0IO6B0uaYxre7V3thn2Knbx3LUYZLLzNU5Z+HsQudcX2hyM6mdndBSRXnInmiKJBQmPEvxu4nBFG2n86lzz0DmrhMlIOyA0oXD7tXQmgb7GpRrSUR8xxhvYtFbyCL+s6935V4Bb6Yn4ys/rDlLR1Hi4elnUUs9TMBMTUYqdRYmzYLGphy93cRh0dUr4XYmP3XxB5q3ztBDJfu2DWEHlK7cD5VXfpbNOXjNN6IFfIQdULqSws69lKRqgk8yHMsoBFIQdkDp+HVhQNEIO6B0hB1QNMIOKB1hBxSNsANKR9gBRSPsgNIRdkDRCDugdIQdUDTCDigdYQcUjb9UDpSOsAOKRtgBpSPsgKIRdkDpCDugaIQdUDrCDigaYQeUjrADikbYAaUj7ICiEXZA6Qg7oGiEHVA6wg4oGmEHlI6wA4pG2AGlI+yAohF2QOkIO6BohB1QOsIOKBphB5SOsAOKRtgBpSPsgKIRdkDpCDugaIQdUDrCDigaYQeUjrADikbYAaUj7ICiEXZA6Qg7oGiEHVA6wg4o1AsKYQeUi7ADCkXYAVVA2AFFYxoTKB1hBxRBD+g6jOyAaiDsgCIQdkClmLDb2tpqtVplNwfYVdqKeGcRdkC5dNitr69vbm6Kt2QbQB/0OC5+Q/wwKd5la2trhB1QCh12N27c2NjYEHkn3pINAL0yk5aRG+L9Jd5lhB1QFvHWW11d1XknfvK8icHZ2PnKfgp3CfHOEu8v8S4T7zXCDiiFeOstLy/rvANQhDVFvMtWVlYIO6AU8wC2V9lvegAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmR+fv5FYKDKflEDQJQIu5WVldXVVf2L2cv+9fDYwcSraHl5mV90DKCC5vl7dugbf68NQMWJrkkM6PRfKufPlKMH4mWzubm5of4St8g7wg5ABemwEz+Ziy6r2Wy2Wq020CXxshF5J15FhB2AahJdk+igbt68KX5E10lXdouw84iXjfhhSbyK0sLu2pnOPz3Z+Yf/3fmHJzqvnulsbG8TAQw3O+xIOvRGvHLE6ycx7Fb/uXP81s7jv9h5/N93vvJWdeMXO0/c2nnp5U6jjOYC6NO1udr0zFIRFQ68Zl8o7C58de/o6OihU2brqUPh+8bFI3ud5T0zFQ68ZhQvLez+9WTnyFs7z36jc/HVzr98r/Pai52nf9vLO/H19DHyDth5rp2uTdfPFVFhu9nYarQGWLMvFnZ79x46ctHbeOrQ3r3u6Cku7LADJYZdY6nz1Fs7J//Zv3+j8y0xxPtPncWFzgsHO0+ovPv298toMoA+JIbd0sy0Zo/OTGFt7po+XAzf7P2so0Iju1htYmttbi5Smm8wGAu7Q4cO7fXS7uIReUdlkBjieVEkUklsT8wmNRYcjYwHTWFQ895Rez/rqFDNsdrU2Y+4zoESJYbdK3+iom3d2nerszTXeVPk3qXO6Q+r8d29nSvb3mIA/UgIOxFOtdlLW8JC3U82GUX1hS2rMNhr69KsyqlWQ94QezVaVs2O2uTWWGG+wWA87E6dOqRDRGTdkVN+9JzyI1DfSAg7EU5mN/+WtatXGGxzzF7Gd7dvqZSMnQIlSwi7y52jaux2/NnYEWudF+4IJjO/8/+2tbkA+uQOO5FO9cWmWvvRWvSiSGXdoo6ilgglsdn7T2qL3VQ9psKgZmdtcqtXeFXmY/6re46wE4Ei00b9F0SPl3bef+6wC8Z/QRRlzE/6hzjCLqs2Zj4rQ4fdxsZGOOy+401Ufv3vowe8+P4g6cTXDN9GYEdxhl2oUERR7bSOp9rs1VgFZoJyOinskmozhV1eN3SEnRrSyfGXuukHip6+9Ad4zqAJFer9g/8jzATlaFLYJdVG2FVPQtidCuLsm6fUQpT1zsUznVe/0jn8i4QdsIM5g8YM06QlMRYz8RQef8mgm1k005gJGZdc2+DCTg3fjkSnK+VIz1zP62tkJ4MuqJSR3c6XEHbf7zzpx9kTY51vfafzkyfl7f/z3lDSia9v/VOZrQfQLXfQmNlG73rblbboHa7M1sIrSfRUZMvUE06xoGZXbYMOOxVHznCJXWsLy7hmp2866+zimh1hVzkJ1+y2Os+NBYn2xPs7L3+r88ozndpbw2H31s4rq2W2HkC31EKREJVnrcZC3Z+cXPCuy7WbQWFt9lKj1W5envWPrtXreuCnMnHaj0IdYY7anGHX62rM1LlEO2jCgoDKXo0ZHL3XX+7pleVYjUnYVU/iaswLT0QHcU/s6dR/v3P8ic7z+zt/pVLvyBQftQN2GLkAMqxh1qCE7kcKTf75BfLX66pddZmMQmtpZaw2e6u53cNqzPTfoGJlHWBL/lD5VuelvdG8e3xv53W16eUDncff0XmVYR2AwpmwE9mZEnb2kn/Apn8RdPKvC7veef6DobB78k87F/+xU/+gnNj8wfVyGg1gyOiwW19f39zc5E8eoAfiZdNsNsUPS+JVtLa25vpF0Fud177R+ft3BHl3+B2d+t93/nWrhFc8gKGkw07/PTuRd/xJO/RAvGz037NLCDtjvXPtUmd1PXkHACjEUP2l8o2ylf0EFIW/VA6g4kTXtLy8rPMO6M2aIl5FKysrhB2ACpoHBq3sFzUAAAAAAAAAAAAAAAAAAAAAYJDm5+dfBAan7Fc0ADiIsFtZWVldXdWfCy7708nYqcRLaHl5mQ/ZAaim+WH6dWEoAr8rDED1id5JDOj0L4Lmt0CjW+I1s7m5uaF+C/Sbjr/vAwCVoMNO/HAueq1ms/kalOdzK/sP7JSv1WqJvBMvIcIOQGXNW3+pXPRaZYdMVeQPu7K/geUTeSd+Urrp/sutAFAJdtiJXqvskKkKwi4/8bJpJP6ZcgC7S31ixBibOp+y5/mpsZGJeu9n6vf4iLSwO3nwlpGR8cPOe6/F9rzl4Elzx9zuljqJknCm3qqX1SZW6ELY5UfYAUNCxs/Ivme2PM/sS827pc+Njux7tvez9Xt8REbYCV5IhO64wsTkU89hZ0fm4fGRhEoIu4oh7IDhIAZ1o48sNFr+/VZj4ZFRf/ClglDzSkJhZQaE/lhN7D82NRUttfYcm9hnjo9XLg+fmBhTBfmGgFlhd1A4qdNn/OBBFXahHBJ3RJnec1wXW2kkttrjtMiWSDiGU+zkycMnT/pB5awkXvn4+Hh4WOgdKzbcEuwVq01ujQwl7Tj7wbVO58aP5+XN+R/f8G8Sdj7CDtgdzj78SyMjv/Tw2YTN9X0jo59bbNtF7WZjS4WfzMHPLajxnglAK+x0TNob1Vb/mGfuNSNEs6caN+rjkyrXg8xGy7QiVWbYHT44LqPl8Li8qUd2wTjJv6UD6KTe7ggvHYmhoJLjxHA2+jvF23AyXke88qBV1p7BjRG7aeF9HAPFyPBN5J3IOJl6137AyC6CsAN2vOP3jNxzvHXsrpGRu459X2SeK/Ke3Tey7xttx8EdOcjbajT1tvY39umMCsIuiMl2UwTbPj+t7n1GH3PO3tMvbC0+4pUmVX7vM5kJZ8kMu5NiSCeHbuMmzKIZZ0WSjMSTwZ0RS2hHtZ/6x5E/jryz6/BbFa08qMi7ZY8Ug7qdtcXOGZutlGO66KCOsFN02G1sbBB2wA51/O6RiLufju0kImn00ZQVKdbSlUjYPbsvVLeqxZ7kNLfPP2rNfJpgS688r+ywCyYwTdh54RGLFz2XeDAIu4SR2mF/PlTd9MPGmTvBdKc/e2rCLlJ5nrBLqi0z7FTWOdOumyd7dyLsgJ2uKX8/xNbRu2SW3HVU3m40YzvJ8ImknblaJrPIW7my4A/IQmF3r1nWsqWHac6wC+WbSb70yvPKEXZiVHeLPz9pAkaGRbBeJXqZzs+RYDxnX0bzD9RX2YKsiSxQGdFJG6STHU/xyuPRG5rY9MPOWVtG2Mmok/OXejaTsAsj7IBdQF2wu+uoDLyky3ZqYtFaCiJDaPSRxZbOJX9SUcZQZOzWCi7KiWP0LWfYRfbUo7iMyvPKEXb2/8FoKrTA0Y6MaGSFVoyEt8cvmAWzk9Eq1OKTUKglrn4J3dKV3eI1Nrm2xLBTgzr/Ul38sl03T/buxDU7YMc7fo8a0zWazYYa391z3LWXXAnyjDUlKddmNvWlOJWDytg+bxWllUethjlMpKM6xB12coXn50a9eu7VpVmV5/xAXq8fKu/nw3Q7QOzSXKL+X2U7HWEH7HhqHlNPXVo3XVqNyHyk1m765eqX5srFkaFFkuYws9TE2hra06/J1JNZef+rMZPo4VFXn1vbaQi7/Ag7ANVnwk5kJr8uzCDsctK/CJqwA1BxOuzW19c3Nzf5RdBG/rDbtj8uUE3iNdNsNsVPSuIltLa2RtgBqCYddvrv2Ym840/aoVviNaP/nh1hB6CyhucvlW9UQNnPQSH4S+UAqk/0TsvLyzrvgB6sKeIltLKyQtgBqKZ5YKDKfkUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMt/NTYyMhY1Pny24TAAADpcLOBFz4HgAAu0Ik3uoTYnA3UQ82RUZ79kDQ2825p6pH37Gq1KVjY2ZPqzrXOYhdAMAghMMuyCirPEiraGHy9pSwC0IyukXedJ4XAIB+xK7Z6XQJZWA4iSIBFNrT3EkJO1fWuWsj7QAAAxEZjMWnMCPTjHovKxgdQ0NRnCPs9ClcYceCGQDAQNlZZcVd5koVE1UFjuwAABiIeFbFrtk5r8RF5zYjEekeMEbizbpr9neeFwCAfrhWY4aWk0QWXlqF6esn/R0nJpJGdp3wrGV4xBc9LwAAAAAAAAAAAAAAAAAAAAAAAAAMyGsAAFRA2XkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGwdWXDn826vBLV2Xx8QXHvrHC5DpFNd20Ik/N21XPoJj2DLBhRVSVVefC8djmqj3VAJBHpO/qpyvr4djd2nNWPOxy10nYAdglXGF3/Lg31PM22Pss+NuiPZ7ZoAd2C8fju1mjSVVq7WOfwk6Kw8ePHzaVuOqMP4rEFrramXnezDbIHV56KVTqeFxBaqj9g6Gv4/BIO1Mfe+QpDVXu34k+7QlZHN9NN9t/NTheDCnfEQCoFEfY+fOQoifTt4J9Qn12tIezihyHBmWuzjYpdMIdb6zO+KlTWxhvTuZ5M9uQ/oyZGwvHzT6haV7n4fbNtIcdf0qttPNu5nzaXbvpMEt6ROlNA4BKSZnGTO8S06qyd3PMhAWF2WEXzxlXnV23MOfjzdGG9BrshqlDI1mXcC77AfonzUgU7xCTdpERpLvN7jqDs0fa4Z0g73cZACqju7CzJ7tiXWmoG4wsfPF2sTb0EHbuOl3NTm5hpKzrsIu1IW/Y6XNHsy7HA7dnIx2B4nhK5e6hh5rraY/vFo5mV9glf0cAoFK6DTsjPoRyD0zsA5KvGeUKu+SxQ9ctzP14M9uQN+zkzePHo1nX38jO9ZTqmFswWZfzaXdWZbfDL834LgNAJXUVdpGJq+QoybjkJG9HOvDgiOAqWWzcEb+2FT11egsj2SNvZp03sw25wy541EnPf/4n0H2s/UDsO8lPe1Y7gwhMvWaXPnkMAOXrcmQXn+lKqCqyONPf7pXJ9Y2marOQ0D/gJcflsIQ646dOa6GrkozzZrbBvbP/uKITkvkGhqET2YdHH5TrKY2mqmOfhIFnvCprNabr8aY/GwCAIeTKOgAAdg01bmKmDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2hl/97w/yxdcu+Cr7nQSg0krvo/jiayBfZb+TAFRa6X0UX3wN5KvsdxKASiu9j+KLr4F8lf1OAlBppfdRfPE1kK+y30kAKq3HvuWR2Z90lj6bXjLgry8+dbUzV+u+Yclfnz0bPA8/+fYXzVmirs7eJ6sN8fdXX7UlUx5tYfqBeb5U5dkPfCBfKQ+kqyaJR332WM+Nt78vc98WT+AbTz3il4vvRcJRvb8HAAyBHnvFnR92qkf1elEvknT/7OzP1Q4mp+779huRY9UmHZTxpyXhwKp9pT8Q+ysjwo7NRZ7M3hqjaxA3rr4xp1t19o2fEHYAepLe57zr03/xgY/my5SgRPR1S0/JXr0T7thVHyhcXZq7qsplPyZud7x+1RoEWR2pfZQp9wujHXKkPGm3aAY5Yig17EJbY1WlncgcqG7ochW7Xgvv854360kwh+iqzi7pZymoM3jegvY76kkoTHlOEutPexTW0FgEU+yJCtWT9IgiYXd29qmzcnAtRnlzhB2AnqQl3WefOXDqnz/zXP2D8bzLCDt/ukn2dd5uojP0ejNZ6Iddx84vuw90HuXtbApl7x0ZQSQdG+4kHSOslDiLbQ2NCv1Ideed40DVPGfYWTsHpwiHnXog1sgrekhyPc5C148K4QcSDNOCJy0jsq2RXfA0uupxPiJH2B2779tLc2eXnnrkGGEHoDepSfed3/vsp2/72j9+6rlnb/vj7sLOjwnRielOVQ73/P39wsQpR7Nz5CjTbdpBkzbA/GxQYahv7y3sbKGRUbDVPYS02dntDKloJZGRXfiQ0AOJxKJrQjVtctL1QNwTtt2HnbseZ1K7wk5NAoiYI+wA9Cg16R4d/9sXP/ylRx15lxF2QY6ITszrfoNuKjHsrJUJpvMPdvCqCiYntXhmxY81mdtX2Kmt+uyOyLjPMXPrrtbkhaOft5aI2GPA1LALscM0VE9SYeoDCT9Rfor1GXZmh5Sw6/6r+9c+gCHi7joOPH77px8df2r2U994/mMvfFfk3fsffeK9ocFddKxkxZm9Kf/IzhoPukdn9sguuVfMN7Lr65qdjgznAoz4yo3oiUJ5kdLP68QxgZJrZJecXJErdM5C5wMpbWRH2AEYqISu42GZdMf/Vgbcgb/5iMy7hyP7yN4p6PBlEvlderiv8wd0Cdfs/P4tejtYbZ5yzS5+MS7nNbtfjVy36m41pr7A5B1rB0fOAWO4n7eGilZ2RAIlKezswsg1NWc98SfTmYDRy2pJ1+zcA17XNTtnPYQdgO3i7Df+8+Pf/qROOl0i8u7b375nf3Q31+fUdF/3xtzZ5NWYZ2ed05jBjFxo4aW/us+9GjM+qLGXOiSvxkxrf2bYRQd3afXErtnFjlqaS5jGjAZTUjQ4PxwXryepMPMJSVmNmfAoTOFn86zGJOwAFK/nviX5KzZnGPkq/BN5fA3jV9nvJACVVkC34ww7+zeTVPVT1Xzt5K8S30QAqq/0PoovvgbyVfY7CUClld5H8cXXQL7KficBqLTS+yi++BrIV9nvJACVVnofxRdfA/kq+50EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAgnJ8aG7FN1DP3z9ilPjEyNhauVBqbOi+2ZJ8AAIBBU2Engii4kxZHOeJK7GJ2IN0AAFUQCrtQPNljPrWDVaAPCAqCCkSZs7bQXXVjbGJizD+6PjXmqChWOQAAvYiEnbkrb3jFVmRFs1DvYWeaPbBLD7tQgqqdgt0TKgcAoBeRsItki06lYHjljKNIcWJl0ZFdLEpDSeuoHACAnqSN7OLRFAm76AqUSNb1F3axygEA6I0r7ET02MXOaczoiFALTWIOaGQHAECfwrliksdal2ldYEu4ZmeHVCiieg07Z+UAAPQo8XN2wYaJicjQLhyD1mGRgV3vYeeqHAAAAAAAAAAAAAAAAAAAAAAAAAAG4jUAACqg7DwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFTFwfLQhm7xMii6DQB2q7Le6ZFebmjbkF+hLRzmb0H1v/UA+leFHmaY25AfYbcNbQCwW1WhhxnmNuTnauHGGz++cOHHb2z499+8fOHChctvDqby7VCFb0H1v/VANSzNTBszS7rs2lzN3E6XsWfq5vxnSVaFHmaY25Cfo4Xzj+75wH33fWDPo/Pq7sWv/e4H9k2O3/pHT70xgMq3RRW+BdX/1gMVIJOuvrClXZqtTdfmronia6dr0/VzeSrI2DN1c/6zJKtCDzPMbcgv3MI3vvOVTx3Y977bHztz5rHb37fvgDQ5/mv7T4i7vzY+eWD6udd7r3z7VOFbUP1vPVA+FTeLLe9eu7lYl2lnxnpq2CXHX+GBnyipzczUpqfjQ0KPX0Ntpm7yLFpP+CzRu3nHfVXoYYa5DfmFW3hi/6h025+98sqf3TZqfPjoK4/drm6JGOy58u1ThW9B9b/1QPnaV8RgzhvNSa3GVqPZbjXkGE8M+BotmUG12Utm4KfjT0SkyEhTqPcMBMeI8JzWYRevxz5LsNmcRERvI1ytU8I7vT4xMjZ13io4PzU2ok3Ue3yynOcV9Y5Vsg3i7IbVjMQ2xFpr1xHb0kdrNS/skg0k7Lb1QTna4Hy2i3oZAEghE0VHkh6JebEXTDDq+NP7iv1UoT0edExFiuCqL+pjWpdnvc2J9ZzzDqnNXml3vNFlFxfy4u90vzOz+zLZv3g9i6v/i5ifn88s9M4rc2aqim0QhX5XKk/snc7dBldrdWne3riL1npO7NdpdubECRVqJx7T4XbixAl7c175vgXFPqhYG5zPdmEvAwCZRBBFLtqFI8xawhIJKVfYhUpMsKXXc87Erc7c09c6OeX6kd7q7u3Oxml1dfXuu+8+evSoXSjuikKxKXpecZ6JeoXb4DdEny6tDZGeN6uJPbfWU3jYKdvyoPxaHT9vxJ/t4l4GAFKI+LFHUWpYVV+KjLmmZ6wZy+ywC+Wb2Zxejwg7s0xG8MeAOeQOGsc4J0mkk4l3L+a8Kmeq3Ibw2dLa4IjmsdzTbflb6zux/z0feVzs9/hDD8n/jj70kY/o/x96SP13dwFhV/CDcoVd7Nku7GUAIE1LzmBacaemE69aMRSdsVRjrvSwU5V686FqLCc3Z9QTPiS4hpgtVy8XmrzKMXlkdTLO7sU/r5pAPF/lNnhXiIJ5s8Q2xFtrz3Jmj4fytdYoY2RX8IOKtsH5bBf1MgCQrtXYWrCmEGuzl9SoSi9cETHYbl6e9RdR1upyaeVSOODMnqFKL3kH6UPOyTGjox7r2FbDNKM2e1kN7PpajdnXqErTnYyze+mY+StVU7XbYJ0p/8gu2ifnmv3Lbm3gxH75AYMDByb37ZP/Hdg3Pq7/36c+hqA+lOA+S7DyxmpTTz9vDPhBFTGy67YNAJKZK3b2/KFauKIWQ+pbaqNgihrB5xX8PS3+QeYQZz2hY00zzDqWwa3G7OZCiW1VSTyvnkCsbhvCSZfRhuTW5huA5GptoIyRXcEPauDX7HpoA4DdquuVCV10chnn9XOmmm2IJV1GGxytDS70DWKRfDTsbnv4hQsXLrzw5JPyvwtPPvyw/v/JJ9V/k0UtUCnuQRWxGrPbNgDYrZLXnEcWnpviQX246Q+8CcRqtiHUArsVjjZktXYQPXK0ha8/9+m970122x9+5ZWNxKqyKg+1vvAHlbQaM3S6yCCaz9kB6E4Vfm3FMLchv0JbOMzfgup/6wH0rwo9zDC3IT/CbhvaAGC3qkIPM8xtyI+w24Y2ANitqtDDDHMb8iPstqENAHarg+WhDd3iZVB0GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwDarwi8kHPI25MfLoOg2ANitynqnH6zYr7uvfo9XaAuH+VtQ/W89gP5VoYcZ5jbkR9htQxsA7FZV6GGGuQ35uVq48caPL1z48Rsb/v03L1+4cOHym4OpfDtU4VtQ/W89UCHX5mrTEbW5a3mPnFnqaWv6oflUoYcZ5jbk52jh/KN7PnDffR/Y8+i8unvxa7/7gX2T47f+0VNvDKDybVGFb0H1v/VAhVw7XZuuL2zZGs127iPP9bQ1/dB8qtDDDHMb8gu38I3vfOVTB/a97/bHzpx57Pb37TsgTY7/2v4T4u6vjU8emH7u9d4r3z5V+BZU/1sPVEhS7ojBV21ubsYb7FnDsCWvrDZTdxzp2moNHlU9S+Fal6InyTfuq0IPM8xtyC/cwhP7R6Xb/uyVV/7stlHjw0dfeex2dUvEYM+Vb58qfAuq/60HKiQx7ET5dG32khzqLdTN1KZIJq9wsS7yKXKka2tQtnVpVqVYqyFviOFko2Vt9jYK7WZDbUqX8E6vT4yMTZ23Cs5PjY1oE/W8T0qe84p6x/K2IbGwiDaIExnWGROfB1fDTB2DaLIz7JL1HXYp33H5uAbzXcgIO2cbinopAshBhZrjkp0KwUU9oXlVZpM/CvMLW5dnozHp3NpqmHnRtohAVRYkrMq6K3Jzuym2dnEhL/5O93touzeT/YvXs+RIm/n5+cxC77wyZ6bytcFdWFQbRKHflcoH753T/Ty4GyZL8/bGXbTWc2K/TrMzJ06oUDvxmA63EydO2Jvzin0Lkr/jXtZkfxe6fVD52lDYSxFAHvFrdjqa7BGfuR0aBproClXl3GpmKqej9Zyrh4P2dK61MVKuUZXV3dudjdPq6urdd9999OhRu1DcFYViU/S84jwT9YGP7AbXBv+c+iGnPQ+OSMgZdd211lNw2CU+Uv0ws78LXTwov/5cbSjupQggj7RpzFjYhRIsdqR7qwy6mUUzjRkPOztqc66NkXKHnWOckyTSycS7F3NelTO5p1ITC4trgxQ84rTnwfHjwVju6bb8rfWd2P+ejzwu9nv8oYfkf0cf+shH9P8PPaT+u7v/sIs/UlPay48cmQ8qVxsKeykCyKWrsOu0Fs3lOzVaCx/p2qqnQ1umHjV2S6ow54celFxBE5qR666jc3Yv/nnVBOL5QsJuQG3wZu2CebPE5yH+jNmznNmDvHytNQoe2bkeqVXW9Y8ceR5UnjYU9lIEkE/8mp1eFukOO29xiZpxrMdXYzq2tpuXZ/0z6EJRefuKKpPnaTUW/JnM2uxlPYPaz2rMvkZ2mu5knN1Lx8xfqZqKW6AyiDZY58s/sov2ybmmNLNbGzixX37A4MCByX375H8H9o2P6//3qY8hqA8luM8SrLyx2pRjVBWsCxlxVDCAB1XEyK7bNgDIIJc+RsmlkPaSyNDySP+AhhBfNOnYGpwhKNRlenurEZnDHOBqzG4ulNhWlcTz6gnEIsOuvzbEFh3mv2YX6oe7G42mtTZQ1jU7resfOfI8qIFfs+uhDQB2q3xB090SuJzn9XOm2LDrtQ3O5fUpz4PjGQsudA1ikXw07G57+IULFy688OST8r8LTz78sP7/ySfVf5OFrcZMKOpN0asxu20DgN0qedl/ZDW9KR7Uh5v+wJtAzN2GhIYV04bQyZytCJ6HrGds8LnQ6bz+3Kf3vjfZbX/4lVc2EqvKqlxL+Y4PNOySVmMmtmHgL0XCDtj9qvBrK4a5DfkV2sJh/hZU/1sPoH9V6GGGuQ35EXbb0AYAu1UVephhbkN+hN02tAHAblWFHmaY25AfYbcNbQCwWx0sD23oFi+DotsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBxRvMpu5kAAPQuT5ARdgCAHY2wAwDseoQdAGBwlmama3PX/HvX5mrTM0v2jUTZe/SDsAMADMzSTL1eD9Lu2unadP2cfSNR9h79IOwAAAMiRme12cuLQdplh50YCSq1mbrZQw7yPHqsJ3byBn3yDHPXuh8FEnYAgMFQWXel3Vqsm2zKCDs56Tl7aUsQx0zrPYKyrUuzOtREjbXTKj+X6vIM7WZjq9HqpmmEHQBgILysU9nkpV1G2Ilcqy822/Jm6/Kst0dLBJku67RFRbrMGy0uzegzdI2wAwAMgjX5aCYgY2Hnz1qq7aEENMEmBbt5ZVdn5fRlz1lH2AEABkGN6/Tso7Cgx3axsBPDNk+jFc43s6sMuplFM42pd2hfma3VZ3rOOsIOADAAIuv8GUnJm8nMmMaUe3mLWdRYTu6h9lzUF+Tkbe9inUy76Z6zjrADAPRPZZ29ZETn2FLGApVWQw7e1GrMurcas928POvPh+pCvdZFje0W2/7Zul+Nye/GBAD0p91sRJZHqnUmLX/ZZOL6SblBzWoK3h5+UagwFKfdr8YEAKDi1NqX2uxl8g0AsGupsV6j2eP1OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVMz8//yIwOGW/ogHAQYTdysrK6urqmvIm0BPxElpeXhYvp7Jf0QDgIHon0U2JzurGjRvr6+s3gS6Jl4148ei8I+wAVJPoncSATnRWGxsb3h/HA3ITr5nNzU3x4tF5R9gBqCYdduKHc9FrNZvN17ZXGztfq9USeSdeQoQdgMoSvZPoo27evCl+She91jaHXdmPHgMg8k78pCReQoQdgMqyw070WoQduiVeNuLFQ9gBw+7aXG06Ymap2NN1UX9a2J08eMvILQdPmjvmNmGHAGEHQLp2ujZdX9gKXJqtTdfmrhV5unO5d88Ku5GR8cOEHVIQdgCkWPq0r4i0q/uDr6WZ6HBPlMzMecNBOxTje4aGjarU2iffEC8j7G45eHBcZ5wVdofHRzSVg3YKBrfD+6gN4+NWdhJ2uwZhB0CKhZ1ModrsVXVbhFNt9pI33POi6VxdppwqXaibaHPtacpMaashb4iBZKPVbjbEv1mtywy7k+JfGVB+joVDz96Ssc+IY2A44KcaZSDsAEgy7MJEQDWabblNpdUVebPdXKx7GSbDrr6odmhdnq3VTl9L2rMl4kxX1GmLQhWpg53GVAF1eFxnnndnxKID7PC4n3F63BbfJ2ESdKBPNMqhw25jY4OwA4aafc1OjtRqs5e9gPIGcVYKqlwThf7AT2fYUtKekpm4nC4s7FSKHQzCLjQTGYzfgi3xfQi73YuwAyDZ6aNnGYNLaSLC7LUrepgmw87PMnGwDj7nnjLoZhbNNGZhYeeN1fzh24iJQJNpYmw3Pn6Lfy++D2G3exF2AKRw+rSbl624a4mBm7cGRc5T6ltqEKd3CCYvXXuqmhdb5iwqIosJu9BFt8jiE1Nmj+YcC1QIu92Ja3YApGj6eHGn86rVWPDnJ830phzZ1eu1cKFrT68mXSaPkBOeaq3nYFZjFq+QJxzbi7ADIMVXRcoSs7Kk1QjNTHa8a3aXG+FC5566Jl0mfymvOo0uG8RqTMIOORB2AHpiX7MrnAk7EZCEHbqlfxE0YQege9YHCoqnw259fX1zc3P7fxH0tv1mfhREvGaazab4SUm8hNbW1gg7ANWkw07/PTuRd/xJO3RLvGb037Mj7ABU1vD8pfKNCij7OSgEf6kcQPWJ3ml5eVnnHdCDNUW8hFZWVgg7ANU0DwxU2a9oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA4XZ+amxkZGRs6nxwz7+TtP9EXd6oT4jjrJvSxERQ2F0bYnUCADAwOuz8gMsKO2caqcLUhExFwgEACqbjbWxMx00o7LwcNEkW3JcFXkZZheKeHVzh3TvRMl3orNN5dr9xExNj4ToBAMjgxdvUhAoZK+yC4HEWWjetkV2kMLKnrMjLKGdFzsODswczrvoWo0EAQD5+loj/9b9WnMSv5OUOu5S5SXOFLzlA3Wd3hy4AAFnsKBmbqjvDzplhqWHnHnp5M5Omonxh5yol7AAAXQgniLx4V9jIzq4zfRqTkR0AYJBiCRS6QDaQa3bWTGloa0qdzrMTdgCA3jjWXyatxpT8C272wkv3lGRo5WWsyP5EnqvO5NWYhB0AAAAAAAAAAAAAAAAAAAAAAACA/rwGAEAFlJ2HAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ2R+fv5FYHDKfkUDgIMIu5WVldXV1TXlTaAn4iW0vLwsXk5lv6IBwEH0TqKbEp3VjRs31tfXbwJdEi8b8eLReUfYAagm0TuJAZ3orDY2Nra2thpAN8RrZnNzU7x4dN4RdgCqSYed+OFc9FrNZrPs3w67HdoYqFarJfJOvIQIOwCVJXon0UfdvHlT/JQueq2yg2g7lP2U7zYi78RPSuIlRNgBqCw77ESvVXYQbYeyn/LdRrxsxIuHsAN2vGtztenpmaVISaggtr/aGuymqpiers3MpB2Yq6oBSwu7kwdvGbnl4Elzx9zux+FxXU1QnzyNMH4w/xnilXShgGdxqBF2wC5x7bRKKitrZEn9XNr+amu72dhqtDo6quoLevmHLuni1OGqBi0r7EQIHfbvDCLs4tX0UHF/bSngWRxqhB2wS6jEWVioB3EXCrulmWlNb7buesMxU1KbW7IHaFb5NV2tHv+ZuuJVOc+oDqzNzUVK8w0GM8LuloMHk0ZiIyPRwBEbxsfH9TYvIiM7+/fEHa++w97+4gBzBnOMFbRWQbySWJNcLSHsCkLYAbuEjrZWI4g7K+xE8NRmL20JYrNMrVbj0qwaxzVa3m5BSfOqOdAf7AUHBjVtyf3FqeJVOc/ojT2jhfkGg5lhJwPFixiTKzo/RE6F4y60Sd2I72wnmvtGUK13dBCzVrX2Ic6zRFpC2BWGsAN2CT9oZNwF4aKjRyRPfbHZljdbi17MmK1pN2TWLeooaolQElV4/0ltUVXCgcln9AqvynzMf3UvO+y8K2TBHZMe0SAJDf4Sds4MO+cUZTC0cyVmyllcM56DeE0goMNuY2ODsAN2tiBoWpdnazJdHBnUUTFTO5037E7XarNXY6cyE5TTmTU4zxjdIVuesFOzggdLCzs505k6PCTsSkXYAbuEFR/tpoq7JbNuxB+CSUtinNVF2EXHXzLoZhbNNGbCgeln7BQTdjpwHDOEsWnMSMT0N43p3TRZJhvhqiTlLIRd8Qg7YJcIxYeKOzPyCmYSvWtpV9r5wq59ZbYWXkmipyJb5owJuZl+xmhrs+UMO/tjCGZOMXoxzBUxsZ392ExPvdACFX8Ri1pzooqilUTPQthtI67ZAbtEJD68uPNK1LoVb+JxQV9zU0E27edXwiRkuxkcWJu91GiZFJUF9boe+MWrcp7RGXb9r8bcpQb52gBhB+wasWWNsiAoaTW2NFOitm/J/PIOjN8IH6iXlujDtrbsz+PFqnKe0d7qPlciwg59IuwAVJ8JO5GdhB26pX8RNGEHoOJ02K2vr29ubg7JL4Letj8HMAzEa6bZbIqflMRLaG1tjbADUE067PTfsxN5x5+0Q7fEa0b/PTvCDkBlDc9fKt+ogLKfg0Lwl8oBVJ/onZaXl3XeAT1YU8RLaGVlhbADUE3zwECV/YoGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYcvWJkZGRiXpmWeD81NjIyNjU+eLbBgDAQKQHmwthBwDYYVJHdjrXJibEvyMm4KywUzuSewCAissOO5Vm+pbaz4SdutHVoBAAgDLkGNkFgzg77OriPwZ1AICdoMew8zGwAwBUX69hJ0q5YgcA2Bl6nsY8n3AwAABVo/LKIlMsd9jxMQQAAAAAAAAAAAAAAAAAAAAAAAAAO85rAABUQNl5CAAAAAAAAAAAAAAAAAAAAAAAAAAAMETm5+dfBLCNyn7TA8NIhN3Kysrq6uqa8iaAYoh32fLysnjHlf2mB4aReOuJ96B4J964cWN9ff0mgEET7yzx/tJ5R9gBpRBvPTGgE+/EjY2Nzc3NBoDB2VLEO0u8v3TeEXZAKXTYiZ88xVuy2Wy2Wq02gIESbyuRd+JdRtgBZRFvPfEGvHnzpvgp1CRd2Y0CdhXxnhI/TIp3GWEHlMUOO2IOKIJ4Z4n3F2GHoXRtrjYdVZu7JotnlhIPEXvkqTipBgfCDigaYYch1m7qa9eXZmvT9QV9GbvRbMviRst9yLXTtdrp7LA7LSo8l7sdhB1QNMIOiGZTaFy2NBMM+TpW2KlRoTfIM/voo6y7+YZ4hB1QNMIOiIWduSuzyhvyLdRVtHlhJ/KsNntJDgM7/m09QJTJ1mp4Q8VGK22QGCDsgKIRdkBi2KmsW9RZ1WqoaJNhV6vJdFNB1/Gy7oq83W4u1vU4jmlMoGJ02G1sbBB2GF6JYSeSbfZqbNfa7Gw9WKVyrh5e4CInOQk7oGIIOyAt7KbrS9FdxTiueXnWLMoUYecvbvEWuBB2QOUQdkBi2LWvzJr1Jd5SE++aXTuIu9Zi3VqoYpaxEHZAlXDNDkheoNJuNhb8WUp5ma4VrMZUceetR7H2uayu5KmUZDUmUB2EHdCJrJkM3W017PlJuc1fmRLsFtmn43+Cj9WYQFUQdkDpTNiJgGy1MrMRQBfML4Im7IBy6bBbX1/f3NzkTx4AAyfeVs1mU/wwKd5la2trhB1QCh125u/ZyQlQAAMl3lb679kRdkBZ+EvlxdnY+cp+CncJ/lI5UDrx1lteXtZ5B6AIa4p4l62srBB2QCnmAWyvst/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6MXLAADsdq8DAAAAAAAAAAAAAAAAAAAAGLSylwn3a6c/kCq3v8pte5kV5gC6ITqNsj8D2ruXwx1y2c3pWpXbX+W2dcLNA4BMuh+7vgN1XB1y2Y3qQpXbX+W2XY81DwAyVa0fy6/iHXKmKre/ym27TtgB6F7V+rH8Kt4hZ6py+6vctuuEHYDuVa0fy6/iHXKmKre/ym27TtgB6F7V+rH8eu6Qf7L0Pc+rP7pUdCuTVTlQqty264QdgO5l92OXfvTq9xyWfrJdXVuCXjrkS2ee/Oi73/6OW9+jvPtX3vHRv9uWtrpUOVCq3LbrhB2A7mX0Y4t//dF3/8q73hP3X/7kbxYXjz5434NHF7exl7N13SGLpPvwu9/967eO7j/eVr732O0f+/p2NTdmwIFy5osf+tAXz1SzbT1IfTiEHYBupfdjc386vudPX2k7tP7l6x9799tHhd/+/Fz0sPr9o5bB9cFpPV5Gh6yT7uPHXz++f9RPuLkv3P4/vvz8U3/l+8Z8dFbTfiD318tpv+j2R3O04tUv79375Vedm7rPwe6e2yKepZSHQ9gB6F5G2H3h9tu/8H/j5XLAp5Lul3/9/qd//GZom+76Dp0yn/9t3Vztp9tL0k2H/KO/++i7Rn/r41/5+7+tffouE3bf+fwe0dLfvPfjyr2/OfrHf2Mdo0LmQfMwTj34wGDTLm/7Zbd/5KJuxMUjdyblSUo6pAZHX20r7lki7AAMVI6wm7u+ePTAb737d/78lB742El34vVmJMrO/KXoj0f3Hg7PboaHJ2qc4RV5Xbe+pwcg9kgh91xW6gP5m4+Mvm/fgftlpt3/yF9/93X5KI4eeP+v79//u6P7n24oTwdDPtWgL90pMmbrhn//xpa6HTwQ1XA5aLr//miRySPxSBIfQDdh53f7qzdbIu/uUFUGLVGnMLtFysX9O6z70a19PrfuZ8n6bvvf6g998Yv328/SdfvbLEuSHk6O5gFApjxh981PvVv1QreKvDuTmnSyP37+E445TNFLd/zByV5RLPrr1ZsvHJJ7qKGA6DRlRH713Krq9LyhzKlDetf+OmTh6x8zmdbY2vjZikrvjx29eOPpj5mE+/rH7LCTDfrE89FHJ/vnT5zyx1iijxZ98uidh1/r+K0VRepx6fFN/YHRQy8kjWt7CTvv+X3gm7IlD7zgPaNflfHn7RYrF+157YgeG7ZufjO2tb+2uZ8l67t96hOjB/SzNPrASf9ZusMLXTMg3LqR9HByNQ8AMuUJuxs/e+Uv7nqnyq63v90k3cXvHvna845jbmx5KRW+jhMe26mO7MZJududf3nGyzoZDPpWiOja++mQpXCQvfzn97z9P+75/f0f/5/7f+d9v/zx4659ZGd7OLr2Roxa9x75oRrGrJ776l4RaXI3kdD6gYuHIx+MuiHTTmbdyRvXE/QYdte/9eDog9/S42f7OdK7xcvtGpxb+21b7Fm6Hv5mi6dEzcTq5+364mHVzi+ZZ/K6s2GEHYCByjWNufyzrXWTd/6Y7vTnP5i4cF8GXjCMu/Mv66rz0+M1FYS6I/PS7ktnvvmAzDoZDGoQMGouUumf+/vqkKVwkD310T0Pv/Daj370wx/+8LXXLq/cdO0jB1CiYeFq7B5YNvTBb4X6ZBFDweN6oJ6edb2GnQzcw4v2hTz9HOnd4uV2Dc6t/bTN+SzJpLvzqxf9F4DXKut5i5Q4G0bYARioXGEn+HkXzF6KbZkL91WIjX7i+W89YIZz3jU93ZHd+KFMwzvvuEPmm/pB358FPZC5zqH3sPv6x27/wvyaZ2XZuY/XtGAxSP3+++uqcbplcgQqoszuk0W4+aM8cbB4lHdaY5fe2x/q9tU8qhgAWy0J7RYv15v0IM65tZ+2OZ8la7QrnyVn2KmBcdCSpIeTr3kAkCk97H7w5f/6nk/OeB8fl3n3xhtr+jrdpTNf/oNbD83EDwl/7ECN0bZu3NgyE5t33Lk3CDs9G6j2M5OBW9540Je0kKKbsDv+8V9+563mM4K3vtNL8JBI2HmLQYJ2PChGaTe2gqJPnBIDIz0Q9fc4ZRaeysdlHpJbF2EXnOKOwxf1eMxuiXqOvHSIlatHoq+OfuiLi46t/T23jmdJnM6/bHvHA59wj+zUlURz2P31pIeTq3kAkCk97FbXXv7Kf3vvO0Yd3nnbp/7hX9bjh/gzmB6/+zfFrVbLKjZrGezPJwTrG6JbeuuQr1+/2ex0gs8IHt+fJ+yiDdFzfkGRmSE082/WrGD9wGhG1uWfKrQbYT0ZdrkoFnf1xki52lc/+/Kea2vvbUt4loJv9tZWy26b3jvWTnlQ0sPJ0TwAyJTxeeHln2022x2nVmO9kM/P5dVVhxwipzFzhV22hAFI6jJMT+/tL16V23adsAPQvar1Y/n13iE/99k9vxH/BWi/8Rv7Hv+nbhuRMAARQ5vExR/9t794VW7bdcIOQPeq1o/l13uHfGOr5foNaO3W5pvZBw9MlQOlym27TtgB6F7V+rH8Kt4hZ6py+6vctuuEHYDuVa0fy6/iHXKmKre/ym27TtgB6F7V+rH8Kt4hZ6py+6vctuuEHYDuVa0fy6/iHXKmKre/ym27TtgB6N7zO5nd45Xdll5Uuf1Vbtvz4eYBAAAAAAAAAAAAAKrj/wO0LSx+CmVuZHN0cmVhbQplbmRvYmoKMjg5IDAgb2JqCjE4MTk2CmVuZG9iagoyOTAgMCBvYmoKPDwgL0xlbmd0aCAyOTEgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1XyW4bMQy9z1foBzKhqG0GCAIktadob0UM9FDk1KLtIW7hU3+/WqhdTuxbYNijoUjqkXyirNPEGdjPjXuYFdn343QiGWcGmdC1iCvNBMyL0gDcTgVLiA8rcA/3ewMzKvbiLcoxxGcQQRz8Zl+nPxOwj9O3Zyv9YeWK/ZuCu2j4NH1pwMC7w1ciFBzfIcLTZGRYE/XMV7WuK1uQoZkxQLr9dES2++uD8erouHBkSoIbvNDA+fNTaWCfDsNpkgrCCm6wcKYxOpbRccUzQ9STUsw2aeDzZs2VMPOCyr0vTIllXoRNm3HK1pcglMB+TY+H6XbjinFgh5+Z1tZKI1nByg5H9u0OQHAAfAAAZb/8nnExI7NybuWwt0+087tmzukamjc03shG9vrgCgxhDefP2XAxWE83dtsYG2JY0/nwfpfGFwRsfl2Pyc6ZCvkWtGKU1aomWNg63fVrn8Pk8Wj68gLDRquq/N7687pbyM3Ib8rzJTgq5BxzvP7d3D+zw+eKFEZ2pPAJNQWgstAyLGjpKFMAvJHF4lCBuMxpLu3KACrbKxJZ44iFhrWebWke5T4qRXRcQnQesR6TpERZliX5Q9JfzhOt8tERLXniZ1DEupSezm2wNguYN1lfh54ai+6ocUmAN0LPoQpLMbERdqpnbABZ2TQC5EW0uxCd2N6yemsDNOo+HoKEqp2EJoYKXowcc0GypQhZdZbYYd5RaSvh3tcgNqqHzPCsUmy1SlgyO08MSNEF4DFSlN5LpVD0/hwZ7RjPI0PBuPC3nj/rMuZPke9EA3vm6i7IKBR72hA8NJOyUyal2NxTal916XuSKrKctE0jQCw0iUexC2Z3OifSK+1GmzurF8ddhbMqZdJ+a9Otbb54Lm2X4SHl0+TIotoDuujpO8qECVkaliVFlbLhXe2CC3zoaKM59CdSlRo7/hCo6aAKeQZdJMywl1s8FrUQBROoS3nZhScQX6nbAtmq8EWTdvIrdcvadUUcMlj7xIj+qMbHlFXIaUqQ+SB1K1QtEV0K3YEAqf4qa3suqMzrCv42XuGSFkye6VDwJCJv5T/K5LE6bnMJkq+RzZ7GtGZgNRTdoNjaRaSJxAvUmKkg+0P7l11LnLX9w13dboC57rd0Un9FGdxt0N5ApEsDjkTQvF5z4WnctDezMH0lWq5mWHX7CsXwuitZMn96/RLDZ74Ye0uz2pxbI1cnNKlLPNo3OSwTSj4re4d/10Vxn/+jAT0VCmVuZHN0cmVhbQplbmRvYmoKMjkxIDAgb2JqCjkzMQplbmRvYmoKMjkyIDAgb2JqCjw8CiAgL1Jlc291cmNlcyAxNCAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMTUgMCBSCiAgL0NvbnRlbnRzIDI5MCAwIFIKPj4KZW5kb2JqCjI5MyAwIG9iago8PAogIC9OYW1lIC9JbTMzCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDI5NCAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA0NjcKICAvSGVpZ2h0IDIwNgogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztwQENAAAAwqD+qW8PBxQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMC7AasoaCEKZW5kc3RyZWFtCmVuZG9iagoyOTQgMCBvYmoKMTE2CmVuZG9iagoyOTUgMCBvYmoKPDwKICAvTmFtZSAvSW0zNAogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAyOTYgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggNDY3CiAgL0hlaWdodCAyMDYKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCAyIDAgUl0KICAvU01hc2sgMjkzIDAgUgo+PgpzdHJlYW0KeJzt3T9um3cSxnEfwkdYGAjc5wapDDfOCdK6SOcrqAuwlbsFVKd2pQvsAZadkSuoWCDlAktJ/PO+fEmKnJmHM/7Nd0AEFkV9PKN53p8pxpb+/puiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIq6tP6iKIqibluPjnJ+OEVRNyiu08GKhVJU/eI6HaxYKEXVL67TwYqFUlT94jodrFjo7evh7sPdw/7XHz7fr17eWN1/Xv/66a5dPb9vec+l/Frcftzuvn2deu/+/qe7J4+6uAcquLhOc+po+B+er1MfzEJvX6v93h7uPt/f321Ovc3904PzcfOo+VF65AydPHR/jE4eu/ywp3t28Xn6sMkj9+1NzthVQNwoY3Gd5tYs/BFXAgtNqPXiXk651f3d/Wr31tMpvHp85eA99v65e/z9h2E5fHv7UfP7V6uHFQdvgeI6zS0O3iFqc8ptjtyDA3f6wsLLfudH6WtrP3rwLu48vGOrnj3WOXizius0tw4P3uer0wOy0JR6PmvnT3Unb51/xnv9wTt7xeDEozh4SxfXaW7xjHeMej5lN890D9+yv9Rw7P2zl3LnHVzwUsO5j6BuWFynucXBO0it7u8+77f3/LXL5P9o2f/n2vzR5x584f9cO/w7F1fMSMUV12lucfCOUpOj7uCt2V8e+/DyIvCxv8p16pnv/v65tHzie+qvk+0/bvohHLyJxXWaWxy81K4e7s4/9aXGKa7TwYqF/rC1ur/n3O1SXKeDFQulqPrFdTpYsVCKql9cp4MVC6Wo+sV1WrDU32idoiiKOijnoR11/qOhoaGh3ZhCQ0NDQ7sxhYaGhoZ2YwoNDQ2tn7b8F6DnfwDBa41t/+Xo/F+2nsGu0qJ726Kn/jHfVdr8ZzCkahtx/l1yzFs41HxbWPa2RS1bWGixnzeHduyzZN8C1+lQ1+nyxw2c/QEErza2/V6C+w9d3mPXonvbSSd/LM0V2j4WEb25tMeDHyrh28Kh5tvCsredZNjCQov9vDm0Y58l+xa4Tge9Th9nxul7XqFmbWw7PLjHo8X2tv313d31f5IutEu+B8aNPm/LHyoRqx1t3KVZt7DQXFsI/rzN3HlEIrSz97yicZ2erVtdpy/12nd0vYSafMTml8t7PFpsb9tPluVLmIX29N/77Vcd134Jc3TSzdcwJ2NyxUI9W1hqr9x5tWbfwkJzbeFYb+4tTMCALRz9UK7TH/c6Xf64gWM/gMDQmGShQb0t/9RyaNPvQhsw6X5E85cw6oPXtIWl5tnCQnNtYdlbzBaONOTojevUpRW6TleLHzewvOdySv0lTFxv+1fFP5z8E+tybbpE/5dXM+FEPgyHW9gXROYtLDTXFhaaawvHenNt4eCz5NwC1+lI1+nynD55cl/QmPhF++jeNmV6rrXQXM9njmmTP5edB4j7f649Hh7j9i0se3vcqf5nvMHP7T1bOPJZcmyB63Ss6/Rh8eMGlvdc09he3E+0vMeqxff2XMZLfqHt/mgO0fbDhrxW6dnCXPNuYdnbc8UcvM4tLDTzFo5/lqxb4Dp9HPY6vaICKTQ0NDS0G1NoaGhoaDem0NDQ0NBuTKGhoaGh3ZhCQ0ND66P9RVEURd22/uuo79+/ez68s/a/uFovEe0H0lLyhmbTdAlxNhY1YzdNt1C04lpK3tBsmi4hzsaiZuym/eNf/+Q20o2Dd0iNg3cwbX2p/vaff3Mb48bBO6rGwTuYxsE70o2Dd1SNg3cwjYN3pBsH76gaB+9gGgfvSDcO3lE1Dt7BNA7ekW4cvKNqHLyDabOD9+vHN/N69/WVK/2XL7//unvz2+9v33z8xXt6/PHuNDL77Ry3KKfajYN3VI2DdzDt2DPec0ff4SPf70+wXz69effp49svf8oOltlvV8Apd+PgHVXj4B1Me/XgXR+nL7U5UbfPitdPhjfv+vTH5DSbfOz6CfCnj+/eTB6zvGfi750XYf3g9z+9fXnX8zm5/+0mzrqrzf3bs/Sw4TNO9jnJwYt2ocbBO5j2ysG7Pma3B9SvX356Pmx/+vnb85vf/pw+dXx57/QX01cenp4Mfz12z8Tf3DM7eF/wP39+//Kbbn+7vbN+8Ob1kCW46eSMM9yNg3dUjYN3MO38wbs+u6Yv+T49h3w69HbPJ3cn2B/vpo/bHY+7Z5VfP24+dn7P/pTePWZ68O7P5MXBu3nX+iydneTHGz7lDHfj4B1V4+AdTHv1Ge/x12w3TyO3J9jkeeZvZ57fXvuM9/qD90jDHLwcvD++xsE7mHb5a7yz13Xf7A7J9fPbj+82X8Jvb+vjdH2y+V/jXR6YL0+nzxy8i4bPOdnnJAcv2oUaB+9gmvDv8U5fWDh1D7fQGwfvqBoH72AaB+9INw7eUTUO3sE0/uXaSDcO3lE1Dt7BNA7ekW4cvKNqHLyDaRy8I904eEfVOHgH09J/YgK32BsH75AaB+9gmm6haMW1lLyh2TRdQpyNRc3YTdMtFK24lpI3NJumS4izsagZu2m6haIV11LyhmbTdAlxNhY1YzdNt1C04lpK3tBsmi4hzsaiZuym6RaKVlxLyRuaTdMlxNlY1IzdNN1C0YprKXlDs2m6hDgbi5qxm6ZbKFpxLSVvaDZNlxBnY1EzdtN0C0UrrqXkDc2m6RLibCxqxm6abqFoxbWUvKHZNF1CnI1FzdhN0y0UrbiWkjc0m6ZLiLOxqBm7abqFohXXUvKGZtN0CXE2FjVjN023ULTiWkre0GyaLiHOxqJm7KbpFopWXEvJG5pN0yXE2VjUjN003ULRimspeUOzabqEOBuLmrGbplsoWnEtJW9oNk2XEGdjUTN203QLRSuupeQNzabpEuJsLGrGbppuoWjFtZS8odk0XUKcjUXN2E3TLRStuJaSNzSbpkuIs7GoGbtpuoWiFddS8oZm03QJcTYWNWM3TbdQtOJaSt7QbJouIc7GombspukWilZcS8kbmk3TJcTZWNSM3TTdQtGKayl5Q7NpuoQ4G4uasZumWyhacS0lb2g2TZcQZ2NRM3bTdAtFK66l5A3NpukS4mwsasZumm6haMW1lLyh2TRdQpyNRc3YTdMtFK24lpI3NJumS4izsagZu2m6haIV11LyhmbTdAlxNhY1YzdNt1C04lpK3tBsmi4hzsaiZuym6RaKVlxLyRuaTdMlxNlY1IzdNN1C0YprKXlDs2m6hDgbi5qxm6ZbKFpxLSVvaDZNlxBnY1EzdtN0C0UrrqXkDc2m6RLibCxqxm6abqFoxbWUvKHZNF1CnI1FzdhN0y0UrbiWkjc0m6ZLiLOxqBm7abqFohXXUvKGZtN0CXE2FjVjN023ULTiWkre0GyaLiHOxqJm7KbpFopWXEvJG5pN0yXE2VjUjN003ULRimspeUOzabqEOBuLmrGbplsoWnEtJW9oNk2XEGdjUTN203QLRSuupeQNzabpEuJsLGrGbppuoWjFtZS8odk0XUKcjUXN2E3TLRStuJaSNzSbpkuIs7GoGbtpuoWiFddS8oZm03QJcTYWNWM3TbdQtOJaSt7QbJouIc7GombspukWilZcS8kbmk3TJcTZWNSM3TTdQtGKayl5Q7NpuoQ4G4uasZumWyhacS0lb2g2TZcQZ2NRM3bTdAtFK66l5A3NpukS4mwsasZumm6haMW1lLyh2TRdQpyNRc3YTdMtFK24lpI3NJumS4izsagZu2m6haIV11LyhmbTdAlxNhY1YzdNt1C04lpK3tBsmi4hzsaiZuym6RaKVlxLyRuaTdMlxNlY1IzdNN1C0YprKXlDs2m6hDgbi5qxm6ZbKFpxLSVvaDZNlxBnY1EzdtN0C0UrrqXkDc2m6RLibCxqxm6abqFoxbWUvKHZNF1CnI1FzdhN0y0UrbiWkjc0m6ZLiLOxqBm7abqFohXXUvKGZtN0CXE2FjVjN023ULTiWkre0GyaLiHOxqJm7KbpFopWXEvJG5pN0yXE2VjUjN003ULRimspeUOzabqEOBuLmrGbplsoWnEtJW9oNk2XEGdjUTN203QLRSuupeQNzabpEuJsLGrGbppuoWjFtZS8odk0XUKcjUXN2E3TLRStuJaSNzSbpkuIs7GoGbtpuoWiFddS8oZm03QJcTYWNWM3TbdQtOJaSt7QbJouIc7GombspukWilZcS8kbmk3TJcTZWNSM3TTdQtGKayl5Q7NpuoQ4G4uasZumWyhacS0lb2g2TZcQZ2NRM3bTdAtFK66l5A3NpukS4mwsasZumm6haMW1lLyh2TRdQpyNRc3YTdMtFK24lpI3NJumS4izsagZu2m6haIV11LyhmbTdAlxNhY1YzdNt1C04lpK3tBsmi4hzsaiZuym6RaKVlxLyRuaTdMlxNlY1IzdNN1C0YprKXlDs2m6hDgbi5qxm6ZbKFpxLSVvaDZNlxBnY1EzdtN0C0UrrqXkDc2m6RLibCxqxm6abqFoxbWUvKHZNF1CnI1FzdhN0y0UrbiWkjc0m6ZLiLOxqBm7abqFohXXUvKGZtN0CXE2FjVjN023ULTiWkre0GyaLiHOxqJm7KbpFopWXEvJG5pN0yXE2VjUjN003ULRimspeUOzabqEOBuLmrGbplsoWnEtJW9oNk2XEGdjUTN203QLRSuupeQNzabpEuJsLGrGbppuoWjFtZS8odk0XUKcjUXN2E3TLRStuJaSNzSbpkuIs7GoGbtpuoWiFddS8oZm03QJcTYWNWM3TbdQtOJaSt7QbJouIc7GombspukWilZcS8kbmk3TJcTZWNSM3TTdQtGKayl5Q7NpuoQ4G4uasZumWyhacS0lb2g2TZcQZ2NRM3bTdAtFK66l5A3NpukS4mwsasZumm6haMW1lLyh2TRdQpyNRc3YTdMtFK24lpI3NJumS4izsagZu2m6haIV11LyhmbTdAlxNhY1YzdNt1C04lpK3tBsmi4hzsaiZuym6RaKVlxLyRuaTdMlxNlY1IzdNN1C0YprKXlDs2m6hDgbi5qxm6ZbKFpxLSVvaDZNlxBnY1EzdtN0C0UrrqXkDc2m6RLibCxqxm6abqFoxbWUvKHZNF1CnI1FzdhN0y0UrbiWkjc0m6ZLiLOxqBm7abqFohXXUvKGZtN0CXE2FjVjN023ULTiWkre0GyaLiHOxqJm7KbpFopWXEvJG5pN0yXE2VjUjN003ULRimspeUOzabqEOBuLmrGbplsoWnEtJW9oNk2XEGdjUTN203QLRSuupeQNzabpEuJsLGrGbppuoWjFtZS8odk0XUKcjUXN2E3TLRStuJaSNzSbpkuIs7GoGbtpuoWiFddS8oZm03QJcTYWNWM3TbdQtOJaSt7QbJouIc7GombspukWilZcS8kbmk3TJcTZWNSM3TTdQtGKayl5Q7NpuoQ4G4uasZumWyhacS0lb2g2TZcQZ2NRM3bTdAtFK66l5A3NpukS4mwsasZumm6haMW1lLyh2TRdQpyNRc3YTdMtFK24lpI3NJumS4izsagZu2m6haIV11LyhmbTdAlxNhY1YzdNt1C04lpK3tBsmi4hzsaiZuym6RaKVlxLyRuaTdMlxNlY1IzdNN1C0YprKXlDs2m6hDgbi5qxm6ZbKFpxLSVvaDZNlxBnY1EzdtN0C0UrrqXkDc2m6RLibCxqxm6abqFoxbWUvKHZNF1CnI1FzdhN0y0UrbiWkjc0m6ZLiLOxqBm7abqFohXXUvKGZtN0CXE2FjVjN023ULTiWkre0GyaLiHOxqJm7KbpFopWXEvJG5pN0yXE2VjUjN003ULRimspeUOzabqEOBuLmrGbplsoWnEtJW9oNk2XEGdjUTN203QLRSuupeQNzabpEvJ/cUWIaQplbmRzdHJlYW0KZW5kb2JqCjI5NiAwIG9iago0Mzk2CmVuZG9iagoyOTcgMCBvYmoKPDwgL0xlbmd0aCAyOTggMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1azY7cNgy+z1PoBXYiUX82UCyQYHaK9FZ0gR6Cnlq0PWRb7KmvX/1RokTZa2+BIllMbEsURVIfKVL260UJGf4e4sWvIH59ubyWNiU8CO36JmWd0PK6WCelCl15pMRLaIiX+P+DvIIVX9MIei/xmpsk3vwpfr78dZHi+8uXX0Lrb6Hdin8umR0O/Ony4yCM/ObkoxJqBd+ghK8Xb/Kc4K5qteu6igUE+CtkkT58fgFx+zspk8ghYuFFWCPjzddyE/mlrnoTrlGG14uxMs8QbxYlHCBjg4w7nPkEPSn+uHx6vny4KyuUFM+/N3guYrna1UopwYvnF/HlOym1Ck8fQ1NsVo/iwUaNQ4fxoVOHNsg/Ga+hTYYf3HJ/N0AuhFO8D1eIgwKRlpFCfRyGhLmlfMp80/2S+ct7ZqP0OMe9zIFE085RlUitXPmpNm0coGwZ8LTBMelrgwq5ZSZV4gtFqmUiQJw0TXBIXCgdSVSYsavL8CiUgcRsHWh0HOhm9g7cTRRYP/4inn+g6IBAtpqAZK0QHlWlex4NalihiJJktkZTTaqK5q71N4WLHYuFpUHzN/VwDolzFqTMeOESYv+MB6B8iGiVAVrlKShMcvkCXmh6zuRItLbJnmyg8r325WfbvVyZ1Y3JTqkAtpxyXQtkzKMIQQBx6AoFcQakTNhxZE0IAisN6kpnuDWdlB/6qm6Ehy8yOOJWo9Qn3W+ubULhLbcqP+l/as7HtOpWrbVzRJA+4Jqgton/klGbvKJDCaFHSzqCcuo9kGOpvjNUWMdQUbFG/Qctw9Y5R2gVQoQxW4ip8dc0dB9dqTi78b0XJTsmTws2yCvD8b7IN/Gu4ZpHPxWNUFZE2dLrQNGNY/c8oNIQD6hzTjyg9hEPqDx2PKCOO+kB79Wf6TLgHttnuK99wOU/ivtKT3EPDAErMATse8eA9zP4v5+34LtQrRR3WAZrU8wDDQIw9u3B1kxga3ZgayawNQdga94J2w39mKwTeWSZY9jiZAlOowXK8mjMthACw0wGmjR9EsfkKaAYqDDQjRqMjmV2HMtQx+LAgYVH+kP+Jk/sL+/3IMDcvIL1iMHGXOh/2VmU5YGly4OVmSbepflslUCGwQjc1FoqJUpsMXmJtVD146K0vh+RM5nkVuRAE5PgX8hS/WZaQOlqtiY6RTEZCWuze81v7ZQD2qwmFoZPclgxjNWomOpJcjnBF97xHJpNEmh04mELa08WryNAxPuGuxiE6vJUQkeXPcGz4KY6sB+GTAtY1jmKfCj3Zdx8iZ1bBChHBc7bcvTBGWQfbUZlKyqq2Apjui4/EnCSGOvAgh1PVOGnXsCR4fm2vOsZDq5+K5LXTl3Wo1awtJPuWXxH60i5obFjITDBBJ0ePdDJ6snCm2y3kN2PHqMCFYpHuVZhjzzGsdTevVjJq8/Y5rgzEIG2gvskQ1XLZFOe7AFKkwJzbBsUwHY8XmjHJP2YhJ9ZH27uBA+0HxFb5z04ZzUFycCat07LrLXnMDpplWhjp6I0RzabUUPqk1ULP+fRW3A/fE0OxHiteiZNaDuGvzpmEdrB0Y4dm1EcWU4DFY7GxHDZYN2zeirSYaSZ1CCVGKupTTWam9P5JsEQu3kCVVRinJJwt31ue5IAnjrODEqrkzbjFF4cMGpS2o5HlacBRH0zP3eJ+03WAiHNdStjuD21HHZbroCelLEo4EKU+A9KSTXmHuTUAelQSV/OnEt+USsZ2XhtJaHIu+2RXG5M2nKa0hK4BJt7o9k8w3a9i+qCiafny+tFW3mFdQ0MioFtSFNT2RqPfaUPD2HoEt/afPj8ostbnc2XN0arMkI6XBv4VNNPKbvQ/6D0QjanvmWRrUhf2iFEo+hcvo1jiTud43RUPMB3M1lvFHs5TadPxUdXLHUalC22y6p6O3bl0nu05ytRI1HXs3FcYIxmIEDnqE6ByXjZp1cxFMLrzOjr3nazzgqGHTaLHHKJyWE+ZX2uVND3Q3qceecwW4zGCUjwrNaAcc6tZagjUBDaqMi5jTJ8va3l6z0C0RiyS3UFqXIDSbe71UY7xI8SDXvmdgiXI9vOg2sHJv7lmGqWnzXis360rxWaaYzbTLOt97dIYMi7bxQcaIJUZMNjwsZZTaabVo91BKrMixLjPIfCtCbD9CDKWA96dylz7IF5MIaac2HehG9roR9JcAl60H6XeQ3LvjCd1EGFFGhCWETrXKj8ih3VsflPB3Dgu+TuBGdLD+NXvtnTEwHcDOupABVnlIP4nasRmaY3Zj4K88poxdSOKRddL55FWsk3qf4gNkS1edxoPTS1ZWBCqu7o4ABXDGL0dUlPgV9e0KywZQt0XkoxzO+n2iBt8aI+y6Bjz2dSOzPjSSqCAF2LWW12gHBopc5i26q4p7nVe2veU1Z3Sf3xU4s3SgWSug8fVjkDVxcy8u4bNCnW5bosrDV9SDb5Ag3AXU1cfZg1yeHxzGdpA5vx+7ncfVLasEJydeOjJLfnPpyrw6N0O5+oqata/Br+OaFUGBTXqH2sJj+FJzddJjChONLu216U+Pcv5HI8wQplbmRzdHJlYW0KZW5kb2JqCjI5OCAwIG9iagoxOTE2CmVuZG9iagoyOTkgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDE0IDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxNSAwIFIKICAvQ29udGVudHMgMjk3IDAgUgo+PgplbmRvYmoKMzAwIDAgb2JqCjw8CiAgL04gMwogIC9BbHRlcm5hdGUgL0RldmljZVJHQgogIC9MZW5ndGggMzAxIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nJ2Wd1RT2RaHz703vdASIiAl9F4VCCDSO0iRLgohCRAgAUJCsyuiAiOKiDRFkEEBBxwdiowVUSwMir1PkEFEGQdHERXLu9G1Rte8ee/Nm98fZ31rn7P3PbuctS4AFN90jiAbVgBAIBSLwnzcmdExsUz8EIABEeCANQBsTnamW0hIIEDl5+XBzEYPgS+CAHh1Q7YCcNVcFgv8f1LkZIrEaJgQlOdxedkclAtRTs8VZ8rsUyjTE9NkDGNkLEIviLKKjJM/s9mnM5/ZVcZcgZCLcjjKmVwBV8b9KG/KkfBQRmS5FOXwebkoX0NZL10i4KP8WuYr4LHRHDAUmV3M46SgbIUyRRQe5oHyAgAIlOSvOPErFvPyxLKkPDIy80X85BQx04hjzLR2cGAxfXm56Tyx2DyEzUlji7hMjwxBJluYD8DnnD9JSVZbJlpkO2sHOztzGwvrrwr1Xzf/pmS9/UwvQj/1DGIMfrH91bmMRgBY02httn6xJVYD0L0BAJU7X2x6ewCQR/vWdemrfBiyeUkRizMdLS1zc3Mt+DyOhaygf+h/Hvgb+up7FrJwf5SH6clLYkvSxUxZ3TgZ6RkSETM7k83hMc3/PMT/2PGv72EWxkviiXhC1CMSnTK+MBltt5DLF/MzhEy+8D818R+6/Umf5xoVrekDoMdbAIVLdID8OggwNDJA4najO9AffQskRgLZy4vSGv88958E/XtUuEy2ZPOTP/l5hIUzORJRzuc92bMEWEAC8oAOVIEm0AVGwBzYAHvgBFyBF/AHwSAcxIBlgANSgACIQC5YAdaCIlACtoIdoAbUgybQAtrBIdANjoJT4Cy4CC6D6+AukIIx8BRMgVdgFoIgPESFaJAqpAXpQ6aQDcSCFkJeUCAUBsVACVAyJIQk0ApoPVQClUM1UAPUAn0PHYFOQeehYeg2NAJNQL9Db2EEpsB0WAM2gC1hFuwGB8Dh8FI4Gc6CC+BCeAtcBTfCB+Au+BR8Eb4OS+Gn8DQCEDLCQLQRc4SFeCDBSCyShIiQVUgxUok0Iu1ILzKAXEWkyCTyBoPD0DBMjDnGCeOLicBwMFmYVZhSTA1mP6YL04+5ihnBTGE+YKlYdawp1hHrh43GJmNzsUXYSmwzthN7BnsdO4Z9hcPhGDhDnD3OFxeDS8Utx5XiduE6cCdxw7hR3DQej1fFm+Kd8cF4Nl6ML8JX4w/gT+Cv4MfwrwlkghbBhuBNiCUICesIlYRWwnHCFcI4YZaoQNQnOhKDiVxiPrGM2ETsJV4ijhFnSYokQ5IzKZyUSlpLqiK1k86Q7pFekMlkHbIDOZTMJ68hV5EPks+RR8hvKEoUE4oHJY4ioWyh7KOcpNymvKBSqQZUV2osVUzdQm2hnqY+oL6Wo8lZyPnJceVWy9XKdcldkXsmT5TXl3eTXyZfIF8pf1j+kvykAlHBQMFDga2wSqFW4YjCTYVpRZqitWKwokCxVLFV8bziYyW8koGSlxJXqVBpr9JppVEaQtOledA4tPW0JtoZ2hgdRzek+9FT6SX07+hD9CllJeX5ypHKecq1yseUpQyEYcDwY6QzyhiHGDcYb+dozHGbw5uzeU77nCtzZlTmqriq8FSKVTpUrqu8VWWqeqmmqW5T7Va9r4ZRM1ELVctV2612Rm1yLn2u01zO3OK5h+beUYfVTdTD1Jer71UfVJ/W0NTw0cjUqNY4rTGpydB01UzVrNA8rjmhRdNaqMXXqtA6ofWEqcx0Y6Yzq5j9zCltdW1fbYl2g/aQ9qyOoU6EzjqdDp37uiRdlm6SboVun+6UnpZekN4KvTa9O/pEfZZ+iv5O/QH9GQNDgyiDjQbdBo8NVQz9DAsM2wzvGVGNXIyyjBqNrhnjjFnGaca7jC+bwCa2JikmtSaXTGFTO1O+6S7TYTOsmYOZ0KzR7KY5xdzNPMe8zXzEgmERaLHOotvimaWeZazlNssByw9WtlbpVk1Wd62VrP2t11n3Wv9uY2LDsam1uTaPOs973up5PfOezzedz5u/e/4tW5ptkO1G2z7b93b2diK7drsJez37BPs6+5ssOiuEVco654B1cHdY7XDU4Y2jnaPY8ZDjb07mTmlOrU6PFxgu4C1oWjDqrOPMdm5wli5kLkxYuGeh1EXbhe3S6PLQVdeV69rsOu5m7JbqdsDtmbuVu8i9033Gw9FjpcdJT8TTx7PYc8hLySvCq8brgbeOd7J3m/eUj63Pcp+TvljfAN9tvjf9NPw4fi1+U/72/iv9+wMoAYsDagIeBpoEigJ7g+Ag/6DtQfcW6S8SLuoOBsF+wduD74cYhmSF/BiKCw0JrQ19FGYdtiJsYDFtcfzi1sWvwt3Dy8LvRhhFSCL6IuUj4yJbImeiPKPKo6TRltEroy/GqMXwY3pi8bGRsc2x00u8luxYMhZnG1cUd2Op4dK8peeXqS1LX3YsXj6eHX84AZsQldCa8I4dzG5kTyf6JdYlTnE8ODs5T7mu3AruBM+ZV84bT3JOKk96nOycvD15IsUlpTJlku/Br+E/T/VNrU+dSQtO25f2MT0qvUNAECQIjgiVhGnC/gzNjLyM4UzTzKJMaZZj1o6sKVGAqDkbyl6a3SOmoz9TgxIjyQbJSM7CnNqc17mRuYfzFPOEeYP5Jvmb88cLvAu+XY5Zzlnet0J7xdoVIyvdVjasglYlrupbrbu6cPXYGp81+9eS1qat/Wmd1brydS/XR63vLdQoXFM4usFnQ1uRXJGo6OZGp431mzCb+JuGNs/bXL35QzG3+EKJVUllybtSTumFb6y/qfrm45akLUNldmW7t+K2Crfe2OaybX+5YnlB+ej2oO1dFcyK4oqXO+J3nK+cX1m/k7RTslNaFVjVU61XvbX6XU1KzfVa99qOOvW6zXUzu7i7rux23d1er1FfUv92D3/PrQafhq5Gg8bKvbi9OXsfNUU2DXzL+ralWa25pPn9PuE+6f6w/f0t9i0treqtZW1wm6Rt4kDcgcvfeX7X027e3tDB6Cg5CA5KDj75PuH7G4cCDvUdZh1u/0H/h7pOWmdxF9SV3zXVndIt7YnpGT7if6Sv16m380eLH/cd1T5ae0z5WNlx0vHC4x9PFJyYPpl5cvJU8qnRvvi+u6ejT1/rD+0fOhNw5txZ77OnB9wGTpxzPnf0vOP5IxdYF7ov2l3sGrQd7PzJ9qfOIbuhrkv2l3ouO1zuHV4wfPyKy5VTVz2vnr3md+3i9UXXh29E3Lh1M+6m9Bb31uPb6bef38m5M3t3zT3sveL7CvcrH6g/aPzZ+OcOqZ302IjnyODDxQ/vjnJGn/6S/cu7scJH1EeV41rjLY9tHh+d8J64/GTJk7GnmU9nJ4t+Vfy17pnRsx9+c/1tcCp6auy56PnH30tfqL7Y93L+y77pkOkHrwSvZmeKX6u+3v+G9WbgbdTb8dncd/h3Ve+N3/d+CPhw76Pg48d/AdXn9OMKZW5kc3RyZWFtCmVuZG9iagozMDEgMCBvYmoKMjU5MgplbmRvYmoKMzAyIDAgb2JqClsvSUNDQmFzZWQgMzAwIDAgUl0KZW5kb2JqCjMwMyAwIG9iago8PAogIC9OYW1lIC9JbTM1CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDMwNCAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA0MzgKICAvSGVpZ2h0IDQyMgogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDMwMCAwIFJdCj4+CnN0cmVhbQp4nO2dS6wkV3mAezeLEQskvGIRKU6M0Ah5QQtFRFk4mhkzDAZjQ8iAbYF6BRIosYIisQjZQOTIbVmX0Yx5BRsuIzATPBHT15LBNphYFyIm0iheMNcaRTIbi5FYIC9mE93Uu87j/0+9urqq636fSp7uU+f8dbq66runqtrn/8MfXvjq2a++8IcE+aXFzZs3hdISv11U8rmnX5NrN4j22tOfS8Lk/3aKFr0qOrWGT1p+xKh3raMJHerQN2cntfoW/J506Zvadk1963KEeNE6HSHiflvDEcJ52q1vLb8F4dMFPl+zPR93RN3tjaLFkQzEoI32fNFL7aM26lsZQfkiQ9GcvdTxW/D3eetvwe9Jl76JbdfXt05HiBet0xEi9a3TEeI04zxt27dW34JZNZesqtiG36MSpE20nLX8bVrzX2F7ANj4bNL+mrf4Fvwmnb4FvyddjhCv7Zr7ltHqCPGidTpCpGitj5AyJudp52htvgXviidB22XNRsjr+2tSsJ49b/yxW0u08sMqO06LJu+ltt+CH63rt+D3pMsRYrddf98SWh4hXrROR4gXrfURYkTkPO0arfO3UE33CEQjGtGINtVoY+sP0YhGNKKNJ9rY+kM0ohGNaOOJNrb+EI1oRCPaeKKNrT9EIxrRiNZftJsAAKDwfw1p0YRojaL9sQavv/56nWo1IVrraIMcIUQbc7Sx9Wd60QY504nWLtogRwjRNhntz779JMsGFgw5yWiDH1cs61388/Qz/7PP0vci7nkMOYFo0Tc7+NHFsq4FQ45qz2PICUTDkFNaMGSd5dP7z33om8uT5584c+X5Rxq0+tGZ8xcf3H+1/p7HkBOIhiG3Yql5UmPIGnvy8tmLj5965vt/s/f0vRceP/2jq9WSvP7Tj1/aOXX+8ZPxsrz30o8/db3WnseQE4iGIce/1D+pMWTV8vOP70Z78vJDieIeefl70f78wNWfBpu8/PHd5clMj9lyave5h2vseQw5gWgYcvRLg5O6myGXd83uO6WsPfXFLzy4jo+zrjhtl5c+9szjp5/9Sfwn5vpLn/zFT89dPX/y6csPBZr8+vIHbT0my8WP/bp6z2PICUSzDHnhvpnNXReaHPBXv/AO/RTjPG27NDipextDLu86sZY9tq447ZdHXv7u6ehK+d+vPrL/ww8kujv93POfDjT51eUzoiF/Vb3nMeQEokljyJCjAgf8qQdmdz1w3zu++Gxvh/d0ztNGS/2TWjVk9MfrgfvuSv/sPbAsvq+ZVZJ/71HlE+9+R7oq2VFZzaiaESf6orPyfGcWAbNjIBBnyP356iMvJfvzmYvRaDy+r/jsDz/6/SdPXXzyrHiP9+XvenqMl4+8XL3nMeQEolUa0j3s83FmNLy0D/hUO0Zb/6zkPO35pBbP0/hCwBjex3/ILiTfo/EVJBcL5p5Pd+az7zvx7vdd3S//ppRxosrZJYYf8MEvvjvbqBZn8P35yx9/9NlnPnz1J5968TunI+Nd/Mb9V74VvfDv8T70/EXRkB98/iWzGoacarQKQ3qH/akH0kN9/8Grz5oHfHZSGC+Es5LztOeTWjxP478U8d+U/C/ChXicX35NeYm158svxdvz2apoZ1pfZRTQvD/jbNSNM5bl1XM/fvLkxSdOnV/e/4t8rH7FHJ/HN4FFQ57cfa7ybxOGnEC0sCHlw74coRUH/PIus557NuXnIOdpzyf12saQzfd8/vUZXd2CPZ8I8NKVh//7lXQHPrS6cPLC987lFT796g8+IOoxXr72wKvlbyMx5FSjVY4h5fuK2cAsP+CN0+0zgREj52nPJ/Xa7kP6eyz9wxfY82bAWf51a3GG343Zkv6JOfNccrPi2tX7v7k8delKNji8dvUjX9f0mCxf/+7fXsviYMipRqt/H9K69zgrbBYd8PfdlV295kvkvexs6nYf8sicp+s6qYOG3KL7rptcsnu8Zy49czbak9/8XiG9R3727VMBPcbLEx/62c8/o+95DDmBaD3+HtI/KzlP17OoJzWGbLc/H37p0oe+87UzP7j8yWtKnVcu3XfpG4kwn7z/FaEChpxqNAy5nYt8UvP/1PS2vHLuP7519pkL8i+CMOR0o/H/1ExpwZCj2vMYcgLRMOSUFgw5qj2PIScQDUNOaRHP08En9T0iC4acZLTBjyuW9S7kqRl/tEHOdKK1izbIEUK0MUcbW3+mF22QM51o7aINcoQQbczRxtaf6UUb5EwnWrtogxwhRBtztLH1Z3rRBjnTidYu2iBHCNHGHG1s/ZletEHOdKK1izbIEUK0MUcbW3+mF22QM51o7aINcoQQbczRxtaf6UUb5EwnWrtogxwhRBtztLH1Z3rRBjnTidYu2iBHCNHGHG1s/ZletEHOdKK1izbIEUK0MUcbW3+mF22QM51o7aINcoQQbczR2kX4DQDA0PTkt+4Ror4dAgAMB4YEANDAkAAAGhgSAEADQwLAEeett97SVmFIAJgGt68/dfadx2az4+959IU3G7T6yt2zu79y/ba4FkMCwAS4ff2J9x+fHZv/3Xf+9RORJu94+Eq1JN+6dj5RasKxd549f80bS2JIANh+3njqnkiPj6UjwTevLCLx3fnlsEBuPnVPbsecY/c8ddOuhCEBYPv57RPz2ds/cTkeN94++MXVaz/75z+f3f3YaxUtfOZP/NaqhSEBYAK8eeXhO6Ir5cWVN3/z5TsT2d3x+Rfle4sprz12t2BI16oYEgAmwe3fXU4k+d73JvcWj73zE1/+h5N3HD9+x1+ID26uPCwIcjZ7+IpVC0OCzMHSuQaZLw+aRVgtolaLVddqyfpZrVBdiD5vuoGa3YYxcvt3Pz//9+fOnfuny/+1+7G3RV/k2/7ys4+evmMmPLiRL7K9y2wMCTKJIQsr2u82SSKs3reMFifG7Rc++/bZ8ePHZ8eibzW7AH/UvOiOn+zI3PPUG0YgDAkyjhMNhZijS1uh9mDPtI6x2rVdUS3d4mIxL6t5UcuCIkyq0Pk8LVwm7/IgUcFqOXcaeP23Oyd3O28tdBJGSCLAe//tf3//+/T3O9e/ciKRZcbt/S/dqQhyNrvzS/ulSjEkyNiGLLURl2fFdmFWWo75ytWGdPzBmm3IpGn6ymhQucEiZPrOFJ/TA7H/8ktpc3InYXSk48Z3fT65A5n8+ufY6W+/YawLYVyTY0iQCd+HLG4O+jKy68RF4UtYZwxZWs81pOXs8o0dXRaqd5fA6b9kSHlzcidhhGQPbt515txfRXqMH3JnK954+uzxoCBns+Nnn85siiFBRrrKLodOpfnyKqVz3CFYxWCrnSE1/1YaUu5/lSGlUgw5em4fXH70r0/8yYn7H/ul9j/YvPjoh++9JxHm2z//orAeQ4KMOOparMxiURGlD0c5hlT6zxjyyPLmC/947/vnJ+RfBGFI0FDGkMaA0LjlJ3pJvA/pPxSvbUhzMKqKqpYhvf6LshQ3hyGPGBgSZLz7kP7z3cXCcIRxlS0MMYVH3Tn1DWnFER4iudVlMcv9z7u/WNV5lo0hjwwYEgBAA0MCAGhgSAAADQwJAKCBIQEANDAkAIAGhgQA0NguQ94EAOiTrTYkAMAmwZAAABoYEgBAA0MCAGhgSAAADQwJAKCBIQEANDAkAIAGhgQA0MCQAAAaGBIAQANDbhu39nd3XHb3b8XFezey9faLzngZa5xcXEHixC5mMpfVokHjpsGbrO1jizA5MOS2ogmwB0NmtJOD02q1iFifIptserQxYcRgyG3FEWD29sZeNqzcu2FVMMrF5nUQRoNe8sIy46GdQrBMORjZcbWwsswultkg1Uxf6BdKWyy6lAReWqvNytbqOOLKeB0IHooJRwIMua3IhpTHkJEfowtxv1EzbEMWV8tGcWy2lVPXbJUK0qxnZm+NX3oZYMtC4/rc37aZhlvoWbLaeOn3TWukx4QjAYbcVhoYshBk+rqtIi05mLcTC+FJ9xiNVrkgTUUaBizXa4Xe1i1DSgNLa+zqBDQ7LH2ciphwJMCQ20ozQzrPdVpt0TWk9OTmoHiqY5aYo7cCQaq5m6RCa+u55dZpSO/jYEjAkNtLM0Ou45GNa8igKMQLYfuunydDc7goFvY6hvQ+DoYEDLm9tLoPaV1wN0W5D6leqtqGjP61zJI5KRm8ucNJsbDyPmQXQwaDaxuCIwCG3FY0Q2Y/mNSeZed+XOezbOuK2L6IPswvrufzuSOW1ETxfxcL/1m2X2iGD4rLva7Pn2UHDSl8nIqYcCTAkDAo4g/I1/qrcoAOYEgYFAwJowZDAgBoYEgAAA0MCQCggSEBADQwJACABoYEANDAkAAAGhgSAEADQwIAaGBIAAANDNkeL6fWWrPCFJvQo/aXksZGzuQlznJTc+qb9c+Qs+6INXOEddpsNmHmJv4Hyxb93MwsRgPmYotfVO97DNke10vx/Dk9eqq6Az3jHK7jmgdss71Zy9Y22eXRGnLzfcCQG8MXVFRSzr7oJc8yyzy1llOTxUH29twZzOJZcPezQWu6jSZJu3b3953S7rOfJW8XznxkZh03q5cSKlDt0JqYXFpdZOSKJ0vzIgZSjDml+Xy82aRri1XZQz+tmBFfnnc9kAtM2bTcNu+MtTtCKcmsREHCpHRiejVx/yg5y4SvY3tzsdWaIAVDtkeQjDBVrT2Rre8nb6Lb5OLdW5l4r1Rjk8lyk4Brn0G3KtGVlNVLCBWsZh7D4dXSnLsVKcb8PF5Gvi+7h15aMekqW5mD15+iV9ifWlvxT4swUWURqkgjubJT7krbqtg/wg4Xv47tzcWGIXtGMGQxiBSTZ0l6EgeiQs5W8xI+30pFwoV8c3LA5gSusgVjBA+/hkfpYVbTP2GteXrzQULjFGOhTySmFZM/rzmY1DPdyDsh2NZqU5VOIssmaX9eeYc33D8WZltv/2xHLraqTCIJGLI9oTGkkjyrfLhjlDjWVA1pXcDHpcHMC4JI5T7XppkhzSuy4NkXqJYgzVsu9MdIfGMSTDGmD+o0h7tpxeRHNp5I/b3XqK3VJiyKAy8juf9xau8fSSDe17G9udgOlu689wIYsj2+baxL3KCIAhmsqw25FWNIg+AFZqiaORSRL/rEMWTwsBfT0AQ+kdWt8Y8hk9N+4QqywcApsH/kr0PaP2phr2NI8Z4EhhyO4LNs4X6gc+WdvfZuSepX2a4sG9yH3LghnYsezZA1q2WvBYEG7kOqV2ClS+zzXb/KdkNL53XoJpu/9xq1tdpUJdyRdlTFtsT9U/0XxBi8Cbt+IrnYMGR7Kn4P6SXPsq69g8+ylTFk+oR7xxpM1nuW7b9e07PswOGnXh3Xr2Zd/JlPq7318rNs60JP2opdUx9DemnFDpbuI28zmmTFsHDCba02VYaUh0Z5hxvsH7OJs7vNHS7uH7Ew+DHlfVX0oc4H9z5XOKb4p8QDQ24JXR5CQxfqP0saB7WuHdeIuH+2bafpYMgtAUMOxTad7MnwaMO9xZAYEgCOKBgSAEADQwIAaGBIAAANDAkAoIEhAQA0MCQAgAaGBADQwJAAABoYEgBAA0MCAGhgyM2x9sRbm8p16M/yYkxu5ddc67wJbSetAlgLGHJz9GfIvknmiZovjLmy5nPZV/0ZEmAIMOTmUIUmZUX0p5c0pqNM6m0w12GiqXLi6oPlIp8dcOUk11OF5k0MaBX6uQCKuQfzd5WzKapZBQHagyE3hyIlYVZwYdJwY/azYHqaXnIdpnZaLfIZSBfLVTlJeDGxc/xCT27izQTtT3vtTJRtX1xXz8itZxUEaAuG3ByyIasyywjkTTaWp6ZIUhArKvnHnILbTK4nG7J+HhavyVoywgC0BUNuDtFOWnZCaaTnJnHYWK7DzDnx4DEe6aWT4lsJRPKhpGgnq9BIhiWN9Nx0AMHBpJBaS+sDQCsw5OboNIY00oSFxNjnGDIdKC7dq2kruV6nMaSUSo8xJAwKhtwc7e5DygkQtWyw/eQ6NFMTykaqTrIcug8ppxpUs4U2zioI0BYMuTm83IiG1aqfZZetk5yHhRk3keuw+lLXtJONm9Iw9CxbSqW3jqyCAG3BkNCVTSfXA9gcGBK6MERyPYDNgSEBADQwJACABoYEANDAkAAAGhgSAEADQwIAaGBIAAANDAkAoIEhAQA0MCQAgAaGBADQwJCbwJj6tiIJQtfkXBtL7lWbZnkS7RUdZ+kxZuOt+H/Hu04HxHRCkwVD9k0yQ1kprViWAUmO0pB/+rV/abqUjZvlSbTl2UE8jm6LiS312hgSBDBkz/ips5zZcQMpCOtlLTRrllNHKsGTCt6UkhVExnvPf16tv3iGbJIn0ZxBPDQnpDMBbx7fTwrmx3IzKoY3FEikmNcsZ7NUgicVyMG4jWDIfgnlFgymLxTnCFeyFlrzipe5YsXgbUaY3Q3ZKE+iZU5vXnFzEl8jz6GVNSeY7jCYUVGctlxJpGhNdV6mrxWDI8dtBUP2i5k3pk49K+NM4VZ/rZabRhwaSs2bsAZDNsuT6OcFM5VnpEEsmi/TsrKonpK8jIrahoQJzNXBrh4ctg8M2S9K1sICNX2h9XQnf8BTI5+Ck8pLCd6MNRiyYZ7EzHSWjkzSBqmCkv9mNV15aqgZFcUNiYa0vedkF1OCw/aBIXsmcB8ymL5QHH02GEOGgzdjHYZsmicxcdxKHLCVxKXLYnRajCQPD4XLbCsbmZpRUdxQgzFkODhsHxiyb9Rn2eH0hU2yFgr3IauCN2IthmycJ9F+tC1lS8yGa/7dyPyt9Cw7nFGxSSJF4T5kVXDYOjDkJlB+DymkL5SfZXvPXJzXRSTjWXZF8IbPsrv92qd+nkTv55DCxasxOHSeYjsiUn4PKWRUlJ9lS+p2O+8+y64KDlsGhoQhIU8ijBsMCUNBnkQYPxgSAEADQwIAaGBIAAANDAkAoIEhAQA0MCQAgAaGBADQwJAAABoYEgBAA0MCAGhgSAAADQwJAKCBIQEANDAkAIAGhgQA0MCQAAAaGBIAQANDAgBoYEgAAA0MCQCggSEBADQwJACABoYEANDAkAAAGhgSAEADQ4LMwXI+M1msKutXVFktZvO5HTRmvjyI1lRvAGAAMCTIJIaM7FW+CTmshuOiKkUFlAhbAoYEGcuQltPM0WVSwShIG5QFZYCoTIxmvU1ezBeLed56tZwLgbzgAD2BIUHGMWTxNn6RFRuecwWa1jBFaA4hw4a0tJtUKqsrwQF6AkOCjGNIR0ipysqBnOgwp1gN5o4hPf9aehaCA/QFhgSZ0BjS95ljSPdRjCPIbob0ggP0BoYEGcmQka/MYvEq2x17pljX2GsaQwL0D4YEGVtGha6Mp9rGTUPlPqRpNstrbQ0pBgfoDwwJMurvIcsVi4UziLTdaTRzhpDtDSkFB+gPDAkAoIEhAQA0MCQAgAaGBADQwJAAABoYEgBAA0MCAGhslyFvAgD0yVYbEgBgk2BIAAANDAkAoIEhAQA0MCQAgAaGBADQwJAAABoYEgBAA0MCAGhgSAAADQwJAKCBIXvmxt5Owd6NtOzW/m7xOkxFzeDq+lupT5wwxstZ6OZktdN2OU3KLDNmnLyJkRxHaOOn7XL7U7QXM3xJcYysO1LSG3HTen9aNoHxgiH7JNZjIanYWLv7tw631pDZWW6l9CozbZnFdorEsolRT2oS1c5bxqvLlIbCVoT+GPnCjEg5YpyyXrnBiiZ6f1o2gVGDIXvEdVQkzEiRxagyWRXXsYeYUcnu3t7uzo4/+CzjJCTVylZWbXsr7tvG/sySEK7MM9xIYGie+Xmx1MTAb2InRDTCCFup6I/8Cbw41mg3r1BuRdy0EqdpE9gSMGSfJNpKx41ucSGufHVRmDQyvOd6rGyTaC/3oRgna1us7jquNE9wVy9lEldLAYoTJKea5AGVrWj9WWpXs3Kc4BhSbFLZn6ZNYNxgyN4p70R6EnPruWaTaubV1EB+HMOfVvPmOF4TTnz7JuShZMjs1l9RzWti6kreihQ8CVte1zoh1Tj6HUKxSbg/LZrAuMGQm6O4EWmLzXiWU8OQXtvijR7HfFq0Iw1qa1M5hpRtpz0EEZvEyioLGo4hG4/uimrxZj2TM4Y88mDIHvHGa1mB7S73grrNGDIcp9u40eSg6j6kf8Gs33nL6ppNzHFgYCtaf0IiUnrbtEnFTUXuQ04NDNkn1rPs8mpXlaE3wqx5H7IqjtWkwxDSewLtPm8W7ihWXZiXTQQ9yltR+mOHkh5MS0/H9TGkvOlgf9o0gVGDIXvGvMIt3JQ+eM7d5jyYtqxY1jTIGxnPsoU4VtuiG+F7oVVU/B5SEJPTxPjBo3vf0ljl/EKx/u8hi19b1v5xY/n7TPOHRuY4ucaPG1s0gS0BQwIAaGBIAAANDAkAoIEhAQA0MCQAgAaGBADQwJAAABoYEgBAA0MCAGhgSAAADQwJAKCBIQEANDAkAIAGhtwERhKZhtPYhqfgIddhk1yHTYOra8l1eITAkJugvazGZMjtznXYMLj6Acl1eLTAkJtAk1Wc1nB/301DeChnMzwMriXXYTjXYf3g5DoEAwy5CQKG3BFm/5ayGZaQ6zDQHzXXYbvg5Kk58mDITeDfh/SFJaeV8ZVGrkMleDjXYYvg5DoEDLkZQmNIz5B6NkM/FLkO6+Y6bBecMeSRB0NugkaGbDOGJNfhYVWuw+bByXUIGHIzNDNk8/uQ5DrMI6pX2S2Ck+sQMORmEH4PKZrNSXGoPcsm12FVf0Rz1QxOrkMwwJAAABoYEgBAA0MCAGhgSAAADQwJAKCBIQEANDAkAIAGhgQA0MCQAAAaGBIAQANDAgBoYEgAAA0MOTDCpBbrTr/lbq5xfGdanHgWBiaogaMBhhwYT1nF7GWb2VwtjGm5mcALjhQYcmB8ZVklXgauZDrc/Xz6M8Okfs1geq8WmbzyGSBzV0pTjcnJXgG2FQw5MMExpJSBK7FcWmrMLK7UDKX3akiixlU5AaSZmcbIQCglewXYWjDkwGhJvmLEDFyGFtNssre0miZ+eq/GpJPQStOFF2IkCQtMDQw5MKayYvmJF86mOq08Crn41Fxdenqv5ogzac/subPLubxRJUwBDDkwtrKSEaV1y1EaDRYCNMeQYs1Aeq/maGm8RBhOwiTAkAPjKstypJSBy0juZchSqFmV3qsxXtosN+u0c+WNIWH7wZADIz/LNs3nXDjHBoyTdanPssvCUHqvFqpU02ZZ+Qt5lg1TAkNuGx3zuQJAAzDktoEhATYHhgQA0MCQAAAaGBIAQANDAgBoYEgAAA0MCQCggSEBADQwJACABoYEANDAkAAAGhgSAEADQwIAaGBIAAANDAkAoIEhAQA0MCQAgAaGBADQwJAAABoYEgBAA0MCAGhgSAAADQwJAKCBIQEANDAkAIAGhgQA0MCQAAAaGBIUVovZbLZYVZaVHCzns9l8edB/3wA2BIYEhbANJTAkTA4MCQrBMWQqw8Ui+u+ssKJhyKQisoStB0OCQrUhEwWmr5J6hSGTF42GnwDjBEOCQo0xZDlcNA25iv5h+AjTAEOCQktD5jCEhCmAIUGhrSGjUu5CwlTAkKDQ+ir7QGkMsH1gSFBIJGcQq6+2IfnlD0wDDAkAoIEhAQA0MCQAgAaGBADQwJAAABoYEgBAA0MCAGhslyFvAgD0yVYbEgBgk2BIAAANDAkAoIEhAQA0MCQAgAaGBADQwJAAABoYEgBAA0MCAGhgSAAADQwJAKCBIUfJrf3dHZfd/Vtx8d4NtUlUo05gLUIQI9OrkaArz2XjJ6SJ65uZvIr2ZlWpebkhLxGYG1NobiWkdSM47cXOdywU+6mV2p3VomnIW4E1gyFHTQOh9WrIyAb5qRufmOnr8hRV1FUWRQXZmzKS2NxeLdi0iClvvdyQR+qjfK3YvGOh/NmlrfvrmrsOQ24EDDlqHKFZb2/slYPLQ8OQyfgzk2VRJ21lvG2kSts7+Tuj1HZcPBJameev6C2pefSitKKl1VBMS1fKICxes1iIKi2bdywU+ylu3eubODaWBryzsgPKSBvWCoYcNaohjRWR9mIfZobM3plrlHZtyYd5rs1sNZlnfVJz6VyUys31MaQUU2ouXmOnte0xoN+8Y6HYT3HrDvaaIpyt3srBK/QChhw1miEF0cWG3N3dMa60HVlqDRtheMsSQ5UhZ56a1Ob17u+JzS2rlhbLX4lX88abjoViP8WtBz6XuyuKEaO3OzDkRsCQoyZgSPemY7xud39/rywvrqmNi/FOhozdVZ6oDceQdcdmRZx4a/6TjfAY0u1uXNsy5cbHkOLWHVxDSk9uyqc6ZgmG7B0MOWoajiHLi+2YfNwYCFgfcxyYId+LOxRKVgv5ithr3mBsFty6UcN/YJyPAtd/H9Lvp7J1f9+G79nan8q7CIf+wJCjps59yOyl+aSmfE7jvmpnSEGPh/JTbWul9CzbHlNJD8XrjSHF5pZTo+JAn8TOdyyUP3u4VNxX7n0M58obQ24QDDlq2jzLNqs5dQ7zX1o2e5btD4SMu4E1fxMoPnuVmpdXmZV33sK/h6zs0+C/h6z6XPZ42nsAFfoBEawLDAkAoIEhAQA0MCQAgAaGBADQwJAAABoYEgBAA0MCAGhgSAAADQwJAKCBIQEANDAkAIAGhgQA0MCQAAAaGBIAQANDAgBoYEgAAA0MCQCggSEBADQwJACABoYEANDAkAAAGhgSAEADQwIAaGBIAAANDAkAoIEhAQA0MCQAgAaGBADQwJAgc7Ccz2az+fKgfJe/0eovVvGL1SJqZ7yMWSzKwmZ98GICbBIMCTKpIXMrVhlSVFhSGNRqELQIw4MhQSZ14nyeOsoyZCbPQn/l+7ggE5tRGL0zbWdXP3TL0kIxprj1vHOLxdyOCdAdDAkymROXi8RMhiFLW4mFxktjDOkUOjXjQJnYxEBi83Lr5Q2B9BXjTlgbGBJkcgFF/6b/NRzk352sbcjApXNx11K3rrx12dQAawBDgozpn/lyJRpSFF/QkPIgL7twLgLVM6RUiiFhvWBIkLG1E9+Q7G0MacYMX2UzhoQNgyFBxtOWddNvLfchjQt5a20gprh1DAm9gSFBRnh6rT3LjslvIpqPreUrZuu5tVdk/nJSiqk/y8aQ0AMYEgBAA0MCAGhgSAAADQwJAKCBIQEANDAkAIAGhgQA0NguQ94EAOiTrTYkAMAmwZAAABoYEgBAA0MCAGhgSAAADQwJAKCBIQEANDAkAIAGhgQA0MCQAAAaGBIAQANDduXW/u7Ozt4Np8Qq8Oona8tqSYidnd29vVDDWqF6Js4IY2aByTPJlPlq0krGe6dJmRTbjJM3MVLYCG2srYj9Kdr7VYU4ZsIcv09ehWKl3h91bbgJjBcM2ZVMb4agahqyZv2KTW9EjCnZWV6IotSTJSpTkE4To57UJM46a8grfa1sRehPXJC9MSLl6HEOtSZGwLpxxLVVm4YRgyG7kmrqxl7pKktc0YqUtMR4m1UrSnb3b4gNd/dvFWHNWH4ocYtJw939fae0oV2ztIUr8ww3/GGe+Xmx1MTAb2L7yAgjbKWiP/InkHpbrjXlXPjMH/NJccom4lbCm4ZRgyG7kqumdKQhn6gwE1zxyr80Vq677RBlpGBDbYteYTvME9zyR2kY11OKEySnmuQBla1o/VlqV7PBOEofyzsCVi7acH/8teEmMG4wZFdKO93Ycxx4aI4sczfVMWTFAC8PK9QPbrE6chWO14QT3xt3+fbJ7u4V1fyhWnmNrWxFCp6ElTwW6K0S1utFGTHcH3FtuAmMGwzZFcM5yeXsLUV02cq6hpRGesX1804ttXpbdCs0p3IMKdtOvK7UmsQjt7Kg4Riy2ehOqSuSDXQZQx4xMGRXfCnd6GMMGdvRvYofdgwp3l7zL5j1O29ZXbOJOQ4MbEXrT0hEapyazgrfFw1uhfuQWwyG7IrjHPvR9hruQ6YvXcspsg1v0e9tU9wn0O7zZuGOYtWFedlE0KO8FaU/dijpWbYUR3wc4/c2qlY+jlb7I68NN4FRgyG74jnH/oGk92Q5c6ghPXno6D7LLh9ll7+b9EKJWxQN2U6VFb+HlGzj+Sh/9OHet9R/nVj/95DFsxXtul78paJ65e71VonjDq35PeR0wJAAABoYEgBAA0MCAGhgSAAADQwJAKCBIQEANDAkAIAGhgQA0MCQAAAaGBIAQANDAgBoYEgAAA0MCQCggSEBADQwJACABoYEANAYuSEBAIalJ7+tNwLRwvyxBq+//nqdajUhWutogxwhRBtztLH1Z3rRBjnTidYu2iBHCNHGHG1s/ZletEHOdKK1izbIEUK0MUcbW3+mF22QM51o7aINcoQQbczRxtaf6UUb5EwnWrtogxwhRBtztLH1Z3rRBjnTidYu2iBHCNHGHG1s/ZletEHOdKK1izbIEUK0MUcbW3+mF22QM51o7aINcoQQbczRxtaf6UUb5EwnWrtogxwhRBtztLH1Z3rRBjnTidYu2iBHCNHGHG1s/ZletEHOdKK1izbIEUK0MUcbW3+mF22QM51o7aINcoQQbczRxtaf6UUb5EwnWrtogxwhRNtktP8HtBebOAplbmRzdHJlYW0KZW5kb2JqCjMwNCAwIG9iago5NDA0CmVuZG9iagozMDUgMCBvYmoKPDwKICAvTmFtZSAvSW0zNgogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAzMDYgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggNDMwCiAgL0hlaWdodCAyOTUKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgL0RldmljZUdyYXkKPj4Kc3RyZWFtCnic7cEBDQAAAMKg/qlvDjegAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAHwOI9a9iCmVuZHN0cmVhbQplbmRvYmoKMzA2IDAgb2JqCjE0NgplbmRvYmoKMzA3IDAgb2JqCjw8CiAgL05hbWUgL0ltMzcKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzA4IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDQzMAogIC9IZWlnaHQgMjk1CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIFsvSUNDQmFzZWQgMiAwIFJdCiAgL1NNYXNrIDMwNSAwIFIKPj4Kc3RyZWFtCnic7d3LayNJgsfx+ofq1L7tYdjTsgw00zD4sPhU3oFll96loS7l2w40dMMYBvdpDh5YWpc9GOyDDHMoZqBWVRi2D32xywVdyxyGclU12Kqm3Lb18MYjMzIiM1LKlEJShvL7oZmSIp/ShH6OyJAi7+8BAAAAAAAAAAAAAAAAAAAAAAAABPVqd+OBbbs7df0pq3S3H2xsuDuVNnZfiSXTDwAAS6eSUKRU9mRSVlXIMrGKWYHoAxAFJwmd7LJbi2oFq0BvkBVkOxBl3r05T9WDje3tjXTr7u6GZ0eFnQPAQuSS0DyVD5JiK8/yQanXsAPPbhJOTkInXtVK2eolOweAhcglYS54dGRlDTNvVuWKS3eWbxMWctaJYc/OAWAxJrUJi7mVS8L8kEguCOdLwsLOAWBBfEkocsku9vaO821JzekbB2oTAsCiuaFjYskaRbYu6pVcJ7QTzMmvWZPQu3MAWJTS7xNmC7a3c41CNyOtzXJNwtmT0LdzAAAAAAAW6n+BoFZdo4FZUHURENUJkaLqIiCqEyJF1UVAVCdEiqqLgKhOS/ADFoCqi4BEdVp1jV5/q/4/eT05SWjNQpOfUQGogD+siFQhCc3vOkhC1EYSIlL5JNzY3d02v/ot/PytMP1W9thdRy3Q87Hyg7kWIQkRqWISvkruV5KGnJuI9pIp6zB5QvuQhIiUJwllmulATJ4UZwvsbqcB6M7OUDpdIdqBJESkvEmoIm43S8JiB1cVZkuK65CErUQSIlL+JLRnz8r6ufJRGniiVbi9be76WVyHJGwlkhCRKktC50JfbjTElBUmqXZHTEjC1iEJESmqLgKiOiFSVF0ERHVCpKi6CIjqhEhRdRGQqE47NZlt624Y0ArfMTQESYiA6lanXBKGPp3a54DWIgkREEmISJGECIgkbLHz4z3j+FyXvX/RMY8nm7LmxMXVj1KOJERAJGFbyRjsnt5pb3qdvc6L96L4/fPOXvdllR1MWXPi4upHKUcSIiCSsKVUFp2Nkmfj4VlXRqFpJaoGm2y5uU1GUdI5Pu7s7RUbk4l0D53jrgm7/H7co+SfVm0xkoQIiCRsqfFb0QxM2oHSaHA3GI5HA9k6FE3FwUgGVKf3xjQZdTaK/BQBagr1mplsG5GsezoJi/uxj5ItNgcRuTxwd+vlVF1nSpnQP5Zb6M7RDIGTUE8dnPudp7dwDiRhCDJudF7pNlySiVm/VWejXlespwrtlqSnhytSrXumtxld9JLFpft5mWzS6b0d3yft0hoXD/NJuLh5Ve2d23M5YI3Y1enk5KS4Qq5wYhJatURUnmxKzGJhqbrngLmIlMpdKHTzzRpTySWYLwmdEpN6k/fz0mSxDuTn7+8rmpyEdaen3rbrZm5v7lPzLPcXvjthD2g8U536/f7W1tbBwYG9VDwVhWKRKZEplGZbPpHsOUBM/nkLS9Q4B8xJZJPd/lINsu55rrW2d2x1hKcnoRN+ZvHk/YgkNOM2Qtp6rKC0d5yfwr/a9NRZ5SxUUzfWkt048Wqqeske0Hh2dcoFUTGC7ie3Ce3//00d8xaWq3sOmNFIdoytLFS91HdWRuU7wqq1NjkJ1U6TbrZqBcrFU/bjbpJdt5xuau+45vTU5fMTepPw3m4UMsNh9HLXCU0QeSPofnISOvO+pX0Fb+FEtc4BsxId41OrZ9rpvVHtMT2SIjJyPLzopUO+na4cCD5308+s6ez0TbKR3uSlbG169mNtOxqY0+j0LlSTcIax4yDTU6sVPDHm7R1nFduq1WV7QOMVR0x0EHkj6H7xbcK654A5mKuEdrdUjaSooVv9SC0UTNEg++pNuqYl3chs4t2Ps605DTOwMtPYsac7Wnd6aplpGxuexqVnxMQUykg0eynZAxrPO3bcV7zrT0vCua4TznAOaK3yb9E4nZBa01P7a6j/WzRpqRxsYWw5ekG/RRNg7LjuOaC1FvDN6vn7tfSMYzVLEpaNHUu++0b4C2dHEuI+eBLqSjpPDZ1/D1gdfmOCSPFrOwREEiJSJCECIgkRKZIQAZGEiBRJiIC4jwkiRRIiIKoTIkXVRUBUJ0SKqouAqE6IFFUXAVGdEKmlzVlt/+zY+ZFx9R+U8NOTxiMJEamlzVntzGu4sbu7nRypRryRhI1HEiJSy5uz2sxw+Gp3e/eVNd+hNRmXZ+oHz1QPzM/QWCQhIrW8Oaut1fXMhOnMm+lsS8Xdekuy6ETjkISI1PLmrE525TYGJ+zWeyBmZ2g2khCRWt6c1Umamiad+6y425IDdblY2GAkISK1vDmr1RbbG86FxwdOt7qwW/+BAk3QiQUgCRGp5c1ZXdxTbr+VR0zIwsYiCRGpRs5ZjVgxAwMi1bg5qxEzZuVCpOjOICCSEJEiCREQSdh28jbrOZ0X76tuWX6D9olLq93bfTKSEAGRhG33/nlnr3t6ZzN3ga+w5cuZlk7etBqSEAGRhG1XFkqi2dZ58eI4aSZaDbjzpKxz3PVs6VtqNTvVfs7dvZ7nD1KtxUgSIiCSsO1Kk1CU73V6b2Qj8bRreswitpLCs64Ir9yWvqVZ2d2bnoq40UA+EA3RwchanCwUxsOBWjQZSYiAAidh8vtK9+sI3sI5kIQhqcTzXCZUCXmm+8nvZHCl7be0cHTRy2eod+loYLrbY5GPqiyLXxWEb+Xi8VAsrXHxkCREQHZ1Ojk5Ka6QK5yYhNY39LPv0nsLS9U9B8yreJ1Q55bdVjSPnQakyTVnV96lpgO8l9/Py66bws8rDdZIJCECMtWp3+9vbW0dHBzYS8VTUSgWmRKZQmm25RPJO8eRf+IjvxrngFAm9Y4LSejEW2FL/1KZgsdnpndcTEI7hysO1khLm7Nad2pMxXWfTZXO1MDvV5rNrk65ICpG0P3kNqEddCYAvYXl6p4D5lUrCe9HZ+aSoWrnuVv6lupe9sjsR7X6ynZY8fs7ytLmrFYhZiZmcJ5U25YkjECui2GCyBtB95OT0PlZetoT9hZOVOscMK/idUI9iOtPwmS0Q3Vku8WxY8/S8fCilx5BF4qdj9+qMnmc0eA07SB3ehe6Y15/7HjRc1Zv7ArJLrZ3d61YdJqhcr6u7e3sEOlyPZ9hcix+09dExYstOoi8EXS/+DZh3XPAvORAbZ4cuLUHcJ3B3HSDgVAc4vUszY6QFeoyvXw0yHWNZxg7Xuic1cnsgtv6L7uaaNBc+TGzteZqe2FG6+xYC22/Ykbey859xbv+tCSc6zrhDOeA1lrenNXp3PtiqXMnE+ughXn7C/FbXIQmCfotmgBjx3XPAa21vDmrzTyrSb+YJFxDsyRh2dixVJyzsqxwdiQh7pc5Z3Wympq32rqzk793TBLGid+YIFLLm7M6n2qviiMmhVsg27NUmxETkrC5SEJEijmrERBJiEgxZzUCIgkRKX5th4C4jwkiRRIiIKoTIkXVRUBUJ0SKqouAqE6IFFUXAVGdECmqLgKiOiFSVF0ERHVCpKi6CIjqhEgta85qzy/wAk0lggYhCRGp5c1ZnfsVHvMLriOSEJFa3pzVuV2Y9QpzLOXv4mjtn+hsOJIQkVrenNX32V6yHPTuLQvcwjTFaDaSEJFa3pzV1kGcdmPx0mTWKMxnLxqOJESkljdntfcgxb1lkyEWJ25F05GEiNTy5qz2HqS4N7NYRiJJGBmSEJFa3pzV1tbOwvyISfpc3ehzckcbTUMSog737uzmxsTT71Bc7R7GdTBnNQIiCVHD+XG3282i0NwR3r5NvN/0NepizmoERBKiMtGu6/QuzrIonJ6Eog2pdI67Zg3ZPEzoVqJYKWkuyiO8eF+t/UjVRUBUJ1SlgvDteHTWNcE1JQllX7r35k4Q2+zpNbKyuzc9nXhij53nKlzPu/II4+HgbjCadjpUXQREdUJFSRCq4EqicEoSitDrng3H8uHoopesMRIpp8vux2JHuixpZ54f6yNUQtVFQFQnVGP1aU2/tpCEaWdYLXfi0aSelK2WlL3ryV5xrSCUVfcHIBCSEJWoFqHu1AqnulVYSELR4EuI3q0TfmZVmYLHZ6Z3rFcYv+11use1gpAkREgkIaoQQZh2dKWkgzyldyzXSkZXVCtQrqHWPNMXAeXj5AKhjMK9WkFIEiIkkhAVqCC0xzB0yJ1PGTEZDWSzT40dd5Ox4/Hwopd2s3WhHnxRrcKzcXq0amPHq/70YH2QhKhgPBzkBnPVwMcoHeQtHe2VC1RnWUjWSIucQidrK48dr/rTg/VBEmLl1GBMp3cxNfwchSR8uvMw+fXb5n71T8D+5sOdpyE/UogSSYiVU63EwbDGNULJTUIZg2mk7W8+qJxuYjuSECQhouUkoRtoT5/uP31qF5pHWbtRPU+fOk8eWBttbj7UJfs7D61FWDskISLlJKFoBha7xMUkzFZLHzkZqZelTUrTzLQfEIVriiREpGZJQtPsMyubdaw9JA/tkMw9wNohCRGpCb3jQqF75TDNQyfuSMJ2IwkRqYkjJuqx6fCmC7MesAnHyb1jkrA1SEJEqvAtGhmAzpCHKZIDH1nr0F1JFXi7ziRhm5CEiBTfrEZAJCEiRRIiIJIQkSIJERBJiEiRhAiIJESkSEIERBIiUn/377/lP/4L+N+qazQwC1F1r66u+v3+B+UnYCaiCl1eXpKEiJSouqIOi5r88ePH6+vrn4GaRLURlUeHIUmISImqK5qCoibf3Nwk074ClYk6c3t7KyqPDkOSEJHSSSj+rIsq/cknn4xGozFQh6gzIgxFFSIJES9RdUUFFn0c8fddJKGo2Ks+I0RG1BnxZ1RUIZIQ8col4apPB/ERSSgqD0mIKXI3ezc3fF/g4WrsnyTEnEhCVKLu3Xl6l5H37ExuYLyowxVvFVqGJMScSEJUUogmdX/2btpsU3dzdxqKouT4RdKQtBOzuKbT4FSl1jrVGockIeZEEqKSQhLKiOr03qnHIrk6vTdJQzHJrZddGYGq9LRrcs+3pikzpfou8aIJOhhVu98xSYg5kYSoRCahS6RXcjdOFWVv5cPx8KybBJxMwu6ZWmF00et0nr8vW1PdOF4P9o5FocpbesdYLp2ENzc3JCEmsa8TyjZep3dhbkqsmn9WRKrQE4Vpk1EH3HnZmpLpD++RhFgFkhCV2NGkO6/Z5TuRb/Zgim7gySRMg05srFPRu6ZMweMz0zsmCbECJCEqcaNpPLywsnAkmnzJoIjs/upHqvmnV8j6xL411Z7PRuYoKj9JQiwX1wlRST6akizUYTYanKbdXtNrlm3CbrfjFvrWTPaky+QWsh+tRqYZO8bSkISopDiGK0vMUMdo4HR475PrhBcDt9C7pt6TLpO/hleH0WWMHWNJSEIshn2dcOFMEuoZGJZ0VKwLPQMDSYgFsL4bs3g6Ca+vr29vb5mIBnWJOjMcDsWfUVGFPnz4QBIiUjoJ9fyEIgyZohB1iTqj5yckCRGv9sxZfdMAq34PFoI5q7EGRNW9vLzUYQjMQN8BR1Shq6srkhCRWvmt0Phvzf5bdY0GAAAAAAAAAAAAAAAAAAAAAAAAAABA252cnPwFCGfVNRqYhUjCq6urfr+vZ0dZ9RwtiJWoQpeXl6I6rbpGA7MQVbclcy1iQey5FklCREpUXdEU1PNvM/k26hJ15vb29kbNvy3CkCREpHQSij/rokoPh8MfFmnV9w/BQoxGIxGGogqRhIiXqLo/pXcsFVV6oUm46teKhRBhKP6M/qzu00cStsu7Z/tfOfafvVv1Oc3ITkJRpUlC1DW27t1MEraLTMLD01WfRRCTknB/80Hm4c7TkoB7uvNQLNT/SxK2D0nYXt4kFIX7h4eysagXnR4mDUZ7zbTw8JlYWzYk7V05uy1sLvf/7Jlnp2ZNuUPxJFmk1n83LbSnJOHmfhZ32ZPyPCQJ24ckbK+yJPzKCTLdZbbWlQ+zwq8mJaFn82wba3Fxm9NDs06VPnvVJLSeyVDUzPO0TbizabUd3c1JwnVFErZX7jphllTFINSPTSuxsII/CX2be9f0ZHKSgNWCsEYSJo2+rO2XLrZ7x1nT0dOInOm9RtORhO1V2iYs9m2tEZV3SYc4XXtyEvo29yZhPvB0UcUgrJ+ETqNQFTjXCdMA9HWWZ3mr0Xg6CW9ubkjC1qmUhMWrc7XahBP3P6lNKMsODysGYf3esRxG0aX7m54kTNbzXjWscj6IDknYXtOT0OrfWj1d5+pf8tC95Fe4Tui94Ji7emhdhjTxWPV7PbVHTEyhjERfEqqEfPjQM7wywzuN5iMJ26tCEuaGdPOFotHmBKBe79mhp3+dbj59lNkcSLYKfWt61P8WTVq6uZm0DgvfoikbZ57hnUbzcZ0Qc7DHREKzgnCqBXyzuvT7NIt5tVgxkhBzWFQS2t+1qSJwEuoGY8kXD8O/WjQASYg1YJLw7u6OX9uhLj0DA0mI2OkkvL6+vr29XfQMDEubHQVLI+rMcDgUf0ZFFfrw4QNJiEjpJNTzE4owZIpC1CXqjJ6fkCREvNozZ/VNA6z6PVgI5qzGGhBV9/LyUochMAN9BxxRha6urkhCROoECGrVNRoAAAAAAAAAAAAAAAAAAADrb2d1Vv3SASCxqkQiCQE0B0kIACQhAJCEAEASAgBJCKBBzC2KMwu7ZaelJJG62w82dl8t/7j30++m7Nug9J2atAxA89QOgDCKiSRCUJk9Cb1Ta+YKgyXhtKwjC4GYeAPA+RibJ6eHSaMxXV8uOTyUbcrDw8O0VK8+LVeCtwn7/f7W1tbBwYFdKJ6KQrGo/Ljpi1IvJHsJXzkv9TT36uwSax9fOS/ZWQVAo/kjy4pC67Ovi7ItVGIkG58eJhuYBxMtonecC8NiDBaPm920XqWZei3WjezNS82/OjvlnJi030uiEIhG8Tqh+qibKCwE4X32EXc++SYjKnUKF3Sd0IShNwYLx7WzyvsnwazgvjqnzWy/Mw46yEA0yrqxyce42DV249JJElFYMQgXOGKiw9Abg/njuq89185zO7zuq8uFX/bXxHnxJCEQjdILeupzfGo+zL6unruteHZ4WDEIFzt23FcqHNfbJpQpWOzuOq+uLOPchCQJgWiUD23olo7dJc5CMX/F0GxQ9aPfkG/ReK4T2i/KfkXOq7MiNHfZwHoDuE4IRMPzfUK7RWQnm+kyFgYUsn3ZGVJv7Dj9Fs2cX6WZonDc9PVbY8dWZ9caULZf3ZSudHEVAK3hRMUU8f3GJPfq+D4hgALVjqrx0Y8rCb2vjt+YAJhTXEkIAItAEgLAIm9UMsWqXzoAAAAAAAAAAAAAAAAAAACAxjk5OfkLEM6qazQwC5GEV1dX/X7/g/ITMBNRhS4vL723FwSaT1RdUYdFTf748eP19fXPQE2i2ojKo8OQJESkRNUVTUFRk29ubu7u7gZAHaLO3N7eisqjw5AkRKR0Eoo/66JKD4fDH1ZhjJiNRiMRhqIKkYSIl6i6ogKLPo74+y6q9EqScNXvAeYiwlD8GRVViCREvOwkFFWaJERdotqIykMSImpzJ+H+5sOdp+LfpzsPxQP9vyRhm5CEWAPzJmEu+kjC9iEJsQYmJWEWa+kj8e/m5qa+EefmvnquHpvWIEnYPiQh1kDtJFQJKDvF+oFZhyRsK5IQa6B2EpaVkIRtpZPw5uaGJES8qiWhaAGShPAjCbEGpiSh6QKThChBEmINTB473tejIw83N8t6x3qV0hGT9HKi5wFJuCa4Tog1wDerMSeSEGuAJMScSEKsAZOEd3d3JCHq0jMwkISInU7C6+vr29vbVc3AsLRZUxCcqDPD4VD8GRVV6MOHDyQhIqWTUM9PKMKQKQpRl6gzen5CkhDxas+c1TcNsOr3YCGYsxprQFTdy8tLHYbADPQdcEQVurq6IgkRqRMgqFXXaAAAAAAAAAAAAAAAAAAAAAAAMIud1eEc6lpFBQFaYVWfrx03hVp7DtU1/wyBeLU5hZpwDtU1/wyBeLU5hZpwDtX5zvDmx7++fv3XH2/S5z9dvH79+uKnpZ4XsA7anEJNOIfqPGd48rtfffqb33z6q9/pCWD+77/++dNHn2/+/b/9949LPzsgbm1OoSacQ3XuGf74P3/8zyePfvnrb77//ptf//LRE+nzzV88PhJPf7H5+ZO9P/1tZWcKxKfNKdSEc6jOPcOjx59In/3+u+9+/9knxn8cfPfNr9UjkZErO1UgOiUJ0N1+sLH7yip4tbvxQNvuhjyu2O9GtXPIziDUeUw8B3F0wzqN0veh8I7Z+ygsmeNstSQJy5GEQA3FFEo/vvkUSj75vk98jnfi4lxhclwZQru1z6GCec9BFKYHkwdOTsT/PvjOVpdWPd8aZ5s4eqyj7vujI5V4R9/o5Ds6OrIXA6ikUnvMyoKpgdTv97e2tg4ODuxC8VQUikX544rjbHertwkrJku4c0hPRB950vuwrLNNkIRASJWT0NNCKpP7aBc/1Oa4KoQq9tCd3vHUkAl0DumB9YlMeh88fzs2Kl9QqH62qaPH//DFH8R6f/jyS/nPwZdffKH//fJL9c8WSQjUUCmFnI5ehe6x9dH2fqjT46p+6avK1ypTKhOXcw7JwbIecen7UHzH7M7z9OZhtbM1aBMCIS2iTajpj7b3Q50cNwmh2klY/RpciHOwTqJ6mzCfmYHONnP0WH5X5smTzx89kv88ebS5qf99pL5Ro75fM/2IALTg1wltfaX0uLpfusgknO8c3Bi8r3Od0MnJSq3oSmeboU0IhFR7tKLGx3rKcdMQqpzGdnMsxJd5Jp5DIQbTI5e8D553LLu4GOhsrWdHjz/7+s+vX7/+87ffyn9ef/v11/rfb79V/3xOEgI1lH+DJffFEFMc6vuE/5L0S6ueg122+HNwzsB+Jzzvw7R3LMRfjvwZ/u1Pv/2nfyz32b/+8bub0l0ByGnz7zuacA7VNf8MgXi1OYWacA7VNf8MgXi1OYWacA7VNf8MgXi1OYWacA7VNf8MgXgVb5axNJxDXauoIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa5/8By6D8UAplbmRzdHJlYW0KZW5kb2JqCjMwOCAwIG9iago2NzU5CmVuZG9iagozMDkgMCBvYmoKPDwgL0xlbmd0aCAzMTAgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1WyW7bMBC96yv4A2FmhjtgGEhsq2hvRQz0EOTUou0hbuFTf7/DTSIlpUh6CgyZ5Gx8s0gz1wEF8O8mLi6Q+HoZroWGwpFQtiehsUKB9MYCILOyJtSFCXGJ/zcgyYjnpNHuoa6ZBHXzU3wZfg0gPgyPT0z9xnQj/gzZXFV8GD4vwMC7w9ciVEjvEOF1cDrfSVZiMCEE4UmQk5Qh3X68kDj+Ts4kcYq1cBFGQ9w8l020l1jThteI4TpoA/mGuPEoLFXDuhru6syV0lPkpdGMKGsrtHzUAFZ4DqbjQwCMpgY2pUy2BeLHcH8ebke0ggN+/t5WtVJOOo41BOfE+SIedwCKOPZ3ABSYPvLj+Ux5hXt+mAeHqMP0KIOZHmWSnJ75SdYV3XLGw/5JnD9FREYgdIjYD4uSLARvlWoRQUSJe3FjSWqxy2bRlgczCjhlyGh4Nc1ZLZVPRYAfdFsCY7baEYmKVicZXdN7wTncFbYrgSvGO/EJ5tKXntAbjFccMxVd5s+WUC+vqBhOjaMspMYtLFvEVTimIKvyQI4GbkZkK3bJpCn3HbPFXsA1Aq7goBrFXDJtnTi1qpMptgXtHC9s0pIMY81CpidfsER5LHRe6a76V/h+Oxtdtk5FxtRAFl073zetDYbXFjOEdTCClXxlCMqaGgw47AV/A3Y1FCXc/M2gmqToXZfuljllsBJpnE2RWTC7UmqJa9tmlp7Cu0T3qnr7J9pUY2pDOhVenzBqqs82wW/f38nuSp1OpR6a3CcTZsP7uRA2crHG+p8lp1aZeKkEEFfFpMGviuml8ADO4JKvJRVY35n2rR/7b1YCavL1p3NqbxTbGzNK/yVuBR5zf7NaSxMI9NTf3GavtJqk5cbSjRUggpfer6hpNtgYKohbf2ysQFskWBzfMmkszCxHosx+I1o0EoJdHqHZvm0WmtQfuvFh1axRonc8HrE0IiulV2kaI+JIQH5Kb+elRml4eH7XSYm/v8n9W54KZW5kc3RyZWFtCmVuZG9iagozMTAgMCBvYmoKNzQ3CmVuZG9iagozMTEgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDE0IDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxNSAwIFIKICAvQ29udGVudHMgMzA5IDAgUgo+PgplbmRvYmoKMzEyIDAgb2JqCjw8CiAgL05hbWUgL0ltMzgKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzEzIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDExNzIKICAvSGVpZ2h0IDEwMAogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztwTEBAAAAwqD+qWcIX6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOA3BhQg6QplbmRzdHJlYW0KZW5kb2JqCjMxMyAwIG9iagoxMzYKZW5kb2JqCjMxNCAwIG9iago8PAogIC9OYW1lIC9JbTM5CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDMxNSAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxMTcyCiAgL0hlaWdodCAxMDAKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCAyIDAgUl0KICAvU01hc2sgMzEyIDAgUgo+PgpzdHJlYW0KeJztnc1uHFUahn0RuQRkCWXPFdgOkTGE8BsSPGbrBTtuoVd2ZAmPPTMJQ4cM0eAEsBQThAFDgqywIKBoeoe4hSxGYjnS9E919anfrjpVx993Tj2Pzsy4q6sfl7ved45PV7fz558AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfvAHAAAAAAAAqOcZQKAQbwD90FMA/dBTAABwDXMNgH7oKYB+6CkAALiGuQZAP/QUQD/0FAAAXMNcA6AfegqgH3oKAHU57q32jmdfr272B5Mbg/7m8OvRppjxfdktVfVD4/Rx8bYZRffOto82G3tVPgZoGeYaGXLDfzzuabzD5OtB3sZCzJLO+p3TUUrqFfRUmGQRRh1IVWNSojkNTdQzFuc9gnp6CT2VxPiFNlWz4T1RMWpUJn8yzZtOaSs0wpgFjnub/X4vilG0PTtvpFdjeb/izXad5dLYN/uw0ZY4kaOHGXvODs8I7fxfSMEZzDWyJMKfu0yrsXZLlNRod7b5lNQz6Kkw2QIktkzLUtaTZD1jSc4vcNTTV+ipGOavookCjW/2+sP/pJZVpZVJtbVkd9oKjRlM4zno9/qD+NZoITfI+w0uuSXnNcGEN//+dA7Tt6ePSm4fDI4HJFkBzDWytLd2KylpZiMl9Q16Ksyctdu0QoU9ya3naO9eL/MI6ukt9FSM4g5M+jNILt5KK5Npa8mlDdoKLTCbQEb/k1qzme+QnEQnOZNUeCGiwq+F6Q1Ta+nKkCRLwVwjS3rtln0/RYP3TMbKdPMoqW/QU2HMbmaLWem627NUwSb75jyCenoLPRVk+htuwSWK1GJqfmWMvo36vblZqk+LaSvUYbxcS15wM26Vp67+2i1xIbhgL5KsGuYaWVp9z+Szopqlt1JS36CnwuRed8t+cKX62m26J2u3kKCnCkh/wMd8Q2OVN0EaHvP34+i6Wer6HW2FVhjnKrrelr5l/57JvPtT7yg2t1e4glz2CDhDmGtkOZu1m90bm8sMcLbQU2HK3jNpvIZZee2We4294HtRT2+gp0owVlD5fx2k9totbS66TVvBikG/t5n4XW/V/Lik/d8qeZZ+zbBw54qf3Ez/FcwaPyO0B3ONLPPXbqk/kVXe0dTbPHK+jO2U1CfoqTDln3eLm1nnPZNFYurpL/RUDKMns0IWXRSzeM+k8csvkyk4IJHgxK3kKxBRsHNe+Su6/pb4u3Wlf+fUeE0xfXU55yEkWRDmGlkqrN2M3iQ+XzOnpPmPS3xnSuoN9FSYCn+rZHX26bVK9SwSTzdTT/+gp4JkPpOaWWY9y70sxmQKgXDcm/PiPgQDc42nUNJOQU/9gnp2E3rqI7QVgmDQ7xPkrsBc4yeUtFvQU6+gnh2FnnoIbQUAz2CuAdAPPQXQDz0FAADXMNcA6IeeAuiHngIAgGuYawD0Q08B9ENPAfTwBwAAAAAAAKhn7squ3XUiNmzYsGHDhg0bNmzYsGFr0ebCiQ0bNmzYsGHDhg0bNmzYWLthw4YNGzZs2LBhw4YNW9dsLpzYsGHDhg0bNmzYsGHDhs3aNuhvbvYHtZ3HvdUx8b/aPvSspjZJ2SKj8ciMv4FtdmjtHNtUanMWMrZ2n7cGtrxnyf4sZG3NzkL2SJokJP3Yto9tKqWn9LRtGz2lp/NskZGeCtroKT2dZ4uM9FTQdnY9nXxZ/9kbHs34QaOHj6WzcxBvkrI9mz5Z5nOX9DewGY5Wji02WZyFjK3d562BLe9Zsj8LWVuzs5A9kiYJST+27WOLTfSUnrZso6ftHVtsoqf0tGUbPW3v2GITPaWnLdvOtqebvV79lW/ipxt9VbJ8trDlbKluGz1k+OMZ6+h2bbkH3shmexYytkZnoeXnLeFNRqQNW+mWObZ281b62BaObfo1Pa1nyz3wRjZ6Wt9WumWOjZ6WQk/pKT21stHT+rbcA29ko6f1bQbDmyU/eKHT+EEnX47+uz+9mpe/uKxhi4515Co8JzWugeZ/aWubs7G2bfL825yFjK3RWcg7tsZnwRC2cBZyH1r/LGSPpMmxlT22jWNrkhB6Wiajp3lCempro6c2tjkba9voqY2tbMs8Gz2lp/Vt9NTGZmwZlC5aa2U4/kFbaOtxb3W2Vm2cOicZnh1iI1v2FZcGtkZnIXts7ZyFnANqcGypJ8nqLJzRXNPSsTVJCD2lp1Vt9LSZjZ7a2WZb6Ck9paf0tLatmz2dfhAu/3xUv9prHlXz69oJQ8EPbJGTBlcts6vysou01W2D2WcR65+FjK3RWcg7tkZnIfUsNTwL2efc+iycwXs82ju2Rgmhp/R0ro2e0lN6mmejp5Vs9DR1Z4Njo6cWts721Grle5z+/F2j1WWezVi2NjwXOf4mtmKJ1bE9i63NX39o+ZWWJmch51lqcBayD2l0FrJH0iQhmce2fGwR9LSejZ5WsdHT1o4tgp7Ws9HTKjZ62tqxRdDTejZ6WsV2tj21fPaOC/+6aSu26QZ1fyt1dmBtvGIQ006GG56FjM36LOQ/S7ZnIWtrehayR9IkIcnHtn9sY+hpLRs9rWKjp/R0vi0S0NOmNnpqYaOnVW2RgJ42tXnR09IfZ+7PWw9s2LBhw4YNGzZs2LBhw9auzYUTGzZs2LBhw4YNGzZs2LCxdsOGDRs2bNiwYcOGDRu2rtlcOLFhw4YNGzZs2LBhw4YNG2s3bNiwYcOGDRs2bNiwYQvV9gcAAAAAAACo57+l/P777+U71GJo+197DA8em0e2iglpN2/Y7GwiCcGmwSaSN2x2NpGEYNNgE8kbNmzYlNtcOJlrumwTyRs2O5tIQrBpsInkDZudTSQh2DTYRPKGDRs25TYXzqHtuY92GCEN5pogbeK5YrQ76GmQNvFcMdod9DRIm3iuGO0OzXlz4Zxk+L3/PGaEMZ5jrgnURk9DGvQ0VBs9DWnQ01Bt9DSkwdqN4ftgrgnVRk9DGvQ0VBs9DWnQ01Bt9DSkwdqN4cXY+O3h+i8/rv96mr2LuSZUGz31Ymw8/vKlG9tLu9cvHn69XrwbPQ3VRk+9GPS04zZ66sWo3lPNeXPhJMNejdP1n+6t3by+tLs1Gcs3b7x6crLx9Ls3Dj5965fRPsw1odroqf6x8fje6v7W8q1P33zQv7C3tXL3qGi6oaeh2uip/kFPsdFT/aNWTzXnzYWTDPszTq99c3NltGTbXvnoxsuf3177ZGd5fPPCjZ2l3f3Xfx7txlwTqo2eqh8/vvGv4URz79rT0c31H24Pp5sXj77N3Zmehmqjp+oHPcVGT/WPej3VnDcXznSG99YWkizuzXmGlz94/7X45tH75xbWlpuesu3FYkni2zUYbXnObGw8vntxuFLb27/808ONeOPPd1eja3Cs3QK30VP14+T1W1srB/dHrw0+PXnn4bdXjnaX+veu5e1MT0O10VP1g55io6f6R72eas6bC2fB6w9lKUrveX4WhuXLC4uX1859cODsbCa+nQLPmY3Tt+9uL+3uvHzyyNj4/Zt3dpZYu3XDRk/1j/UfPlnZ3b7w+dH6489eHBdz5cuvN/L2pKeh2uip/kFPsdFT/aNWTzXnzYWzSoaHyZwQhXP6GsXi3vSuy9tGMIzHHr1/7vLa4oKxT3aL4Z95JobhzuefPze5axy52bczPMOjirZPY5k+4BKPdDgrj68v/W1rae/2lcTGR1cf3n/rZDK+efdplGHmmiBt9NSHcbp+Mp5ubu1f2Bu/n/ngs1c/3Vne31lNftSanoZqo6c+DHradRs99WHU6KnmvLlwzs/wMLHTc/3aB8+Pc/v8C0fjm0cH5kJ+cq/5hXkpefTSxF7eFsMfbUlkeCI/eOH85JtOv93MM9w5usCdFUZHUuLxZhy9srtVdL3YHMw1odroqSfjdP2nL149uPXy0f2r3388+oDq/j8uHY4+qWp+1Jqehmqjp54MetppGz31ZFTtqea8uXDOzfAwBgsGoxX9KD/x6j4Ow/aiuV+ctHiNv7cWPTa5ZRb4eB8zw7N4ZzIc3TWMZaIU+Qdc5PFmHF++ubW0+8+3fpuzJ3NNqDZ66ts4vfLFztL+9eXd7UsPp2//OIze8kFPQ7XRU98GPe2ijZ76Nub0VHPeXDirvP6Q/z7eaFE/DYOx6n+v5NWGuq8/1M9wzgEHkeGrRx8u7W5d/Oq71Nt91x8fT94t+d40w8w1QdroqW9j9Geylu4cvvvro0lnr321F7/tmZ6GaqOnvg162kUbPfVtzOmp5ry5cNZ63++C+V7fhThvCwvn1xaja7LTMUzmMCTN3/ebzd7kxY2SDGcOuMwjH8jK48nRK3/fGv0bhV/cv/bb+F/lfvrDlQfja8efP/jLdDfmmlBt9NS7MXlt8OKX43fmPzm6dGN7+c7hOj0N2kZPvRv0tIM2eurdKO+p5ry5cBZkuKVhXiku2sKoPCb/UmH8D3NHY++vlx7N/vgkc02oNnrq4Yg+an3xzq3V4URz4/bbT6K76GmoNnrq4aCnnbPRUw9HWU81582Fkwx7Np6evP3g1urNneXd6ys39146PLz6y6m5A3NNqDZ66uc4fffkzksff3jx3/feeTLbTk9DtdFTPwc97ZaNnvo5CnuqOW8unG4zzDjzwVwTqo2ehjToaag2ehrSoKeh2uhpSIO1G8P3wVwTqo2ehjToaag2ehrSoKeh2uhpSIO1G8P3wVwTqo2ehjToaag2ehrSoKeh2uhpSKOzazdGSIO5JkibeK4Y7Q56GqRNPFeMdgc9DdImnitGu0Nz3lw4h7aK/79Uher/L4dNg00kb9jsbCIJwabBJpI3bHY2kYRg02ATyRs2bNiU21w4mWu6bBPJGzY7m0hCsGmwieQNm51NJCHYNNhE8oYNGzblNhdO5pou20Tyhs3OJpIQbBpsInnDZmcTSQg2DTaRvGHDhk25zYWTuabLNpG8YbOziSQEmwabSN6w2dlEEoJNg00kb9iwYVNuc+FkrumyTSRv2OxsIgnBpsEmkjdsdjaRhGDTYBPJGzZs2JTbXDiZa7psE8kbNjubSEKwabCJ5A2bnU0kIdg02ETyhg0bNuU2F07mmi7bRPKGzc4mkhBsGmwiecNmZxNJCDYNNpG8YcOGTbnNhZO5pss2kbxhs7OJJASbBptI3rDZ2UQSgk2DTSRv2LBhU25z4WSu6bJNJG/Y7GwiCcGmwSaSN2x2NpGEYNNgE8kbNmzYlNtcOJlrumwTyRs2O5tIQrBpsInkDZudTSQh2DTYRPKGDRs25TYXTuaaLttE8obNziaSEGwabCJ5w2ZnE0kINg02kbxhw4ZNuc2Fk7mmyzaRvGGzs4kkBJsGm0jesNnZRBKCTYNNJG/YsGFTbnPhZK7psk0kb9jsbCIJwabBJpI3bHY2kYRg02ATyRs2bNiU21w4mWu6bBPJGzY7m0hCsGmwieQNm51NJCHYNNhE8oYNGzblNhdO5pou20Tyhs3OJpIQbBpsInnDZmcTSQg2DTaRvGHDhk25zYWTuabLNpG8YbOziSQEmwabSN6w2dlEEoJNg00kb9iwYVNuc+FkrumyTSRv2OxsIgnBpsEmkjdsdjaRhGDTYBPJGzZs2JTbXDiZa7psE8kbNjubSEKwabCJ5A2bnU0kIdg02ETyhg0bNuU2F07mmi7bRPKGzc4mkhBsGmwiecNmZxNJCDYNNpG8YcOGTbnNhZO5pss2kbxhs7OJJASbBptI3rDZ2UQSgk2DTSRv2LBhU25z4WSu6bJNJG/Y7GwiCcGmwSaSN2x2NpGEYNNgE8kbNmzYlNtcOJlrumwTyRs2O5tIQrBpsInkDZudTSQh2DTYRPKGDRs25TYXTuaaLttE8obNziaSEGwabCJ5w2ZnE0kINg02kbxhw4ZNuc2Fk7mmyzaRvGGzs4kkBJsGm0jesNnZRBKCTYNNJG/YsGFTbnPhZK7psk0kb9jsbCIJwabBJpI3bHY2kYRg02ATyRs2bNiU21w4mWu6bBPJGzY7m0hCsGmwieQNm51NJCHYNNhE8oYNGzblNhdO5pou20Tyhs3OJpIQbBpsInnDZmcTSQg2DTaRvGHDhk25zYWTuabLNpG8YbOziSQEmwabSN6w2dlEEoJNg00kb9iwYVNuc+FkrumyTSRv2OxsIgnBpsEmkjdsdjaRhGDTYBPJGzZs2JTbXDiZa7psE8kbNjubSEKwabCJ5A2bnU0kIdg02ETyhg0bNuU2F07mmi7bRPKGzc4mkhBsGmwiecNmZxNJCDYNNpG8YcOGTbnNhZO5pss2kbxhs7OJJASbBptI3rDZ2UQSgk2DTSRv2LBhU25z4WSu6bJNJG/Y7GwiCcGmwSaSN2x2NpGEYNNgE8kbNmzYlNj+D+dxog0KZW5kc3RyZWFtCmVuZG9iagozMTUgMCBvYmoKNDc5MAplbmRvYmoKMzE2IDAgb2JqCjw8CiAgL05hbWUgL0ltNDAKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzE3IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDM4MwogIC9IZWlnaHQgMTA5CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BAQ0AAADCoP6pbw8HFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnBjYCeWwKZW5kc3RyZWFtCmVuZG9iagozMTcgMCBvYmoKNjMKZW5kb2JqCjMxOCAwIG9iago8PAogIC9OYW1lIC9JbTQxCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDMxOSAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAzODMKICAvSGVpZ2h0IDEwOQogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDIgMCBSXQogIC9TTWFzayAzMTYgMCBSCj4+CnN0cmVhbQp4nO2dPWgeyRnH1RmuuCK4Se+DkCpCcuoEN4EUuWsiSyCOIAjEcDZcY9n6uCuU0mllDhsrkEZNqrxncsYYx6XdCAVsSxg1Cu4EKoRAYJTdndmdr2e+3ndXM7v6/zhyu7OzzzzzzDz/nZn3UO7fBwAAAAAAAAAAAAAAAADa5wgAAFoC4gMASALEBwCQBIgPACAJEB8AQBIgPgCAJEB8LozXr1+ndqFlOu3R8MIFNFoUn9cb01MUi9vFw+1FfqFRlE9vBM2y8JoZUsam9r4XHfE6KfeodTo1DnKhk5UPMXds4nNJGF42QXzApFyo+Gw0a6PmqfjCSgsnct6F19QXYZToFTWmNzYWJSOk1arR7eaJbMniBdG0VFTeNx3RjMtWthebwg2LbNN9tDkc2xG3k2qP2HBvLIqS7UWjnZDwUsbBcLl//5uvZq9xbnzdqfg0k6m84c/rSS6vjOhVUlRNJeuoOtUMFz4qHks3itvVO+zaVZ9qmtx2OWKi6Wx4H20OuzqihFMbF6uTUo+Yk2Y7okpQeGnjIHve/+NPv/jN3R/fs7uPr/72+9k/Pnz90f/i1zeuKTj1J9Qb77ZL3FGSQhNe03jPIj7KF9hYDFBHVfWttb6taav4EDFRj1sUdfD30eKwrVx33HTCNnC6+FDfA2+4AoyDzPnPd7+8Un5Crkx/++P7j6/++uvPqkXr1Vv/8r46KxSH6ZBLfUL9GUN8pMW2JdPCa4o27Mt3JevIo/Ja6fQ9VXFvr29rOkJ8rHoQ1EfaYWu5fq5s1g8UH2If3dR2hhfi03OKlc5vr7IxvfL555/xq+nvX/mXPrLeVOoz+9U3ScRHeqKlsngSXlN6YF/5KOJDz3W7+Fjrk023Lj62hnIVH3u4ID69R9KfcOU5qsSnkRvv0ifUmQnEx/Z+RE2tYoD42FcXgdsub9Ntb7usDaXadrnEJzS8EJ++8vHV99NXhPZ8W5//eMhFfOTn9NQLrqlXIFdHWtap58/i6NN1IkrUtzYdIz56ZWrbaG3I5rCzI74D50nFxxleiE/PEec8U5H6k8+2y31GE1NTrrC4TX93zSNi+WRCTZ/FRb3YWt/atPSzlTevZTPVT9hUHloasjkc1hGlvsdJ0SO/+DjD6zYOMuffd35eK87qs2fi/Cdg7Do5cB4OrtPei3MhYhHg2BCm7ggYJu//+edrVwrleXFY3rHzn6tzf/+v/9ink5/ah0OKnJU2P/EbEIgPuHg+Hh7KUnN4eBj0Wif/keFwSJOz9I4uCIgP6A1utbn04gMA6AqIDwAgCRAfAEASID4AgCRAfAAASYgSnzcAANASUeJzDgAALQHxAQAkAeIDAEgCxAcAkASIDwAgCRAfAEASID4AgCRAfAAASYD4AACSAPEBACTBrTZ3VFI7CwAYDnec3FVxmxotTS2NpJsp9VbcBLD3YJZ4gS6diMaksF1czT7Yi7fQliuES3KdGN9IIy77ncR4gLhjOCTKDnJa7+fdGLxuNolRXC8tLcm3cTlz8eKjFCUVn3Ytx4oPCOGyxLBcQ/DulT2N/PD5aFF8pKytrkbq7Z7ojqKj8vDRY1q/UuiZOtJiPSVaCLMv+2xd+VSibzOr+cbLbdUsfSd7xz0hK9e+2TrVvGT1RyqpXlzSarisxXRnyhxxu+dlt8ruc6+aa9uAzj54QLTtaDrMf71pKepaIDzi08/ImMNdlEh6E7t98dKm+AjvRtWip1z+jJRyqTfNlU98lFe0aTFaah6xi1D7DXbxkQNPGtMtkK2r0TGNEL0L2XbRnVLEWPTG1WVHuChrVHekKzMWRol1uOXGFK3U/SLdpobBNWrWqeKqSAwNZbqfkfEM9zhbfh+tio+UGpXzvD+NCCnaWQfAIz7yK2ZUuOhI2hNmX3aZEp9ZZYmp6ZDFAtm67CphhOrdROJjTI/AbRcdecdk84Xa27rXE1vQ/Etl+7ux/tt67Wm3j5HxDnfbm66WxYfLjCw2TNFNDfbkkSV0VOYXRmrtCbcvGyDEZ6pcvYpYi/Wouna1WZBaF1BGyN6NLz7yBsH4WLsdthZSXXaEWqtIlsSlmDNosgXdx7BRs0X13GbLJz79jYx1uP2iPB7tig/Ln2YzxGRI3La/8qlaECfbra182LKYMmsQsfIxjbS78lEN27Yc4eJjWqM97/T7bjgT8X13ZEz4yme05DjqSbny6SgyxnB3pT1ti0+51pmVlHav2sIoH3djT6ruTo2Iuc58zut1yl6kfeV1Wnzkb4brMMfmqv3MR3465pkP2anAU6pA8SGtebojWeSXZolnuM3VYNghntlQ/HCQWaY3p4oJ9UovI+Mb7i5oW3z0/JY+G6JAO2ZvlnvVUb05pvVz49eu+qlcFmZf8dcmPtqqxrIB4ea1auSXgjRi9E6dNvSvXZZO6bsDq5Gp5tcux4eSskZ2h4y/PJWVEs9w6+lsGPTvRKxNe/y3fOKl7YgxRvbFUu8iYx3uvdZPmjlti8+Fo2nPwLmobxIA3dNr8am+FJclGfln8bJ0FwyfXosPAKC/QHwAAEmA+AAAkgDxAQAkAeIDAEgCxAcAkAS32uAvGQIAOqLFv2QIAADhYNsFAEgCxAcAkIQo8XkDAAAtESU+/wMAgJagNObWl9e/YNxYhPgAADqBlh4uOrew8gEAdAS2XQCAJDjFZhHbLgBAR7iU54vr179Udl6pnQUADAdaeMpzn1J4erHySf2DYV9BADslq/CmyEs/FuXRVCd38Un9X0v1jzdqdqR2Z2hkFd4eiU+x3WrokfgcgWDI7Ejt1HDIKrz9Eh8HqZ2lQe7EklV2DI+swgvx6RTkTixZZcfwyCq8EJ9OQe7EklV2DI+swgvx6RTkTixZZcfwyCq8/RUf7W+LpXaWBrkTS1bZMTyyCm/O4uP+S4bfqaR2lmacwR0tzxQsj8TFZSJZduxszs1t7lxESymZKLxthyhn8bnnZCDiwxRG1pifVsv71Z/ExWUiJjuKZKhiF5gRZO40hbuPFhYe7Xrr95w48aknJ5+gZohadSYr3OLzsz/8Tv4ntbM0XvEZrdSDu1KrD8QnNDuOTz+dnx9shWYEmTtNofm0MP/p9HiMPmRMeHgrZV99Wf/XgC9XV0YQn5pf/WVJ/ie1szQ+8am0Z2F9faH4103+lXWKT/2xVz/48heKlWol0g5OXDJb/OnySLt1mJ2bm9M88DpgqeWdkP6lI8sIeZVSX4tYlbc7mzfNpqXCeyuFnYe1hzw+hB1yMJp1q+iiFsHlTcPD6n83l2d48JvrI6NJ8VRuTG3L6uV44d15OL+wdXB2Ut+fnJ2dNOJjdFxvfCxnsmLw4sOm/sKT/f0npfrMP6zGySE+bLqtl5+jl+v12LPCYqaUH6iDrbVHu2aJZEpcFnOprDZ/kxVot9X84TaqxkpxZC8vPPlQO3CPdIB6l81HXnh+bltTjCk+8ke5lqObM2vsw/1ybeVpsY75UKyRyualpqXC/cdF91een3OfC49pO8pgsAcHW/NN/jdrhbMT9fad4WEV8KrFKq+b69Lyygv22sGTeeaJ5pvelvFKWL5bw1toz8zaM22IeJCNjushGtOZrBi6+JQDXGbyu+Pjd5L62MWH7dHWn5efo5PnVfKvjHjhC5ZRx6dnp0+NkmOH+MysvTgX87+5fVs5p1BMK/ZyNSsbO6YDu9S73Lzvc9ia+Bw/W6vlufxqH4Vsu7b22Zf+7WNh07TDR++H+bp+NXwro2qxsN/U0G5ND+UW5evCshk7zTe9LeOVCcNbtvj4LRkrs+NaiMZ1JisGLj47ZopW6mMXH6WgvjHXR8R2zbXyqeeYesvv6oUK0yfSjtkc+W55QMNWSwzLr3itiU+RB2XDz1eaxsLPfBSbhh3tRd7hauko23fcWn1urtXYud8lX7FEKzS8pZ7wlbgn1OXIqyEa15msGLb48HVPPUoHW/Xax57VzWrnSFoF8UK+uN3ZXN58a5TsMFPzP+wQ4iNPJHHLv2bVvkpAiY/pwC75btmBM9FVy0F6tPgU6zy+heFf2DKw1XZpufSoaLJor+q5VEfQFNoS3LRzJALEeli2WIxEtQ4QfdZuTQ9t4iNZPjKf8vWY1pbxioXg8J7sl6MkxHa0vDySloJKx7UQ7Y7pTFYMWnzEnotPH7bzKgbNsaQ4OWOJy+AHgsWYyyuK+Ue7RMm+9F6Q+PCpJL0yt7lDr6BIB4x35aPyGeUsc7zsaI5b57c+nB6Xhzd8IXlzZY3lyGrj0ZMP5Z7w+PTFet2RhqawOnAmxMe0Iw1GvXZde1l2R3KizFv19qnhoU18FMuVu0RNrS3jFTrdI7S9WKnKJmdWn9cLMKPjeojGdCYrBi0+1c/E6tnnJ7ZGZcuDYkybC+M1hniZ1ZRL9RL5vdqq5oLhkfZS+URySfHOdMB4Vymw/4Qd/mk+U2019j+dnX0SviqtsSKtcV7I36o7zjy22DHiUw+S1EkR4fpW91D+KV/7WV8bZrKmva02wqt7wTugN806boRoLGeyYtDiA2iisgPEklV4IT6dgtyJJavsGB5ZhRfi0ynInViyyo7hkVV4IT6dgtyJJavsGB5ZhRfi0ynInViyyo7hkVV4IT6dgtyJJavsGB5ZhRfi0ynInViyyo7hkVV4IT6d8gzEI0/I1L4MkKzCC/EBAAAZiA8AIAlu8enFXzIEAPQRt/j04m84AwD6CMQHAJCEKPFhmP+XOpMQbs3tKuP27dsh1QKBtbGtJZkhsJaDtbbm24RuhADxGaS1JDME1nKw1tZ8m9CNECA+g7SWZIbAWg7W2ppvE7oRAsRnkNaSzBBYy8FaW/NtQjdCgPgM0lqSGQJrOVhra75N6EYIEJ9BWksyQ2AtB2ttzbcJ3QgB4jNIa0lmCKzlYK2t+TahGyFAfAZpLckMgbUcrLU13/4PvfwdmgplbmRzdHJlYW0KZW5kb2JqCjMxOSAwIG9iagozNjgzCmVuZG9iagozMjAgMCBvYmoKPDwKICAvTmFtZSAvSW00MgogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAzMjEgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggMzk0CiAgL0hlaWdodCA2NQogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztwTEBAAAAwqD+qWcIX6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA3wCiQavECmVuZHN0cmVhbQplbmRvYmoKMzIxIDAgb2JqCjQ4CmVuZG9iagozMjIgMCBvYmoKPDwKICAvTmFtZSAvSW00MwogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAzMjMgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggMzk0CiAgL0hlaWdodCA2NQogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDIgMCBSXQogIC9TTWFzayAzMjAgMCBSCj4+CnN0cmVhbQp4nO2av1IcORCH76HI/DTU5jyESUhIiAipYkPShZRyFSZ0ZGM7cgYcb3DLwo1GGk1Lamk07B+PzffV1ZWskVrdGum3LQ2vrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwJX4e7/0Ts3f801TPFkrbpBIcbiabyfvdnrT4lzW1t1b2ZxveTm0GJsXT7fwk4vLHdocbbz96g7zQsUxtxqbmTyWo0455+jw/WXz7r+f+Zn4yv33a5nDfx/bS1Gk2c8mUeyDbLLpn6nsXGVnfd+/4eFbos9Ae+so2JZEOyNxgbzbbazvKsmoz60Y4UNafnLdp98w8yEdlV03N7NgZkGY1x+KBRJtgooqxG3+S1E8JQXWs2tuSP7Jx8NhYXIhywXjJJiQkcvHy2MjToktvflzGCVVTc3nrEi6pYmnLIDFra0WbUUmUok7dMmhery31bcxSTBWrw3eIzheJQbVPXxK2bWVOnQL9DLZ37LjuRjKQ2rfsrdJOm4dwhkuu2m1la00xclBzOp6WtKC8giCW+MWoIaiODXir+D2wxsQEWYXsy/mpGLAJCYk6GdmY3/zblhs1md/cu4TKacn3hZGltvbbwmuR1tLX+drV0hSaVG25enleNv+vdLJwslNuMDR90el0TDWYNpPG9R1d8CrqIp0sulEWlsC3Md5mu9S5Kje5zQl+DjqmRTowUdKIH6UcQs4xtTI/UQPvQjojy34G1nm/0GHUKaRRlOXzi3nWysujKb483y2c6Bh1Wty1DVYPN/P556dcy1WjP9bQ60tT2Wrg5k52QzqgnWU6+pNfjToFNd1STPfKaHWSlM+GURBa30FvtS0Qz4NuRB0u+Anotl/WseyED6pBb0NXpySEnGNJZXmiNqBO1e8Xdcoh751MLjS/eXCK4tIkIVutEDWVXWplRedHrqXBn+VOdqlOHiWNEj+jwxriu2wjd0q8HZE7VSZChdxJmwfVk2wWlG7PXMv8hK+VO6kh5Bwre7uN3OnN7xc6pFzYg1d/HdRojrwwt4mQUadOfJrOVqnUlkaZLu/8yW5X6hTl1AMZTv5HTTBw7+SK4bMh3Ru4HQpvK6I9qPlT9HZYSwsJmDpcmxskelARVEYEMhNVunfSQ1AdG+/tuupU/X5RpwKhXLw8Pwh9WjWpkbv4Nkc3W2rTJNugP89pLVvLdys/SqtpO8mdsgcW38Ol2+azVJzk66tF/bbiK6Uo2X8fV9xoxd0rjoHpNzv16Jp4qwWlzENuwnUH3Fe9zFew4EiWDGTrwm925djNN7c4WM2y6tigt5VJb+d2hTpVv99kKsATy4XTJyswq+W37sjmT3wmd1os5mGl1tJZsnWmhzkDtl8ER3+zg8lR/+lhQ9RuXtWxnXsLGyH9dmZq/HX2ahkc1l7dvdPDMqxUW1pLtq7BDmPrRn6zg8mxm/3eJ0fVf+eOOr1n5L0TAMB0EH8nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPCX8eXiw8FH99/R9S9beX+9f3DxSRYUHs+PTs/vtSelXm9lYzYbtz8efinGWBX+b2I3LpVHmfT7hb+EX1enH8SS+HTWCVTVUvnD1algGXXavQ9TiAsmxNfDg0heynlF095mWbaXVyfTq8+7ul6HZy4lE1LgLXQ2m5ZHF4dHviZpoHfMNcuMIivb4USMaWNRUx9IMNDFuZF9P1F+TkI7g7GbBtfnweiZcVPjuhsZ39Sh/QIo+dCugSuXfu9fPfpU3JRLL70uLni3NAtJSopEUSeRcriOTp2ajEssRd+9qxSj+JYmZzv76lv6Xa80SF0SzdQQVCNBl4NRJ7u6QHrajWZbmrG88nRqEBovxa6OruQYmvGsG2mlNp/lGQhXhfRWlGPj4+OCd0yzMOKd1ZHuXGXxGHXaP0qkKWoc7JfgR1zLzZIGik35KE3/VCOyy1vvncqBBA54zVEPv9Wxq6MP7GIZcupGrjJxozwDgTp5t2XZh7OpuOCd0SbYtbmT0ths8/2r68PUSHZTd9fv/mShnxw/JkeP3DJOt//gKObXfG11yvsZCqYbqyt/kOeXwdjH7OLYuO6GVqnO5ybVaa244L0y5t4pkzs13ZuMXTvZqZs6WX7xDq35TjSYO+l3QRvNncrZS7phRdKSvdMrTk7pRWjGs26olVvNnd4cF7xrhr/ZqfdOrlLeimfynLBcut/INdBsVt47qTdF4++d6gLpabMFe2RWwzRlPaMrTU6Nt9K46oZeOXjvtI46rREXwIi/d8p9s0uWVmZTJxbSNZk06GkvYOOzlbqeVSO2e/rNLrIcjlUfSDD66eFZ/F3sl/tSpjpQMTklbzXjuhu6bwPf7Eo+DKvT6LiQKYBtkR42p+PGRHwDgN/CRBQAdQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYEf8DdFvuiQplbmRzdHJlYW0KZW5kb2JqCjMyMyAwIG9iagoxODM1CmVuZG9iagozMjQgMCBvYmoKPDwgL0xlbmd0aCAzMjUgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1aSW9kNRC+96/wH5g3dnmXRpFIXjeCGyISh9GcQMBhAsqJv4+3sstLb4GRMtGkX2zX6q8W+/XrQTAefj7ED+uB/fpyeC1jgllg0vRDQhsm+ea04VyEqUzJ8SMMxI/4+wPfQLOviYI+c/zMQxwf/mS/HP46cPb94fOXMPpbGNfsn0Nmh4Q/H34alOHvTj+qoRTwDjV8PViVZYLZhNfee+aAgd0gq/Txhxdg+9/JmLQcIhZemFY8PnwtD5FfmqoP4TPq8HpQmmcJ8cEJZgAZK2Tc4cwm6HH2x+Hx+fDxJDQTnD3/3uDpmNu015xzsOz5hX3+xLmUD0xqFp64eWDCpqdT+B+XqfBfPARSDpvDGfiuzHYzQuZRAWXW5dUiLoy/jhMFL1S9BJNn4npcgRKFDfqeVnyiJGWW/I5EH51XpFU22wf7ysakcS/FFj5Ev9kL5/2TfLkXOvSLXnpSZCm3c35gARmfiJ17Hi272c8fe19wP/KTQP358IU9/0ghBCEivApwlwIxJEzWGn0bDQAgWBDUq1l+tCXRiIadNKfbjlZ7VZmz+TPthSU4Hfl3Fkft0iqkEIudAERW4UIlHttz3DEx0FcaQzQhu5sxeZeGfvK6UjlyBcBdkevkJtOEzUamLaETFdeuxRuN2RpRlNMAqY5fsaPynWiPZbKbGNFd2SE0Ts2xiYN6g2ol7AFhNmqRFuwlPsZ8YfIcOjHmjZqLrpqRPGJIpHCCP8wCFU+EEAhABUyw0GaCBQCRH2Dj6K6kjKcrbqgTcCmfBq7ml35bJm43G+4HYikGd1ZzzHKzqQPfpAAl7D0/Tv5HJyPzCphO5RKKxDpHkik0KXxGhHETIhqf6IAoOvJIhXXPWqdkLdDOMU5HXPOWwNE/ttHd6mxMi7MreE30KCfxRV6XdC+J8/gc2ydT2ifpN1DRg8E9AlRo9MB7F3ul0EpJn3upsy2TUC5QBIE60KBHnx5C+5Z2Zi/Q2VepR8Lmcf/QjhomtTSQdaT1oGM0CHD8egxUDneGANKtIoDyTCkRS5dbyD2j+RI9sxWjtL35p0YaYsfxrsLR5Dxag1rVMr7wVpQP+xRbwYEzFAxu/mBwzYR6g5odhgYUcdAyX1mcejAzDLZmZBisbLo8hnJ5w1lHhYFDndAW0Ca4Dp6BcS8Pm/3lxGTTWDFHWX2KGQ2/I9fIycSR4/kdmpFgYULCHC6FRUxWJXHCiXjw1MZwH7pkSlyTTyllno/lZeou9+KWoU+WmqRHcOGoGnHns1lObNZEdWKPb/mmQAWGJUsqcSVLgleFAmRtUDsQi02tNxwnzijdLzqTdhrAycK+ctOJN8HmmgHYE+D+QuHezhN08bK7GDjdJrdCVa+o7MI56+7jf9mgHORTvEhuJniMTcW1gnbf3uWUGk9JfUQKlDTcTWA7ooDwxbZrz1b3Xe5swf2dMr96wFF4elycbfj5jIz5HZE0nyiDYy5HrMFaVOxImp6GyQkthuTvq/cQI7fo/FXiV3JYKIrt99x29Aw4iQtDK8KqqRnvniiX6eqpcjsWPSeqq9clg4NrITa3FOLrW3P58gEGUM5nDKlgGc0jdvFGBUoM0The3IIA7/IK1sGLjdPqsIJ0JJKx/nZV8tvmH7FK8jS3F4n94QxrhiWo66q215tW3DtdrobdZrWNF0TchoNfTHhYsuWVkq2kKBSq3SmNJ24tCmbQtCGx1LasLrwIrumeAMnOpeVu0bJo1klYqV1uomr2HtkPh4ZeJ9vyRNryAtC0cGV7xUOnwhiGdKLegALRzSx8w8fB82xvCKrRQ2YZ5krJCSC3QF+VDJKydik8AYImHL47CHKmjNp0ZOUteSERqINhsTdNdxURKtHQp/jaIn8maY9tPK0J68VTlbYCvPObiPZ43W7LHmv48ebUbiON2MQ6n+KE7gHWTaaM5aasohcCun2uzO1KlTsSkZw0WqpZcN4P3lSoiHtaoaLWYyHZCbY78zqKVXd5UQats8m2ehteI5pKWx575z2er1q5mNDzpttNoSELk5L4vI522Kuj8+ufuv6WG/LGp2jaXu3VmXsvShvlxZQvp/UdALvRhTdugWDnpfbqro7uxEsT9yEw8QCu+fSqT9gZFEIGUIT05WkflBbrvmjU8WKic+R9J9mQOj6hmndXXevzS6Ov5xjPuysmnBfH4W9NjN3P61vLbNWbug83u1rx+K0kdVIQ/i7bqQZOS/8SqNR1Z7JVpbHD38PJKF9NziABPYBkFWPXXiOSNnB4729CO25Cweu+IsGZD1q6aTR9z2HxBQmAcEJPrxRWQ3z4855vTQxsxq935Ok7tRV6496Mf3LyeN/3Oip51O7CNyhCCXDWh3+hmRGBKGWM2rqIgAdpl9sEKjTb0rzvTYk//wKphDFQCmVuZHN0cmVhbQplbmRvYmoKMzI1IDAgb2JqCjE3OTgKZW5kb2JqCjMyNiAwIG9iago8PAogIC9SZXNvdXJjZXMgMTQgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDE1IDAgUgogIC9Db250ZW50cyAzMjQgMCBSCj4+CmVuZG9iagozMjcgMCBvYmoKPDwKICAvTmFtZSAvSW00NAogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAzMjggMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggNDM4CiAgL0hlaWdodCA0NDUKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgL0RldmljZUdyYXkKPj4Kc3RyZWFtCnic7cExAQAAAMKg/qlnDB+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAjwHdWJENCmVuZHN0cmVhbQplbmRvYmoKMzI4IDAgb2JqCjIxMgplbmRvYmoKMzI5IDAgb2JqCjw8CiAgL05hbWUgL0ltNDUKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzMwIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDQzOAogIC9IZWlnaHQgNDQ1CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIFsvSUNDQmFzZWQgMiAwIFJdCiAgL1NNYXNrIDMyNyAwIFIKPj4Kc3RyZWFtCnic7d3Pb5zHfcdx/kM6WUAE5FD0YFRGgaABHB4CXyK2lxZOEcAX6lCgMYxIVgUUzKU5KHahvRSogOiwKziJUKctRRBIIOdQUTRgJT00IqkYJGWYIfcXO88zzzPPzDPz/Nqd3X129v2CYS3neZ55HpFffjSzz+7s5SUAAAAAAAAAAAAAAAAAAAAAAACAVfdrwKtFVzTgEyUNjygnBIaShkeUE8Lx+d2ra2uUNDyinBAOEhK+UU4IBwkJ3ygnhMNOyKjl6t3P1Rfq8TS6G7KbrL/4xGtrG3frn8HuBG1EQiIc7oQUydVNv/ARRnY3E3RMMC4JEhLhcCbk1bt3i8Z8a2v5lBIbNjY25LYkV3M7p1+JL5L+usn+4gB1BnWMls5ag92JdUmuK8H8kZAIR0FCRimU5JIKIxk6ItzMjDQ2xQ/snfUYdD/Iuk2OzrJZ61Y/xHmW3JVgEUhIhKMoIZNn/bIvVOTk08cYZhbsXJmQzhl0Noh0xWzJWZiQLxQJiXAUJ2Q8ab27sISMJuKlA1ESsq1ISATGnZAypRwTWGuWncul6WbZyUMVgNFFuDopOQsJuVAkJAJTlJD6K3/UlDf/BJ8rl6yd06wtj0rjTk16Nye++RI35TvJn4WEbAcSEoGhpOER5YTAUNLwiHJCYChpeEQ5ITCUNDyinBAYShoeUU5L7QtYKGl4JMpp0RWNyS26fNqIhIRHlBMCQ0nDI8oJgaGk4RHlhMBQ0vCIckJg8iXdbbjIYoM3+aXrhDfuyXVg3fOm65mzINpckJAIjFnS9nKL/pRnWrIoZQE7I2smJO/Sni8SEoEpWLnCSpaoYWPjqlyxsXv3arp0Y7borrnEd74rbZ3wy2ykqi1vYSyZYS1pbgWodj1Zlue7Nb52LEue9JCtjcFwc0okJAJjlHT5UpDZ8FJbcMyxHJm5Kri+MJr1aVzp3s4TG5eQj8g474xlzR3d5pYPspclTw9wHovmSEgEpkFClqx/W5KHdosarakRXX7VNcdYLj+o1Z4HyJaZzHV7aZ60cNFd1yVhIiQkAtNklj1ZQlqL3NqjNPvZwjQn1Y61EtIe/NVPSAaOPpCQCEzdOzUTJGQ2CbZm2Wu5qa8xLdajrDDDnLPsfLdVs2zHcsGzuEe1QkhIBKbuq32aJqTqKbobos2uq+/UaFPerG2yOzVGDBYvS15wLJoT5XSzIXVs0wM9WuB3DC3Xln/0m77aB63UtJxyCen7chpfA5DTloRs+opxtBIJicC0JyERABISlv3eltLbl22vdjrqcbmKPUs31z9LMRISHpGQMEXx2H3Wl15ud7Y6O69E86snna3u8zodVOxZurn+WYqRkPCIhIQhzqi9UfLVeLjXjSJSjSrjAV400jOHmKKl0+t1trbswWci7aHT66oQzPdjniX/Zd0RJgkJj0hIGMaHYtiYjBsjo0F/MByPBtFoUgwtB6MouDrbL9UQU2amyFURrKpR7pnJjhGJuyUT0u5HP0u2WZ1E5PXA7NaJhIRHnhMye4++9kIHZ+MUSMhZimJI5pgc8yVZmc1/ZWbKfcV+caM+8nTMlEXadffkMaOD7WRzYT/Pk0M624fjy2Qc2+DJSRISHunltLu7a++QayxNSO3V+9mbB5yNhZpeA2ZCpFfuiUgz97R7OblkcyWk0aLSsLyf5yqjZVA/eXVZEwkJj1Q5nZ6evvPOOw8ePNC3ii9Fo9ikWqJ0SjMvn1S5pUVyb9G6rH7/U4NrwIyIzNLHa/EArrufG91t9bQJdXVCGqGoNpf3IxJS3S8S0tFmDSQkPNLLKRdQdjRdlo8h9QA0lpayGos1vQZ4Noom2FpGxrPdIy278hPqeHRXnpBxp8l0PR41Rpsr+jEPyZ4XrZZLSG2Rm3pP8rDGODS5clIB5Yymy/KEjGpRf0Np/PN2NpZqdA3wTUywn2kz3M72y3j8Ju/giOwcDw+201vQnW50Y3rfTEW1p9Hpy+QgecjzaHTq6Ec7djRQl9HZPoiHkJPcy57lktysMb4C7CmJDChnNF3OfgzZ9BowA+pZSH16G9/BiW8ly0fxRkE1DbKXCKV7atKD1CHOfoxj1WWoGzrN72WXPLHDGuOowfmkzWnMuX9VQk71POQE1wDk5FfQvXrVuYAta4yjDq+v9vFwL7vpNQA5+ZL+/HOVGawxjqYmSciie9kR58je83CfhESJopJ2JBJrjKMK76lBYIo+p8bDGJI1xlcPCYnAFL3ap/Decc2EZI3xlURCIjBtecV401f7oJVISASmLQnJGuNB4HNqEJj2JCQCQDkhMJQ0PKKcEBhKGh5RTggMJQ2PKCcEhpKGR5QTAkNJwyPKCYGhpOER5YTAUNLwiHJCYFwlbbwHmlXHUR8JicBYJS0TsXBNHZ9YdTw4JCQCY30Kg0glc4kfVh1nuFkbCYnAVMyyWXWcxSObICERmMrnIVl13LEWHAqwcgUCU52QKVYdRyVWP0NgqmfZrDrOquO1kZAITP1X+7DqOCqRkHB7tdPZyunsvKp7ZG9/oq3lh9bT3qfWWXV8CZGQcHv1pLPVfdbXDYbj2kc+n2hr+aH1tDchWXV8CZGQcCsKKzHM6+zs9JJhpTbg20/aOr2u40jXVm2YGvezb/a6nz9JvRFmmxMSS4eEhFthQor2rc72y2hQ+ayrZt4izpLGva4ItdyRrq1ZW//ldhx9o0H0QAxcByNtc7JRGA8H8aZyJCQ88pyQ2XsF9JefuRqnQELOQ5yEjqch4+Tck/PtoyjQ0vFe2jg62M5nq3PraKCm7WORm3FbFstxQB5Gm8dDsbXBk5MkJDzSy2l3d9feIddYmpDaqwiyFzE4Gws1vQbMiv08pMwzfWypHhsDTpV3RlfOrWoivZXv53nXTOcntW4SRUhIeKTK6fT09J133nnw4IG+VXwpGsUm1RKlU5p5+aTKvcUp91Kxy+rXYTW4Bsxa2SzbSkgj9qwj3VujdOztqVm2nZB6Pte8SRQhIeGRXk65gLKj6bJ8DKkHoPEWV6uxWNNrwKw0SsjL0Z56SjIeF5pHurbK2fpI9ROPEos6rPk6oxgJCY9y5aQCyhlNl+UJGb0eVX9haxyGzsZSja4Bs2I/DylvKrsTMrnLEk+Iu/a9bMfW8fBgOz2DbBSdjw/jtug8o8GzdKLd2T6QE3zuZWPe7HKSAeWMpsvZjyGbXgNmJbpxnBfdSNZvKBs3l9MDBoJ9y9mxNTtD1ijb5PbRIDfF5l425s5ZTqcx5/5VCTnV85ATXAOQkytpxzvtuhvNXlrBGuMrzOurfTzcy256DUCOUdKOlRj1tRN9h0p5pjV912HNhGwQ4GhskoQsupcdcb433vMb5klIlCgo6eJlbxVtpQjWGIfEe2oQGLukZW7Yq3q7VhtjjXEYSEgEpqikk1goT0jWGIeJhERgiko6SYuKWTZrjMNAQiIwBXdq9NluwZ2aCRKSNcZDx+fUIDBFr/axF/jOp0TThGSN8RXAy2sRmPaWdNNX+6AF2ltOwETaXNLNXjGOFmhzOQEToKThEeWEwFDS8IhyQmAoaXhEOSEwlDQ8opwQGEoaHlFOCAwlDY8oJwSGkoZHlBMCQ0nDI8oJgXGVtGvVBk8Lz7JseNhISATGKmn5buTZJCTLhoeOhERgzJKWEVY0hsyvC+Fao9te8SxbtZtlw4NHQiIwDWbZ2So8xhpjrtXD9BXPXMuVsWx4oEhI+LDf2+rsvEq/Uh9sXf0J1/U+A7uJ5s9Dpo/KVqC1V821V19k2fAAkZDwYL/X7XaziHz1pLPVfa4/KFS9R1OzSciCNWlZNjx0JCSmJsaBne2DvSwiqxNSjDljnV5X7RENJxNyVCl2SoaX0Rl2XtUbb06ekO4pbcEq4ma3LBseKhIS04oD8nA82uuqQKtIyGhOvv2yL4hjtuQeWVv/5bZMQtFj50kcuvvd6Azj4aA/GFVdzuQJ6Zor51cRNweFLBsePBISU0oCMg60JCIrElKEYXdvOI4ejg62kz1GIv1k2+VYdCTbknHpfk+eoZa5ljTLhoeOhMR0tLmxmh9bCZlOquPtRmyqNIxkuyVtR9vR7LpRQM67pFk2PGwkJKYSjyDl5Fh4JkeRVkKKAWJCzJKNUFS7RunY21OzbLnD+HC70+01CkhKGj5RTpiGCMh0whxJJtoVs+xor+SuTjxqjPaI99yTTzJGj5MnIKOI3GoUkJQ0fKKcMIU4IPV7JzL89ivu1IwG0TAxvpfdTe5lj4cH2+l0XTbKmz7xKHJvnJ5twnvZwIQoJ0xhPBzkbi7HN1xG6U3nwrvP0YZ40i0ke6RNRqORwZPfywYmRDmhteKbQJ3tg8pQNFDS8IhyQmvFo8rBsMFzkBFKGh5RTggMJQ2PKCcEhpKGR5QTAmOtD7nmfl8ea4yjBhISgdFL2lwMwlpEgjXGUYWERGCKStqxEBlrjKMKCYnAFJS0tbwPa4yjBhISgSlY/cyatbLGOGogIRGYfEkboz6znTXGUYWERGCMki5Ze5s1xlEDCYnA6CVtTkPX8sM51hhHFRISgWGNcXhEQiIwrDEOj0hIBIaShkeUEwJDScMjygmBoaThEeWEwFDS8IhyQmAoaXhEOaGx3Edkq4/JnuHp6vf/OSUNj6rLqfzV+rN4LT/vD2i5+BMMn/Uz0ScXJh/vOqvT2R+YWISEhEfTlhMJuYKsyIo/1bqbDvPiz8A2BpaipbeTDDz1JLX3NAaocau2D58Gi7kT5WS+Gct6F5P+1tSrd+8am/Wdjc36oiXGm7Tszsv6RCtZCRlFV2f7KH4sEq2z/TIZWCZ59rwbRWPc+qyr8tC1p2pTrfKztcWQdTCa/NNg9bdHs+o4GojKKcqkbG273Fom5pv3i7dq78lPfpjZ43znuYOK+0QrRQlpEqmWfCZhHHGH0cPxcK+bBF+UkN29eIfRwXan8+RV0Z7xx23LDzcci8Y4h6edZct/c+0lJlh1HNXicnKtteRe3sQ1sMzCzrkslAo+15InFX2ilfTnIaMxYWf7QH1kazxc1KIzDkPRmA4xZfDtF+0ZUfPqLQ8JKQPLvUwYq46jkiynbOk5e3kRnwlprbNCQi4jPbLkJDh7elDknn4TRw4Io4RMA1AcLNPSuWeUjr09Ncv2Moa8LFhIkVXHUW2+Y0jrJ0ZCLiMzssbDAy0jR2KImNyMiabR8lE8XJQ7ZHNr155xz3sjdZY4V2eSkKw6jlqS5yG1f3dKn4ecJiFLOy86EVooH1lJRsqQGw2epdNnNfuOxpDdbsdsdO2Z9CTboiOi+Xh8p3y6e9lmQhqjPk2zhGTV8ZXQ7F623ZjdlalOSK1zfXnQ4j6Jynay7ylHLeoWy2hgTJwvk+chDwZmo3NP2ZNsE+RpZJune9klReWeQbPq+ErjxWOYPf15yJkrT0hWHUcjJCRmT3sNz+wtuKSbvtoH7UZCIjALL+nily6Sj8tn4eUE+EVJwyPKCYGhpOER5YTAUNLwiHJCYChpeEQ5ITCUNDyinBAYShoeUU4IDCUNjygnBIaShkeUEwJTe/UzpfFbmJu9Jrx4b/syeLNg25CQCEz5GuMuDROy6fsKayZk3SDFXJGQCEyjNcbTNSiMVaVUoBqLSKZ9sIr4Spk2IV9++r3v//t/eroYYHp1Z9nGOmb22o/28qcqnlhFfIWQkAhMzYR0rzubHxVamcYq4itGlNP3Hh1ePv33b37/h+K/6HHif96PW76pAlCE4a1P738sG3/4/lPXPsCiTZ6Q2Yd+msvux2s5WytHah2xini4ooQUEffx/0RfaAPC//w4ScvfP/oXbWsaoSJRb336+0vGkGidxrNslYxqr6jBWCT/ajZvZhXx1SLK6f6tf7n/Un4lxoTysXogH8cZqIehekxComXqv9onHf2JADRvgWxsbJhjQv1oVhFfKcUJmcym4//iRhISy8D3yzOseTWriK+S4oS0co+ExDLwmZAFL6VkFfHVUZCQ2fOQ7qccSUi0FS/xhUdFCalNtNMWZ0JeHt6/Fd/LJirRDiQkPKKcEBhKGh5RTggMJQ2PKCcEhpKGR5QTAkNJwyPKCYGhpOER5YTAUNLwiHJCYKz1Ideq3qPHGuMoREIiMHpJmwtDFIUPa4yjEAmJwBSVdOG6ZawxjmIkJAJTUNLW8j6sMY4aSEgEpmD1s7K5L2uMowgJicDkS1ofgJnNrDGOSiQkAmOUdK37M6wxjkIkJAKjl7Q5Jc0PJVljHJVISASGNcbhEQmJwLDGODwiIREYShoeUU4IDCUNjygnBIaShkeUEwJDScMjygmBoaThEeWEwFDS8IhyQmAoaXhEOSEwlDQ8opwQmIK1fWbwDr2iF46zqHhASEgExirpgjfGTG/KhGRR8WVAQiIw1ufUiGx0jSHNpWgdi0TYC0TkWtJ984vssKh4QEhIBKb2LFtbkPHq1fwCufZS3kUtzg+mYVHxUJCQCEz95yHVerYq54zPYcgtm2a3FD2PyKLiASEhEZgGd2riIOrKxcyiiOyWDdfslvRw1xiSRcUDQUIiHPGgrsm97CiJkvXDoycsN8yPMbQ+qsb94TXWh+CwqHhASEiEo3FC6k/4WZ9nU/tOTT4jWVQ8ICQkwlGYkMCEKCeEg4SEb5QTwkFCwjfKCeEgIeEb5YRwkJDwjXJCONKE/ALwhIREOEhI+EZCIjAkJDwiIREYEhIekZAIDAkJj0hIBMZKyMc3ryRv2lu/V/834976lZuPff6qYSmRkAiMmZBRPKZRd299rXbqieNISJCQCI6RkGbQPX587/FjvVE9ysaZ8dfpl8YXa9pB6+tXZMu9m1e0TQgOCYnAGAkpho321NpOyGy39JGRnXJbOgRVw1L9AREZKBJyqS26fNpokoRUw0S1s9pH6yF5qIdn7gGCw42/pbbohG6jklm21Wg+M5nmpBGDJORqYwyJwJTeqYkfq4lzujGbSavQLJ9lk5Arg4REYKxpURSMxq0W1RTdcMlGk+ZOcYNzCk5CrhISEoHhiSN4REIiMCQkPCIhERgSEh6RkAgMCQmPSEgEhoSERyQkAvPN7/+Q//jP43+LrmjAJ1HSJycnp6enr2NfARMRJXR8fExCIjCipEVtiwr/+uuvz87O/gQ0JMpGFI8MSRISgRElLYaOosLPz8/7/f4AaELUzMXFhSgeGZIkJAIjE1IMA0SpD4fD0Wg0BpoQNSNCUpQQCYnwiJIWhS3mSmI88MYbb4iCX/QVYcmImhH/vIoSIiERnlxCLvpysHxEQoriISFX16udztZWbz/XYjRY+8dbs93iLra2Or1e2YG1uvKMhMSUSMhV9+pJHG9aQEUt3edl+8dbx8NBfzC6lPnWfSbvg8iWBqc2u/KNhMSUSMhVF8fUs2fdLCONhNzvbUlys/ZlMvBTLZ2dfX0oqLW/kt3Kkabqy+7Kecb4wM7OTq613rCThMSUSMhVJ/NwNMgyUktIkVad7Zd9QWyOom40eLkdjxgHo2S3rGV4pA5Mh5XZgVlP/Wh/cSq7K+cZk1FuvrHesJOExJRIyFWXplOUkVkiybwScdXdG8b3f0d7STaprWUPooDck/k1Ekkmukj+iIxFVwUHFp8xaTyKQrX+M5YkJKYkE/L8/JyEXFFZOo0OtjtRJDmC6zLOps6Tugn5pNPZPrJOpebPW5U9OM+Y36EaCYkpkZCrTsuc8TDOyH11AyUd7EX2xYiuQULmR3pROvb21Cy74MDyM16SkJg3EnLVGZkTZ6Qa42UT3eT5wcNxvYQcH253zFsqcqY8UmcsCNvyM+avthoJiSnxPOSqy2VOkpFJS3wDJ5kXP5PPI8bpt5WGXsEceTzMDuxsvxyMVPRGDd2uHGLaXTnP6ExI7mVjLkjIVWfdFI4aspbRoC+plnh7Pwq95ED7gXmgvMciD+v39ddNWl05z6hvdZ+rEAmJKZGQCJhKSBG4JCSakitXkJAIlUzIs7Ozi4sLuXIFUJ+Ix+FwKP55FSX0+vVrEhKBkQkp14cUIckSkWhK1IxcH5KERHhWZ43x8xZY9PdgJlhjHAETJX18fCxDEpiA/IQjUUInJyckJAKz8I/G47/A/lt0RQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgDmKPs4mp/TTbco//kZtrfcpOZOreRk1eok+F0h+MtrlHK8fwFKwoiBqyCKjev8GW+em5mXYu7Xk+gG0REVKRJ/ibQws9a3a+DNu0nZOPuJ2p2OMz+QXVp8Zsam3k/Sqx3TxZcS97vQKLiPfud6uvlQnsq7/Mn+CaNf9Xu6wiu8SgOVVOoaMPpE7fmgERpYw6X725DR5oEVk+tDRZyaOmixHk83ZmeyD45Qu3Gp2Xb2bY5Ydn0B7aH0fyk8LYJnZz0NmYyMtA+PRXfETdNbW9IGKSCsgtaOMfvRxmMpKfUwbNzqfMCx7FrG0E+O7YSekumD9sfqLlP+NACwzPSWifHLObbXoNFNF28OdkGmo2FNsa6qa9GcEdBKy2RnTfpomZHkn9m7NErLkbwRgmZkpoU0pL90jImOWnW4unGVfJqmyr6KlfJSlJ+QSjSEZNwKByqeEkZFVTwDq0VQYXHIebyeLOWBUG7UbKdbToTUuo/CpgCmehyxPyPK/EYBl5k4JPZzMyaMVffHGXk+/cWLcC7ZfP2TfRNY3xX01upftuIOs31Op0UnuL2/fyy5NyPLvEgB4wiAMAIqQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWxe7u7qcztui/IgBMSCTkycnJ6enp69hX/og+j4+PRf+L/isCwIREgokoE4H29ddfn52d/ckH0Y/oTYYkCQlgeYkEE0NHEWjn5+f9fn8wNdHJxcWF6E2GJAkJYHnJhBSjPpFsw+FwNBqNpyY6ESEp+iQhASw1kWAix8TUWAz/ZDxO36foROSt6JOEBLDU9ITM4vF3H3/3jX/4VbbXr/7hjdh3P/5djT5FP6I3EhLAsnMkZBKHKiGzuMwHZwESEkAYcgkZp+N3P/6VHoWiLX1cLyJJSABhqJ5li8fZ5FqkZfVMm4QEEIbqhDRCkYQEsEJmN4Y8Pz8nIQEstRr3sid8HpKEBLDsaiRk9IUcODa6l01CAlh2vB4SAIq4E3I6JCSAMJCQAFBEJWS/3/f1puzRaERCAgiATMizs7OLiwtfC/sMh0ORt6LP169fk5AAlpdMSLk+pAhJX0tEyvUhSUgAS63RGuPnJtYYBxA2kWDHx8cyJH2RH3kj+jw5OSEhASyv3dlb9F8RAAAAAAAAAAAAAAAAAAAAAFbU7u7up4A/i65owCeRkCcnJ6enp/Ktgh7fe4iVIkro+PiYt1AhMI1WrgBsLFSCgImSFkNHufqZl6XPsFJEzVxcXMjF7r5iwWQERyakGAaIUh8Oh1+02/QL/MK70WgkQlKUEAmJ8OifUyNKfdERWGHR3y04iJAU/7z+iQ/dQIhyn+S16AissOjvFhzGfHAbwjVJQj6+eeXKzce1dr23XrpncU/uAxf93YIDCYmAzXYMWZ6lYuv6vcJjXRm56O8WHEhIBKwsIaN8W1+/siZcuXnvZvLgcZJ7Ub6tr6/FZNBleaj2WEuPiRJvTd/ZiMB0z3TfogBd9HcLDiQkAlaRkDKx9Acy+ZL8kwkmsi9+kE9IrUUbTKZ7p38aD7VGV0Qu+rsFBxISAasaQ5r5lkvIojy0W9QAcs0ciOaGkGYg2nP0RX+34CAT8vz8nIREeGaTkCIQrYTMDQft+EtzUu1IQi4FEhIB85yQarq9Zs2y17JHuVl2Nl/PsvULZ6wu+rsFBxISAfOZkGoyHd3f0WbX1XdqtFl41sadmuXA85AI2CJfMc6rfYJAQiJgi31PDa8YDwAJiYCphOz3+7zrEE3JlStISIRKJuTZ2dnFxUX7V66Y23o1qEnUzHA4FP+8ihJ6/fo1CYnAyISU60OKkGSJSDQlakauD0lCIjyrs8b4eQss+nswE6wxjoCJkj4+PpYhCUxAfsKRKKGTkxMSEoHZBbxadEUDAAAAAAAAAAAAAAAAAAAAyOzu7n4KrLxF/yKipURCnpycnJ6eyveOLfodbMBcico/Pj7mrUABe/r06ebm5ltvvXXt2jXxf/FYtNQ/fHdlVq4AdCy4EbzhcHjr1q2NjY1Hjx4dHh72+33xf/FYtIj2wWBQpxNRG2LoKFc/Y+kzrAhR6hcXF+fxom1fsfBvoN5///0PP/xwPB7n2kXLnTt3xNY6nciEFP+eipoRkbvoJXIxrUUvqbs0RqORCElR+SRkkD777LMbN27Ixz//+c+/853viFm2+L94LBvFVrFPZT+72ufUtH+NcVSaYc2FRYSkGBX8iQ+PCNTNmzd7vZ548Mtf/vINkwxJsXVzc7Oyn92FfpIXvJt55YVizAeQBe3NN9/88ssvxQMxbswlpGgR7UdHR9evX6/spywhiz+J0CT20z8HewLpJxvWPaNXhSd1f95iQ3U6qXmiWrvNvPJCQUKGTSShfCAm17mEFC2iXcwg5INyHhJy+lhTPSwkIYt4uZg6nXj9Ps+27AJCQoZtXmPI9fV4fJgNEO+tr63pLcbXyWhybS35Vc56iPfOH6tOkx5T64z2kekm+3BXh66LjE+9vr5u/1XMq7py897NK9qxuWsr6cR11XGzsU/x3+jKlWy3XA8k5CRIyLBtbm4+evRIPPjFL36RS8hPPvlEtIut0z4PGf8ixr+p0aPkNz79nRTZkESOPgJM2sRG9QufHuA89gu7B/ko3aXOUfrOa+aluFusi5QxmLWbp1ad6A+S5DSvraQTJftruE5U+DfStto9aGZeeaEgIcP29OnTjY2N0WgkHotIfPvtt7/xjW+I/8t4FO1ia52XjlclpJmCashkj8HM39csMVQ+OI/NZV22f/qo5KgvXMOxXJzYLUUXaZ/avqrcA/vaSjqxr1llm75P8d/ITGz3oPoLErI2mZDn5+ckZKhu3759586dccHrIcXWOp00Tkj7t7J+QhbdyylPyKKjooByjQb1LmedkLlrq5OQak99Lq6+gcV/o3xXeg+aGRRamEjI4Imfr3pPzdHRUb/fF/+f4D01zWbZuUlrLjfKf8HtY7+werATpugoFVBRsBTs3GiW3TQhnZ1XJaT+10iuwP4nRv8bWQnp6EEz66oLBgm5IuT7sq9fv37t2jXx/wnelz3dnZr8yM3YmMuHwnsu8QZnTFUeFbWvr2eDsQZ3aoyLdJzauir7gX2npqgTx3Wb93v0ZzGMv5E6NuvK6iEzu0oLDM9Doo6gXjHufNLPOckN16ILammQkKiDhAzMogtqaZCQqEMlZL/fX/qEBAlZj1y5goREJZmQZ2dnFxcXrFwRgDmtjLPkRKkPh0MxKhCV//r1axISRWRCyvUhRUiyRCRWhCh1uT4kCYkSrDHe1PnyWPS3qtVYYxx1iNo4Pj6WIQmsDvnBTKLyT05OSEgU2QVAQgIAAAAAAAAAAAAAAAAAAAAAAAAAAATj1U5ny9Dbr9y/fBerR6mz86r6WABok3xq7ffKQ7Iy5cQOIgxr7gwAbWaHWD7i9LFllJ/aSDP35WXSpr7KdZ59GZ9jp6dGl6ondWZH5+QtgDlzxI6IJhlU6oG2m7a/2qz3oQdkaUJu6Q+1x2WdA8BcOQJIH0QqafJl+2v5meWieWz5GDIbp+r9WOFshi4AzE/ZGDL5wphnGwmZuxNjhetUCWl1DgBzZidkFpDaXRvHLNs1tMu1TZWQjBsBLFrJvWx9U/Q4HSVaTxWqR/lcmzwhnY8AYL5KXw+Zbez0etog0rqXrW6qmFk2RUJanXPPBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwiV8vDtfQFGUw62sAchZVHrlfjZW9hvpmeoWr/CNo/48eC9SGslzla6iPhJzDNSB4T58+3dzcfOutt65duyb+Lx6LlpL921CWq3wN9bmu8PyP//vixf/+8Tz9+quDFy9eHHzlp/N5aMOPoP0/engxHA5v3bq1sbHx6NGjw8PDfr8v/i8eixbRPhgMnEe1oSxX+Rrqc1zh7j/91bf+5m++9Vf/tBt/+bt//etv3Xh3/c//7t/+6KHzuWjDj6D9P3p48f7773/44Yfj8TjXLlru3LkjtjqPakNZrvI11Gde4R//+6f/uHnjL9/+8W9/++O3//LGZuTd9T9776H48s/W393c+uT/Ju98ftrwI2j/jx7T++yzz27cuFGyg9gq9rHb21CWq3wN9ZlX+PC9NyLf/uff/Oafv/2G8vcPfvPjt+NHIjsn7nx+2vAjaP+PHtO7efNmr9cr2UFsFaMMu72gPJ5+9O6PHv1Ba/jDox+9K31U9rRmbel5j/7r3r1WXoM4u6JdRuE1WFer92FtmeJqpSQhi3lJyLn9CJzXkJ2s4Efg49tKQq6GN99888svvyzZ4ejo6Pr163a7XR7pr7VeflFRJr8SriTI+cMfHNtzjcl5o3D6rzZegzhbmgHRiZPTua/BdbWytW6MNLjaxMP3ZAT+9uHDOAkf/lgm4sOHD/XNdS34R+C8BvePIPu2xklZ8R1u/o1FmMSgoXyHfr9/7do1u73W4EErUP23xOni4qLb7X7++ed6o/hSNIpN+fM++9mtnz1r8TWkFyJPV3YNuciousSJrzYx84SMzeVHIP6FEj+A8qTKTqddkt8yQNA8jiFj9q+G45/zIrnKtGtSnTcOpzZfg3m2smtwhMmPas9I619t6uF7f/GDnzx48OAnH3wQ/fHggx/8QP75wQfxH+/MKCFn8iMovYb8dcSD2+gy6vwj1PwbizBtbm4+evSoZAexdfLnIY0JY435lVaZzppMzxvPb4/afA3mXK7sGuyr1Sfh1cPJelerLGIMOasfQdk1pE86mpfx0Ucf1X4ytOE3FmF6+vTpxsbGaDRybhXtYqvzpeOzGDxIsjKdNXmppldROLX8GrQz1R9D5sOkwe9y2dVmHr4XvaZnc/PdGzeiPzZvrK/LP2/Er/yJXwfkPosYMyeiqa2z84K/1Ix+BBXXkF6I/USH+cPxcg0I2O3bt+/cuVP0ekix1XmU9yegdBexwvPK+W17r8H6Daz/PKQRILWGW7WuNtP25yF1Nf9SVc9Dxqee6J+e+teAgA0GA/WemqOjo36/L/4/6Xtqiu87NPh1LyPOm4ZTO6/BOUApuQbH1WZPXvp4bUw+Ib99+z9evHjxH/fvR3+8uH/7tvzz/v34j3dn8WqfmfwICq/h6Ufqu+b+bjZ5tUDNa0Dw5Puyr1+/fu3aNfH/Cd6Xrb8QUPstUM2+Xgj3aTK/bec1GFegX4XjGqqudhYv2/u/T3743beKfftvf/qb88Kuqjo3rn7GP4Lie9n6yyH102VXxushMXNteCPDKl9DfTO9wlX+EbT/R48FakNZrvI11EdCzuEagJw2lOUqX0N9JOQcrgHIaUNZrvI11EdCzuEagJxfLw7X0BRlMOtrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAL9P9Q6NewKZW5kc3RyZWFtCmVuZG9iagozMzAgMCBvYmoKMTAxMTQKZW5kb2JqCjMzMSAwIG9iago8PAogIC9OYW1lIC9JbTQ2CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDMzMiAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAyOTkKICAvSGVpZ2h0IDUzCiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BMQEAAADCoP6pZwsvoAAAAAAAAAAAAAAAAAAAADgaMxWsrQplbmRzdHJlYW0KZW5kb2JqCjMzMiAwIG9iagozOAplbmRvYmoKMzMzIDAgb2JqCjw8CiAgL05hbWUgL0ltNDcKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzM0IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDI5OQogIC9IZWlnaHQgNTMKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCAyIDAgUl0KICAvU01hc2sgMzMxIDAgUgo+PgpzdHJlYW0KeJztmD1yMjEMhu/CdbgNp8gB0jA5AQUlQ0eZmoYLZHIFJpOBCd96/SdbstbObsiG730ajNaW5B9Zts9nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABghuyu6+XlfSJl789f69Xn975OZdFIFtdTu1ex2umyWdzWi6/9qs1hQRUAKqfVtVtmr6d72LpjAN6osHVb+LafiDvQRrfVd+lvd908fzhJlxBXl9flzazhkBlFoZUvbnS10xSweb7s7Vebj2jl3u7ryn414X8iZUW5ptNjfegU7nfnzCtBLfnrqgXJ8nISG/oRcJEuOaNZFDtiZ8MNwg1R/J/Qr4Qu9D73YRn0q8XGo1kPZJXmQtPKxUsntF+TM1j5qz3j7XdnX5OUc+UfXeCTmmWdpFO9JHZKUlvwuVDoHXbaXENydNcaliwyYb/L2Saxy+Ch6SY6LoP9rpeZWPPBaPOjIqSbfC8UL0Hyeg6ZlJbDqqY3U29oQKcnSnxmp5Ian9WAkmAeVlrMa053GQd/APfUcMuPZHEZ+CQiCZM16YNoygCkvpXXrXqDczuMXLnss1iIp/TI5z4dvYHIZRaFgUpPueCBSReVFGs02YnCH82ALOO0B6BTfqrLR20ZkJwKtPr1GZAQz6XgYemyQ/JW706hfeoxhex6woV19ylZOBiAqvKSoexT/LuovrdW3AGtMHemuP/UdoQGHQLw8elWFN/S+xfR9fK656+gXHgeeAUVNnl76PWvoGoAFl4dFZ0eFpLmTUN5kwwaBhJf7s+HexZe3DarqwtPpkofpXMeqngF/e8RnwLwPgDAfUAAAgAAAAAAAAAAAAAAAABgIo7bp8DL4W2MqrfDy9P2OJVj99U+X/R+/8SojNEZ2kYlpmQW13bbplZQ9Wj0QxO7ZmJxTAwiAO/PbANwvLbHn/Au4LJ4833ufvsNy4dnSJNkQNzGFqRZHalJsa21eDgIbbweYQNN2pieHEm51RCvmVsPWhu7ZupvD05MlXChpJwmgtxzWrliNETlmk5xpKXx4ZPu3A6Sl8ORBhSRv4njxlXVdyGtONso5vEXSFNjqEhGgjSWjgpSE8lw0tZLyfdY7MeT763JMSeWw3qoNCTVzK3nVWu7Zl23YlNUhJJHuufZSU8bjWKj4Y7VzI7gbaEg+KQup9KMRIvihMYdd6YhGH1k5HtOsm+zNl4ornzNjNg20xPaissiWKFlcWfRDUk1c+shWhq7RgMs0SMK2bCLVyF5VeujIXk+oNMzPDtlb9WA0sZNqK9azGuOfNH4eegs8U9C0s9PNOQDHyi5SaDctjhTbLlXBWCVoVLN5CwbA6eta8wff8RiwsQfb3HKAGSejwnASm/FgrTwijNVaVHwszhH80C9AyYBKKYJluPlnUq0q7SdMAM2GeJHllIGbOxaMs5iJr1bBmSezyUDqjP1nQyY6p5rCJJrgyFedFhq0K4JppwPhXi7Ila1tkU9wh1QXXL1hsSaQ3fA2q5R18X+tN6qZOHweaBiHpsCcIo7oC3qM1VpkZaz4/ZcA9BADyZ0ApMpCJWSM5mXhfdJK8tOoULnhbbFfczXLb2Cqkuu3pDUHdIL82BJ9bd0rffHvimnr6BcSJUP7hJxMcdX0IEDOfN8QCftlTg7zNvQdiDx5Z5oy0m3WN4cnpSa4G8xau5Kj0Jz3pcB+HXirjzuIo8ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/AP9jnngoKZW5kc3RyZWFtCmVuZG9iagozMzQgMCBvYmoKMTMwMQplbmRvYmoKMzM1IDAgb2JqCjw8IC9MZW5ndGggMzM2IDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzNWUtvHDcMvs+v0B/wRO8HEBiwveuivRUx0EOQU4u2h7iFT/371YsU9Riv18jBMTYzQ1EkRX6kqJmXTTAe/27SxQXJfn/eXipNMCeZsj1JGMsU372xnIs4VGZyuERCuqT/b/guDfueZ9B7DtdC4nDzN/tt+2fj7Kft67dI/SPSDftvK+Jg4pft18EY/uHsoxYqIT+ghS+b00WntLsIJoTAvGTS7bKY9OnnZ8lO/+bFZHaZsPDMjObp5nu9SfLyEN7Ea7LhZdOGFw3pxgtmJQjWILjDmavQU9LvRkeLymyl1O6CDcExz5TSu+eS88ybRJkii7O/tvun7dOjMExw9vRnQ3WcZdxuggzeccuentnXz5wrEYXccc5N/IlbZvWuWKRzH3+nSFLx+hivkU8MPHnMlPHMEy/8HK+6jlF5tsjgeqCfKx3m23pN+l2jZ57zQm7i0bcsOvXzvIrELZJEWaU+DuPVYljhJJk+d1qSRGqfFAvtdc1USzcuyno7LbBeM8vTsq1EmtsYz+Waz8OzIRacqhXmwJP2lgkHdmTJ+vYbe/qlg5ENE4wSO4WRkbsEodkNC1fgEolrYF6W5ZqRSJd1DswjYwDVAgmy0PisBvnCz/pyOE5l7qFehPEIOVzxD/YE0MXCG5h8aTUhGjWOuzZ3Re9lQejF3ZA0HpJnhoIXExSyMkcQFJXcGLO7I3jjYM4hV3PrVBggcI2p+hcsy77uVPh+gW3AVS+6VgxoaQHV6SdPo1q5MBgKoIBB36NuMhzUzkaP3K96UZAiORSCiMtQcBmGSWOlb7oPC9tyHVj1/ejCGR5BzZXi3DK4YZqTEkydTfLCFTr4uti1cit4s1YBEvFOPpRC0HsGsBE3nesyTbOxuZDIVcf2Hburtx+QN64/j2neNso+WklLmByvhd2Vj7OkDbjTJ6F1t7nRMTBjJeiI15QqnDhW7ctqqFfoFtqYruwPusmvNShqNH4s3E3KkIpS8XUd69Q+FvhRlT0T2fwv23CdG2Y8xF5yxMMMvNgLmBpIUu2ARsEO20MG/Yl3hQL5ATWENq6P0jPSRJULtiUHhZ4343iUe6m0L3Qt7aquBHBctPvKTEH/Xut7w7Gt6Qv+6PXVLkOtXWlCK+QMHM0n4CQApKAno3LFg6ANVRyhD0EhWJ0qKtDHKjv0WaTeQp0/k/tlNbk2e6oeUjtwXxicix3jY29P6R6Kh4AH5VWYo316bX934KkVPh7rLIvnaHqs40zbeLp1qRUICpM7lZ67RCqaFKw2JVPybepxUnLdR76HMibAW/cEEsm6BzLP9XIUrOK+lrg6JoBmq8xQZd0VedJVuZUP6JknzX/AFS8OstrrnesQ+wrXtjfFcd8Rvnb5kI6ENqYy0CX0O5gMKdUadvL4QtZBH/Y4cL7jmKtGGaTznVZqW2wkdvK5PGneHfdQmuftUL8aP0H0eh+NxQX5yRaPNENwTsogyqtbCPbR7o1eWxSqYCdIvNojKFJZa3uGhejcnCzoGWTcpV1bEo6Npw81V/WboV3CIil7N6DMWj6mXmLVXalhRySnfwRO7U0u+gbSB98FlBBgETC8HTNgTfdQsLtCyRcWvuLFpeY56Ib7OeiDgRg8KXedZcMW9dZUDAsQy+EZOj2SSKhwggQMdJjouPtdbziNTSuCVB0bVcQRMhKwpS6WvpBr/nG8P9QeSiONVCPOpsOhuFNC4UY1Q0Tyb24Asr9nHEg+7we87E4iOkc+lJCtQgm9xPIc+YaTcQMQNK4A2FbDp2XUNyp4jl/Y07+74Vivu7TAmkqsMrxrz7vXffNJ0Wi5e506BC2xeQi8vQirmSjae9uw7IgrHfnJyzjcUg/qDc4lR6KLei5ueNjDU+nnhaSKdywcJxJKasmQ7/CKCMa1q03INecBkN0DjdZssG70/5UNhXZz6I2eQ/+GtxGH4T1+H2Gc2208uMUE1EdfHoLYRXfWgVdyunll9B/MybFDH67SBKoXnUHLH9Lf8b4B574lBSn/sDEAne4LyLusq+C/aXUHHQO1dOX793UNc7h9mMLdhS+ap0yZdn7aXjYp9S59FGbrx66wu/JV0EfE6914H3yAb11u+d3Mxkpm42mh+8TIWfC79xM1fydcfGCU0u46NxsrEh8er/nqOIgZP4+W4SutFWbnwY6PnNxe910Up395/VNiRIt3If6Lp1ERJ6WwSoeRTrC+x+h2q9RiN8p+7KCkv/8B/uRIYgplbmRzdHJlYW0KZW5kb2JqCjMzNiAwIG9iagoxNjcyCmVuZG9iagozMzcgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDE0IDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxNSAwIFIKICAvQ29udGVudHMgMzM1IDAgUgo+PgplbmRvYmoKMzM4IDAgb2JqCjw8CiAgL05hbWUgL0ltNDgKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzM5IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDkzNAogIC9IZWlnaHQgNDEyCiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BMQEAAADCoP6pZwwfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIC3AaOyoJAKZW5kc3RyZWFtCmVuZG9iagozMzkgMCBvYmoKMzk2CmVuZG9iagozNDAgMCBvYmoKPDwKICAvTmFtZSAvSW00OQogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAzNDEgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggOTM0CiAgL0hlaWdodCA0MTIKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCAyIDAgUl0KICAvU01hc2sgMzM4IDAgUgo+PgpzdHJlYW0KeJzt3f2PJMd93/H7W/y7LIIj/RAjtiH9YMEWBAGCg+MuwTCQQQQQLAhQQGWP95CsHRxFR4ChwMHx4ahbPRDh0/IIiUeKd+HD2goIKBJzK55M6qjjWRQsMRFw0cZan7TU3qSfux6+Vd0zNT013f1+gbZ6erqrq7untj9XU9M9nQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBBrjzwwSOFu55d5hY/+MCVtou3XXRRnJssD5b2bsD+PHuXceCLGdnMB2Yr1ykps9zAjFVtR/kEaQWr+7KcT9aqifDRBQAAEiWuLCuYzBK78tS01Njg22R9tJRDFbA/RuJVMmKyzLMLiKdF3ZaVeNWS1Z0ZY+KN8NEFAACyMhHdZXY2roiVTbzKsVpcgl/83hqJtxPyP5rUwLt6n6slIPECALAq6kBkfb+uJLlnpYEP1Qp1tDGv7nqX5RWr3CtaOdbwCi1J5ctXKaIqOi/FeGlsyah5vX2r6sImpeOlvyskXjEEOvcnW0JLiNm7QrnOflO97OIto8hkbkORwnzhvJjKQj+ohut8ZjHP+teBWZ7nlHjX09+qVxeHidgfQXXnslXEPvwOPkcAAGCJ1B5AO/Ial23jkm/EKfPaLq2shSEj8QrluBOivugH9S1JQwS0ynn2q2XiLTeZv2/GSKGS2XuBiVeotn5ArQ02Jl7PSWo6v8JBeeCBu4xjUsxy/BNGKc//UXOv56qmc3vuEq0PUrmJLj5HAABgeRydrcbbVkzIX5ZBwAgGWgi0opXakWYkXiNGaO9a+Uavgv5Sq4HRv6p35BnZXXvpHdVQd3sr8cbYHyM5evdHX1buO9bLUd8r0+UVoUjfOF7vSWo4L56DooTt6gsA5biL9fSekhbrmUFW+TeccaylXa9W01+qH5YFf44AAMDSOPomPeNT1SVcAVnpnRW/JG8K2tK7Db/0EgKjo/9Nfa+unV5Mq8R7RclFWnnOrnL17TkSb5sBucKYB0/i9Z+kFp8GewerbFoGXmmwjFTPhlPiXM86V+5Oc21Fua/beCl01pZCP0cAAGBZHBdzuT/LnmNf0Os5QjyzU8T8ibfFS9fO2du3qtAy8da9rnfd5Y60ZoFzJ14xAur1l05ic+J1nKS5Em/ZtXtXGXj1Utz19J8S53p2nZQ9cCRead/dLzv6HAEAgCVxBl7xm/PcivTxtk+8Yt5YVOI1QlWsPl5xHEicPl77h2L2aRfr6TslnvW8n1DfvxFmTbyL/hwBAIDlkC/l4mDcpYzj9SZeRyRsM1JTH2Mp5yQpqXiTUrWq+s+GGcbxthiW4ToS9nBWsfbyrwTnGMc7Y+KtD4j1DwBfPX2npMV6vnG84r/fWifejj5HAABgKVz5RU0Jci+w2L9Zqa7vzd+0z5J4y0Vm6fK1a+Dqu5YzlRRXnF+jH7GDo3TQ5P1plXilcj2nycyAR5SBtt5z6AjjLROv+c8koa9W2lybPl5vNctd1O6GJqzp7fqWX3bxOQIAAMtg9FwplMhbXdGftVLdVLm811d2szT1mm+HxFaJVy1kxsTrrEDjz6TceyTFPrOzWz2+QiHC/rRLvJ4jqpUpx7cjUuL1FDlv4vV2dDrr2To82vun7KB9QF0nYpbE6zxGAZ8jAACwMnxjGPnSFivAMTCDwbMAAKAtEi9WnTjkgcALAABaI/GiB4zQS9wFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGD03gPQhEYEAACAYSPxAgAAYNhIvAAAABg2Ei8AAACGjcQLAACAYSPxAgAAYNhIvAAADNnzmx/72D2PvD7LKq8/cs/HNp/vqkJABHMmXrEt0EAAAFgt2bV5c7P5+sxFHIO2yMTrR1MCAGDJ8otvm0swl2kMGokXAIChqq69z2/qIxvSNwrl+7lsKfWSXS9ZFpC9+0g5uy62KmPWQRRA97oa1WB+7PWmBAAAOqfkXC3yphfl4oJdXbvNlJtPK0tWk1kGLgqr33dtC1gJ3SRe6WNPHy8AAMvkSrliIhUTr3btLldLZ2r9vWY2BlZPZ4nXepvECwDA8igDFypVjG2ZeLVsXM6Ve4PfU7/f5XqPVdPVqAb7Y0/iBQBgaezLbpV0F9DHKybe9+oFueJjxXSWeEvasB8+/wAALIOYOsvMaozjbTdWQbyga9lYGdDIFR8rppPEK37s5S9RAADAwjl+PKb/+kwfgVDMksYtCPdqEPp4uVcDVlhA4tWkH+6Gj73SlAAAAIBlmTPxAgAAAD1B4gUAAMCwkXgBAAAwbCReAAAADBuJFwAAAMNG4gUAAMCwkXgBAAAwbCReAAB6bR9AE3/ijV07AAAAIBSJFwAAAMNG4gUAAMCwkXgBAAAwbCReAAAADBuJFwAAAMNG4gUAAMCwkXgBABie7wGj0aZFzJd4rwEAgNXgSrz+SzwwDF0n3hsA+in54xC7ClgAzmO/dHq+PIm3u40Cq4DEC8CFpDQMnMd+IfECXSDxAnAhKQ0D57FfSLxAF0i8AFxISsPAeewXEi/QBRIvABeS0jBwHvuFxAt0IX7ivbL1mY9/ZutK9aKaTl08/XHtdbrwx09ftF4ly9W0NQDMrd2VN2uImaptqjOlFqu/at+u7T8XF+vt8BfApek8aofVniX8HbaXTuaIf4ev2CfI/rRIWxmxOdudel6sc1Qd3lkT70//4fLlt6X/rl37edBeAsu2GolXbLHZq9Nbyf9pV9GEsnDxImnMxl9PAMFaXHnFZKQlqDQH5c3T1X7bt2v3nws7haHSfB6lzoX6MAt/hx2JV/t3S3Vy6/Cr/31XXvE3XDFnu/MkXuUkzpJ4f/7qK2v/8vEPf1j+71/80befHOqXuBc2JkfP7Erv7J45Otm44J/Tbgv5BpK1iy2l5SQ2zlRz5igEPiuReD+ztXW6ulDWrTT/E3hF/VObL7yVL3LxdPV3mL+WQAear7xGiLly8coVOxGV7dPVftu3a/efCxKvR7sEJadR19/hhsRbnT1n4lVfXzzNyVMsoN1J/57IT+IsiffJe59QIu7Td37+0n3/9vzvKaH335x5ezG7vFp2z9xxYuvc2jEpxr5xdn1y4qJ/TptNPLy2fvaNZGLv5uHhzb10zoNr61vXp9ODm+WcOQqB14ok3ivF31O1lWpXSf1rzNPp6/Rv5MX6yshXmsCiteobtP+xac4s27Cr/bZv184/FyRenzbfkiu9umqPr/PvcGPiLZbyJN56PU6dZs52ZwwgMXuPisM9S+J9+t+pnbovnv/t++//r7/7V0ri/dMv/3347q6cC8cmJ1+6+da5teNK5C16YI8eO17mW3tOvejGxsYkU3b+FgtP8q7jJFKXL4ru2QvF8skKVYdttU5Zij7DLsTYilyTMVuVxFv8I7/+iyhl3/rvY/bP1dPVlY8+XqALXSReof22b9eOPxc3SLxe7caFVofb/ItrvL3AxHuD4buS+ROv9K8S4yQGJN6nk1mv7fyplnjfDNnR1XTh+OTUS/s39pLIe0c5VCBNlyd3kmN07dG1SZZv7TmVrNP3pTQZ7ZyaZKm5Wni6c3KSFLp389rW+vrW9cObe8nCaT/t/sH1bM70YL+Yk2TgtXPX03Wub62leTUppJiRF2sVYm5Fqsm4rU7iLQca5S+0n0CYPTz1954kXqBDs3676php9BNa7bd9u5b/XDgrglzL3/5X332Xh93/d1gx36gGdTEoFtDu1BEj+jmcOfE+9Zkvf397O/nvh2l5P7n6fDr9/b/57NPDTLxprtx6e/9GOlTglZOTfGRDNuKgnHkqzbf2nFqaPx/NDsybj66vPZwkzxfyEJ3YfymJni/ky2QDElwT6YiFc29lIxX2bh4mQTj9n2tn7yg6ebNijVXkreg1GbcVSrxFyyx6cHx9RGk/0GfKrzVJvEBXZv8FjXBLBf2Xa1L7bd+uxT8X5jswtb3bVXoQT582hvDqb5u/kFLfme2XawX+eNvmbHdi4rVO4syJ99n/8r1fZ/b/XzLrl7/65+zFwfkXB5l4Lxyb6Mq+0jxaJi6eSPOtPadWv1dOKUsUk42JV91AUbWNyeT4K0WHbfaesYpnKzfs4sZopRJv2Yi1H0kUqt4H7S/uFWG8n3XTGwDzaf1tuD2I/op8dzKx/bZv18KfC6NsCFrf3zU7a/XIMvffYePEVInXHkVK4p3dnO1OSLzCSZw58T7++x99+o//OPnvxe1k1muv/lk6/fQf/eETQ0y86YiGHSXaXN9aX3twNx3hsF509yZLpGHSnlOzc+abj64XgwqShbNe18bEu3fp5CTddLZSdueIJMXmXbjpBqXE69kKiTcTP/ECWFU8uWAYOI/9sjJPoDDG8T51Y+DjeNN7NOwc7CtzypEN6ZjZtbzPdy3/nZo9p2LnzHrhyYmd7K4KaaDNfmDmjL77B9fPFevkK6VDFTLHTyQT6aAFoxB7KyReHYkXgAtJaRg4j/2yqok3/eXad1791HAT797NQy3vpvYPpgf5cN3DLOwcHh7mM4Q5dTHFvcK0qTwslUsm5Sar3tyrFhEnpupK2Srpq4ODYpZZiLkVqSZjRuIF4EJSGgbOY7+sTOL92//8jOvxE9l/T/z5f+O5a+gPEi8AF5LSMHAe+2VlEu+v/unHX/nz83/4e1Lc/f2n7/zLH/z017/srqbAgpF4AbiQlIaB89gvK5N4b/zfX/3mt7duyVf9W4fv//PovyZHrywh8QLoqTfeeCN2FbAAnMd+6fR8zZR4gSFZQuI9BNBPyR+H2FXAAnAe+6XT80XixWiReAEAGAkSL0aLxAvAhb7BYeA89gt9vEAXSLwAAIyEeKW+BIwDiReAiL7BYeA89svy+3gBqDpOvJduPfSJW79YUJP+xUPTh+69Nd+7XWyx8zJ/fOvJ37l1dbGbt6pR1yfd3PSh35levHe2vRaKAtATb33pQ0c+/Zw6Ib+NJTKP+nOfPpL50Jfe0hbKXqcLH1lmbAB6qtvEe/XeW0l8+u6PF/vHQNaXxDuDpSRez5y5i8Jqo29wGBZzHhsiLYl3YdqeryLeVke9PgXaySgCb7J0+j/LjA1AT3WZeJPA9olbv7h068mHyjmXbiXR6LufSDsS675fcWY+P+tyrNKU2pf45EO3Lubv5plQXTjb7nfvzd9N8/ZVZdpTuK/MUrrYvVlfaD7TXqZp67690OuWbaicL1ZYrYlrL8TVlZdFfao5n7h1VU2wyvxfVGfBcZR+Ia7oOcIAOlN2AWovsv7AI2qikvt4q07FT3+axLtE2XH/0JeeM85FOa2eo3x2+eYyYwPQUx0m3izhJP+bhBwttuUB+Oq9WvoyZ6ZrFRExmZm/q3177n43/3b+4qXDasl62io8Sdrqks4ylZ1S0ppQTuPW/Xth7Hi5LVeFzdzYpkzhYDom1E7mYkVlmIpvRdcWhbph+ejjHYam86hEXr0/sJhjBF0lTdXLZQmMxLsQM7Q7Ndlq/3LRzox6XpYZG4Ce6jDxJtmsijdFGkzDbRnS8h5gz0y1tzCbKY4XlXNa1VesTldpTR1dXG6oocyS2Y1pldO4df9eaDteBc6mCovVk8t0V8ObYCVWTVpusblkAAtQZSUtNBXKxCQkXjVMMaohBqMvV0i85ildZmwAeqqzxFv+DMr8Mr0et1D2/UoztURU5sZFJl61bu481px4rXICE6++ReUQeSssVk8u030wxQmpJ7YamdAuKltbFA8slog+3mFoPo9FLDJ7CbVxDd7O3kOrLxFzW2Qfrxl4n1tmbAB6qqvEq4clKdyq3bnizE77eOfIitZiYjld9fF6K+zfi0X28Sod8r7l6eMFVkEWjJ6r0lGadp3Dd+njXR3mmGprHK95iuR7NXwPGI2Yife7n9CGmBYDG7K+ynyEQz2SU5zZbuipPLMx8XoLd23IeMtVydDE2zSO1zPGuGWZ843jzWea5Tv3qO0RRgzfo493ENqcx/yXakXgNXoOq95CxvEuxQztzrwpQz2UwQy82QlOpl2J13+JB4YhauJNkpLdN5jdtyH5/xftezXYMw8b7tUgZKcflzcuaE68jlsQeMosmVHNKic48dYDQuR7NUgVFqsnD8AwtqKEWDnnW9st7qqhVs8qyn/6XJUHsHB1XCpfGTdhkAczlAtyr4YoGu7HW49pqE6oJ/HGfgYs0K3YiddFfCDFQp9SAaAJfbzDwHnsl07PF4kXo0XiBQBgJEi8GK1VTbwA4qNvcBg4j/1CHy/QBRIvAAAjMXfi/enVH13+wY8uX/3ZcsIJsHAkXgAu9A0OA+exX1ayj3f3r/7jVz7wua984PPPPrGkeAIsGIkXAICRmDfxXvnrzSzxfu6bTy0pnnTmwsakdvTM7oIKNUraPXO0Ljx54dpQuWK9SLpmYuOMe6XmQiAg8QJwoW9wGDiP/bKSfbwDSrwXT0xO7ZTh5fDm3iLK3H14bf3sG+qcN86uJ7H12IXyhfG2teLezcO8LrsPrq1vXZ9OD26Wc9pvfa/1KqO0hMQLAABWwcyJ970ffuv8ztfO//fP3pcn3if/Q/ryf+y8s9ywskBJ4j1xUZ2Rdvoq/avpZNpZurGR9bVONvLUWva9qssWyxw9eofVYZyG3K2tE3dks+rEqxeye6ZaseierTqgNy5UHbbVOmVV9Bl2IVJVNzY2HGWMp1e468QLAABWmS/xvvP9039xLsu69X+TY9984upyw8oCJYlXH9SwfzDdOTlJsmkaN0/upL2kaQ/t2qPXkqNyfWutypUns67hfNkbyjKHh9e2knx7Xe1fzULuW2+fW0u7ecvEaxayd7NasVhk/+B6Nmd6sF/MSSq1du76tK5KUkgxY+fU5PiFG1YhclVPvFSvkqT8Y8Ui6TJFT/TgkXgBABgzX+L95f7BP/7g9F9u1XH3vuee/dlve/zduTqqocyoSdA8tzaZrG1dP9hPX6fR8dxb6Xt7b51bX3t498YLxyenXsre238pSY0vqMtIwxbyOXs3X0m7ecu35UKyFV0T6YiFYit7Nw+TIJz+z7WzdxSRPa2auYq8lUffTOe8+Wi2N+n/Fl2+Fw+m+T4PH4kXAIAxaxjHu7f/fhl6ex93bwijGlK7D65lAfLB/Bt+JcEWk8paxaSacl2JNwmdaTfvg8ULTyGuCbvktCf6+CtFh232nrGKr6rlVJqe017jdW3gxsCReAEAGDMx8V578blP3ff1j2T//cmXXv6f//CDv/qbF779k398/L8+9pFi/uMnX3w3SnQJIiTechxAOQogH7GQpd80Cp+8tJd1imbjAW5cOD7JOkzbJd4baTdvEiqzF55CXBN7l05WOTzJukfP7KZ91FkXblKGmHh9VS2m0lG8Gxfy3Jvk5qzbd/hIvAAAjJmYeL/z9cfVsbsf/k8Xzj3/t6e/+DV15ie//oMo0SWIOo63+IVYOnw3/Wp//yDJvGkUTIPhyeP50IH8rXS07Fq+yolsqK+WctNcav9yrXh3/+2t9UnRs2oWUq3ojL7FgIt6pXSoQub4iWQiHbRgFOKrajGVRN2d6jCsbV3rd699WyReAADGTEy8rz32uPGDteK/jee/9dLzf/DAq9956ulPPnYlSnQJsn+gppeD/ayjsxzKmr6ZTGcDX98+LJbI38oHAtQztFuBZYWqv1xT303XLF6YhVQrVsuLE1N1pXIHDg4OillmIe6q1lP1YRjNDc1IvAAAjJmYeH/4zPZETLz1f+eOPvFmlOjSOfcNdNFfJF4AAMZMTLx7vzn0X/fT3sHf/FOU6NI5HuUwRCReAADGrMUz14DeI/ECADBmJF6MwaISLwAAWHEkXozWlMQLAMA4kHgxWlMSLwAA40DixWhNSbwAAIyDeH2/BIwDiRcAgDFoc7kHRi52MwUAAEFiRwmgB2I3UwAAECR2lAB6IHYzBQAAQWJHCaAHYjdTAAAQJHaUAHogdjMFAABBYkcJoAdiN1MAABAkdpQAeiB2MwUAAEFiRwmgB2I3UwAAECR2lAB6IHYzBQAAQWJHCaAHYjdTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoJX3ADSJ3UwBAECQ2FEC6IHYzRQAAASJHSWAHojdTAEAQJDYUQLogdjNFAAABIkdJYAeiN1MAQBAkNhRAuiB2M0UAAAEiR0lgB6I3UwBAEAQ32X+9Ufu+Vhp8/k5csLzm2Hrt5TWM6D8wNUxArGbKQAACOK8xqdptcqBWfadORUmRdzzyOtzpwyvBcbUrhMvibr/YjdTAAAQxHGF1/JuKo1tM8bXTpMeiRdLFLuZAgCAIPIF3gq8mnq0Q5mBs1D3SDk7nauMiMjeKEur5ldzXzfezaaTiXs2N+8ph0MowyOyGdXrrAJmCU11E3YnX11fNJn3ujJdLHDPI49sfkyb6dhoUf9KZ93d6F7sZgoAAILIF3jfeAQlDVeTWeQr1tBm6hPKunlI9CXeOlEaWxRTrll+Q91UeuJVFy2m6/7tutZKVZwbrWMyfbw9F7uZAgCAIPIF3pN4tfxWLqeOebCDbjWhFVumQ2fiFWugblFcq13d5D2SY7RrA8WL+TaKXondTAEAQBD5Au8Z1aCl1jLM+eOhutSs69bz9eEB4lrt66aaN/EWm5tvo+iV2M0UAAAEcVzh7cgrdcm27HGds49XnVmtNl8fbyeJt6mPl8Q7HLGbKQAACOK6xKtDWp1jYe0hu+95E684jtecaRVobNA3bKB13cxdnSHxWsehzUb52Vq/xW6mAAAgiO8yb94hoeS4H0KLxKveq2Gz6vCt5mX3QZA7U8sFntfCp9xL3KJuqln7eDc3zZsv+DeqVhX9FLuZAgCAIPFCRJfPp+gKAxRGKnYzBQAAQZaaG9Tv9/23/F1RJN6Rit1MAQBAkCUnB+WmC73r4H2PxDtasZspAAAIEjtKAD0Qu5kCAIAgsaME0AOxmykAAAgSO0oAPRC7mQIAgCCxowTQA7GbKQAACBI7SgA9ELuZAgCAIPsAmsRupgAAIEjsKAH0QOxmCgAAgsSOEkAPxG6mAAAgSOwoAfRA7GYKAACCxI4SQA/EbqYAACBI7CgB9EDsZgoAAILEjhJAD8RupgAAIEjsKAH0QOxmCgAAgsSOEkAPxG6mAAAgSOwoAfRA7GYKAACCxI4SQA/EbqYAACBI7CgB9EDsZgoAAILEjhJAD8RupgAAIEjsKAH0QOxmCgAAgsSOEkAPxG6mAAAgSOwoAfRA7GYKAACCyBf4d19+5Ivbl/1zRiJ0x5d54NJtJR7Z3l78Nqv9CNohq4YtS4v98YvdTAEAQBD5Ak/irfQo8Xa6qYUUPvfnKvbHL3YzBQAAQeQLfEMyubz9xVw5J3k367Yr51gL7NdrFrPSVV5+11WaOK0VkyuKKPsOlVKy8l921UPeRFq7l4uS1JLdOy5uWl1S7G+VV3HvnXzAjb1T1ros1TmtSVaguO/GGTRrqFSg+ZPgOuxSDRsPrzDf+enqTuxmCgAAgsgXeG/iTQJHHsXqeVlAUoOLuUDl8naVc/OJamF5NaEIuyp1GfqX71bJ4g5qibdcJ500I5lQVXHTxvtC8BPjtPNAOw6R+7g5a+JNvHU9XcezxQFpedi9pbU7KlL5nYndTAEAQBD5Aq908SmqWKj2PYo9ddYCtSLpKoHXWtGfeBu+4Jaq5C9ET7xaZ+W7xrviPlqb1pb0V9c6PuI/EloeIiFGGjVpsa6rhg2Fz3ju5NLcH5sZzkInYjdTAAAQRL7A+yJi9Z2y8s27/N208dV8VVAypwy82oreSGYUYFVZ2WpI4q2LLqKVnAm1Svg2LYV+YRXP3rU/ROJEXdpside5U/4DEpR43R+bFmehU7GbKQAACCJf4BsSr5XgzMTrG2CZLLu9XY5tWEwfr9I3K0ajeRJvyz5eadMNfbziKv69W3Ifr/d4dtjH6/7Y0McLAAACNAUMYU7DyNvGkZbpwloHqWdwrDa81K5KPmmmrBbRS96EMuhW2rUWQ46lXTF2wLGKc+/aD3WW4qswjlfcd9fhso/nbAekfeL1fmxaLtaZ2M0UAAAEkS/wDX2P4q0S1OXtuw0YZYkL1zPfLccRZ7/79wwKUJNbPqO8N0JD4hU3kUao/IYF7e/VIGxanS3dq8GxiufotbudhbvDNlv15WoMgLDv+iGSapjPa3GvhnkTr/djU27dcRa6FruZAgCAIMuKDAoj8K6QJXYaLp8U+9FS7GYKAACCLDk5ZF11K5sqh5d4687aFT7sPRC7mQIAgCCxowTQA7GbKQAACBI7SgA9ELuZAgCAILGjBNADsZspAAAIEjtKAD0Qu5kCAIAgsaME0AOxmykAAAgiX+C7vpPVcu6U5d9KF3UIKVO4RW1xpwX5rr2zFbUgY73FWexmCgAAgsQJEKsQnFY28YaX1t3hXYUTF0PsZgoAAILIF3itmzF7MFd1R9fL2/rdXZPX6dO8rDu+Sk/jqh5oJj4zS7l3bPmGWPgsW6y6OuudyGepCzfuo2t3PGUqO2UuJhaovCyqrTyA7HLjA+8c1Wh8PppYt2pB4dHMjjrvm8vVD0pWH7csnh3zTOUfktXK1bGbKQAACCJf4I0v1tXv2OtpJfbkqSadLIJK/SyHakopSeoqVJ7+0FD4TFusH5DrfLd5H50ructUj6S1WHNtXY/iteskHTdpVIPrjFh10+Kq9IBkd4HKyazeqk6U71jpZ2q1wm4mdjMFAABB5Au80cf7bjVX7Wi1Qme9QJ2a6iXFhCOrVncVPuMWneGq/T5qPcwtyrSPpJHkW9TWm2B9x01Yvv0Z8T54zl+gWpNshhJ42219VUdNxG6mAAAgiHyBnzMNlslGyy3lWi0Sb/11upS+ytg0+xYXkHhVswS25sXctRUnpDRqHreGqNx0RuphEtbG/AVqyyVzysDbfuskXgAA0AH5Aj9n4g3p41V6buX+RrXwGbe4gMRrxbBV6eOVjltQH69etp1kW/Xxpgtub5djG+jjBQAAUckX+Fn7P6182nbcprDFfNpT+OxbDE28Mw1DbZN4FzGON58Uj5tUn7a7YIzgcCZe7zhe7SQ2Hsq8U5nECwAAuiJf4Gfs4y1vwdDuzgnlC+MnSsp36dX9Z8XCZ9+iHDurOjQnXscdEjxl2kfSOAL2jQ7KdRu6ds2aSMfNKqrxjOhR1nGvBmMHnfdqKJdU5wsLVzXP7hhB4gUAAF0JzgLeHzp1UninW8SCGIG352I3UwAAECQ4C5B4Yco6bwd1jmI3UwAAECR2lAB6IHYzBQAAQWJHCaAHYjdTAAAQJHaUAHogdjMFAABBYkcJoAdiN1MAABBkwclgwXeXqu+8pT3xbJ6tFEXpd/Ba8t0E2m2ydcWkB2MspuQ5CeWXh72jn7Et6yTGbqYAACDIgpNBRwnEKHaOrfifDbEksRNv15Z/kEm8AACgBec1vn4OQf1ggvppX8oj0ZRljKcMiA9ZyJ42UD1B4bIy7SEl3m3h+QeuZyIoT2247H+sg/Q04brKjdvyzqz7l4XD6yjB95SH9IyUR6HFQdAfaSHvlFW+dsabTp+ZP42HZUiPwCieJVI+B8T/2VC6/MsHlEh7YC7mP+CtxG6mAAAgiOMKr4WdKnxVj4fNJqRlpKfQGk/GFZ5O1thTJyRe4RG34uNzzRK8T+B1fS3fclv+mcrjkaVDJ+2s/0m+aXnW9lofBO8zgssN6Ge86fR5+3gdjznWnvrm/WwoFfVsUVzMf8BbiN1MAQBAEMcV3vHohyLp1s8XNpcR80mdN9o8z1fiGdXQsEVrFSEstVuxeRXXTO05wmXide+vlNPEVYy3rZJbHIR9fwQ0znjT6fMlXmlfzAdPt/9sXG73VGLx1MwjdjMFAABBnNf4+qthI4dUHX/SMlrCUbWLTL7KtEm89hatVeTE22LF5lWkmXrN9a5GaXNyDY3DVZVWz1ES7ywHwT62ZlXUMx6QeMV9mT3xKrvnS7zmYvveA95C7GYKAACCNF/s9W+Jt7e3hcQgfJUu/qyq68Tr7u5rSLwtVmxepXGmlM/sXZ+nj1ftPZ7lIDgqpa6hnPG4fbxpjDWHJsijGrwjGObq7o3dTAEAQBD5Am98N6516lojWffFxCuOQe008XpHvbYbx+vNn82rNM/Mw5jr8M60R2q2m/sg2MfWoJ7xoMTrGsfbOvGadW7eYr2Y/4C3ELuZAgCAIK5LvPC9cJEhtO/orWXUHx0ZP9WfMdW4Ysy+J7DZW7RWkbsHW6zYahVxZvmFunKvBsfh9RxD+bv78l4NjXVwHAT72Jpz1DMelHiFfZlxVIMyMEG7q7JxcKTF/Ae8WexmCgAAgsx24dcCL0aAM56J3UwBAECQ9hf9d5U7WmEMOOOV2M0UAAAEiR0lgB6I3UwBAECQ2FEC6IHYzRQAAASJHSWAHojdTAEAQJDYUQLogdjNFAAABIkdJYAeiN1MAQBAkGVHB//zDpoW9T5RzLH2DFvsUvODHhZdyZAyhaNX3OZWucft3EX1T+xmCgAAgiw7Oow28fqtbOINL60Xx79J7GYKAACCuC/y5hOyrGfDpvHz5fJxYtIzv5RHa2U9gwrPA8XKmVJnovKUsbqIYhn1OV1qyVl1t4Ut+R5npjy4q3pb3N9ZDkKVwB95+WXtbXVh7e20xMvKtO8Ie8pUdspcTCzQPHqX1ee4XfY+eM48bnZR7XdhhcRupgAAIIjrEm/l2/0yXVYZMwst+ULppBmM9SKUXOqM0NbqVvJJ5xnrXN6ultcelqD18VpVcmzd2nv1bXF/ZzoI7voYgwfUcQT1tPu4NZSpHhPfoXDU1vV0ZrtO0nGTOttdHxK7bisidjMFAABBHFd4NXNo3ahKd56S8OoOVnXcQVmIGr20AGlvQl29YVRDOV0kXSPwyqMaGrbuOhR1uJX2d8aDINZHi5FVxdTpqsJSzRvKtI6JeSha1NabYH3HTVi+/YdkVcRupgAAIIjjCl996Wx/Z21nsOJFmlG0rFIGNmfQsjahRx07iaqxVklUyUwz8LZIvNIOyofADslK3p71ICwg8XqP26yJt2VtxQmpJ9Y8bg1R2f8hWRWxmykAAAjiuMLL3Z7FMFrrq+l5+3jtTbTv49UyYlIrM3w1J15//6Q9DMO1vzMehAUkXqvmq9LHKx03+ngBAEBsrku8PNIyndC+0LfDoG9QqD4tLNlmHK81hlTveS41JF556+a6WuHi/s5+EEITb+sj3DbxLmIcbz4pHjepPu0/JCsidjMFAABB3Bd542f4dl5J/6e8BUO72xSUL6x7Aqir5ws03qvBWMUOSOWGnFFK3LpRCbUa4v7OfhDk+lSHpTnxCjVvKFPdK/+hsE5TQ9euWRPpuEknwv8hIfECAICFCkgBK/OLejHwLp64vytzENCl2M0UAAAECUgBKxH2sg7E5VSDxDtesZspAAAIEjtKAD0Qu5kCAIAgsaME0AOxmykAAAgSO0oAPRC7mQIAgCCxowTQA7GbKQAACNJZRvDeYWr1bj8FeMRupgAAIEhnGYHEi+GI3UwBAEAQxxU+e/bBy9v10wUub+vPPNiXHlugzKweQND8ODCxHGCFxG6mAAAgiOMKn93m1n5y1xzPCG5KvOJjZoGVEruZAgCAII4rfOOzbtPn/SqdtPbMMsA2JF7j4blEXqyi2M0UAAAEcVzhmxKv1iFbLqD30hb5tTnxqnh+GVZR7GYKAACCOK7wy+zjpV8Xqy52MwUAAEEcV/jGxNt6HK8yrx4c3DQeGFgpsZspAAAI4rjCNydexz0W8t+5KfdqqGd9Mbv7g+deDWXJ/IYNKyZ2MwUAAEFiRwmgB2I3UwAAECR2lAB6IHYzBQAAQWJHCaAHYjdTAAAQJHaUAHogdjMFAABBYkcJoAdiN1MAABAkdpQAeiB2MwUAAEFiRwmgB2I3UwAAECR2lAB6IHYzBQAAQWJHCaAHYjdTAAAQJHaUAHogdjMFAABBYkcJoAdiN1MAABAkdpQAeiB2MwUAAEFiRwmgB2I3UwAAECR2lAB6IHYzBQAAQWJHCaAHYjdTAAAQJHaUAHogdjMFAABBYkcJoAdiN1MAABAkdpQAeiB2MwUAAEFcl/htBFhmGMMSxG6mAAAgiOsSn8S2n2AuJN7hid1MAQBAENclnsQ7NxLv8MRupgAAIIjrEk/inRuJd3hiN1MAABDEdYkn8c6NxDs8sZspAAAI4rrEk3jnRuIdntjNFAAABHFd4km8cyPxDk/sZgoAAIK4LvFLT7xbR4/87olXV7O02ZB443nm7iO337/bZuZsYjdTAAAQxHWJb5F4k1RZO7oVmBMHn3jV3JVMe0JYYEJLC6/c/Uzjwv5tLSAudiXd0XT/yv/db0q88+9L7GYKAACCuC7x7RJvmSpfPfG7RwIj5ogSb8chUil+9/7bfdG6+7osG4kXAAAIXJf42RJv/qro6FXnV9PZxFYajJXF1A7ibIETxby6XLUjuVrMLLx1acpiZae0a8n5+RNvGkK1jte6S7acrSe0+4v3laxmryIGvGrZfCm77zcLxFpJnsoYm7C7kY1O7HJaXTZfVN2s3u9t1E0qrjqA7jqYRyxf297ZGcRupgAAIIjrEj9z4q0jryvxqoEy6xQuQuerJ44m87MF6iycTaVLKUU5E2+70tTi0kkleNfvB4/O8CfeZ+6/XcuPSq6ro7CaeNWUWE9Zq1gb2lVfWgsJ22qsjIO8ZDlt5NZ0QXVWtYqwaWXn0sVuv7tex7s7ani3jyd9vAAAjJHrEt9B4lUW1qKsXVo5rSbZhsVallYVVr1wdRrPz514zb5aPbJWL8SEpmZIexVjQ67Eq/aLWptoqIxjd8SitNraXdrVDO9OqYfh7md2779b2kqLOpB4AQAYPdclvtvEW/e7iqUp08ZoBXGxlqVpv7TzFhjGO6pB/82a9s189XW7N/HKq9gbUl9Wxdqdq47hB0JljE14i3IUq+XY5p0qenOr/ykGhdSjoVvWgcQLAMDYuS7xnYzj1fp42yVe9f10lcbOW3dpQjBusd3ZNfxyzUhqvmEJrsTrH4bqGMcrdq6a0bRxjIS9ZFPiNdYS13XsVJZ1q1EMxSsl8LasA4kXAICxc13iA+7VUAdQZbYRJsWRt0JG1Ub+pi/EwtuVpo9+yJfzDAxWRvzakwGJV8u82jhX64t7Mb+Jq8gb0u7VYIyfVYYKl8HRXxmFXJQ+1LiMsvXKRfesskV9XXun0jVuv10dk5G8LF45d8efeLWdbf8LttjNFAAABHFd4oPux7tV3frghNzHa6zu/EmauglznINSeMvS9MWKeRESb/EtvpJ/C+bdy1y9pvYqxobkMQ/13QruvvtuNQjXC3oqoxGLUoYq36/9+M6oazVPXVfcKSOW6l3BUh38iVfdWRIvAAAj4rrE85ThufHMtdbmH2awZLGbKQAACOK6xJN450bi9ctvUpZP9STwkngBAOg31yWexDs3Eq+fcfOGXojdTAEAQBDXJZ7EOzcS7/DEbqYAACCI6xJP4p0biXd4YjdTAAAQxHWJ30aAZYYxLEHsZgoAAILEjhJAD8RupgAAIEjsKAH0QOxmCgAAgsSOEkAPxG6mAAAgSOwoAfRA7GYKAACCxI4SQA/EbqYAACBI7CgB9EDsZgoAAILEjhJAD8RupgAAIEjsKAH0QOxmCgAAgsSOEkAPxG6mAAAgSOwoAfRA7GYKAACCiNf37wGjROIFAGCQXIn3fwMjQ+IFAGCoSLxAjsQLAMBQkXiBHIkXAIChIvECORIvAABDReIFciReAACGisQL5Ei8AAAMFYkXyJF4AQAYqlkT76SdZQYVYCFIvAAADNUcibexTBIv+ojECwDAUJF4gRyJFwCAoSLxAjkSLwAAQ7XkxPva5m1HSnc+1k1w0TaWbaSaWGCZS9tim8rUmysO8G133jlbBbo6Vss614tA4gUAYKiWmXjTBHTb5mvFq8fuPKK86tRy8ucyN+Ta3NwVWHzN0/NblKif+JVF4gUAYKiWmHiTCCTFs+T/12moepHmJa13MH0n7bhMYvJtt0lRKlkjmawXy0pOFzSKsko2K6m9m5daVVZLhtWydslql+ltm5vCJsuF09rqabBxFefmqjm3bT6mJlhl/mvVcVPLkmouHitX3cxDoRw4+dyvIhIvAABDtbzEq0egjBV5y0kzZxZT9WT9rjFTWUz8pl4oWaqjvkYeJo2i6hCnV1JfLKtPsXvKEagn7a7uNqsYtfRMCDuvFOpb0bVFu27SoTBPNH28AAAgmqUmXilh5v2mVZ7SA6+ympql6uWyDsd0djnLWEyIqVbJWnWEd/NcXbwhF1XyBkgxLQtpsHmVctNtEm/DcAXr8LbcYuOh0DbRhzENJF4AAIYrauItM1PdP2sMaVC+ize/bS/7Xesv9N0JU8tmVslaFaV31bETZvn2ki0SrzyQwzwqjl1QVmmZeKW4qexqm6js/QeFeCiEnVl1JF4AAIZqeYnXNY63mMqGnlrfkksLl0tsbt5WxeXNO+uSGhJviw5Pe+6dUvnqEo3DDJzVWH4fr/GbsvA+XulQeJZZVSReAACGaomJVxtja3zZrY0c8I9ZrddWx5ZKA0lbjk1VyNtV+5+roowRELMl3sZxvE2rzDeO97Vy3LRWviM8N54F/6HoIRIvAABDNUfibcOZKsxv00vqyAFtOWk4gbG80mfpiItqKLZKlusn/YItvxeEMsPalXJDTYm3Xjvtqm6VeKW7TLg3J6+oDEYuZlT37bWKErfoTuPiWXWNqVhNJF4AAIZq1sSLBevV9/7DRuIFAGCoSLwx1J2sPbmNwSiQeAEAGCoSL5Aj8QIAMFQkXiBH4gUAYKhIvECOxAsAwFCReIEciRcAgKEi8QI5Ei8AAEPlSrzACJF4AQAYJNclHkAldjMFAABBYkcJoAdiN1MAABAkdpQAeiB2MwUAAEFiRwmgB2I3UwAAECR2lAB6IHYzBQAAQWJHCaAHYjdTAAAQJHaUAHogdjMFAABBYkcJoAdiN1MAABAkdpQAeiB2MwUAAEHE63vsJ18By0DiBQBgJFyJN3a9gG6ReAEAGA9P4r0BDNSUxAsAwJiQeDFCUxIvAABjQuLFCE1JvAAAjAmJFyM0JfECADAmJF6M0JTECwDAmMyfeN+7/PDZixd+tJSAAizUlMQLAMCYzJl437v8wOa5D3zuK5PNC4Te1IWNSWbjQuyaePSikksxJfECADAm8yTeMu7m/3UbenfPHJ10ENOSYo+e2bU2VM+zF7DXrZdJouTa1vXp9PrW2h2OtZoL6drslWwUYS8WY0riBQBgTGZOvHrcLUPv899+p5tosnfz8PrW+nqS1A72F1jsG2fX18++Yc45dbLKgvYC9rpJ3Q5v7iUTuw+vTU5e2lPmtK9A+1UCzVHJRsvfiwWZkngBABiTmRPvO1e+9tXnvnDm2U99IY+7j/3rM8994ezLL17tLJ1UsSrtSNzYOJp3+Badv2nPrzK/7gs2OoezTsgzG/nL3TN3FO/VHZPpVh59+5WTk2MXzI1qBSvrJttM1y/HCmgl1jOz7R3V37YL8VRY7ODWym+xrlRJpVrpHLWfNp/WDloXexHNlMQLAMCYzJx4f/mrXx+8//77V7/8F3ni/eb55NX7v9nvroOvCp/JxGTt0WvT6c6pyeSOs/nEHWd2q/nT/K0kWKUB7+ROOuP61lo6I11mcvylZMbB/o29m9fyfuNp3TGZb2X/YOdEFsyKjVrlqOu+/Wi2zP5B0QudLpTNSWPfiZ3iCGfbOyxe7OSJ2i7EU+FyN+sjYpTfZl27kvVaxRy1Wzuf1g7awvcipimJFwCAMZk58Rau/PVmkXif6jqdqIl3/dxbSUR981FlIo9q2cvE/kunJmsPX3h4bX3r7WwYxN5b59Ynxy+kyxRztDKtrey/nQ1zzV/uWuWY9ZEmdh9cU7d1Q+9NXXt4V1jFW+F8N+vS9PJbruveYp1v7cSrbWihexHVlMQLAMCYhCbez3/rfNfppDFhavH14onJ+tmLenibnLhoRFx34k17Ls+tHXtQCoFJOTPXJw+Ka+euZ4e76F/1rmJX2F/5lusaEy8cnwj51j1n4XsR1ZTECwDAmLRPvNee++af3Pf1j2T/rX/tjfd+/rN3rv/snZ/+nx8+df4jxfzHPnu+g7s2zJQwLyRB7txb+5dOTooBubsPrk1OvbRvp8TJ8RfEraSZ95UTk0kaCPesctR1XfXJ+jePXVBLLrqg00LqERpKIfaGPFnRKL/lusZE1hn+oPozPeWYFPU0y1noXkQ1JfECADAm7RPvd77xuHp/hg//+2989L5vfPTYV29XZn7yG4tONOovoTyJt/5R1omddGxuOmx1rZhzcudg3wqNN185pfzO7IaRx/YPdk5NyjG6WjnquseOO6J4OsC1XGuy8cLNV04W03ccP1n1JOuFeCtsZkW9/Avt1jUnkn0sq1XE+7rUop5qOXsL34uYpiReAADGpH3ife2xx42bkhX/bbxwceeFP3jg7757/ulPPnZlwdGk/rnUwX51CyxjIhsser1azF7xhnD7rP2D9L16nrFA8na1CaPkat2DA7k+2lrpavny2ipiIa4K2/f+0stvta49UVUrifflfcu0eurbXfxexDMl8QIAMCbtE+8Pzz/zYTHx1v999c/OX4sQX1ap87BHlBuWndhZ6N2OV9+UxAsAwJi0T7x7v/5tY2m//XWMPrxV6jzskarPdrrYp3v0wZTECwDAmLRPvMBgTEm8AACMCYkXIzQl8QIAMCYkXozQlMQLAMCYkHgxQlMSLwAAYyJe3y8BQ0fiBQBgPNpf9IHRit1MAQBAkNhRAuiB2M0UAAAEiR0lgB6I3UwBAECQ2FEC6IHYzRQAAASJHSWAHojdTAEAQJDYUQLogdjNFAAABIkdJYAeiN1MAQBAkNhRAuiB2M0UAAAEiR0lgB6I3UwBAECQ2FEC6IHYzRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAKNwAAAAABi124gYAAAC69f8B6Ef83QplbmRzdHJlYW0KZW5kb2JqCjM0MSAwIG9iagoxNDM1NgplbmRvYmoKMzQyIDAgb2JqCjw8CiAgL05hbWUgL0ltNTAKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzQzIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDI3OQogIC9IZWlnaHQgMzg0CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BMQEAAADCoP6pZwhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA1wA82fXhCmVuZHN0cmVhbQplbmRvYmoKMzQzIDAgb2JqCjEyNwplbmRvYmoKMzQ0IDAgb2JqCjw8CiAgL05hbWUgL0ltNTEKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzQ1IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDI3OQogIC9IZWlnaHQgMzg0CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIFsvSUNDQmFzZWQgMiAwIFJdCiAgL1NNYXNrIDM0MiAwIFIKPj4Kc3RyZWFtCnic7Z39j13Fecf5h4gsX/FDoyYR/BCU/IKEUq3vWqorRValKgiJqnSNd91uUvGSVoqoUhn5hV1erNrY60XA2mDXL5tQWWqB7vLSAO7isCjg9oct23BjWLNsz5zXZ2aemTPnzHm7934/suDcuTPPPPPyPfNy5+zZ2QEAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGTcBAHlARAB4AhEB4AlEBIAnEBEAnkBEAHgCEQHgiZeIzs3ee+/+o28Vye+to/vvnT3n4TAAXcNDRKEeZmfzNQHhgJGmvIgiabgIBCICI01pEaXKCOZ00pROfBGTfB8RxqKCymImBsJvjybBmdnURtHZIwD1U1ZERDqSikR3j0WS6kUVTnRNYqaXoaxiY9n3prwA6AQlRWQSDtvJWRFJc7wkmQiURiVVbgB0j1IiIjO2lFQZjiKS5JaE8mPWTTqfg5pA1ygjIn2jIBVPBSMRK6KbWUTICHSMEiJiO3IiA2VN5DZJk9ZErNzImggiAh2juIgMa3t5c0CeesVB3ISN2Z1jRiLszoEOU2pNBADIgIgA8AQiAsATiAgATyAiADyBiADwBCICwBOICABP7CIaAADygIgA8AQiAsATiAgATyAiADyBiADwBCICwBOICABPSojoDQDGhvpEZE8FwGhQt4g2ABhpICIAPIGIAPAEIgLAE4gIAE/aEtEnv11Zuc79W1v7rOEqAMCPNkT02dUr/T8+eddd/L8/+v6rL6y1UBNNsDTVmzi8yn2zeniiN7VkD3HLIcogSB3nJOwETB1OQ0oYATbaENELf3WKqObM3ocuPvLni98mOvqzw9dbqIraWT28Z3p+rn+AU8Y7xyZ70xfsIS5ZHOlPHnsnuNi8tb19a1OEPNWfnL+xs7N1KwkpYQRYaUNEZ/6SDj2vLX59+/Z//PpPiIh+9OR/tlAVdbN0oDdz6db7c/2DREXxODFx4GAiGT0kizo1NdULSYaoOHIvGuAClSYf4kFkKY4fJEiHlTRNYkUO0I0oufCejDMdENGZIOja8o8kEf2m+Zqom6WDvUOXBhubgYr2JHMk0WFnloM6Wjve74WS0UNSwqHpkqjs5UO9UIhp5J3lmV5gdPPW2vxkMO4Ew0cQWYwmg60bYcjO1iAOCWTVn7sh0tyY7wsJBEbigMisZkTNhfNkvGlNRKf/4sk3FxaCf++9GwR9/OE5cf3mLx84M5oiEl11/vpgQ8yRrsz0oildONVKAg8JyeghGaJLHw8r5jfHJ/tHgs58PtJlwOBS0JvPR3HCmZjpQkzV5t4Pp2jBZC3Qlvjf2rE98VAUmlWS8LnInow3rYnoxX9848uQwf8FQZ9/8Yfww9biayMpomAqJ5Pc0aPeGnBhWkhGD8nIvkuuSIz4MldENIPYtWBedvBKPKyE3ylJLLls6ObGkfamc9+558wPfhD8e20hCLp29cfi+sz3v3dqFEUkpnLLpLaCOVb/qVUxtZuMB6UghuifekiG3nWDcSCeTQWRw7EhV0SbF2d6IuswUbhXGAgjGmhEhpyILLlARCHtiShdE53eGPE1kdiVW94akJBkSifWH/1oZOpH2wh6SIredbPIvenlcB9NaCRc/xvVFKyS5uI0USIxRws5OB1ciNmaYkTPBSKS6YCIxMbC61fvH10RBasOSUKCwdbOVrT02Q7rb3t7OwpgQjIz8YazdBXVfxIzsBskvbWZRmEvdmiiMIn4tLUVB6lG1Fw4T8aZNkT0q78/a/qlNfx36if/jFMLYHhoQ0Rf/P6/nv7J4ve+zSnoO2f2/uztT778vIWqAKAcbYho43+/+Orrb77hDX2zffsPYz8/AENFKyICYJSAiADwBCICwBOICABPahXRRQDGg/pEBACgQEQAeAIRAeAJRASAJxARAJ5ARAB4AhEB4EkJEdXwEhgAOkp9IrKnAmA0qFtEbR/KAKBeICIAPIGIAPAEIgLAk9ZF9MmHH6y8/cHKh582U14AKqdtEa3+/G+fvvPBp+986MVTDZUYgIppW0Tv/mI2FNGDL51uqMS1kb6Bgbw/oQKjiiXxhoaJ7A/iG18ghBcVNQdEVBni7/Gmfyu4oj9pmL4qKEW8kaEX/6Vhyx8gxYuKGqQ1Ed187+XF5WcX/+WBRyIRvfA34uO/Ln/UbPkrRP0D9OHQREYBcSlu6VNTE5Z3DG2QOBMTe7RhTehmfn46ejtLJqLOvKgoszE+Y1drIvrozUd/OhfKJ/vXO/DSqQ+bLX+FBCKSZ3ODrfiNPqIHz4R/xlqMI/3jazvp24G0dwxtkDjb2+mrgtJcQt28fz164V4iou68qEi8ySwajpeTF8iMPq2J6PPB1u/efvRn85mCHnnlxU+/HuJJA53OJd0+/vPx/fkb0Z+xFr0xej2QeP+DeLUP//af+BVCzHwt+SPzV8RglHzdnRcViVdIRAPTha0d7S+QjyitiShgc3A70dHQK2iDmc4JgpVI2Cfjt5kQUcSXtrf/mEUU9GMxGD3VuRcVRX/7Phj1xuldlM2LaO21V+5/5Lm7w38//IfL//7bt3/+y/Ovfvy7k/904u44/OTMa+ut1IYXjIiSCVAy/YmmaqGghLpmLm7a3jG0YROReD2LmD9260VF8SvPQykFUhyTt+g1L6LXnztJ10F3/d3S3LlfPfr4szTwvufebqU2vKBrongBL5ZCYk4z2ApkJHqX6GszB6M5U/SV7e0/5FVBaS7k28H14IbfrRcVBepZTquhP7823HMLV5oX0bUTJ5X9hPjf1LmXL5377hNXXz995r4T77ZSG14k7/mJ2BqEt2P63qDgOlxEXN+OY0Rfmd/+s5G9KijNhX4rUnbuRUVZNYzNrnjzInrv7EKPFVH2b27i1Ei95SsDb5YbRZoX0eZX23ZT4h721e9bqY3awa+Wo0jzIgJgxICIAPAEIgLAE4gIAE8gIgA8qVVEbb80BoCGqE9EAAAKRASAJxARAJ5ARAB4AhEB4AlEBIAnEBEAnkBEAHgCEQHgCUQEgCd2EQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwRNwEAeUBEAHgCEQHgCUQEgCcQEQCeQEQAeAIRAeBJeRG9dXT/vQmz50pkfW7WL70jwk8P+57JwRhQUkRCAGnXCuVUuKMFJvYffau041Yq7Pl1iwgiHX5KiUiSkED0hIKKqLXzQESgQcqISNOQRDbNS2QV9pOjSbAIJVPB8IvEWhqehr6lfBteBxf7Z2f3J/NAMi8MA9LPoQOqhTzfmOJEyeWoQdhb5DqOsP/o0dl7pUBDprH/KbUNyqB+SorI2OZEYOll2IviFFKgfEHSRv3OJqKskyo5ssJR7ef4RpFFRKPG19konHlNXDFmmikPI9GQU7GIpC6RxKOTPV076YVkNulwRhGxHtAc2VRuvvEl4pVpyiD+UC5TMFRUPJ2ThJD0D3uPo7GKps3C5XkRm8rdN0pZEcXZlcsUDBVlRMSoiBs4HMeFkiMRDUyTlRuJahFR3kgEEY0OpUQkLQ+M6wp9+XPTKiJ2TaQGagaVDG3zJWff1KIWEJFWDy6ZYldhuCknIoG6J5Zg2AFzEBHdnZtNh6U0LNz54m/5SYRzUn/mxzIH3yhFR6LZWXW7zZ4pdRUMJ+VFVC91/hRbF5iZjSkdEhGd2Nh/iuooENGY0iERSdtsQzcM3YSIxpZOiQiAYQQiAsATiAgATyAiADyBiADwxC6iAQAgD4gIAE8gIgA8gYgA8AQiAsATiAgATyAiADyBiADwBCICwBOICABPICIAPIGIAPAEIgLAE4gIAE8gIgA8gYgA8KSMiNYvH318YcUeMib4FrzJihN5BRxdWKg+z7QcXgXSPHS01nb3g4i8GCIR1ZpVJcZL96u2u18NIlpZeDwiCQm+DW8uSYgWYZCljINEksvrJmvstWQmIjaR3OGIldD+ZZMffBbCu8uxJWrZXHA2axqTHRX4JObS8RWulI6kWuF8Fp6EBtmyKy2oekgcyO8JpmrnPMytXibc2Lvqo3IRBWWIWjcLC+uc1oUaIWVlIZVOdJFG5pMxJnRXMhvyrEOzzBZQElGSRlyqrcy4ymatfM/0JVahxoo2VJG53oyeWEWU+WmqT4cKcax2qzW3WuHs10ZZEemkPY3eIdn7iRYhIxYP0ZCW0C6inJGdc8luRBaRdEtdV75ly6hlLcW0u6vVD3vfcawipmcqnjikNXmYY7xg2/HWzN2mQCvUQtUjUTqYkikHPygrc5LUUBCSaEhKaG1lxYDmMsnVR0SZ6bi1+G4mOWHLmruPMEkspXOvIvYis1ZMRMZC2SvES0TmbuPQCrVSg4i0TqGKyDZZDeIuLCSTumpGIjKCsLVdRkSOIxGXdc5IxCaxl67hkchanzWOROZuM2ojUd4qJnfWKiJLt3HLQkOaquuuRJdqwzm0Jp8FWcBwRXNYvnFFUQpgSGIsnfuykVMEsyZiy26qLr0+i1WIu4is3cYxWm1ULiLD5hiNr+8vKbbYyFngerImC3d6LLMh2hmigGQ3LEdEbBaiVaItKvfdOSZrGsztzhmSWGrPbQPTPKyESS+nkx+m7HIVcR5GYQ67c2VFZO02Se6GVqibMiKqFUVDHaLBW1vzcHcS4EinRBTeUDrbUUdPRNmQ0uFqHwI6JSIAhhGICABPICIAPIGIAPAEIgLAkzIiqns7tJntVnsudfjgY5P56STeWyv8fJD5MI8v47pP3sWRqAtt0VkR+Vurr3q70HBt4DcSrdPnQ+LHDqRfHVaYZ3DicO237PQ4APuLM/lNI/mCNV4kx/SGbHz6JviUW0ZTcSw2SaH452uUyORj7Db5+Z59Psj4LJVuyr0IckTmrJTB54EaLzu5VOipsXXlwbSu4C2ix+kluSY1qR3GND1poh5rzOCeYeGNF8oxO7FiPuWVW0ZjIvsZQmO0fG9NZ2N0n7h6K3DOjT3tZ24lxzNspZ8a485KdoEKRiLlYLOAO8acRSh+vldihRxmY40XzNF+0sypjNZHqCxrEL7Ubt7mnDQz1xsT371FrMc27AapJ+WeGuvqdLF+EZmfwaGpHESUzSO4Bk1aoniOFYiIUqQP5Ecze8teFHqWyjFHxk9tPutSBCne0TJPjUFEXiMRGV/4uyI1XjDHCkSktWxXRiKu3rxGItm28ZEE+0gkIpZ5amx8RcSMG+WfNImvLcaL5+grokJTehcRVbEmii7ZeuP8cS2CMnU1isi6JpIaMbcqo6FvzEWkPYMTRzDvxsQzBqm6yCQi/V2ENV48R74npz7ki8iwJ2axqdekUgP61laSNmcAUj3h6k0zldsisjoMu3NKAY27c0lMGs5ETj03PdbUHcqIqADWdWgtxmvNEVTEemefGisDRAQaJhxiRqqNahYRAKMPRASAJxARAJ5ARAB40qiIKt6izLZvpfMCZXKJTRV+qUeVuGXp7Bj3G3A1lkvC2E+qvaZdhqYacZhFZDBbIhf7z6AN0baI6qb5Su64iFbU8/Ar+vl2Nc5K3lH5dYeHDjg4ES3kP1+ghxd9qYficm5e1kD6cJ1WvQYLth80RYskteBQCfKvt5b3zlD7UovnNZ/apZXfhblfe7MHHxz6BpmYJL/FcyVQo9kr3IlSIlphzsOr59u5ONyxEOWoCvPbfu79hBGR7fkCw7TCeAwgL6FrXvZAcl6JqzqusPajNSvpHwYuUJbsRIPt0E6Sgdziec1nHYkM546kMxPWvkEcteTIRrNXuANlRcT9yqmebzef8lXPzDgeIjJgmc7l5KglYerfLWF+ElOgdLAnEZG5vFzTs0mUrzXLDpUwsPcqpcXzms8morwzqMX6xorbMSG2acpQcjpHjmTJRUtvT1wcqdIobq1gc8ZFRHqOWhJeRA4J85NwgbLn8g2Ry473UKmu1Jp0wlOe4bhVgl63qiu0xT1ExJaluIjUc30G55njf5YKd6CkiKhDRCLkfDsXh7/zpNQtIvNNKUdEDgnzk+QGck1uOyntPhLRMa5IJRicoilIi7c7Eq3kvEAnM26dupUalMqISJkUSEOPtioYsCJi5/O1isi6gnBbE1m7dH6S/MCofU3VW6hEtLuUrgS9bhVoi3uJyLQmchaR6nN+jlk0e4U7UG4kYgbE2C1pcqLFoWtCZXOmYEWZamZg6QN6jloS/ibmkNApCRuYzCTI7pyhei11yE9akt25XB8MlaDXrRpCW9xLRExZCk7nyIxMe+hDq74iFZ6P73ROqZMyLoChBS0eUpWI1i+P2vl2YActnlLlSATAWAIRAeAJRASAJxARAJ5ARAB40i0R5Rx2yolq/T3ekLpAjnWS/5tm1U762GRqL/75pUPveWkQiGgI2q6zIvK3NhT1n0dZEam/L2uHNVa8X6rC/hyfBHK3PPIbvXYki/7KTS2H7hZ5+Cixpv7CzZa3SCWkosZ7XpyK0CHKichwGi6qT1LV2tlAwxEp5kwge4SKOWkme6Wm0d7iESONRAUfPlIO3drKW6gSzP4osyY6gTKfjlMSWU+mDYzR8r01HZfSfeLqzfGwosG3jlBKRMqJPaIA6fVe8n1kXYpsPjqYdj89i5wzzyvsEzTxGUO53nPOifEFNFRFpheuvAUrgfVH6pm5h5k1z3NsanWiVoWDtzmHD831xsR37yRdoayIKPT2wh+HXSn8UhUuC7n29M7NPUGzrj7lpGTknruxCnTdEQkXrYQKRGStt6IicvSWveDGC7XectRn7yRdoayImFLESxJtTC47EulZuI9EUrdjnnLKF5H9LqrPP03lLVgJFYhI87wrIxFXb+M7EhlmreJCmsno/cs2wZavmZguayJtPi6Pjwk5IuJzV9NKxtnyFq8EXxE517CriKpYE0WXbL1x/rh3ko5QTkTaxoteBeJ/fi9V0fZ2sgi5u3NKEr3Ok4yMrcPmrjiB97zYByDVE67euIawd5LREVEundlDYTVUPWx5O1MJoE5GW0Thba4ZNyCi8aU2EQEwLkBEAHgCEQHgCUQEgCctici6Tdm9PUwALEBEAHhSSkTrZQ7k08D0t7b8H9NZOwB0iLIicj2Qn3NoJ09ElpP7AHSE8iOR6zFINjDRRI6I3B9JAKA1ahFR7ml29rkAXkTawX4AOkbnRyKMPqDr1CMi9wcZsrBsoeX4SAIA3aAmERl21ZgHGdLj8eF+X/5xemwxgK5RSkQAgAyICABPICIAPIGIAPAEIgLAE4gIAE8gIgA8gYgA8AQiAsATiAgATyAiADyBiADwBCICwBOICABPICIAPIGIAPAEIgLAE4gIAE/KiWgBeNBk+4IGKC2ij0EpIKLRAyJqGIho9ICIGgYiGj0gooaBiEYPiKhhIKLRAyJqGIho9BgSEc1P3PGt6avdtFYMiKg9zu67Y/djqy6BxahNREFHzZiY9+x6Iy8i2pTBtaVdPRtdGE/ZdzY3sj2vCnpgXYiCivIl/x/kiah8WeoUUdJRr05/6w7PXjtGIqq5XxLzq4/ttqm1fl+aZphFFH2KhyManl6HF/NCayQaHcbCCNNxWGaXDndpNNW4szUSLRk6TTHLYxeR6NfS8JANHEmw3OiPxd+T5teTsH0mjRvF0keoUGOSJYszShb6YKcMtck1jRtFpdnKo7PiG2curUCzD2qNRan1whagIRFlKjKJiPbRcOiK+/HV6YkgPIyQySu8ErGIKaOI3KxRc+KSaDn73ntaahfR2cd2S12SdJVMXVREtONlV1oSLaNV+lGLxOSV64wBPmZyrUhBRKRBaRIma1I4EW33viyNtTj0fqDXZ7dHonwRkciSOnRryTUVR040R2upsfSDaWgrj1lE6ogiqyD9wDY67ZZ6EiUjk4jo3VvLIscZQ3FYU5K3+sCbBlgLRath39nVx/ZxuTj4MKoiykYH1hq5VqZpbDRHa9JGiNWgH9bpnLylIE1J0nmGVUR8Ej0j+jE1qw8BhnkX44yShdWUwawkjfxCxWNO+r94NpytLB19GB4RuayJpJHITUT0e5Ekd4gxW2O05pBvcXI2FpTGt83HTCKyT+kNayJ2CFB7e+7kUI+ZJyIlFZvWUKhQPun0Lf5ENOTow5CISNqdy/o0CVb6J7uKYbq9tIoSH1jjbtbkaV8Uz7LIIqsn/dJDRJKMpDWDNmNhuwSbhM9I2p1T1iJk2ZX0RbszBN6UvGxL1JEljgcRkqOcVi+USLF7N52MBh/jT8bi2EUkFdZ9g6FOESlTI/WbcNuLFZGc3LhjQLNQJ3jEuKM1OVoc1oKI4ukLkVSMugVuurfrSZSM+Mletj+1b98+qq0sosUZCdYUWfY9Ju2NKL6mYTQtWyilp8sDFueDXUS0sB0REeDBiQVnys+vGgYiahiIyE600x1dDYmGIKKmgYjsKNt1QwFE1DAQ0egBETUMRDR6lBYRKE2T7QsaoJyIAAApEBEAnkBEAHgCEQHgCUQEgCcQEQCeQEQAeAIRAeAJRASAJxARAJ6UENEbAIwl1YrovwEYMyAiADyBiADwBCICwBOICABPICIAPIGIAPCkMRH13Giy7ABUQpMishsMgIjAMAIRAeAJRASAJ8Miomuzu9I/f7n3RD11IWUWZpJeVGizsRxdnMmyiyt41969xRyoq66aausqGAoRiUrdNXst/nRi7x3kU60006WbzMiUXWkHqvdctG9sUW74zjIMIgpqlWvx4L9ZBacfRBNI9zDxjbi9BsrbtYtrnSBFcJlFCy2LiIopzbLqpPRtZDV1VupsaVzdMr2x75qdZbJMIgtv5Q6Wm8SYXRqya/YEFQUJv5bWG7XFec7Wlck3tSpIxfFt30WGQERyrYZoKkou1a4bX2WX2bdKIInGTlEYy5yPcoqofyqmsn4hOylHC/2Ji0dqILvUB2SXJIqXlgum8MSoLaEpR903rirUhsZIlOElIq7TRnf3tIlkDZFktHmyeOFtUQQnQUo0pudrliV3mG8jqcZf8KYSrH2SFSDTwfKTJFm7iChnnqZVr2OOuVUhZTEMk7lhFVHSDNkooszlyCREnWYko0M2kzF3Wqm5NcuSi9y3dNKo2tdjOoiIn8GqtWIoAkniKCKuB5OiuqjPeo9iq4IpTNcZAhGZ1kTxVTiN16YHXOQkxuzsrlSBs3szSzkicrgt66F7Ofs0Ru78yuhG8yORsuT3H4m4qrDE6SrDICJpvaKM8tKUyT7/z1LTeTo3KXec5xP4fOkomZpSpn7FRJS7JspLUm5NdC1Zg0r2DXrMbQV7VQwhQ3N2Tp1GJNApkxSPm0cp8cmd1dADqc40y7x/3AZDtPtHArSiJBnliShLLQZUJxFx+4rm7PiEZGEXB6S/J2mm2BzNAmdb1TSZ7CY4xT2sDNWEZ7SBiIaKbCgYko2rsQAiAsATiAgATyAiADyBiADwBCICwJPKRQTAGFKhiAAAFIgIAE8gIgA8gYgA8AQiAsATiAgATyAiADyBiADwBCICwJMSImr7d2MAmqBuEdlTATDsNCOiDQBGFIgIAE8gIgA8gYgA8AQiAsCTrojo5sqRYxeWPmikzABUSidEdHPlidm5Ox98uje7BB0JlqaiP/06tdS2JxaGwslGaF9EiYKif/XqaPXwRK+Glg/MThxe1TLKwvQIetosTtA7+/M3dnZuzPf3GFLlG6mb4k7m0kIpqqFlEckKSnR07tWP6int5q3tG/OTk0Hjbw0qNPvOscnJY++oIYdm0u6lR9DTBr5t39oMLlaP9HszFzdJiLsD7kk8KeFkLs2XoiJaFtFH7z77zCsPH37x/ocjBZ3408OvPHzs8msf1lbgtKXE7W5qaiIaluIhSoxPJDwbsZQhLLxVHp6KPq4e3hN/l90+RS7Hr1+Z6R1YUjOVDJO0QZ4ifTJJkixmgWF+E/LXuhGLw+wwLNl3SMs5SdwSIXQ0ia6lSqujFK3Rsog+/+LLrdu3b3/45E8jEb20GHy6/dWgvttQ2p+Di17/+NrOzvKhXm/PsegiGDrS8J3oq6CtRJ+ZWRYBweRFBIg4vYOXgoBgRNu8tRaNbjvZ7TPKZbC1PB22dZypZoemvX48jDPYisdKESkMET1pejmu4TC/7fjDciRS3YjF4aSYWY0o9l3S6k5mqeIQOvhG11KlVV6KNmlZRDHv/mI2FtHpugtMRTQ5937Q639znFxErR9+DBhcOtTrH1k60p+cvx7O/zbfn5vsHVwSceIQyaaWy+B6uGSIPq5qdlR/uIvVp/o0rw35nt8/ssoksTocFTOzJtt3TGvOMZOMLiIpo0pL0SrdEtFDLy/WXeDcTisp4sJ0b/LYBbk/9KYvKKoxi0jcX+f6B57i+lVgp7A/Ud/rz90g93x7Et1hu/OOaZWL8wd7jGTMIZWXolXaEtHaKy/98JHn7g7/TT77zs3PPv3oxqcfffI/751evDsOP/HAYg37dIU67VLQN+beH1yc6cWLm+C23Tt0aaB3vN7B82wuQkZXpoObbfBxU7ND05r8Ce/CB5ao5XigFEayqSkxomdk6X6Kfce0ykU4ZD9Fd1FIncR+qnYqLUWrtCWi158/SXfk7vrr5+955Pl7DjyzmwTe93zVlUQXqhYRZWvm6WWxzhFLgH4cMrMczOjVfnjryiGyDbChNHGwNDrUS9Y7kh2a9sBBg7rFYiFJ1Zs6f+vKTHy95+BMOt7JRqwOq91Ptr/klla9CMqYuBXfMTKrsZ/UzmblpWiTtkR07cRJZWc7/jd1/sLy+e8+8et/Wzxz34l3Ky5ttprdGqT7qMpFOPG+kUbTE24we7CDLfFdFqZECL5Os1Asp2m3tnh/pFQiWRRfSsIaMTmsbyDL9p3S6hepW8EdI9n8lvyU862+FO3RlojeWzx7Fyui7N8zP15ca6FGunSLGyLIrvf0cqW/wnWftkS0+eXXdlMBX3/Zxp2mS7e4ISIdWXaq/SF7GGhLRACMDBARAJ5ARAB4AhEB4EkDIroIwKhTt4gAABSICABPICIAPIGIAPAEIgLAE4gIAE8gIgA8gYgA8AQiAsATiAgAT+wiAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA3fw/wr/+LAplbmRzdHJlYW0KZW5kb2JqCjM0NSAwIG9iago4Mjg5CmVuZG9iagozNDYgMCBvYmoKPDwgL0xlbmd0aCAzNDcgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1YyW4cNxC991fwB9Su4t6AMICdURvOLcgAORg+JUh8sBzo5N83t+I+m+CDILSaUyzW+qrI5suCDNzfg3+ZjbO/n5eXRENmOBO6JaHSTMBqlQZANxVXAr0cwb/8/wdYuWLfwop6DPSOJKDBV/bX8n0B9nH5/MVR/3F0xX4sURwt/HP5ozMG3px9tYUC+Ru08GUxMurkesVNbdvGLGfcrDya9O7TM2fH/4MzgZ17LDwzJcEPvqWBlxem8sC9vQ0vi1QQNfiBRaY5CZYkuMGZCdAD9t/y4bS821ExBHb6t8DTMruqTQEAN+z0zD4/Agjufj65Bw9M8tUyR4Pdcbx3b9XRHR9inPcv0Olt3WMKPfB0Mj2NY5Ip4zisdb+5Wyf2TpeThzw+PT3IMUkXTzTi/YU2+zkvD/2ji65MFx0/yezk8IldSPaLVjY/JtleztbJ+XBgDgOPyYOUpTA+l8Fg7eELO/1ew4A7VG/SQVYg4eDW/CjjCuIx+X6MPgdN1dytccv8XdyIXset4ZUUhzBbSzajpUSnmJ3jC9kgizFGoebn3mp1YGgC9/vznI325NdUI0Y89v4F+jHKDbFSk7Um6aMY1fq3mPGnk+8iOnURDnzdPLvwCBBm3YzwXcv1DN9StthTzrYOrmEF4SxTVhNo4LeD7zqPdUq88ZiS9qDkrJ8kcjZdU1BhbxlEykrylROOZIkHqXhFmdNSlUh7iji0KCW2DqTV6roaqX4qlhrGtbCbUJzV3Ao8ih0OdlwDOLWbxO5zHT0a+4fhIxZsyX0u+gqYSXLqfqKabCaqksjEW3t+WXA9pfOOnSf4XOwtSRBTn+TEp0ErbXojNJC2hvvtaZfoKoSDf/dF41jyiGbEiJUjRvZkIl5AI76mmq/kvG6IHLaVG4d1k/qitWtQ7g5wzBm7KmE2LVNfVHilL2qwYTM1UM5U2PY7FTs2pRJKhFXZLyd4VmWXGPhH+eQ0yjS7N1K6XlpmOAWzOm2pvMecPaNcs+bGmi3cQUMCQ47RnuJWJ7esuhMmEQqNBLeBCdUXqVJ16cUTzoBvnQ5RVd5DBMnyas9+EHZ+sC4TTcEP5yXTs3dYz50hM/SVTBNNJdfiZiekYeVUT/bax0mVCKDsmJu993pInhIs1GySNhvvzjExPc0ifnuLzI7u0O7ojbwhFUMERqQIPiClCoX7fjSzSGT6ZRcqTrKBpItuPkeN6qRyn3hm3uf1ZiKvy35jzz1eVrYRzM75NeiQfcSqb5me/+K5ueUVou2K5+yhY0XWf7maO25hoeyl47ealrJHT72NtvEsfZ4qsPTasW20xyJHSncB1FMBS34drlOnzNI6zddwCq/r15ia1jHJ2aHZ9stuej4Ws+8H2R4LuqsU7T6ktdvtm1snYJsrejtQw9XR5M6JuwxL7z6fkaD7ec9FVCemvzGL03dai2qFTfc/oRred1WWl3vrLlxK4YrWuO9Qx43oFrXXU+jLzE7TxCW6o5p+20nxfz8B8GpVXAplbmRzdHJlYW0KZW5kb2JqCjM0NyAwIG9iagoxMTMwCmVuZG9iagozNDggMCBvYmoKPDwKICAvUmVzb3VyY2VzIDE0IDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxNSAwIFIKICAvQ29udGVudHMgMzQ2IDAgUgo+PgplbmRvYmoKMzQ5IDAgb2JqCjw8CiAgL05hbWUgL0ltNTIKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzUwIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDE2MTgKICAvSGVpZ2h0IDk5CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BAQ0AAADCoP6pbw8HFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAswG1UmjMCmVuZHN0cmVhbQplbmRvYmoKMzUwIDAgb2JqCjE3OAplbmRvYmoKMzUxIDAgb2JqCjw8CiAgL05hbWUgL0ltNTMKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzUyIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDE2MTgKICAvSGVpZ2h0IDk5CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIFsvSUNDQmFzZWQgMiAwIFJdCiAgL1NNYXNrIDM0OSAwIFIKPj4Kc3RyZWFtCnic7d3fbhvXnQfwPkufIe/QC8MvEaA3vvcD5EZXeQHBTi1nI7e1gdhxBDegiwRNrMVCULJppd31GlqjWHTh7Tox3Atf+MLyiv+G8+fMcEgOSc05nw8QRxxy/oi/c4YzX54ZvX8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABl/wsAAAAAPSf1AgAAACA+Ui8AAAAA4iP1AgAAACA+Ui8AAAAA4iP1AgAAACA+Ui8AAAAA4jMn9frhxq9/9dGj0jzBiQAAAABwaSyTejWTiQEAAACwbVIvAAAAAOKz6hWOjz761cSvb/yQfzx+CAAAAABbsFrq9eijLN3KfjTWCwAAAIBtWzn1qjwt9QIAAABg21b+G46zSxwnk6ReAAAAAGzbyqnXVDbsS+oFAAAAwLatlHoNf8jd16s6EQAAAAC2oUXqVTDMs5r+huNsHuO9AAAAANiWOakXAAAAAPSQ1AsAAACA+Ei9AAAAAIiP1AsAAACA+Ei9AAAAAIiP1AsAAACA+Ei9AAAAAIiP1AsAAACA+FRTrzcAAAAA0HNSLwAAAADiI/UCAAAAID5SLwAAAADiI/UCAAAAID5SLwAAAADiI/UCAAAAID5SLwAAAADi05x6/RcAAAAAXGJLp16vgH46Pj7e9ibQAXXsF/UiKRo8qdHmI6a4cVPf6Em9IEH27XFQx35RL5KiwZMabT5iihs39Y2e1AsSZN8eB3XsF/UiKRo8qdHmI6a4cVPf6Em9IEH27XFQx35RL5KiwZMabT5iihs39Y2e1AsSZN8eB3XsF/UiKRo8qdHmI6a4cVPf6K0x9Trdu3bl2t5p9iD7eWiwc6XwePjiKzuDyqOL180U5gCW1m7fPuqII1nfzE8M9djio/b9urq7GMzWYw9QZ14dC29rdVJgP1x99cWU4H74tFqgamsJrSVhS/a7fF0qNQp9mAZfnS9YrgWUKuszl+4s3+CrO5T6ljnrAoGd0rW9PY2czenliXOlR5QOHYbPX3TDQv8KfbIUj/YKXTjYN/vW9XpZ3LDFDu9zJRs+jvUYr9/1DX6uBc+2StUqvSZ48lX9GO2nNadewaP20aOdvYv/Cl3tQu7FkwcXtSj1LmBlLfbtwXSkcCg0ORB6Vd9/2/fr+t1FdQ9NZn4dQ5nI7G0O7IdrUq/CIVBW3FkAVty/Fw+X7cOnlux3DalXsIiBrlQ8icm6brU6wVrDUjpo8NnEuj1JtQtUF6CRsym9PHEOda7ZsUP2bL5fTZ5uOCasdOFXlWf6ppfFDVj08L5a9DiP8fpd3+DnWvBsq5p6hSo452O0n9abeg3Twaw3ld+80/xhyvjFe9M9bHYME8v7DJfK/H17Kcg4HZwGviOY9s+6/tu+X9fvLnp9jLRu7U4qw4lU3X54TuqVVa829co/HuwoXk4H/S50vBn4MC11pcp3sZPCNAcCPoFZTScfNJNGWNMWA11godRLI6dTvTxxDveBSt+qfhI1HhMGc5FeH9H1srhVix/elw8/Ij3G63d9g59rUq+idadep5P9ZSksDnelwd7O+Dh8NMCuciVURD0LtqvVGKHqLq48cdqH6/pv+35du7vo9zHSurX5jM6PZciFH42HNPmZK6nX5FUNqddsPqUrWLLfla4NqR6IBE9Gcl2pthNVe2Kw1rCU5Rt8cKxXyy5QXYBGzqb08sS57lRrND38vdi4XzYeExrrdUktfnhfHOs1ezqyY7x+1zf4uVZ3tlWaMdT953yM9tPaU69JEDx780L516z/jL5X2MkO2aNJF+FSWUfqFei/7ft1ze7iVc+Pkdat3Wd09naX97ilpztMvV5FdKuHDnUQAtS87dUi5rtS6ZVj4e8BBQJ0p5OYNxtTUH1luAssONZLI6dDvTxxrh/ssbNTumyq2C8bjglrbgPU6+7Wy+JWLXp4X5N3xHeM1+/61qVexnrlbCD1Gu0396YPCjdNq2SP2TVQUi9Yo0UvPKmZWPqevdJ/2/fr8O6idkMYa/kZnV2oMH3bm/fDOctd4Zh/GTkd9Lv8lQXNRcx3pcAVjq1SL0VkFSs3+MDo1JyaLuAKR7anlyfOTd+2nBbuBRo8QqguKNiFa5bRI70sbtUyh/cB8e05+11fVzi2sInUa3JoMu97gfHedefa9LoMqResy+I3GQ78qcVB+XaXlf7bvl8HdxflZyhr+xk9fBN3dq7VnT8Gr0rIPVMaRTHnbvYTdt5VS/a7YOrVooi5rlToubO+2xwInLrRNyvppsHX3ZW3rgsslHpp5HSqlyfOgU/r4gd8bQDSfExYnL283P7pZXEDlji8D4jvGK/f9Q1+rkm9ijaTek0702np7+wMZaMQCgfsp4H7/1yJ4y2H7Wt9ZVzwUu9Kh6zrv+37dWB3UVo2Aa0/o0dVm50R1u+HS4XJUq/G4RRSr5aW7HeB1Gv+h+nkxaW/3Fjqu9WeGKw1LKWDBp+dlZXban0XqB6ua+RsSi9PnAOdq3xZ4pVr1XvXz56sOyacLb7xaKEvelncsIUP74OLiOwYr9/1DX6uBc+2SpNqkpY5H6P9tMbUC7is+r1vZ0od+0W9SIoGT2q0+YgpbtzUN3pSL0iQfXsc1LFf1IukaPCkRpuPmOLGTX2jJ/WCBNm3x0Ed+0W9SIoGT2q0+YgpbtzUN3pSL0iQfXsc1LFf1IukaPCkRpuPmOLGTX2jJ/WCBNm3x0Ed+0W9SIoGT2q0+YgpbtzUN3qrpF5AT52cnGx7E+iAOvaLepEUDZ7UaPMRU9y4qW8Klk693gH9dHx8vO1NoAPq2C/qRVI0eFKjzUdMceOmvtGTegEAAAAQH6kXJMg3GnFQx35RL5KiwZMabT5iihs39Y2e1AsAAACA+Ei9IEG+0YiDOvaLepEUDZ7UJNLm3/z8Yuj//vF221uySUkUd1LaBMubRn3Ttv7U6/H57tXzlx1t7svd97vXz5d7dh1rXPsyz87v/vL8Wberr2zGbHuGq3u/+8v3g+uL/daBRQE98fTjD37x4UH+h/DTbFD5XT/48BcjH3z8tPCi0ePhiyfKlSovp3mW4FrqllP30ppZGjay5tnctPBMxKODBt/VLMHtWbjBz2u9oVVPp2ntXHLHD3eH7nz9fNtbQofenn3z+5u7n947GHrw2988lAIRlbWnXs+unw+uvz86W++vMdaX1GsBG0m9GqYsvSguN99oxKGbOs6JtaRenWlbr8nJbyH+GT8oFGNyQn/x6umZ8/Dp3Fl0eTnNs9SsJbSciwmTB7klNf4K9RtZ/+xsLfTTBht8d7MEtmeJBt/cekOrzm2EfW5/JXJwlWbqFXdxh5HXp/cHB/uTrOv513cSS73iri/v1p56nZ3fvXr+8vH53d3plMfnu9fPj64OBxTNxoAFJ46nj4YeZYlKfkzR3d3zwfjZcS6Uf/FovUfXx88OM7dnuZ8bFt60zKnhy66PxkSNJ1ZfM2/tTb9FcdtGK5pOD25wfkvqfovg7LmHk+3Jplw9f5ZPsXLTX2ZVqHmXXgZnbHiHgbWZDnMoPKiOeQiP9cqGInz4oTOwDRq97x98fFCqxfTnfI3Gk4tn19mj0HKaZwmvZc72tPwVgmvM1hLenkLzJVYdNfjOZummwQdb72wtNVsbeCVcRmmmXhEbR17//N9vZ1nXxU937n/xu9tj+58/Ueue++nZ90cj3z/9e1rXrmbWm3qNUo6L/58PitHNOAR7dr2QwJQnDueaxEQXE8fPFq6kq392fKXe4PG77JWznysLP7paeGXtMnO/VC6xCSxn7tqbf4vSLz5dV90Gl7OjNssMvJk1P+QHm01mzF2y2jRj3RoD28bm+UYjDvPqmDvzCo95KIZdxVO/2YAb19t0ZIF+lz/tLZxAFypTqUtlJErx9Llplpq11G3Px7XXhoVX3bSR4Wdnl3tpgT21uQbf3Sx127Ngg29svc2rFnr1WewHV3978vkwA7l1c5R63fhk7+LBnT/++7Y3azPiLe5/Pv6nSTH3Ptn76mQ46aejL27duLE/OBnd4utksB//wK946zv0+l/uf/blt8PQ6/DRnd//6W/b3p6tWG/qdXR1FnFMEqFhwDUNasYjwRom5kcNjSYG7x8VzmqyMWP5n7PEJn+3semK5ixzqjycqbKcuWtv/i0Kv3gWOs3b4ODmhZdZvxmNKVZIZUtarnH+koEOZGdXoZEHuTE15dQrf7LoDGwbSuNVAufI1ZIGLh0MXu4VniW8ltByRsMFZwMF62KA+tvENQcHk2cLLzTuK3YrNvjOZgltzxINvrn1Nqx6MhZXa+eSenv23b1buzM3Pnv040/b3ihWdPywOGzvp+MvP91/9ONhNjm9yx3jcfJ4f5JU37w1Hri398mNyY8PDl9se/M2ap2p1/TW6OUL62bXME7HgIUmFlKRaXbUZeqV37b6TGZ+6lVZzoqpV3GNubeocYODmxdeZv2bGfwhNCIru0qxXVxWWWPwjWWD4v5GIx3z6zg53yqPLSiMQWgc9PXO7ZW60+XQl/KZ9LCqgVPl2uVUZllw6EvDSJXALM0b2eJZjbCPNtfgu5ql/fY0/wpF5dY7f4HN4yG5vFI4uJoFX4lFXvEWt5B6vf7hYO/2g8OzFy8O7yeVekVa37f/+LfB/v3DFyWH9/cHJz+/2fbWbdYaU69iYBIKuPLDuoIT1zrWa4m8qPKy4HLWNdarcYObf4sux3rlBuY1vd5YL7gMRudXB9lJ1vC8r/Z2XsZ6XR7lq6UqdwEql6imRtV7HNXO0nivodL2LBECNGzk3GelXtFbtcF3NEvd9nSbes29r5cGz6Xz5q9/Ppr4/tnfz767t/fZox//Jz8xofwrNoXU6/jhb377YPRnHA+++u4/Xo+mJZF6RWtUvdd/+eabv7x++uSP378Y/VMe35eENaZeR1cLt5yaXOQ4GrM0vtpxdmen4MR2t6IKT5ybejUuvG5FpafqNnLV1Gvefb0a7jnWcpnL3ddrPLG8/NrfqO07zDZE+o1GctrUcXzFTO6qsco1OO7rtSlLDn3JXS4VOKGfnybNato4S2AtNdtTXFTbC74WjLwK6cLFK7TB/tlgg+9mlprtWbzBz2m9oVU3X3FJT8R7cDW5gf3YrfuHz1789c+D392YTYv/HDrm4hZSr2opk0i9oq3vqHrDv07w9fNRcWf/bHvLNm1tqdfZ+d3qGKHR33O8+HdQ/RuO1Ynv5vwNx0B+cjb9g4bzU6+aP03YsMypclxTWc7Kqdfs4tDw33AMbXBw88IXY5bWkguywllfZb2Tv7aZ37zKoprLV7fxQOeKN1J6mv0Jx+yPM4YvbJy+0N9w3IryefhB8V7as3PvWUGDt86eLafNLAe1d+yu256GppGbJbzG6Qvqtic3XQIQuw4a/OqztNiedg3+XbD1lsezlVetwXOJFVKvmf3Bt3+4ffsP3w72EzyHjsYPX94c3cv+9vgGUImmXtGSek2t9272AYVbeDVOBNYl2m80EqOO/aJeJEWDJzXxtvmTr24FY6+bN2+O/rlx70nsN8aOt7jv3vycv+FToqlXtPWVek1JvQAAACBlxw/3ByelW5+fDPbjT72iNUq9Xhw+eHD44l+/uvjn5PGXh+7rtZHUC9i+aL/RSIw69ot6kRQNntRo8xFLpLjPn3y+f7ts//Mn0Uck0db3+dd3vjh6W5oo9ZJ6AQAAAPTb8z/dq+SYt+99c1ZOwqIn9YIERfuNRmLUsV/Ui6Ro8KRGm4+Y4sZNfaMn9QIAAAAgPlIvSJBvNOKgjv2iXiRFgyc12nzEFDdu6hu9VVIvAAAAALi0lku9AAAAAKCPpF4AAAAAxEfqBQAAAEB8pF4AAAAAxEfqBQAAAEB8pF4AAAAAxEfqBQAAAEB8pF4AAAAAxEfqBQAAAEB8pF4AAAAAxKeaegEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAO/w+0DJWLCmVuZHN0cmVhbQplbmRvYmoKMzUyIDAgb2JqCjQ0NjMKZW5kb2JqCjM1MyAwIG9iago8PAogIC9OYW1lIC9JbTU0CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDM1NCAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxNDIzCiAgL0hlaWdodCAxMTMKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgL0RldmljZUdyYXkKPj4Kc3RyZWFtCnic7cExAQAAAMKg/qlnCF+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA0wBXjs+BCmVuZHN0cmVhbQplbmRvYmoKMzU0IDAgb2JqCjE3OQplbmRvYmoKMzU1IDAgb2JqCjw8CiAgL05hbWUgL0ltNTUKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzU2IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDE0MjMKICAvSGVpZ2h0IDExMwogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDIgMCBSXQogIC9TTWFzayAzNTMgMCBSCj4+CnN0cmVhbQp4nO3dO4/cRoIHcH0hKfB8iPsEJ3iBA2wFzgxcrswHnawVDpccYCwg6PINJMPGQclCgtMBBO/Yt95sAysSsIEeh55HS/Ie2Q+ySBaL1Y+ZZqt/v8Buscli8VlV/272/OMfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM2ksAAACAKyGsAAAAAEZFWAEAAACMirACAAAAGBVhBQAAADAqwgoAAABgVIQVAAAAwKhcaVjx44Mv/qnrqyfbKR0AAAD4GFx5WLHtaOIyygQAAAB2R1gBAAAAjMrGYcXPf/rv//y3uHt/+J+fG/P2BQuN6dU/nnzVek5k9s6D5aMkXzz4MZhn9q9woWoKAAAAsFc2Dit++ObLT/857tMvv/mhMW/0NyvKKCJIK4qXZcxQTylfzYOH2eKLDKIMJWbvN4KOYmqQWogrAAAAYA9t4TGQF8/+K5JXfPrlf7S+V5F6ZKN6p5NVvKxzhzq2aC7QmNMzIQAAALDfthBWvOzmFbGk4mXy9yXqkKLKJULVxMYjIZ2w4mX4HIjUAgAAAPbRdsKKl2Fe0ZNUvBz4McwnX33x4Mkiq4jPmRVW1MWJKwAAAGAfbS2seFnmFd/867/0JhUvh/5yx+w7EZ3HPHpyicbEcKHwlzaFFQAAALB/thlWDIr+wGadKTz5Kv5ARyTAaP0AZ12IvwYCAAAAe+5KwwoAAACAIcIKAAAAYFSEFQAAAMCoCCsAAACAURFWAAAAAKMirAAAAABGRVgBAAAAjIqwAgAAABiVzLBiAgAAAHAlhBUAAADAqAgrAAAAgFERVgAAAACjIqwAAAAARkVYAQAAAIyKsAIAAAAYFWEFAAAAMCrCCgAAAGBUhBUAAADAqAgrAAAAgFERVgAcguPj4x8AANgfu+4/7piwAuAQHB8fv379+s2bN29n/g8AgFEqOmyvXr0qOm+77j/umLAC4BAU7V3R8BXNX/H69PT0DACAkSk6aUVXbZ5XCCuEFQCHoGjv3r59W7w4Pz+/uLiYTqfvAAAYgelS0UkrumqTWV4hrBBWAByCeVhxenpatIPv37//G1flT9l+AwAO24cPHy4uLooOm7BiIqwAOAxFe1e0emdnZ+/evSvawV2P4A9IfliR2SIDAB+leV4xnU6LDpuwYiKsADgMYVhRtIO7HsEfEGEFAJCp6KQVXTVhxVzmTtt1NQH23E9ff3Kt5ZOvf9qwwM8eZ8+eE1Y8vHnt+u2nmw7On96+Hi/l4c0tlL4spFhLXdneVTbmX8xSLlm4ebt/oeFCViCsAAAyCStCmTtt19UE2HM///7o2q3vp6GL89NNC/w2e/bhsKIYiZcD+JsPVxyM51prpN9byDxyWFS2v+juO2tUY7OaCysAgEzCilDmTtt1NQHG7o+/KwbPv/tj39vRbOGnrz+pv15R/ePxZ4uvXiy/ODF75+vG1GCevK9YDIYVD2+WQ/+nYVpRDtJv3px9D2ERC3SnVN9UuHat/uZC8aos6ObNa9Wcy7nmby0LuX774e3rwbIPF0vUq0sVcvt239cmFgW2538arqCVewSb1JzQLSS2yY169oYVv/y9aFB/PS5fHv86Wb4UVgAAM8KKUOZO23U1Acbr+Z3r1+88//HujWs37v5YZhaxyCIaVpz+5f7R0b15WvHTvaOj+385LWOIo/t/nU6nf71/tAghymUXE6ff35o9PnJ2Ub596/vpxdnp+UXx36FKDoUV86yi+S2C+lGL8tVy4N6dMh+fLx8iqcKKenqz5KqQ8EUQBdTLpAtZRCIP66l9lekuWL+on31ZLF1Xo3+l3bW06tkTVszzismvx2Vq8fdffLMCAAgJK0KZO23X1QQYred3brR+jOLGvz/vzDULHDo/WVGnFVVW8fm12f8nk9Pz725d+/zxYtlb380fGvnf+0fXPv92suXHQMKIoh5vB1MXL7tTgtF5nTA0kocgSUjnBtW3HqovLWQUMvs5ifof8cokVhp9xKP+akVspYm1xJ4Y6TztUX6nov2lCmEFALAMK87Pz4UVE2EFwKbKbzZMpyd3y8jixt2Tnh+j6P5mxWyuZVqxzCom395qJBpHv/+pmUtUr7cZVjRjgurxhqsPK1rfSsgspPqtzK2EFeXOSH49Y8OwYpZVRNOKS+z6AAD7QFgRytxpu64mwKiVD3/cuPuoDCx6fraiL1uYpxWPl1lFGVaEmcYs0bjssKKdEoRPVWzwGMiqYUW08MFCFlHLFh4DWbys9kZZbqyQxFqGw4oyqiif/5g/DSKsAAACwopQ5k7bdTUBxuv5netlVPHnomH5cxlXXL/TfQqkP1so04ryKxTzrGJy9t2t5d80ffzZ4tXlhhVPI38BpPq1zVV+YLPx8Ehk/L4MFRIBQvcHNgcL+VsYoXQqk7PSp60f2FxWYvabmbNJ7ULimzwcVsy+VLH8qYruz1ZcaucHABg/v1kRytxpu64mwHjNngOZP/oRvGzp/mbF8q99zNKKZVYxmZxdfL98EuTo/i+zoqJhxSLk2NpfA4nojryjv/BAUuenKXpdaucHABg/YUUoc6ftupoAe27+yxZNi7/hMftzHkHAcXYRPgOynOFs0no9L3Fbfw0kRlixDcIKACCTsCKUudN2XU0ANlKFFdPp9MOHD7sewR8QYQUAkPbbUtFJE1ZUMvferqsJwEbmYcXp6enFxYWw4irlhxW/AQAHrOihvX//fjqdFh22t2/fCiuEFQCHYB5WFC/Oz88vLsoHSN4BADAmRQ+t6KoVHTZhxURYAXAYivbuzZs387zi9PT0DNg357CWXZ+5wAqKTlrRVSs6bEW3TVghrAA4BEV79+rVq3leAQDACL2dKTpsr1+/FlYIKwAOwTEAAHtl1/3HHRNWAAAAAKMirAAAAABGRVgBAAAAjIqwAgAAABgVYQUAAAAwKsIKAAAAYFSEFQAAAMCoCCsAAACAURFWAByEF88e3Ht0kp7ykRnVBkYrk6jhVVZ+83VVJXRfpNdyqZuZqMxlrDqyuvJV4cGjR6utK13zNZ08uvfg2YvtlDWwT3POhy2uduvSa7mMOkTK7Jw8l3JWrKY4h650xetscmTW3Gpv8U64LVd6rON37fIk3N6NYx2juB7XLeHyLtsr2C1rVP4SDoewAuAgCCt2a9XK7FdY0S1qDOfbFQ/utrjJl1Hhk0eF7Q068gKg/R67XWEdck6eQw4rNltGWLHmysZwuQ0aZ1jRLWqvz42dngnCCoCDMNAZLnpzc8spxbuzj/SWUzozTOolF5PKReZjoVhp0deNYuaWw6nFRzpBKbPyn/XVo1vIbEWPIvNHtyU2sZo2OGdrw8qXyw2Zf6AdrUz8EKQr31ONeueH/4ge1tY+PIn/a/WtS36KFKwlPLWie6B8t9qY5MTe07WzxvTO793qxFnXqkN7dSfhAT3pP9CT7qneLSqx1ekrorkZL07qtGJw2e4F2D4cnd1XTWzvgXU3JHoTiGckrWXL29KzxeTwtOlO7KlPcFn1Xy+Nt8sST4LXK2xs95YSO3m6e7W3/Na10Clz3XtsuQeXF9LQHXUbRyd+P0newGNfY8qtdmotyRtgfJHkbsm8CparjbWznZLS7dTgray961onTPaZ9pFdjxu1iUPNUPyUyGnp7jVqlbhVrtFxajfQq9xz2p29xHpzCSsADkIyrKg6XPW0WSsT9tvaM1SqAdDyRd19iy4WKaJblaAL2OivdkpOFNIzf6R68YmN7mHY6+rbFVUvct5EVzuynBitTHN351Q+2OutMoIu7PJl32Htr0Z8k/O2Lh1WtI9jdzWNHR89GgP7r9MdSp85eVvdd9alTvLU3sg/1du7sWeNqZOke/Cam5pYNlar9uGod1974nY2JLlnBqo6q0o9xkpMHDyUeadd66oYurWm7pDVIRs+nbKvhe3cY4OrMF2HbR2dzE3uOTNXrnbyLE3dABO7uX9PZl0FVYGddjYoKa+dyrmVtXZdxmXbOdM+sutxu23iKh2Ywau7Ucl0I7JyxymSeGTec9K1WouwAuAgvKgj7nYm32jAlk1zo3GJzVBbdJ6CrKKzYFhaolseF6tSTiHx+WPV653YHf4ld0U9JJx9khFmCNHK5Azt4/snUo2w49Ts6Qztw2jvoitn63LDivRxqTalb2L6dM1bY/5WZ55FOaPLVU/1zDUOlVwPqapispcNlmkdjuUgqjsxteHrbUjyQMerGpbYGRHFz7H+QxnflnCoGr6O3kMyr8GlrLNo9Wshvd+GDkRrZy1PgETrEF06++hkbnL8zFy92oNnad8NsDLQ0PTVKKONaLezYVF57VTWjbe56/Iv27iP4Hq8nDYxqxeUfxBj+3zt9a6wQ1av1VqEFQAHIdUknTxqJBjdfkhshkZBD+pvmDcWTA7VWwV0qhysNa/N7dZrYFAQq15Y0Isq4Qlb58SumLfIs/8uyszrEWVWPrpvGt/enH+iU3cFU4e1tzMT3bS8rVtp8NW7B4Lj0p04fLpmrzFnq9c4i9IvVjrV88/b1MCh3rzcqyldq+W7i755YuLGG5KuQ29Vm0OM2Pg0Wv/EGHntwdHq12DfW/GBQ/a1sPk9tjlSDvZq4pa4paOzyib35umD1U6fpYkbYOKoRfd+/lXQPtk6WcUku53KOPHa27NCu9na4R/R9XgZbWJOBya/ttF9vvZ6B3bIZrVai7AC4CAkOsPR0Lsx/0AqXswb/Hbf6p+cRvo8wWcu+W1uYkp8Y8M+THdiszrtT6bjTuZP4S56XdWnLUMdgNzKN9bTqcZsjSfdD9GHio32OXt2w8DWrTT4mvQdl9boIDExtl2Za8zc6vyzKGd0ueqpnrnGvs1p7bnlwu1BQWat4h/CxiZuZ0OGbgIDVe0OW/omZhzKeB1yBkfrXoNZZ9Hq10J6vw2dUcH6oidA12ZHJ3OT018PyK/2QDPRfwPMLiFW4eRVEExstrMx6XYq68bbXCz/sm1U4mO8Hiexw7h2m5jbC8o/iDmNyAYdp/x7TrpWaxFWAByEZJPU6ONEviARm6FdVOMjks7M9aty3v4e3uJlu+3LGZoNFtK/sdGJ4Zam5wyd1I/hzrY01ljHe1lZlQ/X063GfI2RWkcPa7caPZu8wtatNPhKHJfoGZQ4rdIDtE22Ov8syhpdrniq51+k/b3BF/OudGXe2czvwQZXd/NwdMYh1cTk+bDyaRndMwNVTddv6Ire2uBorY3te2uNnRndTevfY4Phx9AddTtHJ3OTe4pZudqDG9V3A4xtb7ql2OgqiBeUfVYn6rnyb1YMjlv3/Hq8pDYxpwOzrVvlVjpO27qBr0VYAXAQ0p38eYsbftGxPX9nhnbp0ZnrifN2fLZ89+OoSPnV/J0/MdCzOd1CeuePVC86sZrUM2dsV4SNcvDBQsYIJbPyyWq0uwTJw9ocQd9b9o5SX9oc3LrE4Ktay+BxKT+pag4P+ib2nq4Za2z2vnq3eoWzqLO6nAMdPdWjNe+uMWvY27o2J4su5snACRarVTA5PbF7aq2xIYM3gVRVy21c/mh+Y7DRmZisz8D1Mjw4WuManLTeig/K7gXDvJxrITLnGvfYMuha/D2D5H1mW0cn7wpqrGfgr4Fk3x6jzUTfDbC9ua1Dkz4c+Zdz91puFDTQTvUe3P5dl3/ZdnbBR3M9btomDjd83Q3PbOnqSqau5e10nLLvOavfwAcJKwDYVLwPBWuJ9mfW6uRwqPo+BF3/0z22x9FZyx63s4446xNWALCJWXiuy8GG6g9hgtMpOhEGGRyNmaOzsj1vZx1x1iesAAAAAEZFWAEAAACMirACAAAAGBVhBQAAADAqwgoAAABgVIQVAAAAwKgIKwAAAIBREVYAAAAAoyKsAAAAAEZFWAEAAACMirACAAAAGBVhBQAAADAqwgoAAABgVIQVAAAAwKgIKwAAAIBREVYAAAAAoyKsAAAAAEZFWAEAAACMirACAAAAGJXMsAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY9P9yDaX8CmVuZHN0cmVhbQplbmRvYmoKMzU2IDAgb2JqCjQ1MTAKZW5kb2JqCjM1NyAwIG9iago8PAogIC9OYW1lIC9JbTU2CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDM1OCAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxMzU0CiAgL0hlaWdodCAxNzMKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgL0RldmljZUdyYXkKPj4Kc3RyZWFtCnic7cEBAQAAAIKg/6ttSEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8GB5OkYAplbmRzdHJlYW0KZW5kb2JqCjM1OCAwIG9iagoyNDkKZW5kb2JqCjM1OSAwIG9iago8PAogIC9OYW1lIC9JbTU3CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDM2MCAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxMzU0CiAgL0hlaWdodCAxNzMKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCAyIDAgUl0KICAvU01hc2sgMzU3IDAgUgo+PgpzdHJlYW0KeJzt3b1u41hjgOHL2ysIsEXa7RbINThViiCFAiw+YIE08h1YniZAMIBHhZstPo99AZlZezr9LMw/S/PlkBRpSqJk2R7bpPM8zXKOqCMtMBie1/zxP/4BAAAAAAAAAHTRNwAAAKAn1D0AAAD0nboHAACAvlP3AAAA0HfqHgAAAPpO3QMAAEDfqXsAAADou1eq+w9HP/30y+9//LgJ//j9l5+OPvy4+Z4l/zKb8i9Xf8lOfVsAAADenVep+yJuj45eL3BfqKZ3Tfvgx8l8AAAAXtJr1H2ZtK8ZtuoeAACA/08eX/d//+//+o9/bfdvfxv9ffsNddF+OGpenR+Gf/n996PGhey7BpuXvlcTrPfy79XrxcsfjtZ2Xt8jvOmPxvbKh82PfHjatv/DXf/nq43tGdo+95ejo1/WvhwAAADs9/i6//jbrz//U7uff/3t49b+jaZfy/uyscuGrW/Lbx3MN1atW2+uhXM16/ar31r2aER/I/8/fNsa2z9tw/Z99/fTbX/btS/W+rnCHgAAgEd5ypX5//s//9kS+D//+u9tZ+7Xir7R6e2h2za4NlZNt9bL7Sf0tyO6fXvn/PunbTj03P3u79L6uQAAAHCYJ953vxn4O9J+59Pkv20m8apu2wa3zvjvfBz90+u+af2nBzun3fi/fFrd7/1cAAAAOMzTn6p3H/i70r6tVduuh//WEu2NwYfP3T+/7reC+pXqfu/nAgAAwGGeXvff8sD/7V/+eWfar1+I3xy8v8W+7c72rcEH77tvzfD6fP9Ddd8cfMS0DY+r+7Yv5qH6AAAAPMOz6v4B68/Ibw7Xp+SPjloehb85+PAz87faffWGvefLm9tbT7N/eNqGw+t+c4a9nwsAAACHecm638+F6QAAAPBjqHsAAADoO3UPAAAAffd2dQ8AAAD8GOoeAAAA+k7dAwAAQN+pewAAAOg7dQ8AAAB9t6vubwEAAICeUPcAAADQd+oeAAAA+k7dAwAAQN+pewAAAOg7dQ8AAAB9p+4BAACg79Q9AAAA9J26BwAAgL5T9wAAANB36h4AAAD6Tt0DvEvn5+cfAQDoj2cu/9Q9wLsU6n46nc5ms3nhLwAAOiks2CaTSVi8PXP5p+4B3qVwgAhHinC8CNtRFMUAAHRMWKSFpVoZ+OoegFbhADGfz8NGkiRpmmZZdgcAQAdklbBIC0u12yLw1T0Arcq6j6IoHDgWi8VyufwOAECXhBVaCPywYFP3AOwSDhDhMBHH8d3dXTPtd/2zDwDAayrXZlmWhQWbugdgl2bdi3oAgA4Ki7SwVFP3AK/h4mRQG5592bPnl7Ph4OTi6Z/03PdvUPcAAB2n7gFeR97bg9FV9diTq9HewP/6aTgYfX76pz33/RvUPQBAx6l7gFdxcTIYjm/SuPpznN6M69PrRfmXViNrdV6f8q/Oxof9h2dnm6ONPYcno/r925Pnbz85GRYDh53kV/cAAB2n7gFew8VocDy+jppDUZJmRe2X4V+c0a+Lv1H39cv3Pw7IX63ec3VaXwNwP9HlKKR78f5dkw9Gl/kvTonrb7GXugcA6Dh1D/AaPo9CTkftr8Whr5PytShkeRHl93V//3OBKLk8HYyqPD+9LN/z5/i4HMz3rAbj63z0857JTy8fTPoGdQ8A0HFl3SdJou4BXlBo8L2P0Ws8b2+j7j+PBk3FLM3r9uvt/Br7+mL+uuT3T34odQ8A0HHqHuA15LW9kff1He95fBfXyecXzx+31P1p/Sy+rDwR31r3a0Ffp/7+yQ+l7gEAOk7dA7yK+Ho8bD4AL6/u4fg6LkO8uk4+7+6Ns/PxZX1jfX4PfbHVWvcbe5bn6R+Y/FDqHgCg49x3D/A68sfXXTWuss+foJ+Ut9MX4V8OjkblXfSNAI/T+m3D8XXxlva6Xz2Hv5zntDxP/9Dkt56ZDwDwLqh7gNcTpxuX2Jfy8F8NBsUj7NceZV+/rX4+XuPVtT2rmep5HpzcM/MBAN4FdQ/Ag+q6z7JsuVwKfACAjvheCYs0dQ/AfmXdR1GUpmlZ9wAAdEdYoS0WiyzLwoJtPp+rewBalXUfNpIkya/vz7I7AAC6JKzQwlItLNjUPQC7hAPEbDYrAz+KohjomwSe5K3/5gKPEBZpYakWFmxh2abuAWgVDhCTyaQMfAAAOmheCAu26XSq7gFodQ4AQK88c/mn7gEAAKDv1D0AAAD0nboHAACAvlP3AAAA0HfqHgAAAPpO3QMAAEDfqXuAd+n8/PwjAAA98fzln7oHeJdC3U+n09lsNi/8BQBA94TV2mQyef4vu79V9wDvVDhGhINFOGSE7SiKYgAAuiSs0MI6rQx8dQ/ALuEYMZ/Pw0aSJGmaZll2BwDAW8sqYYUW1mm3ReCrewB2Kes+iqJw7FgsFsvl8jsAAJ0Rlmch8MNqTd0DsEc4RoQjRRzHd3d3zbTf9c8+AACvplyYZVkWVmvqHoA9mnUv6gEAuias0MI6Td0D9NCXs+Fg0/DsSz58crF6fX3jGdQ9AECXqXuA3oqStHiEys34eHB6tXqcShLlw2kcXv/6aTgYfW5uPIO6BwDoMnUP0Hsb8b46U39xsjqdf3KxtkNjfG3/B6h7AIAuU/cAvbdR96s/xunqnH4aN3YIbT8c3xQn/Kumr8/176XuAQC6TN0D9F573bdemX8xGhyPr6PbvOkvTwejw2/GV/cAAF1W1n2SJOoeoK8eUfefR5vP4Dv0Q9Q9AECXqXuA3ntc3VfP31s9g+/QD1H3AABdpu4Beu8RdR9fnlYn7PM78A8/da/uAQA6zX33AL23q+6j6/Hx5jPz4/Squjh/OL4uTt17Zj4AQP+pe4De23jo/f0f860sbK/tEKcbl+V7Zj4AQP+pewAOUdd9lmXL5VLgAwB0wfdKWKGpewAeVNZ9FEVpmpZ1DwBAR4Tl2WKxyLIsrNbm87m6B2CXsu7DRpIkIfDDseMOAIDOCMuzsE4LqzV1D8Ae4Rgxm83KwI+iKAb6JoHHe+u/tsAjhBVaWKeF1VpYs6l7AHYJx4jJZFIGPgAAXTMvhNXadDpV9wDscg4AQH88f/mn7gEAAKDv1D0AAAD0nboHAACAvlP3AAAA0HfqHgAAAPpO3QMAAEDfqXuAd+n8/PwjAAA98fzln7oHeJdC3U+n09lsNi/8BQBA94TV2mQy8fvuAdglHCPCwSIcMsJ2FEUxAABdElZoYZ1WBr66B2CXcIyYz+dhI0mSNE2zLLsDAOCtZZWwQgvrtNsi8NU9ALuUdR9FUTh2LBaL5XL5HQCAzgjLsxD4YbWm7gHYIxwjwpEijuO7u7tm2u/6Zx8AgFdTLsyyLAurNXUPwB7Nuhf1AABdE1ZoYZ2m7gFe1Zez4eDk4iUm/OEzV9Q9AECXqXuAN/D103Aw+vwSE0ZJmqXxD5y5ou4BALpM3QO8gZ11f3EyKDXPv9eDw7MvxUB+gr65X+Nda+fut2YLrw7PzjZGDzvdr+4BALpM3QO8gR11H2p8OL7Jf6PJ1ahK+by9R1dZY/B+r+xmXIR5nN6MjwenV1kaN2ZumS1/tR48XQ0edrpf3QMAdJm6B3gD7XV/MRqcXiZRvhlfrto7j/vTy7K941Dh4eXVf3LR5aicp57wfua22fJXq8E/x8eD0eF36Kt7AIAuK+s+SRJ1D/B6Wuu+OEtfDYb2Hn76Wux5PP5za4L6mvvBrrrfNVs9+Mh7/9U9AECXqXuAN9Ba1vWJ+NzFaHDf4+tn2POyH12ursw/3lX3u2dT9wAA74+6B3gD7WVdX0Bf5Pjx+DoKkX59fwF9+fi75rX6+Tz1JfcbV+a3zabuAQDeKffdA7yB4ul2a4qH1sfp1ai63v5qdW99lNwPDsc3aRwl1+Pq3cPRqGz/4ocA+SyNZm+ZrbXuPTMfAKD/1D3AG8gfU78urR+ct/bnjcE6+KuBoNy1HMvbv/EA/K3Zmq/W256ZDwDQf+oegEPUdZ9l2XK5FPgAAF3wvRJWaOoegAeVdR9FUZqmZd0DANARYXm2WCyyLAurtfl8ru4B2KWs+7CRJEl+P0CW3QEA0BlheRbWaWG1pu4B2CMcI2azWRn4URTFQN8k8Hhv/dcWeISwQgvrtLBaC2s2dQ/ALuEYMZlMysAHAKBr5oWwWptOp+oegF3OAQDoj+cv/9Q9AAAA9J26BwAAgL5T9wAAANB36h4AAAD6Tt0DAABA36l7AAAA6Dt1D/AunZ+ffwQAoD+eufxT9wDvUqj76XQ6m83mhb8AAOiksGCbTCbP/5X36h7gXQoHiHCkCMeLsB1FUQwAQMeERVpYqpWBr+4BaBUOEPP5PGwkSZKmaZZldwAAdEBWCYu0sFS7LQJf3QPQqqz7KIrCgWOxWCyXy+8AAHRJWKGFwA8LNnUPwC7hABEOE3Ec393dNdN+1z/7AAC8pnJtlmVZWLCpewB2ada9qAcA6KCwSAtLNXUP8CK+nA0HG04u3vpLPYG6BwDoOHUP8IK+fhoOTq+yezfj4WB49uWtv9djqXsAgI5T9wAvKK/70efGQHQ9Ph6MqtP3FyfbJ/TrsbWz/Ft75lcFbG2HjeHJybDerX5X/QOFvfPspu4BADpO3QO8oK26z2P6ePxnsR1Kezi+WZ3QXxV2GBtd1Wf5q+yu98yuRqtSb85cb+cbg9Fl/htR4uKjVnNV72r5xChJ850foO4BADpO3QO8oCK314S6TpMof+1iFDr/Ot+MksvT1Qn9z1W9N7M77Hl6Wb4pDnsWO+ys+9PL8k153FfbcZgqvL/1Ew+i7gEAOq6s+yRJ1D3Aj9e87/7qdJDHdVnpt0XIr2V/EfVxmp9WX7+cvjgJX10A8Of4ePjp6566bwxWFwnc7vvEg6h7AICOU/cAL6iZ26twr29yD63dfODe6ox+cc5+7XL62+hydF/3F2H00LrfPDu/4xMPoO4BADpO3QO8oPX77qMkf6Ze1ff1Rfbl/fDFVr1xW16kn3f8+p7VxfV58q/Gil+7t1X3zef3rR6d1/aJh1H3AAAd5757gBe0+VS9Vd9XV+Ffjeq78csr9htDIdivqrPrjeF6ML6uLuEffhqfbtd9fhFAY/6b/B7+lk/0zHwAgHdB3QO8oO0n0hcX3t9X+9ZF8vVQtvbG+z3jtZnKN1efsvlx2/NvjXhmPgDAu6DuAXhQXfdZli2XS4EPANAR3ythkabuAdivrPsoitI0LeseAIDuCCu0xWKRZVlYsM3nc3UPQKuy7sNGkiQh8MOB4w4AgC4JK7SwVAsLNnUPwC7hADGbzcrAj6IoBvomgSd567+5wCOERVpYqoUFW1i2qXsAWoUDxGQyKQMfAIAOmhfCgm06nap7AFqdAwDQK89c/ql7AAAA6Dt1DwAAAH2n7gEAAKDv1D0AAAD0nboHAACAvlP3AAAA0HfqHgAAAPpO3QMAAEDfqXsAAADoO3UPAAAAfafuAQAAoO/UPQAAAPSdugcAAIC+21X3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv1f8B3eBcpgplbmRzdHJlYW0KZW5kb2JqCjM2MCAwIG9iago0MTUwCmVuZG9iagozNjEgMCBvYmoKPDwgL0xlbmd0aCAzNjIgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nNUby44kNezeX1E/sEXeSUkIaXa7G8ENMRIHxAkEHFjQnvh9klTs2E6qHyMh7Wo129VJ7Pgd26n+dNKLyv/elY+4meXXj6dPbUwv0Sw28CHtw2LVmnxQSuepHVLBRx4oH+X/d2o1fvmrQtBnBZ/7kIKHP5efTn+f1PLt6edf8uhvedwv/552dAD44+kHQYz67OijFFptPkMKP52i2/c0YdWb37ZtSWYxcTU7SV9999Es538qM3W5KbbwcfFOlYe/2kPBV6fwIX8WGj6dnFf7DuUh6SUYQOwAMbOz2EzPhQZn0qqdX9JitlX7Mplhvd2B1fLH6f3r6atrntFqef29m3FavFmVjduWOXr9uPz8tVLWKKUu+U9/s2S8bsljWufv7ptFx/ot5m++jPBV6tpW0rG0Q2aOvm5QcV9Zn+nKKL5f9jXmOqNFrD3nr6FRdgu/4Et55Okl/5VJ2/hQ+2otd/INy3WnwuSd7XVcUyipOCT1dioTP6EtzWk2ZsLbuWFuO0uK6lyhyE9gY5un69WEnozTvFSZ/bK8fk+NKLhsRJnc4hDNilCGZThL2XrktdFWjDaCoqtSASR0UFBmVY1uawuxm0Bi3oM8QermhfPR9wNG4oSY2/qxw3I1w6G6RBmXgAocSMcJaeBBHR24WyAM+QndBZJquAvHdDWjZBl0aOJwwk7Aj9wOPPJvdoxCxYynONhLDKO9XPjOuJMza1WDoSpNTYN0gRQwagAXUOEiWuJNfeW5WVrh7NK+D4sCj0Vsn91RxEQhyBYdZXTmg5gs5Bpw4yZ2LTE4I0wO96TBgvgTX1SiqVYs2jAM4GGVNdNlPWAyV8X8jGOKcoDpdrCGlEZrCNQD0a61FK66G2fUm8KLqyFmoDQvWTcTyk5Aqd4aFmqSOR4i489szYEnJw1fIA4InGA2DYO6Hb0YTdgknB0ACUqPOzY9w0gPDjY4EFQVGO7wy2I1opO+xDZ3QkoMHTMhiJ97MGOjl8auFycLIKocFlAz2oMx0h4GFmNzJcNzhXfeC2/BgRam6p8hGINYCKGyRnUrRMIwykhFt2LSxQkmIm0Uy6r0QPJb7ByBj+wc+VQzqEPSSSo0MPxmo2A7SL+Did3vRiuxLltJrhtcihg2Gk+MUiJe24LX/NTrARhMq46hkypMP6tthK5Cc6YqVORMlCKdSZJqcLc/Lde1NXjMZLFuu9Qm4dTHNWm7bT4XzrT6AEtPbvW3cid0JlwY5UDqxwcmNTRc4ELpIzghDQ0njuyW7s3sBCZYfKak66jG3BChjhIguoDbxL09H7MSCqAm7BxKiBvC/lwx1KpuNIewDeZwv1x6l0vehHVhEIMDbTgB4vbEGZsoQKOHoQu3BHGQNFlBKt3CR69UGpBpNSruxCbN7k/DxJDUIQ2gWILSDtBHYqjqgSNKKVa2okHjVkCxqLD7NtLiGVty9WHSUS1vNI+kB/Mo+fCMBQiHOwuKlVCVwLPCs/Ug1zPKrTGnd5tPeLjbTH62UrS2ZuyO6eEqJmbugROQ5VPvY6LFxWMPJU02Y2YKg0PdUSS1iVrgqniFhxvH2TYTo5vTIflgXnpfRJHoV5EAJXNSBJAlTmOLL5LHiaRlUO7ByW50GGzktlXv5vh4eYNGjUKmQZjEfJr7tXUuHqu5zIHRX15pK9GG1ZtUmAupPKneT/R7P/Gwl2g2vTrtt+S1ZvVRy6YqM5qIKHaGdiU1cztiHG2nOUzDBW0NbhW3jGFWwfYo0Q8d1TNvcQ7Y0RqsdqtVNrPf41PaV2V5RSkvPYWozuraH41YhZ4iyxfy/X3++9DGzm3sBXccNKSzuVZLznXLdG+9x4Yqi7yXfsn1tMKYk1Q/mqgxl88AfVR2FMLspT9XvYHuwJCvapKc9SYd6gx06wnOm/1lTcycasrGVW96S0GlR1U1AXlKVxfVk/yHdJXWLYKuZpt/ico6aNMfqSmoVZW7ieDjo2qagDyjpsrlS3Pzl0fU5Ndgtm2Lxs83/wLVhHGQpjQ31JTMuoW4pageDnwTkKfURA/X0LgJ7Qg89/E9HtxQn1Pr3rDQc5rK/YdabdWC4d+t7vUY3p+0udkY3m/BmlZ0AR+VjpbHSrjHNUzgJqcfm59cg8DcrJTEOXr/hHv1e7T79s1xQZkx0CVP2GI3mxt0NMtuDXRlIb2maXHQaxgbjm0Qz3mQ7CYWsAYFQsUZqicV1wFpK77VW1ij2tnWjC0RXI2dcEUBaAHFbjpwC9kbwYk3tNbtwG2NRqOunQqjPwKZw4mvY7ekCFcqB/kcWDBYI64nBhHFZQ71aIpfQw5ynih1IgJgPxreLx9osQojGXR6orhgiebt7VcmI1F0UnlInud1KJQstCknJSixj347sYGSBQkbuO3bll9QsV4YTD4arTjQcBNhe/96FmdxQam1LHTYHogF+vqcOl2UFA3+OiOVXSnZp/r+uPzhCDdRrVWDarEwFNfRSEA9LrLynDloKTtv1+RzCRq9fzAXmYHUyuqsehoIRBSBfVBPV15bWK3LWWJycb7f/5UlQnSCuNkUgl7f1v5vlZaLYY0uV5lJuUf1MQG5q48nq6ttW9UG+pjt9yXo47liKpvfGmyuIZO3vZ8p31RQq3lT6oKAocddLgCy6LhpRTHJXjJMHF4mQw+Y5JR9SzPjUrw1xSdpHxAHL6An1DJr45mBC3lqIBdDf0uwiDnmW3TS330h/OfIKY3Caz0YhaaencidE74Np8aXRZTqtRc/Q6AbP0kyazroZ01In9YYTX3TcvHJr7FkCxb6kPFOHzKotPotb2gdvtWoPsC7IfyWz4wFjMKXVbAr72ljvIGgWnlMpEuq2MoVQyAqwcm7HUxKH+tKm15BTlvNjMzDa0NAfTceCTp4px4mHssccPmzAQYBj97y4pIaX1HM5aW0CXknimpB1q9ysjmmnU44MUhvox/EPaCg99fEGuUdUWe9mZy8HTneArryN1/WkAIY9pXXN89reRPANWU2Ct9sHGU+9S73jHe52zZjzRhHICLqjh/x2dQT8Nn9Dl0SxcD0QMBJKnZEATYA0crOoJyE4o7ahCsCt3z1hVJNJVpj/kX4OKUPYxYdZLbCUD97vAGwg3tBOGVUj0GD1pl4LoonDDDJ74cmbzy7wTTG1zvz91Yg4Ju3ICx4Z0vva/Flr/PogPWMIZfU+agUvwcIzqxhv6fr42rZ0poPdjlaf/8w+eGEMWF1RZ9mNqTE12d+TSHQyJ997NNPUqt9zuCD/KrI43O/90DwH2//YkKvOsVSOoQl505qK8ox/bWuEq7fT9VknF7LmwuftVLKv/8AC8xcowplbmRzdHJlYW0KZW5kb2JqCjM2MiAwIG9iagoyNDg2CmVuZG9iagozNjMgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDE0IDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxNSAwIFIKICAvQ29udGVudHMgMzYxIDAgUgo+PgplbmRvYmoKMzY0IDAgb2JqCjw8CiAgL05hbWUgL0ltNTgKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzY1IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDEwNzIKICAvSGVpZ2h0IDIzNAogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztwTEBAAAAwqD+qWcJT6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Bof2RVEKZW5kc3RyZWFtCmVuZG9iagozNjUgMCBvYmoKMjY2CmVuZG9iagozNjYgMCBvYmoKPDwKICAvTmFtZSAvSW01OQogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAzNjcgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggMTA3MgogIC9IZWlnaHQgMjM0CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIFsvSUNDQmFzZWQgMiAwIFJdCiAgL1NNYXNrIDM2NCAwIFIKPj4Kc3RyZWFtCnic7d1Nj9xGnudxvSFfPC+i+w2s0IcF6tSnbmDvvnkv3sNiD7lAYwFDe2GddUnmwMDAAwOlPNRlAE9W1s3ttVUPstUNqSQU80Eqe4NPwXj4B8l8Kiap7weYaYoZDAaDKWf8MoKp338HAAAAAAAAAAAAAAAAAAAAAADAJ+EVAAAAADwu8ggAAACArpBHAAAAAHSFPAIAAACgK+QRAAAAAF0hjwAAAADoCnkEAAAAQFf2nEf+4+s//8Hx5b9uU0n4qPpXAQAAAPTHAfKIFRb+9cs//OHPX//HfmrfFhEGAAAAOEqHziNHkQWOoQ0AAAAAPC3yyH/+2//9X/9d9j/+T/yfVtmGPJLOlriLuIwlXsXe6hC19eevv7YPqq8we/XrsspsZkaXKedp9I7uZ24AAACAT1qLPPLd3/76p/8i+9Nf//adVVZcryXFjDIKSK/bBcvXy5Vf9qtuhdkRbt1uhDGCCYkEAAAA6E6r9Vo///v/FiLJn/76P53ZEeF59mq8L4YCMRFIiaP6gxBbjAqNqBMuyeItAAAA4Ci0fX7EjSRSGHllj/yzbFKN/N2oUs51tM4jReawUoYXfdwG+Hnklblgi2ACAAAAdGiD59mrSBIII6+8kb/561riQ+V7mx+RGlBf8hVTJQAAAEDHNvt9rZ///W//7b8Gw8ir+t/7NV6rNp3nR5w5DulpEDGtiNHD2mnGIvPBdvIIAAAA0JmD/95vvjiq2Of91NWrxt/X+sOXX35pHSP/vpY0C+M+F++1gqfZAQAAgE7tOY/sGf9wCAAAADBk5BEAAAAAXSGPAAAAAOjKcecRAAAAAENGHgEAAADQFfIIAAAAgK6QRwAAAAB0hTwCAAAAoCs6j9wDAAAAwOMijwAAAADoCnkEAAAAQFfIIwAAAAC6Qh4BAAAA0BXyCAAAAICukEcAAAAAdIU8AgAAAKAr5BEAAAAAXSGPAAAAAOgKeQQAAABAV8gjADAM5+fn3wEA0DfkEQAYBpVH3r59e3d39y7zHgCAPiCPAMAwqDyiwoj6D7vaTpJkAQBAH5BHAGAYVB559+6d2lgul6vVar1efwAA4OiRRwBgGPI8kiSJSiIfP378AQCa/FtrvwEHQx4BgGFQeeT9+/eLxeLDhw8PDw9dD3MA9ED7PPI7cHhdf5ACAHZi5pHffvut62EOgB4gj+CodP1BCgBHbjYeaePZTlW9PIvsKrwdW2iTR549ffLZF99Wf/72i8/Un/P/v/+RzrOnO1ZbNKysp6md4de9lux0ybq2nS/Qotr05OmzvVVnVdyynVt2S9pypXXj297QgwiedC93U65kgwvdpk9avnPktpFHcFR2+xgEgGFLw0h8uc7dTqNRdPZy+9quXkSj+KJuxxaa84gatjz9Qv3fM3PP4fLIvqrV9dRX+K11ZQ0t2aVt5rH7TCQHyyOHtmlntryhj2wvjRErqXln7qcZrd850tuVPIKjstvHIAAMWjp/MZkvij8ly/mkCiR63qSc4FCFo7Mzd69RMhrHVvxwapAqbDF70phHnj1NBy3W4CiQR4rvu82vvNXB2Z+rPFPsKcuk9T59Wu0p60hrrupzh0PGqdP6iqrLven/Pn2q6zH/6A2/zKGW3X6zJd55nasQrt1pvFObN9asGpntb66/3JMdZdUlXq/f7fp0RvnPvnhW1Jp3v3wXvD1Gx7v7rZtrd7zQ12aFRm+YJw3dUK/HzP4IXHt4j9yk7NSht2uoG8XOD77nzQ4y/lzz9qouQXpnSrfAf+eEu6iqxelWM3HMX6vh4E/n6eb5T/flJnkEj2gPn9cAMFTJzfR0ZMyJLFbr1TJJt1R4iKa3xaRJHhrSyY5i5/qyCi665Hoeq7Bh5JHF6lZVP7lcrxZmscu4ODZZrrKX6jXlkTyO2F/Ainmk+mN5SLXOqwwNdo4ox2K6sH0iXY2x5Z1Mjdo+c782d5qXnsKt0b06sf2h+RHxKpxj/cbbtbkjvKqRgV7y21ZteHnkSXXl4W4344WOEzrQlZfpX0jo0qxbqSu0b67fmT84xeyWBMvbN9S/QP8oq+u8/hH2eE1yr9E+dX03up0fqKRiXke1XrI4NPRebXku551T10VVLzr3z5kEUZFExZA0mLyeMz+Cx7fvD28AGJI0EuQ5Ip/h0JMj8eh0epPcF5MmcRpI0jwymedx5VoFjXhWlCx3LtJ0E1ivZRYzZ2Ga1ecRc6BUjZAC8yPCnIAzOtJf3upCVRlzdkMP8ORvvKvS2ZfI+TfJbk1OPHGvxru82vZb5f2rEI91Gu/lEXfAZ3Z0U/3yffGq0r0U7nYvxzkdKF6IeGlGO7wYJQy4peDpHyiV96sVe8w8MHBbv9VTQH6PiU2qf7uKGxu956WbGOwN/6JanCv4N7r2ne83wVuWlc6MuFMj5BE8lj18XAPAsC1W3gMkFzqiVDnFfBhEb6drrnQESVSykfOIVUyFmejFVdvW1eYRe3yjh3piHqkWTtlfKZsjn5qJjtDYrBwpuaEkK/Ys/9o2DSTP3DHlpnmktv1WeXGaxZ0S8hq/UR5pqn/jPBLs9qY84l9I6NK6zSOhByFqb+sj5ZFN3/M/BG5Q40W1OJfwzmnxzm/OI1kcEQNJ1wNVfBJ2/6AGgMGaja0HOKq5EJVHJuVj7kq2iEvMI1YEsVJHuNgsHu0pj4RGuqE8ogc11XIavRFeGBMYm337xWfmmFAczn72Wbm85OnTp874rU0eEcadRvtDo0T/KrxjhcbbtdWECKGXxLYZu5rXa4VXcNXnkWfehQQvzWqS04G1eaTuwEB5/z3zxK3L7Wir61r0T2i91qZ5ZJP3vNTuH6y3f74Zeq+2PJfzzmnxzveDjp9G0oVa+bIt8gge3fYf0wAweOnSKevJ9HSZ1vW9taYqffAj2xLziFNyFFqvZRbTa8FaCeeRb4Xf93lWPtzu5xE9mZI9P1s9YVDusvd4z+FaX5cXw6JqesYfnZqjSHOzqqmsp3ZUbDw17Le/aolds//0tHDtXuPN2ry+9cNdU/3lBIUKZX60afM8e9v5Ef8uuHvMoa552pZ5pO5AU+0NdXvM60rddX7/SD0mN6nm7VoTTDZ5zxvtNv6sW+O8uayLanku/50Trq06vdut7tRI+diI/whJ1wNVfBJ2+aAGgKFbrNLHy6t1WdPb4nn2xUrvj6Y32T45j2RPrUd5wXjiPD+SPy+fJR6jwvgyP8mefl9rH+Tx5VGQUtfB7fdfIHEccWcfhdC0VzetCevknSni935x9Pb92Q0AA6OfHinXZbn7y53mz2FZP42VPRSfFlScH8zKX8r3VRVKlQQdMo/Uz28ci0cfjR40jRzr6Pp49CWPHEu7+PcQ0QM7f1IDALqk84hKMg8PD48+2gHQP+QRHJWuP0gBADvJ80iSJKvVijwCoI32eeQ34GDIIwAwDHkeURvL5TJdELZefwAA4OiRRwBgGFQeubu7yyNJkiQLAH2zBLbS9Tt3V+QRABgGlUfevHmTRxIAAPqCPAIAw3AOAEAPkUcAAAAAdIU8AgAAAKAr5BEAAAAAXSGPAAAAAOgKeQQAAABAV8gjAAAAALpCHgGAYTg/P/8OAIC+IY8AwDCoPPL27du7u7t3ma7/eSsAAFohjwDAMKg8kv/j7Go7SZIFAAB9QB4BgGFQeeTdu3dqY7lcrlar9Xr9AQCAo0ceAYBhyPNIkiQqiXz8+PHh4eE3AACOHnkEAIZB5ZH3798vFosPHz6YYeR3AAD6oOsPUgDATsw8QgwBAPRO1x+kAPpuNh5p49lOVb08i+wqvB0Nx7Usfzz20WDyCACg1/bzkQrgE5WGkfhynbudRqPo7OX2tV29iEbxRd2OhuNalj8e+2gweQQA0Gv7+UgF8GlKv96fzBfFn5LlfFIFEj1vUn7/rwpHZ2fuXqNkNI6t0blTg1ehXywb3sc1pxD3WRWGzqKvt67942ijy5/JfzIPaTF7Qh4BAPRa0wcdAIQlN9PTkTEnslitV8sk3VKD62h6W0ya5GPqNCwUO9eXVXDRJdfzWI3FjTyyWN2q6ieX69XCLHYZ27MwRrGmU1SNSfcVEzvGTrGkVjXBqchof/Tiqv3lmxcotSdZrrJrr0ceAQD0WvtxBwB40hFzniPyGQI9OxCPTqc3yX0xaRKnw+t0QD6Z53HlWo3D41lRsty5SNNNYL2WWcychbGLBU/hNeb+QqcaY9QvltSqtHWfqGv2G6ban+eR1pdfXaDYnlbIIwCAXmv/kQcAssXKe4DkQkeUKqeYz0ro7XRJko4g1Sj/vq7YdTns94qJpxAbk81NRG6MEktajKf3y4adTq+rduQNa3351U6xPa2QRwAAvbbBZx4AONTo3FzUVE0GqAH5pHzMXcmmFcQBuRVBrNQRLjaLR5vmEa8x98Xcjr0ALFCyutpRPC+S16nRsFnVDp1H2l2+uVNoTyvkEQBAr7X+xAMAT7p0ynqyO12ndH1vralKH6XItuSwYJccBfKIVUwvhvKKtTlFvqU37vOlUnm+kUpq5sP7aeXFPIvd/ryi1pevN+T2tEIeAQD0WutPPADwLVbpt/nVwqTpbTGnsFjp/dH0JtsnhwVjoVIUT5znR/Ln5bPEY1QYXzoTF7pY8BReY4xdZoVCyeosy5tqRVUcl0+nVIfEU72QrO3l65aL7eH3tQAAn4CWYw4ACNBPjzgLnPR+c31U+Zy29cx2uVBppThPcucv5fuqCr2HvctiwVN4jbHabVYolHRO4zW1POQmTRnzZKPLry5QaA+/rwUA+AQ0fdABAGoY/yRJNj20wQ9j7YnOIyrJPDw8EEkAAP3y6J+cADAk1ZyJOKXyCPI8kiTJarXK8wgAAMePPAIAw5DnEbWxXC7TZWTr9QcAAI4eeQQAhkHlkbu7uzySJEmyANA3S2ArXb9zd0UeAYBhUHnkzZs3eSQBAKAvyCMAMAznAAD0EHkEAAAAQFfIIwAAAAC6Qh4BAAAA0BXyCAAAAICukEcAAAAAdIU8AgAAAKAr5BEAGIbz8/PvAADoG/IIAAyDyiNv3769u7t7l+n6n7cCAKAV8ggADIPKI/k/zq62kyRZAADQB+QRABgGlUfevXunNpbL5Wq1Wq/XHwAAOHrkEQAYhjyPJEmiksjHjx8fHh5+AwDg6JFHAGAYVB55//79YrH48OGDGUZ+BwCgD7r+IAUA7MTMI8QQAEDvdP1BCuCgZuORNp7tVNXLs8iuwtuxTWW7VHKsVKc/5iWRRwAAvfZ4H5kAHlsaRuLLde52Go2is5fb13b1IhrFF3U7tqlsl0qO1UX8qJdEHgEA9NrjfWQCeGTp1MNkvij+lCznkyqQ6HmT8ot8VTg6O3P3GiWjcWwlB6cGr0K3JfbLDXmkOuk4ytqcNk9th09nzrNU2+lMxVlxcj+MWdecvjwztuXLbHVUmkficbAnrT43Lqqay5IuKow8AgDotaYPOgC9ldxMT82x9WK1Xi2TdEuNfKPpbTFpkg9401xQ7FxfVsFFl1zPYzVQNpLDYnWrqp9crlcLs9hl7A38qxer89XmEfuk0YuronnxXO0KnM6sp9q+SBudF1Ul3bF9VWnWMHO7KCl0VIuj0rN6h4X6vLwo9Xoxl1UVSJar7HrrkUcAAL3W9EEHoL/S4WyeI+zv72fx6HR6k9wXkyZxGRAm8zyuXKugEc+KkuXORZpuAuu1zGLmLEyuykH3yTx2YoiQR5yT6jyi53qk04XzSFE0q8pumCqn+iGrNM1uentehhypo5qPSs9anLQ6LNznxUVd6MPbpZAKeQQA0GvtP/IA9NJi5T1AcqEjSpVTxPF8ul5IhwWdJUpysesiQdiM5+qb8oiq7XR6XZ1D55GymHi6YB7RdWXttyZIysrd7TQaZNtSRzUfpbaqCyifJWnq82y+KbJO1BZ5BADQaxt85gHoF+dnnqrv5dPv78vH3NPFQulX+eJ43oogVgwIF5vpYbnRjmJN0/q2nGOpySNWbpDyiHi6YB7RjbFyjlW5u23mEa+jWuURfQG605r6/L6YzgqseatDHgEA9FrrTzwAfZOuZbKepy4nC4w1VelTDTXPX9glR4E8YhXT65JK5mP16SH21ICwXss5qRc3xNMZy6Wyp+eN50f0o+2R3bDmZCF1VLs8UgSS6tqb+ryq305RLZBHAAC91voTD0DvLFbZU9x6jdD0tniOY7HS+9UYvfzWX8gjxiqiKJ44z4/kz8tnw32jwviyfFikLLa8qRYixXH+aErt8+xVbfFUWI4ln26hzxK9mE6M9VqTOLKutNKcLISOapdHJnGs+3zhtlnqc+Pl6qL4fS0AwCeg6YMOQK/pp0f0ciNnv37S3HiI2nqgulxFtFKcx6zzl/J9VYX+k9h6IVJViT6F/PB2WdtNOmKfJ34x4XT6LKulLpxmhOnNyrt8fYTeaW4bD+D7HdXiqHRr5Z+0ts+tWyXeiCDyCACg15o+6ADgkRn/Wokxv7CVDVc+9ZPOIyrJPDw8EEkAAP3S9QcpADiq6RRpUmMj5kzHYOV5JEmS1WqV5xEAAI4feQQAhiHPI2pjuVzm68Q+AABw9MgjADAMKo/c3d3lkSRJkgWAvlkCW+n6nbsr8ggADIPKI2/evMkjCQAAfUEeAYBhOAcAoIfIIwAAAAC6Qh4BAAAA0BXyCAAAAICukEcAAAAAdIU8AgAAAKAr5BEAAAAAXSGPAMAwnJ+ffwcAQN+QRwBgGFQe+ec///n69etff/31FwAAeoI8AgDDoPKICiOvXr26ubm5BgCgJ8gjADAMKo/8+uuvKoxcXV39/PPPPwEA0AfkEQAYBpVHfvnll+vraxVGfvzxx7///e8/AgBw9MgjADAMOo/89NNPKoz88MMPfwcA4OiRRwBgGMw88mM2P/IDAABHjzwCIDMbj7TxbKeqXp5FdhXejm0q26KSXc67D6pPH/P05BEAQB+RRwDkYSS+XOdup9EoOnu5fW1XL6JRfFG3Y5vKtqhkl/Puw0X8qKcnjwAA+og8AiCbR5jMF8WfkuV8UgUSPW9SftOvCkdnZ+5eo2Q0jq0Y4NTgVei2xH65Jo+kLRmPo3DN1iE157UuKb3ymbEdPLz5qDSPxONgR1ldalxINVVlFGgx00IeAQD0EXkEwH1yMz01B9+L1Xq1TNItNTSOprfFpEk+Ik4H+cXO9WUVXHTJ9TxWI2kjOSxWt6r6yeV6tTCLXcbeLEz1YnW+mjyStSSeq9KBmo1DhAuRKspeNreLotLhzUepPOIfFurS8kLU68VUVVUgWa6ya6xHHgEA9BF5BEA+3s1zhP0F/ywenU5vkvti0iQuA8JknseVaxU04llRsty5SNNNYL2WWcychclVOeg+mcdODJHziJ7WkWq2zutdiFWRejWrKI1menteBhvx8Maj0jxStKk6LNylxYVc6MPbpZAKeQQA0EfkEQAFlQbcB0gudESpcoqZC/R2uqBIhwWdJUpyMRVmohdXbiuM5+rb5JFyj1hzVUC6EKsi3RJzO40G2bZ4eONRaut0en2v92ZNaerSbDopktvZgDwCAOgj8ggA93egqi/u0y/4y8fc09VE6Xf9Yh6xIoiVDcLFZnrcbrSjWPS0vi3nWFrmEbFmK494F2JV1JhH/MPb5BE9E6P7pKlL74vZqsCStjrkEQBAH5FHAGQLnKwHrtM1Rdf31pqq9LEH96EMY9suOQrkEauYXrhUMh+rTw+x5w7q84hYc6h57iC/MVmIh7fKI0UgqS6tqUvN5l14ia0WeQQA0EfkEQDZUq1LYx1RNL0tZhAWK70/mt6U0wJCHjGWGUXxxHl+JH9ePks8RoXxpTNNkSxvqpVKcZw/mtI2j0g1W83zLsSqqCFZSIe3yiOTONZdugi1xLwQ4+XqQvh9LQDAcJFHAGT00yPOcia9Xz9pbjxlbT1xXS4zWinOc9j5S/m+qkL/UW29UqmqRJ/Cf7rb3ePVbBXwLsSqSO80t43n64XDm49Kt1arzbrUuhPihQSRRwAAfUQeAYBhyPPI1dXV/8vkkQQAgCNHHgGAYTDnR3QkAQDgyJFHAGAYVB55/fr1zc3N1dWVjiQD8FOpZbH68jWv+jWItW16IgBAPfIIAAxDnkdevXqlIsk1gMO4qrXpsVufay/lD9Ew8dj68oe2e/sP1Fd7KX+IhjUeu3fkEQAYBpVH/vGPf7zO/ALgMF61Q9seoWGf2vUOuG3kEQAYhnMAAHqIPAIAAACgK+QRAAAAAF0hjwAAAADoCnkEAAAAQFfIIwAAAAC6Qh4BAAAA0BXyCAAAAICukEcAAAAAdIU8AgAAAKAr5BEAGJ5/aafrZgIAQB4BgAFSWeP3JuQRAMAxII8AwPCQRwAAfUEeAYDhqckjP//88x//+MdvvvmGPAIAOAbkEQAHMxuPtPFsp6penkW7VnGAs6XllOjsZbtis2JjPD701YTySB5G/vKXvyRJUptHnp88+fyr78s/ff/V509Onh+ywe147ah2pFtK1Wj90pE0/kiaoR2if9pW5d2shmLPi42Tk+PqQwB7Qh4BcBhpGIkv17nbadQ4aq919SIaxRf7a91ezpbmjIm6xNUyaVXsptxQ1qvF3porEPOIGUYa1ms9P1GEsX3Hwu3wXzm2PHJsOswjmxbjDgJDRx4BcBDZIHxejrmT5XxSBRI9b1LOEajC0dmZu9coGY1jISG0r6f2EHfbKyMfq//oBK1QMS2fJ9GV+/XUNrIdlTW++eYblT5UBhHDSG0eUeM/lUWeV4HEHBA+P3lSMIeIeq80bmx5SHbar4SKypL+9+NFw3RVusVG5VmZk5pq/Tab17vFtacXkjbVKtZcj19hdjliY8xTuKdr07Fu/zzPdhUH5PdfbpLULe5dcC7K2e/frPpiWj5PoiuvvelCrwI4XuQRAAeR3ExPzaH6YlVOI6jRdjS9LSZN8lF2Oh9R7FxfVsFFl1zPYzU6d/JI9eplXBwSqKfpkLLiYnuxulVtn1zaUxjesVUxc3okXCy94KL8tT5pmjSKWaSySUL/JMtN51NU1lC5Q6WPPJL4YaQuj5TDUWuAWo0SvX3m6i57ndd9i0OcJVd+PVblzliz5it066W6aoVv3+U8stmFuGPipnqEc+dVh/LIE7MWa5jeqmP9rtMB1EiiTp1yr9VOZDQc26aYUL/XSw3VAzhq5BEAh5GOofMc4Xz5H49OpzfJfTFpEqcD7jQITOb5sP5aDdrjWVGy3LlI042dR8xXy8kXuZ7GQ5w8Iq7Xajq2TTF/w5xFKhKb1D+by9dr6Ujih5GaPFJ9O64HztZY2l/1Xw2wpQKhQ8yvtb3RrDR6r3t+pOV6LflCzFN452m+9toLEeoU65FOXdOY0AxO+44VqipyiBRHvPrb5pGmY9sUq2uzWUP4hgI4buQRAAekxtjuAyQXsbN4KRQKsqmDcrSfqGRjDf2tV1X2iF5cBerZ4pAtjm1TTNw4nV5bXSb1z+b08yN5JPHDSDiPFA8RWwuK3MGnvU7GGhwKa32EQ9zVOG2HuO5Ac6c84jXAP7bx2hsvJFinuGZJ6r+N88iGHWtNOtjr9IT6y/a1zCONx7YpJm4EV5QFOhbAESOPADiI2dh64qH6rl+NtyflY+7r4llwMRRYEcQa6N+7r87iUYs80v6QLY5tUyywYc+ASP2zue3//RF7pFeM/8UBtrXCpmZ+pPEQ49SPOj8S/go9ONrf/ELqd/q9tYf5kXYdK1WlNq3fMRDqPOb5EeZEgL4ijwA4iHS1kvVkeroM6freWMaUPykReojDK+k+P2K+Wi5xqs8j4iFpgij2ZT/LG1qv1XS6NsX8jewpmyKQFA+tS/2zua3zSDoiNUd1+SjPeMTAmhkQH/GoWa5Vf0hgjL2P50eaqhW+bC92fa8fztjuQvz2BOrxyulNqTHhxLTxsx7uq0KclPqqqVUt29OmmDyV4/RS/Q0FcNTIIwAOY7FKn9Cu1h1Nb4uv+hcrvT+a3mT7AjkifRQ8ygvGE/f5EbOe+HJVV0/dIemjKVHRmhfTiRETnN/Xajhdm2LC/EuyNHvjNn1oXeifrX5fqw3vODeOFGO759Yw3lrKVRUL/rRR0yHSui93AU9eMPT7WuIQNz+q+v0or9rQDz2Zp3yS/TBVy2sXF7B5TQ3WE6xQaEzdDE7LjpX6R3gDOHVWr0pdVNZZf6zYPzXF5Ltc8/tatTcCwPEhjwA4GP30iLPuSO8vd5q/H2X9llT2UPw69C92VPUIx8q/SeUdUp1DtUYfku9zDq89XZti/obYG/X9AxxOKI4AwCGRRwAAQDa3wTonAB0gjwAAAADoCnkEAAAAQFfIIwAAAAC6Qh4BAAAA0BXyCAAAAICukEcAAAAAdIU8AgAAAKAr5BEAAAAAXSGPAAAAAOgKeQQAAABAV8gjAAAAALpCHgEAAADQFfIIAAAAgK6QRwAAAAB0hTwCAAAAoCvkEQAYnn9pp+tmAgBAHgGAAVJZ4/cm5BEAwDEgjwDA8JBHAAB9QR4BgOEhjwAA+oI8AmBgXp5Fo9J41nVrgtJmHq552+eR77/6/MmTk+fOHmuHVz57tSqWVfHkyedffb/nq6qjTrrhCeuv63jts93PT3aoai8N2aKSDm9cy78Lj3bGwx27L5u2YYPyXtFjuN7c8bSkP8gjAIYkHeVH09t17jIejaKzl103SnT1IhrFF4eqfcc8YiWSTcdgffks7ks7XcPKIz06b6NjyyPHgDyCdsgjAAZkNh7Fl6tlUvxxsbqdFrMQKqhEZ2djf95kVu7TwWUmlKoKj8+K+Rcz6HiHpKcbjyO/krJkNI51HjFmdPLS6Wlmup6zl5vPpeyWR06em+NU67NVvZDL9xh/LIrpPZ9/rg9z5i7MCs1tfaj1Ue6cMa/t5ORzp1h5jraVe9XWne6rr4TS1ZWW1xaqM3/p5Ks86lkTRy2vziiZvVp1rHdVcp9LhYvyJyfhS5N60r3RfhoN9oJwi835tfp+Ti/cu8V1fS42RrwRm9ydYGvNwtbLaY3Pje2ayuvqNC+q3V+fLfp2l1tZ32PBm2X+PQr/58Uvb/5FcAo7f4n8Cwl1iHBRW/zNfeJVgmbkEQDDMYtHp9Nrc09yMz0dxbN8OqKcObmclGEiHejHl+VcSrZTZYG8mI4yhot4VNaSzr0ULwuHZKeL52rfamE2sCy5nqc1ZXmk2qePX8wnRQNncTS9SZLlyq6n0a55xBnZlptqZ/GRrLf89Vp64/mJLmyNdeQBlXhC4TzCirJib00ekSqXvsMMXKC3U+oUoalWxWUt6abbn01XZzesGqyW/drY52LhvDKv0XV3+V660U1nMV4N3wW5n50Ld29xU5/7jRFvRMPdCbzba3rJuIv5YNh7y4UOqut5p//d69pH3+5yK4MXVXOzvJebbq70F8HrGesvkXQhcoeE/pvX/r0hdQraIY8AGA4VF+J5Yu1K1MA/HfanAWEyz2dOrouMksWRyTwf6C/UkF+9nEWam7RYspxP8mLWCcpaFirp5KFBOiQ/nRshVMmyDYssKF1UJzYbqwJJnIejLI5s0RO755FqRCuNeaqP4Zo8UtbgDo2DAyr/ARBzZ3l2+bO+MY+IX/8GR1nCBcrXWNtU61X7e/DvN7q64HyVVyDQ54HanAsuY87WnRBqs12bSaxNfsv5t7i+z8XGhG6EuLPFu12+BHN2ytzWDW669TWdvMU7vH3fNvSeuWfTv63t3u0NN7f2L0LzO7O2q4MXteF7o64BCCKPABiOi9h7JCObAbmwH9fQ22rDmU/JZ0AqztMnF8YETBYeZoFDxKdDyrZUh5d/0Ou9ijkTFZnSdVpbx5G95JHy01f+lPcGh8FRmTc0Dn1wf6+XVfgroIz92+QRqfL6kV59hcLwTWqq9Wq1xxj5t7s6e6czGLIXhwT6XC5sxZai2o06QRp0+WexLyRwF5r7WcwjNX0uNiZ0Izbshz3kkdpbv3Ee2VPfNvSe04yN/rYGXg3+x6H5b4cbk8Kd5l7IZv8J2uHvCFojjwAYjoU3o6FnQEJ5RJgBmVyutepZlPLV6MWVrjrPJtIhYh6xIogOJ2kWyVZ2peu1ijmTdJ1ZFI+3jiP7ySPFR+3zredH0s2TE29o3PjBLa2gCLTQ3NtuVFC3xGfH+ZH67+f9AWr7qxO/Fja+uW3s80Bho16z2l06QThLXX9s8R2+/Kp4Dr8xoRtRf3cOMT9Se+u3yCN76duG3pO0/dva7t3ecHO3mB+RLmSz/wRt+N4I1Yla5BEAA7JQw3jjEfJ0qK+G9OmyKTGP6KdL7vXv76aRpnx2Y+z9OFc2FaKfOS/SgnSI/OtZdsl8LsRcM5YeVbyeBpLR1nFkX3lEf2FYDV9rV9SLn/V16zqy6r2vqI3tujO67XbHlg2VS/U0nM4acLqDHHkIU1UsfEPf+urskk+8L2nNfhb7PFC4GqvZIUVaWu/1avNQ2W5G/V0IDOfsC3cHfnV9LjdGvBGb351d80jrd5oc+jZ8h7fv211uZdNFhd5N1t+jppsr3jS3zXXTH+HsIF/UVn9zySObI48AGJL0ye/Lav1UfFnOcIh5JC2uS0fT2/SZ8YW558aeHsnWa03iyHlVOCTwa775D35lBeNJPheSLG+m5c9rRXGs81GalcqHYbb6fa02hCPFLx3tLxvt9Rt5YjEGEu4Mi/C5/H25LCL7kZtq+CEtDtG7w+usir3mIK1N5WXLrXq8CwwOM7yGCXvMavWP75ivtrw647KMnxXSV2r/1lBDn5uFn1e/ryW2qqpH6lWhAwNNcuuVfwOqvp/TXznyF+3U9LnYGPFGNN6dlq3VHdKcRxpuvVCncF0N7/At+naXW9l4UfLNcnaa1yuWF/4i2C9ZoUa+kHBA8y5q8/dGuCWoQR4BMDSLVbV2Sj9Rbv5ElfVzVbq0Xprl79HS9VrTm5X3qndI8Bex0heygkpRotxl7UwzSDyXGtwr8tD4EIQ5iWPyiM17vD5/XPsZ2ok34sjfPIfHsDnok39vPBbyCAC0Zj4/ckDZP0hSLDTrr+wrwsf4KC++/zzqUcMjjWoerc8fS/Xd9p6uizyi7b1vB+nTfG90gDwCAK0Zv817SNmMyWOcCACAzpFHAAAAAHSFPAIAAACgK+QRAAAAAF0hjwAAAADoCnkEAAAAQFfIIwAAAAC6Qh4BAAAA0BXyCAAAAICukEcAAAAAdIU8AgAAAKAr5BEAAAAAXSGPAAAAAOgKeQQAAABAV8gjAAAAALpCHgEAAADQFfIIAAAAgK6QRwAAAAB05XcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwFH6//ftcDMKZW5kc3RyZWFtCmVuZG9iagozNjcgMCBvYmoKOTk5MQplbmRvYmoKMzY4IDAgb2JqCjw8CiAgL05hbWUgL0ltNjAKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzY5IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDk1OQogIC9IZWlnaHQgNTM5CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BMQEAAADCoP6pZwwfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgKsBgh23sQplbmRzdHJlYW0KZW5kb2JqCjM2OSAwIG9iago1MjQKZW5kb2JqCjM3MCAwIG9iago8PAogIC9OYW1lIC9JbTYxCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDM3MSAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA5NTkKICAvSGVpZ2h0IDUzOQogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDIgMCBSXQogIC9TTWFzayAzNjggMCBSCj4+CnN0cmVhbQp4nO3dy4skWYIf6vqHZlOzb2Yh6NZCgkG6xSyuyFVp0wOj16aFFupGUDVNcxdxYR4kc0FEgqYWUQilR1PDoFBLWUHRCEbZyoyEWswmsypzaBrqITJeXTV17eFmdszOMbPjHu7hkRHfh1PlcdzsPMzNzX9x4rjnd98BAAAAAAAAAAAAAAAAALfH3wEAAJOEZwAAyCQ8AwBAJuEZAAAyCc8AAJBJeAYAgEzCMwAAZNpweP6b++9+//vv3v+bfsmPf56773LLn//4+428fecqXHf3uAN111Ye0SqKJnqHEACAG2Ib4bmXLacDZPrRK6THKwbmYVXvvjuoruzasGy0A8IzAMDtsoXw/OP799/twt8a4fkqAXjD4bk/lirXlkXCMwDAnZQRnv/3X/9//89P0t7/s8X/7m27jIvF/1IBcjkv/f1mZUe7OqP6sd6y26YfU8PyNo8Gyzuq0lSF6aa7bNwvjcbyN2F6LrPzz3uRuG2xLkl1oCnruh13plfTj7vw3A1QnAYA2L2M8PyLP/nDP/i/0v7gD//kF71t22BZxcxeSRUEgzXN1d3kPG18J9x3tMJkYJ5uuomkwePRWIL0XA+qq7Z/r94qTuzDLqQ6E9wL+vXzXooWnwEAdi1r2cbzo/83kZ//4A9/Nph3HsTJfpodTtiOZ934znx0zKtwuGVvFnps9Uibnpe/EKw2oqiJ5F69AbY/JDM9AAA7k7vmeZifU8n576LoGM7T9vJhEEwzwnMYQqPmvv/9eKXEoML8ppNjWabnZjK9173QxNT3TGf6Awy36NZtSNEAADu3wgcGu/w8kpz/bphCex+v2/jMcy9xrjfznBee611+3kxAp6tNHYH8zqRnngMmoQEAboDVvm3j+dGf/NH/PZqc/y7Kk71vrhtbeDy+sGF0zXMTOHvfCz2xGCN7ufXIWOr532W9qTXP/T6nVoNMdya55jmsSngGALgBtvFVdT8fFEx85UUYr6fCc/LbNsLqfj5YS5FamJH4to3M8Nx9IHG4cf/rNcZGNDqWYIa5KXz3/n3ftgEAcDP557kBACCT8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc8AAJBJeAYAgEzCMwAAZGrD82sAAGCS8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc8AAJBJeAYAgEzCMwAAZBKeAQAgk/AMAACZhGcAAMgkPAMAQCbhGQAAMgnPAACQSXgGAIBMwjMAAGQSngEAIJPwDAAAmYTnu+H50f33h+4fPS+LDx7vunNpbd9uSCeDbjw+iDq01U5e9VDk7bZGK1sbdeIIX59oVDs4A8f7kOzMxnuYaG55Dbl/cLBaWxt5IV/DU7BOE80xOXo+rOR6zpnpVtbow6q7RG8sy0NxQy7arXXGlbF9vNmmBn5jD+Dm3oNyL/I37VA0hOe7ZXAe3tTTsnTTwnNAeF6p4jUIz6uF5+23v367G+nwzQzPE0fp5l21slw1ZBYv3Co+37ThC89XJDxHhOe7JRWeDw6WkwbBA4+nyoZXy7gwrL//cFFSTV01BWO7B+UrdbJ76OBo2Xg3LbTCuOLCwcxz06FuXN3uEx0rx390dNDN0jwO7qd3X/tQtFUHc4XpJzGvleGzOfvcNWNKnwbtYRh5/gZHePrAhsc/vL/CSZs6XNNPx7DX2c2NDj+jD8lnZ37Iee2OnHKPw+f0cfJUH3uu46pWPSYrPgXJR+MzMO786Itrthvta/dqV62sa2Oiz83G0RVv5QP+OP3TCpPbzc+z18PkM7LGW0z+K27m+hwe2JEWcy6Amxl4xttiW1vWK3owjJ2+BwWPZV3kpw5p8Fh5txlB8zvcVgnPd0siPDdnWXC+tXeTSxUGb9TRlq2gxt7vrb1Xwuju/V3yOhk23exT3u3GENWTHFeqsP/wsO3+o+MdC8ZfX0VTlQ93zz4Uo4Xd1T4V9rMO+NizOVZLu8foaRBX3Hv+Uqfg/NnSu7/CSZs6XONjSnc7u7mc53GsD8l954YcVJJ3/sRPceJJz3+uR18j/RbHj23uUzB27YrzZPR4xjk5ftjznqb5c3j62pjscxBvBle8+avKuidS6nlpfhzOPGc/I+u9xeS/4ib6M3Fgw7YyLoCbGvj0G+rcq+YGvwf1hpN1kZ987Ve/CbRHottj+9lZeL5jEte6ZOQI51LiwlZyy6Tm0eFvkeO7Jy9QM50Mmwv3ad9U4qZnxxX1J6qovJ/bsfBlHd5P9ic6aHMRsV9PW9huOvkL+Uwrg+Mz/96Rktpx+k2xu593trweey7CupOnd3y44sqThzpZ82Rz88/jeB+S+84MefYoRYPKCc+rPteZLSZrXucpSF6R8k7ddHaa7PNgxzWuWrPXxpnDEl3xptu9yonU60BPlAKzn5F13mLWeMWtemCTMp+RKwx8jTPwzXgPGh3P6EV+9rpR/f/xQTWdvnwzvobsLDzfMbnhORT+pjz4887IloFgi2R4Ht99/tU60XTvchTl29e911diXKnCXnieqHy6YzkXrmj33OAU1Nl/ovtTGyNPVkZ4nnw2ozH1n4/RHdPhOTrCmWdL4n7GSTt2uHIO9fAYrtjcSBbN6sNo4dxTPDuozPC80nOdf8ZmhtJED0ZPkkSv4pdmVnof6fNEPzMvDrPXxqk+T1/x1joJJ06kdJ/HOpb3jKRbnHuLWfkVt+qB7cm6AG5k4GucgW/Ke1BXkneRn3nt17tW/11ukPxVZfOE57slNzxPnnvddXp6y2AyJH3+T+6+wq+6U12MXmXxBqmd4sJeeI46lNuxnAtXtPsKhyL3t/7EYDPe9yefzbGm5nYc6V30cN7ZMlLh3EmbN+s7ewplNjf/PI73ISN4j3Yw//zJDM8rPdeZLSZrzn0Kxp7cFU/d9NAm+zzYcY2r1uy1ceawRBeW6XavciJNdClryKlnJN1idhDKfcWtemAn+5x7ok5WkhzFGmfgm/YelHuRn3vtP66X+y/fhtv5560Tnu+WrPDcPy+Tf8lp7ie2HK08/dvo/O75new87pZYTfc2Oa5kYb/p5d1UJyc7NnvhSt1b61D0Cuv+jjyJWQc849kcdqu+O7vjSHgeHuH5Z3xZVO7RXomzT9rE4UqNaaoP+c3lPI9Ta57Hn53Mp3h2UFmZecXnOrPF16lTIvc0yKk5Kk13PnFOTtWc8zTlXzDTW070OXXFW+OAZ55II31Oluc+I2u8xaz1ilvxwKZGOnEB3NTA1zgD34j3oP5wsi7ys+N63K33ry7+15Odhec7Ji88L0/H2T82jWzZq375YPNh2+E1YWL35nWwSieDapcfXJ/9to3kuBKF/Zdw8zHhpvLcjs1fuFK75x+K8Ng2hz/4pPPIk5jVSuLZTF+rhv2fOQ1G3iaGR3jmwHathFMPq5y0icM1PDKjh3pY70xzo8PP6MPcrzZTT/EK50/UXPLdM+e5TvY8bnHmlMh9CpJPbqpX0ZZz5+RMn8eO29wR6+86e5aO9Tl1xZtuN93D7jhPXwNH+pwsz31G1niLWecVl3NgU1e2rAvgxgY+fWmdfdXc3PegcDBZF/nZVrrfiINEPnZmbo7wzG00MVcCcMu44sG1Ep65jbyVAHeHKx5cK+EZAAAyCc8AAJBJeAYAgEzCMwAAZBKeAQAgk/AMAACZhGcAAMgkPAMAQCbhGQAAMgnPAACQSXgGAIBMwjMAAGQSngEAIJPwDAAAmYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc8AAJBJeAaGfvXe22+F3n7vV+tW9eG9Yv97HwZ3AOBNJjwDQ1V4vkJiThGeAbgVhGdgKBmeq/T79r17bzez0R++9/ZgYjqcsV4WmnkG4HYRnoGh8fBcly5DchWFu1Bclg4js/AMwC0jPANDgzXPdSKuZ56H4TgK2nXGbncTngG4XYRnYGhi2cZEeA7mo7tthWcAbhfhGRhaKzyHO1m2AcBtJTwDQ+uH5yAxm3kG4DYSnoGh4fc8D5ZijK157na7dy/KzMIzALeC8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc8AAJBJeAYAgEzCMwAAZBKe74i/BQDgyoRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc/AtN/Ns+tuAsB1EJ6BaUUw/m6O8AzAHSE8A9OEZwBoCc/AtInw/Pz58x/84AcfffSR8AzAHSE8c91ePNrfG9h/9GK1Op483Hv4JK52WDbSerVZcvvMSvIlmluOf//hw9Xamu75No2F5zo5//CHPzw9PRWeAbgjhGeu22cf7+8dPrsMXZyfrlbH08Xe4mlc7bBspPVqs+T2p+cXlxdnq/Ulr7m25jL6lsO/KKzUVlzVdUmG5zA5W7YBwN0hPHPdxlJukSr3Hz16uJyM7qZWg5nqtrAMz4uHvcJetU/iaobl1faLwXbhpG67bXKCOtnVYbvBj8ua25L9R0/CCeSg/EVy1HFVIyMd7dv6imD80UcfFVG5CMzJ5Cw8A3B3CM9ct7HwXJbv7R+/Kqeinx02KbIIh8uyy1fHbWgswvOyuC0Mqm33CfaonV28On5QTvxenCWb6yop6lg8GzY73dWgr88WVeGguaLmruT887atMg0vG1vuGI86rirZ4mjfrqIIxkVILqJynZ/j5Cw8A3B3CM9ctyrdJZY8V8s5TuoFHJ8XQXFRBdazi3ZRx+lJu1ijCM/LTU/PTw6rTYPcu9h7cPyy92C/9XbZRtRcV8nTJoymVkmku/qk7dTrs5NlbI1XicR3qoUcJ3ULy+GmRp1YcDLWYty3K6mXbbT5OU7OwjMAd4fwzHWL1zzXOTGcke7PTncLKLrw/OD48+Wjy/XPvdw7/mnE5JrnRGE507ufrGFs32r+uOlzEVv3P/4sLzwXd7rRdIajTqfu8Rajw7i2ds1znZ/j5Cw8A3B3CM9ct6llG3HqKyPk4mS5gOFBMPO86Nb4xuE5DOf9TyPmhud6xvmytyJiuqvBxHg1J7xKeB7OD6dGHe843eLEoV6R73kGgJbwzHVbKTyHSxrKwmWKLSeXF+0Xv1UbBJPGJ70V0yO5dzo8hzs+XcbSma722m1WjuSE59OX3eqK+sOAyVGnpsenWpw41CsSngGgJTxz3eI1z/WXQqSnc89fdqsnFosmZJaTy4t6dcb+8atqRXKw+9nFs2blxv7xy/7X4FVJtf22jdHwHFRRxPRng+/SGwmowU7NLnFziQx8eh52uBhOctSpnida3E54znHldgDgDSA8c93a5RDhquez/gfzgvvd5sE3I5cfqLu46K3K6H2u76zdJ/oG6bq+MqAmmgsKzy56vYvqSHQ1bPcs2LTXXKqtuMOpUad6Hrc42jcAYAOEZwAAyCQ8AwBAJuEZAAAyCc8AAJBJeAYAgEzCMwAAZBKeAQAgk/AMAACZhGcAAMgkPAMAQCbhGQAAMgnPAACQSXgGAIBMwjPcOC8e7e89fBLeWXN/AGDDhGe4cT77eH9v8TS8s+b+AMCGCc+wTS8e7e8/evRwr7L/6MXrJ8H9paZoOVsc/Fil4EX/4dQu/cL9h4s6PJuBBoBNE55hm8r4u7c4uSy8Oi7uBveXsbaIvPvHr4Kys4tXxw/2Dp9dXpxVe9ePXj47bAN3u8vls0Wi8GRRtlOE59Pzi6KSnY0dAG4h4Rm2qYi/D45fVgH29OXxg/b+SZN6nyz2isLTsuz85HBv8eT1YNnG4cl5+ejrz4tEvainphdt4dnJYVdPW/iy3NSyDQDYAuEZtqmIv/sffxbff1qE5+r+08VeqErCyTXP7f1yMUYbjYtIXdXTKyyjufAMANsgPMM25YTnw2eXrYty8ng6PPei8ZNlPb3CXpIGADZIeIZtmg3P3cKLatVydW86PPd2aRd99OvZE54BYCuEZ9im2fD8+uziWbNyY//4ZbVquVwd3X3bRhSew10Wzy7qhc7V5wz362oWhw982wYAbIXwDNt0en7RpNve/bOLy/B+sGZjuWX541n4dRm9r87odgm+TKPeqygrVA/4tg0A2DThGQAAMgnPAACQSXgGAIBMwjMAAGQSngEAIJPwDAAAmYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AxM+908u+4mAFwH4RmYVgTj7+YIzwDcEcIzME14BoCW8AxMmwjPz58//8EPfvDRRx8JzwDcEcIz2/Tk4d7+oxfjj794tL/38El4Z/UG1tltpr3y0cJk10fqiyted2gbsKGmx8JznZx/+MMfnp6eCs8A3BHCM1v0ZLE4XExF0M8+3t9bPC3unJ5fXF6crd7C00W9/6rahlPKzHn47PLy4vx05friitcd2gZMjjJfMjyHydmyDQDuDuGZrSky6P7xy5N+en7ycK9WlLb3Hz6p50jLPdqN2x+CzaI2yvC8eBg+3M1F92rrt77/cNHFykH9YQ/bSeig+XA6t72/jKmproaT0vuPHk0MJm6r3+eH3XiihhKVTx23lRTB+KOPPiqichGYk8lZeAbg7hCe2ZY6O5+enSx6WXPx7LL0bFGE05evjh+Uc7wXZ3X4PH153ObD5e7Vyo/jV8Uer44TaxCK8Dx4+OzkcFnFk0VVQaet6rLo094yPEf1n100vTo/7fbomg+nc4cTzt2+3VRzb5umumeH0aKQVFvDPu9//Fmyz8nKU51ZSxGMi5BcROU6P8fJWXgG4O4QntmSJvyWaXZv8WRZtHd4Uie5s4synA7DZ5ee2+y82HtQR+DT87aiThGeD0/Oew+fLee64+zcbvv67GURK6uGU/V38bjuZbX36ckiXpgRr9aIV0r0Hmo68HnZfn8sqbaGfa7D81ifo8o3umyjzc9xchaeAbg7hGe2I1iCUGqy3IPjz8OtoszZpOc2epdTy4HhdO3TRVdjs/7586qKKDtX095Nkmzjaar+fuZsVz/sbSA8Rzv2Ddsq+tyNr9inDs9zfZ7ozFraNc91fo6Ts/AMwN0hPLMVVfit1yDU6wjK9Fxlud50axzz6vT8pMnO1dTys8vW8DN8ZWAO14Q0VSweDrNzMJ0bbpyqv8ucZZhdnCyXUjzYbnhOtVX1+UlXURueJ/q8xfA8QXgG4I4QntmGIpsuTrqcu1y5cfqyW6xQf4wuEfPK6FtOpy6jb7lrs4Y58b135SRstCakqmKYnYdVLed2U/W3nQnXmZSF1cNloF3uUU2vbyg8J9sa9rkOz5N9nu7MWoRnAGgJz2xBlZ3DT6kt497p+cWzZsnB/vGri7MqTu+FKfp1HbEftNH3LNzl5fDL48pJ2MWiq/B1W8XiJPqeufITdPVikv3F4YN2WXNUf/AFei+Pm9Un+4vFMvmftYX7Hx8fxjPnD/pfcJEZntNtBd1bHDdrnif7PN2Ztfxunqs1AgBvBuGZLShC8uAbHtpPwxV3wgUY5ZcgF/fPwi9Dru4HKXmwS1TvxcXw0Si8Bx2rty13atqL6g860+zQ26UtvDhvtux2aUbUa3OwTfrLn5Ntdd17WUbik9N+YarPU50BAK5GeOaWqZZS7B+/vB2BMfzcZTC1DgDsiPDMLVNNtq7wbwPebN1s9C0aFAC8wYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc+wOS8e7e8V9h+92HVPAICtEJ5hY8rsfPjs8vLi/HTXXbmi50f33x+6f/S8LD54nNg2KkxXucpmmduv2d5ygMWYVq5vvY5daTir9/aKrnrwt1bp/LO6YgtbGekWWtnUyyFdz1TtxWPlibexA7Wsb1vy+7n+iDZ99dj4SZhorunzwcFqbW3kgry9i//WrlSzz6/wDClPHu49fFTPI7cTyUU23n/4sCx7+GS5TW3wY7394NHZ3esNHj0alsY1p/YNy8IKww3WMLg0XUPSuJ7wfJWUdf3h+XoC3tbdyGHctfC8+qO3NjxfZxMbu6yt2NxEydpVbc81H6XZbkwSniHl6aLMqsevLi8vny2WcfSzj4vkuzgpii7OqqxaP/7quI6oZxevjh+UM8/lxHP06Ozuyw3qwstnh01SLhPw4tnlZd2TqjCxb1m23KorPD2/qNpaXyo8Hxwsp6KXD4TbPG4em55dGd3scVd3sq3BNokeN4/2ZlgGu7Q/Vm/iwSx7YkTD63nUei8LND9M1JmsfGpc/d6mO1AOdrhj3IexIx8XJjtWttKM7v7RUe5Tk3xGkj2f3L17stqND46WQ2yegOnjmej2yDFPHrr4OKzXyujJH/S+vNs0UWzf/NFnAy+H0We2eTR6Zouyg8fJVnpbl919HNwfPZLtC6Z6bLnp5CjST0d8BLozJOtApc+W8Wc2vWXO63HuspZ/Cc163Q2bexz2+fHkqIeHOq5q/GCm+9Yf4NRma138ezXHl8GRq8TUZSf3+RWeIaUMz4cn1fKLs5fHD6rMWobbw5NlGH2y2Htw/LJ8/PT85HBv0aTrxdOpR2d3X7b5+vMih1eF1VKQ5V5nF3UwT+xbdniZtq8emTuJ8By83XXvgV2eid8NoqryNku2lWw20G1YXfPa9oa79DoTRa+p8Bw3HKTn5d3JOkfC89S4Upv1d5g6EnNHPlU41mLw60bmU5N8RoJx9d6Po92jfvTGEr6/DY/tyJM+cfZOH7rUcVinlamTvx8ru/qaid+pYx4WJkbSHvzREbWPjlQ4cl6Go856cSVeJNMv6vTTkehWd4bkHajJ033Dr8fpy9oK18YVhzZ1/YmHkXvhGhv16Kk4d1XP3GzqqRu9DCavEpOXnYzLSHFXeIaUp2VA/by+f3qyqBJql41fL6emO226rjeYfjRjg/Z+caftyMS+1bz3/nB1x5UlwvN4qky+fyf2zdssHTIHb7lx7GlL2n1SuySTd/LR+fDcyzyp/JITnifHlXpv7XZJjyV5WJJHPlWYbvF5MK+eOYTkMxK3MrJ7Ml8G4TmcDIrmpSdrG382xw9ddBzWaWXu5F8mt2p6bhlnp4958gAOOh/sM/rMDqP11Gt/eBwG98dOsy48378fbjH9oh4b0Uiv8g/U1Dmw6dfj9Mt/5Uvo6kPLuI71TVy45kY98aRcabPJl9voJX3iKjFX5+SjwjOklBO5H39W33/xqM6vw/R7WC+TqFSfEeyF54lHMzYIw/NybjnsW7Tv63rGube6YwNWC8/NBFT4N7LRfec2G71+hvq793vbXOxSu0Rb9v5WuWJ4bq7Kvew8WudVxtVrOvle0DPsw9iRjwvDFrsNZ4Pc/HGeDM+p3cfmpvox43GbNDM7MxchEk9ffBzWa2Xi5F+Oo/rvcpf85B8drOTBHxl4dAA3Fp6jk7CsqPzdILlJ+rCkzuSRQa9woNIneUaX1ng95obnlS6heUObuJPK6fMXrtlRbzE8j7/cRsPzxFVirs7JR4VnSKlmd9sP9u1XqyR66ffspF2VXG5Q3es2mH40Y4P2/unLZgFH+wHA1L7tndf94H9Fq4bn1sSf5DI3G71+ZsyW9PZJ7dK/PC4fznyDG0sRj9s3o8k61xhXerPpmedUHwaPT0xCp1ucDc/JbsTPSDyukd0n3l57A4g7Nlfb1LOZPHRjM89rt5J+Ch7XazSX7/Ht/HPOMb+BM8/JI/k8+lVz9kU9fiZPl2S+cNLnwEZfj/nhOexCzu8Fm5x5zrxw7XDmOe/Apg9i8reb2XeH0UeFZ0gpl20cLpbftnH8sprc7aXf12cXz5rlE4kNph+d36C7f3oebvmqXM2c2Dco2ttbPKtno7f6bRvxVWvwN66xK3/mZiOX2W6PkewRBNgoZsXhcNjK8M/xZdn8m069WbhPVGcq9XWVT49revjTb9ZhH5JHPlk41uLkG2VyCMlnJNHJ9O7BFvXdwaTQ4IjmH6iJZzN9SqSOwxqtTJ/8zbC6mqY/xLrGy2H0md1CeE4fyXbL5+Fvmzknf/h0JB4eniH550NUyfZejxu5hOb3YSoDzx660V8xck/7zOFnb5Z7Je/MXCVmxzLxqPAMKeXs7fHLi2hdRPhJvLOLxMKJdoPpR+c2mK4qUdIVXaYrWctK4Xnir6v5m7WRYfQy2+6d+qPjcvexb9todhm8b7w/3KUt7Ob++m86qe9n6P1df1hnqsVgYnFyXOnhj78HjY8reeQThckWyynR6Vmm5BCSz0iy58nd+4X930Hqz8zPfdtG6tHJZzN56BLHYa1WJk/+/okUTARmHPNUbfHB7+07+ejw2YkP1Fx4Th/JYMvBr0LJk3/06WiNnSErvXDiDmz29Th5WVv9Ejp3DkTNpUPmcIwjz1fU8+lRrx2e17j4z4fn6avEZJ2TjwrPkLLBpQ9wK4yk9B1Jzttei5t1HIAxW7xKCM+QsvxWOLjburmo6/wXDjNcc3i+sccBGCM8AwDA7gnPAACQSXgGAIBMwjMAAGQSngEAIJPwDAAAmYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AzEfvnLX/4CAK7Xrt/9sgjPQKwIz19++eVXX331deX/AMDWFG83X3zxRfHWs+t3vyzCMxArrmDFpay4oBX3T09PzwBgC4q3mOKNps7PwjPw5iquYF9//XVx5/z8/OLi4rcAsFGXleItpnijeV3lZ+EZeHPV4fn09LS4sn3zzTfffvvt3wPAphXvL0V+Lt5uhGfgjVZcwYrr2NnZ2W9/+9s2OX8HABtVvLlcXl4WbzfCM/BGC8Oz2AzAlhRvMcUbjfDMHfbk4d7+oxfJh1482t97+GSksH0wvnNFG6lnupI1mtjU6KYrv0IrwjMA10B45q57slgcLkbS82cf7+8tno4Unp5fXF6chVu1JVeUbHZV051Zo6sb6dVsf67QivAMwDUQnrnbXjza3z9+edJPz08e7lX2Hy66JBcVLudIm/Lifm/WNCjvmnr0aFha19MvjANkue/Dh/vtJlHlvcJqMF1nivKHj5aNNONcuavJFpPlvZ3L9p4E98eG3PZHeAbgZhOeudPq7Hx6drLoRcn941fll9EUpXvLJJcoXMa8s4tXxw/2Dp9dXpwFwa/b/tlimRrLR9vCwyZKdhtevjoeDZDVvouT8gtyzoJ92j3q9Ll4dtm12FXytOxxvUPxUNREorZEV4NhBv1K9aTra1Ua3m/D/PiQhWcAbjbhmbtsmZ1fvz47Odxb1NnvyWLv8OS8/P7z12cvi7xYJblUYZz3uuAXbn+yDMrlo03h52UdVXtnF5cXddnr0yKXjwTIet9lbC0qf1D1+vXpedPvMjs3G9RV9sPzsuGy821n2q5GtSW7moi1qX3L7YrCqiunRXPt/ZPmt4jJIQvPANxsdXg+Pz8Xnrl7gtUDpTaFtuGtyXbJwonw3Nu+SJ/7H3/Wj4X9iNgufdibCs9tSTWT3GnC8IPjz9O7PC0j7udB558MHk3VFnc1EWtT+5bbVeN9PbhfbNzeHx+y8AzAzSY8c3dV88718oF6eUKZKtu50OUW9WcDU4UT4bm3/ZNlaEyH5zJF1usaLl8189zz4fnw2WWrmsWtNniS3iVMrUXnqyDdezRdW154jvadD8+TQxaeAbjZhGfurCJHLpZLE0rNyo12mcVyerRKcqnCqWUb4fbN0oZkIg2XW5SF0cTvYPth5c3X7J2+bBeCLD98N5hbDpYb9zuTqi03PKf2nQ3P00MWngG42ax55q6qsnP44bcmCZYfjVt+NcXi8EETMePCbp65DK57vbxabP+sWdKweNbOyMaJ9PT85XGzdmR/sXgwWFPR6JcElRdRuM7/p+dh4avw04vlso3DxX5v+3RXE48mhhkes0RP5sLz9JCFZwBuNuGZu6pIm4MvOm4/yFZ+6XC1DKHQfrtEVNh9VXL90MVZ78uTzy6axQxBBYn7Tb3JmoPO9kq6yrup80Fht0uZWo9fXvS2H+lq4tF4mMODNuhJeWBT97vPCU4N+QrflS08A3ANhGe47Xqf1LvF2vBcpPJvv/12h9dVAG6lv68UbzHCM9xqwVfD3Wp1eD49Pb24uCiubH8PAJtWvL988803l5eXxdvN119/LTwDb646PBd3zs/Py+Ugl5e/BYBNK95fijea4u1GeAbeaMUV7Kuvvqrz8+np6Rlcu3N2ZNfPPHdL8RZTvNEUbzfFm47wDLy5iivYF198UednANiSryvF282XX34pPANvrl8CwLXb9btfFuEZAAAyCc8AAJBJeAYAgEzCMwAAZBKeAQAgk/AMAACZhGcAAMgkPMOGvHi0v/fwSU4hAPCmEp5hQz77eH9v8TSnEAB4UwnPkKucRV4KJpOfPKyL9h8uupwcFRb77j98uN/u2myQqmm+MHN3094AsGnCM+Qpsun+8avL0qvjNpR2pSeLIrbW4TlRWM5A7y1OiqKLs2CDfk2LZ4nq48Ls3U/PL6rmAIBNEZ4hz1kRRM9Pq7unRSZexuTF3uFJXXr28vhBXZoqLMPz4ckyyBYbPDh+WW5wen5yuLeoku7Txd7+oxdV9V3mTRbm7w4AbJjwDPm6lRF1TC7XRbQrmptInSzsrX1+utgL1aH37KKcMg5LxgrzdwcANkx4hjxlcK7WXZQLI5ZzzN0U9OsuNCcLh+H5sF5iUWkntM8v6oJniy7/JgpX2R0A2CjhGbKUKbhZd1Em4eV878lhE1SrWekqH6cKe+G5v0F9r73zul6C8fFnY4X5uwMAmyY8Q5bT85fdsojF4sFyqXG3WmJ/cbicj04V9r+y7uziWbP0Yv/4ZTVzHBQVcfvZxXhh/u6+bQMANk14hkztsojLi0L7mbymeLpw+Cm+s4vBooug6DLYMlmYu7uPDgLApgnPAACQSXgGAIBMwjMAAGQSngEAIJPwDAAAmYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzEPvlL3/5C9icXZ/RABsjPAOxIjx/+eWXX3311deV/wNrKU6hL774ojiddn1GA2yM8AzEirRTxJ4i/BT3T09Pz2BFxWlTnDx1fhaegdtEeAZiRdr5+uuvizvn5+eXl5e/hVUU58zFxUVx8ryu8rPwDNwmwjMQq8Pz6elpkYK++eabv92pv+cN9O233xb5uTiFhGfglhGegViRdorMc3Z29tvf/rZIQbsNz9/xBiryc/GbV3EKCc/ALdNe6HbdEeAGCcNzkYKEZ1ZVnDbFySM8A7dPe6HbdUdga1482t8b2H/04iq1PXwS3okf2qDpOrfRYmUqPP/FO291fuff/teJ2Ptf/+3vlBu98xcZEbnYtqzsL96JqtxhAmRtwjNwW7UXul13BLbms4/39w6fXYYuzk/Xre30/OLy4mxZ7eLpsKF+ydVN17mNFisz4blNw2U6Ho/Gyzycp944tcsOEyBrE56B26q90O26I7A1ownzxaP9/UePHnaT0U8eDiemg1nr5QxvO9k7rLbZebnh4Mec5oqfHz5aNtiUha0MOzPX4hXmpXPDc/hTOyOd+nk5B90+2oXk5l75/3fe+Z3EfPYOEyBrE56B26q90O26I7A1o+G5fGBvcVJORb86LnNpd7+No/vHry57hW1tw2rPLl4dPyinuMt56XbPrrL55p4uytRc7fZssTeM6HFn5lpsJ8lXlx+el9k3mDHuHm8Lu0ebB9Ph2czz7SE8A7dVe6HbdUdga6rQmlryXDzw4PhllS5PXx4/aO+fLJZbnF20CzzKwn5mnlq28WSxV9RW7nl6fnK4t3iS1VwZng9PqgbPig2qwq7Oyc6kW1zfyuG5txD6rUEuXt4PHxSeb7s6PJ+fnwvPwC3TXuh23RHYmnjN8zKEFg/sf/xZu1F7vwix7f1uMcTeCuG5mkMehvXZ5p6WAfjzurDKx0+GrYx2Jt3i+lZettEv7AfregVH/XBxbxCe+yXC820hPAO3VXuh23VHYGumlm1Mp9kyq9ZrKy7LBRIrhecwrtdhPSc8t4UvHu1XQbq3bGO8M+kW17fyBwbLO+0SjWjZRrtLmaKbqDzYUXi+XYRn4LZqL3S77ghszdrhufzA3eHJWVtJfx3FVHg+OzlsJn/LtcjtKpHZ8LwXrrYuV2G0dU53Jt3i+tb5qrrhBwYH08v1Q++Ec9BVBe+8Ey7bqIt9YPDNZ80zcFu1F7pddwS2Jl7z3H0YbzLNnp6/PG523V8sHvTXUcThuVzJvKz77OJZs46iCMGZq0TKZRuHi/3eXm0ryc5Mt7ilb9u4djtMgKxNeAZuq/ZCt+uOwNaUXzoxVH0JRfFAu7whvN99NK/b9aJQ7dV+hUXiuyzqzevCs4vhCorZ5soUffzyordX0EqiM9MtbunbNoRnMgjPwG3VXuh23RGg90HF3WrDc5HFhWdWVZwz3377rfAM3ErttW7XHQGCL6PbtTo8n56eXlxcFClot+H573nTFOfMN998U/zmVZxCX3/9tfAM3CbCMxCrw3Nx5/z8vFwjcnn5W1hFcc4UJ09xCgnPwC0jPAOxIu189dVXdX4+PT09u73Ob4BdH4OtKE6b4uQpTqHiRBKegdtEeAZiRdr54osv6vwMa/i6UpxCX375pfAM3CbCMxD7JWzUrs9ogI0RngEAIJPwDAAAmYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp6BhOdH998/eDxdskZtyUoya75KB9arc4cd25RVh3DTxrKRJ2gb/Rlpuii+f/R8nQontyisUO3oi3dZVU9Rb10c7PH4oPn52o5w5hm48vGFrRCegYTrDM9rd+nqhOfBZjdtLDctPE83vUa0mx3CGmOcffEmfrx//6Dt+eOD+/d3dj7MtSg+cxMIz0DC9PtvNTNVCbdpSwfvfUF5VcnBYLv5muPK47aqN9Wjg3Y6rd2keastfj44Wk69NWVh08G0XFU022Jmx1Ib3z846CJAtEtvKNGM4HDLoqpwnvBqQ0g+Qfnjen98UFd/gmaGk9nD/P7Ex3Pmt4xyADNPVvS0NvV0+/bS4eDAzp0Ar3t1vh4rSf1Y1NIe8/KH3PC8zQM7ep25Sb/fcScJz0DC1Ptv730+fKOr3xwT77e9d8bmPTSxQ7rmuEuptqqq6/vhn6F7lYcZZPBO3VaZfh/PGl1YS1Bfq/foxGFIHqXxLaNn4ApDyG96cvyp43DFJ2hs+BmjW/+EGT+eiWZ6oS5xBKZP/scH7UO9E2f67OqdAIld0iXJHx8fNAfg4Ohx7l8itnlgR68G0jM7JzwDCTPhOf7DaVgYvbklI0f67XL8T7Lpzdq2wgm78H67cRvIgg3S2aCpc6bFZMfCadLBWMJH2x6mak4epdktNzKE/KYTw0+ONIxXV3mCpoc/2cM1T5jJ45l8gfRmjKMjMHvyL3/v6Lc+fXYlT4BgXjcwF56L/5Zl1f8mJ9iv68COXg2eW7nBrgnPQML05FX37hz/mX74F9revjP5IVlz3IFkWznZLAo3/WEG9cbv4yuOLn6H7xWE4TmqeTTBTm658SHk7zt4rtLH4YpP0PTwJ3u45gkzeTzjF0i4X/IIzJz89WbD7Dxzdo2G59Vnnqsp53KNxcHjyQn2azywI1cD4ZmdE56BlGjaJ/mO1ftD8vibbH54Hm9/ZAou2b/ZbJac2Iz+SDzT4nTH8meeJ8PPdB96h24TQ8hvOt2HeKQrzTxPP0ETw5/+S/7aJ8z48dz8zHM153swzM7rzjyvEZ6rSe+jqgMrhOftH9jXwxeT8MzOCc9AUvhH9PotLV4KG95PLXMN984IzyM1DytJt5X1lj38g/Box4bJJGt005sNHo03TK0fnal8ZMv1h5DfdHL8XQzb9BM0N/wVjnxmf6aP58yvDNlPVrKVkaM7U2dql3TJ2I/taZkbnrd5YMevBtO/KcE1EJ6BMeEfZcM39eGfXIfF8bRQ/ffXYC3l6/Qb9EjN/UrSbWVNbNZfTJD8MofgT8S97xoYb3G6Y8m39+bR8lslwh6+P9areG55dMuNDCG/6eS4Est44sn2NZ+gkSc9Z3Rj+86sLkgcz8lU2Q910RGYDc/V3PPsHxdG60zvkioZ+zF9py8x6G0d2PHrTFawh+0RnoG7ITUjuSve9xNu0hO0niuuJ0hlZwas2eAmEJ6Bu2Hn2SycxfP+H9v5E7QBa0e76uR444e/daIzN4PwDAAAmYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc8AAJBJeAYAgEzCMwAAZBKeAQAgk/AMAACZhGcAAMgkPAMAQCbhGQAAMgnPAACQSXgGAIBMwjMAAGQSngEAIJPwDAAAmYRnAADIJDwDAEAm4RkAADIJzwAAkEl4Bvp+9d7bb7311r0Pw5/eevu9X9U/f3gv/Glg6sF+teHW1f/DBwDgxhKegYFeBC5+ePvevbebn+MIPLrn0HDX6uexjQHgZhKegaFgKrhMuPc+LAvqn8NZ4uWkdD9pv1Vn7bcSKbqflrufpuoM96m2C/oleQNw/YRnYKhLpnV2ruefm5+H94LwW8fb7vHBFHUv8ZbbDvZP1TloMW4dAK6T8AxEqmw6DM3LnxPptU264bKNVL5t6w2zc7t7us5eX8pJ7V4/AOB6Cc9AbBlOm8zcpOgu/HbLK94Klln0PvqX+hxgmISjnJyusypu+1L8d3lfdgZgF4RnIKFa5fxem52X6fm9e9Nrjudmntv03Eu/yZnnQa3hnHO9qNrXcwCwC8IzkNDMAvc+3/f2213kDZLu4KN/06uSq3qCr+94nV7zHC/h6K98lp0B2A3hGUhZhtQuowbBuFcSRtnpb9voVRw8GK7viOvsSoPv+5CdAdgR4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AwAAJmEZwAAyCQ83xF/CwDAlQnPAACQSXgGAIBMwjMAAGQSngEAIJPwDAAAmYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc9A5PnR/feH7h89L4sPHie2jQrH6yyqWaUXOTVfVz2b0vZngx3bRlVzdT4+iB6+aYcaYAuEZ2DUIAtdJRqtse9tTWI3PDxn1yk8A3eT8AyMSoXng4PlVPTygXCbx81jwwTVPlBPPD8+iDcLZrur0mCbsIkwed4/OLjfVpKqMx7FaA9T/Zxtd7YP5QZHR73SxLi6FFpt303NJ3Yf9HNy7IND2qu8+WF42EeyfbxZ3e3mbEicDBPPCMCbTHgGRiXCc7PuokhG9b1um14GHCamoCixa1eWCm9jIbYf5KI646Ynexh3Z7bd2T5MH7H2zuODdpvespbk7uHdqWHHhzRIz8u7mYc9tVkdjsdGNN01gDeZ8AyMmli2MR2xpqoKN0v85b8rnA/PcW5N1blyDzPHm9GH6RrCjlW7DrLzSFvhAJtGZxLqcpc2PQ9muNN9TtfZtT7ox7KB3GcZ4E0lPAOjVgvP4R/3o2jWi1WDDyIuNwkeWCM8p+tMdXu8h4OylcNz1Ifc8Fy3PczOGQMPV18kAmrikJab94aaddjjzfpRPxWex58RgDeZ8AyMWjU8t+Ip3vTEabjD+JrbrPA8Pre5cg+zxzvbh9zwXN49OBhm56vNPKcOaR2bH7fZOfOwJ6sK+9GUzjzLALeB8AyMWik8D/5QPx5NZ5bslvcHgbDbo1tlHM2LxmuDh01P93CQZcu7c+3O9iE7PHejHjv++QcwvW84kPCH8cM+188uUk+ueZ5eLAPwxhGegVErzjzHf9kfqWrw5RvN48uy8vsr2qrbL4podjhKLCceqTNueqqHqUpm2p3tQ3rjZlzDBRh5E9e9hsLdh4NKHdJhSk9sMzIxHlcVfNtGarzTRwPgjSU8A+xeKjsDcAMJzwC7Vc3rWtkA8GYQngEAIJPwDAAAmYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc8AAJBJeAZi3/vDf+fmdgtuu34lAbeQ8AzEdp553Nw2ctv1Kwm4hYRnILbzzOPmtpHbrl9JwC0kPAOxnWceN7eN3Hb9SgJuIeEZiO0887i5beS261cScAsJz0Bszazy0+MX3336/nTJhm9/+sGvv/vkweodG7+9/7S9Ln734uhP21aGfn38blltT7N9dXvwaVs+7OH0jjm3qvL5gW/kNjGQlbpUjPrph2t3PnxePjkqDuBvPvhpU148FyN77fqVBNxCwjMQm44xv/eTP/nH/yovo75p4blKaMtUtoy4dd5L5sNqgzb3vnv0m8G+1UN18I4Py8iON+02PZDwNhOJP/xkcDDX60xdQ3Hn17/5pO7V09+8EJ6BayQ8A7GJAPN77/+XH/33//Uf/urwn8T5eSo8F9np0w/KlPhdPyhWmaqcyP30k19X5WUuKu43OS2YpA2CWbhXW94UDgPeoHxss2GmTcTayfDcezSqaqqhdsfqTl1exfhlD99dHrfgILS71FU9/fTFYAa7O25d/xP1jBROHJPR+qdGEUzdF0E3OlC9esZGNAjPT48/eFpO/n9ydPyJ8AxcI+EZiE0m54//+fs/+f3/+D9+/FeL3/8XK4Xn5s/rZXZablaEq2U6Kgub8PxdmIfDTJXca7lxW1imwcEM59i+/dCVmAGeiMfRo71Z6yaip/NzYseqe8nwHGzcNdEPz9VAgpnh4S7j9SQLU7969AfSTSN3B23mV4Bg5rk7jKl6kiNKhOcP3z369JOnn37w0w+FZ+A6Cc9AbDI5/+ydv/zFH/3ZzxL5eS48N7GzCEV1SCuno5vtm8LRJRbtxoO92hgWBtepCfD3uwp7WXG98Bzqzdx2j6anuEPh7wLJ0DusZDDz3N+lN5BBzE4tIJlajJEaSHqByurhOV1PMvmnwnP1R4oiNgvPwLUSnoFYOkT96M//6U9+9s4Hxz9++Nf/+r/9zyI//6Of3f+HK4TnLpcWoWgZ57rYMxqeg0+KtWGy22BZVbcYo78GYNCN3r5thr9SeK4erVtPRNB3EytV0tW2+TORG4OP7IVz1JPheTSc9+oZK5wcSP9ANan4iuG53WAiPK9+2/UrCbiFhGcgNhJF/rhMzv/5L8vA/KP/9C/L/PzH/Q2Gc7lBPA4fyp95Duar07PH4czzeMrKm3m+0prnOoImPxAXf5Ju2FAvf07kxjrBtgE1a+Z5PAkPVjgnC5MD2dnMs/AM3ADCMxBL5pB/8OdH/75OznVJkZ+Pjv7Zv+ltU6adLkCWybaJiP3s1Ew4j6x5bvLS8H737WQTa57jxcyZa56/N1j3u9q3bdQLdJf7hkE0c0K7nxuDqewgiw4C6lh4DgsHa5KT9cQHM5moh8uSx9Y8pyfkU2uek/UIz8DNJjwDsbWzyvd6qywGk6u/+eTp+LdtPD1OLtvoViD0vlij+faG9LdtxJOu4UfPxr9tY6r/s+F5OPk8VU+05jna69NPRpZtDIPuWNRMfjlzXM9Y4ewBmfi2jZFRtIXv53zbhvAM3FTtJXHXHQFukKuE55FbtEZicNv6N0K73cXbrl9JwC0kPAOxLcSYZHgO/+W+m/qvhLi9ybddv5KAW0h4BmI7zzxubhu57fqVBNxCwjMQ23nmcXPbyG3XryTgFhKegdjOM4+b20Zuu34lAbeQ8AzEdp553Nw2ctv1Kwm4hYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc8AAJBJeAYAgEzCMwAAZBKeAQAgk/AMAACZhGcAAMgkPAMAQCbhGQAAMgnPAACQSXgGAIBMwjMAAGQSngEAIJPwDKR9eO+txr0Pq5Jfvfd27+d2k7ff+9X4XlGlXflIE0F1qyj2HTSZ0+EbYua4rVbPajX0nxMApgnPQEIXYusAWoWruvDtt5vsWf5c/thm0eRew1qbwokm1om2qdQ42+EbYu64bVl56G7YEQG4uYRnICEZYpeF791bprsidN17771keE7q59uJJt5+ezhB3M4hd2VVbe2mrbDGvA6PNjXs7FRhu39TWPes95vC6KT32HHLGXU4ZV/cD49x0L/JI7nOdDXAnSU8AynLZQS9RLfMeB++93YzS1r9MIx2Y/m5N+881URVFM7BduEuiJn17m194zPPYx0e1pVsILllW7jse2r3oHvJhnKP9mCv3qiDI9qsveg2He5U3h3riblngGzCM5DWTVEOF1p8eK/Jafc+HE6axnu14uA43sTrdOKL0ulg/XQ6PKc73Ku239iwomRh0GybfMM60/0fm+SNDsXIXvHsfXsw+kdl6nhEPTH1DJBNeAYmtIsQwgnYaga3++/I4ov0pHKc0JJNvB4Ln6PpcCosJjscLrrorWMIPrsXf9SwKwwSdTsdHXa1nRYebWjyaI/sNRjmMj13s+DN48mjPT1kU88AOYRnYEacYqsp3Ho6d3SZcxxmJ6Y3J9cVXH3mOdnh2c8mTuTPwcCTXR0J/3N66TfeazjMcrNqaMNWZ2eep2oFYJTwDMTC3Dj4Kohl7nz73r23k3Ot0V79SgcfrBttIlpIPLd8eDIsJjsc1DWI5MkgOigMOlXPSg/qTK95npionzgUU4uml7PJkws8Ur8wREs4TDwDZBGegaRwnUIYjgfBbpAGE3sNqow/MZhuor/12PdOJGobTMtOdjj57cpBYXJg8Vd13Ls3CKqDsvmvcU4ft8ReIwvHk0cl+RUhqZ6YeAbIJzwD1yb4gorb782Zzb1TTwvAVQnPwDW67f+aXe8jeW9IIL3tzwnAZgnPAACQSXgGAIBMwjMAAGQSngEAIJPwDAAAmYTnO+JvAQC4MuEZAAAyCc8AAJBJeAYAgEzCMwAAZBKeAQAgk/AMAACZhGcAAMgkPAMAQCbhGQAAMgnPAACQSXgGAIBMwjMAAGQSngEAIJPwDAAAmYRnAADIJDwDAEAm4RmIPD+6//7Q/aPnZfHB48S2UeF4nUU1q/Qip+brqmdT2v5ssGPbqGquzscH0cM37VADbIHwDIwaZKGrRKM19r2tSeyGh+fsOoVn4G4SnoFRqfB8cLCcil4+EG7zuHlsmKDaB+qJ58cH8WbBbHdVGmwTNhEmz/sHB/fbSlJ1xqMY7WGqn7Ptzvah3ODoqFeaGFeXQqvtu6n5xO6Dfk6OfXBIe5U3PwwP+0i2jzeru92cDYmTYeIZAXiTCc/AqER4btZdFMmovtdt08uAw8QUFCV27cpS4W0sxPaDXFRn3PRkD+PuzLY724fpI9beeXzQbtNb1pLcPbw7Nez4kAbpeXk387CnNqvD8diIprsG8CYTnoFRE8s2piPWVFXhZom//HeF8+E5zq2pOlfuYeZ4M/owXUPYsWrXQXYeaSscYNPoTEJd7tKm58EMd7rP6Tq71gf9WDaQ+ywDvKmEZ2DUauE5/ON+FM16sWrwQcTlJsEDa4TndJ2pbo/3cFC2cniO+pAbnuu2h9k5Y+Dh6otEQE0c0nLz3lCzDnu8WT/qp8Lz+DMC8CYTnoFRq4bnVjzFm544DXcYX3ObFZ7H5zZX7mH2eGf7kBuey7sHB8PsfLWZ59QhrWPz4zY7Zx72ZFVhP5rSmWcZ4DYQnoFRK4XnwR/qx6PpzJLd8v4gEHZ7dKuMo3nReG3wsOnpHg6ybHl3rt3ZPmSH527UY8c//wCm9w0HEv4wftjn+tlF6sk1z9OLZQDeOMIzMGrFmef4L/sjVQ2+fKN5fFlWfn9FW3X7RRHNDkeJ5cQjdcZNT/UwVclMu7N9SG/cjGu4ACNv4rrXULj7cFCpQzpM6YltRibG46qCb9tIjXf6aAC8sYRngN1LZWcAbiDhGWC3qnldKxsA3gzCMwAAZBKeAQAgk/AMAACZhGcAAMgkPAMAQCbhGQAAMgnPAACQSXgGAIBMwjMAAGQSngEAIJPwDAAAmYRnAADIJDwDAEAm4RkAADIJz0Dse3/479zcbsFt168k4BYSnoHYzjOPm9tGbrt+JQG3kPAMxHaeedzcNnLb9SsJuIWEZyC288zj5raR265fScAtJDwDsZ1nHje3jdx2/UoCbiHhGYitmVV+evziu0/fny7Z8O1PP/j1d588WL1j47f3n7bXxe9eHP1p28rQr4/fLavtabavbg8+bcuHPZzeMedWVT4/8I3cJgayUpeKUT/9cO3Oh8/LJ0fFAfzNBz9tyovnYmSvXb+SgFtIeAZia6asNz88VwltmcqWEbfOe8l8WG3Q5t53j34z2Ld6qA7e8WEZ2fGm3aYHEt5mIvGHnwwO5nqdqWso7vz6N5/UvXr6mxfCM3CNhGcgNp1hfu8nf/KP/1VeRu1Kiuz06QdlSvyuHxSrTFVO5H76ya+r8jIXFfebnBZM0gbBLNyrLW8KhwFvUD622TDTJmLtZHjuPRpVNdVQu2N1py6vYvyyh+8uj1twENpd6qqefvpiMIPdHbeu/4l6Rgonjslo/VOjCKbui6AbHahePWMjGoTnp8cfPC0n/z85Ov5EeAaukfAMxKaS8/v/5Uf//X/9h786/Cdxfp4Jz82f18vstNysCFfLdFQWNuH5uzAPh5kquddy47awTIODGc6xffuhKzEDPBGPo0d7s9ZNRE/n58SOVfeS4TnYuGuiH56rgQQzw8NdxutJFqZ+9egPpJtG7g7azK8AwcxzdxhT9SRHlAjPH7579OknTz/94KcfCs/AdRKegdhkcv74n7//k9//j//jx3+1+P1/sVp4bmJnEYrqkFZORzfbN4WjSyzajQd7tTEsDK5TE+DvdxX2suJ64TnUm7ntHk1PcYfC3wWSoXdYyWDmub9LbyCDmJ1aQDK1GCM1kPQCldXDc7qeZPJPhefqjxRFbBaegWslPAOxyeT8s3f+8hd/9Gc/S+TnmfDc5dIiFC3jXBd7RsNz8EmxNkx2Gyyr6hZj9NcADLrR27fN8FcKz9WjdeuJCPpuYqVKuto2fyZyY/CRvXCOejI8j4bzXj1jhZMD6R+oJhVfMTy3G0yE59Vvu34lAbeQ8AzE0lHkR3/+T3/ys3c+OP7xw7/+1//tfxb5+R/97P4/7E0+D+dyg3gcPpQ/8xzMV6dnj8OZ5/GUlTfzfKU1z3UETX4gLv4k3bChXv6cyI11gm0DatbM83gSHqxwThYmB7KzmWfhGbgBhGcgNhJF/rhMzv/5L8vA/KP/9C/L/PzHg23KtNMFyDLZNhGxn52aCeeRNc9NXhre776dbGLNc7yYOXPN8/cG635X+7aNeoHuct8wiGZOaPdzYzCVHWTRQUAdC89h4WBNcrKe+GAmE/VwWfLYmuf0hHxqzXOyHuEZuNmEZyCWzCH/4M+P/n2dnOuSIj8fHf2zfzPcLPU9yXV2+s0nT8e/bePpcXLZRrcCoffFGs23N6S/bSOedA0/ejb+bRtT/Z8Nz8PJ56l6ojXP0V6ffjKybGMYdMeiZvLLmeN6xgpnD8jEt22MjKItfD/n2zaEZ+Cmai+Ju+4IcIOsnVXGb9EaicFt698I7XYXb7t+JQG3kPAMxLYQY5LhOfyX+27qvxLi9ibfdv1KAm4h4RmI7TzzuLlt5LbrVxJwCwnPQGznmcfNbSO3Xb+SgFtIeAZiO888bm4bue36lQTcQsIzENt55nFz28ht168k4BYSngEAIJPwDAAAmYRnAADIJDwDAEAm4RkAADIJzwAAkEl4BgCATMIzAABkEp4BACCT8AwAAJmEZwAAyCQ8AwBAJuEZAAAyCc8AAJBJeAYAgEzCMwAAZBKeAQAgk/AMAACZhGcAAMgkPAMAQCbhGQAAMgnPAACQSXgGAIBMwjMAAGT6/wG1CpzvCmVuZHN0cmVhbQplbmRvYmoKMzcxIDAgb2JqCjE3OTA1CmVuZG9iagozNzIgMCBvYmoKPDwgL0xlbmd0aCAzNzMgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1XzW4cNwy+z1PoBTIRqd8BCgMbr7dob0UWyCHIqUXbQ9zCp7x+KInUSJoZr/dmGGtpKIq/HynpZQKl6e9DGsKC6s/n6YVpoAIq43sSOK+MnqPzWgMtlZ1aBiKkIf3/oGd06nve0c61jIWkZfKv+jL9N2n16/T1G1H/IrpTP6YiTjZ+nv4YjNHvzr7WQgP4Di18mYItOtHPsLhlWVREhWHGYtLH355Rnf/PzmR2TFh4Vs7qNPnOkyQvL9UJjcmGl8k6XTSkSQTlUQRbEdzhLGToafXP9Ok6fbyAU6DV9e8VnlHF2S1Oa41BXZ/V119o9ulBkVyaAdH1hSgnnj/RDx5oo3ZpXda06+k20Of5QVmbudJqLBLAsyTH0i6Fu92NF+ZNUizzEs1c3qZdW7E/rQDSGAp3/g6vcb9mJ5hhZ2TJQ1QQtzblvWIN6zmyCNuIR/ZxjE9aPBd5tz3KWlKO0z/38E1df28hgIToxRJcDQgGatyfeLR7USzr2RbOmfar3cKf4ym8KQ5LseDpmhDtGdHEMNvEZckiMIE+SM+S8EvwdkvB9yGMwQPtICcMLuKEMRwgZGN7YJg1jM1KlOS9DUisQbNrF97ZwCaFTqBUIMRy+jQxFXnMElkjig/MV4NJNDwXmhRNLQr6SMpM4icefGTaiYFjmpKWaLB1iRfYsxydIYnJDElim4LoNim43UtMnO1eNQv9qBu0PLnfSFW8EYmd7tMqN9sHrM8U2WbQ11Z9S7udvN7fWlVcGbnrANNHnXFfL+7Ifku3qbFL9i30c73to88ZQKc0bhO/hE3iqxtQQOCiIB25Gk0PDVdSbY2oZnMEk5fVpVrPzXqey0/vpDsc9YHbLb9JkrQ9tw2YhibIjuWNPeOw/aGjgzjFi+4MygacjaeAcvfzcKP72cWXDRpN7X7QF5SNM+ZoN3YLmGQtxwJW/7s+1sqAUmDd3jB833k0jHa0YBd6C/ZqS2Ca131HG+zZ9fdyECNku+KKnAwcdyA75fVc7DNygkjRjTF62u4/sgNxbUal0zd7GrzKNaDFVwMPp+MWHo+sbjiG6B7h7Gzalm29Xi8/dZF7lRwc+X4x9LrKrKU5dxIOEtczyanaICZHdhRP9xoFIW85rYFfWW4ge1XIdyU4Ue/T9fAPA9v2vG0Wtwfv4JHUYNvoe2/4tAPT3Hu7vPhxl0TPrZHN4zIaV/vCFid0Exxx0mYpm8y3znrVubvMh+Db9RKTvJXzF5v229KEL19M6u2YdcFeyYxld6tc9dB+1naQbXANLWGecGdcrZ+1uQ9PMW9x9tS7u1erVkucY9xQ89Nz582K9LK0CTO4R9LD5z0P2UHM+OIuy3daC27Wix8/dTO976ldtyfrXnnUwgwx0HOGuAFoU/+8hdQJHnfThBZmZ/z7Tkr6+wnX75s+CmVuZHN0cmVhbQplbmRvYmoKMzczIDAgb2JqCjEwNjYKZW5kb2JqCjM3NCAwIG9iago8PAogIC9SZXNvdXJjZXMgMTQgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDE1IDAgUgogIC9Db250ZW50cyAzNzIgMCBSCj4+CmVuZG9iagozNzUgMCBvYmoKPDwKICAvTmFtZSAvSW02MgogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAzNzYgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggMTE0MwogIC9IZWlnaHQgNTc0CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BAQEAAACCoP+rbUhAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAowFfW2TGCmVuZHN0cmVhbQplbmRvYmoKMzc2IDAgb2JqCjY1OAplbmRvYmoKMzc3IDAgb2JqCjw8CiAgL05hbWUgL0ltNjMKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMzc4IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDExNDMKICAvSGVpZ2h0IDU3NAogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDIgMCBSXQogIC9TTWFzayAzNzUgMCBSCj4+CnN0cmVhbQp4nOy9+Z8cVb3/n9/uP+OHx0OiV9QrIouKAZHtC0wISQghEBKysYWlCYEEgiiolys+vOqgl+sFgwJXjIAgjbKZsCcoWwYFwVxFCCEL63zf3dVd9a6z1amu6pme6efz8XyEnlrO1j3Dec2pqtm9GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcvAQAAAAAAADVMELW3wAAAAAAAKAChCwAAAAAAIAaIWQBAAAAAADUCCELAAAAAACgRghZAAAAAAAANULIAgAAAAAAqBFCFgAAAAAAQI30JWQ9/v2FX7K57FelC2mfkr4IH1ZU2MLvP+44uI7CLX512ZdatTmL63k8SiO19bsKAAAAAACw6FvIqjy/jywk6jBJPZ68VmctujpHyJKtqox24Eq+LCy81/HsdhsAAAAAACaOYQhZnWUs58ETF7KsjZFLdaVrL2oIAAAAAAD0k+iQ9fQ9P/zmWjdX3fDLp3PHBkJBe9f3u5fNZQkgvZKuvbN1sjODtFaD8qcme7vbXbVmGSsUspwN6+xNa03bm25RpWXbLnNlG7V0lcMqPOtjcnzJ2nNVk7IAAAAAACaa6JB1/38sOfF4Nycu+Y/7c8c678nKLo3rzvuz6+eyV8mpnpClIkP6MjvBvCBPNaa7sSBkWQ1zLzZlX7ReWZ3RJeVR8Um3Ile46kPrZbucqNqtkXF3GAAAAAAA+kuJywX/ct93HDnrxCXXGOtYhStZ1rpSLhd0U4Y7ZFnlOgvU6JMKQpZVjjNkmZmofZbZhfD6UX7hzTtc3XIKa3fHy6imAAAAAABAvZS7J8vMWa6E9bfiywWNvKDzTX6rvYqULQZ1NoUXqv6WjxlFlwua5Xj3arqPLSwRstJy7IUqo3xnyDJrd49MiaYAAAAAAEBtlH7wRZazPAnrb6VDVvRKlsK+os93pHvp52/mhnIhKxjlnMnGsdZkxcm/GYGzcCXLRb4iQhYAAAAAwATTy9MF/3Lffyw72Zuw/lY+ZEXek6UDSI8hK7vPyfyqOGS51sO8XfA8+EJtzop09quzNJWGrGDtnhK4JwsAAAAAYOKZwD9G7Fy1sa6CSx/NV+rpgnaB+dYYV9DZF9sVhKxu+6x2GKkp2fR93/KRrtp+tGL2AI7O/l/lnsoRrp2nCwIAAAAADAZ9CVmVqD8XqGe4DxlkLAAAAACACWcgQpb3are6kEKH8aK5Ie02AAAAAMCkMhAhK3eBYV+WXoZxMWsY+wwAAAAAMPkMSMgCAAAAAACYHhCyAAAAAAAAaoSQBQAAAAAAUCOELAAAAAAAgBohZAEAAAAAANSIEbLefvNNRERERERE7FlCFiIiIiIiYo0SshAREREREWuUkIWIiIiIiFijhCxERERERMQaJWQhIiIiIiLWKCELERERERGxRglZiIiIiIiINUrIQkRERERErFFCFiIiIiIiYo0SshAREREREWuUkIWIOIV89NFH7wcAAIDBhpCFiDiFlJD11ltv7dy58+02uwAAAGDwIGQhIk4hJWRJwkp+eu/Zs2cvAAAADB6ELETEKaSErLffflt+Yu/bt+/dd99977333gcAAIABg5CFiDiFTELWnj17JF598MEHH3744UcAAAAwYBCyEBGnkBKydu3atXfv3vfff18nrHEAAAAYGAhZiIhTSB2yPtr+o5GZBo1mlf8ljI2OxJZQ4tBy9Zs90du6jIyOOTbr5jQb5cZEjpdCXe3oVhja7m28Gqf27lxTOruCHVQntLuUFeVoSNkqCt4BozHhplqD7GskAMBwQMhCRMx7yykzUuZsDB68cc6MU24xNm5Z//GPr98SXd2WKz5eVIvWClnWnHqCZrL1h6x841uRItcVo0KrfnV669x0X9SYNBtCdpRZeDeC+bYHGp8PWTMDXXB8OTLSUGWOjKiiXGNftooAxW0rKrYvKRwAYMpAyEJEVLYS1rw73kt49ur9Z3z8iif8x/983ox5txobd+7Zt2/PzugaH79y5ox5P49uYThk5We26WqODhwjo6ONbF2h2citMehEkB1oLae0TpBMkm63Kmqd3jqgtSU82c4WX6SQQF8iJva5OOOOQv5GyAHNLGWZJXS/9m0PNN54oQ+M6GCW/MZGG+mQh0JWmSrCQ9KnkGWlZwCAaQkhCxGHyZtOnDFjxgk3eQ/Ysn7mjPm37ep8+c7u2+bP2P/KLfn1JvW6FbJOmZMsenWXtPRKVroopteq0o1ymDogbkkrfiUrjRZqtquuJ9NXo7kTgVoXsspU1665KrKvWzPpXkyWTrcdSSg/TS+xkqVbH0GSsXRSci0qOVay0u2BxltjG6zF+rLZ6I5oY7TpS5FmCbFVhMekjytZ1rsPADDtIGQh4nD48NqPfWztw1vW7Tdjv3VbfnqCJ2rtfOrqmTPU6tWufe+1l6X0epN6LSFrxv4bnm0ves3sRKTHr5o586rHW3s3zpkx8+pnOytic25pFygRrLtSdsc8iVlbWyfOv+O9vbt37n5X/i3qSME9Wbkr1nSAScOPXq2xEo5zMSh77VwjcVUUnsw71zKstSBzm2NiH7zjJ7srq2Aqnw2EHqd82TqkOrYHGu8Y0u6SWUxykX87pag1QV/fy1YRHpQaQlbRLVnFYRwAYKpCyELEofDhtfvNyLPfFY86jty5Z9977902d0a22NTe7g9Z82/b/Y683rn79vkz5rYWs9KQdctcyVhP7Xy7syJ2SiuCbVm3f7pStmvve/t2v1PX5YJmctFPftCz8AohKz+X7gYLV0XFk3nXSpZ5RvRKVvgKtIKbsowwELVUZBJovGv0OkMflVxaS1ityzobTf/1kI4SoqoIwEoWAEA1CFmIOBS+vbf1h3ufXN+KWvutf1Jev7v3Hd/BEn86N2Vt2D/JWd6QNXPDk52zuvdnpSHr1nm5UNe+7FDOnbnhKV1Xffdk5ZcFXIsr/VrJKjXBto8suq0p4stc362SnGORnamm+ubyU2y/ou/J0rU2ozrYWpQabeQSU1TzIqoI0L+QxT1ZADAcELIQcWhs3ZC13/pbW0HLd1vWLXO61/W1ba9PzftZaCWrtbf1esuV+9sha373ERpCetnh3Ft1jXU++MKMGtZNVRVDVsE9Wc7bwOKxQmKppwvqs3NPFww/+KJzOZ4+Vq8ZOZro7pe38b5k1FnMiUguaWHlQlZEFQH6u5IFADD9IWQh4nD48NqPtSLWE3t3732iFbP+35qHHYft+sX8Gfqp7K1L/lprVTt/3nkCxptvPrFu/xn6nqxT2qEsuw4wDVm7Wk/NuGJLa69kt+Q+r/Y9X3OT8pMnXdT/dEH9mArjZpiqIUtd6OV8umD2KDzP6UWoaw/DFw86inX3PXxRmpmxOkPRLB2yvI33JyPzhiRfB90vTJwLcAVVBCgdsqzW+BoJADAcELIQcThsXy+YXCLYefm267Bd+1oPpMiu8dvwbPI89l1bW0/ESC772zBf35M1L3lA4P5XP5s8tiJ78MXuvXfM75Zz9db2rVute77S8tunJI/a6O3pgh99NNn/DwEAAAAHhCxExLySs/LX+LW3v7O7s/nd3fKq8xjA3Xvf27d3b/7In82b0QlZqij9l7OMje1HbfT2dEFCVjyuhZWhvjmIAQEA6CeELETEunziio+3Vqhmbng6/o8RlzQNWRLMPvzwQ3IWAADAAELIQkSsy85q177d3ucWVjYJWXv27Hn33XeTkAUAAACDBiELEXEKmYQs+Ym9b98+yVkS6d4HAACAAYOQhYg4hZSQtXPnziRn7dmzZy8ADCr7AOKY7I8q9AVCFiLiFFJC1ptvvpnkLAAAABhMCFmIiFPIRwEAAGDgIWQhIiIiIiLWKCELERERERGxRglZiIiIiIiINUrIQkScWu785z//+uqrL7/88ksAAADQE2NjY6++8so/33ijT/+zJmQhIk4hJWHJ/xdef/31v//97/8EAACAnvjHP/4h/zPdvn17n3IWIQsRcQr56iuv/PWvf53s/zUBAABMByRnyf9Y+/H/a0IWIuIUcmxs7B//+Mdk/08JAABgOvDGG29s3769H/+/JmQhIk4h5Qd1+r+GSb2YHQAAWkxiQIBaeKk/CYiQhYg4hXwpH7LGAQBg8iBkTQMIWYiISMgCABgcCFnTAEIWIiISsgAABgdC1jSAkIWIiIQsAIDBgZA1DSBkISIiIQsAYHAgZE0DCFmIiAPslvUfn2Hy8SueKDxxyxUfnzFnY3RFhCwA6B/f/e53R0dHb7zxxh9byEbZJQdMdhsHC0LWNICQhYg4wO7cs++9Fs9ePXPG/DvaL9/bt/udwhMfv3LmjHk/j65oSoesd9t88MEH6RYZJNny/vvvT0DtAz5cNG86MeDD1afmTelev/XWW9dcc83JJ5/8uc99Tv6V17IlsthJTAdQC4QsRMRJ9aYTZ8yYccJNBYeZoemWUzrLWp3lqo1zZnz8ii3y4onWEtacbG/cklapkLVy5cqZXQ455JDZs2dfeeWVr776aol5iaLZbH46zwMPPFCqhKQlMntJtxxzzDGyZfXq1WUbc99995122mmHHXaYNOPwww9fsGDBtdde++GHHwZOmdIzQM1dd91VS42NRmPnzp2RB0/M6H300UfvepiA2mtk6n7Y5Pvo+uuv/w8PsksO6KHYQSDQvCeeeOKLX/yi/IRcuHDh0qVL5V95LVtke0yxk5gOoBYIWYiIk+TDaz/2sbUPb1m334z91m356QnBqJUPWRKpZl79bHuBa/8Zc26RLbv33jF/xikb37xl7ox5d+zdu6+z8rV3987d78q/RY0pFbIuueSSq6666vLLL7/ggguWLVsmkwcJJgceeODLL79ceoIyPv6Nb3zj/PPPX7NmjRQrpZ188sl6TSqGFStWSHuknHTLOeecs2HDBmlhqXJuvfXWgw8+WCZCixYtkn/nzp0rMyKJWnv37g2cFR4uKeeII45IX8/MI1tiGiZTslPapHOz+KLiJ6i//OUvI48Ms3z58r/+9a+RBweaN9NFb02S9nzyk5/8lOJf//VfpTSJ0r0VWKV5zhMjy5m6cWMCin3nnXcuvvjiuip9/PHHI5fCfc176623jjzyyHPPPXfdunXJrx3kX3ktW2R74XoWIWsaQMhCRJwcH167n3Gz1X5XPOo7OBeyJEnNvPqpnfL6nd23tbOVbNy1VQLXDNnxzG7z+GJLhayLLrro0ksvlWiTfPnYY4/J3Oayyy775je/GTMncSITDwlr8SsgmjPOOEMCml7JkqKkhRLcSpVz7LHHSmxctWrVCy+88NFHH73xxhu/+93vpJvh9Y7C4ZKYVqoZNhKvVraRF2XPDTfvwQcfTP+955575N9NmzbdoZAvY2r5z//8T4nGyb8y8hJq5COhU4PMKp1T1kDzRkZGFi9eLG/l2W3ktQTwmMbYSHvOtZB3VnJ0bwUK0hhpUtI2aaS8lgbHnGj0S1NYjm+4ZGxvv/32OXPmpAP+vTbpl7JLDihMDfKx/8tf/vLAAw+kH4Dn2qRfyi45QA4r1TxBfjh85zvfud6D7Ar89IgJWU899ZR8xo4++ujCIyO57777fvOb38jPw8Ijfc2Tn0jyGZNUZWyXLbJd/7zyFTtp2QBqgpCFiDg5vr333ffee+/J9a2otd/6J1v3Ee313myVC023zstls/2v3NLa/s5TG2Z2w1dfQ9bq1atlCr18+fJ0iwQTiSeBC37C3HTTTZIgIpd1bBYsWCBN0pOWM88888ILL5TkFV/Ivn375s+fL82QqWmp2uNDVs8rWdKd89rIi7JFTfzlgvJJqGUlC2x8wyUBasmSJXrLEUcc8ZWvfEVvkQPksHD5EqAeeeQRvUWCRpK+U+QAOaxU8yoSLvbDDz+U79nDDjtMvuUlO9dV6ebNmx977DH5ppCM6QuV4ebJzxOJzP/3f/9nbP/73/8u22VvuAGErGkAIQsRcfJs3ZC13/pbW0ErfFuWGbK6D8FoPwhjz87W9o2nzJg/f96MU26xji+2h5AlU5qnn35aJiFnn322hKylS5e+/vrr4RN9yNRISujhFqoEma6cf/75OmSdccYZUlqpkCVs2LBhxYoVUtqyZcs2btz4wgsvxJxVOFwHH3xwqWbYyDRvcRt5Ufbc+Hnvr3/9a/n3V7/6VbJmIS/K1pUg76aErIsuuihdwwpc/1n2csGy1+aNjY1VuTyvH02q0h7fcM2ZM+fdd9897bTT0hLmtUm/lF1ygBwWbtsDDzwgmeXBBx9Ml65+1yb98ve//70c4LtrcuJDlnzS5Bv2lFNOWbt2baPRkO/6K6+88ic/+cnDDz8cTkY+JBO9+OKL8pNNEtYTTzzx5JNPSvel1zKbLdu84447btGiRc5dsv34448Pt4SQNQ0gZCEiTpIPr/1YK2I9sXf33idaMev/rXnYe3AuNO26bf6M/duPuXj7ljmdJ7pvuWL//a/euveZq/fff/2W/oYsSTQymZGQddBBByVPh1i5cmXPD74Yb19AJRntxhtv7O10mWKdc845xkqWTPXLhqw//vGPUo6cddZZZ51wwgmHHnqodO3uu+8O3yNWOFyRV5H1CV/z9u3bd++99+otkVcG+rj88st37NgxXt9KlqQzCQXzLebOnXvSSSd9+ctfjilfQpYUInFDTjw1j2yR7fFFCXKkHC8NsFsltUiDYwrx9SumHN9wfeELX5B/Z82a9d5779l7ZaPsSg8LkATte+65x/mwF9mYrGoZn5zC5sXkykC69BX7q1/96sADD1y2bNmll14qoV5+KMm/yXt61FFHybfwb3/723B/Na+//vr9998vXWs2mxKsHusiUevRRx+V7w7fjzhf8+Rnmvwk2bZtm7H9qaeekl2FP50IWdMAQhYi4iTZvl4wuUSw8/Jt78H50NR+zEXnWsGrt+5+p/3ntObfJi927rltXit27Xzq6pn9erqghCwJI2efffaGDRsuvvjihQsXylzi85///M033xw+0TeXOOOMMyTOPPPMMz2cPt7+Nf6KFSukMekWac+qVaviQ5ZMuZ1TvgMOOCB5QoIgx/ja31uzJwZf8+666y6ZUesbr5Klq3QlK/KerPTCxUMOOeRrX/ua/E9f5rp6JSuhh3uywMY3XPIdtHXr1ssuu8wXXmSXHCCHhct/6KGH3nzzzSeffDL9APzv//7vK6+8smfPnr///e/y2XjxxRcDz4HxNU++j770pS/NCiIHyGGlir399ttPOeWUJUuWrFy5Un4inXvuufKvfOPLC0n68gPqsMMO8+VBg9dee02+IyRMbdmyZfPmzX/4wx82d5HXjzzyiMSushdJfv3rX5cBl2bojR999FFyf6UMbLhJhKxpACELEXEKaD4kcNe+3LWCrT+ntW9Xe9euve0/pJX8ga2+PF1QQpbMHPQ9BRJnZMvhhx/+zjvvhM+1+dnPfrZ06dLZs2eXPTHltNNOk9rTx1x8+OGHUuCyZcv08wbLIh358Y9/LD1tNBrhB2gMeEwINM+4CevOO++sUtGll16avJDA27+nCwbWOwJITPi0iwMPPLBsUdUbFji9sJxA3FiwYIHecnQbvUUOiLkn6/e//73eIm+lJCz5bKQR45577nnqqadKNa8i4WLPPPPMOXPmyL/JM9LXrVsnL0ZGRiR/LV68WLLbn//853D58s1+9913P/zww5Kkms2mRCrp4IMPPigvZOMDDzwg//bWPGnYscceKz+dtm3btnPnTgmtycNL5XvkBz/4QWGvJzEdQC0QshARsVTIOvfcc88666x58+alW+69917Zcvrpp2/dujV8rs3q1atlLlTljnUpQaYuMqeSSdGOHTtk9iIJSzKgTGlKlWP/pjp5DJ2UHLi/IzBcySrPQQcdpL/UDNQj3JNfrVe/J0vezVruyfrCF75wzDHH/H95ZEvhNW820p7jjjvuhBNOOLGLvJbZ76GHHlq2qOoNc54eWU5guOT9Oumkk9LPg3wX/PCHP0y/lF2Rb6gEUgka6UrWiy++ON6+wm3Tpk1/+tOfJGHJ3n379pVtXhUKi5XOSqJMEk268YUXXrjgggvkjb7hhhvCp0u/7r///i1btuinm953330Sr+Tf559/vufmbd++XUZe3tPPfe5zyZ/ek59LkrnkB9SsWbPCz9ghZE0DCFmIiFgqZJ1zzjkykZZU9dZbb8kP+WeeeUYC12mnnSbz2PCJTmQSsmjRoptuuqmHcxNkJiNTLJm9yJz5s5/97FFHHSXt6eFp55/85CeXLFmyceNGmW499thjGzZsWLp0qWwJP5GjcLhkflW2JQbSl7ltan+Eu6bw+qVIZA7J0wX7xCQOl3yb33vvvcnT/n0EmnfllVdec8013/Agu+SAHopNef311+WHgHz7G9t/85vfpH9swscf/vCH1157zdh45513SsLas2dPYdWFzbv22mvPPPNMifbnnnvuL3/5yzVr1sj3svz8POKIIwI5i5A1DSBkISJiqZC1cuXKU0899fTTT//Upz716U9/+vOf/7zMH7761a/++Mc/LpyQaGTiIaePjIxIaUkhpU7X7N2798ILL5QCJWotX7688HfXTo4//nhJfIcffvjBBx+cLDdIlpQt9q3rmsBwySRq5syZ0rXky55Xsk4++eQ5XcoWFf93soyVrJ7/Tlbyx4ir35NV5bK6lL/85S+HtTnUQ7I3po+1tKdiOZMVst5+++3kcRDyb7K25WRy/xjxePveNHtj4RKe84kWDz30UGSlPfT6/PPPl5978vPqK1/5ii9nEbKmAYQsREQsG7IkOBxyyCEyO501a5bEEJkzlL1QcM+ePQcccIBkGSlH/v23f/s3KaRUCbXzxz/+8Uc/+tHq1auXLFkyb968ZcuWrVu3rnBRJhwTamnYCy+8MLtN5FPlNRO/kiU5t657sj73uc99wcOBBx4YM7xjY2MHHXTQwW2qlJO0Rw72tUeaGl9OoF/hciYlZCW3LN13333j7StXJXrLqDqPDDTv2muvvf766//Dg+wK/JW9AV/u7K1555133oknnrhw4cLDDz/cWQIhaxpAyEJExFIha6Cw13Q0Pf+B43gCwyXTp4lpQ4CyfyerOpLB9b0tYabWh23SmZThevfddx944IH0xrpHH3207MPMKzLgH5Kem7dixYpZs2Ydf/zxhKzpCiELERGnbsiadAZ8uGjedGLAhyvQvO9+97ujo6M33njjjy1ko+ySA3oodhCo0rxt27b5rgEgZE0DCFmIiEjI6pkBHy6aN50Y8OFiJaveYicxHUAtELIQEZGQBQAwOBCypgGELEREJGQBAAwOhKxpACELEREJWQAAgwMhaxpAyEJEREIWAMDgQMiaBhCyEBHRCFkAADC5TGI6gFp4iZCFiDj08j90AACAGiFkISIiIQsAAKBGCFmIiEjIAgAAqBFCFiIivsQ9WX6c/+sEzZAM0ZB0E6AiNeaUKc1LhCxExKH3JZ4u6ME5YWCINEMyREPSTYCKELJSCFmIiEjI8sHUupAhGaIh6SZARQhZKYQsREQkZPlgal3IkAzRkHQToCKErBRCFiIiErJ8MLUuZEiGaEi6CVARQlYKIQsREQlZPphaFzIkQzQk3QSoCCErhZCFiIiELB9MrQsZkiEakm4CVISQlULIQkREQpYPptaFDMkQDU43X3vttcsuu+zAAw/8tAfZtXbt2h07dkx82wIDMtPF9773vYlsXr28//77zz333KZNm5544gmZ7lYpqtFo1NWqeHxv1qxZs2bPnj1nzpxPfepT3/rWt/Qu+VI2yi45QA7zFVtjTpnSELIQEZGQ5WNwptYDy5AMUcVunnrqqZIpNmzYUL0lF1988emnn75+/fp1bdasWXNhG3mRbJFdCxculJzVW/n/9V//5QxEwtVXXx0+NzAgxx9/vL1RJupTMWft3LnzyiuvPOCAA2RMjjrqKMkdn/jEJxYvXjw2NtZbgQMVsk4++eQVK1asXLnyO9/5jr1XNsouOUAO8xVbY06Z0hCyEBGRkOVjSBJEFYZkiKp088UXX1y6dKkkLMk+e/furdiSo48++vLLL7/iiiskRl166aXnnHPOE0888cwzz8gLmavLRtklBxx77LG9lf/ss89u3rz5ueeekxwh5Uimu/nmmx977LGHH364cHUsMCC+hY+vfOUrUytnyfgceuihIyMj1113Xbpx06ZNc+fOlbT185//PKaQDz/8cGebjz76aDwfsnbt2iXb5YCYcl5++eVbbrnlrrvu0ktpUua7777bbDZvvfXW7du3+871vVnz588/8cQTzz///NNOO83eKxtllxwgh/mKrTGnTGkIWYiIWC5k/fmni7+UY/FP/1xwSs+06trwYL9KL6bHqXXFIZrsXpeiQvp4cEM2Qt3+Dmrfq4Ssq666at26dZJ9JBPdfvvtFVsiSe3CCy+8pM25554rUSjZfv3110vOkkwkM/aLLrro1FNPrVjRmWeeKeUsXrw4/pTAgMh77Nt1+OGH+3PWI98+PuXbj8Q3pT/ItFbaISnDXtS79957zzvvvCOPPHLbtm3hQt5///2TZs++YPXqc849d+myZZKnkpAlLy68+OKzV6w474ILjj/xRAlK4XIefOihs5cta6xZs/rCC+Vdf/vtt5Pte/bsWX3RRVLIJY3GkrPPvu+++5yn+96sT3ziE6tXr545c6Z8AE444QS9S76UjbJLDpDDfMXWmFOmNIQsREQsH7Imaho82VPuCiGrQrMnu9el6DV9tBJW2slWj/uY1Wug55AlM9558+ZJIPrv//5vSUDVs4+UJpN5yVkXXHDBWWed9eyzzybbd+zYIRNgmf/LLjmgYkVPPfXUihUrJMRJgfFnBQbk0EMPDZwo83bX5lbCSpPVK7eec/w5t74S35o+IElWxuTss8/+4IMP7L2yS95o33V0KVdeddX6K69c20Ze/PBHP0pC1l133bVu/frLL7+8tX39+hUrVwYKGRsbu/Syy6655ho5PrlI9H9uvjnZte3ZZ1dJ+m4X9fWvf71x6aV/eu45uwTfmyVRPXkhb8qCBQuOPvro5Et5IV+m71R6mF1sjTllSkPIQkTEmkJWujChViUWb9iwONnS+uKnP92Qrew8uMFc5VELQO0irAInnLpDlnOI0lEZlF6XoqYhkl63Pwjd7XqVq3vgZI5MzyHr5z//+UUXXXTVVVfJa4lFixYtes41443nlFNOkfnt6tWrV61atXTpUtnyxhtv7Nq1S15IIFq5cqXUIrN9yWJVavne974nVSxfvvz73/9+/FmBATnssMPS18njFOTf5GI54Ytf/KLjnFas0qtXkrnSlJWucHUP0Aenr+XFOd/+9jnpYelZ/nKCLFmyRIZFhte5VyKY7JU3JXk7fEh2lVSVrEVeeuml/3799UnI+vFNN13S3d46IHij1tZt2y5Z0yI5/op162688cZk15NPP71i1aqkCvl3zWWXbXnsMbuEmE9vci+e/ToAISuFkIWIiLWErO4sWb1qhyZ9HVjniyRMZa+TV1kB2cZ+rulcc801+qZ++dI+pt6Q5Rsi18aBSFh9HKJcz43Nuu/tFNrn4elnN8eTZSwJFL/5zW8uv/xyeZ0ELs13v/tdfXGpfBkocPbs2StWrJCcdeaZZ/7iF7+QLRs2bEieUXDffffJRtklB8yZM6eHwlPOOOMMiRILFy5MV8piCAzIkUceOd6+Im7t2rUHH3zwePsuLckIyZLQEUcc4TqpFZacq1dZ3Epf+UKWM4Z1z3Ke7UMi4dy5c2VYLrvsMucBN998s+y98MILt2zZEijnlltukWMkjiVPLPlRdyVLotA5556bbj8zeKHm+++/f9N///fKc86RTCcHy5suH7Bk144dOxYvXZq8g6vbvPHPf9ol9OnGSUJWCiELEREr3ZOVrTKkE19zVaJ7Wjql1q9VtsroltbnuJHOrp3z6vG67smKHKIJiZZl6dcQJWTrVVa+7n7V3aE/J3ok66FP3dy6devpp59+3nnnSeQ56KCDJAHJjPeUU07Zs2ePcWQahQpD0EknnbRs2bLly5cna1Uy0fpCm+QWHtmY7B0ZGemh8ISdO3fOnz9fkprv4QY+AgNywgknSAvPP/98KfO2224bb18dt2DBAqll3759xr0/ObK7svTyU5qIujnJG7JcS13GuWaZXuQdDAyLhOhVq1adffbZf/nLX8Ll/Pree5e3k7J8Nn7729+mD7544aWX5HQpRLZfl398upOtzz4rgylhatGiRU8//XSyMXmqxl133/2t66678847JYs5b+8iZPUbQhYiItawkuXMU+VDlrpIbILixjVtfHvrXMkqHKKBDFnjfRoig/SmLGNAnB+N/EWmddGPbq5Zs0bm5DJn3rBhw/r167/xjW8sXbpUtiQpw+C7bQrbKWFjyZIlMqm2V8TG20/YllgnBxixJbLwhLvvvlti2uLFi8s+Bz4wIMcee+w999wjGVDKTOb87733noyJbPnFL34R9SzE9KasXFxqXREYG7LMRTH9VI3j3WtmeS644ALJWaeeeuprr71m7509e7aMvPOhfDa7du2SOCyfBxkN/XTBvXv3SmiSwY98EOUjjz66+KyzGpdckjxg8PXXX//hj3703PPPS7FSxff/8z///Gf3twqXC/YbQhYiItZxuWD1lSz1JISBiRu1Xi44JVeyCulxiKzFqM6GrO+5iNWP1atS9NDNnTt3HnfccTIhv/fee9ONMp2WWXp6LV8PSJlSwvz581999VX5cuPGjRe1+eUvfylfvvXWW3PnzpUDnH+XKpLLLrtMQpw08o477hhvXyb3ve99769//et4+yq1b3/722+88YbzxMIHX0i6lOatbD/SQfKFVPHTn/50PH/HVoa1uNTdUONKVrknFkqESZ6wZ/8NqYcffnhum1tvvTWmqNtvv11ClhwsYVOHrMcee0y2S26KfIr7+quuOumkk9JHCEqkuuTSS+cvWPDcc8+tW7duwcKFzz//vPNE35uV/gFiiVQLFy782te+lnwpL+TLNGd9y7PQRshKIWQhImI/78mKDllm3LBj2iQwIfdkDWXIyj9d0P4YGBFr3Dl6E0gP3bzppptkXnrEEUfoi7V+8YtffPWrXz3kkEP+9Kc/9daSZK573nnnyWspWTLXySefLGll9uzZybT8kksukQOOOeaY3sofbz9TXZot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RUwYjUaTyST099YeEz5l0MI58/Dhw5Axwyl0//59MQFOFTEBYMCKmBAm9vb2itufHsAywjkTTp5wCokJcNqICQADFvp1Ozs7RVIYjUbj4do7BjZ9DI5EOG3CyRNOoXAiiQlwqogJAAMW+nV3794tkgKs4H4unEL37t0TE+BUERMABuwmrNWmz2jg8RETAACAiJgAAABExAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQERMAAAAImICAAAQERMAAICImAAAAETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACAiJgAAABExAWDIPnjtytdqrr3da4Ur165dWbjsoVq1cuWzFr72wVrb1HPLebMP1f7lN3cUdT6eXehowApzj2KLKy+WXH697T9sbaus//a1Iz0t1nGAep3DYV6Pd4gFzemcvakr6PESEwCGLP4sC72Azs+2498B3uCn82Pe9Ab7zJty/Hf5ceYsMWH1OsSE9RATAIas+VlW+/zMUkNlkKH888prb1e6Q1dee+1aczDi7UTZfBPZaEQ2q9qAdBcrVU9ZFldeaeEHqXWrm+5YMV4s1YbKQExeWlnmg94HJ9tKo7sS11w/INPptpem3Eht29k23q5M99+FxFHtbGrekXxtWlwunyxseYFaD1114R57l371O+rsOK+6G5banXz5a9Fi1aPasa3kMe8+K3rtbH3J6ohgsvLUlZK9kLO9ms9InAZtO5h8W0g1qWOVZV6ClnO4fJvLmz49xguvqf4HsL5u8vgMgpgAMGSJr7zCB9z8U3P+UVos1ezJRx+zs05NYt3aRjs6wLXCVD3zbzRbKo/XrdfSeS9IsWR9sZY2VPtvzWPS6+DkvYmo791Z86KjVJmq7EPRS4lewZ670LLTrU0tOkjzlNZR2HmqJQ9dvVWde9e6Unud/c6rlte012I9t5XYjQVnRd+djc+9sk+brDzRp52fsN0nUssOJt8WUk2qbTF5Ffd7CdpOi2lMqK7d9XbX1p4FB7Dj+AyEmAAwZOn+UNmfq30b3N4TbvRgk+smN7qgA5ysp9kzSFZe3e5sleTHdHJIJZESUvuy4sEpK/mg8+aHRs2tRymZacqaq9PJo9dvF7pUX536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Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxNSAwIFIKICAvQ29udGVudHMgNDY0IDAgUgo+PgplbmRvYmoKNDY3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzUyIDAgUiAvWFlaIDcyLjAgMjQ5LjAwNiBudWxsXQo+PgplbmRvYmoKNDY4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDcwOS4wMDUgNDA3LjAyMyA3MTguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ2NyAwIFIKL0ggL0kKCj4+CmVuZG9iago0NjkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA3MDkuMDA1IDUzOS45OTcgNzE4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0NjcgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDcwIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzUyIDAgUiAvWFlaIDcyLjAgMTcyLjUwNyBudWxsXQo+PgplbmRvYmoKNDcxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDY5Ny4wMDUgMzg0LjcyMSA3MDYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3MCAwIFIKL0ggL0kKCj4+CmVuZG9iago0NzIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA2OTcuMDA1IDUzOS45OTcgNzA2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0NzAgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDczIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIxMiAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago0NzQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjg1LjAwNSA0MDcuMDgyIDY5NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDczIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ3NSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDY4NS4wMDUgNTM5Ljk5OCA2OTQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3MyAwIFIKL0ggL0kKCj4+CmVuZG9iago0NzYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjEyIDAgUiAvWFlaIDcyLjAgNjQ5LjYgbnVsbF0KPj4KZW5kb2JqCjQ3NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2NzMuMDA1IDQyMS4yODYgNjgyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0NzYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDc4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgNjczLjAwNSA1MzkuOTk3IDY4Mi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDc2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ3OSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMTIgMCBSIC9YWVogNzIuMCA1NzMuMiBudWxsXQo+PgplbmRvYmoKNDgwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDY2MS4wMDUgNDAyLjk3OSA2NzAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3OSAwIFIKL0ggL0kKCj4+CmVuZG9iago0ODEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjgwOCA2NjEuMDA1IDU0MC4xNjggNjcwLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0NzkgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDgyIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIxMiAwIFIgL1hZWiA3Mi4wIDQ5Ni44IG51bGxdCj4+CmVuZG9iago0ODMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjQ5LjAwNSA0MTEuMjc2IDY1OC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDgyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ4NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDY0OS4wMDUgNTM5Ljk5NyA2NTguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ4MiAwIFIKL0ggL0kKCj4+CmVuZG9iago0ODUgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjEyIDAgUiAvWFlaIDcyLjAgMzg0LjQgbnVsbF0KPj4KZW5kb2JqCjQ4NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2MzcuMDA1IDQxMy44MDYgNjQ2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0ODUgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDg3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgNjM3LjAwNSA1MzkuOTk3IDY0Ni45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDg1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ4OCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMTIgMCBSIC9YWVogNzIuMCAzMDguMCBudWxsXQo+PgplbmRvYmoKNDg5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDYyNS4wMDUgMzk2LjAwOSA2MzQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ4OCAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0LjMzNyA2MjUuMDA1IDU0MC42OTcgNjM0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0ODggMCBSCi9IIC9JCgo+PgplbmRvYmoKNDkxIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIyNyAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago0OTIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA2MTMuMDA1IDEyNS4yNzYgNjIyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0OTEgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDkzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNjEzLjAwNSA1MzkuOTk4IDYyMi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDkxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ5NCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMjcgMCBSIC9YWVogNzIuMCA3MDAuOCBudWxsXQo+PgplbmRvYmoKNDk1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDYwMS4wMDUgMjk0LjU3OCA2MTAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ5NCAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA2MDEuMDA1IDUzOS45OTggNjEwLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0OTQgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDk3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIzMCAwIFIgL1hZWiA3Mi4wIDQzNS41NDYgbnVsbF0KPj4KZW5kb2JqCjQ5OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1ODkuMDA1IDMyNy41OTMgNTk4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0OTcgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDk5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzcgNTg5LjAwNSA1MzkuOTk3IDU5OC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDk3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUwMCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMzAgMCBSIC9YWVogNzIuMCAyMDAuMDc0IG51bGxdCj4+CmVuZG9iago1MDEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTc3LjAwNSAzMjguMDQ2IDU4Ni45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTAwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUwMiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc3IDU3Ny4wMDUgNTM5Ljk5NyA1ODYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUwMCAwIFIKL0ggL0kKCj4+CmVuZG9iago1MDMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjQxIDAgUiAvWFlaIDcyLjAgNDQ5LjM2MyBudWxsXQo+PgplbmRvYmoKNTA0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU2NS4wMDUgMjA5Ljg2OSA1NzQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUwMyAwIFIKL0ggL0kKCj4+CmVuZG9iago1MDUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA1NjUuMDA1IDUzOS45OTggNTc0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MDMgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTA2IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4NSAwIFIgL1hZWiA3Mi4wIDU1MC41NzIgbnVsbF0KPj4KZW5kb2JqCjUwNyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1NTMuMDA1IDIwMy4wOTYgNTYyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MDYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTA4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNTUzLjAwNSA1MzkuOTk4IDU2Mi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTA2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUwOSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyODUgMCBSIC9YWVogNzIuMCAzNTkuNTI4IG51bGxdCj4+CmVuZG9iago1MTAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTQxLjAwNSAzMTcuNDkzIDU1MC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTA5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUxMSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc3IDU0MS4wMDUgNTM5Ljk5NyA1NTAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUwOSAwIFIKL0ggL0kKCj4+CmVuZG9iago1MTIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzExIDAgUiAvWFlaIDcyLjAgMzk5LjA0NiBudWxsXQo+PgplbmRvYmoKNTEzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDUyOS4wMDUgMjQxLjkyNiA1MzguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUxMiAwIFIKL0ggL0kKCj4+CmVuZG9iago1MTQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA1MjkuMDA1IDUzOS45OTggNTM4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MTIgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTE1IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzMyNiAwIFIgL1hZWiA3Mi4wIDI3My4wMDQgbnVsbF0KPj4KZW5kb2JqCjUxNiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1MTcuMDA1IDE4MC41MzUgNTI2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MTUgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTE3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNTE3LjAwNSA1MzkuOTk4IDUyNi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTE1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUxOCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszMzcgMCBSIC9YWVogNzIuMCAyNzYuMjExIG51bGxdCj4+CmVuZG9iago1MTkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTA1LjAwNSAzNTkuNDgxIDUxNC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTE4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyMCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDUwNS4wMDUgNTM5Ljk5OCA1MTQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUxOCAwIFIKL0ggL0kKCj4+CmVuZG9iago1MjEgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzg1IDAgUiAvWFlaIDcyLjAgMjI1LjI3MiBudWxsXQo+PgplbmRvYmoKNTIyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDQ5My4wMDUgMjY5LjQ3IDUwMi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTIxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyMyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuNjI3IDQ5My4wMDUgNTQwLjM0NyA1MDIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUyMSAwIFIKL0ggL0kKCj4+CmVuZG9iago1MjQgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDA5IDAgUiAvWFlaIDcyLjAgNTE2LjA2OSBudWxsXQo+PgplbmRvYmoKNTI1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDQ4MS4wMDUgMjc1LjU4MyA0OTAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUyNCAwIFIKL0ggL0kKCj4+CmVuZG9iago1MjYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjYyOCA0ODEuMDA1IDU0MC4zNDggNDkwLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MjQgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTI3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQzNyAwIFIgL1hZWiA3Mi4wIDQ1NC4xNiBudWxsXQo+PgplbmRvYmoKNTI4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDQ2OS4wMDUgMzYwLjA3OCA0NzguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUyNyAwIFIKL0ggL0kKCj4+CmVuZG9iago1MjkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3NyA0NjkuMDA1IDUzOS45OTcgNDc4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MjcgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTMwIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ0NSAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago1MzEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA0NTcuMDA1IDI2MS43MDMgNDY2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzAgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTMyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNDU3LjAwNSA1MzkuOTk4IDQ2Ni45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTMwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUzMyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NDggMCBSIC9YWVogNzIuMCA3MjAuMCBudWxsXQo+PgplbmRvYmoKNTM0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgNDQ1LjAwNSAxMzIuOTA4IDQ1NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTMzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUzNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDQ0NS4wMDUgNTM5Ljk5OCA0NTQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUzMyAwIFIKL0ggL0kKCj4+CmVuZG9iago1MzYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYzIDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjUzNyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDQzMy4wMDUgMTE5LjA2IDQ0Mi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTM2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUzOCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDQzMy4wMDUgNTM5Ljk5OCA0NDIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUzNiAwIFIKL0ggL0kKCj4+CmVuZG9iago1MzkgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYzIDAgUiAvWFlaIDcyLjAgNjc4LjggbnVsbF0KPj4KZW5kb2JqCjU0MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0MjEuMDA1IDE3MS45MiA0MzAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUzOSAwIFIKL0ggL0kKCj4+CmVuZG9iago1NDEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA0MjEuMDA1IDUzOS45OTggNDMwLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzkgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTQyIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ2MyAwIFIgL1hZWiA3Mi4wIDYyNC40IG51bGxdCj4+CmVuZG9iago1NDMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDA5LjAwNSAxNjcuODMzIDQxOC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTQyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjU0NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDQwOS4wMDUgNTM5Ljk5OCA0MTguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDU0MiAwIFIKL0ggL0kKCj4+CmVuZG9iago1NDUgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDY2IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjU0NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDM5Ny4wMDUgMTU0LjY2NSA0MDYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDU0NSAwIFIKL0ggL0kKCj4+CmVuZG9iago1NDcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCAzOTcuMDA1IDUzOS45OTggNDA2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1NDUgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTQ4IDAgb2JqCjw8IC9MZW5ndGggNTQ5IDAgUiAvRmlsdGVy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bmRvYmoKNTY4IDAgb2JqCjI4CmVuZG9iago1NjkgMCBvYmoKPDwKICAvVHlwZSAvRm9udAogIC9TdWJ0eXBlIC9UeXBlMAogIC9CYXNlRm9udCAvRUFBQUFCK0RlamFWdVNhbnMKICAvRW5jb2RpbmcgL0lkZW50aXR5LUgKICAvVG9Vbmljb2RlIDU3MCAwIFIKICAvRGVzY2VuZGFudEZvbnRzIFs1NzEgMCBSXQo+PgplbmRvYmoKNTcxIDAgb2JqCjw8IC9UeXBlIC9Gb250Ci9CYXNlRm9udCAvRUFBQUFCK0RlamFWdVNhbnMgCi9DSURUb0dJRE1hcCAvSWRlbnRpdHkgCi9TdWJ0eXBlIC9DSURGb250VHlwZTIKL0NJRFN5c3RlbUluZm8gPDwgL1JlZ2lzdHJ5IChBZG9iZSkgL09yZGVyaW5nIChVQ1MpIC9TdXBwbGVtZW50IDAgPj4KL0ZvbnREZXNjcmlwdG9yIDU2NCAwIFIKL0RXIDAKL1cgWyAwIFs2MDAgMzE3IDM2MCA2MDMgNDExIDYxNSAzNTIgNjEyIDU0OSAzMTcgODYyIDYzNiA1NzUgNjMzIDYzMyAzOTIgMjc3IDYxMSAyNzcgNTIwIDYzNCA5NzQgNjM0IDYzNCA2MzYgNjMxIDU5MSA2MzYgNjM2IDY5NCA2MzYgNzQ4IDYzNiA1OTEgNjM0IDMzNiA2MzYgNTc5IDYzNiA1NTcgNjM2IDc3MCA2MzMgOTg4IDYzNCA1OTEgNjM0IDgxNyA3ODcgNjEwIDI5NCA2ODQgNjk4IDMzNiA4MzcgNjM2IDI3NyA3MzEgNjg2IDY4NCA3NTEgNzg3IDc3NCAzMTcgNjEwIDUzMCAzOTAgMzkwIDY4NSA1MjQgMjc0IDQ1OSA1ODkgODM3IDgzNyAzMzYgNjU1IDUwMCA2ODUgMjk0IDEwMDAgNDAwIF0gXQo+PgplbmRvYmoKNTcwIDAgb2JqCjw8IC9MZW5ndGggNTcyIDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJxdlE1vozAQQO/5FT52DxXYY0MrVZFWqVbKYT+02f0BBEyK1AAi5JB/v+A3TaVFStqH7fE8jzPZbv+677vZZL+moT7E2bRd30zxMlynOppjPHX9xjrTdPWslL7rczVusmXx4XaZ43nft4MRZjXXUWcak/1e/rnM0808fG2GY/ximtiu739OTZy6/mQe/u4O97eH6zi+x3PsZ5Ond7Fv0t9s970af1TnaLIU53HfLJO6+fa4LP+c8ec2RuMSW3KohyZexqqOU9Wf4uYlX56tefm2PNs1+n/jZcGyY1u/VdN9ers820R2oTx3OeSgBpJEQcd8otJBZaLCQk+QQM9EiVCVyGvMYyLRdTVjBdSwQ4AiMTVKy5hPZHPGniEcCowsDkUN4VCSmcWhKKEAkZktmImtVT/dDz/B3eLnydPiVz5BOASdiYPoTBw8Rg4Hwd3hUCqpA1EcDg4/h4Pg4NThCOEg5OJw8JyEUwfOzKkDfg6HQtdRo6A7UKPACTqtkUbBr6SaTmvEOsHPk7XgF9hP8PNEEfw8UQQ/z36Cn1QQfk7H8BMqJnoHdSZ+gZMXvYOcp6gfZy16B3EXrZ/mgp9XI/wc5+nxCzh4/ARbj0MgF49DqaQOxPQ4ODLzq4O7k/6OqK3HQbitXn9HOqYOSuqgueAQ8PN6B8klrA7O6n5Be4FNjUQ7hnz0j89+g06OR6F3m3wsiQgF8u6jlIYLSFwirb1q7bn3Rlhfp2npganlpua3tr2uj/fePQ7juip9/gFxpWLsCmVuZHN0cmVhbQplbmRvYmoKNTcyIDAgb2JqCjU3OQplbmRvYmoKNTczIDAgb2JqCjw8CiAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yCiAgL0ZvbnROYW1lIC9FQUFBQUMrRGVqYVZ1U2Fucy1PYmxpcXVlCiAgL0ZvbnRCQm94IFstMTAxNSAtMzUwIDE2NTkgMTA2N10KICAvRmxhZ3MgOTcKICAvQ2FwSGVpZ2h0IDcyOQogIC9Bc2NlbnQgMTA2NwogIC9EZXNjZW50IC0zNTAKICAvSXRhbGljQW5nbGUgMAogIC9TdGVtViAwCiAgL01pc3NpbmdXaWR0aCA1MDAKICAvRm9udEZpbGUyIDU3NCAwIFIKICAvQ0lEU2V0IDU3NSAwIFIKPj4KZW5kb2JqCjU3NCAwIG9iago8PAogIC9MZW5ndGgxIDIyNTA4CiAgL0xlbmd0aCA1NzYgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnic7XwLfBPXueeZOTN6jN6ybNmYx1iyMQ6yTc0rOARkbIENwjK2eAaDZUm2BbalSLKNTXmkNGmT9JbQpCRhSXF702webeJSflyn2Sb03qS5WZLbppBms+3dJDfk13aX2+be0jalMN7vnBk9bAwhQB77+62FNGfOnPM9/993vnMsgxiEkB7tRRi5fS2VVaO//tM2hHLnQe+6YH9SfOTIyExov4oQ090R6+z5zbb/eBEh9mbou7eze7DjkOnP7QjhqQhZ87vCgRD6n2tmwfyvwfMFXdChf4I/DfcwBxV39SR3bJ3BA63c38K9vzsaDCD0D4uBHnm+oSewI4aHVFqE8qAPib2BnvA/zvmXKXC/GaFb22PRRHKsH21CqOUEeR6Lh2PfOMA64P4dhDg9yOhkKtEoOgnvn6An0cvsy2gYLYRXM3qeuZsthyePoa+gt3gWHUOHmUWMjVkET0+pbKpB/k7+cXi+GebWA5W30P3Ag1AaRXvYnWwT6kAv86+hQ/CK0v4P0I+YfegN9BA6ydajP6N92I/2w+sQSnCIf4MRkMTORo8STvBCCOyEpuFy/g36+gDtQTuRHz2qGlXZmFNU6seYf2LOot+BzKfwZnw7zDiMHmfu5Jzc41w92i/Li9vQfnYfc4hro6+dYL0BdJhrY55U2dBLRFboaQJJO9B/g/cAeo25hbkT3w2S7SQS8G+g19QruUpZKvUuPB/0QfB+Gh1F5fggzKe6qDrQYbYDeP0ZJHkN16EyoJZAyIbQQZR7XMVzmGWQSzSPsCUNoRH3mg3iP28sKndNuBXNanEENY0YBsXRsbGmDVwhv3GEnzqCSzQjXInz3cs9fLfctappgzjyQ0+dQtXTVgd9LRugSe6gG/o9deVI+alT3sOAgy+DDQBj+CHAxRyEeMCrygXaAvY0ZxDSPoqQsBeAX4yQAZ4bm+B9FiGTHyEzYM0Cb6sesahDOsh18I9CdKjRFLee+wFS/YDR8HUshypfPH32C8h8+uzps3NyLEWWkiJLUQeHLiRw4YX3pYNq44f/GVeVIQZtZt5mH2L3AY2lbi0bRByLGMyZT7+6aBGdP4dZNWL0b/gx4pAbhnOIGztxs2XhzRvdhq3sVhxlo3gPuwerUGtOkbpoF1s44+J77D7QALFjgFHuLHhUjQT0lNut4bUahmUEnmU4eGOeZRktr0ZqDS9oQH0Vj9Q8ua/WIG6TFi1XsYJWQ1zJaHSsWgdCWewgVeXiM6fPWhfNAWurzfy/q+GfWfPvtKncyj0bHUfVGoZpdbtMnIk3aU2CRnO3RqVBGo1GmILsqptQPWpg6rkVqvV8F+rkB/ivakytqJWZyzhxEXZqmSL2P99nck8tudh26g38uNTKFvNvnJ/N7JHu4I0XC4iO56V13HHAuQWVoN+5fTqB1Wv5YifHq9Qc1vDFxU4H3M4Q2elFvLPYacthc63QUUKeVBdZsd47HXtzh6avcewp3j3TMbNEi4qc1mJkzC8ucc40n141ovWvGhH8t60a0ZEPPfkwkA8j+TCRDzP5sPhv2/AscoJ3Np457dbuyd+avzTflM+1nrUsssIL/oFDz5w5c+6s+feWRdnmA6uSFrnINpRb8LnRwRxvK42VHinFrW7tcOl9pXtL95Ryrcy8mU6HSm1kcm15c6sWLFzCMEuYuVV5uTYWOp2OmaXYyczFH+7d0fzN6kV1e/vXf3P+ouUXf7rylZ3fe74/uvJHnQPfmZUYZcpH2aP3H/Y3+d7p/dqDzY3N/4uJBELvnnxMOjXgawm2X3xaJQDOt4y9x32F2lhEHrc114sKvdohtKYo36i3GrGjyHzu6BHMtJ4FvY/o9+i36pfqQW+iLlF2DnM05gAYaD9wDDv2OJY6uFbeMXP+PCJ2WmaGKGKdn9KL1bz0vm9p8NyhF/5P49L2c9Lgnjue/eOXdnd9x105d9offzF0cd1de39/4k7pw/V37WVOPvQgU/vhgQcCwZXPAyYAVYithHxH4jLmvonlMcIMDwGv4tUcQJzj1NUQapu53SpACQmFWaiEUxdriB5qpvVFNx+D5Mm2njtzYtEiC3Fc5ZkLZ9Mey3oDxt1agnF1TNumbdJiAK/aqZ4L5h8YLR8tHf0VJPDfnfwbSTtELmrHAvS0e7UG4o3jMQ/9LM8wyMAbTUZBx2r1vMmYY2VtFriaeZPJWK3HFsRovbYh024DYzAZkd2sV2GWt5iYUrvpJmPxFCK4kWk9c/rYVvtSO0swZ19kUURfDF4AwF0CuTTwUm+Ct+NzCpcW3lcI3jzaVsi0MkePkE/szFnCKM6B9ly14jkV17fv2X1aYdvWB35ZtHP0rdGS1f9j4IG/17KPXtzMPlJZn+vf8tITF+/n2kYC24YPFDeTTMygfeCKdv5bYIdD7iVaagiVgHmr3crydmsBvPN5u91abcXaHCZqz0W7tbt0tikF+fa83ByrXidoQXvGhEymKeYXswLUqEQpxKGJxKH5hJ1GXeXZc4tfPFs1PugyoQY+zM8hPtQVsPk5nfmDeYMFfCujLsI0vm5h1E4ZrjnOhXNz5mLcPlU6MKBSrV77oxkjj35bpRo4PO3hJaO3cm37Lw47Kgzu6kN7v2RfWMS27WeWSP8o6wy+Vy8F389mct0JW47VYuZzTbzeoDfyBoNeBoM2g4YCfkrhlDw7m5vPF06ZMZ0Vp8F1Kl9YOKU636TH3DQnQDpX650pDhXuLjAwBVOm5ltNRr7QgFmnCpUxeue0QkOpkylV8WWFU4pdBCFTANrHYoVthWzrabdhrGwYXveVRct8ZarWs2dPH3vG2eak2KHIgX/wJjAiGAIQLQYT2gFXHwWjrFvZunPKwbrH3eVt5bFyyGM5Y+Vvl79QPgyv+8qj5U3lvnLtJRCbBG72FOjUlftG79BoQpvu+sWMnaP7oLXhq6T1q1HnqlcSQ4+Y/f+6875HNBSE35q9JG9T6JVvX9zPfqtkacFtYdLk2p5u79wb7//iYw8V+Yh/5Bx3APyjRTPRI+5iFBVyV9kaLd584Ysqb9FQ/ppSoVinRdhoy8XOYqOz0FFKTFpIs57ug+KfFx8p3lq8tJhvPQtmk61G0t8Zs3Tu95ADj8ZmgREYtyuKogxZtbs1UW1UiOqixdGS6Mx7cu6xPZzzsM20P2e/bX/u/rxDOYdsKrIWHl2goblz1s9nDc9aOgtyf9o0fFF6AZCz/vx51lROVeG3MN6/8+5fLMDzLzyu4p46vOOXm53BUz2/+9uuwcY3B59/V88+YHZYhr7+/SP7Z7rM9z60YN7xWbPefu0Zprx/ZdOZExURitt1Y+/x+6EenYFa3FPMFsMmGxNGSW7TtHW2NaKZsSBhKrIbRPO5F2mOkZUmWf+XPyWli8FP10ioX8SxE0BOhJeb1i9Ho0VgD3UFyM2lFrJiqoeILKDHgmLQg99f1vbmrqeki1sWLz31yr0MGqwc+OOQ9K70452JIWbRz/e+z7e/Edjy6OPd/zH06i83bvzD3HnMzUzeUWbD1x+8b4USd/gYXbsecht0AlJxFrXWotUUW0HkYyRps62vHotZmixsq3URrW/cepVOjSzYaxzS7lZXgj5Q+JDcMVLdtME9Rc1rtBpYNWA10WoMetaog6vAayGRTRIUAH8fTS45buRm3Kzb6Da5zW6LO6cpR9t69EgOGIHYYBzQ8YGp9WX3/7r4dgLphpOJ6dXT8HGT+e3nLr4E0A10qTUUs37ALKnxRcgqU90hklRMvM3IM0inZwUDXJ0OtrgIrmU3sbNmk+TCc6wK80qSqZ4NC1+R0V4U1c/yqvJX2XfavIVDqjV6ZrajyG40sOoSBk3H+nxcYnFOLzFqHTSNaAnmjy6dDhcKdNlqlS+eOXeBON78e1LuXKHCmfBJEoSdQa3uisX5iwt8+bfl31awLX9bwVD+UMG9+XcX6KryavPcdn9ekz2U12ZP5sXs+/L22nWtxKjfFYZ1w/phw3DRsGPY+d3i4dlaoGT4gOaWGOSWpeUqun4tVAKkuIxZmA6gdLBAhlcpkcR5d4061vxsz/5/gB1VDoMElj2wb9OPQ2LXy60//Znw+ui/vRVtP/hOMbvn4h1PhoLP3P3imS9ocmwbgxUVT5aWfu/Roo27B/dsCL15TM77AxA/x6AGt6MfuhfreYPRoBVYHW80GkjKx7wGljxkJ9WJvVrH2o1Is8myRo+W59uRTa+DSh1m8PxUWz7sBcwnTljJikajrGriop7JvCnkMe6iXG2ukKvL1ecaco25plzzPO08YZ5unn6eYZ5xnmme2dzKkAUU4jOf7i/yUb6yvziKCsBwc3E6xcDKx6IiRzFZCZlbT47otIe++ZM3K0ZOHrtFOi69+470N0Hg37jQd6tv+j37T/8B33ths/QL6Z13f+JcX5XOsfw0qMtyoFZ/zO2VlzWrJb9gSiFnnwotlmExgmsObyULpNViMLJ6E2+xWqpNyC569XYvXqMfMm+2TsuxmS0mZLOWWGxGlWMmwaWK5mL1VovJstSCW88QZBIckgJgYtWdqbUnAyTU3HtLh0uhCCoZn1ftObA1YVI1d7paxRtW/vedj/9Tf2zljzq6v1u+41np9Wcv/nZfct39N99Sty+x/uD8as/jgdD7Lz/GlENh3RVg2/96lhk58J2WNf5fb7/3cPPqll+DfRbCXvRlwIoOttEet9PA6yCQeaSr1m9Cyw2bBJsRKkGDjhGQZSqHWF1hrvkcbMUsZG9htcuFjlylpopTpgiSKdTXKs5ZxGByM29mEbOJOQrvwF39A9I3zkurmNfeZTRMC5P8YAzxb0i/kt5+QToy+MUhvvJvA8xdTPDNV+Q8qtTUK932TEVdjTazLGYQKsHFnLINOGM+IVdd2dAkhTLkHKgqeYDVsRjfxLN0owd1svQ6FMl/PUvjhdjgJbCBFp1yu1mMWZVaxWC1GrIWB8mLZ1io32Eni7Rq2OLBZr1aDZhZruFJXuM0WjWDVDzLTUOstlAA85w79yK1Dylo5GK4KoWC1J41a++q7FoZkrCbrOpStaheyi5Q17O3sdvYe9gvqwUVY2PMrBmbOTNvUeWpHUyZaqZ6PlPN3qpaqG5QrWc2qrbqutjtqgHmHuar7F2qr6i/zzyhekY3jazmRQwgCFzhBAeYmcPnX5L+VfqDFD4PKv8N8ej8bF5z/kNih3vBuKdorIy6Fwu8zqTT8iadCt4shg05DxsDXTVvZvSaqIrZhTYbVbsFvWA0cLocMy2pYW8PFbLO9rG3sDpSOsPSaGozkaVxGDUhthXCQkbYmaoLEElV1ktCKQ2548O5TbnuXNgJkaxqYoqgkHaS0pmEED41bSR0W56NqSyUXn/+2RdGpoyYZr7wmsr2sC8S3H+hEr++v/Gnw6A/qcdWwto2A61yT7WsMjcavDa0imnkvNOGUpUHbIQc4ysPsgBBvUUqD6t/kqJDrjeyNs4T6iZuZcmybzZtOLJg3ZYHD3mfanU2PbHx7Q927fT/212Nh7j5x+fMWbJo/f/e9eADFRXHi4re/tnTTElfU7MTZf8wnJG5D3yJ+Ln8w2gBM51cxzz4TdTBWiGKdCqMMadjud8g41gzujgmFItFHBI1TR2eEJF2bExlk2zMIXUP814bYl54+y8yXZJD1wsHzc2zt5oW/wnN0NDuf1n65g9S17+8c3GuYbnmXsglGmUG/VT3SNMQMtz5l3f++qxhOQoBqrJ/crnXQDZAHPse2swPjt3P28bOc++jLewiVM9bUT12on3qk6ieO4u28AfROrwS2r9Bfv5XaIC3oS2qMrSQjr0A19fRvVwH2kK55+JGNBt1IXJaZoYFBgIWG1kDSMfB0ynMEkVGhB5iqtLy6pj3lDaL1MyY0sYoh61U2hy0tyttHunZh5W2ClnZV5W2Bko4rLR1aBpeo7QN1kdmPaW0jWjeLT9U2makW5yymQWpF08Fjgynha45lDtpMyiPOam0WWRk/qC0MZrJqpU2B+1apc2jfHaP0lahYvYxpa1BDvZtpa1D1ThXaRtKqnFUaRtR1y0NStuM8m75rdK2IONiPapFURRDgyiOIqgTLJwEjM9CQVQG1yo0B15zodUOI0S0DMYkUQLecRRGAdSDXNDbgHphfAW0alA3vETUnKaVoHdhuIZhTj98hmCkcBVcF6S5+oFTP/DaBnN6YTSRIwBzPh7HOmhtg3nrUB+MCMLYAKUWpjMCVCMRqPTCZwzGtAPdCIwTYX4UuAfoMwGh2mhsMB7p7EqKs4JlYtWcOXPF9kFxWSSZSMbDgR6X2NAbrBBrurvFZjIqITaHE+F4fzhUIVwydQGZ6g/092yL9naKywJdl5lYF94WWNcnBrsCvZ3hhBiIh8VIrxjra++OBMVQtCcQ6RXQBBVbqIIJ6JYntwR64canKHY7jAnDLVC4vS98ubnixPFZtMQbMncddVMCRkWp6avAWXPRPHgQjici0V6xqmLuvPEsUgzKJ2dA6JdfRrYOykUGSVKBcEqujmgv2DwJLkQUSEmAQTWqhFdIodEPNCpgbhSucYBGmNKLUxBVAF3Yz8LUZDJWXVkZAqL9fRWJaF88GO6IxjvDFb1heLw8S4IU6FLAvzS8yDMC5DANhjAoG0UDMJZA/8YAmlBaAU8GYUwXnRmBZzGqV5IGD7FanM4g4Uao9k+w5EQ9MgHbNy5gL6eNAK/JdJexEYBWttUuTR0CQOHaX8JVpaMbnwQn93dG5wg8EWgrSXsICnuorbdDXxQ88FGyEM2aKL0eSi0TZREqUxd9Flb06qRcehWvuxS/y96SuckYk/HuonJFqfd76fyYEskyhyhQTSoYiygoCFAasqUFhWaSSjERT0E6juBQpp6iQEbLsstYDtNEIGPPkYUSB/UcmRui1wSVKwhzAop+Ao2CICC0h1JJ0icp+3RAq1uJpFlpGTMcSJYj8icBvzL6CceMTUhPjEZNCDgE6eyUNCGqQZJirR2eJulTmYdwBQ4uJZqDIFkfpSLbZIBioItmpaRimR7al61RSof4OFTK0vZRG7qyvEPaPdSfsq+FrAySgNmuy+jhSutZSTOISCnL8SDTjihWHe/9K2udspwsbSyN6CSVK4O6jEYD1B49V8UhFQ0dNKv3KhqGsziG6Cfh4aJXYoltMCJI6cljUv4jOO5WMlvKQ0HKO0QljiiSVtPo9CvSBYBilGaGjA+yc1HGApdmgl4Yn1SiITFubCpWMhbLzgHZ80Sqc4BKLtDcPB5rsjXktSRwBX9G6SooKr7voddM/rgaXyTpSkRW1oCiUcU4S11pLrHJoLK2yNyJzTuojCEFSd0Up/F0jywpsWkoy+fZqEutoAG6IkZozuimd0JaoxCVlPirN8sanePWVZlTKocGKHpk7KZ4TLRP4iN1SkkpKBpkEBagPrp6CcbzmWiPyWRzKf7upvMil8nmQto7cZpnAzSvZOimehJpRKbiZeLqEVbyXJhqkeI0QLUK0fmOSdZDR1rviTMEeJZabR1ZKJNjxjthfWmn8R7NkrVPiYMUTvrhaWQSi4XRDmrnXiWSY/CSV68Azajh9Ixsv8syp3qESSOli2Z4kV4TioxhiqTL4SSV6ybL3SG6EvRSv2fbazKrClmWy/bhtcZqgmbN1FqdibZUJJHKoTtde8SVGeMpxiiit8Nnp+IxeT0kqBLSWfWTzFSX16pdiZGksh52pC1VjzyUjw81wh3h44M7P1oPdWQzfdYAfSLUcc3wZB3c1UFvHfVLDX1CnjtoNK6HNqHoQ2spLZlGM3wS2huRSGmL9J7crYLxjUCLzPWgDZSHB6i1gGQ+aBPaq6HXC1ePMo7MqIWetXBP2isQqUJlfo0wy09jh8wjssiS+qE/w3W8VA2UY0qy1XDXDPTrlac1QLuB0iPyu2h9RNqNipyy5ZopdWIjQpnQrAWJvPSO9K6FaxOMa6H2rKE6y9I2Uh2Ww3NZFw+VQPaELFEtXJuANxmxAuTyUysQTn5lpIv6kehTR+cTrqvoKFkyn+Jl0s5QqVBsKctB7L8uzbmF6u+Fl0j190OPn/qmBuin6Kaws4JSIHIL1BprqX411A4+ymEZHUesSOzpTSOuOcsrtdRexG9E8jrKqYZapGVSTVLUsr0zGTqENIcVVD8PtZSXjm4BO3pgfEO6R8ZjA9W1VrG1TFPGvYwJb5Z1a6mOxLNrgKtHwVQNtd14LYif1lP5M1rIHqhRPmuzbJbxfqPi3ZQ8fsrZP4lV1tNY9NBRNdTXLekYWU7jd7Ui+do0wjI5YK2CT19asvH2TcVRatzV5A6ZVor3eA/WUTx5FQlb0taQRwhXoCvnLg+sa0G6z0mm8/b4lTu7asxUo9l1pysr12ZXAnIWXkHH9kwYl+mVd0vympXZ62TXbpPtsFO7Y7mWT1W9mepDzt3ynii76g3R+lyuARPpqiRK68BoujIZoE8za3pMOTuJjtvnEc4Buva70rxSa1GGllxXBmi1QLglJrHm5Vco4ZKdYYyu9zKXAdpOKpUJ0a9PGUv6hybshlPnP5f6QJzUByldJqscsu0fp/6OKXupCLUwqScrFLpxlNqXZWxCLCCfu/VM8HoGfYRaNZp4qkBs0JkleYjaWkDyGR7hKdB8lTrj+uxPnW70Ifjn6TxIGHceNLHy+uTOg4RJz4PET/k8SLiq86DxlXwwS6bMWUdq5NWdoE52wiJ8ZudK4iXnSsL/P1fKOlfKnDD8v3muJIxbYT+7cyVhkt3a5+FcSZj0XCmj0adzriRc4bzg0zlXEtDHPVfK/NbpRp4rZeJt/LnS5Vbfy58uyftzuZL4vJ0uCWj86dLkpxufzumScAXrilkW/HyfMgkUY5dWM5/+KZPwOT5lEiacMmX2up/mKZPwkadM4qd2yiR8jFMm8RM7ZRKoDdYB1ZVUWtnaNfD80zs7Eib1+Wd1diRccnYkfmZnR8Jlz44yZ0Cf/NmR8DHOjq5E95M9O0pl1suvKJee+AjXcOKTfUpzI098hOs68bl0z3ZtJz5C1onPlc4dbsQJTfIS+m6UOWkQKB9yV4HQcvoFLfLdN/LtufQX7sRZiXBYbA93RwfKKsSr+KZchbiiezDWlRAjPbFoPBkOiR3xaI9YEw/3K18CS/Gg38zrk7+Zl81GEDLc14XjAVEWLf31PqH8ij/CpV8EvOrvEIoTOEcSQkBMxgOhcE8gvl2MdkykIghN4XhPJEG/TBdJiF3heBh4dcYDvaC6C3QHtWAaWCzeGXaJyagY6B0UY+F4AiZE25NgsQiYICAGQWgBRia7wik7BYPRnhgMJwOSXUAdrBzuTYD1HNQkjjIgFhIDiUQ0GAkAPyEUDfb1hHuTgSSRpyPSDU6aRSjSCWJLtCM5AOZ3lFFJ4uFYPBrqC4YpmVAEFIu09yXDRAZh3AQXuDnY3RcikgxEkl3RviQI0xNRGBEOcdmUQLYvAeOJOi6xJ0y0FihAEl2uLB4uwrMyGhcTYfADjI6AqIr6E1gT4YBsjBg6Kcimo4wGugBYl0wgbujoi/cCwzCdGIqKiahLTPS1bwsHk6SH6NcR7QawEYWC0d5QhOiRqBYEP5ALtEf7w1QDGUVUgDQIeqNJcENC7iVeiWUQID8TE12B7m6hPaxYDcSAKAmM0zPaC7iIiz3ReHhStcXkYCzcEQBGFbJQ45/2BAYhWmB6KNIRIUALdCcBetAAooFQiGoum44EaCAOcvV1B+ICYRQKJyKdvVSMTjlWYRJBaCAIRBJkRkqexEROhKQADKjBAt2TE1DmpOTIUAPxersHxUgWzAWiTjxM/p8QOpY0EsSQxC+p8AgD5sJxOmkgGg8lREc6Dh2Ed+qB4CBh66AmA894lXhpD0MkEap94ANik/5oJC1YeEcSIkYMxGIQXoH27jB5IOsOlElDyDilK5AUuwIJoBjuHWcTgroMukNiX29IETgjqkCFkzW8klcT0W4S1dRtxEkBsZtkD4iV1MBYILg90AmKQRz2RgUC1Y8HqnGsIGGBiOHuDiJUvUdc7mv0iy2+5f71Nc0esaFFbGr2rWuo89SJjpoWuHe4xPUN/nrfWr8II5prGv0bRd9ysaZxo7iqobHOJXo2NDV7WloEX7PYsLrJ2+CBvobGWu/auobGFeIymNfo84vehtUNfiDq99GpCqkGTwshttrTXFsPtzXLGrwN/o0uYXmDvxFognDNYo3YVNPsb6hd661pFpvWNjf5WjxAow7INjY0Lm8GLp7VHlACCNX6mjY2N6yo97tgkh86XYK/uabOs7qmeZVLBGI+ULlZpEMqQEqgIXrWkckt9TVer7iswd/ib/bUrCZjiXVWNPpWe4TlvrWNdTX+Bl+juMwDqtQs83pk2UCVWm9Nw2qXWFezumYFUSfFhAyT1cmYQyATVngaPc01XpfY0uSpbSANsGNDs6fWT0eC7cESXipura+xxbNmLXTAuBQLl7C+3kNZgAI18K+WSkbVbwR1CR2/r9mfFmV9Q4vHJdY0N7QQjyxv9oG4xJ++5RQBa8GexHmNirzER6TvUnTAKDJbUbDOU+MFgi1EDOgQxo0FdHl2BMOxJMG2EtxyaqRpVM6dLopaOQkAhFf0QuDKfbQJyxJEFl115OyWWbDJcuySUy9NH4BuWInk1BvqD0MGTJBUEo0LUZJMBiIJGumwBPZE5TVPTAS6gRnMIlFER0GuDHTDtERazHEBJaQWw1g8AlMG4pEkJBMx0Ae98ciQsgzHlWWKaiBmNCBcMslBlj8eTsRglYr0h7sHK2BsnKxlVJJIb0c03qOoTs0XTFanSoWk2EmJh6JJIRrvrBAFgVZc1106Xe3fUNyYOkiQ6yDxWuogIVMHiddYBwmX1kFKkg9SSonUmjFJgZopWITrqZXEVK0kfD5qJUH2wydWKwlywF5XrSTcwFpJyNRK4jXWSsK4uuAaaiXhcrWSePW1kpBVK2WH77hyCdZzSBI3qlwSlHJJvK5ySRgnLt033uiSSeiNitddMgk3tGQSlJJJvPaSSZhYMonXUjIJk5ZM4scpmQR/zbrVK31E7Jr6a6qOhIzm11MdCanqSLye6kjIro7Ea6qOhEmrI/F6qiMC1nGBki58hMsWPuLHKHyEKxc+4lUUPgItfMbXDh9d0CRT4920aBAq4FJxPX8zWEnP7bbDu5KenYXob/Uq6O9XY9A3/reFV/4Lw8qByPZIZQSS1Y6KWFesUsmY1/fHoeSvltHYn+C9m/y/mJf+jLJ73WM/kPBICX6mCj99EH/fiL+XMPLfq8JPSfjJEvyEET9egv/rQfzYefzd8/hRCf99Nf6OhL9dhYePtPDDB/GR1TX8kRb8rSr8iA0fPoj/i4APSfhhK35oF37wOXxQwg/AiAd24fsl/I0DK/hv7MIHVuD79hfy90l4fyH+uoT/TsJfk/C9Er7n7un8PRK+ezr+ahX+ioS/nIf3SfhLEr5DwnslvEfCuyW8a1UJvyuEvyjhnRY8NPgcPyThwR2t/OBzeHAvt2OghN/Rine4uYES3C/hvoM4GcIJI47fXsLHQ/j2mJW/vQTHrDgKYkXP4173mIR7JNwt4e15eFukmt8WwhHgEanGXY06visfd3YY+c4q3GHE4RAOwbTQQRyUcHtAz7dLOKDHbVsL+LYQ3rrFzG8twFvMuFXAm28z8JslfJsBb4IZmw7ijRuM/MZZeIMRrz+P1619jl8n4bX+Vn7tc3jtXs7fUsL7W7HfzbWU4GYJr2mq4NdIuKkC+0AInw036vBqkGp1DfbCxSvhVSst/KoSvNKCGyRcv8LC10t4hQUvl7BHwnUSrl22i6+V8LJduEbC7vN46Xm85DxevGAZv1jCt/wzroZWdQteJLlj+OZdeCHcLuDK+QXL8HwJz5Pw3GpcdR7P0eNKCZdL2CXh2fB49hfwTWZchs18mRPPmo5LZxr50hCeacQljMCXVOFifT5fvAs7+WreKWEH3Dmew0UwvqgQizN0vGjC4ujYCfchboYOT9fi6W5umhlPheFTD+LCg3hKQQk/JYQL8q18QQnOt2J7Xglvr8F5JThXwjYJ55zHVksBb5WwBahaCrBZwiYJG4GC8SA2AEPDLqzX6Xl9PtbpsSBhDTzSHMQqGK6SMA9a8NWYgzuuHGMzpv8jZj5mBMy4OTQVM6NM6M6/Y2Z/sj/oE6b/cX+m/V/iltNWCmVuZHN0cmVhbQplbmRvYmoKNTc2IDAgb2JqCjkxMDEKZW5kb2JqCjU3NSAwIG9iago8PCAvTGVuZ3RoIDU3NyAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicm8DQwMDN4NDAffIrAwAUlQOlCmVuZHN0cmVhbQplbmRvYmoKNTc3IDAgb2JqCjIwCmVuZG9iago1NzggMCBvYmoKPDwKICAvVHlwZSAvRm9udAogIC9TdWJ0eXBlIC9UeXBlMAogIC9CYXNlRm9udCAvRUFBQUFDK0RlamFWdVNhbnMtT2JsaXF1ZQogIC9FbmNvZGluZyAvSWRlbnRpdHktSAogIC9Ub1VuaWNvZGUgNTc5IDAgUgogIC9EZXNjZW5kYW50Rm9udHMgWzU4MCAwIFJdCj4+CmVuZG9iago1ODAgMCBvYmoKPDwgL1R5cGUgL0ZvbnQKL0Jhc2VGb250IC9FQUFBQUMrRGVqYVZ1U2Fucy1PYmxpcXVlIAovQ0lEVG9HSURNYXAgL0lkZW50aXR5IAovU3VidHlwZSAvQ0lERm9udFR5cGUyCi9DSURTeXN0ZW1JbmZvIDw8IC9SZWdpc3RyeSAoQWRvYmUpIC9PcmRlcmluZyAoVUNTKSAvU3VwcGxlbWVudCAwID4+Ci9Gb250RGVzY3JpcHRvciA1NzMgMCBSCi9EVyAwCi9XIFsgMCBbNjAwIDMxNyAzNjAgNjg0IDYzNCA2MTEgMjc3IDYzMyAzOTIgOTc0IDYxNSA2OTggNDExIDYxMiA3MzEgNjM0IDc3MCAyNzcgNzQ4IDM1MiA1NDkgXSBdCj4+CmVuZG9iago1NzkgMCBvYmoKPDwgL0xlbmd0aCA1ODEgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nF2Sy2rDMBBF9/mKWbaL4GecBkKgpBS86IO6/QBZGqeCWhayvfDfV9YVLlTgx9HcO9JolFzrp9roiZJ3N8iGJ+q0UY7HYXaSqeWbNrssJ6XlFCm8ZS/sLvHmZhkn7mvTDVRApWYblUTJh/8ZJ7fQ3aMaWr4nxd06/+YUO21udPd1bbbZZrb2h3s2E6Vhjo0K3+T6Iuyr6JmSkGdfKy/S07L39j/F52KZ8sAZ9iAHxaMVkp0wN96dUz8udH7247Jm/xfPo63t5Ldwm7zz4xIo85SmeQrKQQpUBCozUBnoGJWHQFXMUoFOoCOIQQ/wlaATYnEFATqAWqxXgCR8OUhBGffCgQ7R1yGGFbIUWSKhvkqCUF+JnWWor6pAqK8qwjHG81oPdL0YW7fk7JxvVLgXoUNrb7Th7YLZwa6u8PwC6JiyOgplbmRzdHJlYW0KZW5kb2JqCjU4MSAwIG9iagozMjMKZW5kb2JqCjU4MiAwIG9iago8PAogIC9UeXBlIC9Gb250RGVzY3JpcHRvcgogIC9Gb250TmFtZSAvRUFBQUFEK0RlamFWdVNhbnNNb25vCiAgL0ZvbnRCQm94IFstNTU3IC0zNzQgNzE3IDEwNDFdCiAgL0ZsYWdzIDM1CiAgL0NhcEhlaWdodCA3MjkKICAvQXNjZW50IDEwNDEKICAvRGVzY2VudCAtMzc0CiAgL0l0YWxpY0FuZ2xlIDAKICAvU3RlbVYgMAogIC9NaXNzaW5nV2lkdGggNTAwCiAgL0ZvbnRGaWxlMiA1ODMgMCBSCiAgL0NJRFNldCA1ODQgMCBSCj4+CmVuZG9iago1ODMgMCBvYmoKPDwKICAvTGVuZ3RoMSAxNzYyNAogIC9MZW5ndGggNTg1IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nN17CXhU1dnwOffcO1u2mewb4SZxWCQbiQESwEyWCQxkMwmbijDJTMhAkokzExYpGksRkGD0QxNAWii1iNQKH1qMYgOyfIrohyjRVmyp1WqxEf1awBaSw/+ec+9kE7VP+//P9zz/TO69Z3nPu7/vec8dQBghFIhaEUGW8qr0zLY+10GE4nQwOrd2uU++2KkNhPabCAkZdc1LGu8Sll2Adh+MPbukYVXdjaqLhQiJ1QhFvlDvtDv+tv1kBqxfDPOT6mFA1yWkQn8r9G+pb/StfGNWfBL0X4H+3gZ3rR3hY3cjRPYyfI32lc3S2+JYhOId0Jeb7I3OxR9/vgH6P0IoMaLZ7fXdeBDdhdD0HWy+2eNszn3tqBb6gE8bh7rQaX7tw4/Bsw5gutB64QEkDHy70HGYFzhcFz6NN+KXob0H9cF9LforNpDX8GRodcPa+WIijLajHXxlO/kMtZBX0LvoFDoPrc9wDoG1+F2UiC8Ato2DVEg39I7DfTXpJvPxaNyInsLPAcbVQNONHhDgKVQC5rfEszD6FloP3y3oKeSGNuNsLfD/O/QC2oQuo63CRXQntF9GJ4EfioIVGrgHXQVM+4TpQh3AnQRs29F2vBb1IK+IsAEgP5J6hAmA9QXEtFWDdkg90lamD3j2SF/BDEKjNF2acG0ySMH0tge/gicKZehdWL8aVZO7yb3kPF4nJosryEXULiCyGC1FZ6QeTThq1yajdk0dXiUu5t/VTD5hhbgY70MXAWcN+Tv0E4GzHVxihF4QKqUyqQxkroOxHfzertw1RvQWuQZ6f0ygeKZYTPJgZrVYgrai3bByLGgGITfJBuputFrarHzRPvimSptJB+Dn2sBZwnS0Q6jDm4Dbq6BNNylCk4HGKOkSWodfAL6Rdg3ySj0IhaMXtRpJJAJGKbLxgGC2OQ5Y7pgvv74gMTVlRFc2auUDqOJA0Cq568aNivlinLTggBR/gJh1B0Rz8kffNvlRasrsivlyF46yFqlorYuLYLBqPjRZD4Zh3FrE5xjVA5IZ/myLD8i19fLDxoeTcx82OnMhhvinRL1WwvU2QngKXK9DPM6HGCqCqwtiEWJPakBIAyCaR0HeaLjgyUJaB/D6W+B6HK4PETIY4ZoGF+AIgBgNgLHACrh+g1DQOYSCwXOCLyMU4oMLcBshDk2tCIXGIxQG/hMGeSD8WYQiZLjgGQn4I/eCf9bTDrFeegqyihaNfgWJOJxxg8MPYZ20VhBR+olzvROR8Vzvud6MMFOiyZxoSqwXUZ+XxPX9iXZog//+V49mPJMYYwe+QBqFtYDLdAjtEkSMROO5E3x1Bk6MSMQOQd//tbD2KYTRLpDfoBmNgtAYS5geEcOhwJPkkEQ0ItIElOiDYU3fmzk5E1F6b1+vKScnA4dHTsURyUljsk2J2YnCA3cteP/iz39Ff4sv4I4f3L/j3DHyj0dBHsiJYhF4jx4wp1lidIdQ4AnDk+iYRjgkkpIArJFK0GyDFvBP+6S3b1ovI5D5SV+v8RKwaAIms+GOsyKSMcLv48a+JtxIP8Kju7rExX3p7e2kQCi8CGZEr974WJwPdAJQPMqwxEYH6klbiL4tYltId9yTMSg0dEZ0oEYTWzzKeLk3M7OP0/nkMpDhstw2JjlJExEemZU5Cd+OszJDTUYBRBsbkWzKIh0b1j308MMPrdvQ/3HKk3Vv/Pniace2tK4uIf29D873nPvwA2Fl5Xx6in5J/0JPzqvazEJFQKuBn1BoGhV+JBQe2xYc3qbbFtyNnyRRoFVhhik0YCbjpw84Gs6PKcuUnB2Mk5MEkzE0KzMSc9ayOZvkzq6utG2O0xc/f8O5nYZsWLdu06Z16zaQs0LhP3o3V83DYBZswpPn0YD3PvjwXM/5Dxg/64CfZMg1AWg8arLcatCiWDkwOkSLDkVr20ITN8lHRrXd0h26LToIR4sxwQZNYJEsaiJuvxX4O8EYNHHjn/jkch/jkvFpygnNMYXmZFhGZYzOkDMSM5J2oV14l7DLsCtgd+SuqF3Ru2J2xQYvxAO6nZw9WZVrTPZtk6bi7DQ2p81mKo+MSsBC9/Sf/uy+hq3P4Zdemvp86y/evP63r/FDW+45elfd4fmbTk4fIwtZ9zY7m999eXxJ/4N7HIte3X342KiHVk26rWvs2MrKzC3c7yEbIlEn/QSFoYmW6GBJF0IOIRM+pjtk0AXoIYY0xtDgcHC4E33TTmQqPn152oneTEX14HOmYb5tgrS4m95zT8uZj87soz14gvQTeqy9f9cParbsOS0sbse3q/aeD/qNAHtbLWNQJMGGTfrNmshDWNMWhF+NaQvrDto2igjxRn2kBtniQ42q7U+ADoEHI1j/E6ZY4+VLoFfgJCJR1VoEaExGJiMCx9QqKhPn93185Ln5Rxtdx++i1+kHWP7qva+7xMc2rHvWKNxzp+bF16fkvDhhAs7BYTgQW+jvT+5+5sAO0E0j6MYNfCahn1nGRoeG6EUtGhWn0UYEtsmkO+5YjFGLTCG6Uk2ZqTSkLD66NNaabLw8+0Bg9ewDpuq75r+EYm8cnbKgb1ofywOhTHnTpn1yeRrTHujPFAX+MCNDzJAyNBnaDF2GPsOQEZAXmReVF50XkxebF5cXnzcqL6GVtIqtUqumVduqa9W3GloD2iPbo9qj22PaY9vj2uPbR7UnJOOFPBgjY3CySYlQ05BGVgSfFJ5Kcs1a796bXVwxdW/OLFvO008n1uaVOMmlmdaz9EL/CuHBL7yr/9T/gPDgV83sKS5ePC2vmMVEN50rVoMuWIxmWeIHYrQ7eBs+To6NgvicwSN1SNYwfvLJQJiaB7hQ88WwPLLipZdYmH725zfqtuGv1is5ZP3m/lMaQ3vVPPpf9HNIGafm4StqGlFy9lKwz1rgyYTKLWEabQDkbtIZ3K0/pjVoNEgXCgm8lyULYOLcm0zlGRazERmx0SQjGcumDJSBs4wZJguy4EKjxVSBKnCFscIUuhBzzxmiuShx7dT7bM8eAj6PrC1aPomsSrv1N2/2vysuPr/igaRblFg6DfwYxRrI3/Mt8SRKq9PqogQiFEAiPwb7g47AFmVDGqvBeFmJIB5NvRmwUWuN0hfsWpB0cIoO44WWiElkis5KZunmkfk6J1mqayH36QwLwxIj2G6UjRM/Jqn9a4S1fYeFtf1PiDV7+z7s2EfMiNlqI8TXTJ6/olAyaKYtFLUFsnylDw0pIqERt0fzYFLiiG0efjtA0hyr2oclU6G+7dFH2zY/+ujmi19f/fzi1avkwgfv9Zw/3/PeBzvoO/SP9CP6Lk6F0jMBpzH5j4P8cUA3DKVYovXBBBGIZ1N34DEDFjRoVpBeE1AczryDbykQCb0QAiyNfNNTxbiXlt774Kaurol7vb94RjjUP0s41PnIi7/oXy8u3ru49iOu77obBeJkqLIIirYEYLRBxAkCSiAi3/FBussnMvQ4GWMzCe3u+0Lq+UejZgtb1wP60QCfY1GLxRIUKAQHRI1O0OkFrSEqYXRCwaiEaENAwmgxAm3CR8XwTRFHo9tMYpu527Rt3ChDwOg4LSqP0wTbtJrwJOs4Zsu+3k9YYvKnJiO9csl45VJoFE/53LrBX4CoWn5fkIQj0tQ8z1QXEa5h22d2AuYWSBfSMCR80AF5q3xX1ZrVd784a+Pm3neqDi1d8kr1fQ9d0Vl3/scHb9y5R8x5IS3tjqrZs5KDY3es2XM4Obk7O7t2QetEIXj0lgd+uj8RDdgE9taRNnny5jbpvalNTN9jE014/1PcKBjNR5vFVeIKKAwTLaEaiQhIEp/Dv9RqhHEiGqs1QtnCtHS5F5JfWDbsvtkYjkDXL5BK8uohes8ees+LePpI2wrctkgYbluchZPJqu6+S0eYaSEfsOLmT3girDEeQrsFPIrVcLx6AVhTMr7Y14cn0jNcL5vABybC+SQGKq3YmOfRwchOEvR84EFjp76DbIsNywxEEzUZsUbYztVAYaFy9VKG2b/BJEJW4IZU6o5Jk8WJpbvvgpg4jvPwqLt2l87aN/fkiRMn5z9jyx4/HnfgZtyEt40ff2a6hb5N36L/Td+2TOfxClErPguyCsiAtlrykRmKT0kUzJKohUtjliRRbyYGHVzYbCAGZIZDEjEUIKLtxAfIBr2k12k1/JChl9INAcYPQbs8wvp6/Q6o4+lFq/wNaelYytESlnJiDSgETkTtSCQ4QBBJoKjXanQP4Y2CbiFaiEkiV3giSRbqe/A++p9X8KmzTf1XGs5Kyf0iee7aBLyOwhFMUOwAJ2xWl8dZgoTd6Flxt0bCo0Skg1KC52SW95hRTKph+vrEsfQszeHmAU2cBJ20gE504LkTLNG404g69RtCjQYdFCVSZtAUE0rQZ4Uz+/QxlwWUl1mdD+WgUvyZEzPFiHBxAngybv+87cc7NtMS/MI1LNAb1z9/Q0rvP/P4unVb9nx8/nd/7N+r5O/j4BNmyAsxKN0SG7gp6KgRbYo5GtlGjG36buYUoYFIUxwLvuf3CSO9zCL9Jk7hr+JE86wfV9I+eh6bsXjH9jLbloW/fPnws4u35udAyTEFh8N3yq0pr+bn/uHtMx9NvZ3x0QuyH+T1+UlLri5Kr5M0kjZKo5H0UUTQwb5CBClKI8HWIkYRtr9AkxxDTxo0OjhqavRYoylC1kAIMthlFE/o/SQqZ3CfAWeAP/ELfw9cQKdlLlCpEXS6SCFaitZlC7dJk3TFQp3QIiyX4Iig08VALR4txWhitdG6cWSsNE47lUyFKM3RTtbNIjbtAs0C7TLiEl0al3YVWSmt0qzSxoPrhGWZcBbLxFpTcm83/vgPdAaGOKnZ2K0J71uNz9I7+4uFggdpHqsN6UwxVK29Z1rGxgQmxI3Vk9BNYZH6toTIthAClXdCyPFxx24dG4M0gTM0oaGJM29VkjA7GUDNcUIpuo09l1hSHnlmCQsXBtPtdGHIwSEqO4vcuf7B9Y+0b3hgfdelz0r2VNXsKnxiQ8rWxhOff36ioSO9S8g58/77Z8789gP6uz7aFx93KC1l9wHdmnvuxrlYi3U4d+6djym+dApsqAH/DUBmS5hB6EQbdGInxMBkkqBFk/WBkJjAcXkkZEL2zQhjpbR6hDtFptPXcE7fcZxDX5N69l1/YN8+8UElLlrAR++GvKXu7frOENIZ0RGyLRplBk7SZIZmRxv7hu3t/s0cCq+wIW2ycf32bevXb9u+/t2v+/uvft0Hh9uL2IZj6af0RdpFP8Ux2Ebvo634frwBr8ettJXLlQ5y7Qa5tCjeEqxhcok4lySgXEnHjr29PA5VcZJNiemil6aephNAims90gRFhnbAcRZwhEEtudQyBZIXMWjMRCSSWRRJARyjI4gY0akP7wzaECBKpki9hhiICcUHE0NMpmiaGG5ICMwYxWP/BAt+Uw6/MUdnSSA0h30H3d2/7SbgqLBkkoZZTjDx9KAZSBfC38uaKk//9mDp6tpXT+NdV7Hmp/1v/+6xRzofFV4Nd++h9XjVTxf2b5R6fv/O44eFBf2XfvjQgxvVfWQW2GMs+pFlOq8lzAlqMWEeDcUEryRwxPPhT0d3mvDz6Gmx09wBhUSCUkiMicsJnhiuzUnKGAfinBhRSChbjilqWBHhF+egTmAhC6dTLdYKRCtglqVHlBbi0NJiTDpmtcUtrLa4fPdL97TvaXxi6TtH6d/7XOeWed+q37av5bGGt1/BQRfmdku735o6bd29tfXJ0RPf+VXPH1JT37cVbVzdvFyOSe/e9fr/jAXZ20H2VLDjKDTdkiRqR8V2ak2bjI+A2ZhfBG3T7ksAz4CzqiEJGUcnGPtOgLmMl3iQKqIZ6QkwFHcWVmKgiHA0jGF2fDsjXO4/MWFeyp+xkX789YqTZXe/bH/6V4efvmN7MXgVfcwYQi993ku/kuW3Mice2L3roNkMOw87w5f44wQbLLHk5/rQzoTAzuiOhG23RCTEaRJRXFJIQuLoW0Dx4DQKX4ytc5cyLO+lo3ScLqSTdDFdSteka9N16fp0Q3pAHsrDeUIeyRPzpDxNnjZPl6fPM+QFlKNyXC6UG8oDFqFFeJGwyLAoYCfaiXcKO8lOcae0U7NTu1O3U7/TsDNgP9qP9wv7yX5xv7Rfs1+7X7dfv9+wP+AIOoKPCEfIEfGIdERzRHtEd0R/xHAkoPjbmFFJkUXiImmRZpF2kW6RnhH+NkS3LIRjIq8tlaIzzJ8NoOQfWvjjj0snTakoz5kye93mTZs2P7Jp0yNfXrny5ZeXLwuXJldUTJ5SViLsgCLmFH2Dvo0z8CQ8GWfsoivpg/SHdCXki/vxA3gDzxdXIdbBTlDZjLGEk05R6JQ2aGEr1yVrEghYJgCyxgnlFVMm38DNiSYp25zFciEOxrn0OVzxBp7U9/o+saWka9a1nn1Kft0KeJPBvvHoDst4FG+GLTI6JpZExZlhnywwmp4O6gzvEFGngIwGARsSopKM5JZRzAV7jx5VzuKM4OU3/WmCh5b0RVTmgiQzy8OT0OTbseqC/KULSxfaYIxbhOf6Wg7j6GxH8ZbWu15vXvKa/TwOWOCY0rNv376TOO32+zrL1zxSUPjmxMyLv1581Jf/KT+TAb+VvJ4xoXGWCA0UM6gzRINC9FqSGThRm2DMCOWZ26SEPy+QzPIkk3FMYrIpjBcX47EJv4BuvHHqBlrswHNxEX2F7qNn91zHM/Hs69dXSOn0cdoKJniCvXrGyAE0G8XFUIs7LeNh74aaMgoLEnsQKP41OAohTYFA0DGJVepYEm3IquW1OTs1Zw6vGNQSEhLPWCg0F1qCWeLREZ0oSoJZEMC1wmCThxLRcQRbcfER6vlCXNxXTZ69vgt42QLxOJ3nivGWqBASCkdhfWf0NiPekBCSYJooJKCMhIGdK5OfQjLCoDgMZ++6WCEFxmBdZgKWItLwltOBIfKqufNWJoYEvpFTXLBvqWtfoTVXmE629gU2LoyZOm3a1Ji7G8jVvvo/vZo3NTd36u0nB+u8OPGeEWeibQZ8LJCdh2aBbviZSNmfVW787LDENPDKcczxrmXNP3z4pZcmPnPvs3vxXnYoYkciYdX13Xvtjo/QiA8Wz+JHkYSQlCVtg26C8iTvozohFNwkQAN1ligI4qdozI130D+uCwiNYwsr6qwOZEHyjRuacBqOt2sb8ceLEb5w4YKCl+2r1fct3DkmaVHItCtotI4Pn3o0bKL/ef3hfix16+Yg5SU99q/TNtJRbD++/vCNcKlbHR/83CqeRfXsFyTg3AHPXXAdhOtVuFbDtQ6utWq7Ea5ugFsKz9NwbYTrOPslBq4etT1f6eOL8NwEl1ltn1Tne1Vcp+BqgSsdrnYVtl2ldxWurSp+xtMWtpZzfqsQiCagZeDxEPdoG5NUmodNoHERZiNx8IB8i9DRAR0YcYHaFsAtF6ptOEXiH6ltEdovqm0JBeI/qm0NChaC1DZEtmBR2wFolPCI2g7Sb4k4p7aD0W2j3wHMWNRDr5tTYW3M3kepbQHpcJXaJjBeo7ZFaD+htiUUjV9X2xoUj79U2zqUJMSr7QCUK1Sq7aCwMcKzajsY1Y+uR4XIjZrRKuRBLrQE1SMfksHTaqHqllEmyoBvFrRqAEJGBQDjQ164PMiJ7KgRpcCoDTUBfBq08lEDfGVUOYDLy3tOeDphzXK4OwDSgIqgtRQwzEUtAFELsHbAsoRDytBm+GXA0gT3ZoCpAbwugJNhvRvo2vmcAaFCd/Mqj2tJvU8eVztezszIyJJrVskFLp/X53HaG1NkW1Ntmpzf0CBXMiivXOn0Oj3LnY40Q5FzqX1ui1xbb29a4vTKdo9TdjXJzS01Da5a2eFutLuagMBwTqs4n4zHUuCjif1SqKKpsjd55VJ3E4wUwLAbnA8VuN3L/iUM/8KSuVzDXtCLm2stE/ScBV801+nxutxNcmZaVtZwzH68I7AypDdjo46DKTb1qfb3M1LnbgLd+kDjiNvdB1bLhTNCOthLwbEccKTBWjc8PWBJJ8fn4TZPA7xOWIPqfb7m3PR0ByBd3pLmdbd4ap11bs8SZ1qTE6aLh3Dg9xG/r37TN9kc8zsn918neJAbrQBY5qn/d/yPebLhppQVa9ihNZTnb8aaAaX+G19G/X8jfm+u7UGZXaoWZT5v5z7QyLW6DMbcYPnv44VJVsHxNXJsg36t4K7nc05VriWcShP3SgfHU8dnnQPUFAsr3pbC+XJzDpv4+mY1dhQKbsDqUy3s4l6hyFKratqP08e5GB4XdoCq5R7SrGL3Y2DQCu+KJzl56CkenDTES5K45dhaB396OV+1sMauyqf4YC14ZSPH4uMzfv3UQatB9eNxAzwOUmDphPHvg1hQ/JxRHNQJG2mGuxuotHA+B7lxcAl83NdqYNbHZ/00vp1CihpLtcBZC8ei6GQF94F6nhN8qmYa+dhQifz4PcO8UuG2heswZYh1WLuR29Nv68H49cLqlG+RI2VAznSel2SOWYkHBbdL1epw63+31H7NKdw2D3i0b4TXDUq0guuj8Z+i4I+GOp5Tm1QJnUMoOvid0UjhT6aJpQBRy/EpMEP9uEHNkn4L1XLaDs6xS+U0l0dntbrKDhjdPDMM2mBoLhrUwDczAdt0fGo0eIfB+mNlUGNDc8DQdTKX2a5aqmYgb/t9TdGGksnt32FPN9+DZNX2jfw5mD/+GVv4QPJmvq/ZVYnShmnqu9Yynawa4L+RR5+Lx7I/ozHefWrWU0YUTplOHUNsPtTr/PsXo6LoqwWw2Pk6v0QOzimzV9MQbSwBOCZNvTrmGZJD7dx7FN/10xipH+/3yjQ0xzmGeZid2+hmHHw3J8PpjdTLzXhMUe3ewNe5viOre9QM5OT8NQ7D6x/xDnimP25G7iJONd85h1lgBZfKwdcn3WRfTBqQe+QKBu/fdZOGeJsSOyUj9pkaHvfuIby2qPHgt8RymHXdRGNOtJLruUmN6Gb4KruYnWdW58CKofZXeP7uiKnnmV7mT6/Ko5N71Lf7iyLdzXI4m23hUMM1fDOtykM0N9SG/2rMenn29O/Zg1HnjyhWQTQM1CAedcVwjM3co5fBfYlqMWVfbOK6HVl//L/IWN8uVY0aIz51X6wb0NRMZOV0ylEZ9BidcuhVo3lQT1byORuMyVDPVcLMXOgVwWgRt0s+n2HzSTwa50GbYSxHczguBUcl3BnuBTDCcMu8z3qzAb4McLG1VjSf07ACtioOWclxl8JoCTytKhxbUQgjc6DP2jMQq0YVemWwqprHDlvHeFE4rYbxQarDubJxin7OSqFXCfhnqrP5gNvG8TH+U7imWLtsgM9ildN8riOGmeEsBI5KeI+NzoFnBcBVcX3mc5kVbsu4DMUwr8hi5RwollA4KoRnBdBmEDOAr2rOBaNUrUKmcAmZPEV8PaM6m48qnJWrVmbtQSxpqi4VPpj+5w5QruLyl8BX5vJXw0g1t00+4Pfj9fvODI6hdMCP5nD58rkeyjmFAj7HtMj0WTIAWTnEKoVcX8xujPMiTimfa6TqppL4sQ23zs28w09hBpfPyjVVwqGrQI9WgLcNjCj+aOOyFqq6VXAqfq/4RMkQ7RZyGZll7wCqVtWn8rnuhkuhRAjjf1AKxQL56r1wiM4GrV+mWrdwwNbl3Mu+qZV5PBatHCqf27pqQAvFPH5LVc7nDPEwvx3nqP5ZPsDZcP3648gP98/kDgWXn/ZwCxZxfypROawa0Mb341VylxX2tVp+3vEN5O3hO/fQ6nGwKh1af6YMybVDKwElC8/gsI0j4AZHlfys7FmDZ56hNdzNdi7/KVmp6QerX3/1oeRu5Ww0tPp18DpdqQW9A1WJsn+4ByqTFXx2cE9XToONHGLoec/L6SqStagrRuJS6ks7rxYYNe9NtPldO9TIE2Iz3+8VKit426dWJky+FhWWjd834lTsGXGq+j4b+GX5Pv17uL2b1TOVi2uY1ZNpKl4P8p/PBnXCNKC8/WocYfVB72PYctHIOpTpYMkQzh2qxZU3aYymAaFi/jKOvc9k70QH3oXK47xOp1zjbHCvGJ8m/xNvP9MMhsHFc50eu6xgHnjnakj9zo/B8K+/nZVHUHYBi7LPY3c4G+2eZbK7biQWg6HC6Wl0efm7ToCud3qcQGuJx97kczpS5DoPCA/LQGDPEmeK7HPL9qZVcrPT44UF7hofCOxqWgJUaoFpBumrd6rvNe21te7GZgBnAL56wA5KcjZ5QcFJXCVJ4wGZQ7Z7ve5alx3ogQZrWxqdTT67j/FT52oAHY9jGPkCucpd51sBOk8azznxOJs9bkdLrZOjcbhAMFdNi8/JeRi2IAWsVNvQ4mCcrHD56t0tPmCm0aUSYvAeRZWAtsUL8EycFLnRyaXm9vXWpwyhkcJoprs9stcJdgBoF7Cqij+CNGMO0DYzRftU1XFCK+rdjd9cwMxQ1+JpAoJOvtDhlr3uFNnbUrPUWetjI4qOG8AlmUC17iaHi8nhzTUYqmHKXuNe7uQSKF7EGRhwgia3D8zgVUaZVZoHPUCZk731dhCqxqlqDdgAJ7cPk9PdBH7hkRvdHudNxZZ9q5qddXYglKYwNXy20b6K4W90O1x1LuZo9gYfuB40AKnd4eCSK6pj8WX3AF8tDXYPJ+Rwel1LmjgbSxpWNdd72SLmofZaQOJlK/z8eEdSUjzOoSjM3jAEwQgk6jo/L4MYgcWmhlWya5irg0geJ/u/cByWNbxMmcw2/hBxgt85FQFWuD0Or5w0EItJjLZ/Qk5ioZvE1QbWKVFjpsYJ0cSwtoAdmBDL3a4BxpwrfRA1sr25GULMXtPgZBOK/IB5hGHq7T653u4FjM6m4XoBcoMe7pBbmhwqw0nD80qSIuF3WdbrbmCRzU3HDGWXG1gGgXjxAzbba5fZl4BgEItN7oH88c871jBSkLSARWdDHWNqplUuLi+rlqvKi6vn5VdaZVuVXFFZPtdWZC2Sk/KroJ+UIs+zVc8sn1MtA0Rlfln1Arm8WM4vWyDPtpUVpcjW+RWV1qoqubxStpVWlNisMGYrKyyZU2QrmyEXwLqy8mq5xFZqqwak1eV8qYrKZq1iyEqtlYUzoZtfYCuxVS9IkYtt1WUMZzEgzZcr8iurbYVzSvIr5Yo5lRXlVVbAUQRoy2xlxZVAxVpqBSEAUWF5xYJK24yZ1SmwqBoGU+Tqyvwia2l+5ewUxmE5iFwpc5A04BJwyNa5bHHVzPySErnAVl1VXWnNL2WwTDszyspLmY7mlBXlV9vKy+QCK4iSX1BiVXgDUQpL8m2lKXJRfmn+DGvVIBEGpoozqA62YIa1zFqZX5IiV1VYC22sAXq0VVoLqzkk6B40UcLZLSwvq7LeMQcGAM5PAgwy08pJgAD58FfIOePil4G4DE91eWX1ACvzbFXWFDm/0lbFWCiuLAd2mT1hBZNxDuiTGa9M5ZfZiI190zsAiq1WBSyy5pcAwirGxjdgwbusK2udzT7m22pwK+mRp1Ilf6Zwr1WSALjwjCYIXGWMN8GfIbL4zqNkuMHgYltyipp+WfoA74bdSEm/juVOyIJelkogPtwsmaxweXmkwzbY6Fb3Pa+9AYjBqgEoyJf2BljmHWBzeED5N8RmjwuWrPC4fJBMZHsLjHpc96lbsUfdqkZKwKiM5N/j9DbDTuVa7mxYlQawHrafcU5cTXVuT6MqOldfrS/Xn0N98hKO3AGCuz1L0mTDv/OraDqvgpfBlc4rRwd/H5fG3402w9jw93zf/Rtq+grXMle6C9LhyrTm+uZ0NSer/86Bf27cj+4c+HchQz4vCa044uDjC6X8eByBOhCBeyv/v5YU2mH8HopC4W7ibSO/h6DtcA/m7aCDf5kh5ZtxEFoDvUBkhnsAyoS7gePTcygdCoa7lrc1HEbibZGPEz4i8BFsWUAJpaR/Demj5Dol1zLJPw6Tv68hX19tk76m5Ouj4tUrC6SrbeRqq3jl8hjpygJyxSJeHkP+9td06W/XyF/Tyf9Q8hUlX2aSS+Hkiw7SCyz2UtLbdeOs5Yb4lxnk84sO6fMOctFB/kzJZ5/GSZ9R8mkc+RMlnywjH1Pyx8Pkoz/ESB9dI3+IIRc6yO8p+R0lH56PkD6k5HwE+aCD/PY3EdJvKfnN5gDpNxHk/TXkvVzSA52eXHKOknffMUjvUvKOgZyl5G1Kzjxsks7Ek/+OJG9R8mYHOb3JLJ2m5A1KTq0hr1PyGiX/RcnJ7UHSCUqOU3KMklcpOQr4joaTI4Gk+9eHpW5Kfv3KQunXh8mvW8VXDpulVxaSVyziYTN5mZKXOkhXe770IiWH4HHoGvkV4HqBkucd5KCD/GcwORBK9lPyHLX0k19S8iwlvwgl+yh5Zm+w9Ewm2RtMnt5jkp4eR/aYyM+fSpV+voY8lUp+RsluSn5Kya6dMdIuB9n5E6O0M4b8xEh+bCA7KHkSiDxJyfYgsm1rmrSNkq1ppBPod3aQjicOSx2UPAG+9cRh8kSr+PijZunxheRxi7iFkv+g5DHoP3aYPGom7aCM9nzyCEj7SDjZHEDaYKDNQTaB0jaZycMmspGSDZSsp+ShdSbpIUrWmciPKFlLyQ9NBdIPq8iDlLSuJA/cv0Z6gJL715A1CeQHlKwOJvdRsoKS5ZS0+AKllhDS0oWR5QPRF0h8R0VvKPFaRA8l91LSTIm7qUpyd5CmxnFSUxVpHEcaKFmWSZZS4sok9dfIksOkjhInJQ5KamsSpFpKapBRqkkgdkoWU7KIknvuDJDuCSYLHeTu18ld0LkrnNwZQMCj54eTeZTMpWROXIw0J5NUU1JFSSUld6whFZSUh5MySkpxqlRKSclhMnscmWWLlmZNJrbCUMkWTWZao6WZlMyA3gwHKYZe8WFijSZFMFA0mRQWmKTCUFLYJVgserEgP0QqMJGCLgFBL98SLOWHkPwufBR6lrxAyRJMLF24FXp5gXopL5DkdWGLxSHeTsl0YGH6NTKNkqnjSC4lOaDgHAeZMjFWmjKbTKZkUmq4NImS7NnktoxY6bbZJAseWZRkAmAmJRNhemIsyYgl6dBKjyZp+kgp7TBJTQmTUsNJapfAyKYYTVJKGElh7HaIE241SxMouRUgbzWT8UKuNJ6ScZSMpWRMCDFHFkhmK7klhCRTkhQSIiVRkiinSolriJxKRs8mCUA5gZJRlMSDbuMpiQOrxMWQWEpiKImmJAowRBWTyIhUKbKARIQbpYhUEm4kYQAXFk5CYX0oJSaQ3FRAjEDBaCJGRXchwYFSSAgJUXQXHGSQggNJsKK7INBdkIEEge5eEAP1JJD51mQxgBIDSGKgRB9JdEaipUQDqDWUSOGEgHDkGhFgQMglGBjAqQQZCe7CjnWb8YT/fz7of5uBf/MzCv0f/+AZyAplbmRzdHJlYW0KZW5kb2JqCjU4NSAwIG9iagoxMDAyMgplbmRvYmoKNTg0IDAgb2JqCjw8IC9MZW5ndGggNTg2IDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJybwPCnxZvDvJF/9/cjACDGBaEKZW5kc3RyZWFtCmVuZG9iago1ODYgMCBvYmoKMjAKZW5kb2JqCjU4NyAwIG9iago8PAogIC9UeXBlIC9Gb250CiAgL1N1YnR5cGUgL1R5cGUwCiAgL0Jhc2VGb250IC9FQUFBQUQrRGVqYVZ1U2Fuc01vbm8KICAvRW5jb2RpbmcgL0lkZW50aXR5LUgKICAvVG9Vbmljb2RlIDU4OCAwIFIKICAvRGVzY2VuZGFudEZvbnRzIFs1ODkgMCBSXQo+PgplbmRvYmoKNTg5IDAgb2JqCjw8IC9UeXBlIC9Gb250Ci9CYXNlRm9udCAvRUFBQUFEK0RlamFWdVNhbnNNb25vIAovQ0lEVG9HSURNYXAgL0lkZW50aXR5IAovU3VidHlwZSAvQ0lERm9udFR5cGUyCi9DSURTeXN0ZW1JbmZvIDw8IC9SZWdpc3RyeSAoQWRvYmUpIC9PcmRlcmluZyAoVUNTKSAvU3VwcGxlbWVudCAwID4+Ci9Gb250RGVzY3JpcHRvciA1ODIgMCBSCi9EVyAwCi9XIFsgMCBbNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgXSBdCj4+CmVuZG9iago1ODggMCBvYmoKPDwgL0xlbmd0aCA1OTAgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nF2TyWrDMBCG73kKHdNDsCVvDYRASSn40IWmfQBbGqeGWhayc8jbV9Y/daECL59m0fzDKDnVj7XtZ5G8+VGfaRZdb42nabx6TaKlS283UgnT65kpvvXQuE0Sgs+3aaahtt0oMniZq2NPIZL38DPN/ia2D2Zs6U4Y6pb9V2/I9/Yitp+n87p7vjr3TQPZWaRxj6yJ3+T03LiXZiCRxDy72gSnfr7tQvifx8fNkVCRJWrQo6HJNZp8Yy+0OaRhHcXhKazjkv2fPasQ1nb6q/GrexfWMZIMlKYqBSmQAWWRSg3KQXtQAVKgEpSDKpAE3Ueq2LaHrQA1ID6vhSfXokF8ggE1IEIca+hAFEmmkQpULaGvykDQV96DoC/jOOhTyCmhT7EN+nLOAn059Enoy1CZhL4CGiTr4zjoK1sQ9JUVCPpydFdCX861QF+BDipoyNBBxZWxDZVVJQiVFeyJyqoijgnPg/qdjnWaFNqn0LcC3VfolEJTspRTIGgZuuXyrBOtr96HYY53J07xMr+9pfUSutEtUfH5AZPg8OYKZW5kc3RyZWFtCmVuZG9iago1OTAgMCBvYmoKNDExCmVuZG9iagoxNSAwIG9iago8PCAvVHlwZSAvUGFnZXMKL0NvdW50IDQ1Ci9LaWRzIFsxMyAwIFIgMjA5IDAgUiA1NTEgMCBSIDI1IDAgUiAyOCAwIFIgMzEgMCBSIDM0IDAgUiA0MCAwIFIgNDMgMCBSIDQ2IDAgUiA0OSAwIFIgNTIgMCBSIDIxMiAwIFIgMjI3IDAgUiAyMzAgMCBSIDI0MSAwIFIgMjQ4IDAgUiAyNTkgMCBSIDI3NCAwIFIgMjg1IDAgUiAyOTIgMCBSIDI5OSAwIFIgMzExIDAgUiAzMjYgMCBSIDMzNyAwIFIgMzQ4IDAgUiAzNjMgMCBSIDM3NCAwIFIgMzg1IDAgUiA0MDAgMCBSIDQwOSAwIFIgNDIwIDAgUiA0MjMgMCBSIDQzMCAwIFIgNDM3IDAgUiA0NDIgMCBSIDQ0NSAwIFIgNDQ4IDAgUiA0NTEgMCBSIDQ1NCAwIFIgNDU3IDAgUiA0NjAgMCBSIDQ2MyAwIFIgNDY2IDAgUiA1NTQgMCBSIF0gPj4KZW5kb2JqCjU5MSAwIG9iago8PAogIC9UeXBlIC9DYXRhbG9nCiAgL1BhZ2VzIDE1IDAgUgogIC9MYW5nIChlbikKICAvTWV0YWRhdGEgNSAwIFIKICAvUGFnZUxhYmVscyA1OTIgMCBSCj4+CmVuZG9iagoxNCAwIG9iago8PAogIC9Gb250IDw8CiAgL0YxNiA1NjAgMCBSCiAgL0YxNSA1NjkgMCBSCiAgL0YxNyA1NzggMCBSCiAgL0YxOSA1ODcgMCBSCj4+CiAgL1Byb2NTZXQgWy9QREYgL0ltYWdlQiAvSW1hZ2VDIC9UZXh0XQogIC9YT2JqZWN0IDw8CiAgL0ltMSA3IDAgUgogIC9JbTIgOSAwIFIKICAvSW0zIDE2IDAgUgogIC9JbTQgMTggMCBSCiAgL0ltNSAyMTMgMCBSCiAgL0ltNiAyMTUgMCBSCiAgL0ltNyAyMTcgMCBSCiAgL0ltOCAyMTkgMCBSCiAgL0ltOSAyMjEgMCBSCiAgL0ltMTAgMjIzIDAgUgogIC9JbTExIDIzMSAwIFIKICAvSW0xMiAyMzMgMCBSCiAgL0ltMTMgMjM1IDAgUgogIC9JbTE0IDIzNyAwIFIKICAvSW0xNSAyNDIgMCBSCiAgL0ltMTYgMjQ0IDAgUgogIC9JbTE3IDI0OSAwIFIKICAvSW0xOCAyNTEgMCBSCiAgL0ltMTkgMjUzIDAgUgogIC9JbTIwIDI1NSAwIFIKICAvSW0yMSAyNjAgMCBSCiAgL0ltMjIgMjYyIDAgUgogIC9JbTIzIDI2NCAwIFIKICAvSW0yNCAyNjYgMCBSCiAgL0ltMjUgMjY4IDAgUgogIC9JbTI2IDI3MCAwIFIKICAvSW0yNyAyNzUgMCBSCiAgL0ltMjggMjc3IDAgUgogIC9JbTI5IDI3OSAwIFIKICAvSW0zMCAyODEgMCBSCiAgL0ltMzEgMjg2IDAgUgogIC9JbTMyIDI4OCAwIFIKICAvSW0zMyAyOTMgMCBSCiAgL0ltMzQgMjk1IDAgUgogIC9JbTM1IDMwMyAwIFIKICAvSW0zNiAzMDUgMCBSCiAgL0ltMzcgMzA3IDAgUgogIC9JbTM4IDMxMiAwIFIKICAvSW0zOSAzMTQgMCBSCiAgL0ltNDAgMzE2IDAgUgogIC9JbTQxIDMxOCAwIFIKICAvSW00MiAzMjAgMCBSCiAgL0ltNDMgMzIyIDAgUgogIC9JbTQ0IDMyNyAwIFIKICAvSW00NSAzMjkgMCBSCiAgL0ltNDYgMzMxIDAgUgogIC9JbTQ3IDMzMyAwIFIKICAvSW00OCAzMzggMCBSCiAgL0ltNDkgMzQwIDAgUgogIC9JbTUwIDM0MiAwIFIKICAvSW01MSAzNDQgMCBSCiAgL0ltNTIgMzQ5IDAgUgogIC9JbTUzIDM1MSAwIFIKICAvSW01NCAzNTMgMCBSCiAgL0ltNTUgMzU1IDAgUgogIC9JbTU2IDM1NyAwIFIKICAvSW01NyAzNTkgMCBSCiAgL0ltNTggMzY0IDAgUgogIC9JbTU5IDM2NiAwIFIKICAvSW02MCAzNjggMCBSCiAgL0ltNjEgMzcwIDAgUgogIC9JbTYyIDM3NSAwIFIKICAvSW02MyAzNzcgMCBSCiAgL0ltNjQgMzc5IDAgUgogIC9JbTY1IDM4MSAwIFIKICAvSW02NiAzODYgMCBSCiAgL0ltNjcgMzg4IDAgUgogIC9JbTY4IDM5MCAwIFIKICAvSW02OSAzOTIgMCBSCiAgL0ltNzAgMzk0IDAgUgogIC9JbTcxIDM5NiAwIFIKICAvSW03MiA0MDEgMCBSCiAgL0ltNzMgNDAzIDAgUgogIC9JbTc0IDQwNSAwIFIKICAvSW03NSA0MTAgMCBSCiAgL0ltNzYgNDEyIDAgUgogIC9JbTc3IDQxNCAwIFIKICAvSW03OCA0MTYgMCBSCiAgL0ltNzkgNDI0IDAgUgogIC9JbTgwIDQyNiAwIFIKICAvSW04MSA0MzEgMCBSCiAgL0ltODIgNDMzIDAgUgogIC9JbTgzIDQzOCAwIFIKPj4KICAvQ29sb3JTcGFjZSA8PCAvRGVmYXVsdFJHQiA0IDAgUiAvSUNDMzAwIDMwMiAwIFIgPj4KPj4KZW5kb2JqCjU5MiAwIG9iago8PCAvTnVtcyBbMCA8PCAvUyAvRCA+PiAxIDw8IC9TIC9yIC9TdCAyID4+IDIgPDwgL1MgL3IgL1N0IDMgPj4gMyA8PCAvUyAvciAvU3QgNCA+PiA0IDw8IC9TIC9EID4+IDEyIDw8IC9TIC9EIC9TdCA5ID4+IDQ0IDw8IC9TIC9EIC9TdCA0MSA+Pl0gPj4KZW5kb2JqCnhyZWYKMCA1OTMKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAxMzkgMDAwMDAgbiAKMDAwMDAwMjY3NyAwMDAwMCBuIAowMDAwMDAyNjk3IDAwMDAwIG4gCjAwMDAwMDI3MzAgMDAwMDAgbiAKMDAwMDAwMzY2MiAwMDAwMCBuIAowMDAwMDAzNjgxIDAwMDAwIG4gCjAwMDAwNTIyMDYgMDAwMDAgbiAKMDAwMDA1MjIyNyAwMDAwMCBuIAowMDAwMTA1NDg3IDAwMDAwIG4gCjAwMDAxMDU1MDkgMDAwMDAgbiAKMDAwMDEwNjAyOSAwMDAwMCBuIAowMDAwMTA2MDQ5IDAwMDAwIG4gCjAwMDA4MTQyMzUgMDAwMDAgbiAKMDAwMDgxMzcyMiAwMDAwMCBuIAowMDAwMTA2MjQzIDAwMDAwIG4gCjAwMDAxMTI0MTQgMDAwMDAgbiAKMDAwMDExMjQzNSAwMDAwMCBuIAowMDAwMTE5NjE1IDAwMDAwIG4gCjAwMDAxMTk2MzYgMDAwMDAgbiAKMDAwMDExOTcyMSAwMDAwMCBuIAowMDAwMTE5ODU5IDAwMDAwIG4gCjAwMDAxMjA3NjggMDAwMDAgbiAKMDAwMDEyMDc4OCAwMDAwMCBuIAowMDAwMTIwODE1IDAwMDAwIG4gCjAwMDAxMjEwMjYgMDAwMDAgbiAKMDAwMDEyMzkzNyAwMDAwMCBuIAowMDAwMTIzOTU4IDAwMDAwIG4gCjAwMDAxMjQxNTIgMDAwMDAgbiAKMDAwMDEyNjU1MSAwMDAwMCBuIAowMDAwMTI2NTcyIDAwMDAwIG4gCjAwMDAxMjY3NjYgMDAwMDAgbiAKMDAwMDEyNzgxNSAwMDAwMCBuIAowMDAwMTI3ODM1IDAwMDAwIG4gCjAwMDAxMjgwMjkgMDAwMDAgbiAKMDAwMDEyODEyNCAwMDAwMCBuIAowMDAwMTI4MjYwIDAwMDAwIG4gCjAwMDAxMjk1MTYgMDAwMDAgbiAKMDAwMDEyOTUzNyAwMDAwMCBuIAowMDAwMTI5NTY0IDAwMDAwIG4gCjAwMDAxMjk3NzUgMDAwMDAgbiAKMDAwMDEzMTQ3NiAwMDAwMCBuIAowMDAwMTMxNDk3IDAwMDAwIG4gCjAwMDAxMzE2OTEgMDAwMDAgbiAKMDAwMDEzMzM1MCAwMDAwMCBuIAowMDAwMTMzMzcxIDAwMDAwIG4gCjAwMDAxMzM1NjUgMDAwMDAgbiAKMDAwMDEzNjAxOSAwMDAwMCBuIAowMDAwMTM2MDQwIDAwMDAwIG4gCjAwMDAxMzYyMzQgMDAwMDAgbiAKMDAwMDEzODAwMyAwMDAwMCBuIAowMDAwMTM4MDI0IDAwMDAwIG4gCjAwMDAxMzgyMTggMDAwMDAgbiAKMDAwMDEzODI5NiAwMDAwMCBuIAowMDAwMTM4NDMyIDAwMDAwIG4gCjAwMDAxMzg1NjkgMDAwMDAgbiAKMDAwMDEzODY0NyAwMDAwMCBuIAowMDAwMTM4Nzg0IDAwMDAwIG4gCjAwMDAxMzg5MjQgMDAwMDAgbiAKMDAwMDEzOTAwMiAwMDAwMCBuIAowMDAwMTM5MTQwIDAwMDAwIG4gCjAwMDAxMzkyODAgMDAwMDAgbiAKMDAwMDEzOTM1OSAwMDAwMCBuIAowMDAwMTM5NDk3IDAwMDAwIG4gCjAwMDAxMzk2MzcgMDAwMDAgbiAKMDAwMDEzOTcxNiAwMDAwMCBuIAowMDAwMTM5ODU0IDAwMDAwIG4gCjAwMDAxMzk5OTQgMDAwMDAgbiAKMDAwMDE0MDA3MyAwMDAwMCBuIAowMDAwMTQwMjExIDAwMDAwIG4gCjAwMDAxNDAzNTEgMDAwMDAgbiAKMDAwMDE0MDQzMCAwMDAwMCBuIAowMDAwMTQwNTY3IDAwMDAwIG4gCjAwMDAxNDA3MDcgMDAwMDAgbiAKMDAwMDE0MDc4NSAwMDAwMCBuIAowMDAwMTQwOTIzIDAwMDAwIG4gCjAwMDAxNDEwNjMgMDAwMDAgbiAKMDAwMDE0MTE0MSAwMDAwMCBuIAowMDAwMTQxMjc5IDAwMDAwIG4gCjAwMDAxNDE0MTkgMDAwMDAgbiAKMDAwMDE0MTQ5NyAwMDAwMCBuIAowMDAwMTQxNjM1IDAwMDAwIG4gCjAwMDAxNDE3NzUgMDAwMDAgbiAKMDAwMDE0MTg1MyAwMDAwMCBuIAowMDAwMTQxOTkxIDAwMDAwIG4gCjAwMDAxNDIxMzEgMDAwMDAgbiAKMDAwMDE0MjIwOSAwMDAwMCBuIAowMDAwMTQyMzQ2IDAwMDAwIG4gCjAwMDAxNDI0ODYgMDAwMDAgbiAKMDAwMDE0MjU2NCAwMDAwMCBuIAowMDAwMTQyNzAyIDAwMDAwIG4gCjAwMDAxNDI4NDIgMDAwMDAgbiAKMDAwMDE0MjkyMCAwMDAwMCBuIAowMDAwMTQzMDU4IDAwMDAwIG4gCjAwMDAxNDMxOTggMDAwMDAgbiAKMDAwMDE0MzI3NiAwMDAwMCBuIAowMDAwMTQzNDE0IDAwMDAwIG4gCjAwMDAxNDM1NTQgMDAwMDAgbiAKMDAwMDE0MzYzMiAwMDAwMCBuIAowMDAwMTQzNzcwIDAwMDAwIG4gCjAwMDAxNDM5MTEgMDAwMDAgbiAKMDAwMDE0Mzk5MCAwMDAwMCBuIAowMDAwMTQ0MTI4IDAwMDAwIG4gCjAwMDAxNDQyNzAgMDAwMDAgbiAKMDAwMDE0NDM0OSAwMDAwMCBuIAowMDAwMTQ0NDg5IDAwMDAwIG4gCjAwMDAxNDQ2MzEgMDAwMDAgbiAKMDAwMDE0NDcxMCAwMDAwMCBuIAowMDAwMTQ0ODUwIDAwMDAwIG4gCjAwMDAxNDQ5OTIgMDAwMDAgbiAKMDAwMDE0NTA3MSAwMDAwMCBuIAowMDAwMTQ1MjEwIDAwMDAwIG4gCjAwMDAxNDUzNTIgMDAwMDAgbiAKMDAwMDE0NTQzMyAwMDAwMCBuIAowMDAwMTQ1NTczIDAwMDAwIG4gCjAwMDAxNDU3MTUgMDAwMDAgbiAKMDAwMDE0NTc5NiAwMDAwMCBuIAowMDAwMTQ1OTM2IDAwMDAwIG4gCjAwMDAxNDYwNzggMDAwMDAgbiAKMDAwMDE0NjE1OSAwMDAwMCBuIAowMDAwMTQ2Mjk5IDAwMDAwIG4gCjAwMDAxNDY0NDEgMDAwMDAgbiAKMDAwMDE0NjUyMiAwMDAwMCBuIAowMDAwMTQ2NjYxIDAwMDAwIG4gCjAwMDAxNDY4MDMgMDAwMDAgbiAKMDAwMDE0Njg4NCAwMDAwMCBuIAowMDAwMTQ3MDI0IDAwMDAwIG4gCjAwMDAxNDcxNjYgMDAwMDAgbiAKMDAwMDE0NzI0NyAwMDAwMCBuIAowMDAwMTQ3Mzg3IDAwMDAwIG4gCjAwMDAxNDc1MjkgMDAwMDAgbiAKMDAwMDE0NzYxMCAwMDAwMCBuIAowMDAwMTQ3NzUwIDAwMDAwIG4gCjAwMDAxNDc4OTIgMDAwMDAgbiAKMDAwMDE0Nzk3MyAwMDAwMCBuIAowMDAwMTQ4MTEzIDAwMDAwIG4gCjAwMDAxNDgyNTUgMDAwMDAgbiAKMDAwMDE0ODMzNiAwMDAwMCBuIAowMDAwMTQ4NDc2IDAwMDAwIG4gCjAwMDAxNDg2MTggMDAwMDAgbiAKMDAwMDE0ODY5NyAwMDAwMCBuIAowMDAwMTQ4ODM3IDAwMDAwIG4gCjAwMDAxNDg5NzkgMDAwMDAgbiAKMDAwMDE0OTA1OSAwMDAwMCBuIAowMDAwMTQ5MTk5IDAwMDAwIG4gCjAwMDAxNDkzNDEgMDAwMDAgbiAKMDAwMDE0OTQyMiAwMDAwMCBuIAowMDAwMTQ5NTYyIDAwMDAwIG4gCjAwMDAxNDk3MDQgMDAwMDAgbiAKMDAwMDE0OTc4MyAwMDAwMCBuIAowMDAwMTQ5OTIzIDAwMDAwIG4gCjAwMDAxNTAwNjUgMDAwMDAgbiAKMDAwMDE1MDE0NiAwMDAwMCBuIAowMDAwMTUwMjg2IDAwMDAwIG4gCjAwMDAxNTA0MjggMDAwMDAgbiAKMDAwMDE1MDUwOCAwMDAwMCBuIAowMDAwMTUwNjQ4IDAwMDAwIG4gCjAwMDAxNTA3OTAgMDAwMDAgbiAKMDAwMDE1MDg3MSAwMDAwMCBuIAowMDAwMTUxMDExIDAwMDAwIG4gCjAwMDAxNTExNTMgMDAwMDAgbiAKMDAwMDE1MTIzMiAwMDAwMCBuIAowMDAwMTUxMzcyIDAwMDAwIG4gCjAwMDAxNTE1MTQgMDAwMDAgbiAKMDAwMDE1MTU5MyAwMDAwMCBuIAowMDAwMTUxNzMzIDAwMDAwIG4gCjAwMDAxNTE4NzUgMDAwMDAgbiAKMDAwMDE1MTk1NiAwMDAwMCBuIAowMDAwMTUyMDk1IDAwMDAwIG4gCjAwMDAxNTIyMzcgMDAwMDAgbiAKMDAwMDE1MjMxOCAwMDAwMCBuIAowMDAwMTUyNDU4IDAwMDAwIG4gCjAwMDAxNTI2MDAgMDAwMDAgbiAKMDAwMDE1MjY4MSAwMDAwMCBuIAowMDAwMTUyODIxIDAwMDAwIG4gCjAwMDAxNTI5NjMgMDAwMDAgbiAKMDAwMDE1MzA0NCAwMDAwMCBuIAowMDAwMTUzMTg0IDAwMDAwIG4gCjAwMDAxNTMzMjYgMDAwMDAgbiAKMDAwMDE1MzQwNiAwMDAwMCBuIAowMDAwMTUzNTQ2IDAwMDAwIG4gCjAwMDAxNTM2ODggMDAwMDAgbiAKMDAwMDE1Mzc2OSAwMDAwMCBuIAowMDAwMTUzOTA4IDAwMDAwIG4gCjAwMDAxNTQwNTAgMDAwMDAgbiAKMDAwMDE1NDEzMSAwMDAwMCBuIAowMDAwMTU0MjcxIDAwMDAwIG4gCjAwMDAxNTQ0MTMgMDAwMDAgbiAKMDAwMDE1NDQ5MiAwMDAwMCBuIAowMDAwMTU0NjMyIDAwMDAwIG4gCjAwMDAxNTQ3NzQgMDAwMDAgbiAKMDAwMDE1NDg1NSAwMDAwMCBuIAowMDAwMTU0OTk1IDAwMDAwIG4gCjAwMDAxNTUxMzcgMDAwMDAgbiAKMDAwMDE1NTIxOCAwMDAwMCBuIAowMDAwMTU1MzU4IDAwMDAwIG4gCjAwMDAxNTU1MDAgMDAwMDAgbiAKMDAwMDE1NTU4MSAwMDAwMCBuIAowMDAwMTU1NzIxIDAwMDAwIG4gCjAwMDAxNTU4NjMgMDAwMDAgbiAKMDAwMDE1NTk0NCAwMDAwMCBuIAowMDAwMTU2MDgzIDAwMDAwIG4gCjAwMDAxNTYyMjQgMDAwMDAgbiAKMDAwMDE1NjMwNSAwMDAwMCBuIAowMDAwMTU2NDQzIDAwMDAwIG4gCjAwMDAxNTY1ODMgMDAwMDAgbiAKMDAwMDE3OTIzNiAwMDAwMCBuIAowMDAwMTc5MjU5IDAwMDAwIG4gCjAwMDAxODAwNjUgMDAwMDAgbiAKMDAwMDE4MDI3OSAwMDAwMCBuIAowMDAwMTgxOTQzIDAwMDAwIG4gCjAwMDAxODE5NjUgMDAwMDAgbiAKMDAwMDE4MjE2MSAwMDAwMCBuIAowMDAwMTgzMjkyIDAwMDAwIG4gCjAwMDAxODMzMTMgMDAwMDAgbiAKMDAwMDIwOTMxMiAwMDAwMCBuIAowMDAwMjA5MzM1IDAwMDAwIG4gCjAwMDAyMTAzOTEgMDAwMDAgbiAKMDAwMDIxMDQxMiAwMDAwMCBuIAowMDAwMjMxMzIyIDAwMDAwIG4gCjAwMDAyMzEzNDUgMDAwMDAgbiAKMDAwMDIzMjAwMiAwMDAwMCBuIAowMDAwMjMyMDIzIDAwMDAwIG4gCjAwMDAyODE0ODggMDAwMDAgbiAKMDAwMDI4MTUxMSAwMDAwMCBuIAowMDAwMjgyODA2IDAwMDAwIG4gCjAwMDAyODI4MjggMDAwMDAgbiAKMDAwMDI4MzAyNCAwMDAwMCBuIAowMDAwMjg2NjE2IDAwMDAwIG4gCjAwMDAyODY2MzggMDAwMDAgbiAKMDAwMDI4NjgzNCAwMDAwMCBuIAowMDAwMjg3MzgzIDAwMDAwIG4gCjAwMDAyODc0MDQgMDAwMDAgbiAKMDAwMDMwMDE0OCAwMDAwMCBuIAowMDAwMzAwMTcxIDAwMDAwIG4gCjAwMDAzMDE2NzEgMDAwMDAgbiAKMDAwMDMwMTY5MyAwMDAwMCBuIAowMDAwMzUwMzU2IDAwMDAwIG4gCjAwMDAzNTAzNzkgMDAwMDAgbiAKMDAwMDM1MjM5NSAwMDAwMCBuIAowMDAwMzUyNDE3IDAwMDAwIG4gCjAwMDAzNTI2MTMgMDAwMDAgbiAKMDAwMDM1Mjk2NSAwMDAwMCBuIAowMDAwMzUyOTg2IDAwMDAwIG4gCjAwMDAzNjIwMzAgMDAwMDAgbiAKMDAwMDM2MjA1MiAwMDAwMCBuIAowMDAwMzYzNTY4IDAwMDAwIG4gCjAwMDAzNjM1OTAgMDAwMDAgbiAKMDAwMDM2Mzc4NiAwMDAwMCBuIAowMDAwMzY0MDk4IDAwMDAwIG4gCjAwMDAzNjQxMTkgMDAwMDAgbiAKMDAwMDM2OTY5NSAwMDAwMCBuIAowMDAwMzY5NzE3IDAwMDAwIG4gCjAwMDAzNzA4NTQgMDAwMDAgbiAKMDAwMDM3MDg3NSAwMDAwMCBuIAowMDAwMzk0NzU1IDAwMDAwIG4gCjAwMDAzOTQ3NzggMDAwMDAgbiAKMDAwMDM5NTg5MCAwMDAwMCBuIAowMDAwMzk1OTEyIDAwMDAwIG4gCjAwMDAzOTYxMDggMDAwMDAgbiAKMDAwMDM5NjkzOSAwMDAwMCBuIAowMDAwMzk2OTYwIDAwMDAwIG4gCjAwMDA0MTE5NjYgMDAwMDAgbiAKMDAwMDQxMTk4OSAwMDAwMCBuIAowMDAwNDEyMjQ0IDAwMDAwIG4gCjAwMDA0MTIyNjQgMDAwMDAgbiAKMDAwMDQxNDcxOSAwMDAwMCBuIAowMDAwNDE0NzQxIDAwMDAwIG4gCjAwMDA0MTUwMjEgMDAwMDAgbiAKMDAwMDQxNTA0MSAwMDAwMCBuIAowMDAwNDIwMDQ1IDAwMDAwIG4gCjAwMDA0MjAwNjcgMDAwMDAgbiAKMDAwMDQyMTM4MiAwMDAwMCBuIAowMDAwNDIxNDA0IDAwMDAwIG4gCjAwMDA0MjE2MDAgMDAwMDAgbiAKMDAwMDQyMTkwMCAwMDAwMCBuIAowMDAwNDIxOTIwIDAwMDAwIG4gCjAwMDA0MjU2MTEgMDAwMDAgbiAKMDAwMDQyNTYzMyAwMDAwMCBuIAowMDAwNDI2NDg3IDAwMDAwIG4gCjAwMDA0MjY1MDggMDAwMDAgbiAKMDAwMDQ0MjM5NSAwMDAwMCBuIAowMDAwNDQyNDE4IDAwMDAwIG4gCjAwMDA0NDM4NjEgMDAwMDAgbiAKMDAwMDQ0Mzg4MyAwMDAwMCBuIAowMDAwNDQ0MDc5IDAwMDAwIG4gCjAwMDA0NDQ3MTggMDAwMDAgbiAKMDAwMDQ0NDczOSAwMDAwMCBuIAowMDAwNDYzMTY0IDAwMDAwIG4gCjAwMDA0NjMxODcgMDAwMDAgbiAKMDAwMDQ2NDE5NiAwMDAwMCBuIAowMDAwNDY0MjE3IDAwMDAwIG4gCjAwMDA0NjQ0MTMgMDAwMDAgbiAKMDAwMDQ2NDczNSAwMDAwMCBuIAowMDAwNDY0NzU2IDAwMDAwIG4gCjAwMDA0NjkzODEgMDAwMDAgbiAKMDAwMDQ2OTQwMyAwMDAwMCBuIAowMDAwNDcxMzk3IDAwMDAwIG4gCjAwMDA0NzE0MTkgMDAwMDAgbiAKMDAwMDQ3MTYxNSAwMDAwMCBuIAowMDAwNDc0MzIwIDAwMDAwIG4gCjAwMDA0NzQzNDIgMDAwMDAgbiAKMDAwMDQ3NDM3OSAwMDAwMCBuIAowMDAwNDgzOTk3IDAwMDAwIG4gCjAwMDA0ODQwMTkgMDAwMDAgbiAKMDAwMDQ4NDM3MSAwMDAwMCBuIAowMDAwNDg0MzkyIDAwMDAwIG4gCjAwMDA0OTEzODAgMDAwMDAgbiAKMDAwMDQ5MTQwMiAwMDAwMCBuIAowMDAwNDkyMjI3IDAwMDAwIG4gCjAwMDA0OTIyNDggMDAwMDAgbiAKMDAwMDQ5MjQ0NCAwMDAwMCBuIAowMDAwNDkyNzg3IDAwMDAwIG4gCjAwMDA0OTI4MDggMDAwMDAgbiAKMDAwMDQ5NzgyOCAwMDAwMCBuIAowMDAwNDk3ODUwIDAwMDAwIG4gCjAwMDA0OTgxMTkgMDAwMDAgbiAKMDAwMDQ5ODEzOSAwMDAwMCBuIAowMDAwNTAyMDUxIDAwMDAwIG4gCjAwMDA1MDIwNzMgMDAwMDAgbiAKMDAwMDUwMjMyNiAwMDAwMCBuIAowMDAwNTAyMzQ2IDAwMDAwIG4gCjAwMDA1MDQ0MDkgMDAwMDAgbiAKMDAwMDUwNDQzMSAwMDAwMCBuIAowMDAwNTA2MzA3IDAwMDAwIG4gCjAwMDA1MDYzMjkgMDAwMDAgbiAKMDAwMDUwNjUyNSAwMDAwMCBuIAowMDAwNTA2OTQzIDAwMDAwIG4gCjAwMDA1MDY5NjQgMDAwMDAgbiAKMDAwMDUxNzMwNyAwMDAwMCBuIAowMDAwNTE3MzMwIDAwMDAwIG4gCjAwMDA1MTc1NzMgMDAwMDAgbiAKMDAwMDUxNzU5MyAwMDAwMCBuIAowMDAwNTE5MTIyIDAwMDAwIG4gCjAwMDA1MTkxNDQgMDAwMDAgbiAKMDAwMDUyMDg5NCAwMDAwMCBuIAowMDAwNTIwOTE2IDAwMDAwIG4gCjAwMDA1MjExMTIgMDAwMDAgbiAKMDAwMDUyMTcxNCAwMDAwMCBuIAowMDAwNTIxNzM1IDAwMDAwIG4gCjAwMDA1MzYzMjAgMDAwMDAgbiAKMDAwMDUzNjM0MyAwMDAwMCBuIAowMDAwNTM2Njc2IDAwMDAwIG4gCjAwMDA1MzY2OTcgMDAwMDAgbiAKMDAwMDU0NTIxNSAwMDAwMCBuIAowMDAwNTQ1MjM3IDAwMDAwIG4gCjAwMDA1NDY0NDUgMDAwMDAgbiAKMDAwMDU0NjQ2NyAwMDAwMCBuIAowMDAwNTQ2NjYzIDAwMDAwIG4gCjAwMDA1NDcwNDcgMDAwMDAgbiAKMDAwMDU0NzA2OCAwMDAwMCBuIAowMDAwNTUxNzYwIDAwMDAwIG4gCjAwMDA1NTE3ODIgMDAwMDAgbiAKMDAwMDU1MjE2OCAwMDAwMCBuIAowMDAwNTUyMTg5IDAwMDAwIG4gCjAwMDA1NTY5MjkgMDAwMDAgbiAKMDAwMDU1Njk1MSAwMDAwMCBuIAowMDAwNTU3NDA3IDAwMDAwIG4gCjAwMDA1NTc0MjggMDAwMDAgbiAKMDAwMDU2MTgwOCAwMDAwMCBuIAowMDAwNTYxODMwIDAwMDAwIG4gCjAwMDA1NjQzOTQgMDAwMDAgbiAKMDAwMDU2NDQxNiAwMDAwMCBuIAowMDAwNTY0NjEyIDAwMDAwIG4gCjAwMDA1NjUwODUgMDAwMDAgbiAKMDAwMDU2NTEwNiAwMDAwMCBuIAowMDAwNTc1MzI3IDAwMDAwIG4gCjAwMDA1NzUzNDkgMDAwMDAgbiAKMDAwMDU3NjA3OSAwMDAwMCBuIAowMDAwNTc2MTAwIDAwMDAwIG4gCjAwMDA1OTQyMzQgMDAwMDAgbiAKMDAwMDU5NDI1NyAwMDAwMCBuIAowMDAwNTk1NDAxIDAwMDAwIG4gCjAwMDA1OTU0MjMgMDAwMDAgbiAKMDAwMDU5NTYxOSAwMDAwMCBuIAowMDAwNTk2NDg0IDAwMDAwIG4gCjAwMDA1OTY1MDUgMDAwMDAgbiAKMDAwMDYyNDIwNCAwMDAwMCBuIAowMDAwNjI0MjI3IDAwMDAwIG4gCjAwMDA2MjQ1NzQgMDAwMDAgbiAKMDAwMDYyNDU5NSAwMDAwMCBuIAowMDAwNjMwMzUzIDAwMDAwIG4gCjAwMDA2MzAzNzUgMDAwMDAgbiAKMDAwMDYzMjAwNSAwMDAwMCBuIAowMDAwNjMyMDI3IDAwMDAwIG4gCjAwMDA2MzIyMjMgMDAwMDAgbiAKMDAwMDYzMjUwNSAwMDAwMCBuIAowMDAwNjMyNTI1IDAwMDAwIG4gCjAwMDA2MzQ4NDcgMDAwMDAgbiAKMDAwMDYzNDg2OSAwMDAwMCBuIAowMDAwNjM1MjcwIDAwMDAwIG4gCjAwMDA2MzUyOTEgMDAwMDAgbiAKMDAwMDYzOTgwNCAwMDAwMCBuIAowMDAwNjM5ODI2IDAwMDAwIG4gCjAwMDA2NDAyNzYgMDAwMDAgbiAKMDAwMDY0MDI5NyAwMDAwMCBuIAowMDAwNjQ5NDgyIDAwMDAwIG4gCjAwMDA2NDk1MDQgMDAwMDAgbiAKMDAwMDY1MDYyNyAwMDAwMCBuIAowMDAwNjUwNjQ5IDAwMDAwIG4gCjAwMDA2NTA4NDUgMDAwMDAgbiAKMDAwMDY1NDIyMiAwMDAwMCBuIAowMDAwNjU0MjQ0IDAwMDAwIG4gCjAwMDA2NTQ3NTMgMDAwMDAgbiAKMDAwMDY1NDc3NCAwMDAwMCBuIAowMDAwNjYxMTQzIDAwMDAwIG4gCjAwMDA2NjExNjUgMDAwMDAgbiAKMDAwMDY2MzEzNSAwMDAwMCBuIAowMDAwNjYzMTU3IDAwMDAwIG4gCjAwMDA2NjMzNTMgMDAwMDAgbiAKMDAwMDY2NDAxNyAwMDAwMCBuIAowMDAwNjY0MDM4IDAwMDAwIG4gCjAwMDA2NzY1MzIgMDAwMDAgbiAKMDAwMDY3NjU1NSAwMDAwMCBuIAowMDAwNjc2ODc4IDAwMDAwIG4gCjAwMDA2NzY4OTkgMDAwMDAgbiAKMDAwMDY4MjIwMyAwMDAwMCBuIAowMDAwNjgyMjI1IDAwMDAwIG4gCjAwMDA2ODQxODQgMDAwMDAgbiAKMDAwMDY4NDIwNiAwMDAwMCBuIAowMDAwNjg0NDAyIDAwMDAwIG4gCjAwMDA2ODUxOTUgMDAwMDAgbiAKMDAwMDY4NTIxNiAwMDAwMCBuIAowMDAwNjg1NDEyIDAwMDAwIG4gCjAwMDA2ODYwNDcgMDAwMDAgbiAKMDAwMDY4NjA2OCAwMDAwMCBuIAowMDAwNzAxNDQwIDAwMDAwIG4gCjAwMDA3MDE0NjMgMDAwMDAgbiAKMDAwMDcwMjQwNiAwMDAwMCBuIAowMDAwNzAyNDI3IDAwMDAwIG4gCjAwMDA3MDI2MjMgMDAwMDAgbiAKMDAwMDcwMjk0NyAwMDAwMCBuIAowMDAwNzAyOTY4IDAwMDAwIG4gCjAwMDA3MDg4NzAgMDAwMDAgbiAKMDAwMDcwODg5MiAwMDAwMCBuIAowMDAwNzExMjYwIDAwMDAwIG4gCjAwMDA3MTEyODIgMDAwMDAgbiAKMDAwMDcxMTQ3OCAwMDAwMCBuIAowMDAwNzE2NTA0IDAwMDAwIG4gCjAwMDA3MTY1MjYgMDAwMDAgbiAKMDAwMDcxNzk2MyAwMDAwMCBuIAowMDAwNzE3OTg1IDAwMDAwIG4gCjAwMDA3MTgxODEgMDAwMDAgbiAKMDAwMDcxOTAxNCAwMDAwMCBuIAowMDAwNzE5MDM1IDAwMDAwIG4gCjAwMDA3MTkyMzEgMDAwMDAgbiAKMDAwMDcyMDU4NiAwMDAwMCBuIAowMDAwNzIwNjA4IDAwMDAwIG4gCjAwMDA3MjA4MDQgMDAwMDAgbiAKMDAwMDcyMjEyNSAwMDAwMCBuIAowMDAwNzIyMTQ3IDAwMDAwIG4gCjAwMDA3MjIzNDMgMDAwMDAgbiAKMDAwMDcyMzcwMSAwMDAwMCBuIAowMDAwNzIzNzIzIDAwMDAwIG4gCjAwMDA3MjM5MTkgMDAwMDAgbiAKMDAwMDcyNTI3NyAwMDAwMCBuIAowMDAwNzI1Mjk5IDAwMDAwIG4gCjAwMDA3MjU0OTUgMDAwMDAgbiAKMDAwMDcyNjI2MiAwMDAwMCBuIAowMDAwNzI2MjgzIDAwMDAwIG4gCjAwMDA3MjY0NzkgMDAwMDAgbiAKMDAwMDcyODE2MiAwMDAwMCBuIAowMDAwNzI4MTg0IDAwMDAwIG4gCjAwMDA3MjgzODAgMDAwMDAgbiAKMDAwMDczMDY1NyAwMDAwMCBuIAowMDAwNzMwNjc5IDAwMDAwIG4gCjAwMDA3MzA4NzUgMDAwMDAgbiAKMDAwMDczMDk1NiAwMDAwMCBuIAowMDAwNzMxMDk2IDAwMDAwIG4gCjAwMDA3MzEyMzggMDAwMDAgbiAKMDAwMDczMTMxOSAwMDAwMCBuIAowMDAwNzMxNDU5IDAwMDAwIG4gCjAwMDA3MzE2MDEgMDAwMDAgbiAKMDAwMDczMTY4MSAwMDAwMCBuIAowMDAwNzMxODIxIDAwMDAwIG4gCjAwMDA3MzE5NjMgMDAwMDAgbiAKMDAwMDczMjA0MyAwMDAwMCBuIAowMDAwNzMyMTgzIDAwMDAwIG4gCjAwMDA3MzIzMjUgMDAwMDAgbiAKMDAwMDczMjQwNSAwMDAwMCBuIAowMDAwNzMyNTQ1IDAwMDAwIG4gCjAwMDA3MzI2ODcgMDAwMDAgbiAKMDAwMDczMjc2NyAwMDAwMCBuIAowMDAwNzMyOTA3IDAwMDAwIG4gCjAwMDA3MzMwNDkgMDAwMDAgbiAKMDAwMDczMzEyOSAwMDAwMCBuIAowMDAwNzMzMjY5IDAwMDAwIG4gCjAwMDA3MzM0MTEgMDAwMDAgbiAKMDAwMDczMzQ5MSAwMDAwMCBuIAowMDAwNzMzNjMxIDAwMDAwIG4gCjAwMDA3MzM3NzMgMDAwMDAgbiAKMDAwMDczMzg1MyAwMDAwMCBuIAowMDAwNzMzOTkyIDAwMDAwIG4gCjAwMDA3MzQxMzQgMDAwMDAgbiAKMDAwMDczNDIxNCAwMDAwMCBuIAowMDAwNzM0MzU0IDAwMDAwIG4gCjAwMDA3MzQ0OTYgMDAwMDAgbiAKMDAwMDczNDU3OCAwMDAwMCBuIAowMDAwNzM0NzE4IDAwMDAwIG4gCjAwMDA3MzQ4NjAgMDAwMDAgbiAKMDAwMDczNDk0MiAwMDAwMCBuIAowMDAwNzM1MDgyIDAwMDAwIG4gCjAwMDA3MzUyMjQgMDAwMDAgbiAKMDAwMDczNTMwNiAwMDAwMCBuIAowMDAwNzM1NDQ2IDAwMDAwIG4gCjAwMDA3MzU1ODggMDAwMDAgbiAKMDAwMDczNTY3MCAwMDAwMCBuIAowMDAwNzM1ODEwIDAwMDAwIG4gCjAwMDA3MzU5NTIgMDAwMDAgbiAKMDAwMDczNjAzNCAwMDAwMCBuIAowMDAwNzM2MTc0IDAwMDAwIG4gCjAwMDA3MzYzMTYgMDAwMDAgbiAKMDAwMDczNjM5OCAwMDAwMCBuIAowMDAwNzM2NTM4IDAwMDAwIG4gCjAwMDA3MzY2ODAgMDAwMDAgbiAKMDAwMDczNjc2MiAwMDAwMCBuIAowMDAwNzM2OTAyIDAwMDAwIG4gCjAwMDA3MzcwNDQgMDAwMDAgbiAKMDAwMDczNzEyNiAwMDAwMCBuIAowMDAwNzM3MjY2IDAwMDAwIG4gCjAwMDA3Mzc0MDggMDAwMDAgbiAKMDAwMDczNzQ5MCAwMDAwMCBuIAowMDAwNzM3NjI5IDAwMDAwIG4gCjAwMDA3Mzc3NzEgMDAwMDAgbiAKMDAwMDczNzg1MyAwMDAwMCBuIAowMDAwNzM3OTkzIDAwMDAwIG4gCjAwMDA3MzgxMzUgMDAwMDAgbiAKMDAwMDczODIxNiAwMDAwMCBuIAowMDAwNzM4MzU2IDAwMDAwIG4gCjAwMDA3Mzg0OTggMDAwMDAgbiAKMDAwMDczODU3OCAwMDAwMCBuIAowMDAwNzM4NzE3IDAwMDAwIG4gCjAwMDA3Mzg4NTkgMDAwMDAgbiAKMDAwMDczODkzOSAwMDAwMCBuIAowMDAwNzM5MDc4IDAwMDAwIG4gCjAwMDA3MzkyMjAgMDAwMDAgbiAKMDAwMDczOTMwMCAwMDAwMCBuIAowMDAwNzM5NDM4IDAwMDAwIG4gCjAwMDA3Mzk1ODAgMDAwMDAgbiAKMDAwMDczOTY2MCAwMDAwMCBuIAowMDAwNzM5Nzk5IDAwMDAwIG4gCjAwMDA3Mzk5NDEgMDAwMDAgbiAKMDAwMDc0MDAyMSAwMDAwMCBuIAowMDAwNzQwMTYxIDAwMDAwIG4gCjAwMDA3NDAzMDMgMDAwMDAgbiAKMDAwMDc0MDM4MyAwMDAwMCBuIAowMDAwNzQwNTIyIDAwMDAwIG4gCjAwMDA3NDA2NjQgMDAwMDAgbiAKMDAwMDc1NDc4NSAwMDAwMCBuIAowMDAwNzU0ODA4IDAwMDAwIG4gCjAwMDA3NTUyNjEgMDAwMDAgbiAKMDAwMDc1NTQ3NSAwMDAwMCBuIAowMDAwNzU2Nzc0IDAwMDAwIG4gCjAwMDA3NTY3OTYgMDAwMDAgbiAKMDAwMDc1Njk5MiAwMDAwMCBuIAowMDAwNzU3MjU3IDAwMDAwIG4gCjAwMDA3NzE5NjggMDAwMDAgbiAKMDAwMDc3MTk0NSAwMDAwMCBuIAowMDAwNzcyMDY4IDAwMDAwIG4gCjAwMDA3NzIwODggMDAwMDAgbiAKMDAwMDc3MjczOSAwMDAwMCBuIAowMDAwNzcyMjUzIDAwMDAwIG4gCjAwMDA3NzMzMTYgMDAwMDAgbiAKMDAwMDc3MzMzNyAwMDAwMCBuIAowMDAwNzczNTk3IDAwMDAwIG4gCjAwMDA3OTAxMDAgMDAwMDAgbiAKMDAwMDc5MDA3NyAwMDAwMCBuIAowMDAwNzkwMjA2IDAwMDAwIG4gCjAwMDA3OTAyMjYgMDAwMDAgbiAKMDAwMDc5MDkzOCAwMDAwMCBuIAowMDAwNzkwMzg2IDAwMDAwIG4gCjAwMDA3OTE1OTUgMDAwMDAgbiAKMDAwMDc5MTYxNiAwMDAwMCBuIAowMDAwNzkxODg0IDAwMDAwIG4gCjAwMDA4MDExMDYgMDAwMDAgbiAKMDAwMDgwMTA4NCAwMDAwMCBuIAowMDAwODAxMjA0IDAwMDAwIG4gCjAwMDA4MDEyMjQgMDAwMDAgbiAKMDAwMDgwMTcwNyAwMDAwMCBuIAowMDAwODAxMzkyIDAwMDAwIG4gCjAwMDA4MDIxMDggMDAwMDAgbiAKMDAwMDgwMjEyOSAwMDAwMCBuIAowMDAwODAyMzkxIDAwMDAwIG4gCjAwMDA4MTI1MzUgMDAwMDAgbiAKMDAwMDgxMjUxMiAwMDAwMCBuIAowMDAwODEyNjMzIDAwMDAwIG4gCjAwMDA4MTI2NTMgMDAwMDAgbiAKMDAwMDgxMzIxMiAwMDAwMCBuIAowMDAwODEyODE3IDAwMDAwIG4gCjAwMDA4MTM3MDEgMDAwMDAgbiAKMDAwMDgxNDEyNiAwMDAwMCBuIAowMDAwODE1NzU1IDAwMDAwIG4gCnRyYWlsZXIKPDwKICAvUm9vdCA1OTEgMCBSCiAgL0luZm8gMSAwIFIKICAvSUQgWzxGRUQ2OUU5ODNERkREMDEzNzk4Njc3QzgxODYxODdFNz4gPEZFRDY5RTk4M0RGREQwMTM3OTg2NzdDODE4NjE4N0U3Pl0KICAvU2l6ZSA1OTMKPj4Kc3RhcnR4cmVmCjgxNTkxNwolJUVPRgo=