Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

LyogQXJlIFUgT0sgKi8NCg0KPD9waHAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcDQ..

Decoded Output download

<?  LyogQXJlIFUgT0sgKi8NCg0KPD9waHAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcDQp8KiAgICBWQkEgU0hFTEwgRk9SQ0VSIC0gVkVSU0lPTiAyLjEJKnwNCnwqICAgICBFZGl0ICYgRGV2ZWxvcCBieSBWQkFURUFNICAgICAgICAqfA0KfCogIAkgIGh0dHA6Ly92YmF0ZWFtLm5ldCAgICAJICAgICp8DQp8KiAgICA9PSAgSGFja2luZyAmIFNlY3VyaXR5ICA9PSAgICAgICAgKnwNClwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KZXJyb3JfcmVwb3J0aW5nKDcpOw0KQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsNCm9iX3N0YXJ0KCk7DQokbXRpbWUgPSBleHBsb2RlKCcgJywgbWljcm90aW1lKCkpOw0KJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZVswXTsNCmRlZmluZSgnU0FfUk9PVCcsIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgZGlybmFtZShfX0ZJTEVfXykpIC4gJy8nKTsNCi8vZGVmaW5lKCdJU19XSU4nLCBzdHJzdHIoUEhQX09TLCAnV0lOJykgPyAxIDogMCApOw0KZGVmaW5lKCdJU19XSU4nLCBESVJFQ1RPUllfU0VQQVJBVE9SID09ICdcXCcpOw0KZGVmaW5lKCdJU19DT00nLCBjbGFzc19leGlzdHMoJ0NPTScpID8gMSA6IDApOw0KZGVmaW5lKCdJU19HUEMnLCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKTsNCiRkaXNfZnVuYyA9IGdldF9jZmdfdmFyKCdkaXNhYmxlX2Z1bmN0aW9ucycpOw0KZGVmaW5lKCdJU19QSFBJTkZPJywgKCFlcmVnaSgicGhwaW5mbyIsICRkaXNfZnVuYykpID8gMSA6IDApOw0KQHNldF90aW1lX2xpbWl0KDApOw0KZm9yZWFjaCAoYXJyYXkoJ19HRVQnLCAnX1BPU1QnKSBhcyAkX3JlcXVlc3QpIHsNCiAgICBmb3JlYWNoICgkJF9yZXF1ZXN0IGFzICRfa2V5ID0+ICRfdmFsdWUpIHsNCiAgICAgICAgaWYgKCRfa2V5ezB9ICE9ICdfJykgew0KICAgICAgICAgICAgaWYgKElTX0dQQykgew0KICAgICAgICAgICAgICAgICRfdmFsdWUgPSBzX2FycmF5KCRfdmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJCRfa2V5ID0gJF92YWx1ZTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCi8qPT09PT09PT09PT09PT09PT0gIEluZm8gTG9naW4gID09PT09PT09PT09PT09PT0qLw0KJGFkbWluID0gYXJyYXkoKTsNCiRhZG1pblsnY2hlY2snXSA9IHRydWU7DQokYWRtaW5bJ3Bhc3MnXSA9ICdoajRjayc7IC8vIFBhc3N3b3JkIGxvZ2luDQokYWRtaW5bJ2Nvb2tpZXByZSddID0gJyc7DQokYWRtaW5bJ2Nvb2tpZWRvbWFpbiddID0gJyc7DQokYWRtaW5bJ2Nvb2tpZXBhdGgnXSA9ICcvJzsNCiRhZG1pblsnY29va2llbGlmZSddID0gODY0MDA7DQovKj09PT09PT09PT09PT09PT09PT09PSBFbmQgPT09PT09PT09PT09PT09PT09PT09Ki8NCmlmICgkY2hhcnNldCA9PSAndXRmOCcpIHsNCiAgICBoZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iik7DQp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2JpZzUnKSB7DQogICAgaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1iaWc1Iik7DQp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2diaycpIHsNCiAgICBoZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWdiayIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdsYXRpbjEnKSB7DQogICAgaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0yIik7DQp9DQokc2VsZiA9ICRfU0VSVkVSWydQSFBfU0VMRiddID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsNCiR0aW1lc3RhbXAgPSB0aW1lKCk7DQovKj09PT09PT09PT09PT09PT09PT09PSBMb2dpbiA9PT09PT09PT09PT09PT09PT09PT0qLw0KaWYgKCRhY3Rpb24gPT0gImxvZ291dCIpIHsNCiAgICBzY29va2llKCd2YmFwYXNzJywgJycsIC04NjQwMCAqIDM2NSk7DQogICAgcCgnPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDtVUkw9JyAuICRzZWxmIC4gJyI+Jyk7DQogICAgcCgnPGJvZHkgYmFja2dyb3VuZD1ibGFjaz4nKTsNCiAgICBleGl0Ow0KfQ0KaWYgKCRhZG1pblsnY2hlY2snXSkgew0KICAgIGlmICgkZG9pbmcgPT0gJ2xvZ2luJykgew0KICAgICAgICBpZiAoJGFkbWluWydwYXNzJ10gPT0gJHBhc3N3b3JkKSB7DQogICAgICAgICAgICBzY29va2llKCd2YmFwYXNzJywgJHBhc3N3b3JkKTsNCiAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG1haWwgU2VuZGVyIHRvIG15IEVtYWlsIC0gUGxlYXNlIHJlbW92ZSB0aGlzIGJlZm9yZSB5b3UgdXNpbmcgdGhpcyBzaGVsbCBjb2RlLCBUaGFua3MgLSBGZXJuYW5kbyAtIFZCQVRlYW0NCiAgICAgICAgICAgICR0aW1lX3NoZWxsID0gIiIgLiBkYXRlKCJkL20vWSAtIEg6aTpzIikgLiAiIjsNCiAgICAgICAgICAgICRpcF9yZW1vdGUgPSAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXTsNCiAgICAgICAgICAgICRmcm9tX3NoZWxsY29kZSA9ICdzaGVsbEAnIC4gZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkgLiAnJzsNCiAgICAgICAgICAgICR0b19lbWFpbCA9ICdtaW5oZHVvbmcucGpuQGdtYWlsLmNvbSc7DQogICAgICAgICAgICAkc2VydmVyX21haWwgPSAiIiAuIGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pIC4gIiAgLSAiIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIC4gIiI7DQogICAgICAgICAgICAkbGlua2NyID0gIkxpbms6ICIgLiAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSAuICIiIC4gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gLiAiIC0gSVAgRXhjdXRpbmc6ICRpcF9yZW1vdGUgLSBUaW1lOiAkdGltZV9zaGVsbCI7DQogICAgICAgICAgICAkaGVhZGVyID0gIkZyb206ICRmcm9tX3NoZWxsY29kZVxyXG5SZXBseS10bzogJGZyb21fc2hlbGxjb2RlIjsNCiAgICAgICAgICAgIEBtYWlsKCR0b19lbWFpbCwgJHNlcnZlcl9tYWlsLCAkbGlua2NyLCAkaGVhZGVyKTsNCiAgICAgICAgICAgIHAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjI7VVJMPScgLiAkc2VsZiAuICciPicpOw0KICAgICAgICAgICAgcCgnPGJvZHkgYmdjb2xvcj1ibGFjaz4NCjxCUj48QlI+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9eWVsbG93IGZhY2U9dGFob21hIHNpemU9Mj5CWUcgLSBUaGUgTGVnZW5kIG9mIFZpZXRuYW1lc2UgSGFja2VyIFdvcmxkICAtIFBsZWFzZSB3YWl0Li4uPEJSPjxpbWcgc3JjPWh0dHA6Ly90My5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUkZJUXk5b0xjOWpNV21EWV9OX3N4aldQeXVzVVdDNGlnd0sybHFCbTY4YURHY1NmS1BQQT48L2Rpdj4nKTsNCiAgICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkZXJyX21lc3MgPSAnPHRhYmxlIHdpZHRoPTEwMCU+PHRyPjx0ZCBiZ2NvbG9yPSMwRTBFMEUgd2lkdGg9MTAwJSBoZWlnaHQ9MjQ+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9cmVkIGZhY2U9dGFob21hIHNpemU9Mj48Ymxpbms+UGFzc3dvcmQgaW5jb3JyZWN0LCBQbGVhc2UgdHJ5IGFnYWluISEhPC9ibGluaz48QlI+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPic7DQogICAgICAgICAgICBlY2hvICRlcnJfbWVzczsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoJF9DT09LSUVbJ3ZiYXBhc3MnXSkgew0KICAgICAgICBpZiAoJF9DT09LSUVbJ3ZiYXBhc3MnXSAhPSAkYWRtaW5bJ3Bhc3MnXSkgew0KICAgICAgICAgICAgbG9naW5wYWdlKCk7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBsb2dpbnBhZ2UoKTsNCiAgICB9DQp9DQovKj09PT09PT09PT09PT09PT09PT09PSBMb2dpbiA9PT09PT09PT09PT09PT09PT09PT0qLw0KJGVycm1zZyA9ICcnOw0KaWYgKCRhY3Rpb24gPT0gJ3BocGluZm8nKSB7DQogICAgaWYgKElTX1BIUElORk8pIHsNCiAgICAgICAgcGhwaW5mbygpOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRlcnJtc2cgPSAncGhwaW5mbygpIGZ1bmN0aW9uIGhhcyBub24tcGVybWlzc2libGUnOw0KICAgIH0NCn0NCmlmICgkZG9pbmcgPT0gJ2Rvd25maWxlJyAmJiAkdGhlZmlsZSkgew0KICAgIGlmICghQGZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgew0KICAgICAgICAkZXJybXNnID0gJ1RoZSBmaWxlIHlvdSB3YW50IERvd25sb2FkYWJsZSB3YXMgbm9uZXhpc3RlbnQnOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRmaWxlaW5mbyA9IHBhdGhpbmZvKCR0aGVmaWxlKTsNCiAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtJyAuICRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScgLiAkZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAnIC4gZmlsZXNpemUoJHRoZWZpbGUpKTsNCiAgICAgICAgQHJlYWRmaWxlKCR0aGVmaWxlKTsNCiAgICAgICAgZXhpdDsNCiAgICB9DQp9DQppZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgISRzYXZlYXNmaWxlKSB7DQogICAgZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsNCiAgICAkdGFibGUgPSBhcnJheV9mbGlwKCR0YWJsZSk7DQogICAgJHJlc3VsdCA9IHEoIlNIT1cgdGFibGVzIik7DQogICAgaWYgKCEkcmVzdWx0KSBwKCc8aDI+JyAuIG15c3FsX2Vycm9yKCkgLiAnPC9oMj4nKTsNCiAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAnX015U1FMLnNxbCcpOw0KICAgIGhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi91bmtub3duJyk7DQogICAgaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nIC4gJGZpbGVuYW1lKTsNCiAgICAkbXlzcWxkYXRhID0gJyc7DQogICAgd2hpbGUgKCRjdXJyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KICAgICAgICBpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgew0KICAgICAgICAgICAgJG15c3FsZGF0YS49IHNxbGR1bXB0YWJsZSgkY3Vycm93WzBdKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBteXNxbF9jbG9zZSgpOw0KICAgIGV4aXQ7DQp9DQovLyBNeXNxbA0KaWYgKCRkb2luZyA9PSAnbXlzcWxkb3duJykgew0KICAgIGlmICghJGRibmFtZSkgew0KICAgICAgICAkZXJybXNnID0gJ1BsZWFzZSBpbnB1dCBkYm5hbWUnOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJG15c3FsZGxmaWxlKSkgew0KICAgICAgICAgICAgJGVycm1zZyA9ICdUaGUgZmlsZSB5b3Ugd2FudCBEb3dubG9hZGFibGUgd2FzIG5vbmV4aXN0ZW50JzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRyZXN1bHQgPSBxKCJzZWxlY3QgbG9hZF9maWxlKCckbXlzcWxkbGZpbGUnKTsiKTsNCiAgICAgICAgICAgIGlmICghJHJlc3VsdCkgew0KICAgICAgICAgICAgICAgIHEoIkRST1AgVEFCTEUgSUYgRVhJU1RTIHRtcF9hbmdlbDsiKTsNCiAgICAgICAgICAgICAgICBxKCJDUkVBVEUgVEFCTEUgdG1wX2FuZ2VsIChjb250ZW50IExPTkdCTE9CIE5PVCBOVUxMKTsiKTsNCiAgICAgICAgICAgICAgICAvL0Rvd25sb2FkIFNRTA0KICAgICAgICAgICAgICAgIHEoIkxPQUQgREFUQSBMT0NBTCBJTkZJTEUgJyIgLiBhZGRzbGFzaGVzKCRteXNxbGRsZmlsZSkgLiAiJyBJTlRPIFRBQkxFIHRtcF9hbmdlbCBGSUVMRFMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nIEVTQ0FQRUQgQlkgJycgTElORVMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nOyIpOw0KICAgICAgICAgICAgICAgICRyZXN1bHQgPSBxKCJzZWxlY3QgY29udGVudCBmcm9tIHRtcF9hbmdlbCIpOw0KICAgICAgICAgICAgICAgIHEoIkRST1AgVEFCTEUgdG1wX2FuZ2VsIik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcm93ID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOw0KICAgICAgICAgICAgaWYgKCEkcm93KSB7DQogICAgICAgICAgICAgICAgJGVycm1zZyA9ICdMb2FkIGZpbGUgZmFpbGVkICcgLiBteXNxbF9lcnJvcigpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZmlsZWluZm8gPSBwYXRoaW5mbygkbXlzcWxkbGZpbGUpOw0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LScgLiAkZmlsZWluZm9bJ2V4dGVuc2lvbiddKTsNCiAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScgLiAkZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KICAgICAgICAgICAgICAgIGhlYWRlcigiQWNjZXB0LUxlbmd0aDogIiAuIHN0cmxlbigkcm93WzBdKSk7DQogICAgICAgICAgICAgICAgZWNobyAkcm93WzBdOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjx0aXRsZT48P3BocCBlY2hvIHN0cl9yZXBsYWNlKCcuJywgJycsICdCWUcgLSBUaGUgTGVnZW5kIG9mIFZpZXRuYW1lc2UgSGFja2VyIFdvcmxkJyk7ID8+PC90aXRsZT4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQpib2R5LHRke2ZvbnQ6IDEwcHQgVGFob21hO2NvbG9yOmdyYXk7bGluZS1oZWlnaHQ6IDE2cHg7fQ0KDQphIHtjb2xvcjogIzc0QTIwMjt0ZXh0LWRlY29yYXRpb246bm9uZTt9DQphOmhvdmVye2NvbG9yOiAjZjAwO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KLmFsdDEgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6IzBFMEUwRTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmFsdDIgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6I2Y5ZjlmOTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmZvY3VzIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbTowcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMwRTBFMEU7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5mb3V0MSB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMEUwRTBFO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouZm91dCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMjAyMDIwO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouaGVhZCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMjAyMDIwO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpib2xkO30NCi5oZWFkX3NtYWxsIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMyMDIwMjA7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6OHB0O30NCi5oZWFkIHRkIHNwYW57Zm9udC13ZWlnaHQ6bm9ybWFsO30NCmZvcm17bWFyZ2luOjA7cGFkZGluZzowO30NCmgye21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM1QjY4NkY7fQ0KdWwuaW5mbyBsaXttYXJnaW46MDtjb2xvcjojNDQ0O2xpbmUtaGVpZ2h0OjI0cHg7aGVpZ2h0OjI0cHg7fQ0KdXt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6Izc3NztmbG9hdDpsZWZ0O2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTUwcHg7bWFyZ2luLXJpZ2h0OjEwcHg7fQ0KaW5wdXQsIHRleHRhcmVhLCBidXR0b24NCnsNCglmb250LXNpemU6IDlwdDsNCgljb2xvcjogI2NjYzsNCglmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOw0KCWJvcmRlci1sZWZ0OiAxcHggc29saWQgIzc0QTIwMjsNCglib3JkZXItdG9wOiAxcHggc29saWQgIzc0QTIwMjsNCglib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNzRBMjAyOw0KCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNzRBMjAyOw0KfQ0Kc2VsZWN0DQp7DQoJZm9udC1zaXplOiA4cHQ7DQoJZm9udC13ZWlnaHQ6IG5vcm1hbDsNCgljb2xvcjogI2NjYzsNCglmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOw0KfQ0KDQo8L3N0eWxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gQ2hlY2tBbGwoZm9ybSkgew0KCWZvcih2YXIgaT0wO2k8Zm9ybS5lbGVtZW50cy5sZW5ndGg7aSsrKSB7DQoJCXZhciBlID0gZm9ybS5lbGVtZW50c1tpXTsNCgkJaWYgKGUubmFtZSAhPSAnY2hrYWxsJykNCgkJZS5jaGVja2VkID0gZm9ybS5jaGthbGwuY2hlY2tlZDsNCiAgICB9DQp9DQpmdW5jdGlvbiAkKGlkKSB7DQoJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsNCn0NCmZ1bmN0aW9uIGdvYWN0aW9uKGFjdCl7DQoJJCgnZ29hY3Rpb24nKS5hY3Rpb24udmFsdWU9YWN0Ow0KCSQoJ2dvYWN0aW9uJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjwvaGVhZD4NCjxib2R5IG9uTG9hZD0iaW5pdCgpIiBzdHlsZT0ibWFyZ2luOjA7dGFibGUtbGF5b3V0OmZpeGVkOyB3b3JkLWJyZWFrOmJyZWFrLWFsbCIgYmdjb2xvcj1ibGFjayBiYWNrZ3JvdW5kPWh0dHA6Ly9pMzgyLnBob3RvYnVja2V0LmNvbS9hbGJ1bXMvb28yNjMvdm5oYWNrZXIvYmctMS5qcGc+DQoNCg0KPGRpdiBib3JkZXI9IjAiIHN0eWxlPSJwb3NpdGlvbjpmaXhlZDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMjVweDsgei1pbmRleDogMTsgdG9wOiAzMDBweDsgbGVmdDogMDsiIGlkPSJsb2FkaW5nIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249ImNlbnRlciI+DQoJCQkJPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjExMHB4IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzAwMzMwMCI+DQoJCQkJCTx0cj4NCgkJCQkJCTx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Y2VudGVyPg0KCQkJCSA8ZGl2IGJvcmRlcj0iMSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICMwRTBFMEU7IGZpbHRlcjogYWxwaGEob3BhY2l0eT03MCk7IG9wYWNpdHk6IC43OyB3aWR0aDogMTEwcHg7IGhlaWdodDogMjVweDsgei1pbmRleDogMTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiIGJvcmRlcmNvbG9yPSIjMDA2NjAwIiAgYWxpZ249ImNlbnRlciI+DQoJCQkJICAgTG9hZGluZzxpbWcgc3JjPSJodHRwOi8vaTM4Mi5waG90b2J1Y2tldC5jb20vYWxidW1zL29vMjYzL3ZuaGFja2VyL2xvYWRpbmcuZ2lmIj4NCgkJCQkgIDwvZGl2Pg0KCQkJCTwvdGQ+DQoJCQkJCTwvdHI+DQoJCQkJPC90YWJsZT4NCgkJCSA8L2Rpdj4NCiA8c2NyaXB0Pg0KIHZhciBsZD0oZG9jdW1lbnQuYWxsKTsNCiAgdmFyIG5zND1kb2N1bWVudC5sYXllcnM7DQogdmFyIG5zNj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCYmIWRvY3VtZW50LmFsbDsNCiB2YXIgaWU0PWRvY3VtZW50LmFsbDsNCiAgaWYgKG5zNCkNCiAJbGQ9ZG9jdW1lbnQubG9hZGluZzsNCiBlbHNlIGlmIChuczYpDQogCWxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkaW5nIikuc3R5bGU7DQogZWxzZSBpZiAoaWU0KQ0KIAlsZD1kb2N1bWVudC5hbGwubG9hZGluZy5zdHlsZTsNCiAgZnVuY3Rpb24gaW5pdCgpDQogew0KIGlmKG5zNCl7bGQudmlzaWJpbGl0eT0iaGlkZGVuIjt9DQogZWxzZSBpZiAobnM2fHxpZTQpIGxkLmRpc3BsYXk9Im5vbmUiOw0KIH0NCiA8L3NjcmlwdD4NCg0KDQoNCg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+DQoJPHRyIGNsYXNzPSJoZWFkX3NtYWxsIj4NCgkJPHRkICB3aWR0aD0xMDAlPg0KCQk8dGFibGUgd2lkdGg9MTAwJT48dHIgY2xhc3M9ImhlYWRfc21hbGwiPjx0ZCAgd2lkdGg9ODZweD48YSB0aXRsZT0iQllHIC0gVGhlIExlZ2VuZCBvZiBWaWV0bmFtZXNlIEhhY2tlciBXb3JsZCIgaHJlZj0iPD9waHAgJHNlbGY7ID8+Ij48aW1nIHNyYz1odHRwOi8vY0I4LnVwYW5oLmNvbS8xOS4wLjI0NDc1ODg3LkxIZzAvYmFubmVyLmdpZiBoZWlnaHQ9ODYgYm9yZGVyPTA+PC9hPjwvdGQ+PHRkPg0KCQk8c3BhbiBzdHlsZT0iZmxvYXQ6bGVmdDsiPiA8P3BocCBlY2hvICJIb3N0bmFtZTogIiAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICIiOyA/PiAgfCA8YSBocmVmPSJodHRwOi8vYmV5ZXVncm91cC5jb20iIHRhcmdldD0iX2JsYW5rIj48P3BocCBlY2hvIHN0cl9yZXBsYWNlKCcuJywgJycsICdCWUcgLSBUaGUgTGVnZW5kIG9mIFZpZXRuYW1lc2UgSGFja2VyIFdvcmxkJyk7ID8+IDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdsb2dvdXQnKTsiPjxmb250IGNvbG9yPXJlZD5Mb2dvdXQ8L2ZvbnQ+PC9hPjwvc3Bhbj4gPGJyIC8+DQoNCgkJPD9waHANCiRjdXJsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk7DQokbXlzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9jb25uZWN0Jyk7DQokbXNzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0Jyk7DQokcGdfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0Jyk7DQokb3JhX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnb2NpbG9nb24nKTsNCmVjaG8gKCgkc2FmZV9tb2RlKSA/ICgiU2FmZV9tb2Q6IDxiPjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiKSA6ICgiU2FmZV9tb2Q6IDxiPjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICIpKTsNCmVjaG8gIlBIUCB2ZXJzaW9uOiA8Yj4iIC4gQHBocHZlcnNpb24oKSAuICI8L2I+IC0gIjsNCmVjaG8gImNVUkw6ICIgLiAoKCRjdXJsX29uKSA/ICgiPGI+PGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiAtICIpIDogKCI8Yj48Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiKSk7DQplY2hvICJNeVNRTDogPGI+IjsNCiRteXNxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ215c3FsX2Nvbm5lY3QnKTsNCmlmICgkbXlzcWxfb24pIHsNCiAgICBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIjsNCn0gZWxzZSB7DQogICAgZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIjsNCn0NCmVjaG8gIk1TU1FMOiA8Yj4iOw0KJG1zc3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpOw0KaWYgKCRtc3NxbF9vbikgew0KICAgIGVjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiOw0KfSBlbHNlIHsNCiAgICBlY2hvICI8Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiOw0KfQ0KZWNobyAiUG9zdGdyZVNRTDogPGI+IjsNCiRwZ19vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKTsNCmlmICgkcGdfb24pIHsNCiAgICBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIjsNCn0gZWxzZSB7DQogICAgZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIjsNCn0NCmVjaG8gIk9yYWNsZTogPGI+IjsNCiRvcmFfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdvY2lsb2dvbicpOw0KaWYgKCRvcmFfb24pIHsNCiAgICBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IjsNCn0gZWxzZSB7DQogICAgZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+PEJSPiI7DQp9DQplY2hvICJEaXNhYmxlIGZ1bmN0aW9ucyA6IDxiPiI7DQppZiAoJycgPT0gKCRkZiA9IEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSkgew0KICAgIGVjaG8gIjxmb250IGNvbG9yPWdyZWVuPk5PTkU8L2ZvbnQ+PC9iPjxCUj4iOw0KfSBlbHNlIHsNCiAgICBlY2hvICI8Zm9udCBjb2xvcj1yZWQ+JGRmPC9mb250PjwvYj48QlI+IjsNCn0NCmVjaG8gIjxmb250IGNvbG9yPXdoaXRlPlVuYW1lIC1hPC9mb250PjogIiAuIEBzdWJzdHIoQHBocF91bmFtZSgpLCAwLCAxMjApIC4gIjxicj4iOw0KZWNobyAiPGZvbnQgY29sb3I9d2hpdGU+U2VydmVyPC9mb250PjogIiAuIEBzdWJzdHIoJFNFUlZFUl9TT0ZUV0FSRSwgMCwgMTIwKSAuICIgLSA8Zm9udCBjb2xvcj13aGl0ZT5pZDwvZm9udD46ICIgLiBAZ2V0bXl1aWQoKSAuICIoIiAuIEBnZXRfY3VycmVudF91c2VyKCkgLiAiKSAtIHVpZD0iIC4gQGdldG15dWlkKCkgLiAiICgiIC4gQGdldF9jdXJyZW50X3VzZXIoKSAuICIpIGdpZD0iIC4gQGdldG15Z2lkKCkgLiAiKCIgLiBAZ2V0X2N1cnJlbnRfdXNlcigpIC4gIik8YnI+IjsNCj8+DQoJCTwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+DQoJPC90cj4NCgk8dHIgY2xhc3M9ImFsdDEiPg0KCQk8dGQgIHdpZHRoPTEwJT48c3BhbiBzdHlsZT0iZmxvYXQ6bGVmdDsiPltTZXJ2ZXIgSVA6IDw/cGhwIGVjaG8gIjxmb250IGNvbG9yPXllbGxvdz4iIC4gZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkgLiAiPC9mb250PiI7ID8+IC0gWW91ciBJUDogPD9waHAgZWNobyAiPGZvbnQgY29sb3I9eWVsbG93PiIgLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuICI8L2ZvbnQ+IjsgPz5dIDwvc3Bhbj4gICA8YnIgLz4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyIC8+DQoJCQkNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2ZpbGUnKTsiPkZpbGUgTWFuYWdlcjwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsYWRtaW4nKTsiPk15U1FMIE1hbmFnZXI8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NxbGZpbGUnKTsiPk15U1FMIFVwbG9hZCAmYW1wOyBEb3dubG9hZDwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc2hlbGwnKTsiPkV4ZWN1dGUgQ29tbWFuZDwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbigncGhwZW52Jyk7Ij5QSFAgVmFyaWFibGU8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2V2YWwnKTsiPkV2YWwgUEhQIENvZGU8L2E+DQoJCQk8P3BocCBpZiAoIUlTX1dJTikgeyA/PiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2JydXRlJyk7Ij5CcnV0ZTwvYT4gPD9waHANCn0gPz4NCgkJCTw/cGhwIGlmICghSVNfV0lOKSB7ID8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZXRjcHdkJyk7Ij4vZXRjL3Bhc3N3ZDwvYT4gPD9waHANCn0gPz4NCgkJCTw/cGhwIGlmICghSVNfV0lOKSB7ID8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYmFja2Nvbm5lY3QnKTsiPkJhY2sgQ29ubmVjdDwvYT48P3BocA0KfSA/Pg0KCQk8L3RkPg0KCTwvdHI+DQo8L3RhYmxlPg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIxNSIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQ+DQo8P3BocA0KZm9ybWhlYWQoYXJyYXkoJ25hbWUnID0+ICdnb2FjdGlvbicpKTsNCm1ha2VoaWRlKCdhY3Rpb24nKTsNCmZvcm1mb290KCk7DQokZXJybXNnICYmIG0oJGVycm1zZyk7DQovLyBEaXIgZnVuY3Rpb24NCiEkZGlyICYmICRkaXIgPSAnLic7DQokbm93cGF0aCA9IGdldFBhdGgoU0FfUk9PVCwgJGRpcik7DQppZiAoc3Vic3RyKCRkaXIsIC0xKSAhPSAnLycpIHsNCiAgICAkZGlyID0gJGRpciAuICcvJzsNCn0NCiR1ZWRpciA9IHVlKCRkaXIpOw0KaWYgKCEkYWN0aW9uIHx8ICRhY3Rpb24gPT0gJ2ZpbGUnKSB7DQogICAgLy8gTm9uLXdyaXRlYWJsZQ0KICAgICRkaXJfd3JpdGVhYmxlID0gQGlzX3dyaXRhYmxlKCRub3dwYXRoKSA/ICdXcml0YWJsZScgOiAnTm9uLXdyaXRhYmxlJzsNCiAgICAvLyBEZWxldGUgZGlyDQogICAgaWYgKCRkb2luZyA9PSAnZGVsZGlyJyAmJiAkdGhlZmlsZSkgew0KICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgew0KICAgICAgICAgICAgbSgkdGhlZmlsZSAuICcgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Jyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBtKCdEaXJlY3RvcnkgZGVsZXRlICcgLiAoZGVsdHJlZSgkdGhlZmlsZSkgPyBiYXNlbmFtZSgkdGhlZmlsZSkgLiAnIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBDcmVhdGUgbmV3IGRpcg0KICAgIGVsc2VpZiAoJG5ld2Rpcm5hbWUpIHsNCiAgICAgICAgJG1rZGlycyA9ICRub3dwYXRoIC4gJG5ld2Rpcm5hbWU7DQogICAgICAgIGlmIChmaWxlX2V4aXN0cygkbWtkaXJzKSkgew0KICAgICAgICAgICAgbSgnRGlyZWN0b3J5IGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG0oJ0RpcmVjdG9yeSBjcmVhdGVkICcgLiAoQG1rZGlyKCRta2RpcnMsIDA3NzcpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICAgICAgICAgIEBjaG1vZCgkbWtkaXJzLCAwNzc3KTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBVcGxvYWQgZmlsZQ0KICAgIGVsc2VpZiAoJGRvdXBmaWxlKSB7DQogICAgICAgIG0oJ0ZpbGUgdXBsb2FkICcgLiAoQGNvcHkoJF9GSUxFU1sndXBsb2FkZmlsZSddWyd0bXBfbmFtZSddLCAkdXBsb2FkZGlyIC4gJy8nIC4gJF9GSUxFU1sndXBsb2FkZmlsZSddWyduYW1lJ10pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICB9DQogICAgLy8gRWRpdCBmaWxlDQogICAgZWxzZWlmICgkZWRpdGZpbGVuYW1lICYmICRmaWxlY29udGVudCkgew0KICAgICAgICAkZnAgPSBAZm9wZW4oJGVkaXRmaWxlbmFtZSwgJ3cnKTsNCiAgICAgICAgbSgnU2F2ZSBmaWxlICcgLiAoQGZ3cml0ZSgkZnAsICRmaWxlY29udGVudCkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KICAgICAgICBAZmNsb3NlKCRmcCk7DQogICAgfQ0KICAgIC8vIE1vZGlmeQ0KICAgIGVsc2VpZiAoJHBmaWxlICYmICRuZXdwZXJtKSB7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJHBmaWxlKSkgew0KICAgICAgICAgICAgbSgnVGhlIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRuZXdwZXJtID0gYmFzZV9jb252ZXJ0KCRuZXdwZXJtLCA4LCAxMCk7DQogICAgICAgICAgICBtKCdNb2RpZnkgZmlsZSBhdHRyaWJ1dGVzICcgLiAoQGNobW9kKCRwZmlsZSwgJG5ld3Blcm0pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBSZW5hbWUNCiAgICBlbHNlaWYgKCRvbGRuYW1lICYmICRuZXdmaWxlbmFtZSkgew0KICAgICAgICAkbm5hbWUgPSAkbm93cGF0aCAuICRuZXdmaWxlbmFtZTsNCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRubmFtZSkgfHwgIWZpbGVfZXhpc3RzKCRvbGRuYW1lKSkgew0KICAgICAgICAgICAgbSgkbm5hbWUgLiAnIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbShiYXNlbmFtZSgkb2xkbmFtZSkgLiAnIHJlbmFtZWQgJyAuIGJhc2VuYW1lKCRubmFtZSkgLiAoQHJlbmFtZSgkb2xkbmFtZSwgJG5uYW1lKSA/ICcgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIENvcHUNCiAgICBlbHNlaWYgKCRzbmFtZSAmJiAkdG9maWxlKSB7DQogICAgICAgIGlmIChmaWxlX2V4aXN0cygkdG9maWxlKSB8fCAhZmlsZV9leGlzdHMoJHNuYW1lKSkgew0KICAgICAgICAgICAgbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG0oYmFzZW5hbWUoJHRvZmlsZSkgLiAnIGNvcGllZCAnIC4gKEBjb3B5KCRzbmFtZSwgJHRvZmlsZSkgPyBiYXNlbmFtZSgkdG9maWxlKSAuICcgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIEZpbGUgZXhpdA0KICAgIGVsc2VpZiAoJGN1cmZpbGUgJiYgJHRhcmZpbGUpIHsNCiAgICAgICAgaWYgKCFAZmlsZV9leGlzdHMoJGN1cmZpbGUpIHx8ICFAZmlsZV9leGlzdHMoJHRhcmZpbGUpKSB7DQogICAgICAgICAgICBtKCdUaGUgZ29hbCBmaWxlIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHRpbWUgPSBAZmlsZW10aW1lKCR0YXJmaWxlKTsNCiAgICAgICAgICAgIG0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcgLiAoQHRvdWNoKCRjdXJmaWxlLCAkdGltZSwgJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBEYXRlDQogICAgZWxzZWlmICgkY3VyZmlsZSAmJiAkeWVhciAmJiAkbW9udGggJiYgJGRheSAmJiAkaG91ciAmJiAkbWludXRlICYmICRzZWNvbmQpIHsNCiAgICAgICAgaWYgKCFAZmlsZV9leGlzdHMoJGN1cmZpbGUpKSB7DQogICAgICAgICAgICBtKGJhc2VuYW1lKCRjdXJmaWxlKSAuICcgZG9lcyBub3QgZXhpc3QnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCiAgICAgICAgICAgIG0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcgLiAoQHRvdWNoKCRjdXJmaWxlLCAkdGltZSwgJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBEb3dubG9hZA0KICAgIGVsc2VpZiAoJGRvaW5nID09ICdkb3ducmFyJykgew0KICAgICAgICBpZiAoJGRsKSB7DQogICAgICAgICAgICAkZGZpbGVzID0gJyc7DQogICAgICAgICAgICBmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgew0KICAgICAgICAgICAgICAgICRkZmlsZXMuPSAkZmlsZXBhdGggLiAnLCc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkZGZpbGVzID0gc3Vic3RyKCRkZmlsZXMsIDAsIHN0cmxlbigkZGZpbGVzKSAtIDEpOw0KICAgICAgICAgICAgJGRsID0gZXhwbG9kZSgnLCcsICRkZmlsZXMpOw0KICAgICAgICAgICAgJHppcCA9IG5ldyBQSFBaaXAoJGRsKTsNCiAgICAgICAgICAgICRjb2RlID0gJHppcC0+b3V0Ow0KICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOw0KICAgICAgICAgICAgaGVhZGVyKCdBY2NlcHQtUmFuZ2VzOiBieXRlcycpOw0KICAgICAgICAgICAgaGVhZGVyKCdBY2NlcHQtTGVuZ3RoOiAnIC4gc3RybGVuKCRjb2RlKSk7DQogICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7ZmlsZW5hbWU9JyAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICdfRmlsZXMudGFyLmd6Jyk7DQogICAgICAgICAgICBlY2hvICRjb2RlOw0KICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIERlbGV0ZSBmaWxlDQogICAgZWxzZWlmICgkZG9pbmcgPT0gJ2RlbGZpbGVzJykgew0KICAgICAgICBpZiAoJGRsKSB7DQogICAgICAgICAgICAkZGZpbGVzID0gJyc7DQogICAgICAgICAgICAkc3VjYyA9ICRmYWlsID0gMDsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRkbCBhcyAkZmlsZXBhdGggPT4gJHZhbHVlKSB7DQogICAgICAgICAgICAgICAgaWYgKEB1bmxpbmsoJGZpbGVwYXRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkc3VjYysrOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRmYWlsKys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbSgnRGVsZXRlZCBmaWxlIGhhdmUgZmluaXNoZWQ/P2Nob29zZSAnIC4gY291bnQoJGRsKSAuICcgc3VjY2VzcyAnIC4gJHN1Y2MgLiAnIGZhaWwgJyAuICRmYWlsKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIEZ1bmN0aW9uIE5ld2Rpcg0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAnY3JlYXRlZGlyJykpOw0KICAgIG1ha2VoaWRlKCduZXdkaXJuYW1lJyk7DQogICAgbWFrZWhpZGUoJ2RpcicsICRub3dwYXRoKTsNCiAgICBmb3JtZm9vdCgpOw0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAnZmlsZXBlcm0nKSk7DQogICAgbWFrZWhpZGUoJ25ld3Blcm0nKTsNCiAgICBtYWtlaGlkZSgncGZpbGUnKTsNCiAgICBtYWtlaGlkZSgnZGlyJywgJG5vd3BhdGgpOw0KICAgIGZvcm1mb290KCk7DQogICAgZm9ybWhlYWQoYXJyYXkoJ25hbWUnID0+ICdjb3B5ZmlsZScpKTsNCiAgICBtYWtlaGlkZSgnc25hbWUnKTsNCiAgICBtYWtlaGlkZSgndG9maWxlJyk7DQogICAgbWFrZWhpZGUoJ2RpcicsICRub3dwYXRoKTsNCiAgICBmb3JtZm9vdCgpOw0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAncmVuYW1lJykpOw0KICAgIG1ha2VoaWRlKCdvbGRuYW1lJyk7DQogICAgbWFrZWhpZGUoJ25ld2ZpbGVuYW1lJyk7DQogICAgbWFrZWhpZGUoJ2RpcicsICRub3dwYXRoKTsNCiAgICBmb3JtZm9vdCgpOw0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAnZmlsZW9wZm9ybScpKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJyk7DQogICAgbWFrZWhpZGUoJ29wZmlsZScpOw0KICAgIG1ha2VoaWRlKCdkaXInKTsNCiAgICBmb3JtZm9vdCgpOw0KICAgICRmcmVlID0gQGRpc2tfZnJlZV9zcGFjZSgkbm93cGF0aCk7DQogICAgISRmcmVlICYmICRmcmVlID0gMDsNCiAgICAkYWxsID0gQGRpc2tfdG90YWxfc3BhY2UoJG5vd3BhdGgpOw0KICAgICEkYWxsICYmICRhbGwgPSAwOw0KICAgICR1c2VkID0gJGFsbCAtICRmcmVlOw0KICAgICR1c2VkX3BlcmNlbnQgPSBAcm91bmQoMTAwIC8gKCRhbGwgLyAkZnJlZSksIDIpOw0KICAgIHAoJzxmb250IGNvbG9yPXllbGxvdyBmYWNlPXRhaG9tYSBzaXplPTI+PEI+RmlsZSBNYW5hZ2VyPC9iPiA8L2ZvbnQ+IEN1cnJlbnQgZGlzayBmcmVlIDxmb250IGNvbG9yPXJlZD4nIC4gc2l6ZWNvdW50KCRmcmVlKSAuICc8L2ZvbnQ+IG9mIDxmb250IGNvbG9yPXJlZD4nIC4gc2l6ZWNvdW50KCRhbGwpIC4gJzwvZm9udD4gKDxmb250IGNvbG9yPXJlZD4nIC4gJHVzZWRfcGVyY2VudCAuICc8L2ZvbnQ+JSk8L2ZvbnQ+Jyk7DQo/Pg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9Im1hcmdpbjoxMHB4IDA7Ij4NCiAgPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgaWQ9ImdvZGlyIiBuYW1lPSJnb2RpciI+DQogIDx0cj4NCiAgICA8dGQgbm93cmFwPkN1cnJlbnQgRGlyZWN0b3J5ICg8P3BocCBlY2hvICRkaXJfd3JpdGVhYmxlOyA/PiwgPD9waHAgZWNobyBnZXRDaG1vZCgkbm93cGF0aCk7ID8+KTwvdGQ+DQoJPHRkIHdpZHRoPSIxMDAlIj48aW5wdXQgbmFtZT0idmlld193cml0YWJsZSIgdmFsdWU9IjAiIHR5cGU9ImhpZGRlbiIgLz48aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJkaXIiIHZhbHVlPSI8P3BocCBlY2hvICRub3dwYXRoOyA/PiIgdHlwZT0idGV4dCIgc3R5bGU9IndpZHRoOjEwMCU7bWFyZ2luOjAgOHB4OyI+PC90ZD4NCiAgICA8dGQgbm93cmFwPjxpbnB1dCBjbGFzcz0iYnQiIHZhbHVlPSJHTyIgdHlwZT0ic3VibWl0Ij48L3RkPg0KICA8L3RyPg0KICA8L2Zvcm0+DQo8L3RhYmxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gY3JlYXRlZGlyKCl7DQoJdmFyIG5ld2Rpcm5hbWU7DQoJbmV3ZGlybmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBkaXJlY3RvcnkgbmFtZTonLCAnJyk7DQoJaWYgKCFuZXdkaXJuYW1lKSByZXR1cm47DQoJJCgnY3JlYXRlZGlyJykubmV3ZGlybmFtZS52YWx1ZT1uZXdkaXJuYW1lOw0KCSQoJ2NyZWF0ZWRpcicpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gZmlsZXBlcm0ocGZpbGUpew0KCXZhciBuZXdwZXJtOw0KCW5ld3Blcm0gPSBwcm9tcHQoJ0N1cnJlbnQgZmlsZTonK3BmaWxlKydcblBsZWFzZSBpbnB1dCBuZXcgYXR0cmlidXRlOicsICcnKTsNCglpZiAoIW5ld3Blcm0pIHJldHVybjsNCgkkKCdmaWxlcGVybScpLm5ld3Blcm0udmFsdWU9bmV3cGVybTsNCgkkKCdmaWxlcGVybScpLnBmaWxlLnZhbHVlPXBmaWxlOw0KCSQoJ2ZpbGVwZXJtJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBjb3B5ZmlsZShzbmFtZSl7DQoJdmFyIHRvZmlsZTsNCgl0b2ZpbGUgPSBwcm9tcHQoJ09yaWdpbmFsIGZpbGU6JytzbmFtZSsnXG5QbGVhc2UgaW5wdXQgb2JqZWN0IGZpbGUgKGZ1bGxwYXRoKTonLCAnJyk7DQoJaWYgKCF0b2ZpbGUpIHJldHVybjsNCgkkKCdjb3B5ZmlsZScpLnRvZmlsZS52YWx1ZT10b2ZpbGU7DQoJJCgnY29weWZpbGUnKS5zbmFtZS52YWx1ZT1zbmFtZTsNCgkkKCdjb3B5ZmlsZScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gcmVuYW1lKG9sZG5hbWUpew0KCXZhciBuZXdmaWxlbmFtZTsNCgluZXdmaWxlbmFtZSA9IHByb21wdCgnRm9ybWVyIGZpbGUgbmFtZTonK29sZG5hbWUrJ1xuUGxlYXNlIGlucHV0IG5ldyBmaWxlbmFtZTonLCAnJyk7DQoJaWYgKCFuZXdmaWxlbmFtZSkgcmV0dXJuOw0KCSQoJ3JlbmFtZScpLm5ld2ZpbGVuYW1lLnZhbHVlPW5ld2ZpbGVuYW1lOw0KCSQoJ3JlbmFtZScpLm9sZG5hbWUudmFsdWU9b2xkbmFtZTsNCgkkKCdyZW5hbWUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGRvZmlsZShkb2luZyx0aGVmaWxlLG0pew0KCWlmIChtICYmICFjb25maXJtKG0pKSB7DQoJCXJldHVybjsNCgl9DQoJJCgnZmlsZWxpc3QnKS5kb2luZy52YWx1ZT1kb2luZzsNCglpZiAodGhlZmlsZSl7DQoJCSQoJ2ZpbGVsaXN0JykudGhlZmlsZS52YWx1ZT10aGVmaWxlOw0KCX0NCgkkKCdmaWxlbGlzdCcpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gY3JlYXRlZmlsZShub3dwYXRoKXsNCgl2YXIgZmlsZW5hbWU7DQoJZmlsZW5hbWUgPSBwcm9tcHQoJ1BsZWFzZSBpbnB1dCB0aGUgZmlsZSBuYW1lOicsICcnKTsNCglpZiAoIWZpbGVuYW1lKSByZXR1cm47DQoJb3BmaWxlKCdlZGl0ZmlsZScsbm93cGF0aCArIGZpbGVuYW1lLG5vd3BhdGgpOw0KfQ0KZnVuY3Rpb24gb3BmaWxlKGFjdGlvbixvcGZpbGUsZGlyKXsNCgkkKCdmaWxlb3Bmb3JtJykuYWN0aW9uLnZhbHVlPWFjdGlvbjsNCgkkKCdmaWxlb3Bmb3JtJykub3BmaWxlLnZhbHVlPW9wZmlsZTsNCgkkKCdmaWxlb3Bmb3JtJykuZGlyLnZhbHVlPWRpcjsNCgkkKCdmaWxlb3Bmb3JtJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBnb2RpcihkaXIsdmlld193cml0YWJsZSl7DQoJaWYgKHZpZXdfd3JpdGFibGUpIHsNCgkJJCgnZ29kaXInKS52aWV3X3dyaXRhYmxlLnZhbHVlPTE7DQoJfQ0KCSQoJ2dvZGlyJykuZGlyLnZhbHVlPWRpcjsNCgkkKCdnb2RpcicpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQogIDw/cGhwDQogICAgdGJoZWFkKCk7DQogICAgcCgnPGZvcm0gYWN0aW9uPSInIC4gJHNlbGYgLiAnIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjx0ciBjbGFzcz0iYWx0MSI+PHRkIGNvbHNwYW49IjciIHN0eWxlPSJwYWRkaW5nOjVweDsiPicpOw0KICAgIHAoJzxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdmFsdWU9IiIgdHlwZT0iZmlsZSIgLz4gPGlucHV0IGNsYXNzPSIiIG5hbWU9ImRvdXBmaWxlIiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiIC8+PGlucHV0IG5hbWU9InVwbG9hZGRpciIgdmFsdWU9IicgLiAkZGlyIC4gJyIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBuYW1lPSJkaXIiIHZhbHVlPSInIC4gJGRpciAuICciIHR5cGU9ImhpZGRlbiIgLz48L2Rpdj4nKTsNCiAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJyAuICRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0gLiAnXCcpOyI+V2ViUm9vdDwvYT4nKTsNCiAgICBpZiAoJHZpZXdfd3JpdGFibGUpIHsNCiAgICAgICAgcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycgLiAkbm93cGF0aCAuICdcJyk7Ij5WaWV3IEFsbDwvYT4nKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJyAuICRub3dwYXRoIC4gJ1wnLFwnMVwnKTsiPlZpZXcgV3JpdGFibGU8L2E+Jyk7DQogICAgfQ0KICAgIHAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZGlyKCk7Ij5DcmVhdGUgRGlyZWN0b3J5PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZmlsZShcJycgLiAkbm93cGF0aCAuICdcJyk7Ij5DcmVhdGUgRmlsZTwvYT4nKTsNCiAgICBpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KICAgICAgICAkb2JqID0gbmV3IENPTSgnc2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QnKTsNCiAgICAgICAgaWYgKCRvYmogJiYgaXNfb2JqZWN0KCRvYmopKSB7DQogICAgICAgICAgICAkRHJpdmVUeXBlREIgPSBhcnJheSgwID0+ICdVbmtub3cnLCAxID0+ICdSZW1vdmFibGUnLCAyID0+ICdGaXhlZCcsIDMgPT4gJ05ldHdvcmsnLCA0ID0+ICdDRFJvbScsIDUgPT4gJ1JBTSBEaXNrJyk7DQogICAgICAgICAgICBmb3JlYWNoICgkb2JqLT5Ecml2ZXMgYXMgJGRyaXZlKSB7DQogICAgICAgICAgICAgICAgaWYgKCRkcml2ZS0+RHJpdmVUeXBlID09IDIpIHsNCiAgICAgICAgICAgICAgICAgICAgcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycgLiAkZHJpdmUtPlBhdGggLiAnL1wnKTsiIHRpdGxlPSJTaXplOicgLiBzaXplY291bnQoJGRyaXZlLT5Ub3RhbFNpemUpIC4gJyYjMTM7RnJlZTonIC4gc2l6ZWNvdW50KCRkcml2ZS0+RnJlZVNwYWNlKSAuICcmIzEzO1R5cGU6JyAuICREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0gLiAnIj4nIC4gJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXSAuICcoJyAuICRkcml2ZS0+UGF0aCAuICcpPC9hPicpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnIC4gJGRyaXZlLT5QYXRoIC4gJy9cJyk7IiB0aXRsZT0iVHlwZTonIC4gJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXSAuICciPicgLiAkRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdIC4gJygnIC4gJGRyaXZlLT5QYXRoIC4gJyk8L2E+Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIHAoJzwvdGQ+PC90cj48L2Zvcm0+Jyk7DQogICAgcCgnPHRyIGNsYXNzPSJoZWFkIj48dGQ+Jm5ic3A7PC90ZD48dGQ+RmlsZW5hbWU8L3RkPjx0ZCB3aWR0aD0iMTYlIj5MYXN0IG1vZGlmaWVkPC90ZD48dGQgd2lkdGg9IjEwJSI+U2l6ZTwvdGQ+PHRkIHdpZHRoPSIyMCUiPkNobW9kIC8gUGVybXM8L3RkPjx0ZCB3aWR0aD0iMjIlIj5BY3Rpb248L3RkPjwvdHI+Jyk7DQogICAgLy8gR2V0IHBhdGgNCiAgICAkZGlyZGF0YSA9IGFycmF5KCk7DQogICAgJGZpbGVkYXRhID0gYXJyYXkoKTsNCiAgICBpZiAoJHZpZXdfd3JpdGFibGUpIHsNCiAgICAgICAgJGRpcmRhdGEgPSBHZXRMaXN0KCRub3dwYXRoKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAvLyBPcGVuIGRpcg0KICAgICAgICAkZGlycyA9IEBvcGVuZGlyKCRkaXIpOw0KICAgICAgICB3aGlsZSAoJGZpbGUgPSBAcmVhZGRpcigkZGlycykpIHsNCiAgICAgICAgICAgICRmaWxlcGF0aCA9ICRub3dwYXRoIC4gJGZpbGU7DQogICAgICAgICAgICBpZiAoQGlzX2RpcigkZmlsZXBhdGgpKSB7DQogICAgICAgICAgICAgICAgJGRpcmRiWydmaWxlbmFtZSddID0gJGZpbGU7DQogICAgICAgICAgICAgICAgJGRpcmRiWydtdGltZSddID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgZmlsZW10aW1lKCRmaWxlcGF0aCkpOw0KICAgICAgICAgICAgICAgICRkaXJkYlsnZGlyY2htb2QnXSA9IGdldENobW9kKCRmaWxlcGF0aCk7DQogICAgICAgICAgICAgICAgJGRpcmRiWydkaXJwZXJtJ10gPSBnZXRQZXJtcygkZmlsZXBhdGgpOw0KICAgICAgICAgICAgICAgICRkaXJkYlsnZmlsZW93bmVyJ10gPSBnZXRVc2VyKCRmaWxlcGF0aCk7DQogICAgICAgICAgICAgICAgJGRpcmRiWydkaXJsaW5rJ10gPSAkbm93cGF0aDsNCiAgICAgICAgICAgICAgICAkZGlyZGJbJ3NlcnZlcl9saW5rJ10gPSAkZmlsZXBhdGg7DQogICAgICAgICAgICAgICAgJGRpcmRiWydjbGllbnRfbGluayddID0gdWUoJGZpbGVwYXRoKTsNCiAgICAgICAgICAgICAgICAkZGlyZGF0YVtdID0gJGRpcmRiOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydmaWxlbmFtZSddID0gJGZpbGU7DQogICAgICAgICAgICAgICAgJGZpbGVkYlsnc2l6ZSddID0gc2l6ZWNvdW50KEBmaWxlc2l6ZSgkZmlsZXBhdGgpKTsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydtdGltZSddID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgZmlsZW10aW1lKCRmaWxlcGF0aCkpOw0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ2ZpbGVjaG1vZCddID0gZ2V0Q2htb2QoJGZpbGVwYXRoKTsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydmaWxlcGVybSddID0gZ2V0UGVybXMoJGZpbGVwYXRoKTsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydmaWxlb3duZXInXSA9IGdldFVzZXIoJGZpbGVwYXRoKTsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydkaXJsaW5rJ10gPSAkbm93cGF0aDsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydzZXJ2ZXJfbGluayddID0gJGZpbGVwYXRoOw0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ2NsaWVudF9saW5rJ10gPSB1ZSgkZmlsZXBhdGgpOw0KICAgICAgICAgICAgICAgICRmaWxlZGF0YVtdID0gJGZpbGVkYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSAvLyB3aGlsZQ0KICAgICAgICB1bnNldCgkZGlyZGIpOw0KICAgICAgICB1bnNldCgkZmlsZWRiKTsNCiAgICAgICAgQGNsb3NlZGlyKCRkaXJzKTsNCiAgICB9DQogICAgQHNvcnQoJGRpcmRhdGEpOw0KICAgIEBzb3J0KCRmaWxlZGF0YSk7DQogICAgJGRpcl9pID0gJzAnOw0KICAgIGZvcmVhY2ggKCRkaXJkYXRhIGFzICRrZXkgPT4gJGRpcmRiKSB7DQogICAgICAgIGlmICgkZGlyZGJbJ2ZpbGVuYW1lJ10gIT0gJy4uJyAmJiAkZGlyZGJbJ2ZpbGVuYW1lJ10gIT0gJy4nKSB7DQogICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsNCiAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQogICAgICAgICAgICBwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGZvbnQgZmFjZT0id2luZ2RpbmdzIiBzaXplPSIzIj4wPC9mb250PjwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycgLiAkZGlyZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcpOyI+JyAuICRkaXJkYlsnZmlsZW5hbWUnXSAuICc8L2E+PC90ZD4nKTsNCiAgICAgICAgICAgIHAoJzx0ZCBub3dyYXA+JyAuICRkaXJkYlsnbXRpbWUnXSAuICc8L3RkPicpOw0KICAgICAgICAgICAgcCgnPHRkIG5vd3JhcD4tLTwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicpOw0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycgLiAkZGlyZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcpOyI+JyAuICRkaXJkYlsnZGlyY2htb2QnXSAuICc8L2E+IC8gJyk7DQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJyAuICRkaXJkYlsnc2VydmVyX2xpbmsnXSAuICdcJyk7Ij4nIC4gJGRpcmRiWydkaXJwZXJtJ10gLiAnPC9hPicgLiAkZGlyZGJbJ2ZpbGVvd25lciddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZGVsZGlyXCcsXCcnIC4gJGRpcmRiWydzZXJ2ZXJfbGluayddIC4gJ1wnLFwnQXJlIHlvdSBzdXJlIHdpbGwgZGVsZXRlICcgLiAkZGlyZGJbJ2ZpbGVuYW1lJ10gLiAnPyBcXG5cXG5JZiBub24tZW1wdHkgZGlyZWN0b3J5LCB3aWxsIGJlIGRlbGV0ZSBhbGwgdGhlIGZpbGVzLlwnKSI+RGVsPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVuYW1lKFwnJyAuICRkaXJkYlsnc2VydmVyX2xpbmsnXSAuICdcJyk7Ij5SZW5hbWU8L2E+PC90ZD4nKTsNCiAgICAgICAgICAgIHAoJzwvdHI+Jyk7DQogICAgICAgICAgICAkZGlyX2krKzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICgkZGlyZGJbJ2ZpbGVuYW1lJ10gPT0gJy4uJykgew0KICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz1mb3V0PicpOw0KICAgICAgICAgICAgICAgIHAoJzx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJXaW5nZGluZ3MgMyIgc2l6ZT00Pj08L2ZvbnQ+PC90ZD48dGQgbm93cmFwIGNvbHNwYW49IjUiPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnIC4gZ2V0VXBQYXRoKCRub3dwYXRoKSAuICdcJyk7Ij5QYXJlbnQgRGlyZWN0b3J5PC9hPjwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgcCgnPC90cj4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBwKCc8dHIgYmdjb2xvcj0iZ3JlZW4iIHN0bHllPSJib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7Ij48dGQgY29sc3Bhbj0iNiIgaGVpZ2h0PSI1Ij48L3RkPjwvdHI+Jyk7DQogICAgcCgnPGZvcm0gaWQ9ImZpbGVsaXN0IiBuYW1lPSJmaWxlbGlzdCIgYWN0aW9uPSInIC4gJHNlbGYgLiAnIiBtZXRob2Q9InBvc3QiPicpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnZmlsZScpOw0KICAgIG1ha2VoaWRlKCd0aGVmaWxlJyk7DQogICAgbWFrZWhpZGUoJ2RvaW5nJyk7DQogICAgbWFrZWhpZGUoJ2RpcicsICRub3dwYXRoKTsNCiAgICAkZmlsZV9pID0gJzAnOw0KICAgIGZvcmVhY2ggKCRmaWxlZGF0YSBhcyAka2V5ID0+ICRmaWxlZGIpIHsNCiAgICAgICAgaWYgKCRmaWxlZGJbJ2ZpbGVuYW1lJ10gIT0gJy4uJyAmJiAkZmlsZWRiWydmaWxlbmFtZSddICE9ICcuJykgew0KICAgICAgICAgICAgJGZpbGV1cmwgPSBzdHJfcmVwbGFjZShTQV9ST09ULCAnJywgJGZpbGVkYlsnc2VydmVyX2xpbmsnXSk7DQogICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsNCiAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQogICAgICAgICAgICBwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0iZGxbJyAuICRmaWxlZGJbJ3NlcnZlcl9saW5rJ10gLiAnXSI+PC90ZD4nKTsNCiAgICAgICAgICAgIHAoJzx0ZD48YSBocmVmPSInIC4gJGZpbGV1cmwgLiAnIiB0YXJnZXQ9Il9ibGFuayI+JyAuICRmaWxlZGJbJ2ZpbGVuYW1lJ10gLiAnPC9hPjwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicgLiAkZmlsZWRiWydtdGltZSddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicgLiAkZmlsZWRiWydzaXplJ10gLiAnPC90ZD4nKTsNCiAgICAgICAgICAgIHAoJzx0ZCBub3dyYXA+Jyk7DQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJyAuICRmaWxlZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcpOyI+JyAuICRmaWxlZGJbJ2ZpbGVjaG1vZCddIC4gJzwvYT4gLyAnKTsNCiAgICAgICAgICAgIHAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnIC4gJGZpbGVkYlsnc2VydmVyX2xpbmsnXSAuICdcJyk7Ij4nIC4gJGZpbGVkYlsnZmlsZXBlcm0nXSAuICc8L2E+JyAuICRmaWxlZGJbJ2ZpbGVvd25lciddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicpOw0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3duZmlsZVwnLFwnJyAuICRmaWxlZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcpOyI+RG93bjwvYT4gfCAnKTsNCiAgICAgICAgICAgIHAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6Y29weWZpbGUoXCcnIC4gJGZpbGVkYlsnc2VydmVyX2xpbmsnXSAuICdcJyk7Ij5Db3B5PC9hPiB8ICcpOw0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpvcGZpbGUoXCdlZGl0ZmlsZVwnLFwnJyAuICRmaWxlZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcsXCcnIC4gJGZpbGVkYlsnZGlybGluayddIC4gJ1wnKTsiPkVkaXQ8L2E+IHwgJyk7DQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycgLiAkZmlsZWRiWydzZXJ2ZXJfbGluayddIC4gJ1wnKTsiPlJlbmFtZTwvYT4gfCAnKTsNCiAgICAgICAgICAgIHAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6b3BmaWxlKFwnbmV3dGltZVwnLFwnJyAuICRmaWxlZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcsXCcnIC4gJGZpbGVkYlsnZGlybGluayddIC4gJ1wnKTsiPlRpbWU8L2E+Jyk7DQogICAgICAgICAgICBwKCc8L3RkPjwvdHI+Jyk7DQogICAgICAgICAgICAkZmlsZV9pKys7DQogICAgICAgIH0NCiAgICB9DQogICAgcCgnPHRyIGNsYXNzPSJmb3V0MSI+PHRkIGFsaWduPSJjZW50ZXIiPjxpbnB1dCBuYW1lPSJjaGthbGwiIHZhbHVlPSJvbiIgdHlwZT0iY2hlY2tib3giIG9uY2xpY2s9IkNoZWNrQWxsKHRoaXMuZm9ybSkiIC8+PC90ZD48dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3ducmFyXCcpOyI+UGFja2luZyBkb3dubG9hZCBzZWxlY3RlZDwvYT4gLSA8YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2RlbGZpbGVzXCcpOyI+RGVsZXRlIHNlbGVjdGVkPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjQiIGFsaWduPSJyaWdodCI+JyAuICRkaXJfaSAuICcgZGlyZWN0b3JpZXMgLyAnIC4gJGZpbGVfaSAuICcgZmlsZXM8L3RkPjwvdHI+Jyk7DQogICAgcCgnPC9mb3JtPjwvdGFibGU+Jyk7DQp9IC8vIGVuZCBkaXINCmVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsZmlsZScpIHsNCiAgICBpZiAoJGRvaW5nID09ICJteXNxbHVwbG9hZCIpIHsNCiAgICAgICAgJGZpbGUgPSAkX0ZJTEVTWyd1cGxvYWRmaWxlJ107DQogICAgICAgICRmaWxlbmFtZSA9ICRmaWxlWyd0bXBfbmFtZSddOw0KICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHNhdmVwYXRoKSkgew0KICAgICAgICAgICAgbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoISRmaWxlbmFtZSkgew0KICAgICAgICAgICAgICAgIG0oJ1BsZWFzZSBjaG9vc2UgYSBmaWxlJyk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRmcCA9IEBmb3BlbigkZmlsZW5hbWUsICdyJyk7DQogICAgICAgICAgICAgICAgJGNvbnRlbnRzID0gQGZyZWFkKCRmcCwgZmlsZXNpemUoJGZpbGVuYW1lKSk7DQogICAgICAgICAgICAgICAgQGZjbG9zZSgkZnApOw0KICAgICAgICAgICAgICAgICRjb250ZW50cyA9IGJpbjJoZXgoJGNvbnRlbnRzKTsNCiAgICAgICAgICAgICAgICBpZiAoISR1cG5hbWUpICR1cG5hbWUgPSAkZmlsZVsnbmFtZSddOw0KICAgICAgICAgICAgICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQogICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoIlNFTEVDVCAweHskY29udGVudHN9IEZST00gbXlzcWwudXNlciBJTlRPIERVTVBGSUxFICckc2F2ZXBhdGgnOyIpOw0KICAgICAgICAgICAgICAgIG0oJHJlc3VsdCA/ICdVcGxvYWQgc3VjY2VzcycgOiAnVXBsb2FkIGhhcyBmYWlsZWQ6ICcgLiBteXNxbF9lcnJvcigpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCj8+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQpmdW5jdGlvbiBteXNxbGZpbGUoZG9pbmcpew0KCWlmKCFkb2luZykgcmV0dXJuOw0KCSQoJ2RvaW5nJykudmFsdWU9ZG9pbmc7DQoJJCgnbXlzcWxmaWxlJykuZGJob3N0LnZhbHVlPSQoJ2RiaW5mbycpLmRiaG9zdC52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYnBvcnQudmFsdWU9JCgnZGJpbmZvJykuZGJwb3J0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRidXNlci52YWx1ZT0kKCdkYmluZm8nKS5kYnVzZXIudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuZGJwYXNzLnZhbHVlPSQoJ2RiaW5mbycpLmRicGFzcy52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYm5hbWUudmFsdWU9JCgnZGJpbmZvJykuZGJuYW1lLnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmNoYXJzZXQudmFsdWU9JCgnZGJpbmZvJykuY2hhcnNldC52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5zdWJtaXQoKTsNCn0NCjwvc2NyaXB0Pg0KPD9waHANCiAgICAhJGRiaG9zdCAmJiAkZGJob3N0ID0gJ2xvY2FsaG9zdCc7DQogICAgISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsNCiAgICAhJGRicG9ydCAmJiAkZGJwb3J0ID0gJzMzMDYnOw0KICAgICRjaGFyc2V0cyA9IGFycmF5KCcnID0+ICdEZWZhdWx0JywgJ2diaycgPT4gJ0dCSycsICdiaWc1JyA9PiAnQmlnNScsICd1dGY4JyA9PiAnVVRGLTgnLCAnbGF0aW4xJyA9PiAnTGF0aW4xJyk7DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnTVlTUUwgSW5mb3JtYXRpb24nLCAnbmFtZScgPT4gJ2RiaW5mbycpKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ3NxbGZpbGUnKTsNCiAgICBwKCc8cD4nKTsNCiAgICBwKCdEQkhvc3Q6Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnZGJob3N0JywgJ3NpemUnID0+IDIwLCAndmFsdWUnID0+ICRkYmhvc3QpKTsNCiAgICBwKCc6Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnZGJwb3J0JywgJ3NpemUnID0+IDQsICd2YWx1ZScgPT4gJGRicG9ydCkpOw0KICAgIHAoJ0RCVXNlcjonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYnVzZXInLCAnc2l6ZScgPT4gMTUsICd2YWx1ZScgPT4gJGRidXNlcikpOw0KICAgIHAoJ0RCUGFzczonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYnBhc3MnLCAnc2l6ZScgPT4gMTUsICd2YWx1ZScgPT4gJGRicGFzcykpOw0KICAgIHAoJ0RCTmFtZTonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYm5hbWUnLCAnc2l6ZScgPT4gMTUsICd2YWx1ZScgPT4gJGRibmFtZSkpOw0KICAgIHAoJ0RCQ2hhcnNldDonKTsNCiAgICBtYWtlc2VsZWN0KGFycmF5KCduYW1lJyA9PiAnY2hhcnNldCcsICdvcHRpb24nID0+ICRjaGFyc2V0cywgJ3NlbGVjdGVkJyA9PiAkY2hhcnNldCkpOw0KICAgIHAoJzwvcD4nKTsNCiAgICBmb3JtZm9vdCgpOw0KICAgIHAoJzxmb3JtIGFjdGlvbj0iJyAuICRzZWxmIC4gJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJteXNxbGZpbGUiIGlkPSJteXNxbGZpbGUiPicpOw0KICAgIHAoJzxoMj5VcGxvYWQgZmlsZTwvaDI+Jyk7DQogICAgcCgnPHA+PGI+VGhpcyBvcGVyYXRpb24gdGhlIERCIHVzZXIgbXVzdCBoYXMgRklMRSBwcml2aWxlZ2U8L2I+PC9wPicpOw0KICAgIHAoJzxwPlNhdmUgcGF0aChmdWxscGF0aCk6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InNhdmVwYXRoIiBzaXplPSI0NSIgdHlwZT0idGV4dCIgLz4gQ2hvb3NlIGEgZmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdHlwZT0iZmlsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbHVwbG9hZFwnKTsiPlVwbG9hZDwvYT48L3A+Jyk7DQogICAgcCgnPGgyPkRvd25sb2FkIGZpbGU8L2gyPicpOw0KICAgIHAoJzxwPkZpbGU6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9Im15c3FsZGxmaWxlIiBzaXplPSIxMTUiIHR5cGU9InRleHQiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bXlzcWxmaWxlKFwnbXlzcWxkb3duXCcpOyI+RG93bmxvYWQ8L2E+PC9wPicpOw0KICAgIG1ha2VoaWRlKCdkYmhvc3QnKTsNCiAgICBtYWtlaGlkZSgnZGJwb3J0Jyk7DQogICAgbWFrZWhpZGUoJ2RidXNlcicpOw0KICAgIG1ha2VoaWRlKCdkYnBhc3MnKTsNCiAgICBtYWtlaGlkZSgnZGJuYW1lJyk7DQogICAgbWFrZWhpZGUoJ2NoYXJzZXQnKTsNCiAgICBtYWtlaGlkZSgnZG9pbmcnKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ3NxbGZpbGUnKTsNCiAgICBwKCc8L2Zvcm0+Jyk7DQp9IGVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsYWRtaW4nKSB7DQogICAgISRkYmhvc3QgJiYgJGRiaG9zdCA9ICdsb2NhbGhvc3QnOw0KICAgICEkZGJ1c2VyICYmICRkYnVzZXIgPSAncm9vdCc7DQogICAgISRkYnBvcnQgJiYgJGRicG9ydCA9ICczMzA2JzsNCiAgICAkZGJmb3JtID0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJjb25uZWN0IiBuYW1lPSJjb25uZWN0IiB2YWx1ZT0iMSIgLz4nOw0KICAgIGlmIChpc3NldCgkZGJob3N0KSkgew0KICAgICAgICAkZGJmb3JtLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYmhvc3RcIiBuYW1lPVwiZGJob3N0XCIgdmFsdWU9XCIkZGJob3N0XCIgLz5cbiI7DQogICAgfQ0KICAgIGlmIChpc3NldCgkZGJ1c2VyKSkgew0KICAgICAgICAkZGJmb3JtLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnVzZXJcIiBuYW1lPVwiZGJ1c2VyXCIgdmFsdWU9XCIkZGJ1c2VyXCIgLz5cbiI7DQogICAgfQ0KICAgIGlmIChpc3NldCgkZGJwYXNzKSkgew0KICAgICAgICAkZGJmb3JtLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBhc3NcIiBuYW1lPVwiZGJwYXNzXCIgdmFsdWU9XCIkZGJwYXNzXCIgLz5cbiI7DQogICAgfQ0KICAgIGlmIChpc3NldCgkZGJwb3J0KSkgew0KICAgICAgICAkZGJmb3JtLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBvcnRcIiBuYW1lPVwiZGJwb3J0XCIgdmFsdWU9XCIkZGJwb3J0XCIgLz5cbiI7DQogICAgfQ0KICAgIGlmIChpc3NldCgkZGJuYW1lKSkgew0KICAgICAgICAkZGJmb3JtLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYm5hbWVcIiBuYW1lPVwiZGJuYW1lXCIgdmFsdWU9XCIkZGJuYW1lXCIgLz5cbiI7DQogICAgfQ0KICAgIGlmIChpc3NldCgkY2hhcnNldCkpIHsNCiAgICAgICAgJGRiZm9ybS49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiY2hhcnNldFwiIG5hbWU9XCJjaGFyc2V0XCIgdmFsdWU9XCIkY2hhcnNldFwiIC8+XG4iOw0KICAgIH0NCiAgICBpZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgJHNhdmVhc2ZpbGUpIHsNCiAgICAgICAgaWYgKCEkdGFibGUpIHsNCiAgICAgICAgICAgIG0oJ1BsZWFzZSBjaG9vc2UgdGhlIHRhYmxlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KICAgICAgICAgICAgJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOw0KICAgICAgICAgICAgJGZwID0gQGZvcGVuKCRwYXRoLCAndycpOw0KICAgICAgICAgICAgaWYgKCRmcCkgew0KICAgICAgICAgICAgICAgICRyZXN1bHQgPSBxKCdTSE9XIHRhYmxlcycpOw0KICAgICAgICAgICAgICAgIGlmICghJHJlc3VsdCkgcCgnPGgyPicgLiBteXNxbF9lcnJvcigpIC4gJzwvaDI+Jyk7DQogICAgICAgICAgICAgICAgJG15c3FsZGF0YSA9ICcnOw0KICAgICAgICAgICAgICAgIHdoaWxlICgkY3Vycm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR0YWJsZVskY3Vycm93WzBdXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNxbGR1bXB0YWJsZSgkY3Vycm93WzBdLCAkZnApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOw0KICAgICAgICAgICAgICAgICRmaWxldXJsID0gc3RyX3JlcGxhY2UoU0FfUk9PVCwgJycsICRwYXRoKTsNCiAgICAgICAgICAgICAgICBtKCdEYXRhYmFzZSBoYXMgc3VjY2VzcyBiYWNrdXAgdG8gPGEgaHJlZj0iJyAuICRmaWxldXJsIC4gJyIgdGFyZ2V0PSJfYmxhbmsiPicgLiAkcGF0aCAuICc8L2E+Jyk7DQogICAgICAgICAgICAgICAgbXlzcWxfY2xvc2UoKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgbSgnQmFja3VwIGZhaWxlZCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGlmICgkaW5zZXJ0ICYmICRpbnNlcnRzcWwpIHsNCiAgICAgICAgJGtleXN0ciA9ICR2YWxzdHIgPSAkdG1wID0gJyc7DQogICAgICAgIGZvcmVhY2ggKCRpbnNlcnRzcWwgYXMgJGtleSA9PiAkdmFsKSB7DQogICAgICAgICAgICBpZiAoJHZhbCkgew0KICAgICAgICAgICAgICAgICRrZXlzdHIuPSAkdG1wIC4gJGtleTsNCiAgICAgICAgICAgICAgICAkdmFsc3RyLj0gJHRtcCAuICInIiAuIGFkZHNsYXNoZXMoJHZhbCkgLiAiJyI7DQogICAgICAgICAgICAgICAgJHRtcCA9ICcsJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGtleXN0ciAmJiAkdmFsc3RyKSB7DQogICAgICAgICAgICBkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KICAgICAgICAgICAgbShxKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lICgka2V5c3RyKSBWQUxVRVMgKCR2YWxzdHIpIikgPyAnSW5zZXJ0IG5ldyByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoJHVwZGF0ZSAmJiAkaW5zZXJ0c3FsICYmICRiYXNlNjQpIHsNCiAgICAgICAgJHZhbHN0ciA9ICR0bXAgPSAnJzsNCiAgICAgICAgZm9yZWFjaCAoJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsNCiAgICAgICAgICAgICR2YWxzdHIuPSAkdG1wIC4gJGtleSAuICI9JyIgLiBhZGRzbGFzaGVzKCR2YWwpIC4gIiciOw0KICAgICAgICAgICAgJHRtcCA9ICcsJzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJHZhbHN0cikgew0KICAgICAgICAgICAgJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsNCiAgICAgICAgICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQogICAgICAgICAgICBtKHEoIlVQREFURSAkdGFibGVuYW1lIFNFVCAkdmFsc3RyIFdIRVJFICR3aGVyZSBMSU1JVCAxIikgPyAnUmVjb3JkIHVwZGF0aW5nJyA6IG15c3FsX2Vycm9yKCkpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmICgkZG9pbmcgPT0gJ2RlbCcgJiYgJGJhc2U2NCkgew0KICAgICAgICAkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOw0KICAgICAgICAkZGVsZXRlX3NxbCA9ICJERUxFVEUgRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSI7DQogICAgICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQogICAgICAgIG0ocSgiREVMRVRFIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUiKSA/ICdEZWxldGlvbiByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCiAgICB9DQogICAgaWYgKCR0YWJsZW5hbWUgJiYgJGRvaW5nID09ICdkcm9wJykgew0KICAgICAgICBkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KICAgICAgICBpZiAocSgiRFJPUCBUQUJMRSAkdGFibGVuYW1lIikpIHsNCiAgICAgICAgICAgIG0oJ0Ryb3AgdGFibGUgb2Ygc3VjY2VzcycpOw0KICAgICAgICAgICAgJHRhYmxlbmFtZSA9ICcnOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbShteXNxbF9lcnJvcigpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAkY2hhcnNldHMgPSBhcnJheSgnJyA9PiAnRGVmYXVsdCcsICdnYmsnID0+ICdHQksnLCAnYmlnNScgPT4gJ0JpZzUnLCAndXRmOCcgPT4gJ1VURi04JywgJ2xhdGluMScgPT4gJ0xhdGluMScpOw0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZScgPT4gJ01ZU1FMIE1hbmFnZXInKSk7DQogICAgbWFrZWhpZGUoJ2FjdGlvbicsICdzcWxhZG1pbicpOw0KICAgIHAoJzxwPicpOw0KICAgIHAoJ0RCSG9zdDonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYmhvc3QnLCAnc2l6ZScgPT4gMjAsICd2YWx1ZScgPT4gJGRiaG9zdCkpOw0KICAgIHAoJzonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYnBvcnQnLCAnc2l6ZScgPT4gNCwgJ3ZhbHVlJyA9PiAkZGJwb3J0KSk7DQogICAgcCgnREJVc2VyOicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ2RidXNlcicsICdzaXplJyA9PiAxNSwgJ3ZhbHVlJyA9PiAkZGJ1c2VyKSk7DQogICAgcCgnREJQYXNzOicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ2RicGFzcycsICdzaXplJyA9PiAxNSwgJ3ZhbHVlJyA9PiAkZGJwYXNzKSk7DQogICAgcCgnREJDaGFyc2V0OicpOw0KICAgIG1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnID0+ICdjaGFyc2V0JywgJ29wdGlvbicgPT4gJGNoYXJzZXRzLCAnc2VsZWN0ZWQnID0+ICRjaGFyc2V0KSk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnY29ubmVjdCcsICd2YWx1ZScgPT4gJ0Nvbm5lY3QnLCAndHlwZScgPT4gJ3N1Ym1pdCcsICdjbGFzcycgPT4gJ2J0JykpOw0KICAgIHAoJzwvcD4nKTsNCiAgICBmb3JtZm9vdCgpOw0KPz4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIGVkaXRyZWNvcmQoYWN0aW9uLCBiYXNlNjQsIHRhYmxlbmFtZSl7DQoJaWYgKGFjdGlvbiA9PSAnZGVsJykgew0KCQlpZiAoIWNvbmZpcm0oJ0lzIG9yIGlzblwndCBkZWxldGlvbiByZWNvcmQ/JykpIHJldHVybjsNCgl9DQoJJCgncmVjb3JkbGlzdCcpLmRvaW5nLnZhbHVlPWFjdGlvbjsNCgkkKCdyZWNvcmRsaXN0JykuYmFzZTY0LnZhbHVlPWJhc2U2NDsNCgkkKCdyZWNvcmRsaXN0JykudGFibGVuYW1lLnZhbHVlPXRhYmxlbmFtZTsNCgkkKCdyZWNvcmRsaXN0Jykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBtb2RkYm5hbWUoZGJuYW1lKSB7DQoJaWYoIWRibmFtZSkgcmV0dXJuOw0KCSQoJ3NldGRibmFtZScpLmRibmFtZS52YWx1ZT1kYm5hbWU7DQoJJCgnc2V0ZGJuYW1lJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBzZXR0YWJsZSh0YWJsZW5hbWUsZG9pbmcscGFnZSkgew0KCWlmKCF0YWJsZW5hbWUpIHJldHVybjsNCglpZiAoZG9pbmcpIHsNCgkJJCgnc2V0dGFibGUnKS5kb2luZy52YWx1ZT1kb2luZzsNCgl9DQoJaWYgKHBhZ2UpIHsNCgkJJCgnc2V0dGFibGUnKS5wYWdlLnZhbHVlPXBhZ2U7DQoJfQ0KCSQoJ3NldHRhYmxlJykudGFibGVuYW1lLnZhbHVlPXRhYmxlbmFtZTsNCgkkKCdzZXR0YWJsZScpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQo8P3BocA0KICAgIC8vIFNRTA0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAncmVjb3JkbGlzdCcpKTsNCiAgICBtYWtlaGlkZSgnZG9pbmcnKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ3NxbGFkbWluJyk7DQogICAgbWFrZWhpZGUoJ2Jhc2U2NCcpOw0KICAgIG1ha2VoaWRlKCd0YWJsZW5hbWUnKTsNCiAgICBwKCRkYmZvcm0pOw0KICAgIGZvcm1mb290KCk7DQogICAgLy8gRGF0YQ0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAnc2V0ZGJuYW1lJykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnc3FsYWRtaW4nKTsNCiAgICBwKCRkYmZvcm0pOw0KICAgIGlmICghJGRibmFtZSkgew0KICAgICAgICBtYWtlaGlkZSgnZGJuYW1lJyk7DQogICAgfQ0KICAgIGZvcm1mb290KCk7DQogICAgZm9ybWhlYWQoYXJyYXkoJ25hbWUnID0+ICdzZXR0YWJsZScpKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ3NxbGFkbWluJyk7DQogICAgcCgkZGJmb3JtKTsNCiAgICBtYWtlaGlkZSgndGFibGVuYW1lJyk7DQogICAgbWFrZWhpZGUoJ3BhZ2UnLCAkcGFnZSk7DQogICAgbWFrZWhpZGUoJ2RvaW5nJyk7DQogICAgZm9ybWZvb3QoKTsNCiAgICAkY2FjaGV0YWJsZXMgPSBhcnJheSgpOw0KICAgICRwYWdlbnVtID0gMzA7DQogICAgJHBhZ2UgPSBpbnR2YWwoJHBhZ2UpOw0KICAgIGlmICgkcGFnZSkgew0KICAgICAgICAkc3RhcnRfbGltaXQgPSAoJHBhZ2UgLSAxKSAqICRwYWdlbnVtOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRzdGFydF9saW1pdCA9IDA7DQogICAgICAgICRwYWdlID0gMTsNCiAgICB9DQogICAgaWYgKGlzc2V0KCRkYmhvc3QpICYmIGlzc2V0KCRkYnVzZXIpICYmIGlzc2V0KCRkYnBhc3MpICYmIGlzc2V0KCRjb25uZWN0KSkgew0KICAgICAgICBkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KICAgICAgICAvLyBnZXQgbXlzcWwgc2VydmVyDQogICAgICAgICRteXNxbHZlciA9IG15c3FsX2dldF9zZXJ2ZXJfaW5mbygpOw0KICAgICAgICBwKCc8cD5NeVNRTCAnIC4gJG15c3FsdmVyIC4gJyBydW5uaW5nIGluICcgLiAkZGJob3N0IC4gJyBhcyAnIC4gJGRidXNlciAuICdAJyAuICRkYmhvc3QgLiAnPC9wPicpOw0KICAgICAgICAkaGlnaHZlciA9ICRteXNxbHZlciA+ICc0LjEnID8gMSA6IDA7DQogICAgICAgIC8vIFNob3cgZGF0YWJhc2UNCiAgICAgICAgJHF1ZXJ5ID0gcSgiU0hPVyBEQVRBQkFTRVMiKTsNCiAgICAgICAgJGRicyA9IGFycmF5KCk7DQogICAgICAgICRkYnNbXSA9ICctLSBTZWxlY3QgYSBkYXRhYmFzZSAtLSc7DQogICAgICAgIHdoaWxlICgkZGIgPSBteXNxbF9mZXRjaF9hcnJheSgkcXVlcnkpKSB7DQogICAgICAgICAgICAkZGJzWyRkYlsnRGF0YWJhc2UnXV0gPSAkZGJbJ0RhdGFiYXNlJ107DQogICAgICAgIH0NCiAgICAgICAgbWFrZXNlbGVjdChhcnJheSgndGl0bGUnID0+ICdQbGVhc2Ugc2VsZWN0IGEgZGF0YWJhc2U6JywgJ25hbWUnID0+ICdkYltdJywgJ29wdGlvbicgPT4gJGRicywgJ3NlbGVjdGVkJyA9PiAkZGJuYW1lLCAnb25jaGFuZ2UnID0+ICdtb2RkYm5hbWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywgJ25ld2xpbmUnID0+IDEpKTsNCiAgICAgICAgJHRhYmxlZGIgPSBhcnJheSgpOw0KICAgICAgICBpZiAoJGRibmFtZSkgew0KICAgICAgICAgICAgcCgnPHA+Jyk7DQogICAgICAgICAgICBwKCdDdXJyZW50IGRhYmFiYXNlOiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vZGRibmFtZShcJycgLiAkZGJuYW1lIC4gJ1wnKTsiPicgLiAkZGJuYW1lIC4gJzwvYT4nKTsNCiAgICAgICAgICAgIGlmICgkdGFibGVuYW1lKSB7DQogICAgICAgICAgICAgICAgcCgnIHwgQ3VycmVudCBUYWJsZTogPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycgLiAkdGFibGVuYW1lIC4gJ1wnKTsiPicgLiAkdGFibGVuYW1lIC4gJzwvYT4gWyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJyAuICR0YWJsZW5hbWUgLiAnXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlbmFtZSAuICdcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycgLiAkdGFibGVuYW1lIC4gJ1wnLCBcJ2Ryb3BcJyk7Ij5Ecm9wPC9hPiBdJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwKCc8L3A+Jyk7DQogICAgICAgICAgICBteXNxbF9zZWxlY3RfZGIoJGRibmFtZSk7DQogICAgICAgICAgICAkZ2V0bnVtc3FsID0gJyc7DQogICAgICAgICAgICAkcnVucXVlcnkgPSAwOw0KICAgICAgICAgICAgaWYgKCRzcWxfcXVlcnkpIHsNCiAgICAgICAgICAgICAgICAkcnVucXVlcnkgPSAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGFsbG93ZWRpdCA9IDA7DQogICAgICAgICAgICBpZiAoJHRhYmxlbmFtZSAmJiAhJHNxbF9xdWVyeSkgew0KICAgICAgICAgICAgICAgICRzcWxfcXVlcnkgPSAiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIjsNCiAgICAgICAgICAgICAgICAkZ2V0bnVtc3FsID0gJHNxbF9xdWVyeTsNCiAgICAgICAgICAgICAgICAkc3FsX3F1ZXJ5ID0gJHNxbF9xdWVyeSAuICIgTElNSVQgJHN0YXJ0X2xpbWl0LCAkcGFnZW51bSI7DQogICAgICAgICAgICAgICAgJGFsbG93ZWRpdCA9IDE7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwKCc8Zm9ybSBhY3Rpb249IicgLiAkc2VsZiAuICciIG1ldGhvZD0iUE9TVCI+Jyk7DQogICAgICAgICAgICBwKCc8cD48dGFibGUgd2lkdGg9IjIwMCIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQgY29sc3Bhbj0iMiI+UnVuIFNRTCBxdWVyeS9xdWVyaWVzIG9uIGRhdGFiYXNlIDxmb250IGNvbG9yPXJlZD48Yj4nIC4gJGRibmFtZSAuICc8L2ZvbnQ+PC9iPjo8QlI+RXhhbXBsZSBWQkIgUGFzc3dvcmQ6IDxmb250IGNvbG9yPXJlZD52YmF0ZWFtPC9mb250PjxCUj48Zm9udCBjb2xvcj15ZWxsb3c+VVBEQVRFIGB1c2VyYCBTRVQgYHBhc3N3b3JkYCA9IFwnNjllNTNlNWFiOTUzNmU1NWQzMWZmNTMzYWVmYzRmYmVcJywgc2FsdCA9IFwncDVUXCcgV0hFUkUgYHVzZXJpZGAgPSBcJzFcJyA8L2ZvbnQ+DQoJCQk8L3RkPjwvdHI+PHRyPjx0ZD48dGV4dGFyZWEgbmFtZT0ic3FsX3F1ZXJ5IiBjbGFzcz0iYXJlYSIgc3R5bGU9IndpZHRoOjYwMHB4O2hlaWdodDo1MHB4O292ZXJmbG93OmF1dG87Ij4nIC4gaHRtbHNwZWNpYWxjaGFycygkc3FsX3F1ZXJ5LCBFTlRfUVVPVEVTKSAuICc8L3RleHRhcmVhPjwvdGQ+PHRkIHN0eWxlPSJwYWRkaW5nOjAgNXB4OyI+PGlucHV0IGNsYXNzPSJidCIgc3R5bGU9ImhlaWdodDo1MHB4OyIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJRdWVyeSIgLz48L3RkPjwvdHI+PC90YWJsZT48L3A+Jyk7DQogICAgICAgICAgICBtYWtlaGlkZSgndGFibGVuYW1lJywgJHRhYmxlbmFtZSk7DQogICAgICAgICAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ3NxbGFkbWluJyk7DQogICAgICAgICAgICBwKCRkYmZvcm0pOw0KICAgICAgICAgICAgcCgnPC9mb3JtPicpOw0KICAgICAgICAgICAgaWYgKCR0YWJsZW5hbWUgfHwgKCRydW5xdWVyeSAmJiAkc3FsX3F1ZXJ5KSkgew0KICAgICAgICAgICAgICAgIGlmICgkZG9pbmcgPT0gJ3N0cnVjdHVyZScpIHsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoIlNIT1cgQ09MVU1OUyBGUk9NICR0YWJsZW5hbWUiKTsNCiAgICAgICAgICAgICAgICAgICAgJHJvd2RiID0gYXJyYXkoKTsNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHJvd2RiW10gPSAkcm93Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5GaWVsZDwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5UeXBlPC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkPk51bGw8L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+S2V5PC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkPkRlZmF1bHQ8L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+RXh0cmE8L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8L3RyPicpOw0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXNiZyA9IGJnKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicgLiAkcm93WydGaWVsZCddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+JyAuICRyb3dbJ1R5cGUnXSAuICc8L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicgLiAkcm93WydOdWxsJ10gLiAnJm5ic3A7PC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHJvd1snS2V5J10gLiAnJm5ic3A7PC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHJvd1snRGVmYXVsdCddIC4gJyZuYnNwOzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+JyAuICRyb3dbJ0V4dHJhJ10gLiAnJm5ic3A7PC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzwvdHI+Jyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGJmb290KCk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkb2luZyA9PSAnaW5zZXJ0JyB8fCAkZG9pbmcgPT0gJ2VkaXQnKSB7DQogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBxKCdTSE9XIENPTFVNTlMgRlJPTSAnIC4gJHRhYmxlbmFtZSk7DQogICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyb3dkYltdID0gJHJvdzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkcnMgPSBhcnJheSgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJGRvaW5nID09ICdpbnNlcnQnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8aDI+SW5zZXJ0IG5ldyBsaW5lIGluICcgLiAkdGFibGVuYW1lIC4gJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzxoMj5VcGRhdGUgcmVjb3JkIGluICcgLiAkdGFibGVuYW1lIC4gJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSBMSU1JVCAxIik7DQogICAgICAgICAgICAgICAgICAgICAgICAkcnMgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwKCc8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iJyAuICRzZWxmIC4gJyI+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJGRiZm9ybSk7DQogICAgICAgICAgICAgICAgICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnc3FsYWRtaW4nKTsNCiAgICAgICAgICAgICAgICAgICAgbWFrZWhpZGUoJ3RhYmxlbmFtZScsICR0YWJsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyc1skcm93WydGaWVsZCddXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHJzWyRyb3dbJ0ZpZWxkJ11dKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+PGI+JyAuICRyb3dbJ0ZpZWxkJ10gLiAnPC9iPjxiciAvPicgLiAkcm93WydUeXBlJ10gLiAnPC90ZD48dGQ+PHRleHRhcmVhIGNsYXNzPSJhcmVhIiBuYW1lPSJpbnNlcnRzcWxbJyAuICRyb3dbJ0ZpZWxkJ10gLiAnXSIgc3R5bGU9IndpZHRoOjUwMHB4O2hlaWdodDo2MHB4O292ZXJmbG93OmF1dG87Ij4nIC4gJHZhbHVlIC4gJzwvdGV4dGFyZWE+PC90ZD48L3RyPicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgkZG9pbmcgPT0gJ2luc2VydCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCBjbGFzcz0iYnQiIHR5cGU9InN1Ym1pdCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0iSW5zZXJ0IiAvPjwvdGQ+PC90cj4nKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCBjbGFzcz0iYnQiIHR5cGU9InN1Ym1pdCIgbmFtZT0idXBkYXRlIiB2YWx1ZT0iVXBkYXRlIiAvPjwvdGQ+PC90cj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VoaWRlKCdiYXNlNjQnLCAkYmFzZTY0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwKCc8L3RhYmxlPjwvZm9ybT4nKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkcXVlcnlzID0gQGV4cGxvZGUoJzsnLCAkc3FsX3F1ZXJ5KTsNCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHF1ZXJ5cyBhcyAkbnVtID0+ICRxdWVyeSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRxdWVyeSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoIjxwPjxiPlF1ZXJ5I3skbnVtfSA6ICIgLiBodG1sc3BlY2lhbGNoYXJzKCRxdWVyeSwgRU5UX1FVT1RFUykgLiAiPC9iPjwvcD4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHF5KCRxdWVyeSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgnPGgyPkVycm9yIDogJyAuIG15c3FsX2Vycm9yKCkgLiAnPC9oMj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJ0b2xvd2VyKHN1YnN0cigkcXVlcnksIDAsIDEzKSkgPT0gJ3NlbGVjdCAqIGZyb20nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFsbG93ZWRpdCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGdldG51bXNxbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0YXRvbCA9IG15c3FsX251bV9yb3dzKHEoJGdldG51bXNxbCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtdWx0aXBhZ2UgPSBtdWx0aSgkdGF0b2wsICRwYWdlbnVtLCAkcGFnZSwgJHRhYmxlbmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0YWJsZW5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsX2xpbmUgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iLCAiXHQiKSwgYXJyYXkoJyAnLCAnICcsICcgJyksIHRyaW0oaHRtbHNwZWNpYWxjaGFycygkcXVlcnkpKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbF9saW5lID0gcHJlZ19yZXBsYWNlKCIvXC9cKlteKFwqXC8pXSpcKlwvL2kiLCAiICIsICRzcWxfbGluZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoIi9mcm9tXHMrYHswLDF9KFtcd10rKWB7MCwxfVxzKy9pIiwgJHNxbF9saW5lLCAkbWF0Y2hlcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhYmxlbmFtZSA9ICRtYXRjaGVzWzFdWzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoJHF1ZXJ5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJG11bHRpcGFnZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYWxsb3dlZGl0KSBwKCc8dGQ+QWN0aW9uPC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWVsZG51bSA9IEBteXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7JGkgPCAkZmllbGRudW07JGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lID0gQG15c3FsX2ZpZWxkX25hbWUoJHJlc3VsdCwgJGkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlID0gQG15c3FsX2ZpZWxkX3R5cGUoJHJlc3VsdCwgJGkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSBAbXlzcWxfZmllbGRfbGVuKCRyZXN1bHQsICRpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCI8dGQgbm93cmFwPiRuYW1lPGJyPjxzcGFuPiR0eXBlKCRsZW4pPC9zcGFuPjwvdGQ+Iik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8L3RyPicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRtbiA9IEBteXNxbF9mZXRjaF9hc3NvYygkcmVzdWx0KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzYmcgPSBiZygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdoZXJlID0gJHRtcCA9ICRiMSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRtbiBhcyAka2V5ID0+ICRpbnNpZGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpbnNpZGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZS49ICR0bXAgLiAka2V5IC4gIj0nIiAuIGFkZHNsYXNoZXMoJGluc2lkZSkgLiAiJyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG1wID0gJyBBTkQgJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYjEuPSAnPHRkIG5vd3JhcD4nIC4gaHRtbF9jbGVhbigkaW5zaWRlKSAuICcmbmJzcDs8L3RkPic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSA9IGJhc2U2NF9lbmNvZGUoJHdoZXJlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGFsbG93ZWRpdCkgcCgnPHRkIG5vd3JhcD48YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdlZGl0XCcsIFwnJyAuICR3aGVyZSAuICdcJywgXCcnIC4gJHRhYmxlbmFtZSAuICdcJyk7Ij5FZGl0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZWRpdHJlY29yZChcJ2RlbFwnLCBcJycgLiAkd2hlcmUgLiAnXCcsIFwnJyAuICR0YWJsZW5hbWUgLiAnXCcpOyI+RGVsPC9hPjwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgkYjEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJzwvdHI+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJGIxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiZm9vdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgkbXVsdGlwYWdlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXIgPSBteXNxbF9hZmZlY3RlZF9yb3dzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8aDI+YWZmZWN0ZWQgcm93cyA6IDxiPicgLiAkYXIgLiAnPC9iPjwvaDI+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJHF1ZXJ5ID0gcSgiU0hPVyBUQUJMRSBTVEFUVVMiKTsNCiAgICAgICAgICAgICAgICAkdGFibGVfbnVtID0gJHRhYmxlX3Jvd3MgPSAkZGF0YV9zaXplID0gMDsNCiAgICAgICAgICAgICAgICAkdGFibGVkYiA9IGFycmF5KCk7DQogICAgICAgICAgICAgICAgd2hpbGUgKCR0YWJsZSA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJGRhdGFfc2l6ZSA9ICRkYXRhX3NpemUgKyAkdGFibGVbJ0RhdGFfbGVuZ3RoJ107DQogICAgICAgICAgICAgICAgICAgICR0YWJsZV9yb3dzID0gJHRhYmxlX3Jvd3MgKyAkdGFibGVbJ1Jvd3MnXTsNCiAgICAgICAgICAgICAgICAgICAgJHRhYmxlWydEYXRhX2xlbmd0aCddID0gc2l6ZWNvdW50KCR0YWJsZVsnRGF0YV9sZW5ndGgnXSk7DQogICAgICAgICAgICAgICAgICAgICR0YWJsZV9udW0rKzsNCiAgICAgICAgICAgICAgICAgICAgJHRhYmxlZGJbXSA9ICR0YWJsZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJGRhdGFfc2l6ZSA9IHNpemVjb3VudCgkZGF0YV9zaXplKTsNCiAgICAgICAgICAgICAgICB1bnNldCgkdGFibGUpOw0KICAgICAgICAgICAgICAgIHAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQogICAgICAgICAgICAgICAgcCgnPGZvcm0gYWN0aW9uPSInIC4gJHNlbGYgLiAnIiBtZXRob2Q9IlBPU1QiPicpOw0KICAgICAgICAgICAgICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnc3FsYWRtaW4nKTsNCiAgICAgICAgICAgICAgICBwKCRkYmZvcm0pOw0KICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7DQogICAgICAgICAgICAgICAgcCgnPHRkIHdpZHRoPSIyJSIgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPicpOw0KICAgICAgICAgICAgICAgIHAoJzx0ZD5OYW1lPC90ZD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQ+Um93czwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgcCgnPHRkPkRhdGFfbGVuZ3RoPC90ZD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQ+Q3JlYXRlX3RpbWU8L3RkPicpOw0KICAgICAgICAgICAgICAgIHAoJzx0ZD5VcGRhdGVfdGltZTwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgaWYgKCRoaWdodmVyKSB7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5FbmdpbmU8L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+Q29sbGF0aW9uPC90ZD4nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcCgnPC90cj4nKTsNCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdGFibGVkYiBhcyAka2V5ID0+ICR0YWJsZSkgew0KICAgICAgICAgICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsNCiAgICAgICAgICAgICAgICAgICAgcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsNCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyJSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0YWJsZVtdIiB2YWx1ZT0iJyAuICR0YWJsZVsnTmFtZSddIC4gJyIgLz48L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycgLiAkdGFibGVbJ05hbWUnXSAuICdcJyk7Ij4nIC4gJHRhYmxlWydOYW1lJ10gLiAnPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlWydOYW1lJ10gLiAnXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlWydOYW1lJ10gLiAnXCcsIFwnc3RydWN0dXJlXCcpOyI+U3RydWN0dXJlPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlWydOYW1lJ10gLiAnXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF08L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+JyAuICR0YWJsZVsnUm93cyddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHRhYmxlWydEYXRhX2xlbmd0aCddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHRhYmxlWydDcmVhdGVfdGltZSddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHRhYmxlWydVcGRhdGVfdGltZSddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgIGlmICgkaGlnaHZlcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicgLiAkdGFibGVbJ0VuZ2luZSddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+JyAuICR0YWJsZVsnQ29sbGF0aW9uJ10gLiAnPC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwKCc8L3RyPicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9Zm91dD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQ+Jm5ic3A7PC90ZD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQ+VG90YWwgdGFibGVzOiAnIC4gJHRhYmxlX251bSAuICc8L3RkPicpOw0KICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHRhYmxlX3Jvd3MgLiAnPC90ZD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQ+JyAuICRkYXRhX3NpemUgLiAnPC90ZD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQgY29sc3Bhbj0iJyAuICgkaGlnaHZlciA/IDQgOiAyKSAuICciPiZuYnNwOzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgcCgnPC90cj4nKTsNCiAgICAgICAgICAgICAgICBwKCI8dHIgY2xhc3M9XCJmb3V0XCI+PHRkIGNvbHNwYW49XCIiIC4gKCRoaWdodmVyID8gOCA6IDYpIC4gIlwiPjxpbnB1dCBuYW1lPVwic2F2ZWFzZmlsZVwiIHZhbHVlPVwiMVwiIHR5cGU9XCJjaGVja2JveFwiIC8+IFNhdmUgYXMgZmlsZSA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIG5hbWU9XCJwYXRoXCIgdmFsdWU9XCIiIC4gU0FfUk9PVCAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICJfTXlTUUwuc3FsXCIgdHlwZT1cInRleHRcIiBzaXplPVwiNjBcIiAvPiA8aW5wdXQgY2xhc3M9XCJidFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiZG93bnJhclwiIHZhbHVlPVwiRXhwb3J0IHNlbGVjdGlvbiB0YWJsZVwiIC8+PC90ZD48L3RyPiIpOw0KICAgICAgICAgICAgICAgIG1ha2VoaWRlKCdkb2luZycsICdiYWNrdXBteXNxbCcpOw0KICAgICAgICAgICAgICAgIGZvcm1mb290KCk7DQogICAgICAgICAgICAgICAgcCgiPC90YWJsZT4iKTsNCiAgICAgICAgICAgICAgICBmcigkcXVlcnkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIHRiZm9vdCgpOw0KICAgIEBteXNxbF9jbG9zZSgpOw0KfSAvL2VuZCBzcWwgYmFja3VwDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2JhY2tjb25uZWN0Jykgew0KICAgICEkeW91cmlwICYmICR5b3VyaXAgPSAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsNCiAgICAhJHlvdXJwb3J0ICYmICR5b3VycG9ydCA9ICcxMjM0NSc7DQogICAgJHVzZWRiID0gYXJyYXkoJ3BlcmwnID0+ICdwZXJsJywgJ2MnID0+ICdjJyk7DQogICAgJGJhY2tfY29ubmVjdCA9ICJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqIiAuICJhRzhnSW1CcFpHQWlPeTlpYVc0dmMyZ25PdzBLSkRBOUpHTnRaRHNOQ2lSMFlYSm5aWFE5SkVGU1IxWmJNRjA3RFFva2NHOXlkRDBrUVZKSFZsc3hYVHNOQ2lScFlXUmtjajFwYm1WMFgyRjBiMjRvSkhSIiAuICJoY21kbGRDa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUndiM0owTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUIiAuICJzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9JIiAuICJrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpIiAuICJLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2drYzNsemRHVnRLVHNOQ21Oc2IzTmxLRk5VUkVsIiAuICJPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsNCiAgICAkYmFja19jb25uZWN0X2MgPSAiSTJsdVkyeDFaR1VnUEhOMFpHbHZMbWcrRFFvamFXNWpiSFZrWlNBOGMzbHpMM052WTJ0bGRDNW9QZzBLSTJsdVkyeDFaR1VnUEc1bGRHbHVaWFF2YVc0dWFENE5DbWx1ZEMiIC4gIkJ0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNwaGNtZDJXMTBwRFFwN0RRb2dhVzUwSUdaa093MEtJSE4wY25WamRDQnpiMk5yWVdSa2NsOXBiaUJ6YVc0N0RRb2dZMmhoY2lCeWJYTmJNakZkUFNKeWIiIC4gIlNBdFppQWlPeUFOQ2lCa1lXVnRiMjRvTVN3d0tUc05DaUJ6YVc0dWMybHVYMlpoYldsc2VTQTlJRUZHWDBsT1JWUTdEUW9nYzJsdUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb1lYUnZhU2hoY21kMld6SmQiIC4gIktTazdEUW9nYzJsdUxuTnBibDloWkdSeUxuTmZZV1JrY2lBOUlHbHVaWFJmWVdSa2NpaGhjbWQyV3pGZEtUc2dEUW9nWW5wbGNtOG9ZWEpuZGxzeFhTeHpkSEpzWlc0b1lYSm5kbHN4WFNrck1TdHpkSEoiIC4gInNaVzRvWVhKbmRsc3lYU2twT3lBTkNpQm1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1NWQlFVazlVVDE5VVExQXBJRHNnRFFvZ2FXWWdLQ2hqYjI1dVpXTjBLR1prTEMiIC4gIkFvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSUNaemFXNHNJSE5wZW1WdlppaHpkSEoxWTNRZ2MyOWphMkZrWkhJcEtTazhNQ2tnZXcwS0lDQWdjR1Z5Y205eUtDSmJMVjBnWTI5dWJtVmpkQ2dwSWlrN0QiIC4gIlFvZ0lDQmxlR2wwS0RBcE93MEtJSDBOQ2lCemRISmpZWFFvY20xekxDQmhjbWQyV3pCZEtUc05DaUJ6ZVhOMFpXMG9jbTF6S1RzZ0lBMEtJR1IxY0RJb1ptUXNJREFwT3cwS0lHUjFjRElvWm1Rc0lERXAiIC4gIk93MEtJR1IxY0RJb1ptUXNJRElwT3cwS0lHVjRaV05zS0NJdlltbHVMM05vSWl3aWMyZ2dMV2tpTENCT1ZVeE1LVHNOQ2lCamJHOXpaU2htWkNrN0lBMEtmUT09IjsNCiAgICBpZiAoJHN0YXJ0ICYmICR5b3VyaXAgJiYgJHlvdXJwb3J0ICYmICR1c2UpIHsNCiAgICAgICAgaWYgKCR1c2UgPT0gJ3BlcmwnKSB7DQogICAgICAgICAgICBjZignL3RtcC9hbmdlbF9iYycsICRiYWNrX2Nvbm5lY3QpOw0KICAgICAgICAgICAgJHJlcyA9IGV4ZWN1dGUod2hpY2goJ3BlcmwnKSAuICIgL3RtcC9hbmdlbF9iYyAkeW91cmlwICR5b3VycG9ydCAmIik7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBjZignL3RtcC9hbmdlbF9iYy5jJywgJGJhY2tfY29ubmVjdF9jKTsNCiAgICAgICAgICAgICRyZXMgPSBleGVjdXRlKCdnY2MgLW8gL3RtcC9hbmdlbF9iYyAvdG1wL2FuZ2VsX2JjLmMnKTsNCiAgICAgICAgICAgIEB1bmxpbmsoJy90bXAvYW5nZWxfYmMuYycpOw0KICAgICAgICAgICAgJHJlcyA9IGV4ZWN1dGUoIi90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOw0KICAgICAgICB9DQogICAgICAgIG0oIk5vdyBzY3JpcHQgdHJ5IGNvbm5lY3QgdG8gJHlvdXJpcCBwb3J0ICR5b3VycG9ydCAuLi4iKTsNCiAgICB9DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnQmFjayBDb25uZWN0JykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnYmFja2Nvbm5lY3QnKTsNCiAgICBwKCc8cD4nKTsNCiAgICBwKCdZb3VyIElQOicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ3lvdXJpcCcsICdzaXplJyA9PiAyMCwgJ3ZhbHVlJyA9PiAkeW91cmlwKSk7DQogICAgcCgnWW91ciBQb3J0OicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ3lvdXJwb3J0JywgJ3NpemUnID0+IDE1LCAndmFsdWUnID0+ICR5b3VycG9ydCkpOw0KICAgIHAoJ1VzZTonKTsNCiAgICBtYWtlc2VsZWN0KGFycmF5KCduYW1lJyA9PiAndXNlJywgJ29wdGlvbicgPT4gJHVzZWRiLCAnc2VsZWN0ZWQnID0+ICR1c2UpKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdzdGFydCcsICd2YWx1ZScgPT4gJ1N0YXJ0JywgJ3R5cGUnID0+ICdzdWJtaXQnLCAnY2xhc3MnID0+ICdidCcpKTsNCiAgICBwKCc8L3A+Jyk7DQogICAgZm9ybWZvb3QoKTsNCn0gLy9lbmQgYmFja2Nvbm5lY3Qgd2luZG93IHZpYSBOQw0KLy8gQnJ1dGUNCmVsc2VpZiAoJGFjdGlvbiA9PSAnYnJ1dGUnKSB7DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnQnJ1dGUgRm9yY2VyJykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnYnJ1dGUnKTsNCiAgICBtYWtlaGlkZSgnZGlyJywgJGJydXRlKTsNCiAgICBAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgMTAwMDAwMDAwMDAwMCk7DQogICAgJGNvbm5lY3RfdGltZW91dCA9IDU7DQogICAgQHNldF90aW1lX2xpbWl0KDApOw0KICAgICRzdWJtaXQgPSAkX1JFUVVFU1RbJ3N1Ym1pdCddOw0KICAgICR1c2VycyA9ICRfUkVRVUVTVFsndXNlcnMnXTsNCiAgICAkcGFzcyA9ICRfUkVRVUVTVFsncGFzc3dvcmRzJ107DQogICAgJHRhcmdldCA9ICRfUkVRVUVTVFsndGFyZ2V0J107DQogICAgJG9wdGlvbiA9ICRfUkVRVUVTVFsnb3B0aW9uJ107DQogICAgJHBhc3NsaXN0ID0gIjAxMjM0NTYNCjAxMjM0NTY3DQowMTIzNDU2NzgNCjAxMjM0NTY3ODkNCjAxMjM0NTY3ODkwDQoxMjM0NTYNCjEyMzQ1NjcNCjEyMzQ1Njc4DQoxMjM0NTY3ODkNCjEyMzQ1Njc4OTANCjExMTExMQ0KMDAwMDAwDQoyMjIyMjINCjMzMzMzMw0KNDQ0NDQ0DQo1NTU1NTUNCjY2NjY2Ng0KNzc3Nzc3DQo4ODg4ODgNCjk5OTk5OQ0KMTIzMTIzDQo0NTY0NTYNCjc4OTc4OQ0KMTIzMzIxDQo0NTY2NTQNCjY1NDMyMQ0KNzY1NDMyMQ0KODc2NTQzMjENCjk4NzY1NDMyMQ0KMDk4NzY1NDMyMQ0KYWRtaW4NCmFkbWluaXN0cmF0b3INCmFkbWluY3ANCmNwYW5lbA0KYWRtaW54DQphZG1pbnMNCnBhc3N3b3JkDQpwYXNzd29yZHMNCnBhc3N3MHJkDQpwQHNzdzByZA0KcEBzc3dvcmQNCmtob25nY28NCjI1MjUxMzI1DQpwYXNzdzByZHMiOw0KICAgIGlmICgkdGFyZ2V0ID09ICcnKSB7DQogICAgICAgICR0YXJnZXQgPSAnbG9jYWxob3N0JzsNCiAgICB9DQogICAgcHJpbnQgIiA8ZGl2IGFsaWduPSdjZW50ZXInPg0KPGZvcm0gbWV0aG9kPSdwb3N0JyBzdHlsZT0nYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMCc+PGJyPjxicj4NCjxUQUJMRSBzdHlsZT0nQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZScgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9Izk2NjExNyBjZWxsUGFkZGluZz01IHdpZHRoPSc0MCUnIGJnQ29sb3I9IzMwMzAzMCBib3JkZXJDb2xvckxpZ2h0PSM5NjYxMTcgYm9yZGVyPTE+PHRyPjx0ZD4NCjxiPiBUYXJnZXQgIDogPC9mb250PjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd0YXJnZXQnIHNpemU9JzE2JyB2YWx1ZT0gJHRhcmdldCBzdHlsZT0nYm9yZGVyOiBmb250LWZhbWlseTp0YWhvbWE7IGZvbnQtd2VpZ2h0OmJvbGQ7Jz48L3A+PC9mb250PjwvYj48L3A+DQo8ZGl2IGFsaWduPSdjZW50ZXInPjxicj4NCjxUQUJMRSBzdHlsZT0nQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZScgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9Izk2NjExNyBjZWxsUGFkZGluZz01IHdpZHRoPSc1MCUnIGJnQ29sb3I9IzMwMzAzMCBib3JkZXJDb2xvckxpZ2h0PSM5NjYxMTcgYm9yZGVyPTE+DQo8dHI+DQo8dGQgYWxpZ249J2NlbnRlcic+DQo8Yj5Vc2VybmFtZTwvYj48L3RkPg0KPHRkPg0KPHAgYWxpZ249J2NlbnRlcic+DQo8Yj5QYXNzd29yZDwvYj48L3RkPg0KPC90cj4NCjwvdGFibGU+DQo8cCBhbGlnbj0nY2VudGVyJz4NCjx0ZXh0YXJlYSByb3dzPScyMCcgbmFtZT0ndXNlcnMnIGNvbHM9JzI1JyBzdHlsZT0nYm9yZGVyOiAycHggc29saWQgIzFEMUQxRDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6I0MwQzBDMCc+IjsNCiAgICAkaSA9IDA7DQogICAgd2hpbGUgKCRpIDwgNjAwMDApIHsNCiAgICAgICAgJGxpbmUgPSBwb3NpeF9nZXRwd3VpZCgkaSk7DQogICAgICAgIGlmICghZW1wdHkoJGxpbmUpKSB7DQogICAgICAgICAgICB3aGlsZSAobGlzdCgka2V5LCAkdmJhX2V0Y3B3ZCkgPSBlYWNoKCRsaW5lKSkgew0KICAgICAgICAgICAgICAgIGVjaG8gIiIgLiAkdmJhX2V0Y3B3ZCAuICJcbiI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJGkrKzsNCiAgICB9DQogICAgZWNobyAiDQo8L3RleHRhcmVhPg0KPHRleHRhcmVhIHJvd3M9JzIwJyBuYW1lPSdwYXNzd29yZHMnIGNvbHM9JzI1JyBzdHlsZT0nYm9yZGVyOiAycHggc29saWQgIzFEMUQxRDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6I0MwQzBDMCc+JHBhc3NsaXN0PC90ZXh0YXJlYT48YnI+DQo8YnI+DQo8Yj5PcHRpb25zIDogPC9zcGFuPjxpbnB1dCBuYW1lPSdvcHRpb24nIHZhbHVlPSdjcGFuZWwnIHN0eWxlPSdmb250LXdlaWdodDogNzAwOycgY2hlY2tlZCB0eXBlPSdyYWRpbyc+IGNQYW5lbA0KPGlucHV0IG5hbWU9J29wdGlvbicgdmFsdWU9J2Z0cCcgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA3MDA7JyB0eXBlPSdyYWRpbyc+IGZ0cCA9PT4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0F0dGFjaycgbmFtZT0nc3VibWl0JyA+PC9wPg0KPC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvZm9ybT48cCBhbGlnbj0gJ2xlZnQnPiI7DQo/Pg0KPD9waHANCiAgICBmdW5jdGlvbiBmdHBfY2hlY2soJGhvc3QsICR1c2VyLCAkcGFzcywgJHRpbWVvdXQpIHsNCiAgICAgICAgJGNoID0gY3VybF9pbml0KCk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICJmdHA6Ly8kaG9zdCIpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZUUExJU1RPTkxZLCAxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJQV0QsICIkdXNlcjokcGFzcyIpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsICR0aW1lb3V0KTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZBSUxPTkVSUk9SLCAxKTsNCiAgICAgICAgJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsNCiAgICAgICAgaWYgKGN1cmxfZXJybm8oJGNoKSA9PSAyOCkgew0KICAgICAgICAgICAgcHJpbnQgIjxiPiBFcnJvciA6IENvbm5lY3Rpb24gdGltZWQgb3V0ICwgbWFrZSBjb25maWRlbmNlIGFib3V0IHZhbGlkYXRpb24gb2YgdGFyZ2V0ICE8L2I+IjsNCiAgICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0gZWxzZWlmIChjdXJsX2Vycm5vKCRjaCkgPT0gMCkgew0KICAgICAgICAgICAgcCgiPGI+WyBhdHRhY2tAdmJhdGVhbS5uZXQgXSMgPC9iPg0KPGI+IEF0dGFja2luZyBoYXMgYmVlbiBkb25lISBVc2VybmFtZTogPGZvbnQgY29sb3I9JyNGRjAwMDAnPiAkdXNlciA8L2ZvbnQ+IC8gUGFzc3dvcmQ6PGZvbnQgY29sb3I9JyNGRjAwMDAnPiAkcGFzcyA8L2ZvbnQ+ID0+IDxhIGhyZWY9aHR0cDovLyR1c2VyOiRwYXNzQCRob3N0OjIwODIgdGFyZ2V0PV9ibGFuaz5Mb2dpbjwvYT48L2I+PGJyPiIpOw0KICAgICAgICB9DQogICAgICAgIGN1cmxfY2xvc2UoJGNoKTsNCiAgICB9DQogICAgZnVuY3Rpb24gY3BhbmVsX2NoZWNrKCRob3N0LCAkdXNlciwgJHBhc3MsICR0aW1lb3V0KSB7DQogICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiaHR0cDovLyRob3N0OjIwODIiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBBVVRILCBDVVJMQVVUSF9CQVNJQyk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSUFdELCAiJHVzZXI6JHBhc3MiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAkdGltZW91dCk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GQUlMT05FUlJPUiwgMSk7DQogICAgICAgICRkYXRhID0gY3VybF9leGVjKCRjaCk7DQogICAgICAgIGlmIChjdXJsX2Vycm5vKCRjaCkgPT0gMjgpIHsNCiAgICAgICAgICAgIHByaW50ICI8Yj4gRXJyb3IgOiBDb25uZWN0aW9uIHRpbWVkIG91dCAsIG1ha2UgY29uZmlkZW5jZSBhYm91dCB2YWxpZGF0aW9uIG9mIHRhcmdldCAhPC9iPiI7DQogICAgICAgICAgICBleGl0Ow0KICAgICAgICB9IGVsc2VpZiAoY3VybF9lcnJubygkY2gpID09IDApIHsNCiAgICAgICAgICAgIHAoIjxiPlsgYXR0YWNrQHZiYXRlYW0ubmV0IF0jIDwvYj48Yj5BdHRhY2tpbmcgaGFzIGJlZW4gZG9uZSE8L2E+IFVzZXJuYW1lOiA8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICR1c2VyIDwvZm9udD4gLyBQYXNzd29yZDo8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICRwYXNzIDwvZm9udD48L2I+PGJyPiIpOw0KICAgICAgICB9DQogICAgICAgIGN1cmxfY2xvc2UoJGNoKTsNCiAgICB9DQogICAgaWYgKGlzc2V0KCRzdWJtaXQpICYmICFlbXB0eSgkc3VibWl0KSkgew0KICAgICAgICAkdXNlcmxpc3QgPSBleHBsb2RlKCJcbiIsICR1c2Vycyk7DQogICAgICAgICRwYXNzbGlzdCA9IGV4cGxvZGUoIlxuIiwgJHBhc3MpOw0KICAgICAgICBwKCc8Yj5bIGF0dGFja0B2YmF0ZWFtLm5ldCBdIyBBdHRhY2tpbmcgLi4uPC9mb250PjwvYj48YnI+Jyk7DQogICAgICAgIGZvcmVhY2ggKCR1c2VybGlzdCBhcyAkdXNlcikgew0KICAgICAgICAgICAgJF91c2VyID0gdHJpbSgkdXNlcik7DQogICAgICAgICAgICBmb3JlYWNoICgkcGFzc2xpc3QgYXMgJHBhc3N3b3JkKSB7DQogICAgICAgICAgICAgICAgJF9wYXNzID0gdHJpbSgkcGFzc3dvcmQpOw0KICAgICAgICAgICAgICAgIGlmICgkb3B0aW9uID09ICJmdHAiKSB7DQogICAgICAgICAgICAgICAgICAgIGZ0cF9jaGVjaygkdGFyZ2V0LCAkX3VzZXIsICRfcGFzcywgJGNvbm5lY3RfdGltZW91dCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICgkb3B0aW9uID09ICJjcGFuZWwiKSB7DQogICAgICAgICAgICAgICAgICAgIGNwYW5lbF9jaGVjaygkdGFyZ2V0LCAkX3VzZXIsICRfcGFzcywgJGNvbm5lY3RfdGltZW91dCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGZvcm1mb290KCk7DQp9IGVsc2VpZiAoJGFjdGlvbiA9PSAnZXRjcHdkJykgew0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZScgPT4gJ0dldCAvZXRjL3Bhc3N3ZCcpKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ2V0Y3B3ZCcpOw0KICAgIG1ha2VoaWRlKCdkaXInLCAkbm93cGF0aCk7DQogICAgJGkgPSAwOw0KICAgIGVjaG8gIjxwPjxicj48dGV4dGFyZWEgY2xhc3M9XCJhcmVhXCIgaWQ9XCJwaHBjb2RleHh4XCIgbmFtZT1cInBocGNvZGV4eHhcIiBjb2xzPVwiMTAwXCIgcm93cz1cIjI1XCI+IjsNCiAgICB3aGlsZSAoJGkgPCA2MDAwMCkgew0KICAgICAgICAkbGluZSA9IHBvc2l4X2dldHB3dWlkKCRpKTsNCiAgICAgICAgaWYgKCFlbXB0eSgkbGluZSkpIHsNCiAgICAgICAgICAgIHdoaWxlIChsaXN0KCRrZXksICR2YmFfZXRjcHdkKSA9IGVhY2goJGxpbmUpKSB7DQogICAgICAgICAgICAgICAgZWNobyAiIiAuICR2YmFfZXRjcHdkIC4gIlxuIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkaSsrOw0KICAgIH0NCiAgICBlY2hvICI8L3RleHRhcmVhPjwvcD4iOw0KICAgIGZvcm1mb290KCk7DQp9IGVsc2VpZiAoJGFjdGlvbiA9PSAnZXZhbCcpIHsNCiAgICAkcGhwY29kZSA9IHRyaW0oJHBocGNvZGUpOw0KICAgIGlmICgkcGhwY29kZSkgew0KICAgICAgICBpZiAoIXByZWdfbWF0Y2goJyM8XD8jc2knLCAkcGhwY29kZSkpIHsNCiAgICAgICAgICAgICRwaHBjb2RlID0gIjw/cGhwXG5cbnskcGhwY29kZX1cblxuPz4iOw0KICAgICAgICB9DQogICAgICAgIGV2YWwoIj8iIC4gIj4kcGhwY29kZTw/Iik7DQogICAgfQ0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZScgPT4gJ0V2YWwgUEhQIENvZGUnKSk7DQogICAgbWFrZWhpZGUoJ2FjdGlvbicsICdldmFsJyk7DQogICAgbWFrZXRleHQoYXJyYXkoJ3RpdGxlJyA9PiAnUEhQIENvZGUnLCAnbmFtZScgPT4gJ3BocGNvZGUnLCAndmFsdWUnID0+ICRwaHBjb2RlKSk7DQogICAgcCgnPHA+PGEgaHJlZj0iaHR0cDovL3d3dy40bmdlbC5uZXQvcGhwc3B5L3BsdWdpbi8iIHRhcmdldD0iX2JsYW5rIj5HZXQgcGx1Z2luczwvYT48L3A+Jyk7DQogICAgZm9ybWZvb3RlcigpOw0KfSAvL2VuZCBldmFsDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2VkaXRmaWxlJykgew0KICAgIGlmIChmaWxlX2V4aXN0cygkb3BmaWxlKSkgew0KICAgICAgICAkZnAgPSBAZm9wZW4oJG9wZmlsZSwgJ3InKTsNCiAgICAgICAgJGNvbnRlbnRzID0gQGZyZWFkKCRmcCwgZmlsZXNpemUoJG9wZmlsZSkpOw0KICAgICAgICBAZmNsb3NlKCRmcCk7DQogICAgICAgICRjb250ZW50cyA9IGh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnRzKTsNCiAgICB9DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnQ3JlYXRlIC8gRWRpdCBGaWxlJykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnZmlsZScpOw0KICAgIG1ha2VoaWRlKCdkaXInLCAkbm93cGF0aCk7DQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZScgPT4gJ0N1cnJlbnQgRmlsZSAoaW1wb3J0IG5ldyBmaWxlIG5hbWUgYW5kIG5ldyBmaWxlKScsICduYW1lJyA9PiAnZWRpdGZpbGVuYW1lJywgJ3ZhbHVlJyA9PiAkb3BmaWxlLCAnbmV3bGluZScgPT4gMSkpOw0KICAgIG1ha2V0ZXh0KGFycmF5KCd0aXRsZScgPT4gJ0ZpbGUgQ29udGVudCcsICduYW1lJyA9PiAnZmlsZWNvbnRlbnQnLCAndmFsdWUnID0+ICRjb250ZW50cykpOw0KICAgIGZvcm1mb290ZXIoKTsNCn0gLy9lbmQgZWRpdGZpbGUNCmVsc2VpZiAoJGFjdGlvbiA9PSAnbmV3dGltZScpIHsNCiAgICAkb3BmaWxlbXRpbWUgPSBAZmlsZW10aW1lKCRvcGZpbGUpOw0KICAgIC8vJHRpbWUgPSBzdHJ0b3RpbWUoIiR5ZWFyLSRtb250aC0kZGF5ICRob3VyOiRtaW51dGU6JHNlY29uZCIpOw0KICAgICRjYWNoZW1vbnRoID0gYXJyYXkoJ0phbnVhcnknID0+IDEsICdGZWJydWFyeScgPT4gMiwgJ01hcmNoJyA9PiAzLCAnQXByaWwnID0+IDQsICdNYXknID0+IDUsICdKdW5lJyA9PiA2LCAnSnVseScgPT4gNywgJ0F1Z3VzdCcgPT4gOCwgJ1NlcHRlbWJlcicgPT4gOSwgJ09jdG9iZXInID0+IDEwLCAnTm92ZW1iZXInID0+IDExLCAnRGVjZW1iZXInID0+IDEyKTsNCiAgICBmb3JtaGVhZChhcnJheSgndGl0bGUnID0+ICdDbG9uZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkIHRpbWUnKSk7DQogICAgbWFrZWhpZGUoJ2FjdGlvbicsICdmaWxlJyk7DQogICAgbWFrZWhpZGUoJ2RpcicsICRub3dwYXRoKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJyA9PiAnQWx0ZXIgZmlsZScsICduYW1lJyA9PiAnY3VyZmlsZScsICd2YWx1ZScgPT4gJG9wZmlsZSwgJ3NpemUnID0+IDEyMCwgJ25ld2xpbmUnID0+IDEpKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJyA9PiAnUmVmZXJlbmNlIGZpbGUgKGZ1bGxwYXRoKScsICduYW1lJyA9PiAndGFyZmlsZScsICdzaXplJyA9PiAxMjAsICduZXdsaW5lJyA9PiAxKSk7DQogICAgZm9ybWZvb3RlcigpOw0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZScgPT4gJ1NldCBsYXN0IG1vZGlmaWVkJykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnZmlsZScpOw0KICAgIG1ha2VoaWRlKCdkaXInLCAkbm93cGF0aCk7DQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZScgPT4gJ0N1cnJlbnQgZmlsZSAoZnVsbHBhdGgpJywgJ25hbWUnID0+ICdjdXJmaWxlJywgJ3ZhbHVlJyA9PiAkb3BmaWxlLCAnc2l6ZScgPT4gMTIwLCAnbmV3bGluZScgPT4gMSkpOw0KICAgIHAoJzxwPkluc3RlYWQgJnJhcXVvOycpOw0KICAgIHAoJ3llYXI6Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAneWVhcicsICd2YWx1ZScgPT4gZGF0ZSgnWScsICRvcGZpbGVtdGltZSksICdzaXplJyA9PiA0KSk7DQogICAgcCgnbW9udGg6Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnbW9udGgnLCAndmFsdWUnID0+IGRhdGUoJ20nLCAkb3BmaWxlbXRpbWUpLCAnc2l6ZScgPT4gMikpOw0KICAgIHAoJ2RheTonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYXknLCAndmFsdWUnID0+IGRhdGUoJ2QnLCAkb3BmaWxlbXRpbWUpLCAnc2l6ZScgPT4gMikpOw0KICAgIHAoJ2hvdXI6Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnaG91cicsICd2YWx1ZScgPT4gZGF0ZSgnSCcsICRvcGZpbGVtdGltZSksICdzaXplJyA9PiAyKSk7DQogICAgcCgnbWludXRlOicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ21pbnV0ZScsICd2YWx1ZScgPT4gZGF0ZSgnaScsICRvcGZpbGVtdGltZSksICdzaXplJyA9PiAyKSk7DQogICAgcCgnc2Vjb25kOicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ3NlY29uZCcsICd2YWx1ZScgPT4gZGF0ZSgncycsICRvcGZpbGVtdGltZSksICdzaXplJyA9PiAyKSk7DQogICAgcCgnPC9wPicpOw0KICAgIGZvcm1mb290ZXIoKTsNCn0gLy9lbmQgbmV3dGltZQ0KZWxzZWlmICgkYWN0aW9uID09ICdzaGVsbCcpIHsNCiAgICBpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KICAgICAgICBpZiAoJHByb2dyYW0gJiYgJHBhcmFtZXRlcikgew0KICAgICAgICAgICAgJHNoZWxsID0gbmV3IENPTSgnU2hlbGwuQXBwbGljYXRpb24nKTsNCiAgICAgICAgICAgICRhID0gJHNoZWxsLT5TaGVsbEV4ZWN1dGUoJHByb2dyYW0sICRwYXJhbWV0ZXIpOw0KICAgICAgICAgICAgbSgnUHJvZ3JhbSBydW4gaGFzICcgLiAoISRhID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnKSk7DQogICAgICAgIH0NCiAgICAgICAgISRwcm9ncmFtICYmICRwcm9ncmFtID0gJ2M6XHdpbmRvd3Ncc3lzdGVtMzJcY21kLmV4ZSc7DQogICAgICAgICEkcGFyYW1ldGVyICYmICRwYXJhbWV0ZXIgPSAnL2MgbmV0IHN0YXJ0ID4gJyAuIFNBX1JPT1QgLiAnbG9nLnR4dCc7DQogICAgICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZScgPT4gJ0V4ZWN1dGUgUHJvZ3JhbScpKTsNCiAgICAgICAgbWFrZWhpZGUoJ2FjdGlvbicsICdzaGVsbCcpOw0KICAgICAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJyA9PiAnUHJvZ3JhbScsICduYW1lJyA9PiAncHJvZ3JhbScsICd2YWx1ZScgPT4gJHByb2dyYW0sICduZXdsaW5lJyA9PiAxKSk7DQogICAgICAgIHAoJzxwPicpOw0KICAgICAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJyA9PiAnUGFyYW1ldGVyJywgJ25hbWUnID0+ICdwYXJhbWV0ZXInLCAndmFsdWUnID0+ICRwYXJhbWV0ZXIpKTsNCiAgICAgICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnc3VibWl0JywgJ2NsYXNzJyA9PiAnYnQnLCAndHlwZScgPT4gJ3N1Ym1pdCcsICd2YWx1ZScgPT4gJ0V4ZWN1dGUnKSk7DQogICAgICAgIHAoJzwvcD4nKTsNCiAgICAgICAgZm9ybWZvb3QoKTsNCiAgICB9DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnRXhlY3V0ZSBDb21tYW5kJykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnc2hlbGwnKTsNCiAgICBpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KICAgICAgICAkZXhlY2Z1bmNkYiA9IGFycmF5KCdwaHBmdW5jJyA9PiAncGhwZnVuYycsICd3c2NyaXB0JyA9PiAnd3NjcmlwdCcsICdwcm9jX29wZW4nID0+ICdwcm9jX29wZW4nKTsNCiAgICAgICAgbWFrZXNlbGVjdChhcnJheSgndGl0bGUnID0+ICdVc2U6JywgJ25hbWUnID0+ICdleGVjZnVuYycsICdvcHRpb24nID0+ICRleGVjZnVuY2RiLCAnc2VsZWN0ZWQnID0+ICRleGVjZnVuYywgJ25ld2xpbmUnID0+IDEpKTsNCiAgICB9DQogICAgcCgnPHA+Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZScgPT4gJ0NvbW1hbmQnLCAnbmFtZScgPT4gJ2NvbW1hbmQnLCAndmFsdWUnID0+ICRjb21tYW5kKSk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnc3VibWl0JywgJ2NsYXNzJyA9PiAnYnQnLCAndHlwZScgPT4gJ3N1Ym1pdCcsICd2YWx1ZScgPT4gJ0V4ZWN1dGUnKSk7DQogICAgcCgnPC9wPicpOw0KICAgIGZvcm1mb290KCk7DQogICAgaWYgKCRjb21tYW5kKSB7DQogICAgICAgIHAoJzxociB3aWR0aD0iMTAwJSIgbm9zaGFkZSAvPjxwcmU+Jyk7DQogICAgICAgIGlmICgkZXhlY2Z1bmMgPT0gJ3dzY3JpcHQnICYmIElTX1dJTiAmJiBJU19DT00pIHsNCiAgICAgICAgICAgICR3c2ggPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7DQogICAgICAgICAgICAkZXhlYyA9ICR3c2gtPmV4ZWMoJ2NtZC5leGUgL2MgJyAuICRjb21tYW5kKTsNCiAgICAgICAgICAgICRzdGRvdXQgPSAkZXhlYy0+U3RkT3V0KCk7DQogICAgICAgICAgICAkc3Ryb3V0cHV0ID0gJHN0ZG91dC0+UmVhZEFsbCgpOw0KICAgICAgICAgICAgZWNobyAkc3Ryb3V0cHV0Ow0KICAgICAgICB9IGVsc2VpZiAoJGV4ZWNmdW5jID09ICdwcm9jX29wZW4nICYmIElTX1dJTiAmJiBJU19DT00pIHsNCiAgICAgICAgICAgICRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KDAgPT4gYXJyYXkoJ3BpcGUnLCAncicpLCAxID0+IGFycmF5KCdwaXBlJywgJ3cnKSwgMiA9PiBhcnJheSgncGlwZScsICd3JykpOw0KICAgICAgICAgICAgJHByb2Nlc3MgPSBwcm9jX29wZW4oJF9TRVJWRVJbJ0NPTVNQRUMnXSwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMpOw0KICAgICAgICAgICAgaWYgKGlzX3Jlc291cmNlKCRwcm9jZXNzKSkgew0KICAgICAgICAgICAgICAgIGZ3cml0ZSgkcGlwZXNbMF0sICRjb21tYW5kIC4gIlxyXG4iKTsNCiAgICAgICAgICAgICAgICBmd3JpdGUoJHBpcGVzWzBdLCAiZXhpdFxyXG4iKTsNCiAgICAgICAgICAgICAgICBmY2xvc2UoJHBpcGVzWzBdKTsNCiAgICAgICAgICAgICAgICB3aGlsZSAoIWZlb2YoJHBpcGVzWzFdKSkgew0KICAgICAgICAgICAgICAgICAgICBlY2hvIGZnZXRzKCRwaXBlc1sxXSwgMTAyNCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZjbG9zZSgkcGlwZXNbMV0pOw0KICAgICAgICAgICAgICAgIHdoaWxlICghZmVvZigkcGlwZXNbMl0pKSB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gZmdldHMoJHBpcGVzWzJdLCAxMDI0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZmNsb3NlKCRwaXBlc1syXSk7DQogICAgICAgICAgICAgICAgcHJvY19jbG9zZSgkcHJvY2Vzcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBlY2hvIChleGVjdXRlKCRjb21tYW5kKSk7DQogICAgICAgIH0NCiAgICAgICAgcCgnPC9wcmU+Jyk7DQogICAgfQ0KfSAvL2VuZCBzaGVsbA0KZWxzZWlmICgkYWN0aW9uID09ICdwaHBlbnYnKSB7DQogICAgJHVwc2l6ZSA9IGdldGNmZygnZmlsZV91cGxvYWRzJykgPyBnZXRjZmcoJ3VwbG9hZF9tYXhfZmlsZXNpemUnKSA6ICdOb3QgYWxsb3dlZCc7DQogICAgJGFkbWlubWFpbCA9IGlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSkgPyAkX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10gOiBnZXRjZmcoJ3NlbmRtYWlsX2Zyb20nKTsNCiAgICAhJGRpc19mdW5jICYmICRkaXNfZnVuYyA9ICdObyc7DQogICAgJGluZm8gPSBhcnJheSgxID0+IGFycmF5KCdTZXJ2ZXIgVGltZScsIGRhdGUoJ1kvbS9kIGg6aTpzJywgJHRpbWVzdGFtcCkpLCAyID0+IGFycmF5KCdTZXJ2ZXIgRG9tYWluJywgJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLCAzID0+IGFycmF5KCdTZXJ2ZXIgSVAnLCBnZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKSksIDQgPT4gYXJyYXkoJ1NlcnZlciBPUycsIFBIUF9PUyksIDUgPT4gYXJyYXkoJ1NlcnZlciBPUyBDaGFyc2V0JywgJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pLCA2ID0+IGFycmF5KCdTZXJ2ZXIgU29mdHdhcmUnLCAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pLCA3ID0+IGFycmF5KCdTZXJ2ZXIgV2ViIFBvcnQnLCAkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSksIDggPT4gYXJyYXkoJ1BIUCBydW4gbW9kZScsIHN0cnRvdXBwZXIocGhwX3NhcGlfbmFtZSgpKSksIDkgPT4gYXJyYXkoJ1RoZSBmaWxlIHBhdGgnLCBfX0ZJTEVfXyksIDEwID0+IGFycmF5KCdQSFAgVmVyc2lvbicsIFBIUF9WRVJTSU9OKSwgMTEgPT4gYXJyYXkoJ1BIUElORk8nLCAoSVNfUEhQSU5GTyA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKFwncGhwaW5mb1wnKTsiPlllczwvYT4nIDogJ05vJykpLCAxMiA9PiBhcnJheSgnU2FmZSBNb2RlJywgZ2V0Y2ZnKCdzYWZlX21vZGUnKSksIDEzID0+IGFycmF5KCdBZG1pbmlzdHJhdG9yJywgJGFkbWlubWFpbCksIDE0ID0+IGFycmF5KCdhbGxvd191cmxfZm9wZW4nLCBnZXRjZmcoJ2FsbG93X3VybF9mb3BlbicpKSwgMTUgPT4gYXJyYXkoJ2VuYWJsZV9kbCcsIGdldGNmZygnZW5hYmxlX2RsJykpLCAxNiA9PiBhcnJheSgnZGlzcGxheV9lcnJvcnMnLCBnZXRjZmcoJ2Rpc3BsYXlfZXJyb3JzJykpLCAxNyA9PiBhcnJheSgncmVnaXN0ZXJfZ2xvYmFscycsIGdldGNmZygncmVnaXN0ZXJfZ2xvYmFscycpKSwgMTggPT4gYXJyYXkoJ21hZ2ljX3F1b3Rlc19ncGMnLCBnZXRjZmcoJ21hZ2ljX3F1b3Rlc19ncGMnKSksIDE5ID0+IGFycmF5KCdtZW1vcnlfbGltaXQnLCBnZXRjZmcoJ21lbW9yeV9saW1pdCcpKSwgMjAgPT4gYXJyYXkoJ3Bvc3RfbWF4X3NpemUnLCBnZXRjZmcoJ3Bvc3RfbWF4X3NpemUnKSksIDIxID0+IGFycmF5KCd1cGxvYWRfbWF4X2ZpbGVzaXplJywgJHVwc2l6ZSksIDIyID0+IGFycmF5KCdtYXhfZXhlY3V0aW9uX3RpbWUnLCBnZXRjZmcoJ21heF9leGVjdXRpb25fdGltZScpIC4gJyBzZWNvbmQocyknKSwgMjMgPT4gYXJyYXkoJ2Rpc2FibGVfZnVuY3Rpb25zJywgJGRpc19mdW5jKSwpOw0KICAgIGlmICgkcGhwdmFybmFtZSkgew0KICAgICAgICBtKCRwaHB2YXJuYW1lIC4gJyA6ICcgLiBnZXRjZmcoJHBocHZhcm5hbWUpKTsNCiAgICB9DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnU2VydmVyIGVudmlyb25tZW50JykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAncGhwZW52Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZScgPT4gJ1BsZWFzZSBpbnB1dCBQSFAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIoZWc6bWFnaWNfcXVvdGVzX2dwYyknLCAnbmFtZScgPT4gJ3BocHZhcm5hbWUnLCAndmFsdWUnID0+ICRwaHB2YXJuYW1lLCAnbmV3bGluZScgPT4gMSkpOw0KICAgIGZvcm1mb290ZXIoKTsNCiAgICAkaHAgPSBhcnJheSgwID0+ICdTZXJ2ZXInLCAxID0+ICdQSFAnKTsNCiAgICBmb3IgKCRhID0gMDskYSA8IDI7JGErKykgew0KICAgICAgICBwKCc8aDI+JyAuICRocFskYV0gLiAnICZyYXF1bzs8L2gyPicpOw0KICAgICAgICBwKCc8dWwgY2xhc3M9ImluZm8iPicpOw0KICAgICAgICBpZiAoJGEgPT0gMCkgew0KICAgICAgICAgICAgZm9yICgkaSA9IDE7JGkgPD0gOTskaSsrKSB7DQogICAgICAgICAgICAgICAgcCgnPGxpPjx1PicgLiAkaW5mb1skaV1bMF0gLiAnOjwvdT4nIC4gJGluZm9bJGldWzFdIC4gJzwvbGk+Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZWlmICgkYSA9PSAxKSB7DQogICAgICAgICAgICBmb3IgKCRpID0gMTA7JGkgPD0gMjM7JGkrKykgew0KICAgICAgICAgICAgICAgIHAoJzxsaT48dT4nIC4gJGluZm9bJGldWzBdIC4gJzo8L3U+JyAuICRpbmZvWyRpXVsxXSAuICc8L2xpPicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHAoJzwvdWw+Jyk7DQogICAgfQ0KfSAvL2VuZCBwaHBlbnYNCmVsc2Ugew0KICAgIG0oJ1VuZGVmaW5lZCBBY3Rpb24nKTsNCn0NCj8+DQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjMEUwRTBFO2JvcmRlci10b3A6MXB4IHNvbGlkICMwRTBFMEU7YmFja2dyb3VuZDojMEUwRTBFOyI+DQoJPHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PD9waHAgZGVidWdpbmZvKCk7DQpvYl9lbmRfZmx1c2goKTsgPz48L3NwYW4+DQoJQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgPEI+PC9CPiAtIERldmVsb3AgYnkgPGEgaHJlZj1odHRwOi8vYmV5ZXVncm91cC5jb20gdGFyZ2V0PV9ibGFuaz48Qj5CWUcgICA8L0I+PC9hPiAtIDxCPi0gVGhlIExlZ2VuZCBvZiBWaWV0bmFtZXNlIEhhY2tlciBXb3JsZDwvQj4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0KDQo8P3BocA0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClNob3cgaW5mbyBzaGVsbA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCmZ1bmN0aW9uIG0oJG1zZykgew0KICAgIGVjaG8gJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2YxZjFmMTtib3JkZXI6MXB4IHNvbGlkICNkZGQ7cGFkZGluZzoxNXB4O2ZvbnQ6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDpib2xkOyI+JzsNCiAgICBlY2hvICRtc2c7DQogICAgZWNobyAnPC9kaXY+JzsNCn0NCmZ1bmN0aW9uIHNjb29raWUoJGtleSwgJHZhbHVlLCAkbGlmZSA9IDAsICRwcmVmaXggPSAxKSB7DQogICAgZ2xvYmFsICRhZG1pbiwgJHRpbWVzdGFtcCwgJF9TRVJWRVI7DQogICAgJGtleSA9ICgkcHJlZml4ID8gJGFkbWluWydjb29raWVwcmUnXSA6ICcnKSAuICRrZXk7DQogICAgJGxpZmUgPSAkbGlmZSA/ICRsaWZlIDogJGFkbWluWydjb29raWVsaWZlJ107DQogICAgJHVzZXBvcnQgPSAkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSA9PSA0NDMgPyAxIDogMDsNCiAgICBzZXRjb29raWUoJGtleSwgJHZhbHVlLCAkdGltZXN0YW1wICsgJGxpZmUsICRhZG1pblsnY29va2llcGF0aCddLCAkYWRtaW5bJ2Nvb2tpZWRvbWFpbiddLCAkdXNlcG9ydCk7DQp9DQpmdW5jdGlvbiBtdWx0aSgkbnVtLCAkcGVycGFnZSwgJGN1cnBhZ2UsICR0YWJsZW5hbWUpIHsNCiAgICAkbXVsdGlwYWdlID0gJyc7DQogICAgaWYgKCRudW0gPiAkcGVycGFnZSkgew0KICAgICAgICAkcGFnZSA9IDEwOw0KICAgICAgICAkb2Zmc2V0ID0gNTsNCiAgICAgICAgJHBhZ2VzID0gQGNlaWwoJG51bSAvICRwZXJwYWdlKTsNCiAgICAgICAgaWYgKCRwYWdlID4gJHBhZ2VzKSB7DQogICAgICAgICAgICAkZnJvbSA9IDE7DQogICAgICAgICAgICAkdG8gPSAkcGFnZXM7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkZnJvbSA9ICRjdXJwYWdlIC0gJG9mZnNldDsNCiAgICAgICAgICAgICR0byA9ICRjdXJwYWdlICsgJHBhZ2UgLSAkb2Zmc2V0IC0gMTsNCiAgICAgICAgICAgIGlmICgkZnJvbSA8IDEpIHsNCiAgICAgICAgICAgICAgICAkdG8gPSAkY3VycGFnZSArIDEgLSAkZnJvbTsNCiAgICAgICAgICAgICAgICAkZnJvbSA9IDE7DQogICAgICAgICAgICAgICAgaWYgKCgkdG8gLSAkZnJvbSkgPCAkcGFnZSAmJiAoJHRvIC0gJGZyb20pIDwgJHBhZ2VzKSB7DQogICAgICAgICAgICAgICAgICAgICR0byA9ICRwYWdlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZWlmICgkdG8gPiAkcGFnZXMpIHsNCiAgICAgICAgICAgICAgICAkZnJvbSA9ICRjdXJwYWdlIC0gJHBhZ2VzICsgJHRvOw0KICAgICAgICAgICAgICAgICR0byA9ICRwYWdlczsNCiAgICAgICAgICAgICAgICBpZiAoKCR0byAtICRmcm9tKSA8ICRwYWdlICYmICgkdG8gLSAkZnJvbSkgPCAkcGFnZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgJGZyb20gPSAkcGFnZXMgLSAkcGFnZSArIDE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgICRtdWx0aXBhZ2UgPSAoJGN1cnBhZ2UgLSAkb2Zmc2V0ID4gMSAmJiAkcGFnZXMgPiAkcGFnZSA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJyAuICR0YWJsZW5hbWUgLiAnXCcsIFwnXCcsIDEpOyI+Rmlyc3Q8L2E+ICcgOiAnJykgLiAoJGN1cnBhZ2UgPiAxID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlbmFtZSAuICdcJywgXCdcJywgJyAuICgkY3VycGFnZSAtIDEpIC4gJyk7Ij5QcmV2PC9hPiAnIDogJycpOw0KICAgICAgICBmb3IgKCRpID0gJGZyb207JGkgPD0gJHRvOyRpKyspIHsNCiAgICAgICAgICAgICRtdWx0aXBhZ2UuPSAkaSA9PSAkY3VycGFnZSA/ICRpIC4gJyAnIDogJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlbmFtZSAuICdcJywgXCdcJywgJyAuICRpIC4gJyk7Ij5bJyAuICRpIC4gJ108L2E+ICc7DQogICAgICAgIH0NCiAgICAgICAgJG11bHRpcGFnZS49ICgkY3VycGFnZSA8ICRwYWdlcyA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJyAuICR0YWJsZW5hbWUgLiAnXCcsIFwnXCcsICcgLiAoJGN1cnBhZ2UgKyAxKSAuICcpOyI+TmV4dDwvYT4nIDogJycpIC4gKCR0byA8ICRwYWdlcyA/ICcgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycgLiAkdGFibGVuYW1lIC4gJ1wnLCBcJ1wnLCAnIC4gJHBhZ2VzIC4gJyk7Ij5MYXN0PC9hPicgOiAnJyk7DQogICAgICAgICRtdWx0aXBhZ2UgPSAkbXVsdGlwYWdlID8gJzxwPlBhZ2VzOiAnIC4gJG11bHRpcGFnZSAuICc8L3A+JyA6ICcnOw0KICAgIH0NCiAgICByZXR1cm4gJG11bHRpcGFnZTsNCn0NCi8vIExvZ2luIHBhZ2UNCmZ1bmN0aW9uIGxvZ2lucGFnZSgpIHsNCj8+DQo8aHRtbD4NCjxoZWFkPg0KDQo8Ym9keSBiZ2NvbG9yPWJsYWNrIGJhY2tncm91bmQ9MS5qcGc+DQoNCgkJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+DQo8dGl0bGU+QllHIC0gVGhlIExlZ2VuZCBvZiBWaWV0bmFtZXNlIEhhY2tlciBXb3JsZCA8L3RpdGxlPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCkE6bGluayB7dGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogZ3JlZW4gfQ0KQTp2aXNpdGVkIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6cmVkfQ0KQTphY3RpdmUge3RleHQtZGVjb3JhdGlvbjogbm9uZX0NCkE6aG92ZXIge3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogZ3JlZW47fQ0KaW5wdXQsIHRleHRhcmVhLCBidXR0b24NCnsNCglmb250LXNpemU6IDExcHQ7DQoJY29sb3I6IAkjRkZGRkZGOw0KCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOw0KCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7DQoJYm9yZGVyLWxlZnQ6IDJweCBkYXNoZWQgIzhCMDAwMDsNCglib3JkZXItdG9wOiAycHggZGFzaGVkICM4QjAwMDA7DQoJYm9yZGVyLXJpZ2h0OiAycHggZGFzaGVkICM4QjAwMDA7DQoJYm9yZGVyLWJvdHRvbTogMnB4IGRhc2hlZCAjOEIwMDAwOw0KfQ0KDQo8L3N0eWxlPg0KDQogICAgICAgPEJSPjxCUj4NCjxkaXYgYWxpZ249Y2VudGVyID4NCg0KPGRpdj4NCjxmb250IGNvbG9yPWdyYXk+DQo8YnIgLz48YnIgLz48YnIgLz48YnIgLz48YnIgLz4NCg0KPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+DQoJPHNwYW4gc3R5bGU9ImZvbnQ6MjBwdCB0YWhvbWE7Ij4gPC9zcGFuPjxpbnB1dCBuYW1lPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiIHNpemU9IjMwIj4NCgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkb2luZyIgdmFsdWU9ImxvZ2luIj4NCgk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9naW4iPg0KCTwvZm9ybT4NCjxCUj4NCjw/cGhwDQogICAgZWNobyAiIiAuICRlcnJfbWVzcyAuICIiOw0KPz4NCg0KCTxCPjxmb250IGNvbG9yPXJlZD4NCg0KDQoNCg0KDQoNCjwvZGl2Pg0KDQoNCgk8L2ZpZWxkc2V0Pg0KDQoNCg0KPC9oZWFkPg0KPC9odG1sPg0KDQoNCjw/cGhwDQogICAgZXhpdDsNCn0gLy9lbmQgbG9naW5wYWdlKCkNCmZ1bmN0aW9uIGV4ZWN1dGUoJGNmZSkgew0KICAgICRyZXMgPSAnJzsNCiAgICBpZiAoJGNmZSkgew0KICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsNCiAgICAgICAgICAgIEBleGVjKCRjZmUsICRyZXMpOw0KICAgICAgICAgICAgJHJlcyA9IGpvaW4oIlxuIiwgJHJlcyk7DQogICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KICAgICAgICAgICAgJHJlcyA9IEBzaGVsbF9leGVjKCRjZmUpOw0KICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KICAgICAgICAgICAgQG9iX3N0YXJ0KCk7DQogICAgICAgICAgICBAc3lzdGVtKCRjZmUpOw0KICAgICAgICAgICAgJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsNCiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTsNCiAgICAgICAgfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgew0KICAgICAgICAgICAgQG9iX3N0YXJ0KCk7DQogICAgICAgICAgICBAcGFzc3RocnUoJGNmZSk7DQogICAgICAgICAgICAkcmVzID0gQG9iX2dldF9jb250ZW50cygpOw0KICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpOw0KICAgICAgICB9IGVsc2VpZiAoQGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRjZmUsICJyIikpKSB7DQogICAgICAgICAgICAkcmVzID0gJyc7DQogICAgICAgICAgICB3aGlsZSAoIUBmZW9mKCRmKSkgew0KICAgICAgICAgICAgICAgICRyZXMuPSBAZnJlYWQoJGYsIDEwMjQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgQHBjbG9zZSgkZik7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuICRyZXM7DQp9DQpmdW5jdGlvbiB3aGljaCgkcHIpIHsNCiAgICAkcGF0aCA9IGV4ZWN1dGUoIndoaWNoICRwciIpOw0KICAgIHJldHVybiAoJHBhdGggPyAkcGF0aCA6ICRwcik7DQp9DQpmdW5jdGlvbiBjZigkZm5hbWUsICR0ZXh0KSB7DQogICAgaWYgKCRmcCA9IEBmb3BlbigkZm5hbWUsICd3JykpIHsNCiAgICAgICAgQGZwdXRzKCRmcCwgYmFzZTY0X2RlY29kZSgkdGV4dCkpOw0KICAgICAgICBAZmNsb3NlKCRmcCk7DQogICAgfQ0KfQ0KLy8gRGVidWcNCmZ1bmN0aW9uIGRlYnVnaW5mbygpIHsNCiAgICBnbG9iYWwgJHN0YXJ0dGltZTsNCiAgICAkbXRpbWUgPSBleHBsb2RlKCcgJywgbWljcm90aW1lKCkpOw0KICAgICR0b3RhbHRpbWUgPSBudW1iZXJfZm9ybWF0KCgkbXRpbWVbMV0gKyAkbXRpbWVbMF0gLSAkc3RhcnR0aW1lKSwgNik7DQogICAgZWNobyAnUHJvY2Vzc2VkIGluICcgLiAkdG90YWx0aW1lIC4gJyBzZWNvbmQocyknOw0KfQ0KLy8gRnVuY3Rpb24gY29ubmVjdCBkYXRhYmFzZQ0KZnVuY3Rpb24gZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUgPSAnJywgJGNoYXJzZXQgPSAnJywgJGRicG9ydCA9ICczMzA2Jykgew0KICAgIGlmICghJGxpbmsgPSBAbXlzcWxfY29ubmVjdCgkZGJob3N0IC4gJzonIC4gJGRicG9ydCwgJGRidXNlciwgJGRicGFzcykpIHsNCiAgICAgICAgcCgnPGgyPkNhbiBub3QgY29ubmVjdCB0byBNeVNRTCBzZXJ2ZXI8L2gyPicpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgICBpZiAoJGxpbmsgJiYgJGRibmFtZSkgew0KICAgICAgICBpZiAoIUBteXNxbF9zZWxlY3RfZGIoJGRibmFtZSwgJGxpbmspKSB7DQogICAgICAgICAgICBwKCc8aDI+RGF0YWJhc2Ugc2VsZWN0ZWQgaGFzIGVycm9yPC9oMj4nKTsNCiAgICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKCRsaW5rICYmIG15c3FsX2dldF9zZXJ2ZXJfaW5mbygpID4gJzQuMScpIHsNCiAgICAgICAgaWYgKGluX2FycmF5KHN0cnRvbG93ZXIoJGNoYXJzZXQpLCBhcnJheSgnZ2JrJywgJ2JpZzUnLCAndXRmOCcpKSkgew0KICAgICAgICAgICAgcSgiU0VUIGNoYXJhY3Rlcl9zZXRfY29ubmVjdGlvbj0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9yZXN1bHRzPSRjaGFyc2V0LCBjaGFyYWN0ZXJfc2V0X2NsaWVudD1iaW5hcnk7IiwgJGxpbmspOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiAkbGluazsNCn0NCi8vIEFycmF5IHN0cmlwDQpmdW5jdGlvbiBzX2FycmF5KCYkYXJyYXkpIHsNCiAgICBpZiAoaXNfYXJyYXkoJGFycmF5KSkgew0KICAgICAgICBmb3JlYWNoICgkYXJyYXkgYXMgJGsgPT4gJHYpIHsNCiAgICAgICAgICAgICRhcnJheVska10gPSBzX2FycmF5KCR2KTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSBpZiAoaXNfc3RyaW5nKCRhcnJheSkpIHsNCiAgICAgICAgJGFycmF5ID0gc3RyaXBzbGFzaGVzKCRhcnJheSk7DQogICAgfQ0KICAgIHJldHVybiAkYXJyYXk7DQp9DQovLyBIVE1MIFN0cmlwDQpmdW5jdGlvbiBodG1sX2NsZWFuKCRjb250ZW50KSB7DQogICAgJGNvbnRlbnQgPSBodG1sc3BlY2lhbGNoYXJzKCRjb250ZW50KTsNCiAgICAkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcbiIsICI8YnIgLz4iLCAkY29udGVudCk7DQogICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IiwgJGNvbnRlbnQpOw0KICAgICRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlx0IiwgIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsNCiAgICByZXR1cm4gJGNvbnRlbnQ7DQp9DQovLyBDaG1vZA0KZnVuY3Rpb24gZ2V0Q2htb2QoJGZpbGVwYXRoKSB7DQogICAgcmV0dXJuIHN1YnN0cihiYXNlX2NvbnZlcnQoQGZpbGVwZXJtcygkZmlsZXBhdGgpLCAxMCwgOCksIC00KTsNCn0NCmZ1bmN0aW9uIGdldFBlcm1zKCRmaWxlcGF0aCkgew0KICAgICRtb2RlID0gQGZpbGVwZXJtcygkZmlsZXBhdGgpOw0KICAgIGlmICgoJG1vZGUgJiAweEMwMDApID09PSAweEMwMDApIHsNCiAgICAgICAgJHR5cGUgPSAncyc7DQogICAgfSBlbHNlaWYgKCgkbW9kZSAmIDB4NDAwMCkgPT09IDB4NDAwMCkgew0KICAgICAgICAkdHlwZSA9ICdkJzsNCiAgICB9IGVsc2VpZiAoKCRtb2RlICYgMHhBMDAwKSA9PT0gMHhBMDAwKSB7DQogICAgICAgICR0eXBlID0gJ2wnOw0KICAgIH0gZWxzZWlmICgoJG1vZGUgJiAweDgwMDApID09PSAweDgwMDApIHsNCiAgICAgICAgJHR5cGUgPSAnLSc7DQogICAgfSBlbHNlaWYgKCgkbW9kZSAmIDB4NjAwMCkgPT09IDB4NjAwMCkgew0KICAgICAgICAkdHlwZSA9ICdiJzsNCiAgICB9IGVsc2VpZiAoKCRtb2RlICYgMHgyMDAwKSA9PT0gMHgyMDAwKSB7DQogICAgICAgICR0eXBlID0gJ2MnOw0KICAgIH0gZWxzZWlmICgoJG1vZGUgJiAweDEwMDApID09PSAweDEwMDApIHsNCiAgICAgICAgJHR5cGUgPSAncCc7DQogICAgfSBlbHNlIHsNCiAgICAgICAgJHR5cGUgPSAnPyc7DQogICAgfQ0KICAgICRvd25lclsncmVhZCddID0gKCRtb2RlICYgMDA0MDApID8gJ3InIDogJy0nOw0KICAgICRvd25lclsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMjAwKSA/ICd3JyA6ICctJzsNCiAgICAkb3duZXJbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMTAwKSA/ICd4JyA6ICctJzsNCiAgICAkZ3JvdXBbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwMDQwKSA/ICdyJyA6ICctJzsNCiAgICAkZ3JvdXBbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDAyMCkgPyAndycgOiAnLSc7DQogICAgJGdyb3VwWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDAxMCkgPyAneCcgOiAnLSc7DQogICAgJHdvcmxkWydyZWFkJ10gPSAoJG1vZGUgJiAwMDAwNCkgPyAncicgOiAnLSc7DQogICAgJHdvcmxkWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMDIpID8gJ3cnIDogJy0nOw0KICAgICR3b3JsZFsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAwMDEpID8gJ3gnIDogJy0nOw0KICAgIGlmICgkbW9kZSAmIDB4ODAwKSB7DQogICAgICAgICRvd25lclsnZXhlY3V0ZSddID0gKCRvd25lclsnZXhlY3V0ZSddID09ICd4JykgPyAncycgOiAnUyc7DQogICAgfQ0KICAgIGlmICgkbW9kZSAmIDB4NDAwKSB7DQogICAgICAgICRncm91cFsnZXhlY3V0ZSddID0gKCRncm91cFsnZXhlY3V0ZSddID09ICd4JykgPyAncycgOiAnUyc7DQogICAgfQ0KICAgIGlmICgkbW9kZSAmIDB4MjAwKSB7DQogICAgICAgICR3b3JsZFsnZXhlY3V0ZSddID0gKCR3b3JsZFsnZXhlY3V0ZSddID09ICd4JykgPyAndCcgOiAnVCc7DQogICAgfQ0KICAgIHJldHVybiAkdHlwZSAuICRvd25lclsncmVhZCddIC4gJG93bmVyWyd3cml0ZSddIC4gJG93bmVyWydleGVjdXRlJ10gLiAkZ3JvdXBbJ3JlYWQnXSAuICRncm91cFsnd3JpdGUnXSAuICRncm91cFsnZXhlY3V0ZSddIC4gJHdvcmxkWydyZWFkJ10gLiAkd29ybGRbJ3dyaXRlJ10gLiAkd29ybGRbJ2V4ZWN1dGUnXTsNCn0NCmZ1bmN0aW9uIGdldFVzZXIoJGZpbGVwYXRoKSB7DQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSkgew0KICAgICAgICAkYXJyYXkgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZmlsZXBhdGgpKTsNCiAgICAgICAgaWYgKCRhcnJheSAmJiBpc19hcnJheSgkYXJyYXkpKSB7DQogICAgICAgICAgICByZXR1cm4gJyAvIDxhIGhyZWY9IiMiIHRpdGxlPSJVc2VyOiAnIC4gJGFycmF5WyduYW1lJ10gLiAnJiMxMyYjMTBQYXNzd2Q6ICcgLiAkYXJyYXlbJ3Bhc3N3ZCddIC4gJyYjMTMmIzEwVWlkOiAnIC4gJGFycmF5Wyd1aWQnXSAuICcmIzEzJiMxMGdpZDogJyAuICRhcnJheVsnZ2lkJ10gLiAnJiMxMyYjMTBHZWNvczogJyAuICRhcnJheVsnZ2Vjb3MnXSAuICcmIzEzJiMxMERpcjogJyAuICRhcnJheVsnZGlyJ10gLiAnJiMxMyYjMTBTaGVsbDogJyAuICRhcnJheVsnc2hlbGwnXSAuICciPicgLiAkYXJyYXlbJ25hbWUnXSAuICc8L2E+JzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gJyc7DQp9DQovLyBEZWxldGUgZGlyDQpmdW5jdGlvbiBkZWx0cmVlKCRkZWxkaXIpIHsNCiAgICAkbXlkaXIgPSBAZGlyKCRkZWxkaXIpOw0KICAgIHdoaWxlICgkZmlsZSA9ICRteWRpci0+cmVhZCgpKSB7DQogICAgICAgIGlmICgoaXNfZGlyKCRkZWxkaXIgLiAnLycgLiAkZmlsZSkpICYmICgkZmlsZSAhPSAnLicpICYmICgkZmlsZSAhPSAnLi4nKSkgew0KICAgICAgICAgICAgQGNobW9kKCRkZWxkaXIgLiAnLycgLiAkZmlsZSwgMDc3Nyk7DQogICAgICAgICAgICBkZWx0cmVlKCRkZWxkaXIgLiAnLycgLiAkZmlsZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGlzX2ZpbGUoJGRlbGRpciAuICcvJyAuICRmaWxlKSkgew0KICAgICAgICAgICAgQGNobW9kKCRkZWxkaXIgLiAnLycgLiAkZmlsZSwgMDc3Nyk7DQogICAgICAgICAgICBAdW5saW5rKCRkZWxkaXIgLiAnLycgLiAkZmlsZSk7DQogICAgICAgIH0NCiAgICB9DQogICAgJG15ZGlyLT5jbG9zZSgpOw0KICAgIEBjaG1vZCgkZGVsZGlyLCAwNzc3KTsNCiAgICByZXR1cm4gQHJtZGlyKCRkZWxkaXIpID8gMSA6IDA7DQp9DQovLyBCYWNrZ3JvdW5kDQpmdW5jdGlvbiBiZygpIHsNCiAgICBnbG9iYWwgJGJnYzsNCiAgICByZXR1cm4gKCRiZ2MrKyAlIDIgPT0gMCkgPyAnYWx0MScgOiAnYWx0Mic7DQp9DQovLyBHZXQgcGF0aA0KZnVuY3Rpb24gZ2V0UGF0aCgkc2NyaXB0cGF0aCwgJG5vd3BhdGgpIHsNCiAgICBpZiAoJG5vd3BhdGggPT0gJy4nKSB7DQogICAgICAgICRub3dwYXRoID0gJHNjcmlwdHBhdGg7DQogICAgfQ0KICAgICRub3dwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm93cGF0aCk7DQogICAgJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRub3dwYXRoKTsNCiAgICBpZiAoc3Vic3RyKCRub3dwYXRoLCAtMSkgIT0gJy8nKSB7DQogICAgICAgICRub3dwYXRoID0gJG5vd3BhdGggLiAnLyc7DQogICAgfQ0KICAgIHJldHVybiAkbm93cGF0aDsNCn0NCi8vIEdldCB1cCBwYXRoDQpmdW5jdGlvbiBnZXRVcFBhdGgoJG5vd3BhdGgpIHsNCiAgICAkcGF0aGRiID0gZXhwbG9kZSgnLycsICRub3dwYXRoKTsNCiAgICAkbnVtID0gY291bnQoJHBhdGhkYik7DQogICAgaWYgKCRudW0gPiAyKSB7DQogICAgICAgIHVuc2V0KCRwYXRoZGJbJG51bSAtIDFdLCAkcGF0aGRiWyRudW0gLSAyXSk7DQogICAgfQ0KICAgICR1cHBhdGggPSBpbXBsb2RlKCcvJywgJHBhdGhkYikgLiAnLyc7DQogICAgJHVwcGF0aCA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJHVwcGF0aCk7DQogICAgcmV0dXJuICR1cHBhdGg7DQp9DQovLyBDb25maWcNCmZ1bmN0aW9uIGdldGNmZygkdmFybmFtZSkgew0KICAgICRyZXN1bHQgPSBnZXRfY2ZnX3ZhcigkdmFybmFtZSk7DQogICAgaWYgKCRyZXN1bHQgPT0gMCkgew0KICAgICAgICByZXR1cm4gJ05vJzsNCiAgICB9IGVsc2VpZiAoJHJlc3VsdCA9PSAxKSB7DQogICAgICAgIHJldHVybiAnWWVzJzsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gJHJlc3VsdDsNCiAgICB9DQp9DQovLyBGdW5jdGlvbiBuYW1lDQpmdW5jdGlvbiBnZXRmdW4oJGZ1bk5hbWUpIHsNCiAgICByZXR1cm4gKGZhbHNlICE9PSBmdW5jdGlvbl9leGlzdHMoJGZ1bk5hbWUpKSA/ICdZZXMnIDogJ05vJzsNCn0NCmZ1bmN0aW9uIEdldExpc3QoJGRpcikgew0KICAgIGdsb2JhbCAkZGlyZGF0YSwgJGosICRub3dwYXRoOw0KICAgICEkaiAmJiAkaiA9IDE7DQogICAgaWYgKCRkaCA9IG9wZW5kaXIoJGRpcikpIHsNCiAgICAgICAgd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7DQogICAgICAgICAgICAkZiA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJGRpciAuICcvJyAuICRmaWxlKTsNCiAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJyAmJiBpc19kaXIoJGYpKSB7DQogICAgICAgICAgICAgICAgaWYgKGlzX3dyaXRhYmxlKCRmKSkgew0KICAgICAgICAgICAgICAgICAgICAkZGlyZGF0YVskal1bJ2ZpbGVuYW1lJ10gPSBzdHJfcmVwbGFjZSgkbm93cGF0aCwgJycsICRmKTsNCiAgICAgICAgICAgICAgICAgICAgJGRpcmRhdGFbJGpdWydtdGltZSddID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgZmlsZW10aW1lKCRmKSk7DQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnZGlyY2htb2QnXSA9IGdldENobW9kKCRmKTsNCiAgICAgICAgICAgICAgICAgICAgJGRpcmRhdGFbJGpdWydkaXJwZXJtJ10gPSBnZXRQZXJtcygkZik7DQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnZGlybGluayddID0gdWUoJGRpcik7DQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnc2VydmVyX2xpbmsnXSA9ICRmOw0KICAgICAgICAgICAgICAgICAgICAkZGlyZGF0YVskal1bJ2NsaWVudF9saW5rJ10gPSB1ZSgkZik7DQogICAgICAgICAgICAgICAgICAgICRqKys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIEdldExpc3QoJGYpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGNsb3NlZGlyKCRkaCk7DQogICAgICAgIGNsZWFyc3RhdGNhY2hlKCk7DQogICAgICAgIHJldHVybiAkZGlyZGF0YTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gYXJyYXkoKTsNCiAgICB9DQp9DQpmdW5jdGlvbiBxeSgkc3FsKSB7DQogICAgLy9lY2hvICRzcWwuJzxicj4nOw0KICAgICRyZXMgPSAkZXJyb3IgPSAnJzsNCiAgICBpZiAoISRyZXMgPSBAbXlzcWxfcXVlcnkoJHNxbCkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgfSBlbHNlIGlmIChpc19yZXNvdXJjZSgkcmVzKSkgew0KICAgICAgICByZXR1cm4gMTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gMjsNCiAgICB9DQogICAgcmV0dXJuIDA7DQp9DQpmdW5jdGlvbiBxKCRzcWwpIHsNCiAgICByZXR1cm4gQG15c3FsX3F1ZXJ5KCRzcWwpOw0KfQ0KZnVuY3Rpb24gZnIoJHF5KSB7DQogICAgbXlzcWxfZnJlZV9yZXN1bHQoJHF5KTsNCn0NCmZ1bmN0aW9uIHNpemVjb3VudCgkc2l6ZSkgew0KICAgIGlmICgkc2l6ZSA+IDEwNzM3NDE4MjQpIHsNCiAgICAgICAgJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4gJyBHJzsNCiAgICB9IGVsc2VpZiAoJHNpemUgPiAxMDQ4NTc2KSB7DQogICAgICAgICRzaXplID0gcm91bmQoJHNpemUgLyAxMDQ4NTc2ICogMTAwKSAvIDEwMCAuICcgTSc7DQogICAgfSBlbHNlaWYgKCRzaXplID4gMTAyNCkgew0KICAgICAgICAkc2l6ZSA9IHJvdW5kKCRzaXplIC8gMTAyNCAqIDEwMCkgLyAxMDAgLiAnIEsnOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRzaXplID0gJHNpemUgLiAnIEInOw0KICAgIH0NCiAgICByZXR1cm4gJHNpemU7DQp9DQovLyBaaXANCmNsYXNzIFBIUFppcCB7DQogICAgdmFyICRvdXQgPSAnJzsNCiAgICBmdW5jdGlvbiBQSFBaaXAoJGRpcikgew0KICAgICAgICBpZiAoQGZ1bmN0aW9uX2V4aXN0cygnZ3pjb21wcmVzcycpKSB7DQogICAgICAgICAgICAkY3VyZGlyID0gZ2V0Y3dkKCk7DQogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRpcikpICRmaWxlbGlzdCA9ICRkaXI7DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZmlsZWxpc3QgPSAkdGhpcy0+R2V0RmlsZUxpc3QoJGRpcik7IC8vRmlsZSBsaXN0DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVsaXN0IGFzICRrID0+ICR2KSAkZmlsZWxpc3RbXSA9IHN1YnN0cigkdiwgc3RybGVuKCRkaXIpICsgMSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoKCFlbXB0eSgkZGlyKSkgJiYgKCFpc19hcnJheSgkZGlyKSkgJiYgKGZpbGVfZXhpc3RzKCRkaXIpKSkgY2hkaXIoJGRpcik7DQogICAgICAgICAgICBlbHNlIGNoZGlyKCRjdXJkaXIpOw0KICAgICAgICAgICAgaWYgKGNvdW50KCRmaWxlbGlzdCkgPiAwKSB7DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVsaXN0IGFzICRmaWxlbmFtZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZmlsZSgkZmlsZW5hbWUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZmQgPSBmb3BlbigkZmlsZW5hbWUsICdyJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9IEBmcmVhZCgkZmQsIGZpbGVzaXplKCRmaWxlbmFtZSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCRmZCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRpcikpICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRmaWxlbmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YWRkRmlsZSgkY29udGVudCwgJGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkdGhpcy0+b3V0ID0gJHRoaXMtPmZpbGUoKTsNCiAgICAgICAgICAgICAgICBjaGRpcigkY3VyZGlyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9IGVsc2UgcmV0dXJuIDA7DQogICAgfQ0KICAgIC8vIFNob3cgZmlsZSBsaXN0DQogICAgZnVuY3Rpb24gR2V0RmlsZUxpc3QoJGRpcikgew0KICAgICAgICBzdGF0aWMgJGE7DQogICAgICAgIGlmIChpc19kaXIoJGRpcikpIHsNCiAgICAgICAgICAgIGlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7DQogICAgICAgICAgICAgICAgd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGYgPSAkZGlyIC4gJy8nIC4gJGZpbGU7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRmKSkgJHRoaXMtPkdldEZpbGVMaXN0KCRmKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRhW10gPSAkZjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjbG9zZWRpcigkZGgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkYTsNCiAgICB9DQogICAgdmFyICRkYXRhc2VjID0gYXJyYXkoKTsNCiAgICB2YXIgJGN0cmxfZGlyID0gYXJyYXkoKTsNCiAgICB2YXIgJGVvZl9jdHJsX2RpciA9ICJceDUwXHg0Ylx4MDVceDA2XHgwMFx4MDBceDAwXHgwMCI7DQogICAgdmFyICRvbGRfb2Zmc2V0ID0gMDsNCiAgICBmdW5jdGlvbiB1bml4MkRvc1RpbWUoJHVuaXh0aW1lID0gMCkgew0KICAgICAgICAkdGltZWFycmF5ID0gKCR1bml4dGltZSA9PSAwKSA/IGdldGRhdGUoKSA6IGdldGRhdGUoJHVuaXh0aW1lKTsNCiAgICAgICAgaWYgKCR0aW1lYXJyYXlbJ3llYXInXSA8IDE5ODApIHsNCiAgICAgICAgICAgICR0aW1lYXJyYXlbJ3llYXInXSA9IDE5ODA7DQogICAgICAgICAgICAkdGltZWFycmF5Wydtb24nXSA9IDE7DQogICAgICAgICAgICAkdGltZWFycmF5WydtZGF5J10gPSAxOw0KICAgICAgICAgICAgJHRpbWVhcnJheVsnaG91cnMnXSA9IDA7DQogICAgICAgICAgICAkdGltZWFycmF5WydtaW51dGVzJ10gPSAwOw0KICAgICAgICAgICAgJHRpbWVhcnJheVsnc2Vjb25kcyddID0gMDsNCiAgICAgICAgfSAvLyBlbmQgaWYNCiAgICAgICAgcmV0dXJuICgoJHRpbWVhcnJheVsneWVhciddIC0gMTk4MCkgPDwgMjUpIHwgKCR0aW1lYXJyYXlbJ21vbiddIDw8IDIxKSB8ICgkdGltZWFycmF5WydtZGF5J10gPDwgMTYpIHwgKCR0aW1lYXJyYXlbJ2hvdXJzJ10gPDwgMTEpIHwgKCR0aW1lYXJyYXlbJ21pbnV0ZXMnXSA8PCA1KSB8ICgkdGltZWFycmF5WydzZWNvbmRzJ10gPj4gMSk7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGFkZEZpbGUoJGRhdGEsICRuYW1lLCAkdGltZSA9IDApIHsNCiAgICAgICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRuYW1lKTsNCiAgICAgICAgJGR0aW1lID0gZGVjaGV4KCR0aGlzLT51bml4MkRvc1RpbWUoJHRpbWUpKTsNCiAgICAgICAgJGhleGR0aW1lID0gJ1x4JyAuICRkdGltZVs2XSAuICRkdGltZVs3XSAuICdceCcgLiAkZHRpbWVbNF0gLiAkZHRpbWVbNV0gLiAnXHgnIC4gJGR0aW1lWzJdIC4gJGR0aW1lWzNdIC4gJ1x4JyAuICRkdGltZVswXSAuICRkdGltZVsxXTsNCiAgICAgICAgZXZhbCgnJGhleGR0aW1lID0gIicgLiAkaGV4ZHRpbWUgLiAnIjsnKTsNCiAgICAgICAgJGZyID0gIlx4NTBceDRiXHgwM1x4MDQiOw0KICAgICAgICAkZnIuPSAiXHgxNFx4MDAiOw0KICAgICAgICAkZnIuPSAiXHgwMFx4MDAiOw0KICAgICAgICAkZnIuPSAiXHgwOFx4MDAiOw0KICAgICAgICAkZnIuPSAkaGV4ZHRpbWU7DQogICAgICAgICR1bmNfbGVuID0gc3RybGVuKCRkYXRhKTsNCiAgICAgICAgJGNyYyA9IGNyYzMyKCRkYXRhKTsNCiAgICAgICAgJHpkYXRhID0gZ3pjb21wcmVzcygkZGF0YSk7DQogICAgICAgICRjX2xlbiA9IHN0cmxlbigkemRhdGEpOw0KICAgICAgICAkemRhdGEgPSBzdWJzdHIoc3Vic3RyKCR6ZGF0YSwgMCwgc3RybGVuKCR6ZGF0YSkgLSA0KSwgMik7DQogICAgICAgICRmci49IHBhY2soJ1YnLCAkY3JjKTsNCiAgICAgICAgJGZyLj0gcGFjaygnVicsICRjX2xlbik7DQogICAgICAgICRmci49IHBhY2soJ1YnLCAkdW5jX2xlbik7DQogICAgICAgICRmci49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpKTsNCiAgICAgICAgJGZyLj0gcGFjaygndicsIDApOw0KICAgICAgICAkZnIuPSAkbmFtZTsNCiAgICAgICAgJGZyLj0gJHpkYXRhOw0KICAgICAgICAkZnIuPSBwYWNrKCdWJywgJGNyYyk7DQogICAgICAgICRmci49IHBhY2soJ1YnLCAkY19sZW4pOw0KICAgICAgICAkZnIuPSBwYWNrKCdWJywgJHVuY19sZW4pOw0KICAgICAgICAkdGhpcy0+ZGF0YXNlY1tdID0gJGZyOw0KICAgICAgICAkbmV3X29mZnNldCA9IHN0cmxlbihpbXBsb2RlKCcnLCAkdGhpcy0+ZGF0YXNlYykpOw0KICAgICAgICAkY2RyZWMgPSAiXHg1MFx4NGJceDAxXHgwMiI7DQogICAgICAgICRjZHJlYy49ICJceDAwXHgwMCI7DQogICAgICAgICRjZHJlYy49ICJceDE0XHgwMCI7DQogICAgICAgICRjZHJlYy49ICJceDAwXHgwMCI7DQogICAgICAgICRjZHJlYy49ICJceDA4XHgwMCI7DQogICAgICAgICRjZHJlYy49ICRoZXhkdGltZTsNCiAgICAgICAgJGNkcmVjLj0gcGFjaygnVicsICRjcmMpOw0KICAgICAgICAkY2RyZWMuPSBwYWNrKCdWJywgJGNfbGVuKTsNCiAgICAgICAgJGNkcmVjLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCiAgICAgICAgJGNkcmVjLj0gcGFjaygndicsIHN0cmxlbigkbmFtZSkpOw0KICAgICAgICAkY2RyZWMuPSBwYWNrKCd2JywgMCk7DQogICAgICAgICRjZHJlYy49IHBhY2soJ3YnLCAwKTsNCiAgICAgICAgJGNkcmVjLj0gcGFjaygndicsIDApOw0KICAgICAgICAkY2RyZWMuPSBwYWNrKCd2JywgMCk7DQogICAgICAgICRjZHJlYy49IHBhY2soJ1YnLCAzMik7DQogICAgICAgICRjZHJlYy49IHBhY2soJ1YnLCAkdGhpcy0+b2xkX29mZnNldCk7DQogICAgICAgICR0aGlzLT5vbGRfb2Zmc2V0ID0gJG5ld19vZmZzZXQ7DQogICAgICAgICRjZHJlYy49ICRuYW1lOw0KICAgICAgICAkdGhpcy0+Y3RybF9kaXJbXSA9ICRjZHJlYzsNCiAgICB9DQogICAgZnVuY3Rpb24gZmlsZSgpIHsNCiAgICAgICAgJGRhdGEgPSBpbXBsb2RlKCcnLCAkdGhpcy0+ZGF0YXNlYyk7DQogICAgICAgICRjdHJsZGlyID0gaW1wbG9kZSgnJywgJHRoaXMtPmN0cmxfZGlyKTsNCiAgICAgICAgcmV0dXJuICRkYXRhIC4gJGN0cmxkaXIgLiAkdGhpcy0+ZW9mX2N0cmxfZGlyIC4gcGFjaygndicsIHNpemVvZigkdGhpcy0+Y3RybF9kaXIpKSAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMtPmN0cmxfZGlyKSkgLiBwYWNrKCdWJywgc3RybGVuKCRjdHJsZGlyKSkgLiBwYWNrKCdWJywgc3RybGVuKCRkYXRhKSkgLiAiXHgwMFx4MDAiOw0KICAgIH0NCn0NCi8vIER1bXAgbXlzcWwNCmZ1bmN0aW9uIHNxbGR1bXB0YWJsZSgkdGFibGUsICRmcCA9IDApIHsNCiAgICAkdGFibGVkdW1wID0gIkRST1AgVEFCTEUgSUYgRVhJU1RTICR0YWJsZTtcbiI7DQogICAgJHRhYmxlZHVtcC49ICJDUkVBVEUgVEFCTEUgJHRhYmxlIChcbiI7DQogICAgJGZpcnN0ZmllbGQgPSAxOw0KICAgICRmaWVsZHMgPSBxKCJTSE9XIEZJRUxEUyBGUk9NICR0YWJsZSIpOw0KICAgIHdoaWxlICgkZmllbGQgPSBteXNxbF9mZXRjaF9hcnJheSgkZmllbGRzKSkgew0KICAgICAgICBpZiAoISRmaXJzdGZpZWxkKSB7DQogICAgICAgICAgICAkdGFibGVkdW1wLj0gIixcbiI7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkZmlyc3RmaWVsZCA9IDA7DQogICAgICAgIH0NCiAgICAgICAgJHRhYmxlZHVtcC49ICIgICAkZmllbGRbRmllbGRdICRmaWVsZFtUeXBlXSI7DQogICAgICAgIGlmICghZW1wdHkoJGZpZWxkWyJEZWZhdWx0Il0pKSB7DQogICAgICAgICAgICAkdGFibGVkdW1wLj0gIiBERUZBVUxUICckZmllbGRbRGVmYXVsdF0nIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGZpZWxkWydOdWxsJ10gIT0gIllFUyIpIHsNCiAgICAgICAgICAgICR0YWJsZWR1bXAuPSAiIE5PVCBOVUxMIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGZpZWxkWydFeHRyYSddICE9ICIiKSB7DQogICAgICAgICAgICAkdGFibGVkdW1wLj0gIiAkZmllbGRbRXh0cmFdIjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBmcigkZmllbGRzKTsNCiAgICAka2V5cyA9IHEoIlNIT1cgS0VZUyBGUk9NICR0YWJsZSIpOw0KICAgIHdoaWxlICgka2V5ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGtleXMpKSB7DQogICAgICAgICRrbmFtZSA9ICRrZXlbJ0tleV9uYW1lJ107DQogICAgICAgIGlmICgka25hbWUgIT0gIlBSSU1BUlkiICYmICRrZXlbJ05vbl91bmlxdWUnXSA9PSAwKSB7DQogICAgICAgICAgICAka25hbWUgPSAiVU5JUVVFfCRrbmFtZSI7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFpc19hcnJheSgkaW5kZXhbJGtuYW1lXSkpIHsNCiAgICAgICAgICAgICRpbmRleFska25hbWVdID0gYXJyYXkoKTsNCiAgICAgICAgfQ0KICAgICAgICAkaW5kZXhbJGtuYW1lXVtdID0gJGtleVsnQ29sdW1uX25hbWUnXTsNCiAgICB9DQogICAgZnIoJGtleXMpOw0KICAgIHdoaWxlIChsaXN0KCRrbmFtZSwgJGNvbHVtbnMpID0gQGVhY2goJGluZGV4KSkgew0KICAgICAgICAkdGFibGVkdW1wLj0gIixcbiI7DQogICAgICAgICRjb2xuYW1lcyA9IGltcGxvZGUoJGNvbHVtbnMsICIsIik7DQogICAgICAgIGlmICgka25hbWUgPT0gIlBSSU1BUlkiKSB7DQogICAgICAgICAgICAkdGFibGVkdW1wLj0gIiAgIFBSSU1BUlkgS0VZICgkY29sbmFtZXMpIjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmIChzdWJzdHIoJGtuYW1lLCAwLCA2KSA9PSAiVU5JUVVFIikgew0KICAgICAgICAgICAgICAgICRrbmFtZSA9IHN1YnN0cigka25hbWUsIDcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHRhYmxlZHVtcC49ICIgICBLRVkgJGtuYW1lICgkY29sbmFtZXMpIjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAkdGFibGVkdW1wLj0gIlxuKTtcblxuIjsNCiAgICBpZiAoJGZwKSB7DQogICAgICAgIGZ3cml0ZSgkZnAsICR0YWJsZWR1bXApOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGVjaG8gJHRhYmxlZHVtcDsNCiAgICB9DQogICAgJHJvd3MgPSBxKCJTRUxFQ1QgKiBGUk9NICR0YWJsZSIpOw0KICAgICRudW1maWVsZHMgPSBteXNxbF9udW1fZmllbGRzKCRyb3dzKTsNCiAgICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyb3dzKSkgew0KICAgICAgICAkdGFibGVkdW1wID0gIklOU0VSVCBJTlRPICR0YWJsZSBWQUxVRVMoIjsNCiAgICAgICAgJGZpZWxkY291bnRlciA9IC0gMTsNCiAgICAgICAgJGZpcnN0ZmllbGQgPSAxOw0KICAgICAgICB3aGlsZSAoKyskZmllbGRjb3VudGVyIDwgJG51bWZpZWxkcykgew0KICAgICAgICAgICAgaWYgKCEkZmlyc3RmaWVsZCkgew0KICAgICAgICAgICAgICAgICR0YWJsZWR1bXAuPSAiLCAiOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZmlyc3RmaWVsZCA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIWlzc2V0KCRyb3dbJGZpZWxkY291bnRlcl0pKSB7DQogICAgICAgICAgICAgICAgJHRhYmxlZHVtcC49ICJOVUxMIjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJHRhYmxlZHVtcC49ICInIiAuIG15c3FsX2VzY2FwZV9zdHJpbmcoJHJvd1skZmllbGRjb3VudGVyXSkgLiAiJyI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJHRhYmxlZHVtcC49ICIpO1xuIjsNCiAgICAgICAgaWYgKCRmcCkgew0KICAgICAgICAgICAgZndyaXRlKCRmcCwgJHRhYmxlZHVtcCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBlY2hvICR0YWJsZWR1bXA7DQogICAgICAgIH0NCiAgICB9DQogICAgZnIoJHJvd3MpOw0KICAgIGlmICgkZnApIHsNCiAgICAgICAgZndyaXRlKCRmcCwgIlxuIik7DQogICAgfSBlbHNlIHsNCiAgICAgICAgZWNobyAiXG4iOw0KICAgIH0NCn0NCmZ1bmN0aW9uIHVlKCRzdHIpIHsNCiAgICByZXR1cm4gdXJsZW5jb2RlKCRzdHIpOw0KfQ0KZnVuY3Rpb24gcCgkc3RyKSB7DQogICAgZWNobyAkc3RyIC4gIlxuIjsNCn0NCmZ1bmN0aW9uIHRiaGVhZCgpIHsNCiAgICBwKCc8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCn0NCmZ1bmN0aW9uIHRiZm9vdCgpIHsNCiAgICBwKCc8L3RhYmxlPicpOw0KfQ0KZnVuY3Rpb24gbWFrZWhpZGUoJG5hbWUsICR2YWx1ZSA9ICcnKSB7DQogICAgcCgiPGlucHV0IGlkPVwiJG5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiRuYW1lXCIgdmFsdWU9XCIkdmFsdWVcIiAvPiIpOw0KfQ0KZnVuY3Rpb24gbWFrZWlucHV0KCRhcmcgPSBhcnJheSgpKSB7DQogICAgJGFyZ1snc2l6ZSddID0gJGFyZ1snc2l6ZSddID4gMCA/ICJzaXplPVwiJGFyZ1tzaXplXVwiIiA6ICJzaXplPVwiMTAwXCIiOw0KICAgICRhcmdbJ2V4dHJhJ10gPSAkYXJnWydleHRyYSddID8gJGFyZ1snZXh0cmEnXSA6ICcnOw0KICAgICEkYXJnWyd0eXBlJ10gJiYgJGFyZ1sndHlwZSddID0gJ3RleHQnOw0KICAgICRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXSAuICc8YnIgLz4nIDogJyc7DQogICAgJGFyZ1snY2xhc3MnXSA9ICRhcmdbJ2NsYXNzJ10gPyAkYXJnWydjbGFzcyddIDogJ2lucHV0JzsNCiAgICBpZiAoJGFyZ1snbmV3bGluZSddKSB7DQogICAgICAgIHAoIjxwPiRhcmdbdGl0bGVdPGlucHV0IGNsYXNzPVwiJGFyZ1tjbGFzc11cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIHZhbHVlPVwiJGFyZ1t2YWx1ZV1cIiB0eXBlPVwiJGFyZ1t0eXBlXVwiICRhcmdbc2l6ZV0gJGFyZ1tleHRyYV0gLz48L3A+Iik7DQogICAgfSBlbHNlIHsNCiAgICAgICAgcCgiJGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPiIpOw0KICAgIH0NCn0NCmZ1bmN0aW9uIG1ha2VzZWxlY3QoJGFyZyA9IGFycmF5KCkpIHsNCiAgICBpZiAoJGFyZ1snb25jaGFuZ2UnXSkgew0KICAgICAgICAkb25jaGFuZ2UgPSAnb25jaGFuZ2U9IicgLiAkYXJnWydvbmNoYW5nZSddIC4gJyInOw0KICAgIH0NCiAgICAkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10gOiAnJzsNCiAgICBpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8cD4nKTsNCiAgICBwKCIkYXJnW3RpdGxlXSA8c2VsZWN0IGNsYXNzPVwiaW5wdXRcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiICRvbmNoYW5nZT4iKTsNCiAgICBpZiAoaXNfYXJyYXkoJGFyZ1snb3B0aW9uJ10pKSB7DQogICAgICAgIGZvcmVhY2ggKCRhcmdbJ29wdGlvbiddIGFzICRrZXkgPT4gJHZhbHVlKSB7DQogICAgICAgICAgICBpZiAoJGFyZ1snc2VsZWN0ZWQnXSA9PSAka2V5KSB7DQogICAgICAgICAgICAgICAgcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIiBzZWxlY3RlZD4kdmFsdWU8L29wdGlvbj4iKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIj4kdmFsdWU8L29wdGlvbj4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBwKCI8L3NlbGVjdD4iKTsNCiAgICBpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8L3A+Jyk7DQp9DQpmdW5jdGlvbiBmb3JtaGVhZCgkYXJnID0gYXJyYXkoKSkgew0KICAgICEkYXJnWydtZXRob2QnXSAmJiAkYXJnWydtZXRob2QnXSA9ICdwb3N0JzsNCiAgICAhJGFyZ1snYWN0aW9uJ10gJiYgJGFyZ1snYWN0aW9uJ10gPSAkc2VsZjsNCiAgICAkYXJnWyd0YXJnZXQnXSA9ICRhcmdbJ3RhcmdldCddID8gInRhcmdldD1cIiRhcmdbdGFyZ2V0XVwiIiA6ICcnOw0KICAgICEkYXJnWyduYW1lJ10gJiYgJGFyZ1snbmFtZSddID0gJ2Zvcm0xJzsNCiAgICBwKCI8Zm9ybSBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIGFjdGlvbj1cIiRhcmdbYWN0aW9uXVwiIG1ldGhvZD1cIiRhcmdbbWV0aG9kXVwiICRhcmdbdGFyZ2V0XT4iKTsNCiAgICBpZiAoJGFyZ1sndGl0bGUnXSkgew0KICAgICAgICBwKCc8aDI+JyAuICRhcmdbJ3RpdGxlJ10gLiAnICZyYXF1bzs8L2gyPicpOw0KICAgIH0NCn0NCmZ1bmN0aW9uIG1ha2V0ZXh0KCRhcmcgPSBhcnJheSgpKSB7DQogICAgISRhcmdbJ2NvbHMnXSAmJiAkYXJnWydjb2xzJ10gPSAxMDA7DQogICAgISRhcmdbJ3Jvd3MnXSAmJiAkYXJnWydyb3dzJ10gPSAyNTsNCiAgICAkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10gLiAnPGJyIC8+JyA6ICcnOw0KICAgIHAoIjxwPiRhcmdbdGl0bGVdPHRleHRhcmVhIGNsYXNzPVwiYXJlYVwiIGlkPVwiJGFyZ1tuYW1lXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgY29scz1cIiRhcmdbY29sc11cIiByb3dzPVwiJGFyZ1tyb3dzXVwiICRhcmdbZXh0cmFdPiRhcmdbdmFsdWVdPC90ZXh0YXJlYT48L3A+Iik7DQp9DQpmdW5jdGlvbiBmb3JtZm9vdGVyKCRuYW1lID0gJycpIHsNCiAgICAhJG5hbWUgJiYgJG5hbWUgPSAnc3VibWl0JzsNCiAgICBwKCc8cD48aW5wdXQgY2xhc3M9ImJ0IiBuYW1lPSInIC4gJG5hbWUgLiAnIiBpZD1cIicgLiAkbmFtZSAuICdcIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTdWJtaXQiPjwvcD4nKTsNCiAgICBwKCc8L2Zvcm0+Jyk7DQp9DQpmdW5jdGlvbiBmb3JtZm9vdCgpIHsNCiAgICBwKCc8L2Zvcm0+Jyk7DQp9DQovLyBFeGl0DQpmdW5jdGlvbiBwcigkYSkgew0KICAgIGVjaG8gJzxwcmU+JzsNCiAgICBwcmludF9yKCRhKTsNCiAgICBlY2hvICc8L3ByZT4nOw0KfQ0K ?>

Did this file decode correctly?

Original Code

LyogQXJlIFUgT0sgKi8NCg0KPD9waHAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcDQp8KiAgICBWQkEgU0hFTEwgRk9SQ0VSIC0gVkVSU0lPTiAyLjEJKnwNCnwqICAgICBFZGl0ICYgRGV2ZWxvcCBieSBWQkFURUFNICAgICAgICAqfA0KfCogIAkgIGh0dHA6Ly92YmF0ZWFtLm5ldCAgICAJICAgICp8DQp8KiAgICA9PSAgSGFja2luZyAmIFNlY3VyaXR5ICA9PSAgICAgICAgKnwNClwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KZXJyb3JfcmVwb3J0aW5nKDcpOw0KQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsNCm9iX3N0YXJ0KCk7DQokbXRpbWUgPSBleHBsb2RlKCcgJywgbWljcm90aW1lKCkpOw0KJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZVswXTsNCmRlZmluZSgnU0FfUk9PVCcsIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgZGlybmFtZShfX0ZJTEVfXykpIC4gJy8nKTsNCi8vZGVmaW5lKCdJU19XSU4nLCBzdHJzdHIoUEhQX09TLCAnV0lOJykgPyAxIDogMCApOw0KZGVmaW5lKCdJU19XSU4nLCBESVJFQ1RPUllfU0VQQVJBVE9SID09ICdcXCcpOw0KZGVmaW5lKCdJU19DT00nLCBjbGFzc19leGlzdHMoJ0NPTScpID8gMSA6IDApOw0KZGVmaW5lKCdJU19HUEMnLCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKTsNCiRkaXNfZnVuYyA9IGdldF9jZmdfdmFyKCdkaXNhYmxlX2Z1bmN0aW9ucycpOw0KZGVmaW5lKCdJU19QSFBJTkZPJywgKCFlcmVnaSgicGhwaW5mbyIsICRkaXNfZnVuYykpID8gMSA6IDApOw0KQHNldF90aW1lX2xpbWl0KDApOw0KZm9yZWFjaCAoYXJyYXkoJ19HRVQnLCAnX1BPU1QnKSBhcyAkX3JlcXVlc3QpIHsNCiAgICBmb3JlYWNoICgkJF9yZXF1ZXN0IGFzICRfa2V5ID0+ICRfdmFsdWUpIHsNCiAgICAgICAgaWYgKCRfa2V5ezB9ICE9ICdfJykgew0KICAgICAgICAgICAgaWYgKElTX0dQQykgew0KICAgICAgICAgICAgICAgICRfdmFsdWUgPSBzX2FycmF5KCRfdmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJCRfa2V5ID0gJF92YWx1ZTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCi8qPT09PT09PT09PT09PT09PT0gIEluZm8gTG9naW4gID09PT09PT09PT09PT09PT0qLw0KJGFkbWluID0gYXJyYXkoKTsNCiRhZG1pblsnY2hlY2snXSA9IHRydWU7DQokYWRtaW5bJ3Bhc3MnXSA9ICdoajRjayc7IC8vIFBhc3N3b3JkIGxvZ2luDQokYWRtaW5bJ2Nvb2tpZXByZSddID0gJyc7DQokYWRtaW5bJ2Nvb2tpZWRvbWFpbiddID0gJyc7DQokYWRtaW5bJ2Nvb2tpZXBhdGgnXSA9ICcvJzsNCiRhZG1pblsnY29va2llbGlmZSddID0gODY0MDA7DQovKj09PT09PT09PT09PT09PT09PT09PSBFbmQgPT09PT09PT09PT09PT09PT09PT09Ki8NCmlmICgkY2hhcnNldCA9PSAndXRmOCcpIHsNCiAgICBoZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iik7DQp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2JpZzUnKSB7DQogICAgaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1iaWc1Iik7DQp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2diaycpIHsNCiAgICBoZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWdiayIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdsYXRpbjEnKSB7DQogICAgaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0yIik7DQp9DQokc2VsZiA9ICRfU0VSVkVSWydQSFBfU0VMRiddID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsNCiR0aW1lc3RhbXAgPSB0aW1lKCk7DQovKj09PT09PT09PT09PT09PT09PT09PSBMb2dpbiA9PT09PT09PT09PT09PT09PT09PT0qLw0KaWYgKCRhY3Rpb24gPT0gImxvZ291dCIpIHsNCiAgICBzY29va2llKCd2YmFwYXNzJywgJycsIC04NjQwMCAqIDM2NSk7DQogICAgcCgnPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDtVUkw9JyAuICRzZWxmIC4gJyI+Jyk7DQogICAgcCgnPGJvZHkgYmFja2dyb3VuZD1ibGFjaz4nKTsNCiAgICBleGl0Ow0KfQ0KaWYgKCRhZG1pblsnY2hlY2snXSkgew0KICAgIGlmICgkZG9pbmcgPT0gJ2xvZ2luJykgew0KICAgICAgICBpZiAoJGFkbWluWydwYXNzJ10gPT0gJHBhc3N3b3JkKSB7DQogICAgICAgICAgICBzY29va2llKCd2YmFwYXNzJywgJHBhc3N3b3JkKTsNCiAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG1haWwgU2VuZGVyIHRvIG15IEVtYWlsIC0gUGxlYXNlIHJlbW92ZSB0aGlzIGJlZm9yZSB5b3UgdXNpbmcgdGhpcyBzaGVsbCBjb2RlLCBUaGFua3MgLSBGZXJuYW5kbyAtIFZCQVRlYW0NCiAgICAgICAgICAgICR0aW1lX3NoZWxsID0gIiIgLiBkYXRlKCJkL20vWSAtIEg6aTpzIikgLiAiIjsNCiAgICAgICAgICAgICRpcF9yZW1vdGUgPSAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXTsNCiAgICAgICAgICAgICRmcm9tX3NoZWxsY29kZSA9ICdzaGVsbEAnIC4gZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkgLiAnJzsNCiAgICAgICAgICAgICR0b19lbWFpbCA9ICdtaW5oZHVvbmcucGpuQGdtYWlsLmNvbSc7DQogICAgICAgICAgICAkc2VydmVyX21haWwgPSAiIiAuIGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pIC4gIiAgLSAiIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIC4gIiI7DQogICAgICAgICAgICAkbGlua2NyID0gIkxpbms6ICIgLiAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSAuICIiIC4gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gLiAiIC0gSVAgRXhjdXRpbmc6ICRpcF9yZW1vdGUgLSBUaW1lOiAkdGltZV9zaGVsbCI7DQogICAgICAgICAgICAkaGVhZGVyID0gIkZyb206ICRmcm9tX3NoZWxsY29kZVxyXG5SZXBseS10bzogJGZyb21fc2hlbGxjb2RlIjsNCiAgICAgICAgICAgIEBtYWlsKCR0b19lbWFpbCwgJHNlcnZlcl9tYWlsLCAkbGlua2NyLCAkaGVhZGVyKTsNCiAgICAgICAgICAgIHAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjI7VVJMPScgLiAkc2VsZiAuICciPicpOw0KICAgICAgICAgICAgcCgnPGJvZHkgYmdjb2xvcj1ibGFjaz4NCjxCUj48QlI+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9eWVsbG93IGZhY2U9dGFob21hIHNpemU9Mj5CWUcgLSBUaGUgTGVnZW5kIG9mIFZpZXRuYW1lc2UgSGFja2VyIFdvcmxkICAtIFBsZWFzZSB3YWl0Li4uPEJSPjxpbWcgc3JjPWh0dHA6Ly90My5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUkZJUXk5b0xjOWpNV21EWV9OX3N4aldQeXVzVVdDNGlnd0sybHFCbTY4YURHY1NmS1BQQT48L2Rpdj4nKTsNCiAgICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkZXJyX21lc3MgPSAnPHRhYmxlIHdpZHRoPTEwMCU+PHRyPjx0ZCBiZ2NvbG9yPSMwRTBFMEUgd2lkdGg9MTAwJSBoZWlnaHQ9MjQ+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9cmVkIGZhY2U9dGFob21hIHNpemU9Mj48Ymxpbms+UGFzc3dvcmQgaW5jb3JyZWN0LCBQbGVhc2UgdHJ5IGFnYWluISEhPC9ibGluaz48QlI+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPic7DQogICAgICAgICAgICBlY2hvICRlcnJfbWVzczsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoJF9DT09LSUVbJ3ZiYXBhc3MnXSkgew0KICAgICAgICBpZiAoJF9DT09LSUVbJ3ZiYXBhc3MnXSAhPSAkYWRtaW5bJ3Bhc3MnXSkgew0KICAgICAgICAgICAgbG9naW5wYWdlKCk7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBsb2dpbnBhZ2UoKTsNCiAgICB9DQp9DQovKj09PT09PT09PT09PT09PT09PT09PSBMb2dpbiA9PT09PT09PT09PT09PT09PT09PT0qLw0KJGVycm1zZyA9ICcnOw0KaWYgKCRhY3Rpb24gPT0gJ3BocGluZm8nKSB7DQogICAgaWYgKElTX1BIUElORk8pIHsNCiAgICAgICAgcGhwaW5mbygpOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRlcnJtc2cgPSAncGhwaW5mbygpIGZ1bmN0aW9uIGhhcyBub24tcGVybWlzc2libGUnOw0KICAgIH0NCn0NCmlmICgkZG9pbmcgPT0gJ2Rvd25maWxlJyAmJiAkdGhlZmlsZSkgew0KICAgIGlmICghQGZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgew0KICAgICAgICAkZXJybXNnID0gJ1RoZSBmaWxlIHlvdSB3YW50IERvd25sb2FkYWJsZSB3YXMgbm9uZXhpc3RlbnQnOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRmaWxlaW5mbyA9IHBhdGhpbmZvKCR0aGVmaWxlKTsNCiAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtJyAuICRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScgLiAkZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAnIC4gZmlsZXNpemUoJHRoZWZpbGUpKTsNCiAgICAgICAgQHJlYWRmaWxlKCR0aGVmaWxlKTsNCiAgICAgICAgZXhpdDsNCiAgICB9DQp9DQppZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgISRzYXZlYXNmaWxlKSB7DQogICAgZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsNCiAgICAkdGFibGUgPSBhcnJheV9mbGlwKCR0YWJsZSk7DQogICAgJHJlc3VsdCA9IHEoIlNIT1cgdGFibGVzIik7DQogICAgaWYgKCEkcmVzdWx0KSBwKCc8aDI+JyAuIG15c3FsX2Vycm9yKCkgLiAnPC9oMj4nKTsNCiAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAnX015U1FMLnNxbCcpOw0KICAgIGhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi91bmtub3duJyk7DQogICAgaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nIC4gJGZpbGVuYW1lKTsNCiAgICAkbXlzcWxkYXRhID0gJyc7DQogICAgd2hpbGUgKCRjdXJyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KICAgICAgICBpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgew0KICAgICAgICAgICAgJG15c3FsZGF0YS49IHNxbGR1bXB0YWJsZSgkY3Vycm93WzBdKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBteXNxbF9jbG9zZSgpOw0KICAgIGV4aXQ7DQp9DQovLyBNeXNxbA0KaWYgKCRkb2luZyA9PSAnbXlzcWxkb3duJykgew0KICAgIGlmICghJGRibmFtZSkgew0KICAgICAgICAkZXJybXNnID0gJ1BsZWFzZSBpbnB1dCBkYm5hbWUnOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJG15c3FsZGxmaWxlKSkgew0KICAgICAgICAgICAgJGVycm1zZyA9ICdUaGUgZmlsZSB5b3Ugd2FudCBEb3dubG9hZGFibGUgd2FzIG5vbmV4aXN0ZW50JzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRyZXN1bHQgPSBxKCJzZWxlY3QgbG9hZF9maWxlKCckbXlzcWxkbGZpbGUnKTsiKTsNCiAgICAgICAgICAgIGlmICghJHJlc3VsdCkgew0KICAgICAgICAgICAgICAgIHEoIkRST1AgVEFCTEUgSUYgRVhJU1RTIHRtcF9hbmdlbDsiKTsNCiAgICAgICAgICAgICAgICBxKCJDUkVBVEUgVEFCTEUgdG1wX2FuZ2VsIChjb250ZW50IExPTkdCTE9CIE5PVCBOVUxMKTsiKTsNCiAgICAgICAgICAgICAgICAvL0Rvd25sb2FkIFNRTA0KICAgICAgICAgICAgICAgIHEoIkxPQUQgREFUQSBMT0NBTCBJTkZJTEUgJyIgLiBhZGRzbGFzaGVzKCRteXNxbGRsZmlsZSkgLiAiJyBJTlRPIFRBQkxFIHRtcF9hbmdlbCBGSUVMRFMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nIEVTQ0FQRUQgQlkgJycgTElORVMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nOyIpOw0KICAgICAgICAgICAgICAgICRyZXN1bHQgPSBxKCJzZWxlY3QgY29udGVudCBmcm9tIHRtcF9hbmdlbCIpOw0KICAgICAgICAgICAgICAgIHEoIkRST1AgVEFCTEUgdG1wX2FuZ2VsIik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcm93ID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOw0KICAgICAgICAgICAgaWYgKCEkcm93KSB7DQogICAgICAgICAgICAgICAgJGVycm1zZyA9ICdMb2FkIGZpbGUgZmFpbGVkICcgLiBteXNxbF9lcnJvcigpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZmlsZWluZm8gPSBwYXRoaW5mbygkbXlzcWxkbGZpbGUpOw0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LScgLiAkZmlsZWluZm9bJ2V4dGVuc2lvbiddKTsNCiAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScgLiAkZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KICAgICAgICAgICAgICAgIGhlYWRlcigiQWNjZXB0LUxlbmd0aDogIiAuIHN0cmxlbigkcm93WzBdKSk7DQogICAgICAgICAgICAgICAgZWNobyAkcm93WzBdOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjx0aXRsZT48P3BocCBlY2hvIHN0cl9yZXBsYWNlKCcuJywgJycsICdCWUcgLSBUaGUgTGVnZW5kIG9mIFZpZXRuYW1lc2UgSGFja2VyIFdvcmxkJyk7ID8+PC90aXRsZT4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQpib2R5LHRke2ZvbnQ6IDEwcHQgVGFob21hO2NvbG9yOmdyYXk7bGluZS1oZWlnaHQ6IDE2cHg7fQ0KDQphIHtjb2xvcjogIzc0QTIwMjt0ZXh0LWRlY29yYXRpb246bm9uZTt9DQphOmhvdmVye2NvbG9yOiAjZjAwO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KLmFsdDEgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6IzBFMEUwRTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmFsdDIgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6I2Y5ZjlmOTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmZvY3VzIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbTowcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMwRTBFMEU7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5mb3V0MSB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMEUwRTBFO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouZm91dCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMjAyMDIwO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouaGVhZCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMjAyMDIwO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpib2xkO30NCi5oZWFkX3NtYWxsIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMyMDIwMjA7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6OHB0O30NCi5oZWFkIHRkIHNwYW57Zm9udC13ZWlnaHQ6bm9ybWFsO30NCmZvcm17bWFyZ2luOjA7cGFkZGluZzowO30NCmgye21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM1QjY4NkY7fQ0KdWwuaW5mbyBsaXttYXJnaW46MDtjb2xvcjojNDQ0O2xpbmUtaGVpZ2h0OjI0cHg7aGVpZ2h0OjI0cHg7fQ0KdXt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6Izc3NztmbG9hdDpsZWZ0O2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTUwcHg7bWFyZ2luLXJpZ2h0OjEwcHg7fQ0KaW5wdXQsIHRleHRhcmVhLCBidXR0b24NCnsNCglmb250LXNpemU6IDlwdDsNCgljb2xvcjogI2NjYzsNCglmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOw0KCWJvcmRlci1sZWZ0OiAxcHggc29saWQgIzc0QTIwMjsNCglib3JkZXItdG9wOiAxcHggc29saWQgIzc0QTIwMjsNCglib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNzRBMjAyOw0KCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNzRBMjAyOw0KfQ0Kc2VsZWN0DQp7DQoJZm9udC1zaXplOiA4cHQ7DQoJZm9udC13ZWlnaHQ6IG5vcm1hbDsNCgljb2xvcjogI2NjYzsNCglmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOw0KfQ0KDQo8L3N0eWxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gQ2hlY2tBbGwoZm9ybSkgew0KCWZvcih2YXIgaT0wO2k8Zm9ybS5lbGVtZW50cy5sZW5ndGg7aSsrKSB7DQoJCXZhciBlID0gZm9ybS5lbGVtZW50c1tpXTsNCgkJaWYgKGUubmFtZSAhPSAnY2hrYWxsJykNCgkJZS5jaGVja2VkID0gZm9ybS5jaGthbGwuY2hlY2tlZDsNCiAgICB9DQp9DQpmdW5jdGlvbiAkKGlkKSB7DQoJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsNCn0NCmZ1bmN0aW9uIGdvYWN0aW9uKGFjdCl7DQoJJCgnZ29hY3Rpb24nKS5hY3Rpb24udmFsdWU9YWN0Ow0KCSQoJ2dvYWN0aW9uJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjwvaGVhZD4NCjxib2R5IG9uTG9hZD0iaW5pdCgpIiBzdHlsZT0ibWFyZ2luOjA7dGFibGUtbGF5b3V0OmZpeGVkOyB3b3JkLWJyZWFrOmJyZWFrLWFsbCIgYmdjb2xvcj1ibGFjayBiYWNrZ3JvdW5kPWh0dHA6Ly9pMzgyLnBob3RvYnVja2V0LmNvbS9hbGJ1bXMvb28yNjMvdm5oYWNrZXIvYmctMS5qcGc+DQoNCg0KPGRpdiBib3JkZXI9IjAiIHN0eWxlPSJwb3NpdGlvbjpmaXhlZDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMjVweDsgei1pbmRleDogMTsgdG9wOiAzMDBweDsgbGVmdDogMDsiIGlkPSJsb2FkaW5nIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249ImNlbnRlciI+DQoJCQkJPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjExMHB4IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzAwMzMwMCI+DQoJCQkJCTx0cj4NCgkJCQkJCTx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Y2VudGVyPg0KCQkJCSA8ZGl2IGJvcmRlcj0iMSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICMwRTBFMEU7IGZpbHRlcjogYWxwaGEob3BhY2l0eT03MCk7IG9wYWNpdHk6IC43OyB3aWR0aDogMTEwcHg7IGhlaWdodDogMjVweDsgei1pbmRleDogMTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiIGJvcmRlcmNvbG9yPSIjMDA2NjAwIiAgYWxpZ249ImNlbnRlciI+DQoJCQkJICAgTG9hZGluZzxpbWcgc3JjPSJodHRwOi8vaTM4Mi5waG90b2J1Y2tldC5jb20vYWxidW1zL29vMjYzL3ZuaGFja2VyL2xvYWRpbmcuZ2lmIj4NCgkJCQkgIDwvZGl2Pg0KCQkJCTwvdGQ+DQoJCQkJCTwvdHI+DQoJCQkJPC90YWJsZT4NCgkJCSA8L2Rpdj4NCiA8c2NyaXB0Pg0KIHZhciBsZD0oZG9jdW1lbnQuYWxsKTsNCiAgdmFyIG5zND1kb2N1bWVudC5sYXllcnM7DQogdmFyIG5zNj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCYmIWRvY3VtZW50LmFsbDsNCiB2YXIgaWU0PWRvY3VtZW50LmFsbDsNCiAgaWYgKG5zNCkNCiAJbGQ9ZG9jdW1lbnQubG9hZGluZzsNCiBlbHNlIGlmIChuczYpDQogCWxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkaW5nIikuc3R5bGU7DQogZWxzZSBpZiAoaWU0KQ0KIAlsZD1kb2N1bWVudC5hbGwubG9hZGluZy5zdHlsZTsNCiAgZnVuY3Rpb24gaW5pdCgpDQogew0KIGlmKG5zNCl7bGQudmlzaWJpbGl0eT0iaGlkZGVuIjt9DQogZWxzZSBpZiAobnM2fHxpZTQpIGxkLmRpc3BsYXk9Im5vbmUiOw0KIH0NCiA8L3NjcmlwdD4NCg0KDQoNCg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+DQoJPHRyIGNsYXNzPSJoZWFkX3NtYWxsIj4NCgkJPHRkICB3aWR0aD0xMDAlPg0KCQk8dGFibGUgd2lkdGg9MTAwJT48dHIgY2xhc3M9ImhlYWRfc21hbGwiPjx0ZCAgd2lkdGg9ODZweD48YSB0aXRsZT0iQllHIC0gVGhlIExlZ2VuZCBvZiBWaWV0bmFtZXNlIEhhY2tlciBXb3JsZCIgaHJlZj0iPD9waHAgJHNlbGY7ID8+Ij48aW1nIHNyYz1odHRwOi8vY0I4LnVwYW5oLmNvbS8xOS4wLjI0NDc1ODg3LkxIZzAvYmFubmVyLmdpZiBoZWlnaHQ9ODYgYm9yZGVyPTA+PC9hPjwvdGQ+PHRkPg0KCQk8c3BhbiBzdHlsZT0iZmxvYXQ6bGVmdDsiPiA8P3BocCBlY2hvICJIb3N0bmFtZTogIiAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICIiOyA/PiAgfCA8YSBocmVmPSJodHRwOi8vYmV5ZXVncm91cC5jb20iIHRhcmdldD0iX2JsYW5rIj48P3BocCBlY2hvIHN0cl9yZXBsYWNlKCcuJywgJycsICdCWUcgLSBUaGUgTGVnZW5kIG9mIFZpZXRuYW1lc2UgSGFja2VyIFdvcmxkJyk7ID8+IDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdsb2dvdXQnKTsiPjxmb250IGNvbG9yPXJlZD5Mb2dvdXQ8L2ZvbnQ+PC9hPjwvc3Bhbj4gPGJyIC8+DQoNCgkJPD9waHANCiRjdXJsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk7DQokbXlzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9jb25uZWN0Jyk7DQokbXNzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0Jyk7DQokcGdfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0Jyk7DQokb3JhX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnb2NpbG9nb24nKTsNCmVjaG8gKCgkc2FmZV9tb2RlKSA/ICgiU2FmZV9tb2Q6IDxiPjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiKSA6ICgiU2FmZV9tb2Q6IDxiPjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICIpKTsNCmVjaG8gIlBIUCB2ZXJzaW9uOiA8Yj4iIC4gQHBocHZlcnNpb24oKSAuICI8L2I+IC0gIjsNCmVjaG8gImNVUkw6ICIgLiAoKCRjdXJsX29uKSA/ICgiPGI+PGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiAtICIpIDogKCI8Yj48Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiKSk7DQplY2hvICJNeVNRTDogPGI+IjsNCiRteXNxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ215c3FsX2Nvbm5lY3QnKTsNCmlmICgkbXlzcWxfb24pIHsNCiAgICBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIjsNCn0gZWxzZSB7DQogICAgZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIjsNCn0NCmVjaG8gIk1TU1FMOiA8Yj4iOw0KJG1zc3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpOw0KaWYgKCRtc3NxbF9vbikgew0KICAgIGVjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiOw0KfSBlbHNlIHsNCiAgICBlY2hvICI8Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiOw0KfQ0KZWNobyAiUG9zdGdyZVNRTDogPGI+IjsNCiRwZ19vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKTsNCmlmICgkcGdfb24pIHsNCiAgICBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIjsNCn0gZWxzZSB7DQogICAgZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIjsNCn0NCmVjaG8gIk9yYWNsZTogPGI+IjsNCiRvcmFfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdvY2lsb2dvbicpOw0KaWYgKCRvcmFfb24pIHsNCiAgICBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IjsNCn0gZWxzZSB7DQogICAgZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+PEJSPiI7DQp9DQplY2hvICJEaXNhYmxlIGZ1bmN0aW9ucyA6IDxiPiI7DQppZiAoJycgPT0gKCRkZiA9IEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSkgew0KICAgIGVjaG8gIjxmb250IGNvbG9yPWdyZWVuPk5PTkU8L2ZvbnQ+PC9iPjxCUj4iOw0KfSBlbHNlIHsNCiAgICBlY2hvICI8Zm9udCBjb2xvcj1yZWQ+JGRmPC9mb250PjwvYj48QlI+IjsNCn0NCmVjaG8gIjxmb250IGNvbG9yPXdoaXRlPlVuYW1lIC1hPC9mb250PjogIiAuIEBzdWJzdHIoQHBocF91bmFtZSgpLCAwLCAxMjApIC4gIjxicj4iOw0KZWNobyAiPGZvbnQgY29sb3I9d2hpdGU+U2VydmVyPC9mb250PjogIiAuIEBzdWJzdHIoJFNFUlZFUl9TT0ZUV0FSRSwgMCwgMTIwKSAuICIgLSA8Zm9udCBjb2xvcj13aGl0ZT5pZDwvZm9udD46ICIgLiBAZ2V0bXl1aWQoKSAuICIoIiAuIEBnZXRfY3VycmVudF91c2VyKCkgLiAiKSAtIHVpZD0iIC4gQGdldG15dWlkKCkgLiAiICgiIC4gQGdldF9jdXJyZW50X3VzZXIoKSAuICIpIGdpZD0iIC4gQGdldG15Z2lkKCkgLiAiKCIgLiBAZ2V0X2N1cnJlbnRfdXNlcigpIC4gIik8YnI+IjsNCj8+DQoJCTwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+DQoJPC90cj4NCgk8dHIgY2xhc3M9ImFsdDEiPg0KCQk8dGQgIHdpZHRoPTEwJT48c3BhbiBzdHlsZT0iZmxvYXQ6bGVmdDsiPltTZXJ2ZXIgSVA6IDw/cGhwIGVjaG8gIjxmb250IGNvbG9yPXllbGxvdz4iIC4gZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkgLiAiPC9mb250PiI7ID8+IC0gWW91ciBJUDogPD9waHAgZWNobyAiPGZvbnQgY29sb3I9eWVsbG93PiIgLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuICI8L2ZvbnQ+IjsgPz5dIDwvc3Bhbj4gICA8YnIgLz4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyIC8+DQoJCQkNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2ZpbGUnKTsiPkZpbGUgTWFuYWdlcjwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsYWRtaW4nKTsiPk15U1FMIE1hbmFnZXI8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NxbGZpbGUnKTsiPk15U1FMIFVwbG9hZCAmYW1wOyBEb3dubG9hZDwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc2hlbGwnKTsiPkV4ZWN1dGUgQ29tbWFuZDwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbigncGhwZW52Jyk7Ij5QSFAgVmFyaWFibGU8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2V2YWwnKTsiPkV2YWwgUEhQIENvZGU8L2E+DQoJCQk8P3BocCBpZiAoIUlTX1dJTikgeyA/PiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2JydXRlJyk7Ij5CcnV0ZTwvYT4gPD9waHANCn0gPz4NCgkJCTw/cGhwIGlmICghSVNfV0lOKSB7ID8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZXRjcHdkJyk7Ij4vZXRjL3Bhc3N3ZDwvYT4gPD9waHANCn0gPz4NCgkJCTw/cGhwIGlmICghSVNfV0lOKSB7ID8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYmFja2Nvbm5lY3QnKTsiPkJhY2sgQ29ubmVjdDwvYT48P3BocA0KfSA/Pg0KCQk8L3RkPg0KCTwvdHI+DQo8L3RhYmxlPg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIxNSIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQ+DQo8P3BocA0KZm9ybWhlYWQoYXJyYXkoJ25hbWUnID0+ICdnb2FjdGlvbicpKTsNCm1ha2VoaWRlKCdhY3Rpb24nKTsNCmZvcm1mb290KCk7DQokZXJybXNnICYmIG0oJGVycm1zZyk7DQovLyBEaXIgZnVuY3Rpb24NCiEkZGlyICYmICRkaXIgPSAnLic7DQokbm93cGF0aCA9IGdldFBhdGgoU0FfUk9PVCwgJGRpcik7DQppZiAoc3Vic3RyKCRkaXIsIC0xKSAhPSAnLycpIHsNCiAgICAkZGlyID0gJGRpciAuICcvJzsNCn0NCiR1ZWRpciA9IHVlKCRkaXIpOw0KaWYgKCEkYWN0aW9uIHx8ICRhY3Rpb24gPT0gJ2ZpbGUnKSB7DQogICAgLy8gTm9uLXdyaXRlYWJsZQ0KICAgICRkaXJfd3JpdGVhYmxlID0gQGlzX3dyaXRhYmxlKCRub3dwYXRoKSA/ICdXcml0YWJsZScgOiAnTm9uLXdyaXRhYmxlJzsNCiAgICAvLyBEZWxldGUgZGlyDQogICAgaWYgKCRkb2luZyA9PSAnZGVsZGlyJyAmJiAkdGhlZmlsZSkgew0KICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgew0KICAgICAgICAgICAgbSgkdGhlZmlsZSAuICcgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Jyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBtKCdEaXJlY3RvcnkgZGVsZXRlICcgLiAoZGVsdHJlZSgkdGhlZmlsZSkgPyBiYXNlbmFtZSgkdGhlZmlsZSkgLiAnIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBDcmVhdGUgbmV3IGRpcg0KICAgIGVsc2VpZiAoJG5ld2Rpcm5hbWUpIHsNCiAgICAgICAgJG1rZGlycyA9ICRub3dwYXRoIC4gJG5ld2Rpcm5hbWU7DQogICAgICAgIGlmIChmaWxlX2V4aXN0cygkbWtkaXJzKSkgew0KICAgICAgICAgICAgbSgnRGlyZWN0b3J5IGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG0oJ0RpcmVjdG9yeSBjcmVhdGVkICcgLiAoQG1rZGlyKCRta2RpcnMsIDA3NzcpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICAgICAgICAgIEBjaG1vZCgkbWtkaXJzLCAwNzc3KTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBVcGxvYWQgZmlsZQ0KICAgIGVsc2VpZiAoJGRvdXBmaWxlKSB7DQogICAgICAgIG0oJ0ZpbGUgdXBsb2FkICcgLiAoQGNvcHkoJF9GSUxFU1sndXBsb2FkZmlsZSddWyd0bXBfbmFtZSddLCAkdXBsb2FkZGlyIC4gJy8nIC4gJF9GSUxFU1sndXBsb2FkZmlsZSddWyduYW1lJ10pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICB9DQogICAgLy8gRWRpdCBmaWxlDQogICAgZWxzZWlmICgkZWRpdGZpbGVuYW1lICYmICRmaWxlY29udGVudCkgew0KICAgICAgICAkZnAgPSBAZm9wZW4oJGVkaXRmaWxlbmFtZSwgJ3cnKTsNCiAgICAgICAgbSgnU2F2ZSBmaWxlICcgLiAoQGZ3cml0ZSgkZnAsICRmaWxlY29udGVudCkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KICAgICAgICBAZmNsb3NlKCRmcCk7DQogICAgfQ0KICAgIC8vIE1vZGlmeQ0KICAgIGVsc2VpZiAoJHBmaWxlICYmICRuZXdwZXJtKSB7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJHBmaWxlKSkgew0KICAgICAgICAgICAgbSgnVGhlIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRuZXdwZXJtID0gYmFzZV9jb252ZXJ0KCRuZXdwZXJtLCA4LCAxMCk7DQogICAgICAgICAgICBtKCdNb2RpZnkgZmlsZSBhdHRyaWJ1dGVzICcgLiAoQGNobW9kKCRwZmlsZSwgJG5ld3Blcm0pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBSZW5hbWUNCiAgICBlbHNlaWYgKCRvbGRuYW1lICYmICRuZXdmaWxlbmFtZSkgew0KICAgICAgICAkbm5hbWUgPSAkbm93cGF0aCAuICRuZXdmaWxlbmFtZTsNCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRubmFtZSkgfHwgIWZpbGVfZXhpc3RzKCRvbGRuYW1lKSkgew0KICAgICAgICAgICAgbSgkbm5hbWUgLiAnIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbShiYXNlbmFtZSgkb2xkbmFtZSkgLiAnIHJlbmFtZWQgJyAuIGJhc2VuYW1lKCRubmFtZSkgLiAoQHJlbmFtZSgkb2xkbmFtZSwgJG5uYW1lKSA/ICcgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIENvcHUNCiAgICBlbHNlaWYgKCRzbmFtZSAmJiAkdG9maWxlKSB7DQogICAgICAgIGlmIChmaWxlX2V4aXN0cygkdG9maWxlKSB8fCAhZmlsZV9leGlzdHMoJHNuYW1lKSkgew0KICAgICAgICAgICAgbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG0oYmFzZW5hbWUoJHRvZmlsZSkgLiAnIGNvcGllZCAnIC4gKEBjb3B5KCRzbmFtZSwgJHRvZmlsZSkgPyBiYXNlbmFtZSgkdG9maWxlKSAuICcgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIEZpbGUgZXhpdA0KICAgIGVsc2VpZiAoJGN1cmZpbGUgJiYgJHRhcmZpbGUpIHsNCiAgICAgICAgaWYgKCFAZmlsZV9leGlzdHMoJGN1cmZpbGUpIHx8ICFAZmlsZV9leGlzdHMoJHRhcmZpbGUpKSB7DQogICAgICAgICAgICBtKCdUaGUgZ29hbCBmaWxlIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHRpbWUgPSBAZmlsZW10aW1lKCR0YXJmaWxlKTsNCiAgICAgICAgICAgIG0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcgLiAoQHRvdWNoKCRjdXJmaWxlLCAkdGltZSwgJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBEYXRlDQogICAgZWxzZWlmICgkY3VyZmlsZSAmJiAkeWVhciAmJiAkbW9udGggJiYgJGRheSAmJiAkaG91ciAmJiAkbWludXRlICYmICRzZWNvbmQpIHsNCiAgICAgICAgaWYgKCFAZmlsZV9leGlzdHMoJGN1cmZpbGUpKSB7DQogICAgICAgICAgICBtKGJhc2VuYW1lKCRjdXJmaWxlKSAuICcgZG9lcyBub3QgZXhpc3QnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCiAgICAgICAgICAgIG0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcgLiAoQHRvdWNoKCRjdXJmaWxlLCAkdGltZSwgJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBEb3dubG9hZA0KICAgIGVsc2VpZiAoJGRvaW5nID09ICdkb3ducmFyJykgew0KICAgICAgICBpZiAoJGRsKSB7DQogICAgICAgICAgICAkZGZpbGVzID0gJyc7DQogICAgICAgICAgICBmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgew0KICAgICAgICAgICAgICAgICRkZmlsZXMuPSAkZmlsZXBhdGggLiAnLCc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkZGZpbGVzID0gc3Vic3RyKCRkZmlsZXMsIDAsIHN0cmxlbigkZGZpbGVzKSAtIDEpOw0KICAgICAgICAgICAgJGRsID0gZXhwbG9kZSgnLCcsICRkZmlsZXMpOw0KICAgICAgICAgICAgJHppcCA9IG5ldyBQSFBaaXAoJGRsKTsNCiAgICAgICAgICAgICRjb2RlID0gJHppcC0+b3V0Ow0KICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOw0KICAgICAgICAgICAgaGVhZGVyKCdBY2NlcHQtUmFuZ2VzOiBieXRlcycpOw0KICAgICAgICAgICAgaGVhZGVyKCdBY2NlcHQtTGVuZ3RoOiAnIC4gc3RybGVuKCRjb2RlKSk7DQogICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7ZmlsZW5hbWU9JyAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICdfRmlsZXMudGFyLmd6Jyk7DQogICAgICAgICAgICBlY2hvICRjb2RlOw0KICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIERlbGV0ZSBmaWxlDQogICAgZWxzZWlmICgkZG9pbmcgPT0gJ2RlbGZpbGVzJykgew0KICAgICAgICBpZiAoJGRsKSB7DQogICAgICAgICAgICAkZGZpbGVzID0gJyc7DQogICAgICAgICAgICAkc3VjYyA9ICRmYWlsID0gMDsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRkbCBhcyAkZmlsZXBhdGggPT4gJHZhbHVlKSB7DQogICAgICAgICAgICAgICAgaWYgKEB1bmxpbmsoJGZpbGVwYXRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkc3VjYysrOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRmYWlsKys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbSgnRGVsZXRlZCBmaWxlIGhhdmUgZmluaXNoZWQ/P2Nob29zZSAnIC4gY291bnQoJGRsKSAuICcgc3VjY2VzcyAnIC4gJHN1Y2MgLiAnIGZhaWwgJyAuICRmYWlsKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIEZ1bmN0aW9uIE5ld2Rpcg0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAnY3JlYXRlZGlyJykpOw0KICAgIG1ha2VoaWRlKCduZXdkaXJuYW1lJyk7DQogICAgbWFrZWhpZGUoJ2RpcicsICRub3dwYXRoKTsNCiAgICBmb3JtZm9vdCgpOw0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAnZmlsZXBlcm0nKSk7DQogICAgbWFrZWhpZGUoJ25ld3Blcm0nKTsNCiAgICBtYWtlaGlkZSgncGZpbGUnKTsNCiAgICBtYWtlaGlkZSgnZGlyJywgJG5vd3BhdGgpOw0KICAgIGZvcm1mb290KCk7DQogICAgZm9ybWhlYWQoYXJyYXkoJ25hbWUnID0+ICdjb3B5ZmlsZScpKTsNCiAgICBtYWtlaGlkZSgnc25hbWUnKTsNCiAgICBtYWtlaGlkZSgndG9maWxlJyk7DQogICAgbWFrZWhpZGUoJ2RpcicsICRub3dwYXRoKTsNCiAgICBmb3JtZm9vdCgpOw0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAncmVuYW1lJykpOw0KICAgIG1ha2VoaWRlKCdvbGRuYW1lJyk7DQogICAgbWFrZWhpZGUoJ25ld2ZpbGVuYW1lJyk7DQogICAgbWFrZWhpZGUoJ2RpcicsICRub3dwYXRoKTsNCiAgICBmb3JtZm9vdCgpOw0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAnZmlsZW9wZm9ybScpKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJyk7DQogICAgbWFrZWhpZGUoJ29wZmlsZScpOw0KICAgIG1ha2VoaWRlKCdkaXInKTsNCiAgICBmb3JtZm9vdCgpOw0KICAgICRmcmVlID0gQGRpc2tfZnJlZV9zcGFjZSgkbm93cGF0aCk7DQogICAgISRmcmVlICYmICRmcmVlID0gMDsNCiAgICAkYWxsID0gQGRpc2tfdG90YWxfc3BhY2UoJG5vd3BhdGgpOw0KICAgICEkYWxsICYmICRhbGwgPSAwOw0KICAgICR1c2VkID0gJGFsbCAtICRmcmVlOw0KICAgICR1c2VkX3BlcmNlbnQgPSBAcm91bmQoMTAwIC8gKCRhbGwgLyAkZnJlZSksIDIpOw0KICAgIHAoJzxmb250IGNvbG9yPXllbGxvdyBmYWNlPXRhaG9tYSBzaXplPTI+PEI+RmlsZSBNYW5hZ2VyPC9iPiA8L2ZvbnQ+IEN1cnJlbnQgZGlzayBmcmVlIDxmb250IGNvbG9yPXJlZD4nIC4gc2l6ZWNvdW50KCRmcmVlKSAuICc8L2ZvbnQ+IG9mIDxmb250IGNvbG9yPXJlZD4nIC4gc2l6ZWNvdW50KCRhbGwpIC4gJzwvZm9udD4gKDxmb250IGNvbG9yPXJlZD4nIC4gJHVzZWRfcGVyY2VudCAuICc8L2ZvbnQ+JSk8L2ZvbnQ+Jyk7DQo/Pg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9Im1hcmdpbjoxMHB4IDA7Ij4NCiAgPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgaWQ9ImdvZGlyIiBuYW1lPSJnb2RpciI+DQogIDx0cj4NCiAgICA8dGQgbm93cmFwPkN1cnJlbnQgRGlyZWN0b3J5ICg8P3BocCBlY2hvICRkaXJfd3JpdGVhYmxlOyA/PiwgPD9waHAgZWNobyBnZXRDaG1vZCgkbm93cGF0aCk7ID8+KTwvdGQ+DQoJPHRkIHdpZHRoPSIxMDAlIj48aW5wdXQgbmFtZT0idmlld193cml0YWJsZSIgdmFsdWU9IjAiIHR5cGU9ImhpZGRlbiIgLz48aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJkaXIiIHZhbHVlPSI8P3BocCBlY2hvICRub3dwYXRoOyA/PiIgdHlwZT0idGV4dCIgc3R5bGU9IndpZHRoOjEwMCU7bWFyZ2luOjAgOHB4OyI+PC90ZD4NCiAgICA8dGQgbm93cmFwPjxpbnB1dCBjbGFzcz0iYnQiIHZhbHVlPSJHTyIgdHlwZT0ic3VibWl0Ij48L3RkPg0KICA8L3RyPg0KICA8L2Zvcm0+DQo8L3RhYmxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gY3JlYXRlZGlyKCl7DQoJdmFyIG5ld2Rpcm5hbWU7DQoJbmV3ZGlybmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBkaXJlY3RvcnkgbmFtZTonLCAnJyk7DQoJaWYgKCFuZXdkaXJuYW1lKSByZXR1cm47DQoJJCgnY3JlYXRlZGlyJykubmV3ZGlybmFtZS52YWx1ZT1uZXdkaXJuYW1lOw0KCSQoJ2NyZWF0ZWRpcicpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gZmlsZXBlcm0ocGZpbGUpew0KCXZhciBuZXdwZXJtOw0KCW5ld3Blcm0gPSBwcm9tcHQoJ0N1cnJlbnQgZmlsZTonK3BmaWxlKydcblBsZWFzZSBpbnB1dCBuZXcgYXR0cmlidXRlOicsICcnKTsNCglpZiAoIW5ld3Blcm0pIHJldHVybjsNCgkkKCdmaWxlcGVybScpLm5ld3Blcm0udmFsdWU9bmV3cGVybTsNCgkkKCdmaWxlcGVybScpLnBmaWxlLnZhbHVlPXBmaWxlOw0KCSQoJ2ZpbGVwZXJtJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBjb3B5ZmlsZShzbmFtZSl7DQoJdmFyIHRvZmlsZTsNCgl0b2ZpbGUgPSBwcm9tcHQoJ09yaWdpbmFsIGZpbGU6JytzbmFtZSsnXG5QbGVhc2UgaW5wdXQgb2JqZWN0IGZpbGUgKGZ1bGxwYXRoKTonLCAnJyk7DQoJaWYgKCF0b2ZpbGUpIHJldHVybjsNCgkkKCdjb3B5ZmlsZScpLnRvZmlsZS52YWx1ZT10b2ZpbGU7DQoJJCgnY29weWZpbGUnKS5zbmFtZS52YWx1ZT1zbmFtZTsNCgkkKCdjb3B5ZmlsZScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gcmVuYW1lKG9sZG5hbWUpew0KCXZhciBuZXdmaWxlbmFtZTsNCgluZXdmaWxlbmFtZSA9IHByb21wdCgnRm9ybWVyIGZpbGUgbmFtZTonK29sZG5hbWUrJ1xuUGxlYXNlIGlucHV0IG5ldyBmaWxlbmFtZTonLCAnJyk7DQoJaWYgKCFuZXdmaWxlbmFtZSkgcmV0dXJuOw0KCSQoJ3JlbmFtZScpLm5ld2ZpbGVuYW1lLnZhbHVlPW5ld2ZpbGVuYW1lOw0KCSQoJ3JlbmFtZScpLm9sZG5hbWUudmFsdWU9b2xkbmFtZTsNCgkkKCdyZW5hbWUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGRvZmlsZShkb2luZyx0aGVmaWxlLG0pew0KCWlmIChtICYmICFjb25maXJtKG0pKSB7DQoJCXJldHVybjsNCgl9DQoJJCgnZmlsZWxpc3QnKS5kb2luZy52YWx1ZT1kb2luZzsNCglpZiAodGhlZmlsZSl7DQoJCSQoJ2ZpbGVsaXN0JykudGhlZmlsZS52YWx1ZT10aGVmaWxlOw0KCX0NCgkkKCdmaWxlbGlzdCcpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gY3JlYXRlZmlsZShub3dwYXRoKXsNCgl2YXIgZmlsZW5hbWU7DQoJZmlsZW5hbWUgPSBwcm9tcHQoJ1BsZWFzZSBpbnB1dCB0aGUgZmlsZSBuYW1lOicsICcnKTsNCglpZiAoIWZpbGVuYW1lKSByZXR1cm47DQoJb3BmaWxlKCdlZGl0ZmlsZScsbm93cGF0aCArIGZpbGVuYW1lLG5vd3BhdGgpOw0KfQ0KZnVuY3Rpb24gb3BmaWxlKGFjdGlvbixvcGZpbGUsZGlyKXsNCgkkKCdmaWxlb3Bmb3JtJykuYWN0aW9uLnZhbHVlPWFjdGlvbjsNCgkkKCdmaWxlb3Bmb3JtJykub3BmaWxlLnZhbHVlPW9wZmlsZTsNCgkkKCdmaWxlb3Bmb3JtJykuZGlyLnZhbHVlPWRpcjsNCgkkKCdmaWxlb3Bmb3JtJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBnb2RpcihkaXIsdmlld193cml0YWJsZSl7DQoJaWYgKHZpZXdfd3JpdGFibGUpIHsNCgkJJCgnZ29kaXInKS52aWV3X3dyaXRhYmxlLnZhbHVlPTE7DQoJfQ0KCSQoJ2dvZGlyJykuZGlyLnZhbHVlPWRpcjsNCgkkKCdnb2RpcicpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQogIDw/cGhwDQogICAgdGJoZWFkKCk7DQogICAgcCgnPGZvcm0gYWN0aW9uPSInIC4gJHNlbGYgLiAnIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjx0ciBjbGFzcz0iYWx0MSI+PHRkIGNvbHNwYW49IjciIHN0eWxlPSJwYWRkaW5nOjVweDsiPicpOw0KICAgIHAoJzxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdmFsdWU9IiIgdHlwZT0iZmlsZSIgLz4gPGlucHV0IGNsYXNzPSIiIG5hbWU9ImRvdXBmaWxlIiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiIC8+PGlucHV0IG5hbWU9InVwbG9hZGRpciIgdmFsdWU9IicgLiAkZGlyIC4gJyIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBuYW1lPSJkaXIiIHZhbHVlPSInIC4gJGRpciAuICciIHR5cGU9ImhpZGRlbiIgLz48L2Rpdj4nKTsNCiAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJyAuICRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0gLiAnXCcpOyI+V2ViUm9vdDwvYT4nKTsNCiAgICBpZiAoJHZpZXdfd3JpdGFibGUpIHsNCiAgICAgICAgcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycgLiAkbm93cGF0aCAuICdcJyk7Ij5WaWV3IEFsbDwvYT4nKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJyAuICRub3dwYXRoIC4gJ1wnLFwnMVwnKTsiPlZpZXcgV3JpdGFibGU8L2E+Jyk7DQogICAgfQ0KICAgIHAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZGlyKCk7Ij5DcmVhdGUgRGlyZWN0b3J5PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZmlsZShcJycgLiAkbm93cGF0aCAuICdcJyk7Ij5DcmVhdGUgRmlsZTwvYT4nKTsNCiAgICBpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KICAgICAgICAkb2JqID0gbmV3IENPTSgnc2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QnKTsNCiAgICAgICAgaWYgKCRvYmogJiYgaXNfb2JqZWN0KCRvYmopKSB7DQogICAgICAgICAgICAkRHJpdmVUeXBlREIgPSBhcnJheSgwID0+ICdVbmtub3cnLCAxID0+ICdSZW1vdmFibGUnLCAyID0+ICdGaXhlZCcsIDMgPT4gJ05ldHdvcmsnLCA0ID0+ICdDRFJvbScsIDUgPT4gJ1JBTSBEaXNrJyk7DQogICAgICAgICAgICBmb3JlYWNoICgkb2JqLT5Ecml2ZXMgYXMgJGRyaXZlKSB7DQogICAgICAgICAgICAgICAgaWYgKCRkcml2ZS0+RHJpdmVUeXBlID09IDIpIHsNCiAgICAgICAgICAgICAgICAgICAgcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycgLiAkZHJpdmUtPlBhdGggLiAnL1wnKTsiIHRpdGxlPSJTaXplOicgLiBzaXplY291bnQoJGRyaXZlLT5Ub3RhbFNpemUpIC4gJyYjMTM7RnJlZTonIC4gc2l6ZWNvdW50KCRkcml2ZS0+RnJlZVNwYWNlKSAuICcmIzEzO1R5cGU6JyAuICREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0gLiAnIj4nIC4gJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXSAuICcoJyAuICRkcml2ZS0+UGF0aCAuICcpPC9hPicpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnIC4gJGRyaXZlLT5QYXRoIC4gJy9cJyk7IiB0aXRsZT0iVHlwZTonIC4gJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXSAuICciPicgLiAkRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdIC4gJygnIC4gJGRyaXZlLT5QYXRoIC4gJyk8L2E+Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIHAoJzwvdGQ+PC90cj48L2Zvcm0+Jyk7DQogICAgcCgnPHRyIGNsYXNzPSJoZWFkIj48dGQ+Jm5ic3A7PC90ZD48dGQ+RmlsZW5hbWU8L3RkPjx0ZCB3aWR0aD0iMTYlIj5MYXN0IG1vZGlmaWVkPC90ZD48dGQgd2lkdGg9IjEwJSI+U2l6ZTwvdGQ+PHRkIHdpZHRoPSIyMCUiPkNobW9kIC8gUGVybXM8L3RkPjx0ZCB3aWR0aD0iMjIlIj5BY3Rpb248L3RkPjwvdHI+Jyk7DQogICAgLy8gR2V0IHBhdGgNCiAgICAkZGlyZGF0YSA9IGFycmF5KCk7DQogICAgJGZpbGVkYXRhID0gYXJyYXkoKTsNCiAgICBpZiAoJHZpZXdfd3JpdGFibGUpIHsNCiAgICAgICAgJGRpcmRhdGEgPSBHZXRMaXN0KCRub3dwYXRoKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAvLyBPcGVuIGRpcg0KICAgICAgICAkZGlycyA9IEBvcGVuZGlyKCRkaXIpOw0KICAgICAgICB3aGlsZSAoJGZpbGUgPSBAcmVhZGRpcigkZGlycykpIHsNCiAgICAgICAgICAgICRmaWxlcGF0aCA9ICRub3dwYXRoIC4gJGZpbGU7DQogICAgICAgICAgICBpZiAoQGlzX2RpcigkZmlsZXBhdGgpKSB7DQogICAgICAgICAgICAgICAgJGRpcmRiWydmaWxlbmFtZSddID0gJGZpbGU7DQogICAgICAgICAgICAgICAgJGRpcmRiWydtdGltZSddID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgZmlsZW10aW1lKCRmaWxlcGF0aCkpOw0KICAgICAgICAgICAgICAgICRkaXJkYlsnZGlyY2htb2QnXSA9IGdldENobW9kKCRmaWxlcGF0aCk7DQogICAgICAgICAgICAgICAgJGRpcmRiWydkaXJwZXJtJ10gPSBnZXRQZXJtcygkZmlsZXBhdGgpOw0KICAgICAgICAgICAgICAgICRkaXJkYlsnZmlsZW93bmVyJ10gPSBnZXRVc2VyKCRmaWxlcGF0aCk7DQogICAgICAgICAgICAgICAgJGRpcmRiWydkaXJsaW5rJ10gPSAkbm93cGF0aDsNCiAgICAgICAgICAgICAgICAkZGlyZGJbJ3NlcnZlcl9saW5rJ10gPSAkZmlsZXBhdGg7DQogICAgICAgICAgICAgICAgJGRpcmRiWydjbGllbnRfbGluayddID0gdWUoJGZpbGVwYXRoKTsNCiAgICAgICAgICAgICAgICAkZGlyZGF0YVtdID0gJGRpcmRiOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydmaWxlbmFtZSddID0gJGZpbGU7DQogICAgICAgICAgICAgICAgJGZpbGVkYlsnc2l6ZSddID0gc2l6ZWNvdW50KEBmaWxlc2l6ZSgkZmlsZXBhdGgpKTsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydtdGltZSddID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgZmlsZW10aW1lKCRmaWxlcGF0aCkpOw0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ2ZpbGVjaG1vZCddID0gZ2V0Q2htb2QoJGZpbGVwYXRoKTsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydmaWxlcGVybSddID0gZ2V0UGVybXMoJGZpbGVwYXRoKTsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydmaWxlb3duZXInXSA9IGdldFVzZXIoJGZpbGVwYXRoKTsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydkaXJsaW5rJ10gPSAkbm93cGF0aDsNCiAgICAgICAgICAgICAgICAkZmlsZWRiWydzZXJ2ZXJfbGluayddID0gJGZpbGVwYXRoOw0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ2NsaWVudF9saW5rJ10gPSB1ZSgkZmlsZXBhdGgpOw0KICAgICAgICAgICAgICAgICRmaWxlZGF0YVtdID0gJGZpbGVkYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSAvLyB3aGlsZQ0KICAgICAgICB1bnNldCgkZGlyZGIpOw0KICAgICAgICB1bnNldCgkZmlsZWRiKTsNCiAgICAgICAgQGNsb3NlZGlyKCRkaXJzKTsNCiAgICB9DQogICAgQHNvcnQoJGRpcmRhdGEpOw0KICAgIEBzb3J0KCRmaWxlZGF0YSk7DQogICAgJGRpcl9pID0gJzAnOw0KICAgIGZvcmVhY2ggKCRkaXJkYXRhIGFzICRrZXkgPT4gJGRpcmRiKSB7DQogICAgICAgIGlmICgkZGlyZGJbJ2ZpbGVuYW1lJ10gIT0gJy4uJyAmJiAkZGlyZGJbJ2ZpbGVuYW1lJ10gIT0gJy4nKSB7DQogICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsNCiAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQogICAgICAgICAgICBwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGZvbnQgZmFjZT0id2luZ2RpbmdzIiBzaXplPSIzIj4wPC9mb250PjwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycgLiAkZGlyZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcpOyI+JyAuICRkaXJkYlsnZmlsZW5hbWUnXSAuICc8L2E+PC90ZD4nKTsNCiAgICAgICAgICAgIHAoJzx0ZCBub3dyYXA+JyAuICRkaXJkYlsnbXRpbWUnXSAuICc8L3RkPicpOw0KICAgICAgICAgICAgcCgnPHRkIG5vd3JhcD4tLTwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicpOw0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycgLiAkZGlyZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcpOyI+JyAuICRkaXJkYlsnZGlyY2htb2QnXSAuICc8L2E+IC8gJyk7DQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJyAuICRkaXJkYlsnc2VydmVyX2xpbmsnXSAuICdcJyk7Ij4nIC4gJGRpcmRiWydkaXJwZXJtJ10gLiAnPC9hPicgLiAkZGlyZGJbJ2ZpbGVvd25lciddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZGVsZGlyXCcsXCcnIC4gJGRpcmRiWydzZXJ2ZXJfbGluayddIC4gJ1wnLFwnQXJlIHlvdSBzdXJlIHdpbGwgZGVsZXRlICcgLiAkZGlyZGJbJ2ZpbGVuYW1lJ10gLiAnPyBcXG5cXG5JZiBub24tZW1wdHkgZGlyZWN0b3J5LCB3aWxsIGJlIGRlbGV0ZSBhbGwgdGhlIGZpbGVzLlwnKSI+RGVsPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVuYW1lKFwnJyAuICRkaXJkYlsnc2VydmVyX2xpbmsnXSAuICdcJyk7Ij5SZW5hbWU8L2E+PC90ZD4nKTsNCiAgICAgICAgICAgIHAoJzwvdHI+Jyk7DQogICAgICAgICAgICAkZGlyX2krKzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICgkZGlyZGJbJ2ZpbGVuYW1lJ10gPT0gJy4uJykgew0KICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz1mb3V0PicpOw0KICAgICAgICAgICAgICAgIHAoJzx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJXaW5nZGluZ3MgMyIgc2l6ZT00Pj08L2ZvbnQ+PC90ZD48dGQgbm93cmFwIGNvbHNwYW49IjUiPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnIC4gZ2V0VXBQYXRoKCRub3dwYXRoKSAuICdcJyk7Ij5QYXJlbnQgRGlyZWN0b3J5PC9hPjwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgcCgnPC90cj4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBwKCc8dHIgYmdjb2xvcj0iZ3JlZW4iIHN0bHllPSJib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7Ij48dGQgY29sc3Bhbj0iNiIgaGVpZ2h0PSI1Ij48L3RkPjwvdHI+Jyk7DQogICAgcCgnPGZvcm0gaWQ9ImZpbGVsaXN0IiBuYW1lPSJmaWxlbGlzdCIgYWN0aW9uPSInIC4gJHNlbGYgLiAnIiBtZXRob2Q9InBvc3QiPicpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnZmlsZScpOw0KICAgIG1ha2VoaWRlKCd0aGVmaWxlJyk7DQogICAgbWFrZWhpZGUoJ2RvaW5nJyk7DQogICAgbWFrZWhpZGUoJ2RpcicsICRub3dwYXRoKTsNCiAgICAkZmlsZV9pID0gJzAnOw0KICAgIGZvcmVhY2ggKCRmaWxlZGF0YSBhcyAka2V5ID0+ICRmaWxlZGIpIHsNCiAgICAgICAgaWYgKCRmaWxlZGJbJ2ZpbGVuYW1lJ10gIT0gJy4uJyAmJiAkZmlsZWRiWydmaWxlbmFtZSddICE9ICcuJykgew0KICAgICAgICAgICAgJGZpbGV1cmwgPSBzdHJfcmVwbGFjZShTQV9ST09ULCAnJywgJGZpbGVkYlsnc2VydmVyX2xpbmsnXSk7DQogICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsNCiAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQogICAgICAgICAgICBwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0iZGxbJyAuICRmaWxlZGJbJ3NlcnZlcl9saW5rJ10gLiAnXSI+PC90ZD4nKTsNCiAgICAgICAgICAgIHAoJzx0ZD48YSBocmVmPSInIC4gJGZpbGV1cmwgLiAnIiB0YXJnZXQ9Il9ibGFuayI+JyAuICRmaWxlZGJbJ2ZpbGVuYW1lJ10gLiAnPC9hPjwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicgLiAkZmlsZWRiWydtdGltZSddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicgLiAkZmlsZWRiWydzaXplJ10gLiAnPC90ZD4nKTsNCiAgICAgICAgICAgIHAoJzx0ZCBub3dyYXA+Jyk7DQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJyAuICRmaWxlZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcpOyI+JyAuICRmaWxlZGJbJ2ZpbGVjaG1vZCddIC4gJzwvYT4gLyAnKTsNCiAgICAgICAgICAgIHAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnIC4gJGZpbGVkYlsnc2VydmVyX2xpbmsnXSAuICdcJyk7Ij4nIC4gJGZpbGVkYlsnZmlsZXBlcm0nXSAuICc8L2E+JyAuICRmaWxlZGJbJ2ZpbGVvd25lciddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicpOw0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3duZmlsZVwnLFwnJyAuICRmaWxlZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcpOyI+RG93bjwvYT4gfCAnKTsNCiAgICAgICAgICAgIHAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6Y29weWZpbGUoXCcnIC4gJGZpbGVkYlsnc2VydmVyX2xpbmsnXSAuICdcJyk7Ij5Db3B5PC9hPiB8ICcpOw0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpvcGZpbGUoXCdlZGl0ZmlsZVwnLFwnJyAuICRmaWxlZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcsXCcnIC4gJGZpbGVkYlsnZGlybGluayddIC4gJ1wnKTsiPkVkaXQ8L2E+IHwgJyk7DQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycgLiAkZmlsZWRiWydzZXJ2ZXJfbGluayddIC4gJ1wnKTsiPlJlbmFtZTwvYT4gfCAnKTsNCiAgICAgICAgICAgIHAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6b3BmaWxlKFwnbmV3dGltZVwnLFwnJyAuICRmaWxlZGJbJ3NlcnZlcl9saW5rJ10gLiAnXCcsXCcnIC4gJGZpbGVkYlsnZGlybGluayddIC4gJ1wnKTsiPlRpbWU8L2E+Jyk7DQogICAgICAgICAgICBwKCc8L3RkPjwvdHI+Jyk7DQogICAgICAgICAgICAkZmlsZV9pKys7DQogICAgICAgIH0NCiAgICB9DQogICAgcCgnPHRyIGNsYXNzPSJmb3V0MSI+PHRkIGFsaWduPSJjZW50ZXIiPjxpbnB1dCBuYW1lPSJjaGthbGwiIHZhbHVlPSJvbiIgdHlwZT0iY2hlY2tib3giIG9uY2xpY2s9IkNoZWNrQWxsKHRoaXMuZm9ybSkiIC8+PC90ZD48dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3ducmFyXCcpOyI+UGFja2luZyBkb3dubG9hZCBzZWxlY3RlZDwvYT4gLSA8YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2RlbGZpbGVzXCcpOyI+RGVsZXRlIHNlbGVjdGVkPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjQiIGFsaWduPSJyaWdodCI+JyAuICRkaXJfaSAuICcgZGlyZWN0b3JpZXMgLyAnIC4gJGZpbGVfaSAuICcgZmlsZXM8L3RkPjwvdHI+Jyk7DQogICAgcCgnPC9mb3JtPjwvdGFibGU+Jyk7DQp9IC8vIGVuZCBkaXINCmVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsZmlsZScpIHsNCiAgICBpZiAoJGRvaW5nID09ICJteXNxbHVwbG9hZCIpIHsNCiAgICAgICAgJGZpbGUgPSAkX0ZJTEVTWyd1cGxvYWRmaWxlJ107DQogICAgICAgICRmaWxlbmFtZSA9ICRmaWxlWyd0bXBfbmFtZSddOw0KICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHNhdmVwYXRoKSkgew0KICAgICAgICAgICAgbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoISRmaWxlbmFtZSkgew0KICAgICAgICAgICAgICAgIG0oJ1BsZWFzZSBjaG9vc2UgYSBmaWxlJyk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRmcCA9IEBmb3BlbigkZmlsZW5hbWUsICdyJyk7DQogICAgICAgICAgICAgICAgJGNvbnRlbnRzID0gQGZyZWFkKCRmcCwgZmlsZXNpemUoJGZpbGVuYW1lKSk7DQogICAgICAgICAgICAgICAgQGZjbG9zZSgkZnApOw0KICAgICAgICAgICAgICAgICRjb250ZW50cyA9IGJpbjJoZXgoJGNvbnRlbnRzKTsNCiAgICAgICAgICAgICAgICBpZiAoISR1cG5hbWUpICR1cG5hbWUgPSAkZmlsZVsnbmFtZSddOw0KICAgICAgICAgICAgICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQogICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoIlNFTEVDVCAweHskY29udGVudHN9IEZST00gbXlzcWwudXNlciBJTlRPIERVTVBGSUxFICckc2F2ZXBhdGgnOyIpOw0KICAgICAgICAgICAgICAgIG0oJHJlc3VsdCA/ICdVcGxvYWQgc3VjY2VzcycgOiAnVXBsb2FkIGhhcyBmYWlsZWQ6ICcgLiBteXNxbF9lcnJvcigpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCj8+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQpmdW5jdGlvbiBteXNxbGZpbGUoZG9pbmcpew0KCWlmKCFkb2luZykgcmV0dXJuOw0KCSQoJ2RvaW5nJykudmFsdWU9ZG9pbmc7DQoJJCgnbXlzcWxmaWxlJykuZGJob3N0LnZhbHVlPSQoJ2RiaW5mbycpLmRiaG9zdC52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYnBvcnQudmFsdWU9JCgnZGJpbmZvJykuZGJwb3J0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRidXNlci52YWx1ZT0kKCdkYmluZm8nKS5kYnVzZXIudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuZGJwYXNzLnZhbHVlPSQoJ2RiaW5mbycpLmRicGFzcy52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYm5hbWUudmFsdWU9JCgnZGJpbmZvJykuZGJuYW1lLnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmNoYXJzZXQudmFsdWU9JCgnZGJpbmZvJykuY2hhcnNldC52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5zdWJtaXQoKTsNCn0NCjwvc2NyaXB0Pg0KPD9waHANCiAgICAhJGRiaG9zdCAmJiAkZGJob3N0ID0gJ2xvY2FsaG9zdCc7DQogICAgISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsNCiAgICAhJGRicG9ydCAmJiAkZGJwb3J0ID0gJzMzMDYnOw0KICAgICRjaGFyc2V0cyA9IGFycmF5KCcnID0+ICdEZWZhdWx0JywgJ2diaycgPT4gJ0dCSycsICdiaWc1JyA9PiAnQmlnNScsICd1dGY4JyA9PiAnVVRGLTgnLCAnbGF0aW4xJyA9PiAnTGF0aW4xJyk7DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnTVlTUUwgSW5mb3JtYXRpb24nLCAnbmFtZScgPT4gJ2RiaW5mbycpKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ3NxbGZpbGUnKTsNCiAgICBwKCc8cD4nKTsNCiAgICBwKCdEQkhvc3Q6Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnZGJob3N0JywgJ3NpemUnID0+IDIwLCAndmFsdWUnID0+ICRkYmhvc3QpKTsNCiAgICBwKCc6Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnZGJwb3J0JywgJ3NpemUnID0+IDQsICd2YWx1ZScgPT4gJGRicG9ydCkpOw0KICAgIHAoJ0RCVXNlcjonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYnVzZXInLCAnc2l6ZScgPT4gMTUsICd2YWx1ZScgPT4gJGRidXNlcikpOw0KICAgIHAoJ0RCUGFzczonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYnBhc3MnLCAnc2l6ZScgPT4gMTUsICd2YWx1ZScgPT4gJGRicGFzcykpOw0KICAgIHAoJ0RCTmFtZTonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYm5hbWUnLCAnc2l6ZScgPT4gMTUsICd2YWx1ZScgPT4gJGRibmFtZSkpOw0KICAgIHAoJ0RCQ2hhcnNldDonKTsNCiAgICBtYWtlc2VsZWN0KGFycmF5KCduYW1lJyA9PiAnY2hhcnNldCcsICdvcHRpb24nID0+ICRjaGFyc2V0cywgJ3NlbGVjdGVkJyA9PiAkY2hhcnNldCkpOw0KICAgIHAoJzwvcD4nKTsNCiAgICBmb3JtZm9vdCgpOw0KICAgIHAoJzxmb3JtIGFjdGlvbj0iJyAuICRzZWxmIC4gJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJteXNxbGZpbGUiIGlkPSJteXNxbGZpbGUiPicpOw0KICAgIHAoJzxoMj5VcGxvYWQgZmlsZTwvaDI+Jyk7DQogICAgcCgnPHA+PGI+VGhpcyBvcGVyYXRpb24gdGhlIERCIHVzZXIgbXVzdCBoYXMgRklMRSBwcml2aWxlZ2U8L2I+PC9wPicpOw0KICAgIHAoJzxwPlNhdmUgcGF0aChmdWxscGF0aCk6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InNhdmVwYXRoIiBzaXplPSI0NSIgdHlwZT0idGV4dCIgLz4gQ2hvb3NlIGEgZmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdHlwZT0iZmlsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbHVwbG9hZFwnKTsiPlVwbG9hZDwvYT48L3A+Jyk7DQogICAgcCgnPGgyPkRvd25sb2FkIGZpbGU8L2gyPicpOw0KICAgIHAoJzxwPkZpbGU6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9Im15c3FsZGxmaWxlIiBzaXplPSIxMTUiIHR5cGU9InRleHQiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bXlzcWxmaWxlKFwnbXlzcWxkb3duXCcpOyI+RG93bmxvYWQ8L2E+PC9wPicpOw0KICAgIG1ha2VoaWRlKCdkYmhvc3QnKTsNCiAgICBtYWtlaGlkZSgnZGJwb3J0Jyk7DQogICAgbWFrZWhpZGUoJ2RidXNlcicpOw0KICAgIG1ha2VoaWRlKCdkYnBhc3MnKTsNCiAgICBtYWtlaGlkZSgnZGJuYW1lJyk7DQogICAgbWFrZWhpZGUoJ2NoYXJzZXQnKTsNCiAgICBtYWtlaGlkZSgnZG9pbmcnKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ3NxbGZpbGUnKTsNCiAgICBwKCc8L2Zvcm0+Jyk7DQp9IGVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsYWRtaW4nKSB7DQogICAgISRkYmhvc3QgJiYgJGRiaG9zdCA9ICdsb2NhbGhvc3QnOw0KICAgICEkZGJ1c2VyICYmICRkYnVzZXIgPSAncm9vdCc7DQogICAgISRkYnBvcnQgJiYgJGRicG9ydCA9ICczMzA2JzsNCiAgICAkZGJmb3JtID0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJjb25uZWN0IiBuYW1lPSJjb25uZWN0IiB2YWx1ZT0iMSIgLz4nOw0KICAgIGlmIChpc3NldCgkZGJob3N0KSkgew0KICAgICAgICAkZGJmb3JtLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYmhvc3RcIiBuYW1lPVwiZGJob3N0XCIgdmFsdWU9XCIkZGJob3N0XCIgLz5cbiI7DQogICAgfQ0KICAgIGlmIChpc3NldCgkZGJ1c2VyKSkgew0KICAgICAgICAkZGJmb3JtLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnVzZXJcIiBuYW1lPVwiZGJ1c2VyXCIgdmFsdWU9XCIkZGJ1c2VyXCIgLz5cbiI7DQogICAgfQ0KICAgIGlmIChpc3NldCgkZGJwYXNzKSkgew0KICAgICAgICAkZGJmb3JtLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBhc3NcIiBuYW1lPVwiZGJwYXNzXCIgdmFsdWU9XCIkZGJwYXNzXCIgLz5cbiI7DQogICAgfQ0KICAgIGlmIChpc3NldCgkZGJwb3J0KSkgew0KICAgICAgICAkZGJmb3JtLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBvcnRcIiBuYW1lPVwiZGJwb3J0XCIgdmFsdWU9XCIkZGJwb3J0XCIgLz5cbiI7DQogICAgfQ0KICAgIGlmIChpc3NldCgkZGJuYW1lKSkgew0KICAgICAgICAkZGJmb3JtLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYm5hbWVcIiBuYW1lPVwiZGJuYW1lXCIgdmFsdWU9XCIkZGJuYW1lXCIgLz5cbiI7DQogICAgfQ0KICAgIGlmIChpc3NldCgkY2hhcnNldCkpIHsNCiAgICAgICAgJGRiZm9ybS49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiY2hhcnNldFwiIG5hbWU9XCJjaGFyc2V0XCIgdmFsdWU9XCIkY2hhcnNldFwiIC8+XG4iOw0KICAgIH0NCiAgICBpZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgJHNhdmVhc2ZpbGUpIHsNCiAgICAgICAgaWYgKCEkdGFibGUpIHsNCiAgICAgICAgICAgIG0oJ1BsZWFzZSBjaG9vc2UgdGhlIHRhYmxlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KICAgICAgICAgICAgJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOw0KICAgICAgICAgICAgJGZwID0gQGZvcGVuKCRwYXRoLCAndycpOw0KICAgICAgICAgICAgaWYgKCRmcCkgew0KICAgICAgICAgICAgICAgICRyZXN1bHQgPSBxKCdTSE9XIHRhYmxlcycpOw0KICAgICAgICAgICAgICAgIGlmICghJHJlc3VsdCkgcCgnPGgyPicgLiBteXNxbF9lcnJvcigpIC4gJzwvaDI+Jyk7DQogICAgICAgICAgICAgICAgJG15c3FsZGF0YSA9ICcnOw0KICAgICAgICAgICAgICAgIHdoaWxlICgkY3Vycm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR0YWJsZVskY3Vycm93WzBdXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNxbGR1bXB0YWJsZSgkY3Vycm93WzBdLCAkZnApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOw0KICAgICAgICAgICAgICAgICRmaWxldXJsID0gc3RyX3JlcGxhY2UoU0FfUk9PVCwgJycsICRwYXRoKTsNCiAgICAgICAgICAgICAgICBtKCdEYXRhYmFzZSBoYXMgc3VjY2VzcyBiYWNrdXAgdG8gPGEgaHJlZj0iJyAuICRmaWxldXJsIC4gJyIgdGFyZ2V0PSJfYmxhbmsiPicgLiAkcGF0aCAuICc8L2E+Jyk7DQogICAgICAgICAgICAgICAgbXlzcWxfY2xvc2UoKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgbSgnQmFja3VwIGZhaWxlZCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGlmICgkaW5zZXJ0ICYmICRpbnNlcnRzcWwpIHsNCiAgICAgICAgJGtleXN0ciA9ICR2YWxzdHIgPSAkdG1wID0gJyc7DQogICAgICAgIGZvcmVhY2ggKCRpbnNlcnRzcWwgYXMgJGtleSA9PiAkdmFsKSB7DQogICAgICAgICAgICBpZiAoJHZhbCkgew0KICAgICAgICAgICAgICAgICRrZXlzdHIuPSAkdG1wIC4gJGtleTsNCiAgICAgICAgICAgICAgICAkdmFsc3RyLj0gJHRtcCAuICInIiAuIGFkZHNsYXNoZXMoJHZhbCkgLiAiJyI7DQogICAgICAgICAgICAgICAgJHRtcCA9ICcsJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGtleXN0ciAmJiAkdmFsc3RyKSB7DQogICAgICAgICAgICBkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KICAgICAgICAgICAgbShxKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lICgka2V5c3RyKSBWQUxVRVMgKCR2YWxzdHIpIikgPyAnSW5zZXJ0IG5ldyByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoJHVwZGF0ZSAmJiAkaW5zZXJ0c3FsICYmICRiYXNlNjQpIHsNCiAgICAgICAgJHZhbHN0ciA9ICR0bXAgPSAnJzsNCiAgICAgICAgZm9yZWFjaCAoJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsNCiAgICAgICAgICAgICR2YWxzdHIuPSAkdG1wIC4gJGtleSAuICI9JyIgLiBhZGRzbGFzaGVzKCR2YWwpIC4gIiciOw0KICAgICAgICAgICAgJHRtcCA9ICcsJzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJHZhbHN0cikgew0KICAgICAgICAgICAgJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsNCiAgICAgICAgICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQogICAgICAgICAgICBtKHEoIlVQREFURSAkdGFibGVuYW1lIFNFVCAkdmFsc3RyIFdIRVJFICR3aGVyZSBMSU1JVCAxIikgPyAnUmVjb3JkIHVwZGF0aW5nJyA6IG15c3FsX2Vycm9yKCkpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmICgkZG9pbmcgPT0gJ2RlbCcgJiYgJGJhc2U2NCkgew0KICAgICAgICAkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOw0KICAgICAgICAkZGVsZXRlX3NxbCA9ICJERUxFVEUgRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSI7DQogICAgICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQogICAgICAgIG0ocSgiREVMRVRFIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUiKSA/ICdEZWxldGlvbiByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCiAgICB9DQogICAgaWYgKCR0YWJsZW5hbWUgJiYgJGRvaW5nID09ICdkcm9wJykgew0KICAgICAgICBkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KICAgICAgICBpZiAocSgiRFJPUCBUQUJMRSAkdGFibGVuYW1lIikpIHsNCiAgICAgICAgICAgIG0oJ0Ryb3AgdGFibGUgb2Ygc3VjY2VzcycpOw0KICAgICAgICAgICAgJHRhYmxlbmFtZSA9ICcnOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbShteXNxbF9lcnJvcigpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAkY2hhcnNldHMgPSBhcnJheSgnJyA9PiAnRGVmYXVsdCcsICdnYmsnID0+ICdHQksnLCAnYmlnNScgPT4gJ0JpZzUnLCAndXRmOCcgPT4gJ1VURi04JywgJ2xhdGluMScgPT4gJ0xhdGluMScpOw0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZScgPT4gJ01ZU1FMIE1hbmFnZXInKSk7DQogICAgbWFrZWhpZGUoJ2FjdGlvbicsICdzcWxhZG1pbicpOw0KICAgIHAoJzxwPicpOw0KICAgIHAoJ0RCSG9zdDonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYmhvc3QnLCAnc2l6ZScgPT4gMjAsICd2YWx1ZScgPT4gJGRiaG9zdCkpOw0KICAgIHAoJzonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYnBvcnQnLCAnc2l6ZScgPT4gNCwgJ3ZhbHVlJyA9PiAkZGJwb3J0KSk7DQogICAgcCgnREJVc2VyOicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ2RidXNlcicsICdzaXplJyA9PiAxNSwgJ3ZhbHVlJyA9PiAkZGJ1c2VyKSk7DQogICAgcCgnREJQYXNzOicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ2RicGFzcycsICdzaXplJyA9PiAxNSwgJ3ZhbHVlJyA9PiAkZGJwYXNzKSk7DQogICAgcCgnREJDaGFyc2V0OicpOw0KICAgIG1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnID0+ICdjaGFyc2V0JywgJ29wdGlvbicgPT4gJGNoYXJzZXRzLCAnc2VsZWN0ZWQnID0+ICRjaGFyc2V0KSk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnY29ubmVjdCcsICd2YWx1ZScgPT4gJ0Nvbm5lY3QnLCAndHlwZScgPT4gJ3N1Ym1pdCcsICdjbGFzcycgPT4gJ2J0JykpOw0KICAgIHAoJzwvcD4nKTsNCiAgICBmb3JtZm9vdCgpOw0KPz4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIGVkaXRyZWNvcmQoYWN0aW9uLCBiYXNlNjQsIHRhYmxlbmFtZSl7DQoJaWYgKGFjdGlvbiA9PSAnZGVsJykgew0KCQlpZiAoIWNvbmZpcm0oJ0lzIG9yIGlzblwndCBkZWxldGlvbiByZWNvcmQ/JykpIHJldHVybjsNCgl9DQoJJCgncmVjb3JkbGlzdCcpLmRvaW5nLnZhbHVlPWFjdGlvbjsNCgkkKCdyZWNvcmRsaXN0JykuYmFzZTY0LnZhbHVlPWJhc2U2NDsNCgkkKCdyZWNvcmRsaXN0JykudGFibGVuYW1lLnZhbHVlPXRhYmxlbmFtZTsNCgkkKCdyZWNvcmRsaXN0Jykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBtb2RkYm5hbWUoZGJuYW1lKSB7DQoJaWYoIWRibmFtZSkgcmV0dXJuOw0KCSQoJ3NldGRibmFtZScpLmRibmFtZS52YWx1ZT1kYm5hbWU7DQoJJCgnc2V0ZGJuYW1lJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBzZXR0YWJsZSh0YWJsZW5hbWUsZG9pbmcscGFnZSkgew0KCWlmKCF0YWJsZW5hbWUpIHJldHVybjsNCglpZiAoZG9pbmcpIHsNCgkJJCgnc2V0dGFibGUnKS5kb2luZy52YWx1ZT1kb2luZzsNCgl9DQoJaWYgKHBhZ2UpIHsNCgkJJCgnc2V0dGFibGUnKS5wYWdlLnZhbHVlPXBhZ2U7DQoJfQ0KCSQoJ3NldHRhYmxlJykudGFibGVuYW1lLnZhbHVlPXRhYmxlbmFtZTsNCgkkKCdzZXR0YWJsZScpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQo8P3BocA0KICAgIC8vIFNRTA0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAncmVjb3JkbGlzdCcpKTsNCiAgICBtYWtlaGlkZSgnZG9pbmcnKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ3NxbGFkbWluJyk7DQogICAgbWFrZWhpZGUoJ2Jhc2U2NCcpOw0KICAgIG1ha2VoaWRlKCd0YWJsZW5hbWUnKTsNCiAgICBwKCRkYmZvcm0pOw0KICAgIGZvcm1mb290KCk7DQogICAgLy8gRGF0YQ0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJyA9PiAnc2V0ZGJuYW1lJykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnc3FsYWRtaW4nKTsNCiAgICBwKCRkYmZvcm0pOw0KICAgIGlmICghJGRibmFtZSkgew0KICAgICAgICBtYWtlaGlkZSgnZGJuYW1lJyk7DQogICAgfQ0KICAgIGZvcm1mb290KCk7DQogICAgZm9ybWhlYWQoYXJyYXkoJ25hbWUnID0+ICdzZXR0YWJsZScpKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ3NxbGFkbWluJyk7DQogICAgcCgkZGJmb3JtKTsNCiAgICBtYWtlaGlkZSgndGFibGVuYW1lJyk7DQogICAgbWFrZWhpZGUoJ3BhZ2UnLCAkcGFnZSk7DQogICAgbWFrZWhpZGUoJ2RvaW5nJyk7DQogICAgZm9ybWZvb3QoKTsNCiAgICAkY2FjaGV0YWJsZXMgPSBhcnJheSgpOw0KICAgICRwYWdlbnVtID0gMzA7DQogICAgJHBhZ2UgPSBpbnR2YWwoJHBhZ2UpOw0KICAgIGlmICgkcGFnZSkgew0KICAgICAgICAkc3RhcnRfbGltaXQgPSAoJHBhZ2UgLSAxKSAqICRwYWdlbnVtOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRzdGFydF9saW1pdCA9IDA7DQogICAgICAgICRwYWdlID0gMTsNCiAgICB9DQogICAgaWYgKGlzc2V0KCRkYmhvc3QpICYmIGlzc2V0KCRkYnVzZXIpICYmIGlzc2V0KCRkYnBhc3MpICYmIGlzc2V0KCRjb25uZWN0KSkgew0KICAgICAgICBkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KICAgICAgICAvLyBnZXQgbXlzcWwgc2VydmVyDQogICAgICAgICRteXNxbHZlciA9IG15c3FsX2dldF9zZXJ2ZXJfaW5mbygpOw0KICAgICAgICBwKCc8cD5NeVNRTCAnIC4gJG15c3FsdmVyIC4gJyBydW5uaW5nIGluICcgLiAkZGJob3N0IC4gJyBhcyAnIC4gJGRidXNlciAuICdAJyAuICRkYmhvc3QgLiAnPC9wPicpOw0KICAgICAgICAkaGlnaHZlciA9ICRteXNxbHZlciA+ICc0LjEnID8gMSA6IDA7DQogICAgICAgIC8vIFNob3cgZGF0YWJhc2UNCiAgICAgICAgJHF1ZXJ5ID0gcSgiU0hPVyBEQVRBQkFTRVMiKTsNCiAgICAgICAgJGRicyA9IGFycmF5KCk7DQogICAgICAgICRkYnNbXSA9ICctLSBTZWxlY3QgYSBkYXRhYmFzZSAtLSc7DQogICAgICAgIHdoaWxlICgkZGIgPSBteXNxbF9mZXRjaF9hcnJheSgkcXVlcnkpKSB7DQogICAgICAgICAgICAkZGJzWyRkYlsnRGF0YWJhc2UnXV0gPSAkZGJbJ0RhdGFiYXNlJ107DQogICAgICAgIH0NCiAgICAgICAgbWFrZXNlbGVjdChhcnJheSgndGl0bGUnID0+ICdQbGVhc2Ugc2VsZWN0IGEgZGF0YWJhc2U6JywgJ25hbWUnID0+ICdkYltdJywgJ29wdGlvbicgPT4gJGRicywgJ3NlbGVjdGVkJyA9PiAkZGJuYW1lLCAnb25jaGFuZ2UnID0+ICdtb2RkYm5hbWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywgJ25ld2xpbmUnID0+IDEpKTsNCiAgICAgICAgJHRhYmxlZGIgPSBhcnJheSgpOw0KICAgICAgICBpZiAoJGRibmFtZSkgew0KICAgICAgICAgICAgcCgnPHA+Jyk7DQogICAgICAgICAgICBwKCdDdXJyZW50IGRhYmFiYXNlOiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vZGRibmFtZShcJycgLiAkZGJuYW1lIC4gJ1wnKTsiPicgLiAkZGJuYW1lIC4gJzwvYT4nKTsNCiAgICAgICAgICAgIGlmICgkdGFibGVuYW1lKSB7DQogICAgICAgICAgICAgICAgcCgnIHwgQ3VycmVudCBUYWJsZTogPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycgLiAkdGFibGVuYW1lIC4gJ1wnKTsiPicgLiAkdGFibGVuYW1lIC4gJzwvYT4gWyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJyAuICR0YWJsZW5hbWUgLiAnXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlbmFtZSAuICdcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycgLiAkdGFibGVuYW1lIC4gJ1wnLCBcJ2Ryb3BcJyk7Ij5Ecm9wPC9hPiBdJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwKCc8L3A+Jyk7DQogICAgICAgICAgICBteXNxbF9zZWxlY3RfZGIoJGRibmFtZSk7DQogICAgICAgICAgICAkZ2V0bnVtc3FsID0gJyc7DQogICAgICAgICAgICAkcnVucXVlcnkgPSAwOw0KICAgICAgICAgICAgaWYgKCRzcWxfcXVlcnkpIHsNCiAgICAgICAgICAgICAgICAkcnVucXVlcnkgPSAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGFsbG93ZWRpdCA9IDA7DQogICAgICAgICAgICBpZiAoJHRhYmxlbmFtZSAmJiAhJHNxbF9xdWVyeSkgew0KICAgICAgICAgICAgICAgICRzcWxfcXVlcnkgPSAiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIjsNCiAgICAgICAgICAgICAgICAkZ2V0bnVtc3FsID0gJHNxbF9xdWVyeTsNCiAgICAgICAgICAgICAgICAkc3FsX3F1ZXJ5ID0gJHNxbF9xdWVyeSAuICIgTElNSVQgJHN0YXJ0X2xpbWl0LCAkcGFnZW51bSI7DQogICAgICAgICAgICAgICAgJGFsbG93ZWRpdCA9IDE7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwKCc8Zm9ybSBhY3Rpb249IicgLiAkc2VsZiAuICciIG1ldGhvZD0iUE9TVCI+Jyk7DQogICAgICAgICAgICBwKCc8cD48dGFibGUgd2lkdGg9IjIwMCIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQgY29sc3Bhbj0iMiI+UnVuIFNRTCBxdWVyeS9xdWVyaWVzIG9uIGRhdGFiYXNlIDxmb250IGNvbG9yPXJlZD48Yj4nIC4gJGRibmFtZSAuICc8L2ZvbnQ+PC9iPjo8QlI+RXhhbXBsZSBWQkIgUGFzc3dvcmQ6IDxmb250IGNvbG9yPXJlZD52YmF0ZWFtPC9mb250PjxCUj48Zm9udCBjb2xvcj15ZWxsb3c+VVBEQVRFIGB1c2VyYCBTRVQgYHBhc3N3b3JkYCA9IFwnNjllNTNlNWFiOTUzNmU1NWQzMWZmNTMzYWVmYzRmYmVcJywgc2FsdCA9IFwncDVUXCcgV0hFUkUgYHVzZXJpZGAgPSBcJzFcJyA8L2ZvbnQ+DQoJCQk8L3RkPjwvdHI+PHRyPjx0ZD48dGV4dGFyZWEgbmFtZT0ic3FsX3F1ZXJ5IiBjbGFzcz0iYXJlYSIgc3R5bGU9IndpZHRoOjYwMHB4O2hlaWdodDo1MHB4O292ZXJmbG93OmF1dG87Ij4nIC4gaHRtbHNwZWNpYWxjaGFycygkc3FsX3F1ZXJ5LCBFTlRfUVVPVEVTKSAuICc8L3RleHRhcmVhPjwvdGQ+PHRkIHN0eWxlPSJwYWRkaW5nOjAgNXB4OyI+PGlucHV0IGNsYXNzPSJidCIgc3R5bGU9ImhlaWdodDo1MHB4OyIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJRdWVyeSIgLz48L3RkPjwvdHI+PC90YWJsZT48L3A+Jyk7DQogICAgICAgICAgICBtYWtlaGlkZSgndGFibGVuYW1lJywgJHRhYmxlbmFtZSk7DQogICAgICAgICAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ3NxbGFkbWluJyk7DQogICAgICAgICAgICBwKCRkYmZvcm0pOw0KICAgICAgICAgICAgcCgnPC9mb3JtPicpOw0KICAgICAgICAgICAgaWYgKCR0YWJsZW5hbWUgfHwgKCRydW5xdWVyeSAmJiAkc3FsX3F1ZXJ5KSkgew0KICAgICAgICAgICAgICAgIGlmICgkZG9pbmcgPT0gJ3N0cnVjdHVyZScpIHsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoIlNIT1cgQ09MVU1OUyBGUk9NICR0YWJsZW5hbWUiKTsNCiAgICAgICAgICAgICAgICAgICAgJHJvd2RiID0gYXJyYXkoKTsNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHJvd2RiW10gPSAkcm93Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5GaWVsZDwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5UeXBlPC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkPk51bGw8L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+S2V5PC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkPkRlZmF1bHQ8L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+RXh0cmE8L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8L3RyPicpOw0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXNiZyA9IGJnKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicgLiAkcm93WydGaWVsZCddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+JyAuICRyb3dbJ1R5cGUnXSAuICc8L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicgLiAkcm93WydOdWxsJ10gLiAnJm5ic3A7PC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHJvd1snS2V5J10gLiAnJm5ic3A7PC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHJvd1snRGVmYXVsdCddIC4gJyZuYnNwOzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+JyAuICRyb3dbJ0V4dHJhJ10gLiAnJm5ic3A7PC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzwvdHI+Jyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGJmb290KCk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkb2luZyA9PSAnaW5zZXJ0JyB8fCAkZG9pbmcgPT0gJ2VkaXQnKSB7DQogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBxKCdTSE9XIENPTFVNTlMgRlJPTSAnIC4gJHRhYmxlbmFtZSk7DQogICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyb3dkYltdID0gJHJvdzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkcnMgPSBhcnJheSgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJGRvaW5nID09ICdpbnNlcnQnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8aDI+SW5zZXJ0IG5ldyBsaW5lIGluICcgLiAkdGFibGVuYW1lIC4gJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzxoMj5VcGRhdGUgcmVjb3JkIGluICcgLiAkdGFibGVuYW1lIC4gJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSBMSU1JVCAxIik7DQogICAgICAgICAgICAgICAgICAgICAgICAkcnMgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwKCc8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iJyAuICRzZWxmIC4gJyI+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJGRiZm9ybSk7DQogICAgICAgICAgICAgICAgICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnc3FsYWRtaW4nKTsNCiAgICAgICAgICAgICAgICAgICAgbWFrZWhpZGUoJ3RhYmxlbmFtZScsICR0YWJsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyc1skcm93WydGaWVsZCddXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHJzWyRyb3dbJ0ZpZWxkJ11dKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+PGI+JyAuICRyb3dbJ0ZpZWxkJ10gLiAnPC9iPjxiciAvPicgLiAkcm93WydUeXBlJ10gLiAnPC90ZD48dGQ+PHRleHRhcmVhIGNsYXNzPSJhcmVhIiBuYW1lPSJpbnNlcnRzcWxbJyAuICRyb3dbJ0ZpZWxkJ10gLiAnXSIgc3R5bGU9IndpZHRoOjUwMHB4O2hlaWdodDo2MHB4O292ZXJmbG93OmF1dG87Ij4nIC4gJHZhbHVlIC4gJzwvdGV4dGFyZWE+PC90ZD48L3RyPicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgkZG9pbmcgPT0gJ2luc2VydCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCBjbGFzcz0iYnQiIHR5cGU9InN1Ym1pdCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0iSW5zZXJ0IiAvPjwvdGQ+PC90cj4nKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCBjbGFzcz0iYnQiIHR5cGU9InN1Ym1pdCIgbmFtZT0idXBkYXRlIiB2YWx1ZT0iVXBkYXRlIiAvPjwvdGQ+PC90cj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VoaWRlKCdiYXNlNjQnLCAkYmFzZTY0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwKCc8L3RhYmxlPjwvZm9ybT4nKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkcXVlcnlzID0gQGV4cGxvZGUoJzsnLCAkc3FsX3F1ZXJ5KTsNCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHF1ZXJ5cyBhcyAkbnVtID0+ICRxdWVyeSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRxdWVyeSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoIjxwPjxiPlF1ZXJ5I3skbnVtfSA6ICIgLiBodG1sc3BlY2lhbGNoYXJzKCRxdWVyeSwgRU5UX1FVT1RFUykgLiAiPC9iPjwvcD4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHF5KCRxdWVyeSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgnPGgyPkVycm9yIDogJyAuIG15c3FsX2Vycm9yKCkgLiAnPC9oMj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJ0b2xvd2VyKHN1YnN0cigkcXVlcnksIDAsIDEzKSkgPT0gJ3NlbGVjdCAqIGZyb20nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFsbG93ZWRpdCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGdldG51bXNxbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0YXRvbCA9IG15c3FsX251bV9yb3dzKHEoJGdldG51bXNxbCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtdWx0aXBhZ2UgPSBtdWx0aSgkdGF0b2wsICRwYWdlbnVtLCAkcGFnZSwgJHRhYmxlbmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0YWJsZW5hbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsX2xpbmUgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iLCAiXHQiKSwgYXJyYXkoJyAnLCAnICcsICcgJyksIHRyaW0oaHRtbHNwZWNpYWxjaGFycygkcXVlcnkpKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbF9saW5lID0gcHJlZ19yZXBsYWNlKCIvXC9cKlteKFwqXC8pXSpcKlwvL2kiLCAiICIsICRzcWxfbGluZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoIi9mcm9tXHMrYHswLDF9KFtcd10rKWB7MCwxfVxzKy9pIiwgJHNxbF9saW5lLCAkbWF0Y2hlcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhYmxlbmFtZSA9ICRtYXRjaGVzWzFdWzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoJHF1ZXJ5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJG11bHRpcGFnZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYWxsb3dlZGl0KSBwKCc8dGQ+QWN0aW9uPC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWVsZG51bSA9IEBteXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7JGkgPCAkZmllbGRudW07JGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lID0gQG15c3FsX2ZpZWxkX25hbWUoJHJlc3VsdCwgJGkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlID0gQG15c3FsX2ZpZWxkX3R5cGUoJHJlc3VsdCwgJGkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSBAbXlzcWxfZmllbGRfbGVuKCRyZXN1bHQsICRpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCI8dGQgbm93cmFwPiRuYW1lPGJyPjxzcGFuPiR0eXBlKCRsZW4pPC9zcGFuPjwvdGQ+Iik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8L3RyPicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRtbiA9IEBteXNxbF9mZXRjaF9hc3NvYygkcmVzdWx0KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzYmcgPSBiZygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdoZXJlID0gJHRtcCA9ICRiMSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRtbiBhcyAka2V5ID0+ICRpbnNpZGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpbnNpZGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZS49ICR0bXAgLiAka2V5IC4gIj0nIiAuIGFkZHNsYXNoZXMoJGluc2lkZSkgLiAiJyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG1wID0gJyBBTkQgJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYjEuPSAnPHRkIG5vd3JhcD4nIC4gaHRtbF9jbGVhbigkaW5zaWRlKSAuICcmbmJzcDs8L3RkPic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSA9IGJhc2U2NF9lbmNvZGUoJHdoZXJlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGFsbG93ZWRpdCkgcCgnPHRkIG5vd3JhcD48YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdlZGl0XCcsIFwnJyAuICR3aGVyZSAuICdcJywgXCcnIC4gJHRhYmxlbmFtZSAuICdcJyk7Ij5FZGl0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZWRpdHJlY29yZChcJ2RlbFwnLCBcJycgLiAkd2hlcmUgLiAnXCcsIFwnJyAuICR0YWJsZW5hbWUgLiAnXCcpOyI+RGVsPC9hPjwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgkYjEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJzwvdHI+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJGIxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiZm9vdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgkbXVsdGlwYWdlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXIgPSBteXNxbF9hZmZlY3RlZF9yb3dzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8aDI+YWZmZWN0ZWQgcm93cyA6IDxiPicgLiAkYXIgLiAnPC9iPjwvaDI+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJHF1ZXJ5ID0gcSgiU0hPVyBUQUJMRSBTVEFUVVMiKTsNCiAgICAgICAgICAgICAgICAkdGFibGVfbnVtID0gJHRhYmxlX3Jvd3MgPSAkZGF0YV9zaXplID0gMDsNCiAgICAgICAgICAgICAgICAkdGFibGVkYiA9IGFycmF5KCk7DQogICAgICAgICAgICAgICAgd2hpbGUgKCR0YWJsZSA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJGRhdGFfc2l6ZSA9ICRkYXRhX3NpemUgKyAkdGFibGVbJ0RhdGFfbGVuZ3RoJ107DQogICAgICAgICAgICAgICAgICAgICR0YWJsZV9yb3dzID0gJHRhYmxlX3Jvd3MgKyAkdGFibGVbJ1Jvd3MnXTsNCiAgICAgICAgICAgICAgICAgICAgJHRhYmxlWydEYXRhX2xlbmd0aCddID0gc2l6ZWNvdW50KCR0YWJsZVsnRGF0YV9sZW5ndGgnXSk7DQogICAgICAgICAgICAgICAgICAgICR0YWJsZV9udW0rKzsNCiAgICAgICAgICAgICAgICAgICAgJHRhYmxlZGJbXSA9ICR0YWJsZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJGRhdGFfc2l6ZSA9IHNpemVjb3VudCgkZGF0YV9zaXplKTsNCiAgICAgICAgICAgICAgICB1bnNldCgkdGFibGUpOw0KICAgICAgICAgICAgICAgIHAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQogICAgICAgICAgICAgICAgcCgnPGZvcm0gYWN0aW9uPSInIC4gJHNlbGYgLiAnIiBtZXRob2Q9IlBPU1QiPicpOw0KICAgICAgICAgICAgICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnc3FsYWRtaW4nKTsNCiAgICAgICAgICAgICAgICBwKCRkYmZvcm0pOw0KICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7DQogICAgICAgICAgICAgICAgcCgnPHRkIHdpZHRoPSIyJSIgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPicpOw0KICAgICAgICAgICAgICAgIHAoJzx0ZD5OYW1lPC90ZD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQ+Um93czwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgcCgnPHRkPkRhdGFfbGVuZ3RoPC90ZD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQ+Q3JlYXRlX3RpbWU8L3RkPicpOw0KICAgICAgICAgICAgICAgIHAoJzx0ZD5VcGRhdGVfdGltZTwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgaWYgKCRoaWdodmVyKSB7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5FbmdpbmU8L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+Q29sbGF0aW9uPC90ZD4nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcCgnPC90cj4nKTsNCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdGFibGVkYiBhcyAka2V5ID0+ICR0YWJsZSkgew0KICAgICAgICAgICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsNCiAgICAgICAgICAgICAgICAgICAgcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsNCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyJSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0YWJsZVtdIiB2YWx1ZT0iJyAuICR0YWJsZVsnTmFtZSddIC4gJyIgLz48L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycgLiAkdGFibGVbJ05hbWUnXSAuICdcJyk7Ij4nIC4gJHRhYmxlWydOYW1lJ10gLiAnPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlWydOYW1lJ10gLiAnXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlWydOYW1lJ10gLiAnXCcsIFwnc3RydWN0dXJlXCcpOyI+U3RydWN0dXJlPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlWydOYW1lJ10gLiAnXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF08L3RkPicpOw0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+JyAuICR0YWJsZVsnUm93cyddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHRhYmxlWydEYXRhX2xlbmd0aCddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHRhYmxlWydDcmVhdGVfdGltZSddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHRhYmxlWydVcGRhdGVfdGltZSddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgIGlmICgkaGlnaHZlcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicgLiAkdGFibGVbJ0VuZ2luZSddIC4gJzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+JyAuICR0YWJsZVsnQ29sbGF0aW9uJ10gLiAnPC90ZD4nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwKCc8L3RyPicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9Zm91dD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQ+Jm5ic3A7PC90ZD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQ+VG90YWwgdGFibGVzOiAnIC4gJHRhYmxlX251bSAuICc8L3RkPicpOw0KICAgICAgICAgICAgICAgIHAoJzx0ZD4nIC4gJHRhYmxlX3Jvd3MgLiAnPC90ZD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQ+JyAuICRkYXRhX3NpemUgLiAnPC90ZD4nKTsNCiAgICAgICAgICAgICAgICBwKCc8dGQgY29sc3Bhbj0iJyAuICgkaGlnaHZlciA/IDQgOiAyKSAuICciPiZuYnNwOzwvdGQ+Jyk7DQogICAgICAgICAgICAgICAgcCgnPC90cj4nKTsNCiAgICAgICAgICAgICAgICBwKCI8dHIgY2xhc3M9XCJmb3V0XCI+PHRkIGNvbHNwYW49XCIiIC4gKCRoaWdodmVyID8gOCA6IDYpIC4gIlwiPjxpbnB1dCBuYW1lPVwic2F2ZWFzZmlsZVwiIHZhbHVlPVwiMVwiIHR5cGU9XCJjaGVja2JveFwiIC8+IFNhdmUgYXMgZmlsZSA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIG5hbWU9XCJwYXRoXCIgdmFsdWU9XCIiIC4gU0FfUk9PVCAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICJfTXlTUUwuc3FsXCIgdHlwZT1cInRleHRcIiBzaXplPVwiNjBcIiAvPiA8aW5wdXQgY2xhc3M9XCJidFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiZG93bnJhclwiIHZhbHVlPVwiRXhwb3J0IHNlbGVjdGlvbiB0YWJsZVwiIC8+PC90ZD48L3RyPiIpOw0KICAgICAgICAgICAgICAgIG1ha2VoaWRlKCdkb2luZycsICdiYWNrdXBteXNxbCcpOw0KICAgICAgICAgICAgICAgIGZvcm1mb290KCk7DQogICAgICAgICAgICAgICAgcCgiPC90YWJsZT4iKTsNCiAgICAgICAgICAgICAgICBmcigkcXVlcnkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIHRiZm9vdCgpOw0KICAgIEBteXNxbF9jbG9zZSgpOw0KfSAvL2VuZCBzcWwgYmFja3VwDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2JhY2tjb25uZWN0Jykgew0KICAgICEkeW91cmlwICYmICR5b3VyaXAgPSAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsNCiAgICAhJHlvdXJwb3J0ICYmICR5b3VycG9ydCA9ICcxMjM0NSc7DQogICAgJHVzZWRiID0gYXJyYXkoJ3BlcmwnID0+ICdwZXJsJywgJ2MnID0+ICdjJyk7DQogICAgJGJhY2tfY29ubmVjdCA9ICJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqIiAuICJhRzhnSW1CcFpHQWlPeTlpYVc0dmMyZ25PdzBLSkRBOUpHTnRaRHNOQ2lSMFlYSm5aWFE5SkVGU1IxWmJNRjA3RFFva2NHOXlkRDBrUVZKSFZsc3hYVHNOQ2lScFlXUmtjajFwYm1WMFgyRjBiMjRvSkhSIiAuICJoY21kbGRDa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUndiM0owTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUIiAuICJzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9JIiAuICJrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpIiAuICJLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2drYzNsemRHVnRLVHNOQ21Oc2IzTmxLRk5VUkVsIiAuICJPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsNCiAgICAkYmFja19jb25uZWN0X2MgPSAiSTJsdVkyeDFaR1VnUEhOMFpHbHZMbWcrRFFvamFXNWpiSFZrWlNBOGMzbHpMM052WTJ0bGRDNW9QZzBLSTJsdVkyeDFaR1VnUEc1bGRHbHVaWFF2YVc0dWFENE5DbWx1ZEMiIC4gIkJ0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNwaGNtZDJXMTBwRFFwN0RRb2dhVzUwSUdaa093MEtJSE4wY25WamRDQnpiMk5yWVdSa2NsOXBiaUJ6YVc0N0RRb2dZMmhoY2lCeWJYTmJNakZkUFNKeWIiIC4gIlNBdFppQWlPeUFOQ2lCa1lXVnRiMjRvTVN3d0tUc05DaUJ6YVc0dWMybHVYMlpoYldsc2VTQTlJRUZHWDBsT1JWUTdEUW9nYzJsdUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb1lYUnZhU2hoY21kMld6SmQiIC4gIktTazdEUW9nYzJsdUxuTnBibDloWkdSeUxuTmZZV1JrY2lBOUlHbHVaWFJmWVdSa2NpaGhjbWQyV3pGZEtUc2dEUW9nWW5wbGNtOG9ZWEpuZGxzeFhTeHpkSEpzWlc0b1lYSm5kbHN4WFNrck1TdHpkSEoiIC4gInNaVzRvWVhKbmRsc3lYU2twT3lBTkNpQm1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1NWQlFVazlVVDE5VVExQXBJRHNnRFFvZ2FXWWdLQ2hqYjI1dVpXTjBLR1prTEMiIC4gIkFvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSUNaemFXNHNJSE5wZW1WdlppaHpkSEoxWTNRZ2MyOWphMkZrWkhJcEtTazhNQ2tnZXcwS0lDQWdjR1Z5Y205eUtDSmJMVjBnWTI5dWJtVmpkQ2dwSWlrN0QiIC4gIlFvZ0lDQmxlR2wwS0RBcE93MEtJSDBOQ2lCemRISmpZWFFvY20xekxDQmhjbWQyV3pCZEtUc05DaUJ6ZVhOMFpXMG9jbTF6S1RzZ0lBMEtJR1IxY0RJb1ptUXNJREFwT3cwS0lHUjFjRElvWm1Rc0lERXAiIC4gIk93MEtJR1IxY0RJb1ptUXNJRElwT3cwS0lHVjRaV05zS0NJdlltbHVMM05vSWl3aWMyZ2dMV2tpTENCT1ZVeE1LVHNOQ2lCamJHOXpaU2htWkNrN0lBMEtmUT09IjsNCiAgICBpZiAoJHN0YXJ0ICYmICR5b3VyaXAgJiYgJHlvdXJwb3J0ICYmICR1c2UpIHsNCiAgICAgICAgaWYgKCR1c2UgPT0gJ3BlcmwnKSB7DQogICAgICAgICAgICBjZignL3RtcC9hbmdlbF9iYycsICRiYWNrX2Nvbm5lY3QpOw0KICAgICAgICAgICAgJHJlcyA9IGV4ZWN1dGUod2hpY2goJ3BlcmwnKSAuICIgL3RtcC9hbmdlbF9iYyAkeW91cmlwICR5b3VycG9ydCAmIik7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBjZignL3RtcC9hbmdlbF9iYy5jJywgJGJhY2tfY29ubmVjdF9jKTsNCiAgICAgICAgICAgICRyZXMgPSBleGVjdXRlKCdnY2MgLW8gL3RtcC9hbmdlbF9iYyAvdG1wL2FuZ2VsX2JjLmMnKTsNCiAgICAgICAgICAgIEB1bmxpbmsoJy90bXAvYW5nZWxfYmMuYycpOw0KICAgICAgICAgICAgJHJlcyA9IGV4ZWN1dGUoIi90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOw0KICAgICAgICB9DQogICAgICAgIG0oIk5vdyBzY3JpcHQgdHJ5IGNvbm5lY3QgdG8gJHlvdXJpcCBwb3J0ICR5b3VycG9ydCAuLi4iKTsNCiAgICB9DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnQmFjayBDb25uZWN0JykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnYmFja2Nvbm5lY3QnKTsNCiAgICBwKCc8cD4nKTsNCiAgICBwKCdZb3VyIElQOicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ3lvdXJpcCcsICdzaXplJyA9PiAyMCwgJ3ZhbHVlJyA9PiAkeW91cmlwKSk7DQogICAgcCgnWW91ciBQb3J0OicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ3lvdXJwb3J0JywgJ3NpemUnID0+IDE1LCAndmFsdWUnID0+ICR5b3VycG9ydCkpOw0KICAgIHAoJ1VzZTonKTsNCiAgICBtYWtlc2VsZWN0KGFycmF5KCduYW1lJyA9PiAndXNlJywgJ29wdGlvbicgPT4gJHVzZWRiLCAnc2VsZWN0ZWQnID0+ICR1c2UpKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdzdGFydCcsICd2YWx1ZScgPT4gJ1N0YXJ0JywgJ3R5cGUnID0+ICdzdWJtaXQnLCAnY2xhc3MnID0+ICdidCcpKTsNCiAgICBwKCc8L3A+Jyk7DQogICAgZm9ybWZvb3QoKTsNCn0gLy9lbmQgYmFja2Nvbm5lY3Qgd2luZG93IHZpYSBOQw0KLy8gQnJ1dGUNCmVsc2VpZiAoJGFjdGlvbiA9PSAnYnJ1dGUnKSB7DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnQnJ1dGUgRm9yY2VyJykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnYnJ1dGUnKTsNCiAgICBtYWtlaGlkZSgnZGlyJywgJGJydXRlKTsNCiAgICBAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgMTAwMDAwMDAwMDAwMCk7DQogICAgJGNvbm5lY3RfdGltZW91dCA9IDU7DQogICAgQHNldF90aW1lX2xpbWl0KDApOw0KICAgICRzdWJtaXQgPSAkX1JFUVVFU1RbJ3N1Ym1pdCddOw0KICAgICR1c2VycyA9ICRfUkVRVUVTVFsndXNlcnMnXTsNCiAgICAkcGFzcyA9ICRfUkVRVUVTVFsncGFzc3dvcmRzJ107DQogICAgJHRhcmdldCA9ICRfUkVRVUVTVFsndGFyZ2V0J107DQogICAgJG9wdGlvbiA9ICRfUkVRVUVTVFsnb3B0aW9uJ107DQogICAgJHBhc3NsaXN0ID0gIjAxMjM0NTYNCjAxMjM0NTY3DQowMTIzNDU2NzgNCjAxMjM0NTY3ODkNCjAxMjM0NTY3ODkwDQoxMjM0NTYNCjEyMzQ1NjcNCjEyMzQ1Njc4DQoxMjM0NTY3ODkNCjEyMzQ1Njc4OTANCjExMTExMQ0KMDAwMDAwDQoyMjIyMjINCjMzMzMzMw0KNDQ0NDQ0DQo1NTU1NTUNCjY2NjY2Ng0KNzc3Nzc3DQo4ODg4ODgNCjk5OTk5OQ0KMTIzMTIzDQo0NTY0NTYNCjc4OTc4OQ0KMTIzMzIxDQo0NTY2NTQNCjY1NDMyMQ0KNzY1NDMyMQ0KODc2NTQzMjENCjk4NzY1NDMyMQ0KMDk4NzY1NDMyMQ0KYWRtaW4NCmFkbWluaXN0cmF0b3INCmFkbWluY3ANCmNwYW5lbA0KYWRtaW54DQphZG1pbnMNCnBhc3N3b3JkDQpwYXNzd29yZHMNCnBhc3N3MHJkDQpwQHNzdzByZA0KcEBzc3dvcmQNCmtob25nY28NCjI1MjUxMzI1DQpwYXNzdzByZHMiOw0KICAgIGlmICgkdGFyZ2V0ID09ICcnKSB7DQogICAgICAgICR0YXJnZXQgPSAnbG9jYWxob3N0JzsNCiAgICB9DQogICAgcHJpbnQgIiA8ZGl2IGFsaWduPSdjZW50ZXInPg0KPGZvcm0gbWV0aG9kPSdwb3N0JyBzdHlsZT0nYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMCc+PGJyPjxicj4NCjxUQUJMRSBzdHlsZT0nQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZScgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9Izk2NjExNyBjZWxsUGFkZGluZz01IHdpZHRoPSc0MCUnIGJnQ29sb3I9IzMwMzAzMCBib3JkZXJDb2xvckxpZ2h0PSM5NjYxMTcgYm9yZGVyPTE+PHRyPjx0ZD4NCjxiPiBUYXJnZXQgIDogPC9mb250PjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd0YXJnZXQnIHNpemU9JzE2JyB2YWx1ZT0gJHRhcmdldCBzdHlsZT0nYm9yZGVyOiBmb250LWZhbWlseTp0YWhvbWE7IGZvbnQtd2VpZ2h0OmJvbGQ7Jz48L3A+PC9mb250PjwvYj48L3A+DQo8ZGl2IGFsaWduPSdjZW50ZXInPjxicj4NCjxUQUJMRSBzdHlsZT0nQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZScgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9Izk2NjExNyBjZWxsUGFkZGluZz01IHdpZHRoPSc1MCUnIGJnQ29sb3I9IzMwMzAzMCBib3JkZXJDb2xvckxpZ2h0PSM5NjYxMTcgYm9yZGVyPTE+DQo8dHI+DQo8dGQgYWxpZ249J2NlbnRlcic+DQo8Yj5Vc2VybmFtZTwvYj48L3RkPg0KPHRkPg0KPHAgYWxpZ249J2NlbnRlcic+DQo8Yj5QYXNzd29yZDwvYj48L3RkPg0KPC90cj4NCjwvdGFibGU+DQo8cCBhbGlnbj0nY2VudGVyJz4NCjx0ZXh0YXJlYSByb3dzPScyMCcgbmFtZT0ndXNlcnMnIGNvbHM9JzI1JyBzdHlsZT0nYm9yZGVyOiAycHggc29saWQgIzFEMUQxRDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6I0MwQzBDMCc+IjsNCiAgICAkaSA9IDA7DQogICAgd2hpbGUgKCRpIDwgNjAwMDApIHsNCiAgICAgICAgJGxpbmUgPSBwb3NpeF9nZXRwd3VpZCgkaSk7DQogICAgICAgIGlmICghZW1wdHkoJGxpbmUpKSB7DQogICAgICAgICAgICB3aGlsZSAobGlzdCgka2V5LCAkdmJhX2V0Y3B3ZCkgPSBlYWNoKCRsaW5lKSkgew0KICAgICAgICAgICAgICAgIGVjaG8gIiIgLiAkdmJhX2V0Y3B3ZCAuICJcbiI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJGkrKzsNCiAgICB9DQogICAgZWNobyAiDQo8L3RleHRhcmVhPg0KPHRleHRhcmVhIHJvd3M9JzIwJyBuYW1lPSdwYXNzd29yZHMnIGNvbHM9JzI1JyBzdHlsZT0nYm9yZGVyOiAycHggc29saWQgIzFEMUQxRDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6I0MwQzBDMCc+JHBhc3NsaXN0PC90ZXh0YXJlYT48YnI+DQo8YnI+DQo8Yj5PcHRpb25zIDogPC9zcGFuPjxpbnB1dCBuYW1lPSdvcHRpb24nIHZhbHVlPSdjcGFuZWwnIHN0eWxlPSdmb250LXdlaWdodDogNzAwOycgY2hlY2tlZCB0eXBlPSdyYWRpbyc+IGNQYW5lbA0KPGlucHV0IG5hbWU9J29wdGlvbicgdmFsdWU9J2Z0cCcgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA3MDA7JyB0eXBlPSdyYWRpbyc+IGZ0cCA9PT4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0F0dGFjaycgbmFtZT0nc3VibWl0JyA+PC9wPg0KPC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvZm9ybT48cCBhbGlnbj0gJ2xlZnQnPiI7DQo/Pg0KPD9waHANCiAgICBmdW5jdGlvbiBmdHBfY2hlY2soJGhvc3QsICR1c2VyLCAkcGFzcywgJHRpbWVvdXQpIHsNCiAgICAgICAgJGNoID0gY3VybF9pbml0KCk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICJmdHA6Ly8kaG9zdCIpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZUUExJU1RPTkxZLCAxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJQV0QsICIkdXNlcjokcGFzcyIpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsICR0aW1lb3V0KTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZBSUxPTkVSUk9SLCAxKTsNCiAgICAgICAgJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsNCiAgICAgICAgaWYgKGN1cmxfZXJybm8oJGNoKSA9PSAyOCkgew0KICAgICAgICAgICAgcHJpbnQgIjxiPiBFcnJvciA6IENvbm5lY3Rpb24gdGltZWQgb3V0ICwgbWFrZSBjb25maWRlbmNlIGFib3V0IHZhbGlkYXRpb24gb2YgdGFyZ2V0ICE8L2I+IjsNCiAgICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0gZWxzZWlmIChjdXJsX2Vycm5vKCRjaCkgPT0gMCkgew0KICAgICAgICAgICAgcCgiPGI+WyBhdHRhY2tAdmJhdGVhbS5uZXQgXSMgPC9iPg0KPGI+IEF0dGFja2luZyBoYXMgYmVlbiBkb25lISBVc2VybmFtZTogPGZvbnQgY29sb3I9JyNGRjAwMDAnPiAkdXNlciA8L2ZvbnQ+IC8gUGFzc3dvcmQ6PGZvbnQgY29sb3I9JyNGRjAwMDAnPiAkcGFzcyA8L2ZvbnQ+ID0+IDxhIGhyZWY9aHR0cDovLyR1c2VyOiRwYXNzQCRob3N0OjIwODIgdGFyZ2V0PV9ibGFuaz5Mb2dpbjwvYT48L2I+PGJyPiIpOw0KICAgICAgICB9DQogICAgICAgIGN1cmxfY2xvc2UoJGNoKTsNCiAgICB9DQogICAgZnVuY3Rpb24gY3BhbmVsX2NoZWNrKCRob3N0LCAkdXNlciwgJHBhc3MsICR0aW1lb3V0KSB7DQogICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiaHR0cDovLyRob3N0OjIwODIiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBBVVRILCBDVVJMQVVUSF9CQVNJQyk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSUFdELCAiJHVzZXI6JHBhc3MiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAkdGltZW91dCk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GQUlMT05FUlJPUiwgMSk7DQogICAgICAgICRkYXRhID0gY3VybF9leGVjKCRjaCk7DQogICAgICAgIGlmIChjdXJsX2Vycm5vKCRjaCkgPT0gMjgpIHsNCiAgICAgICAgICAgIHByaW50ICI8Yj4gRXJyb3IgOiBDb25uZWN0aW9uIHRpbWVkIG91dCAsIG1ha2UgY29uZmlkZW5jZSBhYm91dCB2YWxpZGF0aW9uIG9mIHRhcmdldCAhPC9iPiI7DQogICAgICAgICAgICBleGl0Ow0KICAgICAgICB9IGVsc2VpZiAoY3VybF9lcnJubygkY2gpID09IDApIHsNCiAgICAgICAgICAgIHAoIjxiPlsgYXR0YWNrQHZiYXRlYW0ubmV0IF0jIDwvYj48Yj5BdHRhY2tpbmcgaGFzIGJlZW4gZG9uZSE8L2E+IFVzZXJuYW1lOiA8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICR1c2VyIDwvZm9udD4gLyBQYXNzd29yZDo8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICRwYXNzIDwvZm9udD48L2I+PGJyPiIpOw0KICAgICAgICB9DQogICAgICAgIGN1cmxfY2xvc2UoJGNoKTsNCiAgICB9DQogICAgaWYgKGlzc2V0KCRzdWJtaXQpICYmICFlbXB0eSgkc3VibWl0KSkgew0KICAgICAgICAkdXNlcmxpc3QgPSBleHBsb2RlKCJcbiIsICR1c2Vycyk7DQogICAgICAgICRwYXNzbGlzdCA9IGV4cGxvZGUoIlxuIiwgJHBhc3MpOw0KICAgICAgICBwKCc8Yj5bIGF0dGFja0B2YmF0ZWFtLm5ldCBdIyBBdHRhY2tpbmcgLi4uPC9mb250PjwvYj48YnI+Jyk7DQogICAgICAgIGZvcmVhY2ggKCR1c2VybGlzdCBhcyAkdXNlcikgew0KICAgICAgICAgICAgJF91c2VyID0gdHJpbSgkdXNlcik7DQogICAgICAgICAgICBmb3JlYWNoICgkcGFzc2xpc3QgYXMgJHBhc3N3b3JkKSB7DQogICAgICAgICAgICAgICAgJF9wYXNzID0gdHJpbSgkcGFzc3dvcmQpOw0KICAgICAgICAgICAgICAgIGlmICgkb3B0aW9uID09ICJmdHAiKSB7DQogICAgICAgICAgICAgICAgICAgIGZ0cF9jaGVjaygkdGFyZ2V0LCAkX3VzZXIsICRfcGFzcywgJGNvbm5lY3RfdGltZW91dCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICgkb3B0aW9uID09ICJjcGFuZWwiKSB7DQogICAgICAgICAgICAgICAgICAgIGNwYW5lbF9jaGVjaygkdGFyZ2V0LCAkX3VzZXIsICRfcGFzcywgJGNvbm5lY3RfdGltZW91dCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGZvcm1mb290KCk7DQp9IGVsc2VpZiAoJGFjdGlvbiA9PSAnZXRjcHdkJykgew0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZScgPT4gJ0dldCAvZXRjL3Bhc3N3ZCcpKTsNCiAgICBtYWtlaGlkZSgnYWN0aW9uJywgJ2V0Y3B3ZCcpOw0KICAgIG1ha2VoaWRlKCdkaXInLCAkbm93cGF0aCk7DQogICAgJGkgPSAwOw0KICAgIGVjaG8gIjxwPjxicj48dGV4dGFyZWEgY2xhc3M9XCJhcmVhXCIgaWQ9XCJwaHBjb2RleHh4XCIgbmFtZT1cInBocGNvZGV4eHhcIiBjb2xzPVwiMTAwXCIgcm93cz1cIjI1XCI+IjsNCiAgICB3aGlsZSAoJGkgPCA2MDAwMCkgew0KICAgICAgICAkbGluZSA9IHBvc2l4X2dldHB3dWlkKCRpKTsNCiAgICAgICAgaWYgKCFlbXB0eSgkbGluZSkpIHsNCiAgICAgICAgICAgIHdoaWxlIChsaXN0KCRrZXksICR2YmFfZXRjcHdkKSA9IGVhY2goJGxpbmUpKSB7DQogICAgICAgICAgICAgICAgZWNobyAiIiAuICR2YmFfZXRjcHdkIC4gIlxuIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkaSsrOw0KICAgIH0NCiAgICBlY2hvICI8L3RleHRhcmVhPjwvcD4iOw0KICAgIGZvcm1mb290KCk7DQp9IGVsc2VpZiAoJGFjdGlvbiA9PSAnZXZhbCcpIHsNCiAgICAkcGhwY29kZSA9IHRyaW0oJHBocGNvZGUpOw0KICAgIGlmICgkcGhwY29kZSkgew0KICAgICAgICBpZiAoIXByZWdfbWF0Y2goJyM8XD8jc2knLCAkcGhwY29kZSkpIHsNCiAgICAgICAgICAgICRwaHBjb2RlID0gIjw/cGhwXG5cbnskcGhwY29kZX1cblxuPz4iOw0KICAgICAgICB9DQogICAgICAgIGV2YWwoIj8iIC4gIj4kcGhwY29kZTw/Iik7DQogICAgfQ0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZScgPT4gJ0V2YWwgUEhQIENvZGUnKSk7DQogICAgbWFrZWhpZGUoJ2FjdGlvbicsICdldmFsJyk7DQogICAgbWFrZXRleHQoYXJyYXkoJ3RpdGxlJyA9PiAnUEhQIENvZGUnLCAnbmFtZScgPT4gJ3BocGNvZGUnLCAndmFsdWUnID0+ICRwaHBjb2RlKSk7DQogICAgcCgnPHA+PGEgaHJlZj0iaHR0cDovL3d3dy40bmdlbC5uZXQvcGhwc3B5L3BsdWdpbi8iIHRhcmdldD0iX2JsYW5rIj5HZXQgcGx1Z2luczwvYT48L3A+Jyk7DQogICAgZm9ybWZvb3RlcigpOw0KfSAvL2VuZCBldmFsDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2VkaXRmaWxlJykgew0KICAgIGlmIChmaWxlX2V4aXN0cygkb3BmaWxlKSkgew0KICAgICAgICAkZnAgPSBAZm9wZW4oJG9wZmlsZSwgJ3InKTsNCiAgICAgICAgJGNvbnRlbnRzID0gQGZyZWFkKCRmcCwgZmlsZXNpemUoJG9wZmlsZSkpOw0KICAgICAgICBAZmNsb3NlKCRmcCk7DQogICAgICAgICRjb250ZW50cyA9IGh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnRzKTsNCiAgICB9DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnQ3JlYXRlIC8gRWRpdCBGaWxlJykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnZmlsZScpOw0KICAgIG1ha2VoaWRlKCdkaXInLCAkbm93cGF0aCk7DQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZScgPT4gJ0N1cnJlbnQgRmlsZSAoaW1wb3J0IG5ldyBmaWxlIG5hbWUgYW5kIG5ldyBmaWxlKScsICduYW1lJyA9PiAnZWRpdGZpbGVuYW1lJywgJ3ZhbHVlJyA9PiAkb3BmaWxlLCAnbmV3bGluZScgPT4gMSkpOw0KICAgIG1ha2V0ZXh0KGFycmF5KCd0aXRsZScgPT4gJ0ZpbGUgQ29udGVudCcsICduYW1lJyA9PiAnZmlsZWNvbnRlbnQnLCAndmFsdWUnID0+ICRjb250ZW50cykpOw0KICAgIGZvcm1mb290ZXIoKTsNCn0gLy9lbmQgZWRpdGZpbGUNCmVsc2VpZiAoJGFjdGlvbiA9PSAnbmV3dGltZScpIHsNCiAgICAkb3BmaWxlbXRpbWUgPSBAZmlsZW10aW1lKCRvcGZpbGUpOw0KICAgIC8vJHRpbWUgPSBzdHJ0b3RpbWUoIiR5ZWFyLSRtb250aC0kZGF5ICRob3VyOiRtaW51dGU6JHNlY29uZCIpOw0KICAgICRjYWNoZW1vbnRoID0gYXJyYXkoJ0phbnVhcnknID0+IDEsICdGZWJydWFyeScgPT4gMiwgJ01hcmNoJyA9PiAzLCAnQXByaWwnID0+IDQsICdNYXknID0+IDUsICdKdW5lJyA9PiA2LCAnSnVseScgPT4gNywgJ0F1Z3VzdCcgPT4gOCwgJ1NlcHRlbWJlcicgPT4gOSwgJ09jdG9iZXInID0+IDEwLCAnTm92ZW1iZXInID0+IDExLCAnRGVjZW1iZXInID0+IDEyKTsNCiAgICBmb3JtaGVhZChhcnJheSgndGl0bGUnID0+ICdDbG9uZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkIHRpbWUnKSk7DQogICAgbWFrZWhpZGUoJ2FjdGlvbicsICdmaWxlJyk7DQogICAgbWFrZWhpZGUoJ2RpcicsICRub3dwYXRoKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJyA9PiAnQWx0ZXIgZmlsZScsICduYW1lJyA9PiAnY3VyZmlsZScsICd2YWx1ZScgPT4gJG9wZmlsZSwgJ3NpemUnID0+IDEyMCwgJ25ld2xpbmUnID0+IDEpKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJyA9PiAnUmVmZXJlbmNlIGZpbGUgKGZ1bGxwYXRoKScsICduYW1lJyA9PiAndGFyZmlsZScsICdzaXplJyA9PiAxMjAsICduZXdsaW5lJyA9PiAxKSk7DQogICAgZm9ybWZvb3RlcigpOw0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZScgPT4gJ1NldCBsYXN0IG1vZGlmaWVkJykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnZmlsZScpOw0KICAgIG1ha2VoaWRlKCdkaXInLCAkbm93cGF0aCk7DQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZScgPT4gJ0N1cnJlbnQgZmlsZSAoZnVsbHBhdGgpJywgJ25hbWUnID0+ICdjdXJmaWxlJywgJ3ZhbHVlJyA9PiAkb3BmaWxlLCAnc2l6ZScgPT4gMTIwLCAnbmV3bGluZScgPT4gMSkpOw0KICAgIHAoJzxwPkluc3RlYWQgJnJhcXVvOycpOw0KICAgIHAoJ3llYXI6Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAneWVhcicsICd2YWx1ZScgPT4gZGF0ZSgnWScsICRvcGZpbGVtdGltZSksICdzaXplJyA9PiA0KSk7DQogICAgcCgnbW9udGg6Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnbW9udGgnLCAndmFsdWUnID0+IGRhdGUoJ20nLCAkb3BmaWxlbXRpbWUpLCAnc2l6ZScgPT4gMikpOw0KICAgIHAoJ2RheTonKTsNCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnID0+ICdkYXknLCAndmFsdWUnID0+IGRhdGUoJ2QnLCAkb3BmaWxlbXRpbWUpLCAnc2l6ZScgPT4gMikpOw0KICAgIHAoJ2hvdXI6Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnaG91cicsICd2YWx1ZScgPT4gZGF0ZSgnSCcsICRvcGZpbGVtdGltZSksICdzaXplJyA9PiAyKSk7DQogICAgcCgnbWludXRlOicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ21pbnV0ZScsICd2YWx1ZScgPT4gZGF0ZSgnaScsICRvcGZpbGVtdGltZSksICdzaXplJyA9PiAyKSk7DQogICAgcCgnc2Vjb25kOicpOw0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZScgPT4gJ3NlY29uZCcsICd2YWx1ZScgPT4gZGF0ZSgncycsICRvcGZpbGVtdGltZSksICdzaXplJyA9PiAyKSk7DQogICAgcCgnPC9wPicpOw0KICAgIGZvcm1mb290ZXIoKTsNCn0gLy9lbmQgbmV3dGltZQ0KZWxzZWlmICgkYWN0aW9uID09ICdzaGVsbCcpIHsNCiAgICBpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KICAgICAgICBpZiAoJHByb2dyYW0gJiYgJHBhcmFtZXRlcikgew0KICAgICAgICAgICAgJHNoZWxsID0gbmV3IENPTSgnU2hlbGwuQXBwbGljYXRpb24nKTsNCiAgICAgICAgICAgICRhID0gJHNoZWxsLT5TaGVsbEV4ZWN1dGUoJHByb2dyYW0sICRwYXJhbWV0ZXIpOw0KICAgICAgICAgICAgbSgnUHJvZ3JhbSBydW4gaGFzICcgLiAoISRhID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnKSk7DQogICAgICAgIH0NCiAgICAgICAgISRwcm9ncmFtICYmICRwcm9ncmFtID0gJ2M6XHdpbmRvd3Ncc3lzdGVtMzJcY21kLmV4ZSc7DQogICAgICAgICEkcGFyYW1ldGVyICYmICRwYXJhbWV0ZXIgPSAnL2MgbmV0IHN0YXJ0ID4gJyAuIFNBX1JPT1QgLiAnbG9nLnR4dCc7DQogICAgICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZScgPT4gJ0V4ZWN1dGUgUHJvZ3JhbScpKTsNCiAgICAgICAgbWFrZWhpZGUoJ2FjdGlvbicsICdzaGVsbCcpOw0KICAgICAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJyA9PiAnUHJvZ3JhbScsICduYW1lJyA9PiAncHJvZ3JhbScsICd2YWx1ZScgPT4gJHByb2dyYW0sICduZXdsaW5lJyA9PiAxKSk7DQogICAgICAgIHAoJzxwPicpOw0KICAgICAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJyA9PiAnUGFyYW1ldGVyJywgJ25hbWUnID0+ICdwYXJhbWV0ZXInLCAndmFsdWUnID0+ICRwYXJhbWV0ZXIpKTsNCiAgICAgICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnc3VibWl0JywgJ2NsYXNzJyA9PiAnYnQnLCAndHlwZScgPT4gJ3N1Ym1pdCcsICd2YWx1ZScgPT4gJ0V4ZWN1dGUnKSk7DQogICAgICAgIHAoJzwvcD4nKTsNCiAgICAgICAgZm9ybWZvb3QoKTsNCiAgICB9DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnRXhlY3V0ZSBDb21tYW5kJykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAnc2hlbGwnKTsNCiAgICBpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KICAgICAgICAkZXhlY2Z1bmNkYiA9IGFycmF5KCdwaHBmdW5jJyA9PiAncGhwZnVuYycsICd3c2NyaXB0JyA9PiAnd3NjcmlwdCcsICdwcm9jX29wZW4nID0+ICdwcm9jX29wZW4nKTsNCiAgICAgICAgbWFrZXNlbGVjdChhcnJheSgndGl0bGUnID0+ICdVc2U6JywgJ25hbWUnID0+ICdleGVjZnVuYycsICdvcHRpb24nID0+ICRleGVjZnVuY2RiLCAnc2VsZWN0ZWQnID0+ICRleGVjZnVuYywgJ25ld2xpbmUnID0+IDEpKTsNCiAgICB9DQogICAgcCgnPHA+Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZScgPT4gJ0NvbW1hbmQnLCAnbmFtZScgPT4gJ2NvbW1hbmQnLCAndmFsdWUnID0+ICRjb21tYW5kKSk7DQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJyA9PiAnc3VibWl0JywgJ2NsYXNzJyA9PiAnYnQnLCAndHlwZScgPT4gJ3N1Ym1pdCcsICd2YWx1ZScgPT4gJ0V4ZWN1dGUnKSk7DQogICAgcCgnPC9wPicpOw0KICAgIGZvcm1mb290KCk7DQogICAgaWYgKCRjb21tYW5kKSB7DQogICAgICAgIHAoJzxociB3aWR0aD0iMTAwJSIgbm9zaGFkZSAvPjxwcmU+Jyk7DQogICAgICAgIGlmICgkZXhlY2Z1bmMgPT0gJ3dzY3JpcHQnICYmIElTX1dJTiAmJiBJU19DT00pIHsNCiAgICAgICAgICAgICR3c2ggPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7DQogICAgICAgICAgICAkZXhlYyA9ICR3c2gtPmV4ZWMoJ2NtZC5leGUgL2MgJyAuICRjb21tYW5kKTsNCiAgICAgICAgICAgICRzdGRvdXQgPSAkZXhlYy0+U3RkT3V0KCk7DQogICAgICAgICAgICAkc3Ryb3V0cHV0ID0gJHN0ZG91dC0+UmVhZEFsbCgpOw0KICAgICAgICAgICAgZWNobyAkc3Ryb3V0cHV0Ow0KICAgICAgICB9IGVsc2VpZiAoJGV4ZWNmdW5jID09ICdwcm9jX29wZW4nICYmIElTX1dJTiAmJiBJU19DT00pIHsNCiAgICAgICAgICAgICRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KDAgPT4gYXJyYXkoJ3BpcGUnLCAncicpLCAxID0+IGFycmF5KCdwaXBlJywgJ3cnKSwgMiA9PiBhcnJheSgncGlwZScsICd3JykpOw0KICAgICAgICAgICAgJHByb2Nlc3MgPSBwcm9jX29wZW4oJF9TRVJWRVJbJ0NPTVNQRUMnXSwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMpOw0KICAgICAgICAgICAgaWYgKGlzX3Jlc291cmNlKCRwcm9jZXNzKSkgew0KICAgICAgICAgICAgICAgIGZ3cml0ZSgkcGlwZXNbMF0sICRjb21tYW5kIC4gIlxyXG4iKTsNCiAgICAgICAgICAgICAgICBmd3JpdGUoJHBpcGVzWzBdLCAiZXhpdFxyXG4iKTsNCiAgICAgICAgICAgICAgICBmY2xvc2UoJHBpcGVzWzBdKTsNCiAgICAgICAgICAgICAgICB3aGlsZSAoIWZlb2YoJHBpcGVzWzFdKSkgew0KICAgICAgICAgICAgICAgICAgICBlY2hvIGZnZXRzKCRwaXBlc1sxXSwgMTAyNCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZjbG9zZSgkcGlwZXNbMV0pOw0KICAgICAgICAgICAgICAgIHdoaWxlICghZmVvZigkcGlwZXNbMl0pKSB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gZmdldHMoJHBpcGVzWzJdLCAxMDI0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZmNsb3NlKCRwaXBlc1syXSk7DQogICAgICAgICAgICAgICAgcHJvY19jbG9zZSgkcHJvY2Vzcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBlY2hvIChleGVjdXRlKCRjb21tYW5kKSk7DQogICAgICAgIH0NCiAgICAgICAgcCgnPC9wcmU+Jyk7DQogICAgfQ0KfSAvL2VuZCBzaGVsbA0KZWxzZWlmICgkYWN0aW9uID09ICdwaHBlbnYnKSB7DQogICAgJHVwc2l6ZSA9IGdldGNmZygnZmlsZV91cGxvYWRzJykgPyBnZXRjZmcoJ3VwbG9hZF9tYXhfZmlsZXNpemUnKSA6ICdOb3QgYWxsb3dlZCc7DQogICAgJGFkbWlubWFpbCA9IGlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSkgPyAkX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10gOiBnZXRjZmcoJ3NlbmRtYWlsX2Zyb20nKTsNCiAgICAhJGRpc19mdW5jICYmICRkaXNfZnVuYyA9ICdObyc7DQogICAgJGluZm8gPSBhcnJheSgxID0+IGFycmF5KCdTZXJ2ZXIgVGltZScsIGRhdGUoJ1kvbS9kIGg6aTpzJywgJHRpbWVzdGFtcCkpLCAyID0+IGFycmF5KCdTZXJ2ZXIgRG9tYWluJywgJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLCAzID0+IGFycmF5KCdTZXJ2ZXIgSVAnLCBnZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKSksIDQgPT4gYXJyYXkoJ1NlcnZlciBPUycsIFBIUF9PUyksIDUgPT4gYXJyYXkoJ1NlcnZlciBPUyBDaGFyc2V0JywgJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pLCA2ID0+IGFycmF5KCdTZXJ2ZXIgU29mdHdhcmUnLCAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pLCA3ID0+IGFycmF5KCdTZXJ2ZXIgV2ViIFBvcnQnLCAkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSksIDggPT4gYXJyYXkoJ1BIUCBydW4gbW9kZScsIHN0cnRvdXBwZXIocGhwX3NhcGlfbmFtZSgpKSksIDkgPT4gYXJyYXkoJ1RoZSBmaWxlIHBhdGgnLCBfX0ZJTEVfXyksIDEwID0+IGFycmF5KCdQSFAgVmVyc2lvbicsIFBIUF9WRVJTSU9OKSwgMTEgPT4gYXJyYXkoJ1BIUElORk8nLCAoSVNfUEhQSU5GTyA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKFwncGhwaW5mb1wnKTsiPlllczwvYT4nIDogJ05vJykpLCAxMiA9PiBhcnJheSgnU2FmZSBNb2RlJywgZ2V0Y2ZnKCdzYWZlX21vZGUnKSksIDEzID0+IGFycmF5KCdBZG1pbmlzdHJhdG9yJywgJGFkbWlubWFpbCksIDE0ID0+IGFycmF5KCdhbGxvd191cmxfZm9wZW4nLCBnZXRjZmcoJ2FsbG93X3VybF9mb3BlbicpKSwgMTUgPT4gYXJyYXkoJ2VuYWJsZV9kbCcsIGdldGNmZygnZW5hYmxlX2RsJykpLCAxNiA9PiBhcnJheSgnZGlzcGxheV9lcnJvcnMnLCBnZXRjZmcoJ2Rpc3BsYXlfZXJyb3JzJykpLCAxNyA9PiBhcnJheSgncmVnaXN0ZXJfZ2xvYmFscycsIGdldGNmZygncmVnaXN0ZXJfZ2xvYmFscycpKSwgMTggPT4gYXJyYXkoJ21hZ2ljX3F1b3Rlc19ncGMnLCBnZXRjZmcoJ21hZ2ljX3F1b3Rlc19ncGMnKSksIDE5ID0+IGFycmF5KCdtZW1vcnlfbGltaXQnLCBnZXRjZmcoJ21lbW9yeV9saW1pdCcpKSwgMjAgPT4gYXJyYXkoJ3Bvc3RfbWF4X3NpemUnLCBnZXRjZmcoJ3Bvc3RfbWF4X3NpemUnKSksIDIxID0+IGFycmF5KCd1cGxvYWRfbWF4X2ZpbGVzaXplJywgJHVwc2l6ZSksIDIyID0+IGFycmF5KCdtYXhfZXhlY3V0aW9uX3RpbWUnLCBnZXRjZmcoJ21heF9leGVjdXRpb25fdGltZScpIC4gJyBzZWNvbmQocyknKSwgMjMgPT4gYXJyYXkoJ2Rpc2FibGVfZnVuY3Rpb25zJywgJGRpc19mdW5jKSwpOw0KICAgIGlmICgkcGhwdmFybmFtZSkgew0KICAgICAgICBtKCRwaHB2YXJuYW1lIC4gJyA6ICcgLiBnZXRjZmcoJHBocHZhcm5hbWUpKTsNCiAgICB9DQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJyA9PiAnU2VydmVyIGVudmlyb25tZW50JykpOw0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCAncGhwZW52Jyk7DQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZScgPT4gJ1BsZWFzZSBpbnB1dCBQSFAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIoZWc6bWFnaWNfcXVvdGVzX2dwYyknLCAnbmFtZScgPT4gJ3BocHZhcm5hbWUnLCAndmFsdWUnID0+ICRwaHB2YXJuYW1lLCAnbmV3bGluZScgPT4gMSkpOw0KICAgIGZvcm1mb290ZXIoKTsNCiAgICAkaHAgPSBhcnJheSgwID0+ICdTZXJ2ZXInLCAxID0+ICdQSFAnKTsNCiAgICBmb3IgKCRhID0gMDskYSA8IDI7JGErKykgew0KICAgICAgICBwKCc8aDI+JyAuICRocFskYV0gLiAnICZyYXF1bzs8L2gyPicpOw0KICAgICAgICBwKCc8dWwgY2xhc3M9ImluZm8iPicpOw0KICAgICAgICBpZiAoJGEgPT0gMCkgew0KICAgICAgICAgICAgZm9yICgkaSA9IDE7JGkgPD0gOTskaSsrKSB7DQogICAgICAgICAgICAgICAgcCgnPGxpPjx1PicgLiAkaW5mb1skaV1bMF0gLiAnOjwvdT4nIC4gJGluZm9bJGldWzFdIC4gJzwvbGk+Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZWlmICgkYSA9PSAxKSB7DQogICAgICAgICAgICBmb3IgKCRpID0gMTA7JGkgPD0gMjM7JGkrKykgew0KICAgICAgICAgICAgICAgIHAoJzxsaT48dT4nIC4gJGluZm9bJGldWzBdIC4gJzo8L3U+JyAuICRpbmZvWyRpXVsxXSAuICc8L2xpPicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHAoJzwvdWw+Jyk7DQogICAgfQ0KfSAvL2VuZCBwaHBlbnYNCmVsc2Ugew0KICAgIG0oJ1VuZGVmaW5lZCBBY3Rpb24nKTsNCn0NCj8+DQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjMEUwRTBFO2JvcmRlci10b3A6MXB4IHNvbGlkICMwRTBFMEU7YmFja2dyb3VuZDojMEUwRTBFOyI+DQoJPHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PD9waHAgZGVidWdpbmZvKCk7DQpvYl9lbmRfZmx1c2goKTsgPz48L3NwYW4+DQoJQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgPEI+PC9CPiAtIERldmVsb3AgYnkgPGEgaHJlZj1odHRwOi8vYmV5ZXVncm91cC5jb20gdGFyZ2V0PV9ibGFuaz48Qj5CWUcgICA8L0I+PC9hPiAtIDxCPi0gVGhlIExlZ2VuZCBvZiBWaWV0bmFtZXNlIEhhY2tlciBXb3JsZDwvQj4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0KDQo8P3BocA0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClNob3cgaW5mbyBzaGVsbA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCmZ1bmN0aW9uIG0oJG1zZykgew0KICAgIGVjaG8gJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2YxZjFmMTtib3JkZXI6MXB4IHNvbGlkICNkZGQ7cGFkZGluZzoxNXB4O2ZvbnQ6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDpib2xkOyI+JzsNCiAgICBlY2hvICRtc2c7DQogICAgZWNobyAnPC9kaXY+JzsNCn0NCmZ1bmN0aW9uIHNjb29raWUoJGtleSwgJHZhbHVlLCAkbGlmZSA9IDAsICRwcmVmaXggPSAxKSB7DQogICAgZ2xvYmFsICRhZG1pbiwgJHRpbWVzdGFtcCwgJF9TRVJWRVI7DQogICAgJGtleSA9ICgkcHJlZml4ID8gJGFkbWluWydjb29raWVwcmUnXSA6ICcnKSAuICRrZXk7DQogICAgJGxpZmUgPSAkbGlmZSA/ICRsaWZlIDogJGFkbWluWydjb29raWVsaWZlJ107DQogICAgJHVzZXBvcnQgPSAkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSA9PSA0NDMgPyAxIDogMDsNCiAgICBzZXRjb29raWUoJGtleSwgJHZhbHVlLCAkdGltZXN0YW1wICsgJGxpZmUsICRhZG1pblsnY29va2llcGF0aCddLCAkYWRtaW5bJ2Nvb2tpZWRvbWFpbiddLCAkdXNlcG9ydCk7DQp9DQpmdW5jdGlvbiBtdWx0aSgkbnVtLCAkcGVycGFnZSwgJGN1cnBhZ2UsICR0YWJsZW5hbWUpIHsNCiAgICAkbXVsdGlwYWdlID0gJyc7DQogICAgaWYgKCRudW0gPiAkcGVycGFnZSkgew0KICAgICAgICAkcGFnZSA9IDEwOw0KICAgICAgICAkb2Zmc2V0ID0gNTsNCiAgICAgICAgJHBhZ2VzID0gQGNlaWwoJG51bSAvICRwZXJwYWdlKTsNCiAgICAgICAgaWYgKCRwYWdlID4gJHBhZ2VzKSB7DQogICAgICAgICAgICAkZnJvbSA9IDE7DQogICAgICAgICAgICAkdG8gPSAkcGFnZXM7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkZnJvbSA9ICRjdXJwYWdlIC0gJG9mZnNldDsNCiAgICAgICAgICAgICR0byA9ICRjdXJwYWdlICsgJHBhZ2UgLSAkb2Zmc2V0IC0gMTsNCiAgICAgICAgICAgIGlmICgkZnJvbSA8IDEpIHsNCiAgICAgICAgICAgICAgICAkdG8gPSAkY3VycGFnZSArIDEgLSAkZnJvbTsNCiAgICAgICAgICAgICAgICAkZnJvbSA9IDE7DQogICAgICAgICAgICAgICAgaWYgKCgkdG8gLSAkZnJvbSkgPCAkcGFnZSAmJiAoJHRvIC0gJGZyb20pIDwgJHBhZ2VzKSB7DQogICAgICAgICAgICAgICAgICAgICR0byA9ICRwYWdlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZWlmICgkdG8gPiAkcGFnZXMpIHsNCiAgICAgICAgICAgICAgICAkZnJvbSA9ICRjdXJwYWdlIC0gJHBhZ2VzICsgJHRvOw0KICAgICAgICAgICAgICAgICR0byA9ICRwYWdlczsNCiAgICAgICAgICAgICAgICBpZiAoKCR0byAtICRmcm9tKSA8ICRwYWdlICYmICgkdG8gLSAkZnJvbSkgPCAkcGFnZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgJGZyb20gPSAkcGFnZXMgLSAkcGFnZSArIDE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgICRtdWx0aXBhZ2UgPSAoJGN1cnBhZ2UgLSAkb2Zmc2V0ID4gMSAmJiAkcGFnZXMgPiAkcGFnZSA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJyAuICR0YWJsZW5hbWUgLiAnXCcsIFwnXCcsIDEpOyI+Rmlyc3Q8L2E+ICcgOiAnJykgLiAoJGN1cnBhZ2UgPiAxID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlbmFtZSAuICdcJywgXCdcJywgJyAuICgkY3VycGFnZSAtIDEpIC4gJyk7Ij5QcmV2PC9hPiAnIDogJycpOw0KICAgICAgICBmb3IgKCRpID0gJGZyb207JGkgPD0gJHRvOyRpKyspIHsNCiAgICAgICAgICAgICRtdWx0aXBhZ2UuPSAkaSA9PSAkY3VycGFnZSA/ICRpIC4gJyAnIDogJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnIC4gJHRhYmxlbmFtZSAuICdcJywgXCdcJywgJyAuICRpIC4gJyk7Ij5bJyAuICRpIC4gJ108L2E+ICc7DQogICAgICAgIH0NCiAgICAgICAgJG11bHRpcGFnZS49ICgkY3VycGFnZSA8ICRwYWdlcyA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJyAuICR0YWJsZW5hbWUgLiAnXCcsIFwnXCcsICcgLiAoJGN1cnBhZ2UgKyAxKSAuICcpOyI+TmV4dDwvYT4nIDogJycpIC4gKCR0byA8ICRwYWdlcyA/ICcgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycgLiAkdGFibGVuYW1lIC4gJ1wnLCBcJ1wnLCAnIC4gJHBhZ2VzIC4gJyk7Ij5MYXN0PC9hPicgOiAnJyk7DQogICAgICAgICRtdWx0aXBhZ2UgPSAkbXVsdGlwYWdlID8gJzxwPlBhZ2VzOiAnIC4gJG11bHRpcGFnZSAuICc8L3A+JyA6ICcnOw0KICAgIH0NCiAgICByZXR1cm4gJG11bHRpcGFnZTsNCn0NCi8vIExvZ2luIHBhZ2UNCmZ1bmN0aW9uIGxvZ2lucGFnZSgpIHsNCj8+DQo8aHRtbD4NCjxoZWFkPg0KDQo8Ym9keSBiZ2NvbG9yPWJsYWNrIGJhY2tncm91bmQ9MS5qcGc+DQoNCgkJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+DQo8dGl0bGU+QllHIC0gVGhlIExlZ2VuZCBvZiBWaWV0bmFtZXNlIEhhY2tlciBXb3JsZCA8L3RpdGxlPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCkE6bGluayB7dGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogZ3JlZW4gfQ0KQTp2aXNpdGVkIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6cmVkfQ0KQTphY3RpdmUge3RleHQtZGVjb3JhdGlvbjogbm9uZX0NCkE6aG92ZXIge3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogZ3JlZW47fQ0KaW5wdXQsIHRleHRhcmVhLCBidXR0b24NCnsNCglmb250LXNpemU6IDExcHQ7DQoJY29sb3I6IAkjRkZGRkZGOw0KCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOw0KCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7DQoJYm9yZGVyLWxlZnQ6IDJweCBkYXNoZWQgIzhCMDAwMDsNCglib3JkZXItdG9wOiAycHggZGFzaGVkICM4QjAwMDA7DQoJYm9yZGVyLXJpZ2h0OiAycHggZGFzaGVkICM4QjAwMDA7DQoJYm9yZGVyLWJvdHRvbTogMnB4IGRhc2hlZCAjOEIwMDAwOw0KfQ0KDQo8L3N0eWxlPg0KDQogICAgICAgPEJSPjxCUj4NCjxkaXYgYWxpZ249Y2VudGVyID4NCg0KPGRpdj4NCjxmb250IGNvbG9yPWdyYXk+DQo8YnIgLz48YnIgLz48YnIgLz48YnIgLz48YnIgLz4NCg0KPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+DQoJPHNwYW4gc3R5bGU9ImZvbnQ6MjBwdCB0YWhvbWE7Ij4gPC9zcGFuPjxpbnB1dCBuYW1lPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiIHNpemU9IjMwIj4NCgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkb2luZyIgdmFsdWU9ImxvZ2luIj4NCgk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9naW4iPg0KCTwvZm9ybT4NCjxCUj4NCjw/cGhwDQogICAgZWNobyAiIiAuICRlcnJfbWVzcyAuICIiOw0KPz4NCg0KCTxCPjxmb250IGNvbG9yPXJlZD4NCg0KDQoNCg0KDQoNCjwvZGl2Pg0KDQoNCgk8L2ZpZWxkc2V0Pg0KDQoNCg0KPC9oZWFkPg0KPC9odG1sPg0KDQoNCjw/cGhwDQogICAgZXhpdDsNCn0gLy9lbmQgbG9naW5wYWdlKCkNCmZ1bmN0aW9uIGV4ZWN1dGUoJGNmZSkgew0KICAgICRyZXMgPSAnJzsNCiAgICBpZiAoJGNmZSkgew0KICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsNCiAgICAgICAgICAgIEBleGVjKCRjZmUsICRyZXMpOw0KICAgICAgICAgICAgJHJlcyA9IGpvaW4oIlxuIiwgJHJlcyk7DQogICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KICAgICAgICAgICAgJHJlcyA9IEBzaGVsbF9leGVjKCRjZmUpOw0KICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KICAgICAgICAgICAgQG9iX3N0YXJ0KCk7DQogICAgICAgICAgICBAc3lzdGVtKCRjZmUpOw0KICAgICAgICAgICAgJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsNCiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTsNCiAgICAgICAgfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgew0KICAgICAgICAgICAgQG9iX3N0YXJ0KCk7DQogICAgICAgICAgICBAcGFzc3RocnUoJGNmZSk7DQogICAgICAgICAgICAkcmVzID0gQG9iX2dldF9jb250ZW50cygpOw0KICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpOw0KICAgICAgICB9IGVsc2VpZiAoQGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRjZmUsICJyIikpKSB7DQogICAgICAgICAgICAkcmVzID0gJyc7DQogICAgICAgICAgICB3aGlsZSAoIUBmZW9mKCRmKSkgew0KICAgICAgICAgICAgICAgICRyZXMuPSBAZnJlYWQoJGYsIDEwMjQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgQHBjbG9zZSgkZik7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuICRyZXM7DQp9DQpmdW5jdGlvbiB3aGljaCgkcHIpIHsNCiAgICAkcGF0aCA9IGV4ZWN1dGUoIndoaWNoICRwciIpOw0KICAgIHJldHVybiAoJHBhdGggPyAkcGF0aCA6ICRwcik7DQp9DQpmdW5jdGlvbiBjZigkZm5hbWUsICR0ZXh0KSB7DQogICAgaWYgKCRmcCA9IEBmb3BlbigkZm5hbWUsICd3JykpIHsNCiAgICAgICAgQGZwdXRzKCRmcCwgYmFzZTY0X2RlY29kZSgkdGV4dCkpOw0KICAgICAgICBAZmNsb3NlKCRmcCk7DQogICAgfQ0KfQ0KLy8gRGVidWcNCmZ1bmN0aW9uIGRlYnVnaW5mbygpIHsNCiAgICBnbG9iYWwgJHN0YXJ0dGltZTsNCiAgICAkbXRpbWUgPSBleHBsb2RlKCcgJywgbWljcm90aW1lKCkpOw0KICAgICR0b3RhbHRpbWUgPSBudW1iZXJfZm9ybWF0KCgkbXRpbWVbMV0gKyAkbXRpbWVbMF0gLSAkc3RhcnR0aW1lKSwgNik7DQogICAgZWNobyAnUHJvY2Vzc2VkIGluICcgLiAkdG90YWx0aW1lIC4gJyBzZWNvbmQocyknOw0KfQ0KLy8gRnVuY3Rpb24gY29ubmVjdCBkYXRhYmFzZQ0KZnVuY3Rpb24gZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUgPSAnJywgJGNoYXJzZXQgPSAnJywgJGRicG9ydCA9ICczMzA2Jykgew0KICAgIGlmICghJGxpbmsgPSBAbXlzcWxfY29ubmVjdCgkZGJob3N0IC4gJzonIC4gJGRicG9ydCwgJGRidXNlciwgJGRicGFzcykpIHsNCiAgICAgICAgcCgnPGgyPkNhbiBub3QgY29ubmVjdCB0byBNeVNRTCBzZXJ2ZXI8L2gyPicpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgICBpZiAoJGxpbmsgJiYgJGRibmFtZSkgew0KICAgICAgICBpZiAoIUBteXNxbF9zZWxlY3RfZGIoJGRibmFtZSwgJGxpbmspKSB7DQogICAgICAgICAgICBwKCc8aDI+RGF0YWJhc2Ugc2VsZWN0ZWQgaGFzIGVycm9yPC9oMj4nKTsNCiAgICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKCRsaW5rICYmIG15c3FsX2dldF9zZXJ2ZXJfaW5mbygpID4gJzQuMScpIHsNCiAgICAgICAgaWYgKGluX2FycmF5KHN0cnRvbG93ZXIoJGNoYXJzZXQpLCBhcnJheSgnZ2JrJywgJ2JpZzUnLCAndXRmOCcpKSkgew0KICAgICAgICAgICAgcSgiU0VUIGNoYXJhY3Rlcl9zZXRfY29ubmVjdGlvbj0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9yZXN1bHRzPSRjaGFyc2V0LCBjaGFyYWN0ZXJfc2V0X2NsaWVudD1iaW5hcnk7IiwgJGxpbmspOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiAkbGluazsNCn0NCi8vIEFycmF5IHN0cmlwDQpmdW5jdGlvbiBzX2FycmF5KCYkYXJyYXkpIHsNCiAgICBpZiAoaXNfYXJyYXkoJGFycmF5KSkgew0KICAgICAgICBmb3JlYWNoICgkYXJyYXkgYXMgJGsgPT4gJHYpIHsNCiAgICAgICAgICAgICRhcnJheVska10gPSBzX2FycmF5KCR2KTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSBpZiAoaXNfc3RyaW5nKCRhcnJheSkpIHsNCiAgICAgICAgJGFycmF5ID0gc3RyaXBzbGFzaGVzKCRhcnJheSk7DQogICAgfQ0KICAgIHJldHVybiAkYXJyYXk7DQp9DQovLyBIVE1MIFN0cmlwDQpmdW5jdGlvbiBodG1sX2NsZWFuKCRjb250ZW50KSB7DQogICAgJGNvbnRlbnQgPSBodG1sc3BlY2lhbGNoYXJzKCRjb250ZW50KTsNCiAgICAkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcbiIsICI8YnIgLz4iLCAkY29udGVudCk7DQogICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IiwgJGNvbnRlbnQpOw0KICAgICRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlx0IiwgIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsNCiAgICByZXR1cm4gJGNvbnRlbnQ7DQp9DQovLyBDaG1vZA0KZnVuY3Rpb24gZ2V0Q2htb2QoJGZpbGVwYXRoKSB7DQogICAgcmV0dXJuIHN1YnN0cihiYXNlX2NvbnZlcnQoQGZpbGVwZXJtcygkZmlsZXBhdGgpLCAxMCwgOCksIC00KTsNCn0NCmZ1bmN0aW9uIGdldFBlcm1zKCRmaWxlcGF0aCkgew0KICAgICRtb2RlID0gQGZpbGVwZXJtcygkZmlsZXBhdGgpOw0KICAgIGlmICgoJG1vZGUgJiAweEMwMDApID09PSAweEMwMDApIHsNCiAgICAgICAgJHR5cGUgPSAncyc7DQogICAgfSBlbHNlaWYgKCgkbW9kZSAmIDB4NDAwMCkgPT09IDB4NDAwMCkgew0KICAgICAgICAkdHlwZSA9ICdkJzsNCiAgICB9IGVsc2VpZiAoKCRtb2RlICYgMHhBMDAwKSA9PT0gMHhBMDAwKSB7DQogICAgICAgICR0eXBlID0gJ2wnOw0KICAgIH0gZWxzZWlmICgoJG1vZGUgJiAweDgwMDApID09PSAweDgwMDApIHsNCiAgICAgICAgJHR5cGUgPSAnLSc7DQogICAgfSBlbHNlaWYgKCgkbW9kZSAmIDB4NjAwMCkgPT09IDB4NjAwMCkgew0KICAgICAgICAkdHlwZSA9ICdiJzsNCiAgICB9IGVsc2VpZiAoKCRtb2RlICYgMHgyMDAwKSA9PT0gMHgyMDAwKSB7DQogICAgICAgICR0eXBlID0gJ2MnOw0KICAgIH0gZWxzZWlmICgoJG1vZGUgJiAweDEwMDApID09PSAweDEwMDApIHsNCiAgICAgICAgJHR5cGUgPSAncCc7DQogICAgfSBlbHNlIHsNCiAgICAgICAgJHR5cGUgPSAnPyc7DQogICAgfQ0KICAgICRvd25lclsncmVhZCddID0gKCRtb2RlICYgMDA0MDApID8gJ3InIDogJy0nOw0KICAgICRvd25lclsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMjAwKSA/ICd3JyA6ICctJzsNCiAgICAkb3duZXJbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMTAwKSA/ICd4JyA6ICctJzsNCiAgICAkZ3JvdXBbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwMDQwKSA/ICdyJyA6ICctJzsNCiAgICAkZ3JvdXBbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDAyMCkgPyAndycgOiAnLSc7DQogICAgJGdyb3VwWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDAxMCkgPyAneCcgOiAnLSc7DQogICAgJHdvcmxkWydyZWFkJ10gPSAoJG1vZGUgJiAwMDAwNCkgPyAncicgOiAnLSc7DQogICAgJHdvcmxkWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMDIpID8gJ3cnIDogJy0nOw0KICAgICR3b3JsZFsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAwMDEpID8gJ3gnIDogJy0nOw0KICAgIGlmICgkbW9kZSAmIDB4ODAwKSB7DQogICAgICAgICRvd25lclsnZXhlY3V0ZSddID0gKCRvd25lclsnZXhlY3V0ZSddID09ICd4JykgPyAncycgOiAnUyc7DQogICAgfQ0KICAgIGlmICgkbW9kZSAmIDB4NDAwKSB7DQogICAgICAgICRncm91cFsnZXhlY3V0ZSddID0gKCRncm91cFsnZXhlY3V0ZSddID09ICd4JykgPyAncycgOiAnUyc7DQogICAgfQ0KICAgIGlmICgkbW9kZSAmIDB4MjAwKSB7DQogICAgICAgICR3b3JsZFsnZXhlY3V0ZSddID0gKCR3b3JsZFsnZXhlY3V0ZSddID09ICd4JykgPyAndCcgOiAnVCc7DQogICAgfQ0KICAgIHJldHVybiAkdHlwZSAuICRvd25lclsncmVhZCddIC4gJG93bmVyWyd3cml0ZSddIC4gJG93bmVyWydleGVjdXRlJ10gLiAkZ3JvdXBbJ3JlYWQnXSAuICRncm91cFsnd3JpdGUnXSAuICRncm91cFsnZXhlY3V0ZSddIC4gJHdvcmxkWydyZWFkJ10gLiAkd29ybGRbJ3dyaXRlJ10gLiAkd29ybGRbJ2V4ZWN1dGUnXTsNCn0NCmZ1bmN0aW9uIGdldFVzZXIoJGZpbGVwYXRoKSB7DQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSkgew0KICAgICAgICAkYXJyYXkgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZmlsZXBhdGgpKTsNCiAgICAgICAgaWYgKCRhcnJheSAmJiBpc19hcnJheSgkYXJyYXkpKSB7DQogICAgICAgICAgICByZXR1cm4gJyAvIDxhIGhyZWY9IiMiIHRpdGxlPSJVc2VyOiAnIC4gJGFycmF5WyduYW1lJ10gLiAnJiMxMyYjMTBQYXNzd2Q6ICcgLiAkYXJyYXlbJ3Bhc3N3ZCddIC4gJyYjMTMmIzEwVWlkOiAnIC4gJGFycmF5Wyd1aWQnXSAuICcmIzEzJiMxMGdpZDogJyAuICRhcnJheVsnZ2lkJ10gLiAnJiMxMyYjMTBHZWNvczogJyAuICRhcnJheVsnZ2Vjb3MnXSAuICcmIzEzJiMxMERpcjogJyAuICRhcnJheVsnZGlyJ10gLiAnJiMxMyYjMTBTaGVsbDogJyAuICRhcnJheVsnc2hlbGwnXSAuICciPicgLiAkYXJyYXlbJ25hbWUnXSAuICc8L2E+JzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gJyc7DQp9DQovLyBEZWxldGUgZGlyDQpmdW5jdGlvbiBkZWx0cmVlKCRkZWxkaXIpIHsNCiAgICAkbXlkaXIgPSBAZGlyKCRkZWxkaXIpOw0KICAgIHdoaWxlICgkZmlsZSA9ICRteWRpci0+cmVhZCgpKSB7DQogICAgICAgIGlmICgoaXNfZGlyKCRkZWxkaXIgLiAnLycgLiAkZmlsZSkpICYmICgkZmlsZSAhPSAnLicpICYmICgkZmlsZSAhPSAnLi4nKSkgew0KICAgICAgICAgICAgQGNobW9kKCRkZWxkaXIgLiAnLycgLiAkZmlsZSwgMDc3Nyk7DQogICAgICAgICAgICBkZWx0cmVlKCRkZWxkaXIgLiAnLycgLiAkZmlsZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGlzX2ZpbGUoJGRlbGRpciAuICcvJyAuICRmaWxlKSkgew0KICAgICAgICAgICAgQGNobW9kKCRkZWxkaXIgLiAnLycgLiAkZmlsZSwgMDc3Nyk7DQogICAgICAgICAgICBAdW5saW5rKCRkZWxkaXIgLiAnLycgLiAkZmlsZSk7DQogICAgICAgIH0NCiAgICB9DQogICAgJG15ZGlyLT5jbG9zZSgpOw0KICAgIEBjaG1vZCgkZGVsZGlyLCAwNzc3KTsNCiAgICByZXR1cm4gQHJtZGlyKCRkZWxkaXIpID8gMSA6IDA7DQp9DQovLyBCYWNrZ3JvdW5kDQpmdW5jdGlvbiBiZygpIHsNCiAgICBnbG9iYWwgJGJnYzsNCiAgICByZXR1cm4gKCRiZ2MrKyAlIDIgPT0gMCkgPyAnYWx0MScgOiAnYWx0Mic7DQp9DQovLyBHZXQgcGF0aA0KZnVuY3Rpb24gZ2V0UGF0aCgkc2NyaXB0cGF0aCwgJG5vd3BhdGgpIHsNCiAgICBpZiAoJG5vd3BhdGggPT0gJy4nKSB7DQogICAgICAgICRub3dwYXRoID0gJHNjcmlwdHBhdGg7DQogICAgfQ0KICAgICRub3dwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm93cGF0aCk7DQogICAgJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRub3dwYXRoKTsNCiAgICBpZiAoc3Vic3RyKCRub3dwYXRoLCAtMSkgIT0gJy8nKSB7DQogICAgICAgICRub3dwYXRoID0gJG5vd3BhdGggLiAnLyc7DQogICAgfQ0KICAgIHJldHVybiAkbm93cGF0aDsNCn0NCi8vIEdldCB1cCBwYXRoDQpmdW5jdGlvbiBnZXRVcFBhdGgoJG5vd3BhdGgpIHsNCiAgICAkcGF0aGRiID0gZXhwbG9kZSgnLycsICRub3dwYXRoKTsNCiAgICAkbnVtID0gY291bnQoJHBhdGhkYik7DQogICAgaWYgKCRudW0gPiAyKSB7DQogICAgICAgIHVuc2V0KCRwYXRoZGJbJG51bSAtIDFdLCAkcGF0aGRiWyRudW0gLSAyXSk7DQogICAgfQ0KICAgICR1cHBhdGggPSBpbXBsb2RlKCcvJywgJHBhdGhkYikgLiAnLyc7DQogICAgJHVwcGF0aCA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJHVwcGF0aCk7DQogICAgcmV0dXJuICR1cHBhdGg7DQp9DQovLyBDb25maWcNCmZ1bmN0aW9uIGdldGNmZygkdmFybmFtZSkgew0KICAgICRyZXN1bHQgPSBnZXRfY2ZnX3ZhcigkdmFybmFtZSk7DQogICAgaWYgKCRyZXN1bHQgPT0gMCkgew0KICAgICAgICByZXR1cm4gJ05vJzsNCiAgICB9IGVsc2VpZiAoJHJlc3VsdCA9PSAxKSB7DQogICAgICAgIHJldHVybiAnWWVzJzsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gJHJlc3VsdDsNCiAgICB9DQp9DQovLyBGdW5jdGlvbiBuYW1lDQpmdW5jdGlvbiBnZXRmdW4oJGZ1bk5hbWUpIHsNCiAgICByZXR1cm4gKGZhbHNlICE9PSBmdW5jdGlvbl9leGlzdHMoJGZ1bk5hbWUpKSA/ICdZZXMnIDogJ05vJzsNCn0NCmZ1bmN0aW9uIEdldExpc3QoJGRpcikgew0KICAgIGdsb2JhbCAkZGlyZGF0YSwgJGosICRub3dwYXRoOw0KICAgICEkaiAmJiAkaiA9IDE7DQogICAgaWYgKCRkaCA9IG9wZW5kaXIoJGRpcikpIHsNCiAgICAgICAgd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7DQogICAgICAgICAgICAkZiA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJGRpciAuICcvJyAuICRmaWxlKTsNCiAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJyAmJiBpc19kaXIoJGYpKSB7DQogICAgICAgICAgICAgICAgaWYgKGlzX3dyaXRhYmxlKCRmKSkgew0KICAgICAgICAgICAgICAgICAgICAkZGlyZGF0YVskal1bJ2ZpbGVuYW1lJ10gPSBzdHJfcmVwbGFjZSgkbm93cGF0aCwgJycsICRmKTsNCiAgICAgICAgICAgICAgICAgICAgJGRpcmRhdGFbJGpdWydtdGltZSddID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgZmlsZW10aW1lKCRmKSk7DQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnZGlyY2htb2QnXSA9IGdldENobW9kKCRmKTsNCiAgICAgICAgICAgICAgICAgICAgJGRpcmRhdGFbJGpdWydkaXJwZXJtJ10gPSBnZXRQZXJtcygkZik7DQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnZGlybGluayddID0gdWUoJGRpcik7DQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnc2VydmVyX2xpbmsnXSA9ICRmOw0KICAgICAgICAgICAgICAgICAgICAkZGlyZGF0YVskal1bJ2NsaWVudF9saW5rJ10gPSB1ZSgkZik7DQogICAgICAgICAgICAgICAgICAgICRqKys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIEdldExpc3QoJGYpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGNsb3NlZGlyKCRkaCk7DQogICAgICAgIGNsZWFyc3RhdGNhY2hlKCk7DQogICAgICAgIHJldHVybiAkZGlyZGF0YTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gYXJyYXkoKTsNCiAgICB9DQp9DQpmdW5jdGlvbiBxeSgkc3FsKSB7DQogICAgLy9lY2hvICRzcWwuJzxicj4nOw0KICAgICRyZXMgPSAkZXJyb3IgPSAnJzsNCiAgICBpZiAoISRyZXMgPSBAbXlzcWxfcXVlcnkoJHNxbCkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgfSBlbHNlIGlmIChpc19yZXNvdXJjZSgkcmVzKSkgew0KICAgICAgICByZXR1cm4gMTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gMjsNCiAgICB9DQogICAgcmV0dXJuIDA7DQp9DQpmdW5jdGlvbiBxKCRzcWwpIHsNCiAgICByZXR1cm4gQG15c3FsX3F1ZXJ5KCRzcWwpOw0KfQ0KZnVuY3Rpb24gZnIoJHF5KSB7DQogICAgbXlzcWxfZnJlZV9yZXN1bHQoJHF5KTsNCn0NCmZ1bmN0aW9uIHNpemVjb3VudCgkc2l6ZSkgew0KICAgIGlmICgkc2l6ZSA+IDEwNzM3NDE4MjQpIHsNCiAgICAgICAgJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4gJyBHJzsNCiAgICB9IGVsc2VpZiAoJHNpemUgPiAxMDQ4NTc2KSB7DQogICAgICAgICRzaXplID0gcm91bmQoJHNpemUgLyAxMDQ4NTc2ICogMTAwKSAvIDEwMCAuICcgTSc7DQogICAgfSBlbHNlaWYgKCRzaXplID4gMTAyNCkgew0KICAgICAgICAkc2l6ZSA9IHJvdW5kKCRzaXplIC8gMTAyNCAqIDEwMCkgLyAxMDAgLiAnIEsnOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRzaXplID0gJHNpemUgLiAnIEInOw0KICAgIH0NCiAgICByZXR1cm4gJHNpemU7DQp9DQovLyBaaXANCmNsYXNzIFBIUFppcCB7DQogICAgdmFyICRvdXQgPSAnJzsNCiAgICBmdW5jdGlvbiBQSFBaaXAoJGRpcikgew0KICAgICAgICBpZiAoQGZ1bmN0aW9uX2V4aXN0cygnZ3pjb21wcmVzcycpKSB7DQogICAgICAgICAgICAkY3VyZGlyID0gZ2V0Y3dkKCk7DQogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRpcikpICRmaWxlbGlzdCA9ICRkaXI7DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZmlsZWxpc3QgPSAkdGhpcy0+R2V0RmlsZUxpc3QoJGRpcik7IC8vRmlsZSBsaXN0DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVsaXN0IGFzICRrID0+ICR2KSAkZmlsZWxpc3RbXSA9IHN1YnN0cigkdiwgc3RybGVuKCRkaXIpICsgMSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoKCFlbXB0eSgkZGlyKSkgJiYgKCFpc19hcnJheSgkZGlyKSkgJiYgKGZpbGVfZXhpc3RzKCRkaXIpKSkgY2hkaXIoJGRpcik7DQogICAgICAgICAgICBlbHNlIGNoZGlyKCRjdXJkaXIpOw0KICAgICAgICAgICAgaWYgKGNvdW50KCRmaWxlbGlzdCkgPiAwKSB7DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVsaXN0IGFzICRmaWxlbmFtZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZmlsZSgkZmlsZW5hbWUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZmQgPSBmb3BlbigkZmlsZW5hbWUsICdyJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9IEBmcmVhZCgkZmQsIGZpbGVzaXplKCRmaWxlbmFtZSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCRmZCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRpcikpICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRmaWxlbmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YWRkRmlsZSgkY29udGVudCwgJGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkdGhpcy0+b3V0ID0gJHRoaXMtPmZpbGUoKTsNCiAgICAgICAgICAgICAgICBjaGRpcigkY3VyZGlyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9IGVsc2UgcmV0dXJuIDA7DQogICAgfQ0KICAgIC8vIFNob3cgZmlsZSBsaXN0DQogICAgZnVuY3Rpb24gR2V0RmlsZUxpc3QoJGRpcikgew0KICAgICAgICBzdGF0aWMgJGE7DQogICAgICAgIGlmIChpc19kaXIoJGRpcikpIHsNCiAgICAgICAgICAgIGlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7DQogICAgICAgICAgICAgICAgd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGYgPSAkZGlyIC4gJy8nIC4gJGZpbGU7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRmKSkgJHRoaXMtPkdldEZpbGVMaXN0KCRmKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRhW10gPSAkZjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjbG9zZWRpcigkZGgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkYTsNCiAgICB9DQogICAgdmFyICRkYXRhc2VjID0gYXJyYXkoKTsNCiAgICB2YXIgJGN0cmxfZGlyID0gYXJyYXkoKTsNCiAgICB2YXIgJGVvZl9jdHJsX2RpciA9ICJceDUwXHg0Ylx4MDVceDA2XHgwMFx4MDBceDAwXHgwMCI7DQogICAgdmFyICRvbGRfb2Zmc2V0ID0gMDsNCiAgICBmdW5jdGlvbiB1bml4MkRvc1RpbWUoJHVuaXh0aW1lID0gMCkgew0KICAgICAgICAkdGltZWFycmF5ID0gKCR1bml4dGltZSA9PSAwKSA/IGdldGRhdGUoKSA6IGdldGRhdGUoJHVuaXh0aW1lKTsNCiAgICAgICAgaWYgKCR0aW1lYXJyYXlbJ3llYXInXSA8IDE5ODApIHsNCiAgICAgICAgICAgICR0aW1lYXJyYXlbJ3llYXInXSA9IDE5ODA7DQogICAgICAgICAgICAkdGltZWFycmF5Wydtb24nXSA9IDE7DQogICAgICAgICAgICAkdGltZWFycmF5WydtZGF5J10gPSAxOw0KICAgICAgICAgICAgJHRpbWVhcnJheVsnaG91cnMnXSA9IDA7DQogICAgICAgICAgICAkdGltZWFycmF5WydtaW51dGVzJ10gPSAwOw0KICAgICAgICAgICAgJHRpbWVhcnJheVsnc2Vjb25kcyddID0gMDsNCiAgICAgICAgfSAvLyBlbmQgaWYNCiAgICAgICAgcmV0dXJuICgoJHRpbWVhcnJheVsneWVhciddIC0gMTk4MCkgPDwgMjUpIHwgKCR0aW1lYXJyYXlbJ21vbiddIDw8IDIxKSB8ICgkdGltZWFycmF5WydtZGF5J10gPDwgMTYpIHwgKCR0aW1lYXJyYXlbJ2hvdXJzJ10gPDwgMTEpIHwgKCR0aW1lYXJyYXlbJ21pbnV0ZXMnXSA8PCA1KSB8ICgkdGltZWFycmF5WydzZWNvbmRzJ10gPj4gMSk7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGFkZEZpbGUoJGRhdGEsICRuYW1lLCAkdGltZSA9IDApIHsNCiAgICAgICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRuYW1lKTsNCiAgICAgICAgJGR0aW1lID0gZGVjaGV4KCR0aGlzLT51bml4MkRvc1RpbWUoJHRpbWUpKTsNCiAgICAgICAgJGhleGR0aW1lID0gJ1x4JyAuICRkdGltZVs2XSAuICRkdGltZVs3XSAuICdceCcgLiAkZHRpbWVbNF0gLiAkZHRpbWVbNV0gLiAnXHgnIC4gJGR0aW1lWzJdIC4gJGR0aW1lWzNdIC4gJ1x4JyAuICRkdGltZVswXSAuICRkdGltZVsxXTsNCiAgICAgICAgZXZhbCgnJGhleGR0aW1lID0gIicgLiAkaGV4ZHRpbWUgLiAnIjsnKTsNCiAgICAgICAgJGZyID0gIlx4NTBceDRiXHgwM1x4MDQiOw0KICAgICAgICAkZnIuPSAiXHgxNFx4MDAiOw0KICAgICAgICAkZnIuPSAiXHgwMFx4MDAiOw0KICAgICAgICAkZnIuPSAiXHgwOFx4MDAiOw0KICAgICAgICAkZnIuPSAkaGV4ZHRpbWU7DQogICAgICAgICR1bmNfbGVuID0gc3RybGVuKCRkYXRhKTsNCiAgICAgICAgJGNyYyA9IGNyYzMyKCRkYXRhKTsNCiAgICAgICAgJHpkYXRhID0gZ3pjb21wcmVzcygkZGF0YSk7DQogICAgICAgICRjX2xlbiA9IHN0cmxlbigkemRhdGEpOw0KICAgICAgICAkemRhdGEgPSBzdWJzdHIoc3Vic3RyKCR6ZGF0YSwgMCwgc3RybGVuKCR6ZGF0YSkgLSA0KSwgMik7DQogICAgICAgICRmci49IHBhY2soJ1YnLCAkY3JjKTsNCiAgICAgICAgJGZyLj0gcGFjaygnVicsICRjX2xlbik7DQogICAgICAgICRmci49IHBhY2soJ1YnLCAkdW5jX2xlbik7DQogICAgICAgICRmci49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpKTsNCiAgICAgICAgJGZyLj0gcGFjaygndicsIDApOw0KICAgICAgICAkZnIuPSAkbmFtZTsNCiAgICAgICAgJGZyLj0gJHpkYXRhOw0KICAgICAgICAkZnIuPSBwYWNrKCdWJywgJGNyYyk7DQogICAgICAgICRmci49IHBhY2soJ1YnLCAkY19sZW4pOw0KICAgICAgICAkZnIuPSBwYWNrKCdWJywgJHVuY19sZW4pOw0KICAgICAgICAkdGhpcy0+ZGF0YXNlY1tdID0gJGZyOw0KICAgICAgICAkbmV3X29mZnNldCA9IHN0cmxlbihpbXBsb2RlKCcnLCAkdGhpcy0+ZGF0YXNlYykpOw0KICAgICAgICAkY2RyZWMgPSAiXHg1MFx4NGJceDAxXHgwMiI7DQogICAgICAgICRjZHJlYy49ICJceDAwXHgwMCI7DQogICAgICAgICRjZHJlYy49ICJceDE0XHgwMCI7DQogICAgICAgICRjZHJlYy49ICJceDAwXHgwMCI7DQogICAgICAgICRjZHJlYy49ICJceDA4XHgwMCI7DQogICAgICAgICRjZHJlYy49ICRoZXhkdGltZTsNCiAgICAgICAgJGNkcmVjLj0gcGFjaygnVicsICRjcmMpOw0KICAgICAgICAkY2RyZWMuPSBwYWNrKCdWJywgJGNfbGVuKTsNCiAgICAgICAgJGNkcmVjLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCiAgICAgICAgJGNkcmVjLj0gcGFjaygndicsIHN0cmxlbigkbmFtZSkpOw0KICAgICAgICAkY2RyZWMuPSBwYWNrKCd2JywgMCk7DQogICAgICAgICRjZHJlYy49IHBhY2soJ3YnLCAwKTsNCiAgICAgICAgJGNkcmVjLj0gcGFjaygndicsIDApOw0KICAgICAgICAkY2RyZWMuPSBwYWNrKCd2JywgMCk7DQogICAgICAgICRjZHJlYy49IHBhY2soJ1YnLCAzMik7DQogICAgICAgICRjZHJlYy49IHBhY2soJ1YnLCAkdGhpcy0+b2xkX29mZnNldCk7DQogICAgICAgICR0aGlzLT5vbGRfb2Zmc2V0ID0gJG5ld19vZmZzZXQ7DQogICAgICAgICRjZHJlYy49ICRuYW1lOw0KICAgICAgICAkdGhpcy0+Y3RybF9kaXJbXSA9ICRjZHJlYzsNCiAgICB9DQogICAgZnVuY3Rpb24gZmlsZSgpIHsNCiAgICAgICAgJGRhdGEgPSBpbXBsb2RlKCcnLCAkdGhpcy0+ZGF0YXNlYyk7DQogICAgICAgICRjdHJsZGlyID0gaW1wbG9kZSgnJywgJHRoaXMtPmN0cmxfZGlyKTsNCiAgICAgICAgcmV0dXJuICRkYXRhIC4gJGN0cmxkaXIgLiAkdGhpcy0+ZW9mX2N0cmxfZGlyIC4gcGFjaygndicsIHNpemVvZigkdGhpcy0+Y3RybF9kaXIpKSAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMtPmN0cmxfZGlyKSkgLiBwYWNrKCdWJywgc3RybGVuKCRjdHJsZGlyKSkgLiBwYWNrKCdWJywgc3RybGVuKCRkYXRhKSkgLiAiXHgwMFx4MDAiOw0KICAgIH0NCn0NCi8vIER1bXAgbXlzcWwNCmZ1bmN0aW9uIHNxbGR1bXB0YWJsZSgkdGFibGUsICRmcCA9IDApIHsNCiAgICAkdGFibGVkdW1wID0gIkRST1AgVEFCTEUgSUYgRVhJU1RTICR0YWJsZTtcbiI7DQogICAgJHRhYmxlZHVtcC49ICJDUkVBVEUgVEFCTEUgJHRhYmxlIChcbiI7DQogICAgJGZpcnN0ZmllbGQgPSAxOw0KICAgICRmaWVsZHMgPSBxKCJTSE9XIEZJRUxEUyBGUk9NICR0YWJsZSIpOw0KICAgIHdoaWxlICgkZmllbGQgPSBteXNxbF9mZXRjaF9hcnJheSgkZmllbGRzKSkgew0KICAgICAgICBpZiAoISRmaXJzdGZpZWxkKSB7DQogICAgICAgICAgICAkdGFibGVkdW1wLj0gIixcbiI7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkZmlyc3RmaWVsZCA9IDA7DQogICAgICAgIH0NCiAgICAgICAgJHRhYmxlZHVtcC49ICIgICAkZmllbGRbRmllbGRdICRmaWVsZFtUeXBlXSI7DQogICAgICAgIGlmICghZW1wdHkoJGZpZWxkWyJEZWZhdWx0Il0pKSB7DQogICAgICAgICAgICAkdGFibGVkdW1wLj0gIiBERUZBVUxUICckZmllbGRbRGVmYXVsdF0nIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGZpZWxkWydOdWxsJ10gIT0gIllFUyIpIHsNCiAgICAgICAgICAgICR0YWJsZWR1bXAuPSAiIE5PVCBOVUxMIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGZpZWxkWydFeHRyYSddICE9ICIiKSB7DQogICAgICAgICAgICAkdGFibGVkdW1wLj0gIiAkZmllbGRbRXh0cmFdIjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBmcigkZmllbGRzKTsNCiAgICAka2V5cyA9IHEoIlNIT1cgS0VZUyBGUk9NICR0YWJsZSIpOw0KICAgIHdoaWxlICgka2V5ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGtleXMpKSB7DQogICAgICAgICRrbmFtZSA9ICRrZXlbJ0tleV9uYW1lJ107DQogICAgICAgIGlmICgka25hbWUgIT0gIlBSSU1BUlkiICYmICRrZXlbJ05vbl91bmlxdWUnXSA9PSAwKSB7DQogICAgICAgICAgICAka25hbWUgPSAiVU5JUVVFfCRrbmFtZSI7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFpc19hcnJheSgkaW5kZXhbJGtuYW1lXSkpIHsNCiAgICAgICAgICAgICRpbmRleFska25hbWVdID0gYXJyYXkoKTsNCiAgICAgICAgfQ0KICAgICAgICAkaW5kZXhbJGtuYW1lXVtdID0gJGtleVsnQ29sdW1uX25hbWUnXTsNCiAgICB9DQogICAgZnIoJGtleXMpOw0KICAgIHdoaWxlIChsaXN0KCRrbmFtZSwgJGNvbHVtbnMpID0gQGVhY2goJGluZGV4KSkgew0KICAgICAgICAkdGFibGVkdW1wLj0gIixcbiI7DQogICAgICAgICRjb2xuYW1lcyA9IGltcGxvZGUoJGNvbHVtbnMsICIsIik7DQogICAgICAgIGlmICgka25hbWUgPT0gIlBSSU1BUlkiKSB7DQogICAgICAgICAgICAkdGFibGVkdW1wLj0gIiAgIFBSSU1BUlkgS0VZICgkY29sbmFtZXMpIjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmIChzdWJzdHIoJGtuYW1lLCAwLCA2KSA9PSAiVU5JUVVFIikgew0KICAgICAgICAgICAgICAgICRrbmFtZSA9IHN1YnN0cigka25hbWUsIDcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHRhYmxlZHVtcC49ICIgICBLRVkgJGtuYW1lICgkY29sbmFtZXMpIjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAkdGFibGVkdW1wLj0gIlxuKTtcblxuIjsNCiAgICBpZiAoJGZwKSB7DQogICAgICAgIGZ3cml0ZSgkZnAsICR0YWJsZWR1bXApOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGVjaG8gJHRhYmxlZHVtcDsNCiAgICB9DQogICAgJHJvd3MgPSBxKCJTRUxFQ1QgKiBGUk9NICR0YWJsZSIpOw0KICAgICRudW1maWVsZHMgPSBteXNxbF9udW1fZmllbGRzKCRyb3dzKTsNCiAgICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyb3dzKSkgew0KICAgICAgICAkdGFibGVkdW1wID0gIklOU0VSVCBJTlRPICR0YWJsZSBWQUxVRVMoIjsNCiAgICAgICAgJGZpZWxkY291bnRlciA9IC0gMTsNCiAgICAgICAgJGZpcnN0ZmllbGQgPSAxOw0KICAgICAgICB3aGlsZSAoKyskZmllbGRjb3VudGVyIDwgJG51bWZpZWxkcykgew0KICAgICAgICAgICAgaWYgKCEkZmlyc3RmaWVsZCkgew0KICAgICAgICAgICAgICAgICR0YWJsZWR1bXAuPSAiLCAiOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZmlyc3RmaWVsZCA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIWlzc2V0KCRyb3dbJGZpZWxkY291bnRlcl0pKSB7DQogICAgICAgICAgICAgICAgJHRhYmxlZHVtcC49ICJOVUxMIjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJHRhYmxlZHVtcC49ICInIiAuIG15c3FsX2VzY2FwZV9zdHJpbmcoJHJvd1skZmllbGRjb3VudGVyXSkgLiAiJyI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJHRhYmxlZHVtcC49ICIpO1xuIjsNCiAgICAgICAgaWYgKCRmcCkgew0KICAgICAgICAgICAgZndyaXRlKCRmcCwgJHRhYmxlZHVtcCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBlY2hvICR0YWJsZWR1bXA7DQogICAgICAgIH0NCiAgICB9DQogICAgZnIoJHJvd3MpOw0KICAgIGlmICgkZnApIHsNCiAgICAgICAgZndyaXRlKCRmcCwgIlxuIik7DQogICAgfSBlbHNlIHsNCiAgICAgICAgZWNobyAiXG4iOw0KICAgIH0NCn0NCmZ1bmN0aW9uIHVlKCRzdHIpIHsNCiAgICByZXR1cm4gdXJsZW5jb2RlKCRzdHIpOw0KfQ0KZnVuY3Rpb24gcCgkc3RyKSB7DQogICAgZWNobyAkc3RyIC4gIlxuIjsNCn0NCmZ1bmN0aW9uIHRiaGVhZCgpIHsNCiAgICBwKCc8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCn0NCmZ1bmN0aW9uIHRiZm9vdCgpIHsNCiAgICBwKCc8L3RhYmxlPicpOw0KfQ0KZnVuY3Rpb24gbWFrZWhpZGUoJG5hbWUsICR2YWx1ZSA9ICcnKSB7DQogICAgcCgiPGlucHV0IGlkPVwiJG5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiRuYW1lXCIgdmFsdWU9XCIkdmFsdWVcIiAvPiIpOw0KfQ0KZnVuY3Rpb24gbWFrZWlucHV0KCRhcmcgPSBhcnJheSgpKSB7DQogICAgJGFyZ1snc2l6ZSddID0gJGFyZ1snc2l6ZSddID4gMCA/ICJzaXplPVwiJGFyZ1tzaXplXVwiIiA6ICJzaXplPVwiMTAwXCIiOw0KICAgICRhcmdbJ2V4dHJhJ10gPSAkYXJnWydleHRyYSddID8gJGFyZ1snZXh0cmEnXSA6ICcnOw0KICAgICEkYXJnWyd0eXBlJ10gJiYgJGFyZ1sndHlwZSddID0gJ3RleHQnOw0KICAgICRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXSAuICc8YnIgLz4nIDogJyc7DQogICAgJGFyZ1snY2xhc3MnXSA9ICRhcmdbJ2NsYXNzJ10gPyAkYXJnWydjbGFzcyddIDogJ2lucHV0JzsNCiAgICBpZiAoJGFyZ1snbmV3bGluZSddKSB7DQogICAgICAgIHAoIjxwPiRhcmdbdGl0bGVdPGlucHV0IGNsYXNzPVwiJGFyZ1tjbGFzc11cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIHZhbHVlPVwiJGFyZ1t2YWx1ZV1cIiB0eXBlPVwiJGFyZ1t0eXBlXVwiICRhcmdbc2l6ZV0gJGFyZ1tleHRyYV0gLz48L3A+Iik7DQogICAgfSBlbHNlIHsNCiAgICAgICAgcCgiJGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPiIpOw0KICAgIH0NCn0NCmZ1bmN0aW9uIG1ha2VzZWxlY3QoJGFyZyA9IGFycmF5KCkpIHsNCiAgICBpZiAoJGFyZ1snb25jaGFuZ2UnXSkgew0KICAgICAgICAkb25jaGFuZ2UgPSAnb25jaGFuZ2U9IicgLiAkYXJnWydvbmNoYW5nZSddIC4gJyInOw0KICAgIH0NCiAgICAkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10gOiAnJzsNCiAgICBpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8cD4nKTsNCiAgICBwKCIkYXJnW3RpdGxlXSA8c2VsZWN0IGNsYXNzPVwiaW5wdXRcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiICRvbmNoYW5nZT4iKTsNCiAgICBpZiAoaXNfYXJyYXkoJGFyZ1snb3B0aW9uJ10pKSB7DQogICAgICAgIGZvcmVhY2ggKCRhcmdbJ29wdGlvbiddIGFzICRrZXkgPT4gJHZhbHVlKSB7DQogICAgICAgICAgICBpZiAoJGFyZ1snc2VsZWN0ZWQnXSA9PSAka2V5KSB7DQogICAgICAgICAgICAgICAgcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIiBzZWxlY3RlZD4kdmFsdWU8L29wdGlvbj4iKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIj4kdmFsdWU8L29wdGlvbj4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBwKCI8L3NlbGVjdD4iKTsNCiAgICBpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8L3A+Jyk7DQp9DQpmdW5jdGlvbiBmb3JtaGVhZCgkYXJnID0gYXJyYXkoKSkgew0KICAgICEkYXJnWydtZXRob2QnXSAmJiAkYXJnWydtZXRob2QnXSA9ICdwb3N0JzsNCiAgICAhJGFyZ1snYWN0aW9uJ10gJiYgJGFyZ1snYWN0aW9uJ10gPSAkc2VsZjsNCiAgICAkYXJnWyd0YXJnZXQnXSA9ICRhcmdbJ3RhcmdldCddID8gInRhcmdldD1cIiRhcmdbdGFyZ2V0XVwiIiA6ICcnOw0KICAgICEkYXJnWyduYW1lJ10gJiYgJGFyZ1snbmFtZSddID0gJ2Zvcm0xJzsNCiAgICBwKCI8Zm9ybSBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIGFjdGlvbj1cIiRhcmdbYWN0aW9uXVwiIG1ldGhvZD1cIiRhcmdbbWV0aG9kXVwiICRhcmdbdGFyZ2V0XT4iKTsNCiAgICBpZiAoJGFyZ1sndGl0bGUnXSkgew0KICAgICAgICBwKCc8aDI+JyAuICRhcmdbJ3RpdGxlJ10gLiAnICZyYXF1bzs8L2gyPicpOw0KICAgIH0NCn0NCmZ1bmN0aW9uIG1ha2V0ZXh0KCRhcmcgPSBhcnJheSgpKSB7DQogICAgISRhcmdbJ2NvbHMnXSAmJiAkYXJnWydjb2xzJ10gPSAxMDA7DQogICAgISRhcmdbJ3Jvd3MnXSAmJiAkYXJnWydyb3dzJ10gPSAyNTsNCiAgICAkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10gLiAnPGJyIC8+JyA6ICcnOw0KICAgIHAoIjxwPiRhcmdbdGl0bGVdPHRleHRhcmVhIGNsYXNzPVwiYXJlYVwiIGlkPVwiJGFyZ1tuYW1lXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgY29scz1cIiRhcmdbY29sc11cIiByb3dzPVwiJGFyZ1tyb3dzXVwiICRhcmdbZXh0cmFdPiRhcmdbdmFsdWVdPC90ZXh0YXJlYT48L3A+Iik7DQp9DQpmdW5jdGlvbiBmb3JtZm9vdGVyKCRuYW1lID0gJycpIHsNCiAgICAhJG5hbWUgJiYgJG5hbWUgPSAnc3VibWl0JzsNCiAgICBwKCc8cD48aW5wdXQgY2xhc3M9ImJ0IiBuYW1lPSInIC4gJG5hbWUgLiAnIiBpZD1cIicgLiAkbmFtZSAuICdcIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTdWJtaXQiPjwvcD4nKTsNCiAgICBwKCc8L2Zvcm0+Jyk7DQp9DQpmdW5jdGlvbiBmb3JtZm9vdCgpIHsNCiAgICBwKCc8L2Zvcm0+Jyk7DQp9DQovLyBFeGl0DQpmdW5jdGlvbiBwcigkYSkgew0KICAgIGVjaG8gJzxwcmU+JzsNCiAgICBwcmludF9yKCRhKTsNCiAgICBlY2hvICc8L3ByZT4nOw0KfQ0K

Function Calls

None

Variables

None

Stats

MD5 bca863e239f1ff0c0f6ac42d26fc900b
Eval Count 0
Decode Time 1196 ms