".base64_decode("PD9waHAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKfCogICAgIEVkaXQgJiBEZXZlbG9wIGJ5IE1vYWFkICAgICAgICp8CnwqaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL0JsNGNrMiAqfAp8KiAgICA9PSAgSGFja2luZyAmIFNlY3VyaXR5ICA9PSAgICAgICAgICAqfApcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqLwoKZXJyb3JfcmVwb3J0aW5nKDcpOwpAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOwpvYl9zdGFydCgpOwokbXRpbWUgPSBleHBsb2RlKCcgJywgbWljcm90aW1lKCkpOwokc3RhcnR0aW1lID0gJG10aW1lWzFdICsgJG10aW1lWzBdOwpkZWZpbmUoJ1NBX1JPT1QnLCBzdHJfcmVwbGFjZSgnXFwnLCAnLycsIGRpcm5hbWUoX19GSUxFX18pKS4nLycpOwovL2RlZmluZSgnSVNfV0lOJywgc3Ryc3RyKFBIUF9PUywgJ1dJTicpID8gMSA6IDAgKTsKZGVmaW5lKCdJU19XSU4nLCBESVJFQ1RPUllfU0VQQVJBVE9SID09ICdcXCcpOwpkZWZpbmUoJ0lTX0NPTScsIGNsYXNzX2V4aXN0cygnQ09NJykgPyAxIDogMCApOwpkZWZpbmUoJ0lTX0dQQycsIGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpOwokZGlzX2Z1bmMgPSBnZXRfY2ZnX3ZhcignZGlzYWJsZV9mdW5jdGlvbnMnKTsKZGVmaW5lKCdJU19QSFBJTkZPJywgKCFlcmVnaSgicGhwaW5mbyIsJGRpc19mdW5jKSkgPyAxIDogMCApOwpAc2V0X3RpbWVfbGltaXQoMCk7Cgpmb3JlYWNoKGFycmF5KCdfR0VUJywnX1BPU1QnKSBhcyAkX3JlcXVlc3QpIHsKCWZvcmVhY2goJCRfcmVxdWVzdCBhcyAkX2tleSA9PiAkX3ZhbHVlKSB7CgkJaWYgKCRfa2V5ezB9ICE9ICdfJykgewoJCQlpZiAoSVNfR1BDKSB7CgkJCQkkX3ZhbHVlID0gc19hcnJheSgkX3ZhbHVlKTsKCQkJfQoJCQkkJF9rZXkgPSAkX3ZhbHVlOwoJCX0KCX0KfQoKLyo9PT09PT09PT09PT09PT09PSAgSW5mbyBMb2dpbiAgPT09PT09PT09PT09PT09PSovCiRhZG1pbiA9IGFycmF5KCk7CiRhZG1pblsnY2hlY2snXSA9IHRydWU7CiRhZG1pblsncGFzcyddICA9ICdNdWF0aEAhQCc7CiRhZG1pblsnY29va2llcHJlJ10gPSAnJzsKJGFkbWluWydjb29raWVkb21haW4nXSA9ICcnOwokYWRtaW5bJ2Nvb2tpZXBhdGgnXSA9ICcvJzsKJGFkbWluWydjb29raWVsaWZlJ10gPSA4NjQwMDsKLyo9PT09PT09PT09PT09PT09PT09PT0gRW5kID09PT09PT09PT09PT09PT09PT09PSovCgppZiAoJGNoYXJzZXQgPT0gJ3V0ZjgnKSB7CgloZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iik7Cn0gZWxzZWlmICgkY2hhcnNldCA9PSAnYmlnNScpIHsKCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9YmlnNSIpOwp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2diaycpIHsKCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Z2JrIik7Cn0gZWxzZWlmICgkY2hhcnNldCA9PSAnbGF0aW4xJykgewoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0yIik7Cn0KCiRzZWxmID0gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gPyAkX1NFUlZFUlsnUEhQX1NFTEYnXSA6ICRfU0VSVkVSWydTQ1JJUFRfTkFNRSddOwokdGltZXN0YW1wID0gdGltZSgpOwoKLyo9PT09PT09PT09PT09PT09PT09PT0gTG9naW4gPT09PT09PT09PT09PT09PT09PT09Ki8KaWYgKCRhY3Rpb24gPT0gImxvZ291dCIpIHsKCXNjb29raWUoJ3RtdHBhc3MnLCAnJywgLTg2NDAwICogMzY1KTsKCXAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7VVJMPScuJHNlbGYuJyI+Jyk7CglwKCc8Ym9keSBiYWNrZ3JvdW5kPWh0dHA6Ly9zdG9yZTIudXAtMDAuY29tL0FwcjEzL2l6cjQwNjIyLmdpZj4nKTsKCWV4aXQ7Cn0KaWYoJGFkbWluWydjaGVjayddKSB7CglpZiAoJGRvaW5nID09ICdsb2dpbicpIHsKCQlpZiAoJGFkbWluWydwYXNzJ10gPT0gJHBhc3N3b3JkKSB7CgkJCXNjb29raWUoJ3RtdHBhc3MnLCAkcGFzc3dvcmQpOwoJCQkKLy8gRnVuY3Rpb24gbWFpbCBTZW5kZXIgdG8gbXkgRW1haWwgLSBQbGVhc2UgcmVtb3ZlIHRoaXMgYmVmb3JlIHlvdSB1c2luZyB0aGlzIFNoM2xsIGNvZGUsIFRoYW5rcyAtIAokdGltZV9TaDNsbCA9ICIiLmRhdGUoImQvbS9ZIC0gSDppOnMiKS4iIjsKJGlwX3JlbW90ZSA9ICRfU0VSVkVSWyJSRU1PVEVfQUREUiJdOwokZnJvbV9TaDNsbGNvZGUgPSAnU2gzbGxAJy5nZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKS4nJzsKJHRvX2VtYWlsID0gJ2YwcnVzOHhAZ21haWwuY29tJzsKJHNlcnZlcl9tYWlsID0gIiIuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkuIiAgLSAiLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iIjsgCiRsaW5rY3IgPSAiTGluazogIi4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4iIi4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXS4iIC0gSVAgRXhjdXRpbmc6ICRpcF9yZW1vdGUgLSBUaW1lOiAkdGltZV9TaDNsbCI7CiRoZWFkZXIgPSAiRnJvbTogJGZyb21fU2gzbGxjb2RlXHJcblJlcGx5LXRvOiAkZnJvbV9TaDNsbGNvZGUiOwpAbWFpbCgkdG9fZW1haWwsICRzZXJ2ZXJfbWFpbCwgJGxpbmtjciwgJGhlYWRlcik7CgkJCXAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjI7VVJMPScuJHNlbGYuJyI+Jyk7CgkJCXAoJzxib2R5IGJhY2tncm91bmQ9aHR0cDovL3N0b3JlMi51cC0wMC5jb20vQXByMTMvaXpyNDA2MjIuZ2lmPgo8QlI+PEJSPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGNvbG9yPXllbGxvdyBmYWNlPXRhaG9tYSBzaXplPTI+V2VsY29tZSBvbiBTaDNsbCBNdWF0aCBCc291bCAgSEFDS0VEIE9LXCdzIE1lbWJlciAtIFBsZWFzZSB3YWl0Li4uPEJSPjxpbWcgc3JjPWh0dHA6Ly93d3cuc2VoaGEuY29tL21lbWJlcnMvaW1hZ2VzL3dhaXQuZ2lmPjwvZGl2PicpOwoJCQlleGl0OwoJCX0KCQoJZWxzZSAKCXsKCSRlcnJfbWVzcyA9ICc8dGFibGUgd2lkdGg9MTAwJT48dHI+PHRkIGJnY29sb3I9IzBFMEUwRSB3aWR0aD0xMDAlIGhlaWdodD0yND48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBjb2xvcj1yZWQgZmFjZT10YWhvbWEgc2l6ZT0yPjxibGluaz5QYXNzd29yZCBpbmNvcnJlY3QsIFBsZWFzZSB0cnkgYWdhaW4hISE8L2JsaW5rPjxCUj48L2ZvbnQ+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+JzsKZWNobyAkZXJyX21lc3M7Cgl9fQoJaWYgKCRfQ09PS0lFWyd0bXRwYXNzJ10pIHsKCQlpZiAoJF9DT09LSUVbJ3RtdHBhc3MnXSAhPSAkYWRtaW5bJ3Bhc3MnXSkgewoJCQlsb2dpbnBhZ2UoKTsKCQl9Cgl9IGVsc2UgewoJCWxvZ2lucGFnZSgpOwoJfQp9Ci8qPT09PT09PT09PT09PT09PT09PT09IExvZ2luID09PT09PT09PT09PT09PT09PT09PSovCgokZXJybXNnID0gJyc7CgppZiAoJGFjdGlvbiA9PSAncGhwaW5mbycpIHsKCWlmIChJU19QSFBJTkZPKSB7CgkJcGhwaW5mbygpOwoJfSBlbHNlIHsKCQkkZXJybXNnID0gJ3BocGluZm8oKSBmdW5jdGlvbiBoYXMgbm9uLXBlcm1pc3NpYmxlJzsKCX0KfQoKCmlmICgkZG9pbmcgPT0gJ2Rvd25maWxlJyAmJiAkdGhlZmlsZSkgewoJaWYgKCFAZmlsZV9leGlzdHMoJHRoZWZpbGUpKSB7CgkJJGVycm1zZyA9ICdUaGUgZmlsZSB5b3Ugd2FudCBEb3dubG9hZGFibGUgd2FzIG5vbmV4aXN0ZW50JzsKCX0gZWxzZSB7CgkJJGZpbGVpbmZvID0gcGF0aGluZm8oJHRoZWZpbGUpOwoJCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LScuJGZpbGVpbmZvWydleHRlbnNpb24nXSk7CgkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nLiRmaWxlaW5mb1snYmFzZW5hbWUnXSk7CgkJaGVhZGVyKCdDb250ZW50LUxlbmd0aDogJy5maWxlc2l6ZSgkdGhlZmlsZSkpOwoJCUByZWFkZmlsZSgkdGhlZmlsZSk7CgkJZXhpdDsKCX0KfQoKCmlmICgkZG9pbmcgPT0gJ2JhY2t1cG15c3FsJyAmJiAhJHNhdmVhc2ZpbGUpIHsKCWRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7CgkkdGFibGUgPSBhcnJheV9mbGlwKCR0YWJsZSk7CgkkcmVzdWx0ID0gcSgiU0hPVyB0YWJsZXMiKTsKCWlmICghJHJlc3VsdCkgcCgnPGgyPicubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsKCSRmaWxlbmFtZSA9IGJhc2VuYW1lKCRfU0VSVkVSWydIVFRQX0hPU1QnXS4nX015U1FMLnNxbCcpOwoJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3Vua25vd24nKTsKCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZW5hbWUpOwoJJG15c3FsZGF0YSA9ICcnOwoJd2hpbGUgKCRjdXJyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgewoJCWlmIChpc3NldCgkdGFibGVbJGN1cnJvd1swXV0pKSB7CgkJCSRteXNxbGRhdGEgLj0gc3FsZHVtcHRhYmxlKCRjdXJyb3dbMF0pOwoJCX0KCX0KCW15c3FsX2Nsb3NlKCk7CglleGl0Owp9CgovLyBNeXNxbAppZigkZG9pbmc9PSdteXNxbGRvd24nKXsKCWlmICghJGRibmFtZSkgewoJCSRlcnJtc2cgPSAnUGxlYXNlIGlucHV0IGRibmFtZSc7Cgl9IGVsc2UgewoJCWRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7CgkJaWYgKCFmaWxlX2V4aXN0cygkbXlzcWxkbGZpbGUpKSB7CgkJCSRlcnJtc2cgPSAnVGhlIGZpbGUgeW91IHdhbnQgRG93bmxvYWRhYmxlIHdhcyBub25leGlzdGVudCc7CgkJfSBlbHNlIHsKCQkJJHJlc3VsdCA9IHEoInNlbGVjdCBsb2FkX2ZpbGUoJyRteXNxbGRsZmlsZScpOyIpOwoJCQlpZighJHJlc3VsdCl7CgkJCQlxKCJEUk9QIFRBQkxFIElGIEVYSVNUUyB0bXBfYW5nZWw7Iik7CgkJCQlxKCJDUkVBVEUgVEFCTEUgdG1wX2FuZ2VsIChjb250ZW50IExPTkdCTE9CIE5PVCBOVUxMKTsiKTsKCQkJCS8vRG93bmxvYWQgU1FMCgkJCQlxKCJMT0FEIERBVEEgTE9DQUwgSU5GSUxFICciLmFkZHNsYXNoZXMoJG15c3FsZGxmaWxlKS4iJyBJTlRPIFRBQkxFIHRtcF9hbmdlbCBGSUVMRFMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nIEVTQ0FQRUQgQlkgJycgTElORVMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nOyIpOwoJCQkJJHJlc3VsdCA9IHEoInNlbGVjdCBjb250ZW50IGZyb20gdG1wX2FuZ2VsIik7CgkJCQlxKCJEUk9QIFRBQkxFIHRtcF9hbmdlbCIpOwoJCQl9CgkJCSRyb3cgPSBAbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCk7CgkJCWlmICghJHJvdykgewoJCQkJJGVycm1zZyA9ICdMb2FkIGZpbGUgZmFpbGVkICcubXlzcWxfZXJyb3IoKTsKCQkJfSBlbHNlIHsKCQkJCSRmaWxlaW5mbyA9IHBhdGhpbmZvKCRteXNxbGRsZmlsZSk7CgkJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOwoJCQkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nLiRmaWxlaW5mb1snYmFzZW5hbWUnXSk7CgkJCQloZWFkZXIoIkFjY2VwdC1MZW5ndGg6ICIuc3RybGVuKCRyb3dbMF0pKTsKCQkJCWVjaG8gJHJvd1swXTsKCQkJCWV4aXQ7CgkJCX0KCQl9Cgl9Cn0KCj8+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgo8dGl0bGU+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ011YXRoIEJzb3VsLiBTaDNsbCcpOz8+PC90aXRsZT4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSx0ZHtmb250OiAxMHB0IFRhaG9tYTtjb2xvcjpncmF5O2xpbmUtaGVpZ2h0OiAxNnB4O30KCmEge2NvbG9yOiAjNzRBMjAyO3RleHQtZGVjb3JhdGlvbjpub25lO30KYTpob3Zlcntjb2xvcjogI2YwMDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KLmFsdDEgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6IzBFMEUwRTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQouYWx0MiB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojZjlmOWY5O3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9Ci5mb2N1cyB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMEUwRTBFO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9Ci5mb3V0MSB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMEUwRTBFO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9Ci5mb3V0IHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbTowcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMyMDIwMjA7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30KLmhlYWQgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6IzIwMjAyMDtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7Zm9udC13ZWlnaHQ6Ym9sZDt9Ci5oZWFkX3NtYWxsIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMyMDIwMjA7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6OHB0O30KLmhlYWQgdGQgc3Bhbntmb250LXdlaWdodDpub3JtYWw7fQpmb3Jte21hcmdpbjowO3BhZGRpbmc6MDt9Cmgye21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM1QjY4NkY7fQp1bC5pbmZvIGxpe21hcmdpbjowO2NvbG9yOiM0NDQ7bGluZS1oZWlnaHQ6MjRweDtoZWlnaHQ6MjRweDt9CnV7dGV4dC1kZWNvcmF0aW9uOiBub25lO2NvbG9yOiM3Nzc7ZmxvYXQ6bGVmdDtkaXNwbGF5OmJsb2NrO3dpZHRoOjE1MHB4O21hcmdpbi1yaWdodDoxMHB4O30KaW5wdXQsIHRleHRhcmVhLCBidXR0b24KewoJZm9udC1zaXplOiA5cHQ7Cgljb2xvcjogI2NjYzsKCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwoJYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDsKCWJvcmRlci1sZWZ0OiAxcHggc29saWQgIzc0QTIwMjsKCWJvcmRlci10b3A6IDFweCBzb2xpZCAjNzRBMjAyOwoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzc0QTIwMjsKCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNzRBMjAyOwp9CnNlbGVjdAp7Cglmb250LXNpemU6IDhwdDsKCWZvbnQtd2VpZ2h0OiBub3JtYWw7Cgljb2xvcjogI2NjYzsKCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwoJYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDsKfQoKPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpmdW5jdGlvbiBDaGVja0FsbChmb3JtKSB7Cglmb3IodmFyIGk9MDtpPGZvcm0uZWxlbWVudHMubGVuZ3RoO2krKykgewoJCXZhciBlID0gZm9ybS5lbGVtZW50c1tpXTsKCQlpZiAoZS5uYW1lICE9ICdjaGthbGwnKQoJCWUuY2hlY2tlZCA9IGZvcm0uY2hrYWxsLmNoZWNrZWQ7CiAgICB9Cn0KZnVuY3Rpb24gJChpZCkgewoJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKfQpmdW5jdGlvbiBnb2FjdGlvbihhY3QpewoJJCgnZ29hY3Rpb24nKS5hY3Rpb24udmFsdWU9YWN0OwoJJCgnZ29hY3Rpb24nKS5zdWJtaXQoKTsKfQo8L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBvbkxvYWQ9ImluaXQoKSIgc3R5bGU9Im1hcmdpbjowO3RhYmxlLWxheW91dDpmaXhlZDsgd29yZC1icmVhazpicmVhay1hbGwiIGJnY29sb3I9YmxhY2sgYmFja2dyb3VuZD1odHRwOi8vc3RvcmUyLnVwLTAwLmNvbS9BcHIxMy9penI0MDYyMi5naWY+CgoKPGRpdiBib3JkZXI9IjAiIHN0eWxlPSJwb3NpdGlvbjpmaXhlZDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMjVweDsgei1pbmRleDogMTsgdG9wOiAzMDBweDsgbGVmdDogMDsiIGlkPSJsb2FkaW5nIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249ImNlbnRlciI+CgkJCQk8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTEwcHgiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIGJvcmRlcmNvbG9yPSIjMDAzMzAwIj4KCQkJCQk8dHI+CgkJCQkJCTx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Y2VudGVyPgoJCQkJIDxkaXYgYm9yZGVyPSIxIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzBFMEUwRTsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTcwKTsgb3BhY2l0eTogLjc7IHdpZHRoOiAxMTBweDsgaGVpZ2h0OiAyNXB4OyB6LWluZGV4OiAxOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyIgYm9yZGVyY29sb3I9IiMwMDY2MDAiICBhbGlnbj0iY2VudGVyIj4KCQkJCSAgIExvYWRpbmc8aW1nIHNyYz0iaHR0cDovL3d3dy5zZWhoYS5jb20vbWVtYmVycy9pbWFnZXMvd2FpdC5naWYiPgoJCQkJICA8L2Rpdj4KCQkJCTwvdGQ+CgkJCQkJPC90cj4KCQkJCTwvdGFibGU+CgkJCSA8L2Rpdj4KIDxzY3JpcHQ+CiB2YXIgbGQ9KGRvY3VtZW50LmFsbCk7CiAgdmFyIG5zND1kb2N1bWVudC5sYXllcnM7CiB2YXIgbnM2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkJiYhZG9jdW1lbnQuYWxsOwogdmFyIGllND1kb2N1bWVudC5hbGw7CiAgaWYgKG5zNCkKIAlsZD1kb2N1bWVudC5sb2FkaW5nOwogZWxzZSBpZiAobnM2KQogCWxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkaW5nIikuc3R5bGU7CiBlbHNlIGlmIChpZTQpCiAJbGQ9ZG9jdW1lbnQuYWxsLmxvYWRpbmcuc3R5bGU7CiAgZnVuY3Rpb24gaW5pdCgpCiB7CiBpZihuczQpe2xkLnZpc2liaWxpdHk9ImhpZGRlbiI7fQogZWxzZSBpZiAobnM2fHxpZTQpIGxkLmRpc3BsYXk9Im5vbmUiOwogfQogPC9zY3JpcHQ+CgoJCgoKPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Cgk8dHIgY2xhc3M9ImhlYWRfc21hbGwiPgoJCTx0ZCAgd2lkdGg9MTAwJT4KCQk8dGFibGUgd2lkdGg9MTAwJT48dHIgY2xhc3M9ImhlYWRfc21hbGwiPjx0ZCAgd2lkdGg9ODZweD48YSB0aXRsZT0iTXVhdGggQnNvdWwgU2gzbGwiIGhyZWY9Ijw/cGhwICRzZWxmOz8+Ij48aW1nIHNyYz1odHRwczovL3Njb250ZW50LWEtbWFkLnh4LmZiY2RuLm5ldC9ocGhvdG9zLXBybjIvdDEuMC05LzE0Nzc0NDRfNTY2MjgzMzIzNDQ5MTU4XzIxMjY2MzE4NDBfbi5qcGcgaGVpZ2h0PTg2IGJvcmRlcj0wPjwvYT48L3RkPjx0ZD4KCQk8c3BhbiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij4gPD9waHAgZWNobyAiSG9zdG5hbWU6ICIuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiIiOz8+ICB8IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9ibDRjazIiIHRhcmdldD0iX2JsYW5rIj48P3BocCBlY2hvIHN0cl9yZXBsYWNlKCcuJywnJywnTXVhdGggQnNvdWwnKTs/PiBWZXJzaW9uIDIuMjwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdsb2dvdXQnKTsiPjxmb250IGNvbG9yPXJlZD5Mb2dvdXQ8L2ZvbnQ+PC9hPjwvc3Bhbj4KCgkJPD9waHAgCgkJJGN1cmxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKTsKCQkkbXlzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9jb25uZWN0Jyk7CgkJJG1zc3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpOwoJCSRwZ19vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKTsKCQkkb3JhX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnb2NpbG9nb24nKTsKCQkKZWNobyAoKCRzYWZlX21vZGUpPygiU2FmZV9tb2Q6IDxiPjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiKTooIlNhZmVfbW9kOiA8Yj48Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiKSk7CmVjaG8gIlBIUCB2ZXJzaW9uOiA8Yj4iLkBwaHB2ZXJzaW9uKCkuIjwvYj4gLSAiOwoJCWVjaG8gImNVUkw6ICIuKCgkY3VybF9vbik/KCI8Yj48Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIik6KCI8Yj48Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiKSk7CgkJZWNobyAiTXlTUUw6IDxiPiI7CiRteXNxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ215c3FsX2Nvbm5lY3QnKTsKaWYoJG15c3FsX29uKXsKZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiAtICI7IH0gZWxzZSB7IGVjaG8gIjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICI7IH0KZWNobyAiTVNTUUw6IDxiPiI7CiRtc3NxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKTsKaWYoJG1zc3FsX29uKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIjt9ZWxzZXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiO30KZWNobyAiUG9zdGdyZVNRTDogPGI+IjsKJHBnX29uID0gQGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpOwppZigkcGdfb24pe2VjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICI7fQplY2hvICJPcmFjbGU6IDxiPiI7CiRvcmFfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdvY2lsb2dvbicpOwppZigkb3JhX29uKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+Ijt9ZWxzZXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj48QlI+Ijt9CgplY2hvICJEaXNhYmxlIGZ1bmN0aW9ucyA6IDxiPiI7CmlmKCcnPT0oJGRmPUBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSl7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+Tk9ORTwvZm9udD48L2I+PEJSPiI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9cmVkPiRkZjwvZm9udD48L2I+PEJSPiI7fQoKZWNobyAiPGZvbnQgY29sb3I9d2hpdGU+VW5hbWUgLWE8L2ZvbnQ+OiAiLkBzdWJzdHIoQHBocF91bmFtZSgpLDAsMTIwKS4iPGJyPiI7CmVjaG8gIjxmb250IGNvbG9yPXdoaXRlPlNlcnZlcjwvZm9udD46ICIuQHN1YnN0cigkU0VSVkVSX1NPRlRXQVJFLDAsMTIwKS4iIC0gPGZvbnQgY29sb3I9d2hpdGU+aWQ8L2ZvbnQ+OiAiLkBnZXRteXVpZCgpLiIoIi5AZ2V0X2N1cnJlbnRfdXNlcigpLiIpIC0gdWlkPSIuQGdldG15dWlkKCkuIiAoIi5AZ2V0X2N1cnJlbnRfdXNlcigpLiIpIGdpZD0iLkBnZXRteWdpZCgpLiIoIi5AZ2V0X2N1cnJlbnRfdXNlcigpLiIpPGJyPiI7CgkJPz4KCQk8L3RkPjwvdHI+PC90YWJsZT48L3RkPgoJPC90cj4KCTx0ciBjbGFzcz0iYWx0MSI+CgkJPHRkICB3aWR0aD0xMDAlPjxzcGFuIHN0eWxlPSJmbG9hdDpyaWdodDsiPltTZXJ2ZXIgSVA6IDw/cGhwIGVjaG8gIjxmb250IGNvbG9yPXllbGxvdz4iLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLiI8L2ZvbnQ+Ijs/PiAtIFlvdXIgSVA6IDw/cGhwIGVjaG8gIjxmb250IGNvbG9yPXllbGxvdz4iLiRfU0VSVkVSWydSRU1PVEVfQUREUiddLiI8L2ZvbnQ+Ijs/Pl0gPC9zcGFuPgoKCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZmlsZScpOyI+RmlsZSBNYW5hZ2VyPC9hPiB8CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NxbGFkbWluJyk7Ij5NeVNRTCBNYW5hZ2VyPC9hPiB8CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NxbGZpbGUnKTsiPk15U1FMIFVwbG9hZCAmYW1wOyBEb3dubG9hZDwvYT4gfAoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdTaDNsbCcpOyI+RXhlY3V0ZSBDb21tYW5kPC9hPiB8CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3BocGVudicpOyI+UEhQIFZhcmlhYmxlPC9hPiB8CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2V2YWwnKTsiPkV2YWwgUEhQIENvZGU8L2E+IAoJCQk8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYnJ1dGUnKTsiPkJydXRlPC9hPiA8P3BocCB9Pz4KCQkJPD9waHAgaWYgKCFJU19XSU4pIHs/PiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2V0Y3B3ZCcpOyI+L2V0Yy9wYXNzd2Q8L2E+IDw/cGhwIH0/PgoJCQk8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYmFja2Nvbm5lY3QnKTsiPkJhY2sgQ29ubmVjdDwvYT48P3BocCB9Pz4KCQk8L3RkPgoJPC90cj4KPC90YWJsZT4KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIxNSIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQ+Cjw/cGhwCgpmb3JtaGVhZChhcnJheSgnbmFtZSc9Pidnb2FjdGlvbicpKTsKbWFrZWhpZGUoJ2FjdGlvbicpOwpmb3JtZm9vdCgpOwoKJGVycm1zZyAmJiBtKCRlcnJtc2cpOwoKLy8gRGlyIGZ1bmN0aW9uCiEkZGlyICYmICRkaXIgPSAnLic7CiRub3dwYXRoID0gZ2V0UGF0aChTQV9ST09ULCAkZGlyKTsKaWYgKHN1YnN0cigkZGlyLCAtMSkgIT0gJy8nKSB7CgkkZGlyID0gJGRpci4nLyc7Cn0KJHVlZGlyID0gdWUoJGRpcik7CgppZiAoISRhY3Rpb24gfHwgJGFjdGlvbiA9PSAnZmlsZScpIHsKCgkvLyBOb24td3JpdGVhYmxlCgkkZGlyX3dyaXRlYWJsZSA9IEBpc193cml0YWJsZSgkbm93cGF0aCkgPyAnV3JpdGFibGUnIDogJ05vbi13cml0YWJsZSc7CgoJLy8gRGVsZXRlIGRpcgoJaWYgKCRkb2luZyA9PSAnZGVsZGlyJyAmJiAkdGhlZmlsZSkgewoJCWlmICghZmlsZV9leGlzdHMoJHRoZWZpbGUpKSB7CgkJCW0oJHRoZWZpbGUuJyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QnKTsKCQl9IGVsc2UgewoJCQltKCdEaXJlY3RvcnkgZGVsZXRlICcuKGRlbHRyZWUoJHRoZWZpbGUpID8gYmFzZW5hbWUoJHRoZWZpbGUpLicgc3VjY2VzcycgOiAnZmFpbGVkJykpOwoJCX0KCX0KCgkvLyBDcmVhdGUgbmV3IGRpcgoJZWxzZWlmICgkbmV3ZGlybmFtZSkgewoJCSRta2RpcnMgPSAkbm93cGF0aC4kbmV3ZGlybmFtZTsKCQlpZiAoZmlsZV9leGlzdHMoJG1rZGlycykpIHsKCQkJbSgnRGlyZWN0b3J5IGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsKCQl9IGVsc2UgewoJCQltKCdEaXJlY3RvcnkgY3JlYXRlZCAnLihAbWtkaXIoJG1rZGlycywwNzU1KSA/ICdzdWNjZXNzJyA6ICdmYWlsZWQnKSk7CgkJCUBjaG1vZCgkbWtkaXJzLDA3NTUpOwoJCX0KCX0KCgkvLyBVcGxvYWQgZmlsZQoJZWxzZWlmICgkZG91cGZpbGUpIHsKCQltKCdGaWxlIHVwbG9hZCAnLihAY29weSgkX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ3RtcF9uYW1lJ10sJHVwbG9hZGRpci4nLycuJF9GSUxFU1sndXBsb2FkZmlsZSddWyduYW1lJ10pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsKCX0KCgkvLyBFZGl0IGZpbGUKCWVsc2VpZiAoJGVkaXRmaWxlbmFtZSAmJiAkZmlsZWNvbnRlbnQpIHsKCQkkZnAgPSBAZm9wZW4oJGVkaXRmaWxlbmFtZSwndycpOwoJCW0oJ1NhdmUgZmlsZSAnLihAZndyaXRlKCRmcCwkZmlsZWNvbnRlbnQpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsKCQlAZmNsb3NlKCRmcCk7Cgl9CgoJLy8gTW9kaWZ5CgllbHNlaWYgKCRwZmlsZSAmJiAkbmV3cGVybSkgewoJCWlmICghZmlsZV9leGlzdHMoJHBmaWxlKSkgewoJCQltKCdUaGUgb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOwoJCX0gZWxzZSB7CgkJCSRuZXdwZXJtID0gYmFzZV9jb252ZXJ0KCRuZXdwZXJtLDgsMTApOwoJCQltKCdNb2RpZnkgZmlsZSBhdHRyaWJ1dGVzICcuKEBjaG1vZCgkcGZpbGUsJG5ld3Blcm0pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsKCQl9Cgl9CgoJLy8gUmVuYW1lCgllbHNlaWYgKCRvbGRuYW1lICYmICRuZXdmaWxlbmFtZSkgewoJCSRubmFtZSA9ICRub3dwYXRoLiRuZXdmaWxlbmFtZTsKCQlpZiAoZmlsZV9leGlzdHMoJG5uYW1lKSB8fCAhZmlsZV9leGlzdHMoJG9sZG5hbWUpKSB7CgkJCW0oJG5uYW1lLicgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7CgkJfSBlbHNlIHsKCQkJbShiYXNlbmFtZSgkb2xkbmFtZSkuJyByZW5hbWVkICcuYmFzZW5hbWUoJG5uYW1lKS4oQHJlbmFtZSgkb2xkbmFtZSwkbm5hbWUpID8gJyBzdWNjZXNzJyA6ICdmYWlsZWQnKSk7CgkJfQoJfQoKCS8vIENvcHUKCWVsc2VpZiAoJHNuYW1lICYmICR0b2ZpbGUpIHsKCQlpZiAoZmlsZV9leGlzdHMoJHRvZmlsZSkgfHwgIWZpbGVfZXhpc3RzKCRzbmFtZSkpIHsKCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsKCQl9IGVsc2UgewoJCQltKGJhc2VuYW1lKCR0b2ZpbGUpLicgY29waWVkICcuKEBjb3B5KCRzbmFtZSwkdG9maWxlKSA/IGJhc2VuYW1lKCR0b2ZpbGUpLicgc3VjY2VzcycgOiAnZmFpbGVkJykpOwoJCX0KCX0KCgkvLyBGaWxlIGV4aXQKCWVsc2VpZiAoJGN1cmZpbGUgJiYgJHRhcmZpbGUpIHsKCQlpZiAoIUBmaWxlX2V4aXN0cygkY3VyZmlsZSkgfHwgIUBmaWxlX2V4aXN0cygkdGFyZmlsZSkpIHsKCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsKCQl9IGVsc2UgewoJCQkkdGltZSA9IEBmaWxlbXRpbWUoJHRhcmZpbGUpOwoJCQltKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsKCQl9Cgl9CgoJLy8gRGF0ZQoJZWxzZWlmICgkY3VyZmlsZSAmJiAkeWVhciAmJiAkbW9udGggJiYgJGRheSAmJiAkaG91ciAmJiAkbWludXRlICYmICRzZWNvbmQpIHsKCQlpZiAoIUBmaWxlX2V4aXN0cygkY3VyZmlsZSkpIHsKCQkJbShiYXNlbmFtZSgkY3VyZmlsZSkuJyBkb2VzIG5vdCBleGlzdCcpOwoJCX0gZWxzZSB7CgkJCSR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsKCQkJbSgnTW9kaWZ5IGZpbGUgdGhlIGxhc3QgbW9kaWZpZWQgJy4oQHRvdWNoKCRjdXJmaWxlLCR0aW1lLCR0aW1lKSA/ICdzdWNjZXNzJyA6ICdmYWlsZWQnKSk7CgkJfQoJfQoKCS8vIERvd25sb2FkCgllbHNlaWYoJGRvaW5nID09ICdkb3ducmFyJykgewoJCWlmICgkZGwpIHsKCQkJJGRmaWxlcz0nJzsKCQkJZm9yZWFjaCAoJGRsIGFzICRmaWxlcGF0aCA9PiAkdmFsdWUpIHsKCQkJCSRkZmlsZXMuPSRmaWxlcGF0aC4nLCc7CgkJCX0KCQkJJGRmaWxlcz1zdWJzdHIoJGRmaWxlcywwLHN0cmxlbigkZGZpbGVzKS0xKTsKCQkJJGRsPWV4cGxvZGUoJywnLCRkZmlsZXMpOwoJCQkkemlwPW5ldyBQSFBaaXAoJGRsKTsKCQkJJGNvZGU9JHppcC0+b3V0OwoJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk7CgkJCWhlYWRlcignQWNjZXB0LVJhbmdlczogYnl0ZXMnKTsKCQkJaGVhZGVyKCdBY2NlcHQtTGVuZ3RoOiAnLnN0cmxlbigkY29kZSkpOwoJCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7ZmlsZW5hbWU9Jy4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uJ19GaWxlcy50YXIuZ3onKTsKCQkJZWNobyAkY29kZTsKCQkJZXhpdDsKCQl9IGVsc2UgewoJCQltKCdQbGVhc2Ugc2VsZWN0IGZpbGUocyknKTsKCQl9Cgl9CgoJLy8gRGVsZXRlIGZpbGUKCWVsc2VpZigkZG9pbmcgPT0gJ2RlbGZpbGVzJykgewoJCWlmICgkZGwpIHsKCQkJJGRmaWxlcz0nJzsKCQkJJHN1Y2MgPSAkZmFpbCA9IDA7CgkJCWZvcmVhY2ggKCRkbCBhcyAkZmlsZXBhdGggPT4gJHZhbHVlKSB7CgkJCQlpZiAoQHVubGluaygkZmlsZXBhdGgpKSB7CgkJCQkJJHN1Y2MrKzsKCQkJCX0gZWxzZSB7CgkJCQkJJGZhaWwrKzsKCQkJCX0KCQkJfQoJCQltKCdEZWxldGVkIGZpbGUgaGF2ZSBmaW5pc2hlZGNob29zZSAnLmNvdW50KCRkbCkuJyBzdWNjZXNzICcuJHN1Y2MuJyBmYWlsICcuJGZhaWwpOwoJCX0gZWxzZSB7CgkJCW0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOwoJCX0KCX0KCgkvLyBGdW5jdGlvbiBOZXdkaXIKCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2NyZWF0ZWRpcicpKTsKCW1ha2VoaWRlKCduZXdkaXJuYW1lJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7Cglmb3JtZm9vdCgpOwoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZXBlcm0nKSk7CgltYWtlaGlkZSgnbmV3cGVybScpOwoJbWFrZWhpZGUoJ3BmaWxlJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7Cglmb3JtZm9vdCgpOwoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nY29weWZpbGUnKSk7CgltYWtlaGlkZSgnc25hbWUnKTsKCW1ha2VoaWRlKCd0b2ZpbGUnKTsKCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsKCWZvcm1mb290KCk7Cglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidyZW5hbWUnKSk7CgltYWtlaGlkZSgnb2xkbmFtZScpOwoJbWFrZWhpZGUoJ25ld2ZpbGVuYW1lJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7Cglmb3JtZm9vdCgpOwoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZW9wZm9ybScpKTsKCW1ha2VoaWRlKCdhY3Rpb24nKTsKCW1ha2VoaWRlKCdvcGZpbGUnKTsKCW1ha2VoaWRlKCdkaXInKTsKCWZvcm1mb290KCk7CgoJJGZyZWUgPSBAZGlza19mcmVlX3NwYWNlKCRub3dwYXRoKTsKCSEkZnJlZSAmJiAkZnJlZSA9IDA7CgkkYWxsID0gQGRpc2tfdG90YWxfc3BhY2UoJG5vd3BhdGgpOwoJISRhbGwgJiYgJGFsbCA9IDA7CgkkdXNlZCA9ICRhbGwtJGZyZWU7CgkkdXNlZF9wZXJjZW50ID0gQHJvdW5kKDEwMC8oJGFsbC8kZnJlZSksMik7CglwKCc8Zm9udCBjb2xvcj15ZWxsb3cgZmFjZT10YWhvbWEgc2l6ZT0yPjxCPkZpbGUgTWFuYWdlcjwvYj4gPC9mb250PiBDdXJyZW50IGRpc2sgZnJlZSA8Zm9udCBjb2xvcj1yZWQ+Jy5zaXplY291bnQoJGZyZWUpLic8L2ZvbnQ+IG9mIDxmb250IGNvbG9yPXJlZD4nLnNpemVjb3VudCgkYWxsKS4nPC9mb250PiAoPGZvbnQgY29sb3I9cmVkPicuJHVzZWRfcGVyY2VudC4nPC9mb250PiUpPC9mb250PicpOwoKPz4KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9Im1hcmdpbjoxMHB4IDA7Ij4KICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBpZD0iZ29kaXIiIG5hbWU9ImdvZGlyIj4KICA8dHI+CiAgICA8dGQgbm93cmFwPkN1cnJlbnQgRGlyZWN0b3J5ICg8P3BocCBlY2hvICRkaXJfd3JpdGVhYmxlOz8+LCA8P3BocCBlY2hvIGdldENobW9kKCRub3dwYXRoKTs/Pik8L3RkPgoJPHRkIHdpZHRoPSIxMDAlIj48aW5wdXQgbmFtZT0idmlld193cml0YWJsZSIgdmFsdWU9IjAiIHR5cGU9ImhpZGRlbiIgLz48aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJkaXIiIHZhbHVlPSI8P3BocCBlY2hvICRub3dwYXRoOz8+IiB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6MTAwJTttYXJnaW46MCA4cHg7Ij48L3RkPgogICAgPHRkIG5vd3JhcD48aW5wdXQgY2xhc3M9ImJ0IiB2YWx1ZT0iR08iIHR5cGU9InN1Ym1pdCI+PC90ZD4KICA8L3RyPgogIDwvZm9ybT4KPC90YWJsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpmdW5jdGlvbiBjcmVhdGVkaXIoKXsKCXZhciBuZXdkaXJuYW1lOwoJbmV3ZGlybmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBkaXJlY3RvcnkgbmFtZTonLCAnJyk7CglpZiAoIW5ld2Rpcm5hbWUpIHJldHVybjsKCSQoJ2NyZWF0ZWRpcicpLm5ld2Rpcm5hbWUudmFsdWU9bmV3ZGlybmFtZTsKCSQoJ2NyZWF0ZWRpcicpLnN1Ym1pdCgpOwp9CmZ1bmN0aW9uIGZpbGVwZXJtKHBmaWxlKXsKCXZhciBuZXdwZXJtOwoJbmV3cGVybSA9IHByb21wdCgnQ3VycmVudCBmaWxlOicrcGZpbGUrJ1xuUGxlYXNlIGlucHV0IG5ldyBhdHRyaWJ1dGU6JywgJycpOwoJaWYgKCFuZXdwZXJtKSByZXR1cm47CgkkKCdmaWxlcGVybScpLm5ld3Blcm0udmFsdWU9bmV3cGVybTsKCSQoJ2ZpbGVwZXJtJykucGZpbGUudmFsdWU9cGZpbGU7CgkkKCdmaWxlcGVybScpLnN1Ym1pdCgpOwp9CmZ1bmN0aW9uIGNvcHlmaWxlKHNuYW1lKXsKCXZhciB0b2ZpbGU7Cgl0b2ZpbGUgPSBwcm9tcHQoJ09yaWdpbmFsIGZpbGU6JytzbmFtZSsnXG5QbGVhc2UgaW5wdXQgb2JqZWN0IGZpbGUgKGZ1bGxwYXRoKTonLCAnJyk7CglpZiAoIXRvZmlsZSkgcmV0dXJuOwoJJCgnY29weWZpbGUnKS50b2ZpbGUudmFsdWU9dG9maWxlOwoJJCgnY29weWZpbGUnKS5zbmFtZS52YWx1ZT1zbmFtZTsKCSQoJ2NvcHlmaWxlJykuc3VibWl0KCk7Cn0KZnVuY3Rpb24gcmVuYW1lKG9sZG5hbWUpewoJdmFyIG5ld2ZpbGVuYW1lOwoJbmV3ZmlsZW5hbWUgPSBwcm9tcHQoJ0Zvcm1lciBmaWxlIG5hbWU6JytvbGRuYW1lKydcblBsZWFzZSBpbnB1dCBuZXcgZmlsZW5hbWU6JywgJycpOwoJaWYgKCFuZXdmaWxlbmFtZSkgcmV0dXJuOwoJJCgncmVuYW1lJykubmV3ZmlsZW5hbWUudmFsdWU9bmV3ZmlsZW5hbWU7CgkkKCdyZW5hbWUnKS5vbGRuYW1lLnZhbHVlPW9sZG5hbWU7CgkkKCdyZW5hbWUnKS5zdWJtaXQoKTsKfQpmdW5jdGlvbiBkb2ZpbGUoZG9pbmcsdGhlZmlsZSxtKXsKCWlmIChtICYmICFjb25maXJtKG0pKSB7CgkJcmV0dXJuOwoJfQoJJCgnZmlsZWxpc3QnKS5kb2luZy52YWx1ZT1kb2luZzsKCWlmICh0aGVmaWxlKXsKCQkkKCdmaWxlbGlzdCcpLnRoZWZpbGUudmFsdWU9dGhlZmlsZTsKCX0KCSQoJ2ZpbGVsaXN0Jykuc3VibWl0KCk7Cn0KZnVuY3Rpb24gY3JlYXRlZmlsZShub3dwYXRoKXsKCXZhciBmaWxlbmFtZTsKCWZpbGVuYW1lID0gcHJvbXB0KCdQbGVhc2UgaW5wdXQgdGhlIGZpbGUgbmFtZTonLCAnJyk7CglpZiAoIWZpbGVuYW1lKSByZXR1cm47CglvcGZpbGUoJ2VkaXRmaWxlJyxub3dwYXRoICsgZmlsZW5hbWUsbm93cGF0aCk7Cn0KZnVuY3Rpb24gb3BmaWxlKGFjdGlvbixvcGZpbGUsZGlyKXsKCSQoJ2ZpbGVvcGZvcm0nKS5hY3Rpb24udmFsdWU9YWN0aW9uOwoJJCgnZmlsZW9wZm9ybScpLm9wZmlsZS52YWx1ZT1vcGZpbGU7CgkkKCdmaWxlb3Bmb3JtJykuZGlyLnZhbHVlPWRpcjsKCSQoJ2ZpbGVvcGZvcm0nKS5zdWJtaXQoKTsKfQpmdW5jdGlvbiBnb2RpcihkaXIsdmlld193cml0YWJsZSl7CglpZiAodmlld193cml0YWJsZSkgewoJCSQoJ2dvZGlyJykudmlld193cml0YWJsZS52YWx1ZT0xOwoJfQoJJCgnZ29kaXInKS5kaXIudmFsdWU9ZGlyOwoJJCgnZ29kaXInKS5zdWJtaXQoKTsKfQo8L3NjcmlwdD4KICA8P3BocAoJdGJoZWFkKCk7CglwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj48dHIgY2xhc3M9ImFsdDEiPjx0ZCBjb2xzcGFuPSI3IiBzdHlsZT0icGFkZGluZzo1cHg7Ij4nKTsKCXAoJzxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdmFsdWU9IiIgdHlwZT0iZmlsZSIgLz4gPGlucHV0IGNsYXNzPSIiIG5hbWU9ImRvdXBmaWxlIiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiIC8+PGlucHV0IG5hbWU9InVwbG9hZGRpciIgdmFsdWU9IicuJGRpci4nIiB0eXBlPSJoaWRkZW4iIC8+PGlucHV0IG5hbWU9ImRpciIgdmFsdWU9IicuJGRpci4nIiB0eXBlPSJoaWRkZW4iIC8+PC9kaXY+Jyk7CglwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLidcJyk7Ij5XZWJSb290PC9hPicpOwoJaWYgKCR2aWV3X3dyaXRhYmxlKSB7CgkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnKTsiPlZpZXcgQWxsPC9hPicpOwoJfSBlbHNlIHsKCQlwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kbm93cGF0aC4nXCcsXCcxXCcpOyI+VmlldyBXcml0YWJsZTwvYT4nKTsKCX0KCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZGlyKCk7Ij5DcmVhdGUgRGlyZWN0b3J5PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZmlsZShcJycuJG5vd3BhdGguJ1wnKTsiPkNyZWF0ZSBGaWxlPC9hPicpOwoJaWYgKElTX1dJTiAmJiBJU19DT00pIHsKCQkkb2JqID0gbmV3IENPTSgnc2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QnKTsKCQlpZiAoJG9iaiAmJiBpc19vYmplY3QoJG9iaikpIHsKCQkJJERyaXZlVHlwZURCID0gYXJyYXkoMCA9PiAnVW5rbm93JywxID0+ICdSZW1vdmFibGUnLDIgPT4gJ0ZpeGVkJywzID0+ICdOZXR3b3JrJyw0ID0+ICdDRFJvbScsNSA9PiAnUkFNIERpc2snKTsKCQkJZm9yZWFjaCgkb2JqLT5Ecml2ZXMgYXMgJGRyaXZlKSB7CgkJCQlpZiAoJGRyaXZlLT5Ecml2ZVR5cGUgPT0gMikgewoJCQkJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkcml2ZS0+UGF0aC4nL1wnKTsiIHRpdGxlPSJTaXplOicuc2l6ZWNvdW50KCRkcml2ZS0+VG90YWxTaXplKS4nJiMxMztGcmVlOicuc2l6ZWNvdW50KCRkcml2ZS0+RnJlZVNwYWNlKS4nJiMxMztUeXBlOicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nIj4nLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJygnLiRkcml2ZS0+UGF0aC4nKTwvYT4nKTsKCQkJCX0gZWxzZSB7CgkJCQkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJGRyaXZlLT5QYXRoLicvXCcpOyIgdGl0bGU9IlR5cGU6Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLiciPicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nKCcuJGRyaXZlLT5QYXRoLicpPC9hPicpOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXAoJzwvdGQ+PC90cj48L2Zvcm0+Jyk7CgoJcCgnPHRyIGNsYXNzPSJoZWFkIj48dGQ+Jm5ic3A7PC90ZD48dGQ+RmlsZW5hbWU8L3RkPjx0ZCB3aWR0aD0iMTYlIj5MYXN0IG1vZGlmaWVkPC90ZD48dGQgd2lkdGg9IjEwJSI+U2l6ZTwvdGQ+PHRkIHdpZHRoPSIyMCUiPkNobW9kIC8gUGVybXM8L3RkPjx0ZCB3aWR0aD0iMjIlIj5BY3Rpb248L3RkPjwvdHI+Jyk7CgoJLy8gR2V0IHBhdGgKCSRkaXJkYXRhPWFycmF5KCk7CgkkZmlsZWRhdGE9YXJyYXkoKTsKCglpZiAoJHZpZXdfd3JpdGFibGUpIHsKCQkkZGlyZGF0YSA9IEdldExpc3QoJG5vd3BhdGgpOwoJfSBlbHNlIHsKCQkvLyBPcGVuIGRpcgoJCSRkaXJzPUBvcGVuZGlyKCRkaXIpOwoJCXdoaWxlICgkZmlsZT1AcmVhZGRpcigkZGlycykpIHsKCQkJJGZpbGVwYXRoPSRub3dwYXRoLiRmaWxlOwoJCQlpZihAaXNfZGlyKCRmaWxlcGF0aCkpewoJCQkJJGRpcmRiWydmaWxlbmFtZSddPSRmaWxlOwoJCQkJJGRpcmRiWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmaWxlcGF0aCkpOwoJCQkJJGRpcmRiWydkaXJjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7CgkJCQkkZGlyZGJbJ2RpcnBlcm0nXT1nZXRQZXJtcygkZmlsZXBhdGgpOwoJCQkJJGRpcmRiWydmaWxlb3duZXInXT1nZXRVc2VyKCRmaWxlcGF0aCk7CgkJCQkkZGlyZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsKCQkJCSRkaXJkYlsnc2VydmVyX2xpbmsnXT0kZmlsZXBhdGg7CgkJCQkkZGlyZGJbJ2NsaWVudF9saW5rJ109dWUoJGZpbGVwYXRoKTsKCQkJCSRkaXJkYXRhW109JGRpcmRiOwoJCQl9IGVsc2UgewkJCgkJCQkkZmlsZWRiWydmaWxlbmFtZSddPSRmaWxlOwoJCQkJJGZpbGVkYlsnc2l6ZSddPXNpemVjb3VudChAZmlsZXNpemUoJGZpbGVwYXRoKSk7CgkJCQkkZmlsZWRiWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmaWxlcGF0aCkpOwoJCQkJJGZpbGVkYlsnZmlsZWNobW9kJ109Z2V0Q2htb2QoJGZpbGVwYXRoKTsKCQkJCSRmaWxlZGJbJ2ZpbGVwZXJtJ109Z2V0UGVybXMoJGZpbGVwYXRoKTsKCQkJCSRmaWxlZGJbJ2ZpbGVvd25lciddPWdldFVzZXIoJGZpbGVwYXRoKTsKCQkJCSRmaWxlZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsKCQkJCSRmaWxlZGJbJ3NlcnZlcl9saW5rJ109JGZpbGVwYXRoOwoJCQkJJGZpbGVkYlsnY2xpZW50X2xpbmsnXT11ZSgkZmlsZXBhdGgpOwoJCQkJJGZpbGVkYXRhW109JGZpbGVkYjsKCQkJfQoJCX0vLyB3aGlsZQoJCXVuc2V0KCRkaXJkYik7CgkJdW5zZXQoJGZpbGVkYik7CgkJQGNsb3NlZGlyKCRkaXJzKTsKCX0KCUBzb3J0KCRkaXJkYXRhKTsKCUBzb3J0KCRmaWxlZGF0YSk7CgkkZGlyX2kgPSAnMCc7Cglmb3JlYWNoKCRkaXJkYXRhIGFzICRrZXkgPT4gJGRpcmRiKXsKCQlpZigkZGlyZGJbJ2ZpbGVuYW1lJ10hPScuLicgJiYgJGRpcmRiWydmaWxlbmFtZSddIT0nLicpIHsKCQkJJHRoaXNiZyA9IGJnKCk7CgkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7CgkJCXAoJzx0ZCB3aWR0aD0iMiUiIG5vd3JhcD48Zm9udCBmYWNlPSJ3aW5nZGluZ3MiIHNpemU9IjMiPjA8L2ZvbnQ+PC90ZD4nKTsKCQkJcCgnPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2ZpbGVuYW1lJ10uJzwvYT48L3RkPicpOwoJCQlwKCc8dGQgbm93cmFwPicuJGRpcmRiWydtdGltZSddLic8L3RkPicpOwoJCQlwKCc8dGQgbm93cmFwPi0tPC90ZD4nKTsKCQkJcCgnPHRkIG5vd3JhcD4nKTsKCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZGlyY2htb2QnXS4nPC9hPiAvICcpOwoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydkaXJwZXJtJ10uJzwvYT4nLiRkaXJkYlsnZmlsZW93bmVyJ10uJzwvdGQ+Jyk7CgkJCXAoJzx0ZCBub3dyYXA+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkZWxkaXJcJyxcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyxcJ0FyZSB5b3Ugc3VyZSB3aWxsIGRlbGV0ZSAnLiRkaXJkYlsnZmlsZW5hbWUnXS4nPyBcXG5cXG5JZiBub24tZW1wdHkgZGlyZWN0b3J5LCB3aWxsIGJlIGRlbGV0ZSBhbGwgdGhlIGZpbGVzLlwnKSI+RGVsPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVuYW1lKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPlJlbmFtZTwvYT48L3RkPicpOwoJCQlwKCc8L3RyPicpOwoJCQkkZGlyX2krKzsKCQl9IGVsc2UgewoJCQlpZigkZGlyZGJbJ2ZpbGVuYW1lJ109PScuLicpIHsKCQkJCXAoJzx0ciBjbGFzcz1mb3V0PicpOwoJCQkJcCgnPHRkIGFsaWduPSJjZW50ZXIiPjxmb250IGZhY2U9IldpbmdkaW5ncyAzIiBzaXplPTQ+PTwvZm9udD48L3RkPjx0ZCBub3dyYXAgY29sc3Bhbj0iNSI+PGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuZ2V0VXBQYXRoKCRub3dwYXRoKS4nXCcpOyI+UGFyZW50IERpcmVjdG9yeTwvYT48L3RkPicpOwoJCQkJcCgnPC90cj4nKTsKCQkJfQoJCX0KCX0KCglwKCc8dHIgYmdjb2xvcj0iZ3JlZW4iIHN0bHllPSJib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7Ij48dGQgY29sc3Bhbj0iNiIgaGVpZ2h0PSI1Ij48L3RkPjwvdHI+Jyk7CglwKCc8Zm9ybSBpZD0iZmlsZWxpc3QiIG5hbWU9ImZpbGVsaXN0IiBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJwb3N0Ij4nKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7CgltYWtlaGlkZSgndGhlZmlsZScpOwoJbWFrZWhpZGUoJ2RvaW5nJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7CgkkZmlsZV9pID0gJzAnOwoJZm9yZWFjaCgkZmlsZWRhdGEgYXMgJGtleSA9PiAkZmlsZWRiKXsKCQlpZigkZmlsZWRiWydmaWxlbmFtZSddIT0nLi4nICYmICRmaWxlZGJbJ2ZpbGVuYW1lJ10hPScuJykgewoJCQkkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJGZpbGVkYlsnc2VydmVyX2xpbmsnXSk7CgkJCSR0aGlzYmcgPSBiZygpOwoJCQlwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOwoJCQlwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0iZGxbJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLiddIj48L3RkPicpOwoJCQlwKCc8dGQ+PGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kZmlsZWRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsKCQkJcCgnPHRkIG5vd3JhcD4nLiRmaWxlZGJbJ210aW1lJ10uJzwvdGQ+Jyk7CgkJCXAoJzx0ZCBub3dyYXA+Jy4kZmlsZWRiWydzaXplJ10uJzwvdGQ+Jyk7CgkJCXAoJzx0ZCBub3dyYXA+Jyk7CgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGZpbGVkYlsnZmlsZWNobW9kJ10uJzwvYT4gLyAnKTsKCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZmlsZWRiWydmaWxlcGVybSddLic8L2E+Jy4kZmlsZWRiWydmaWxlb3duZXInXS4nPC90ZD4nKTsKCQkJcCgnPHRkIG5vd3JhcD4nKTsKCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3duZmlsZVwnLFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5Eb3duPC9hPiB8ICcpOwoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmNvcHlmaWxlKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5Db3B5PC9hPiB8ICcpOwoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ2VkaXRmaWxlXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnJy4kZmlsZWRiWydkaXJsaW5rJ10uJ1wnKTsiPkVkaXQ8L2E+IHwgJyk7CgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6cmVuYW1lKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5SZW5hbWU8L2E+IHwgJyk7CgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6b3BmaWxlKFwnbmV3dGltZVwnLFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyxcJycuJGZpbGVkYlsnZGlybGluayddLidcJyk7Ij5UaW1lPC9hPicpOwoJCQlwKCc8L3RkPjwvdHI+Jyk7CgkJCSRmaWxlX2krKzsKCQl9Cgl9CglwKCc8dHIgY2xhc3M9ImZvdXQxIj48dGQgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2Rvd25yYXJcJyk7Ij5QYWNraW5nIGRvd25sb2FkIHNlbGVjdGVkPC9hPiAtIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZGVsZmlsZXNcJyk7Ij5EZWxldGUgc2VsZWN0ZWQ8L2E+PC90ZD48dGQgY29sc3Bhbj0iNCIgYWxpZ249InJpZ2h0Ij4nLiRkaXJfaS4nIGRpcmVjdG9yaWVzIC8gJy4kZmlsZV9pLicgZmlsZXM8L3RkPjwvdHI+Jyk7CglwKCc8L2Zvcm0+PC90YWJsZT4nKTsKfS8vIGVuZCBkaXIKCmVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsZmlsZScpIHsKCWlmKCRkb2luZz09Im15c3FsdXBsb2FkIil7CgkJJGZpbGUgPSAkX0ZJTEVTWyd1cGxvYWRmaWxlJ107CgkJJGZpbGVuYW1lID0gJGZpbGVbJ3RtcF9uYW1lJ107CgkJaWYgKGZpbGVfZXhpc3RzKCRzYXZlcGF0aCkpIHsKCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkJyk7CgkJfSBlbHNlIHsKCQkJaWYoISRmaWxlbmFtZSkgewoJCQkJbSgnUGxlYXNlIGNob29zZSBhIGZpbGUnKTsKCQkJfSBlbHNlIHsKCQkJCSRmcD1AZm9wZW4oJGZpbGVuYW1lLCdyJyk7CgkJCQkkY29udGVudHM9QGZyZWFkKCRmcCwgZmlsZXNpemUoJGZpbGVuYW1lKSk7CgkJCQlAZmNsb3NlKCRmcCk7CgkJCQkkY29udGVudHMgPSBiaW4yaGV4KCRjb250ZW50cyk7CgkJCQlpZighJHVwbmFtZSkgJHVwbmFtZSA9ICRmaWxlWyduYW1lJ107CgkJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsKCQkJCSRyZXN1bHQgPSBxKCJTRUxFQ1QgMHh7JGNvbnRlbnRzfSBGUk9NIG15c3FsLnVzZXIgSU5UTyBEVU1QRklMRSAnJHNhdmVwYXRoJzsiKTsKCQkJCW0oJHJlc3VsdCA/ICdVcGxvYWQgc3VjY2VzcycgOiAnVXBsb2FkIGhhcyBmYWlsZWQ6ICcubXlzcWxfZXJyb3IoKSk7CgkJCX0KCQl9Cgl9Cj8+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZnVuY3Rpb24gbXlzcWxmaWxlKGRvaW5nKXsKCWlmKCFkb2luZykgcmV0dXJuOwoJJCgnZG9pbmcnKS52YWx1ZT1kb2luZzsKCSQoJ215c3FsZmlsZScpLmRiaG9zdC52YWx1ZT0kKCdkYmluZm8nKS5kYmhvc3QudmFsdWU7CgkkKCdteXNxbGZpbGUnKS5kYnBvcnQudmFsdWU9JCgnZGJpbmZvJykuZGJwb3J0LnZhbHVlOwoJJCgnbXlzcWxmaWxlJykuZGJ1c2VyLnZhbHVlPSQoJ2RiaW5mbycpLmRidXNlci52YWx1ZTsKCSQoJ215c3FsZmlsZScpLmRicGFzcy52YWx1ZT0kKCdkYmluZm8nKS5kYnBhc3MudmFsdWU7CgkkKCdteXNxbGZpbGUnKS5kYm5hbWUudmFsdWU9JCgnZGJpbmZvJykuZGJuYW1lLnZhbHVlOwoJJCgnbXlzcWxmaWxlJykuY2hhcnNldC52YWx1ZT0kKCdkYmluZm8nKS5jaGFyc2V0LnZhbHVlOwoJJCgnbXlzcWxmaWxlJykuc3VibWl0KCk7Cn0KPC9zY3JpcHQ+Cjw/cGhwCgkhJGRiaG9zdCAmJiAkZGJob3N0ID0gJ2xvY2FsaG9zdCc7CgkhJGRidXNlciAmJiAkZGJ1c2VyID0gJ3Jvb3QnOwoJISRkYnBvcnQgJiYgJGRicG9ydCA9ICczMzA2JzsKCSRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOwoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J01ZU1FMIEluZm9ybWF0aW9uJywnbmFtZSc9PidkYmluZm8nKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnc3FsZmlsZScpOwoJcCgnPHA+Jyk7CglwKCdEQkhvc3Q6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJob3N0Jywnc2l6ZSc9PjIwLCd2YWx1ZSc9PiRkYmhvc3QpKTsKCXAoJzonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBvcnQnLCdzaXplJz0+NCwndmFsdWUnPT4kZGJwb3J0KSk7CglwKCdEQlVzZXI6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsKCXAoJ0RCUGFzczonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBhc3MnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRicGFzcykpOwoJcCgnREJOYW1lOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RibmFtZScsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJuYW1lKSk7CglwKCdEQkNoYXJzZXQ6Jyk7CgltYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J2NoYXJzZXQnLCdvcHRpb24nPT4kY2hhcnNldHMsJ3NlbGVjdGVkJz0+JGNoYXJzZXQpKTsKCXAoJzwvcD4nKTsKCWZvcm1mb290KCk7CglwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJteXNxbGZpbGUiIGlkPSJteXNxbGZpbGUiPicpOwoJcCgnPGgyPlVwbG9hZCBmaWxlPC9oMj4nKTsKCXAoJzxwPjxiPlRoaXMgb3BlcmF0aW9uIHRoZSBEQiB1c2VyIG11c3QgaGFzIEZJTEUgcHJpdmlsZWdlPC9iPjwvcD4nKTsKCXAoJzxwPlNhdmUgcGF0aChmdWxscGF0aCk6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InNhdmVwYXRoIiBzaXplPSI0NSIgdHlwZT0idGV4dCIgLz4gQ2hvb3NlIGEgZmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdHlwZT0iZmlsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbHVwbG9hZFwnKTsiPlVwbG9hZDwvYT48L3A+Jyk7CglwKCc8aDI+RG93bmxvYWQgZmlsZTwvaDI+Jyk7CglwKCc8cD5GaWxlOiA8aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJteXNxbGRsZmlsZSIgc2l6ZT0iMTE1IiB0eXBlPSJ0ZXh0IiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om15c3FsZmlsZShcJ215c3FsZG93blwnKTsiPkRvd25sb2FkPC9hPjwvcD4nKTsKCW1ha2VoaWRlKCdkYmhvc3QnKTsKCW1ha2VoaWRlKCdkYnBvcnQnKTsKCW1ha2VoaWRlKCdkYnVzZXInKTsKCW1ha2VoaWRlKCdkYnBhc3MnKTsKCW1ha2VoaWRlKCdkYm5hbWUnKTsKCW1ha2VoaWRlKCdjaGFyc2V0Jyk7CgltYWtlaGlkZSgnZG9pbmcnKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxmaWxlJyk7CglwKCc8L2Zvcm0+Jyk7Cn0KCmVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsYWRtaW4nKSB7CgkhJGRiaG9zdCAmJiAkZGJob3N0ID0gJ2xvY2FsaG9zdCc7CgkhJGRidXNlciAmJiAkZGJ1c2VyID0gJ3Jvb3QnOwoJISRkYnBvcnQgJiYgJGRicG9ydCA9ICczMzA2JzsKCSRkYmZvcm0gPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImNvbm5lY3QiIG5hbWU9ImNvbm5lY3QiIHZhbHVlPSIxIiAvPic7CglpZihpc3NldCgkZGJob3N0KSl7CgkJJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRiaG9zdFwiIG5hbWU9XCJkYmhvc3RcIiB2YWx1ZT1cIiRkYmhvc3RcIiAvPlxuIjsKCX0KCWlmKGlzc2V0KCRkYnVzZXIpKSB7CgkJJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRidXNlclwiIG5hbWU9XCJkYnVzZXJcIiB2YWx1ZT1cIiRkYnVzZXJcIiAvPlxuIjsKCX0KCWlmKGlzc2V0KCRkYnBhc3MpKSB7CgkJJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRicGFzc1wiIG5hbWU9XCJkYnBhc3NcIiB2YWx1ZT1cIiRkYnBhc3NcIiAvPlxuIjsKCX0KCWlmKGlzc2V0KCRkYnBvcnQpKSB7CgkJJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRicG9ydFwiIG5hbWU9XCJkYnBvcnRcIiB2YWx1ZT1cIiRkYnBvcnRcIiAvPlxuIjsKCX0KCWlmKGlzc2V0KCRkYm5hbWUpKSB7CgkJJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRibmFtZVwiIG5hbWU9XCJkYm5hbWVcIiB2YWx1ZT1cIiRkYm5hbWVcIiAvPlxuIjsKCX0KCWlmKGlzc2V0KCRjaGFyc2V0KSkgewoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJjaGFyc2V0XCIgbmFtZT1cImNoYXJzZXRcIiB2YWx1ZT1cIiRjaGFyc2V0XCIgLz5cbiI7Cgl9CgoJaWYgKCRkb2luZyA9PSAnYmFja3VwbXlzcWwnICYmICRzYXZlYXNmaWxlKSB7CgkJaWYgKCEkdGFibGUpIHsKCQkJbSgnUGxlYXNlIGNob29zZSB0aGUgdGFibGUnKTsKCQl9IGVsc2UgewoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsKCQkJJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOwoJCQkkZnAgPSBAZm9wZW4oJHBhdGgsJ3cnKTsKCQkJaWYgKCRmcCkgewoJCQkJJHJlc3VsdCA9IHEoJ1NIT1cgdGFibGVzJyk7CgkJCQlpZiAoISRyZXN1bHQpIHAoJzxoMj4nLm15c3FsX2Vycm9yKCkuJzwvaDI+Jyk7CgkJCQkkbXlzcWxkYXRhID0gJyc7CgkJCQl3aGlsZSAoJGN1cnJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7CgkJCQkJaWYgKGlzc2V0KCR0YWJsZVskY3Vycm93WzBdXSkpIHsKCQkJCQkJc3FsZHVtcHRhYmxlKCRjdXJyb3dbMF0sICRmcCk7CgkJCQkJfQoJCQkJfQoJCQkJZmNsb3NlKCRmcCk7CgkJCQkkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJHBhdGgpOwoJCQkJbSgnRGF0YWJhc2UgaGFzIHN1Y2Nlc3MgYmFja3VwIHRvIDxhIGhyZWY9IicuJGZpbGV1cmwuJyIgdGFyZ2V0PSJfYmxhbmsiPicuJHBhdGguJzwvYT4nKTsKCQkJCW15c3FsX2Nsb3NlKCk7CgkJCX0gZWxzZSB7CgkJCQltKCdCYWNrdXAgZmFpbGVkJyk7CgkJCX0KCQl9Cgl9CglpZiAoJGluc2VydCAmJiAkaW5zZXJ0c3FsKSB7CgkJJGtleXN0ciA9ICR2YWxzdHIgPSAkdG1wID0gJyc7CgkJZm9yZWFjaCgkaW5zZXJ0c3FsIGFzICRrZXkgPT4gJHZhbCkgewoJCQlpZiAoJHZhbCkgewoJCQkJJGtleXN0ciAuPSAkdG1wLiRrZXk7CgkJCQkkdmFsc3RyIC49ICR0bXAuIiciLmFkZHNsYXNoZXMoJHZhbCkuIiciOwoJCQkJJHRtcCA9ICcsJzsKCQkJfQoJCX0KCQlpZiAoJGtleXN0ciAmJiAkdmFsc3RyKSB7CgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOwoJCQltKHEoIklOU0VSVCBJTlRPICR0YWJsZW5hbWUgKCRrZXlzdHIpIFZBTFVFUyAoJHZhbHN0cikiKSA/ICdJbnNlcnQgbmV3IHJlY29yZCBvZiBzdWNjZXNzJyA6IG15c3FsX2Vycm9yKCkpOwoJCX0KCX0KCWlmICgkdXBkYXRlICYmICRpbnNlcnRzcWwgJiYgJGJhc2U2NCkgewoJCSR2YWxzdHIgPSAkdG1wID0gJyc7CgkJZm9yZWFjaCgkaW5zZXJ0c3FsIGFzICRrZXkgPT4gJHZhbCkgewoJCQkkdmFsc3RyIC49ICR0bXAuJGtleS4iPSciLmFkZHNsYXNoZXMoJHZhbCkuIiciOwoJCQkkdG1wID0gJywnOwoJCX0KCQlpZiAoJHZhbHN0cikgewoJCQkkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOwoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsKCQkJbShxKCJVUERBVEUgJHRhYmxlbmFtZSBTRVQgJHZhbHN0ciBXSEVSRSAkd2hlcmUgTElNSVQgMSIpID8gJ1JlY29yZCB1cGRhdGluZycgOiBteXNxbF9lcnJvcigpKTsKCQl9Cgl9CglpZiAoJGRvaW5nID09ICdkZWwnICYmICRiYXNlNjQpIHsKCQkkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOwoJCSRkZWxldGVfc3FsID0gIkRFTEVURSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIjsKCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsKCQltKHEoIkRFTEVURSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIikgPyAnRGVsZXRpb24gcmVjb3JkIG9mIHN1Y2Nlc3MnIDogbXlzcWxfZXJyb3IoKSk7Cgl9CgoJaWYgKCR0YWJsZW5hbWUgJiYgJGRvaW5nID09ICdkcm9wJykgewoJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOwoJCWlmIChxKCJEUk9QIFRBQkxFICR0YWJsZW5hbWUiKSkgewoJCQltKCdEcm9wIHRhYmxlIG9mIHN1Y2Nlc3MnKTsKCQkJJHRhYmxlbmFtZSA9ICcnOwoJCX0gZWxzZSB7CgkJCW0obXlzcWxfZXJyb3IoKSk7CgkJfQoJfQoKCSRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOwoKCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidNWVNRTCBNYW5hZ2VyJykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7CglwKCc8cD4nKTsKCXAoJ0RCSG9zdDonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOwoJcCgnOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicG9ydCcsJ3NpemUnPT40LCd2YWx1ZSc9PiRkYnBvcnQpKTsKCXAoJ0RCVXNlcjonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnVzZXInLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRidXNlcikpOwoJcCgnREJQYXNzOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7CglwKCdEQkNoYXJzZXQ6Jyk7CgltYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J2NoYXJzZXQnLCdvcHRpb24nPT4kY2hhcnNldHMsJ3NlbGVjdGVkJz0+JGNoYXJzZXQpKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidjb25uZWN0JywndmFsdWUnPT4nQ29ubmVjdCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7CglwKCc8L3A+Jyk7Cglmb3JtZm9vdCgpOwo/Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIGVkaXRyZWNvcmQoYWN0aW9uLCBiYXNlNjQsIHRhYmxlbmFtZSl7CglpZiAoYWN0aW9uID09ICdkZWwnKSB7CQkKCQlpZiAoIWNvbmZpcm0oJ0lzIG9yIGlzblwndCBkZWxldGlvbiByZWNvcmQ/JykpIHJldHVybjsKCX0KCSQoJ3JlY29yZGxpc3QnKS5kb2luZy52YWx1ZT1hY3Rpb247CgkkKCdyZWNvcmRsaXN0JykuYmFzZTY0LnZhbHVlPWJhc2U2NDsKCSQoJ3JlY29yZGxpc3QnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOwoJJCgncmVjb3JkbGlzdCcpLnN1Ym1pdCgpOwp9CmZ1bmN0aW9uIG1vZGRibmFtZShkYm5hbWUpIHsKCWlmKCFkYm5hbWUpIHJldHVybjsKCSQoJ3NldGRibmFtZScpLmRibmFtZS52YWx1ZT1kYm5hbWU7CgkkKCdzZXRkYm5hbWUnKS5zdWJtaXQoKTsKfQpmdW5jdGlvbiBzZXR0YWJsZSh0YWJsZW5hbWUsZG9pbmcscGFnZSkgewoJaWYoIXRhYmxlbmFtZSkgcmV0dXJuOwoJaWYgKGRvaW5nKSB7CgkJJCgnc2V0dGFibGUnKS5kb2luZy52YWx1ZT1kb2luZzsKCX0KCWlmIChwYWdlKSB7CgkJJCgnc2V0dGFibGUnKS5wYWdlLnZhbHVlPXBhZ2U7Cgl9CgkkKCdzZXR0YWJsZScpLnRhYmxlbmFtZS52YWx1ZT10YWJsZW5hbWU7CgkkKCdzZXR0YWJsZScpLnN1Ym1pdCgpOwp9Cjwvc2NyaXB0Pgo8P3BocAoJLy8gU1FMCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidyZWNvcmRsaXN0JykpOwoJbWFrZWhpZGUoJ2RvaW5nJyk7CgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsKCW1ha2VoaWRlKCdiYXNlNjQnKTsKCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsKCXAoJGRiZm9ybSk7Cglmb3JtZm9vdCgpOwoKCS8vIERhdGEKCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3NldGRibmFtZScpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOwoJcCgkZGJmb3JtKTsKCWlmICghJGRibmFtZSkgewoJCW1ha2VoaWRlKCdkYm5hbWUnKTsKCX0KCWZvcm1mb290KCk7CgoJCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXR0YWJsZScpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOwoJcCgkZGJmb3JtKTsKCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsKCW1ha2VoaWRlKCdwYWdlJywkcGFnZSk7CgltYWtlaGlkZSgnZG9pbmcnKTsKCWZvcm1mb290KCk7CgoJJGNhY2hldGFibGVzID0gYXJyYXkoKTsJCgkkcGFnZW51bSA9IDMwOwoJJHBhZ2UgPSBpbnR2YWwoJHBhZ2UpOwoJaWYoJHBhZ2UpIHsKCQkkc3RhcnRfbGltaXQgPSAoJHBhZ2UgLSAxKSAqICRwYWdlbnVtOwoJfSBlbHNlIHsKCQkkc3RhcnRfbGltaXQgPSAwOwoJCSRwYWdlID0gMTsKCX0KCWlmIChpc3NldCgkZGJob3N0KSAmJiBpc3NldCgkZGJ1c2VyKSAmJiBpc3NldCgkZGJwYXNzKSAmJiBpc3NldCgkY29ubmVjdCkpIHsKCQlkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOwoJCS8vIGdldCBteXNxbCBzZXJ2ZXIKCQkkbXlzcWx2ZXIgPSBteXNxbF9nZXRfc2VydmVyX2luZm8oKTsKCQlwKCc8cD5NeVNRTCAnLiRteXNxbHZlci4nIHJ1bm5pbmcgaW4gJy4kZGJob3N0LicgYXMgJy4kZGJ1c2VyLidAJy4kZGJob3N0Lic8L3A+Jyk7CgkJJGhpZ2h2ZXIgPSAkbXlzcWx2ZXIgPiAnNC4xJyA/IDEgOiAwOwoKCQkvLyBTaG93IGRhdGFiYXNlCgkJJHF1ZXJ5ID0gcSgiU0hPVyBEQVRBQkFTRVMiKTsKCQkkZGJzID0gYXJyYXkoKTsKCQkkZGJzW10gPSAnLS0gU2VsZWN0IGEgZGF0YWJhc2UgLS0nOwoJCXdoaWxlKCRkYiA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsKCQkJJGRic1skZGJbJ0RhdGFiYXNlJ11dID0gJGRiWydEYXRhYmFzZSddOwoJCX0KCQltYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidQbGVhc2Ugc2VsZWN0IGEgZGF0YWJhc2U6JywnbmFtZSc9PidkYltdJywnb3B0aW9uJz0+JGRicywnc2VsZWN0ZWQnPT4kZGJuYW1lLCdvbmNoYW5nZSc9Pidtb2RkYm5hbWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywnbmV3bGluZSc9PjEpKTsKCQkkdGFibGVkYiA9IGFycmF5KCk7CgkJaWYgKCRkYm5hbWUpIHsKCQkJcCgnPHA+Jyk7CgkJCXAoJ0N1cnJlbnQgZGFiYWJhc2U6IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9kZGJuYW1lKFwnJy4kZGJuYW1lLidcJyk7Ij4nLiRkYm5hbWUuJzwvYT4nKTsKCQkJaWYgKCR0YWJsZW5hbWUpIHsKCQkJCXAoJyB8IEN1cnJlbnQgVGFibGU6IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPicuJHRhYmxlbmFtZS4nPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF0nKTsKCQkJfQoJCQlwKCc8L3A+Jyk7CgkJCW15c3FsX3NlbGVjdF9kYigkZGJuYW1lKTsKCgkJCSRnZXRudW1zcWwgPSAnJzsKCQkJJHJ1bnF1ZXJ5ID0gMDsKCQkJaWYgKCRzcWxfcXVlcnkpIHsKCQkJCSRydW5xdWVyeSA9IDE7CgkJCX0KCQkJJGFsbG93ZWRpdCA9IDA7CgkJCWlmICgkdGFibGVuYW1lICYmICEkc3FsX3F1ZXJ5KSB7CgkJCQkkc3FsX3F1ZXJ5ID0gIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSI7CgkJCQkkZ2V0bnVtc3FsID0gJHNxbF9xdWVyeTsKCQkJCSRzcWxfcXVlcnkgPSAkc3FsX3F1ZXJ5LiIgTElNSVQgJHN0YXJ0X2xpbWl0LCAkcGFnZW51bSI7CgkJCQkkYWxsb3dlZGl0ID0gMTsKCQkJfQoJCQlwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsKCQkJcCgnPHA+PHRhYmxlIHdpZHRoPSIyMDAiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkIGNvbHNwYW49IjIiPlJ1biBTUUwgcXVlcnkvcXVlcmllcyBvbiBkYXRhYmFzZSA8Zm9udCBjb2xvcj1yZWQ+PGI+Jy4kZGJuYW1lLic8L2ZvbnQ+PC9iPjo8QlI+RXhhbXBsZSBWQkIgUGFzc3dvcmQ6IDxmb250IGNvbG9yPXJlZD50bXQ8L2ZvbnQ+PEJSPjxmb250IGNvbG9yPXllbGxvdz5VUERBVEUgYHVzZXJgIFNFVCBgcGFzc3dvcmRgID0gXCc2OWU1M2U1YWI5NTM2ZTU1ZDMxZmY1MzNhZWZjNGZiZVwnLCBzYWx0ID0gXCdwNVRcJyBXSEVSRSBgdXNlcmlkYCA9IFwnMVwnIDwvZm9udD4KCQkJPC90ZD48L3RyPjx0cj48dGQ+PHRleHRhcmVhIG5hbWU9InNxbF9xdWVyeSIgY2xhc3M9ImFyZWEiIHN0eWxlPSJ3aWR0aDo2MDBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzphdXRvOyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcXVlcnksRU5UX1FVT1RFUykuJzwvdGV4dGFyZWE+PC90ZD48dGQgc3R5bGU9InBhZGRpbmc6MCA1cHg7Ij48aW5wdXQgY2xhc3M9ImJ0IiBzdHlsZT0iaGVpZ2h0OjUwcHg7IiBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlF1ZXJ5IiAvPjwvdGQ+PC90cj48L3RhYmxlPjwvcD4nKTsKCQkJbWFrZWhpZGUoJ3RhYmxlbmFtZScsICR0YWJsZW5hbWUpOwoJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsKCQkJcCgkZGJmb3JtKTsKCQkJcCgnPC9mb3JtPicpOwoJCQlpZiAoJHRhYmxlbmFtZSB8fCAoJHJ1bnF1ZXJ5ICYmICRzcWxfcXVlcnkpKSB7CgkJCQlpZiAoJGRvaW5nID09ICdzdHJ1Y3R1cmUnKSB7CgkJCQkJJHJlc3VsdCA9IHEoIlNIT1cgQ09MVU1OUyBGUk9NICR0YWJsZW5hbWUiKTsKCQkJCQkkcm93ZGIgPSBhcnJheSgpOwoJCQkJCXdoaWxlKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgewoJCQkJCQkkcm93ZGJbXSA9ICRyb3c7CgkJCQkJfQoJCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7CgkJCQkJcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsKCQkJCQlwKCc8dGQ+RmllbGQ8L3RkPicpOwoJCQkJCXAoJzx0ZD5UeXBlPC90ZD4nKTsKCQkJCQlwKCc8dGQ+TnVsbDwvdGQ+Jyk7CgkJCQkJcCgnPHRkPktleTwvdGQ+Jyk7CgkJCQkJcCgnPHRkPkRlZmF1bHQ8L3RkPicpOwoJCQkJCXAoJzx0ZD5FeHRyYTwvdGQ+Jyk7CgkJCQkJcCgnPC90cj4nKTsKCQkJCQlmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgewoJCQkJCQkkdGhpc2JnID0gYmcoKTsKCQkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsKCQkJCQkJcCgnPHRkPicuJHJvd1snRmllbGQnXS4nPC90ZD4nKTsKCQkJCQkJcCgnPHRkPicuJHJvd1snVHlwZSddLic8L3RkPicpOwoJCQkJCQlwKCc8dGQ+Jy4kcm93WydOdWxsJ10uJyZuYnNwOzwvdGQ+Jyk7CgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0tleSddLicmbmJzcDs8L3RkPicpOwoJCQkJCQlwKCc8dGQ+Jy4kcm93WydEZWZhdWx0J10uJyZuYnNwOzwvdGQ+Jyk7CgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0V4dHJhJ10uJyZuYnNwOzwvdGQ+Jyk7CgkJCQkJCXAoJzwvdHI+Jyk7CgkJCQkJfQoJCQkJCXRiZm9vdCgpOwoJCQkJfSBlbHNlaWYgKCRkb2luZyA9PSAnaW5zZXJ0JyB8fCAkZG9pbmcgPT0gJ2VkaXQnKSB7CgkJCQkJJHJlc3VsdCA9IHEoJ1NIT1cgQ09MVU1OUyBGUk9NICcuJHRhYmxlbmFtZSk7CgkJCQkJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgewoJCQkJCQkkcm93ZGJbXSA9ICRyb3c7CgkJCQkJfQoJCQkJCSRycyA9IGFycmF5KCk7CgkJCQkJaWYgKCRkb2luZyA9PSAnaW5zZXJ0JykgewoJCQkJCQlwKCc8aDI+SW5zZXJ0IG5ldyBsaW5lIGluICcuJHRhYmxlbmFtZS4nIHRhYmxlICZyYXF1bzs8L2gyPicpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXAoJzxoMj5VcGRhdGUgcmVjb3JkIGluICcuJHRhYmxlbmFtZS4nIHRhYmxlICZyYXF1bzs8L2gyPicpOwoJCQkJCQkkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOwoJCQkJCQkkcmVzdWx0ID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSBMSU1JVCAxIik7CgkJCQkJCSRycyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOwoJCQkJCX0KCQkJCQlwKCc8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iJy4kc2VsZi4nIj4nKTsKCQkJCQlwKCRkYmZvcm0pOwoJCQkJCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOwoJCQkJCW1ha2VoaWRlKCd0YWJsZW5hbWUnLCR0YWJsZW5hbWUpOwoJCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7CgkJCQkJZm9yZWFjaCAoJHJvd2RiIGFzICRyb3cpIHsKCQkJCQkJaWYgKCRyc1skcm93WydGaWVsZCddXSkgewoJCQkJCQkJJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkcnNbJHJvd1snRmllbGQnXV0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHZhbHVlID0gJyc7CgkJCQkJCX0KCQkJCQkJJHRoaXNiZyA9IGJnKCk7CgkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7CgkJCQkJCXAoJzx0ZD48Yj4nLiRyb3dbJ0ZpZWxkJ10uJzwvYj48YnIgLz4nLiRyb3dbJ1R5cGUnXS4nPC90ZD48dGQ+PHRleHRhcmVhIGNsYXNzPSJhcmVhIiBuYW1lPSJpbnNlcnRzcWxbJy4kcm93WydGaWVsZCddLiddIiBzdHlsZT0id2lkdGg6NTAwcHg7aGVpZ2h0OjYwcHg7b3ZlcmZsb3c6YXV0bzsiPicuJHZhbHVlLic8L3RleHRhcmVhPjwvdGQ+PC90cj4nKTsKCQkJCQl9CgkJCQkJaWYgKCRkb2luZyA9PSAnaW5zZXJ0JykgewoJCQkJCQlwKCc8dHIgY2xhc3M9ImZvdXQiPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgY2xhc3M9ImJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9Imluc2VydCIgdmFsdWU9Ikluc2VydCIgLz48L3RkPjwvdHI+Jyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0Ij48dGQgY29sc3Bhbj0iMiI+PGlucHV0IGNsYXNzPSJidCIgdHlwZT0ic3VibWl0IiBuYW1lPSJ1cGRhdGUiIHZhbHVlPSJVcGRhdGUiIC8+PC90ZD48L3RyPicpOwoJCQkJCQltYWtlaGlkZSgnYmFzZTY0JywgJGJhc2U2NCk7CgkJCQkJfQoJCQkJCXAoJzwvdGFibGU+PC9mb3JtPicpOwoJCQkJfSBlbHNlIHsKCQkJCQkkcXVlcnlzID0gQGV4cGxvZGUoJzsnLCRzcWxfcXVlcnkpOwoJCQkJCWZvcmVhY2goJHF1ZXJ5cyBhcyAkbnVtPT4kcXVlcnkpIHsKCQkJCQkJaWYgKCRxdWVyeSkgewoJCQkJCQkJcCgiPHA+PGI+UXVlcnkjeyRudW19IDogIi5odG1sc3BlY2lhbGNoYXJzKCRxdWVyeSxFTlRfUVVPVEVTKS4iPC9iPjwvcD4iKTsKCQkJCQkJCXN3aXRjaChxeSgkcXVlcnkpKQoJCQkJCQkJewoJCQkJCQkJCWNhc2UgMDoKCQkJCQkJCQkJcCgnPGgyPkVycm9yIDogJy5teXNxbF9lcnJvcigpLic8L2gyPicpOwoJCQkJCQkJCQlicmVhazsJCgkJCQkJCQkJY2FzZSAxOgoJCQkJCQkJCQlpZiAoc3RydG9sb3dlcihzdWJzdHIoJHF1ZXJ5LDAsMTMpKSA9PSAnc2VsZWN0ICogZnJvbScpIHsKCQkJCQkJCQkJCSRhbGxvd2VkaXQgPSAxOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmICgkZ2V0bnVtc3FsKSB7CgkJCQkJCQkJCQkkdGF0b2wgPSBteXNxbF9udW1fcm93cyhxKCRnZXRudW1zcWwpKTsKCQkJCQkJCQkJCSRtdWx0aXBhZ2UgPSBtdWx0aSgkdGF0b2wsICRwYWdlbnVtLCAkcGFnZSwgJHRhYmxlbmFtZSk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYgKCEkdGFibGVuYW1lKSB7CgkJCQkJCQkJCQkkc3FsX2xpbmUgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iLCAiXHQiKSwgYXJyYXkoJyAnLCAnICcsICcgJyksIHRyaW0oaHRtbHNwZWNpYWxjaGFycygkcXVlcnkpKSk7CgkJCQkJCQkJCQkkc3FsX2xpbmUgPSBwcmVnX3JlcGxhY2UoIi9cL1wqW14oXCpcLyldKlwqXC8vaSIsICIgIiwgJHNxbF9saW5lKTsKCQkJCQkJCQkJCXByZWdfbWF0Y2hfYWxsKCIvZnJvbVxzK2B7MCwxfShbXHddKylgezAsMX1ccysvaSIsJHNxbF9saW5lLCRtYXRjaGVzKTsKCQkJCQkJCQkJCSR0YWJsZW5hbWUgPSAkbWF0Y2hlc1sxXVswXTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkkcmVzdWx0ID0gcSgkcXVlcnkpOwoJCQkJCQkJCQlwKCRtdWx0aXBhZ2UpOwoJCQkJCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOwoJCQkJCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOwoJCQkJCQkJCQlpZiAoJGFsbG93ZWRpdCkgcCgnPHRkPkFjdGlvbjwvdGQ+Jyk7CgkJCQkJCQkJCSRmaWVsZG51bSA9IEBteXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOwoJCQkJCQkJCQlmb3IoJGk9MDskaTwkZmllbGRudW07JGkrKyl7CgkJCQkJCQkJCQkkbmFtZSA9IEBteXNxbF9maWVsZF9uYW1lKCRyZXN1bHQsICRpKTsKCQkJCQkJCQkJCSR0eXBlID0gQG15c3FsX2ZpZWxkX3R5cGUoJHJlc3VsdCwgJGkpOwoJCQkJCQkJCQkJJGxlbiA9IEBteXNxbF9maWVsZF9sZW4oJHJlc3VsdCwgJGkpOwoJCQkJCQkJCQkJcCgiPHRkIG5vd3JhcD4kbmFtZTxicj48c3Bhbj4kdHlwZSgkbGVuKTwvc3Bhbj48L3RkPiIpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCXAoJzwvdHI+Jyk7CgkJCQkJCQkJCXdoaWxlKCRtbiA9IEBteXNxbF9mZXRjaF9hc3NvYygkcmVzdWx0KSl7CgkJCQkJCQkJCQkkdGhpc2JnID0gYmcoKTsKCQkJCQkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7CgkJCQkJCQkJCQkkd2hlcmUgPSAkdG1wID0gJGIxID0gJyc7CgkJCQkJCQkJCQlmb3JlYWNoKCRtbiBhcyAka2V5PT4kaW5zaWRlKXsKCQkJCQkJCQkJCQlpZiAoJGluc2lkZSkgewoJCQkJCQkJCQkJCQkkd2hlcmUgLj0gJHRtcC4ka2V5LiI9JyIuYWRkc2xhc2hlcygkaW5zaWRlKS4iJyI7CgkJCQkJCQkJCQkJCSR0bXAgPSAnIEFORCAnOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkkYjEgLj0gJzx0ZCBub3dyYXA+Jy5odG1sX2NsZWFuKCRpbnNpZGUpLicmbmJzcDs8L3RkPic7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQkkd2hlcmUgPSBiYXNlNjRfZW5jb2RlKCR3aGVyZSk7CgkJCQkJCQkJCQlpZiAoJGFsbG93ZWRpdCkgcCgnPHRkIG5vd3JhcD48YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdlZGl0XCcsIFwnJy4kd2hlcmUuJ1wnLCBcJycuJHRhYmxlbmFtZS4nXCcpOyI+RWRpdDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdkZWxcJywgXCcnLiR3aGVyZS4nXCcsIFwnJy4kdGFibGVuYW1lLidcJyk7Ij5EZWw8L2E+PC90ZD4nKTsKCQkJCQkJCQkJCXAoJGIxKTsKCQkJCQkJCQkJCXAoJzwvdHI+Jyk7CgkJCQkJCQkJCQl1bnNldCgkYjEpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCXRiZm9vdCgpOwoJCQkJCQkJCQlwKCRtdWx0aXBhZ2UpOwoJCQkJCQkJCQlicmVhazsJCgkJCQkJCQkJY2FzZSAyOgoJCQkJCQkJCQkkYXIgPSBteXNxbF9hZmZlY3RlZF9yb3dzKCk7CgkJCQkJCQkJCXAoJzxoMj5hZmZlY3RlZCByb3dzIDogPGI+Jy4kYXIuJzwvYj48L2gyPicpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSRxdWVyeSA9IHEoIlNIT1cgVEFCTEUgU1RBVFVTIik7CgkJCQkkdGFibGVfbnVtID0gJHRhYmxlX3Jvd3MgPSAkZGF0YV9zaXplID0gMDsKCQkJCSR0YWJsZWRiID0gYXJyYXkoKTsKCQkJCXdoaWxlKCR0YWJsZSA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsKCQkJCQkkZGF0YV9zaXplID0gJGRhdGFfc2l6ZSArICR0YWJsZVsnRGF0YV9sZW5ndGgnXTsKCQkJCQkkdGFibGVfcm93cyA9ICR0YWJsZV9yb3dzICsgJHRhYmxlWydSb3dzJ107CgkJCQkJJHRhYmxlWydEYXRhX2xlbmd0aCddID0gc2l6ZWNvdW50KCR0YWJsZVsnRGF0YV9sZW5ndGgnXSk7CgkJCQkJJHRhYmxlX251bSsrOwoJCQkJCSR0YWJsZWRiW10gPSAkdGFibGU7CgkJCQl9CgkJCQkkZGF0YV9zaXplID0gc2l6ZWNvdW50KCRkYXRhX3NpemUpOwoJCQkJdW5zZXQoJHRhYmxlKTsKCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Jyk7CgkJCQlwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsKCQkJCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOwoJCQkJcCgkZGJmb3JtKTsKCQkJCXAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7CgkJCQlwKCc8dGQgd2lkdGg9IjIlIiBhbGlnbj0iY2VudGVyIj48aW5wdXQgbmFtZT0iY2hrYWxsIiB2YWx1ZT0ib24iIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJDaGVja0FsbCh0aGlzLmZvcm0pIiAvPjwvdGQ+Jyk7CgkJCQlwKCc8dGQ+TmFtZTwvdGQ+Jyk7CgkJCQlwKCc8dGQ+Um93czwvdGQ+Jyk7CgkJCQlwKCc8dGQ+RGF0YV9sZW5ndGg8L3RkPicpOwoJCQkJcCgnPHRkPkNyZWF0ZV90aW1lPC90ZD4nKTsKCQkJCXAoJzx0ZD5VcGRhdGVfdGltZTwvdGQ+Jyk7CgkJCQlpZiAoJGhpZ2h2ZXIpIHsKCQkJCQlwKCc8dGQ+RW5naW5lPC90ZD4nKTsKCQkJCQlwKCc8dGQ+Q29sbGF0aW9uPC90ZD4nKTsKCQkJCX0KCQkJCXAoJzwvdHI+Jyk7CgkJCQlmb3JlYWNoICgkdGFibGVkYiBhcyAka2V5ID0+ICR0YWJsZSkgewoJCQkJCSR0aGlzYmcgPSBiZygpOwoJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7CgkJCQkJcCgnPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyJSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0YWJsZVtdIiB2YWx1ZT0iJy4kdGFibGVbJ05hbWUnXS4nIiAvPjwvdGQ+Jyk7CgkJCQkJcCgnPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJyk7Ij4nLiR0YWJsZVsnTmFtZSddLic8L2E+IFsgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnc3RydWN0dXJlXCcpOyI+U3RydWN0dXJlPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdkcm9wXCcpOyI+RHJvcDwvYT4gXTwvdGQ+Jyk7CgkJCQkJcCgnPHRkPicuJHRhYmxlWydSb3dzJ10uJzwvdGQ+Jyk7CgkJCQkJcCgnPHRkPicuJHRhYmxlWydEYXRhX2xlbmd0aCddLic8L3RkPicpOwoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnQ3JlYXRlX3RpbWUnXS4nPC90ZD4nKTsKCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ1VwZGF0ZV90aW1lJ10uJzwvdGQ+Jyk7CgkJCQkJaWYgKCRoaWdodmVyKSB7CgkJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnRW5naW5lJ10uJzwvdGQ+Jyk7CgkJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnQ29sbGF0aW9uJ10uJzwvdGQ+Jyk7CgkJCQkJfQoJCQkJCXAoJzwvdHI+Jyk7CgkJCQl9CgkJCQlwKCc8dHIgY2xhc3M9Zm91dD4nKTsKCQkJCXAoJzx0ZD4mbmJzcDs8L3RkPicpOwoJCQkJcCgnPHRkPlRvdGFsIHRhYmxlczogJy4kdGFibGVfbnVtLic8L3RkPicpOwoJCQkJcCgnPHRkPicuJHRhYmxlX3Jvd3MuJzwvdGQ+Jyk7CgkJCQlwKCc8dGQ+Jy4kZGF0YV9zaXplLic8L3RkPicpOwoJCQkJcCgnPHRkIGNvbHNwYW49IicuKCRoaWdodmVyID8gNCA6IDIpLiciPiZuYnNwOzwvdGQ+Jyk7CgkJCQlwKCc8L3RyPicpOwoKCQkJCXAoIjx0ciBjbGFzcz1cImZvdXRcIj48dGQgY29sc3Bhbj1cIiIuKCRoaWdodmVyID8gOCA6IDYpLiJcIj48aW5wdXQgbmFtZT1cInNhdmVhc2ZpbGVcIiB2YWx1ZT1cIjFcIiB0eXBlPVwiY2hlY2tib3hcIiAvPiBTYXZlIGFzIGZpbGUgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiBuYW1lPVwicGF0aFwiIHZhbHVlPVwiIi5TQV9ST09ULiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iX015U1FMLnNxbFwiIHR5cGU9XCJ0ZXh0XCIgc2l6ZT1cIjYwXCIgLz4gPGlucHV0IGNsYXNzPVwiYnRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cImRvd25yYXJcIiB2YWx1ZT1cIkV4cG9ydCBzZWxlY3Rpb24gdGFibGVcIiAvPjwvdGQ+PC90cj4iKTsKCQkJCW1ha2VoaWRlKCdkb2luZycsJ2JhY2t1cG15c3FsJyk7CgkJCQlmb3JtZm9vdCgpOwoJCQkJcCgiPC90YWJsZT4iKTsKCQkJCWZyKCRxdWVyeSk7CgkJCX0KCQl9Cgl9Cgl0YmZvb3QoKTsKCUBteXNxbF9jbG9zZSgpOwp9Ly9lbmQgc3FsIGJhY2t1cAoKCmVsc2VpZiAoJGFjdGlvbiA9PSAnYmFja2Nvbm5lY3QnKSB7CgkhJHlvdXJpcCAmJiAkeW91cmlwID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107CgkhJHlvdXJwb3J0ICYmICR5b3VycG9ydCA9ICcxMjM0NSc7CgkkdXNlZGIgPSBhcnJheSgncGVybCc9PidwZXJsJywnYyc9PidjJyk7CgoJJGJhY2tfY29ubmVjdD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHTnRaRDBnSW14NWJuZ2lPdzBLSkhONWMzUmxiVDBnSjJWamFHOGdJbUIxYm1GdFpTQXRZV0FpTzJWaiIuCgkJImFHOGdJbUJwWkdBaU95OWlhVzR2YzJnbk93MEtKREE5SkdOdFpEc05DaVIwWVhKblpYUTlKRUZTUjFaYk1GMDdEUW9rY0c5eWREMGtRVkpIVmxzeFhUc05DaVJwWVdSa2NqMXBibVYwWDJGMGIyNG9KSFIiLgoJCSJoY21kbGRDa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUndiM0owTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUIi4KCQkic05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSSIuCgkJImtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWkiLgoJCSJLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2drYzNsemRHVnRLVHNOQ21Oc2IzTmxLRk5VUkVsIi4KCQkiT0tUc05DbU5zYjNObEtGTlVSRTlWVkNrN0RRcGpiRzl6WlNoVFZFUkZVbElwT3c9PSI7CgkkYmFja19jb25uZWN0X2M9IkkybHVZMngxWkdVZ1BITjBaR2x2TG1nK0RRb2phVzVqYkhWa1pTQThjM2x6TDNOdlkydGxkQzVvUGcwS0kybHVZMngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ21sdWRDIi4KCQkiQnRZV2x1S0dsdWRDQmhjbWRqTENCamFHRnlJQ3BoY21kMlcxMHBEUXA3RFFvZ2FXNTBJR1prT3cwS0lITjBjblZqZENCemIyTnJZV1JrY2w5cGJpQnphVzQ3RFFvZ1kyaGhjaUJ5YlhOYk1qRmRQU0p5YiIuCgkJIlNBdFppQWlPeUFOQ2lCa1lXVnRiMjRvTVN3d0tUc05DaUJ6YVc0dWMybHVYMlpoYldsc2VTQTlJRUZHWDBsT1JWUTdEUW9nYzJsdUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb1lYUnZhU2hoY21kMld6SmQiLgoJCSJLU2s3RFFvZ2MybHVMbk5wYmw5aFpHUnlMbk5mWVdSa2NpQTlJR2x1WlhSZllXUmtjaWhoY21kMld6RmRLVHNnRFFvZ1lucGxjbThvWVhKbmRsc3hYU3h6ZEhKc1pXNG9ZWEpuZGxzeFhTa3JNU3R6ZEhKIi4KCQkic1pXNG9ZWEpuZGxzeVhTa3BPeUFOQ2lCbVpDQTlJSE52WTJ0bGRDaEJSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnU1ZCUVVrOVVUMTlVUTFBcElEc2dEUW9nYVdZZ0tDaGpiMjV1WldOMEtHWmtMQyIuCgkJIkFvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSUNaemFXNHNJSE5wZW1WdlppaHpkSEoxWTNRZ2MyOWphMkZrWkhJcEtTazhNQ2tnZXcwS0lDQWdjR1Z5Y205eUtDSmJMVjBnWTI5dWJtVmpkQ2dwSWlrN0QiLgoJCSJRb2dJQ0JsZUdsMEtEQXBPdzBLSUgwTkNpQnpkSEpqWVhRb2NtMXpMQ0JoY21kMld6QmRLVHNOQ2lCemVYTjBaVzBvY20xektUc2dJQTBLSUdSMWNESW9abVFzSURBcE93MEtJR1IxY0RJb1ptUXNJREVwIi4KCQkiT3cwS0lHUjFjRElvWm1Rc0lESXBPdzBLSUdWNFpXTnNLQ0l2WW1sdUwzTm9JaXdpYzJnZ0xXa2lMQ0JPVlV4TUtUc05DaUJqYkc5elpTaG1aQ2s3SUEwS2ZRPT0iOwoKCWlmICgkc3RhcnQgJiYgJHlvdXJpcCAmJiAkeW91cnBvcnQgJiYgJHVzZSl7CgkJaWYgKCR1c2UgPT0gJ3BlcmwnKSB7CgkJCWNmKCcvdG1wL2FuZ2VsX2JjJywkYmFja19jb25uZWN0KTsKCQkJJHJlcyA9IGV4ZWN1dGUod2hpY2goJ3BlcmwnKS4iIC90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOwoJCX0gZWxzZSB7CgkJCWNmKCcvdG1wL2FuZ2VsX2JjLmMnLCRiYWNrX2Nvbm5lY3RfYyk7CgkJCSRyZXMgPSBleGVjdXRlKCdnY2MgLW8gL3RtcC9hbmdlbF9iYyAvdG1wL2FuZ2VsX2JjLmMnKTsKCQkJQHVubGluaygnL3RtcC9hbmdlbF9iYy5jJyk7CgkJCSRyZXMgPSBleGVjdXRlKCIvdG1wL2FuZ2VsX2JjICR5b3VyaXAgJHlvdXJwb3J0ICYiKTsKCQl9CgkJbSgiTm93IHNjcmlwdCB0cnkgY29ubmVjdCB0byAkeW91cmlwIHBvcnQgJHlvdXJwb3J0IC4uLiIpOwoJfQoKCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidCYWNrIENvbm5lY3QnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnYmFja2Nvbm5lY3QnKTsKCXAoJzxwPicpOwoJcCgnWW91ciBJUDonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VyaXAnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JHlvdXJpcCkpOwoJcCgnWW91ciBQb3J0OicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3lvdXJwb3J0Jywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiR5b3VycG9ydCkpOwoJcCgnVXNlOicpOwoJbWFrZXNlbGVjdChhcnJheSgnbmFtZSc9Pid1c2UnLCdvcHRpb24nPT4kdXNlZGIsJ3NlbGVjdGVkJz0+JHVzZSkpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3N0YXJ0JywndmFsdWUnPT4nU3RhcnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JykpOwoJcCgnPC9wPicpOwoJZm9ybWZvb3QoKTsKfS8vZW5kIGJhY2tjb25uZWN0IHdpbmRvdyB2aWEgTkMKCi8vIEJydXRlCmVsc2VpZiAoJGFjdGlvbiA9PSAnYnJ1dGUnKSB7CmZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidCcnV0ZSBGb3JjZXInKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnYnJ1dGUnKTsKCW1ha2VoaWRlKCdkaXInLCRicnV0ZSk7CkBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAxMDAwMDAwMDAwMDAwKTsKJGNvbm5lY3RfdGltZW91dD01OwpAc2V0X3RpbWVfbGltaXQoMCk7CiRzdWJtaXQgPSAkX1JFUVVFU1RbJ3N1Ym1pdCddOwokdXNlcnMgPSAkX1JFUVVFU1RbJ3VzZXJzJ107CiRwYXNzID0gJF9SRVFVRVNUWydwYXNzd29yZHMnXTsKJHRhcmdldCA9ICRfUkVRVUVTVFsndGFyZ2V0J107CiRvcHRpb24gPSAkX1JFUVVFU1RbJ29wdGlvbiddOwoKCiRwYXNzbGlzdCA9ICIwMTIzNDU2CjAxMjM0NTY3CjAxMjM0NTY3OAowMTIzNDU2Nzg5CjAxMjM0NTY3ODkwCjEyMzQ1NgoxMjM0NTY3CjEyMzQ1Njc4CjEyMzQ1Njc4OQoxMjM0NTY3ODkwCjExMTExMQowMDAwMDAKMjIyMjIyCjMzMzMzMwo0NDQ0NDQKNTU1NTU1CjY2NjY2Ngo3Nzc3NzcKODg4ODg4Cjk5OTk5OQoxMjMxMjMKNDU2NDU2Cjc4OTc4OQoxMjMzMjEKNDU2NjU0CjY1NDMyMQo3NjU0MzIxCjg3NjU0MzIxCjk4NzY1NDMyMQowOTg3NjU0MzIxCmFkbWluCmFkbWluaXN0cmF0b3IKYWRtaW5jcApjcGFuZWwKYWRtaW54CmFkbWlucwpwYXNzd29yZApwYXNzd29yZHMKcGFzc3cwcmQKcEBzc3cwcmQKcEBzc3dvcmQKa2hvbmdjbwoyNTI1MTMyNQpwYXNzdzByZHMiOwppZigkdGFyZ2V0ID09ICcnKXsKJHRhcmdldCA9ICdsb2NhbGhvc3QnOwp9CnByaW50ICIgPGRpdiBhbGlnbj0nY2VudGVyJz4KPGZvcm0gbWV0aG9kPSdwb3N0JyBzdHlsZT0nYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMCc+PGJyPjxicj4KPFRBQkxFIHN0eWxlPSdCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlJyBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTY2MTE3IGNlbGxQYWRkaW5nPTUgd2lkdGg9JzQwJScgYmdDb2xvcj0jMzAzMDMwIGJvcmRlckNvbG9yTGlnaHQ9Izk2NjExNyBib3JkZXI9MT48dHI+PHRkPgo8Yj4gVGFyZ2V0ICA6IDwvZm9udD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndGFyZ2V0JyBzaXplPScxNicgdmFsdWU9ICR0YXJnZXQgc3R5bGU9J2JvcmRlcjogZm9udC1mYW1pbHk6dGFob21hOyBmb250LXdlaWdodDpib2xkOyc+PC9wPjwvZm9udD48L2I+PC9wPgo8ZGl2IGFsaWduPSdjZW50ZXInPjxicj4KPFRBQkxFIHN0eWxlPSdCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlJyBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTY2MTE3IGNlbGxQYWRkaW5nPTUgd2lkdGg9JzUwJScgYmdDb2xvcj0jMzAzMDMwIGJvcmRlckNvbG9yTGlnaHQ9Izk2NjExNyBib3JkZXI9MT4KPHRyPgo8dGQgYWxpZ249J2NlbnRlcic+CjxiPlVzZXJuYW1lPC9iPjwvdGQ+Cjx0ZD4KPHAgYWxpZ249J2NlbnRlcic+CjxiPlBhc3N3b3JkPC9iPjwvdGQ+CjwvdHI+CjwvdGFibGU+CjxwIGFsaWduPSdjZW50ZXInPgo8dGV4dGFyZWEgcm93cz0nMjAnIG5hbWU9J3VzZXJzJyBjb2xzPScyNScgc3R5bGU9J2JvcmRlcjogMnB4IHNvbGlkICMxRDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiNDMEMwQzAnPiI7CiRpID0gMDsKd2hpbGUgKCRpIDwgNjAwMDApIHsKCiAgICAkbGluZSA9IHBvc2l4X2dldHB3dWlkKCRpKTsKICAgIGlmICghZW1wdHkoJGxpbmUpKSB7CgkKICAgICAgICB3aGlsZSAobGlzdCAoJGtleSwgJHRtdF9ldGNwd2QpID0gZWFjaCgkbGluZSkpewogICAgICAgICAgICBlY2hvICIiLiR0bXRfZXRjcHdkLiJcbiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCQkKICAgIH0KIAogICAkaSsrOwp9CmVjaG8gIgo8L3RleHRhcmVhPgo8dGV4dGFyZWEgcm93cz0nMjAnIG5hbWU9J3Bhc3N3b3JkcycgY29scz0nMjUnIHN0eWxlPSdib3JkZXI6IDJweCBzb2xpZCAjMUQxRDFEOyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOyBjb2xvcjojQzBDMEMwJz4kcGFzc2xpc3Q8L3RleHRhcmVhPjxicj4KPGJyPiAgICAgICAgICAgICAgICAgICAgICAgICAKPGI+T3B0aW9ucyA6IDwvc3Bhbj48aW5wdXQgbmFtZT0nb3B0aW9uJyB2YWx1ZT0nY3BhbmVsJyBzdHlsZT0nZm9udC13ZWlnaHQ6IDcwMDsnIGNoZWNrZWQgdHlwZT0ncmFkaW8nPiBjUGFuZWwgCjxpbnB1dCBuYW1lPSdvcHRpb24nIHZhbHVlPSdmdHAnIHN0eWxlPSdmb250LXdlaWdodDogNzAwOycgdHlwZT0ncmFkaW8nPiBmdHAgPT0+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdBdHRhY2snIG5hbWU9J3N1Ym1pdCcgPjwvcD4KPC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvZm9ybT48cCBhbGlnbj0gJ2xlZnQnPiI7Cj8+Cjw/cGhwCmZ1bmN0aW9uIGZ0cF9jaGVjaygkaG9zdCwkdXNlciwkcGFzcywkdGltZW91dCl7CiRjaCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiZnRwOi8vJGhvc3QiKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBBVVRILCBDVVJMQVVUSF9CQVNJQyk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GVFBMSVNUT05MWSwgMSk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSUFdELCAiJHVzZXI6JHBhc3MiKTsKY3VybF9zZXRvcHQgKCRjaCwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgJHRpbWVvdXQpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRkFJTE9ORVJST1IsIDEpOwokZGF0YSA9IGN1cmxfZXhlYygkY2gpOwppZiAoIGN1cmxfZXJybm8oJGNoKSA9PSAyOCApIHsKCnByaW50ICI8Yj4gRXJyb3IgOiBDb25uZWN0aW9uIHRpbWVkIG91dCAsIG1ha2UgY29uZmlkZW5jZSBhYm91dCB2YWxpZGF0aW9uIG9mIHRhcmdldCAhPC9iPiI7CmV4aXQ7fQoKZWxzZWlmICggY3VybF9lcnJubygkY2gpID09IDAgKXsKCnAoIjxiPltmMHJ1czh4QGdtYWlsLmNvbSBdIyA8L2I+CjxiPiBBdHRhY2tpbmcgaGFzIGJlZW4gZG9uZSEgVXNlcm5hbWU6IDxmb250IGNvbG9yPScjRkYwMDAwJz4gJHVzZXIgPC9mb250PiAvIFBhc3N3b3JkOjxmb250IGNvbG9yPScjRkYwMDAwJz4gJHBhc3MgPC9mb250PiA9PiA8YSBocmVmPWh0dHA6Ly8kdXNlcjokcGFzc0AkaG9zdDoyMDgyIHRhcmdldD1fYmxhbms+TG9naW48L2E+PC9iPjxicj4iKTsKfQpjdXJsX2Nsb3NlKCRjaCk7fQoKZnVuY3Rpb24gY3BhbmVsX2NoZWNrKCRob3N0LCR1c2VyLCRwYXNzLCR0aW1lb3V0KXsKJGNoID0gY3VybF9pbml0KCk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICJodHRwOi8vJGhvc3Q6MjA4MiIpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJQV0QsICIkdXNlcjokcGFzcyIpOwpjdXJsX3NldG9wdCAoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAkdGltZW91dCk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GQUlMT05FUlJPUiwgMSk7CiRkYXRhID0gY3VybF9leGVjKCRjaCk7CmlmICggY3VybF9lcnJubygkY2gpID09IDI4ICkgeyAKcHJpbnQgIjxiPiBFcnJvciA6IENvbm5lY3Rpb24gdGltZWQgb3V0ICwgbWFrZSBjb25maWRlbmNlIGFib3V0IHZhbGlkYXRpb24gb2YgdGFyZ2V0ICE8L2I+IjsKZXhpdDt9CmVsc2VpZiAoIGN1cmxfZXJybm8oJGNoKSA9PSAwICl7CgpwKCI8Yj5bYnNvdWxiYnNvdWxAZ21haWwuY29tXSMgPC9iPjxiPkF0dGFja2luZyBoYXMgYmVlbiBkb25lITwvYT4gVXNlcm5hbWU6IDxmb250IGNvbG9yPSdncmVlbic+ICR1c2VyIDwvZm9udD4gLyBQYXNzd29yZDo8Zm9udCBjb2xvcj0nd2hpdGUnPiAkcGFzcyA8L2ZvbnQ+PC9iPjxicj4iKTt9Y3VybF9jbG9zZSgkY2gpO30KCmlmKGlzc2V0KCRzdWJtaXQpICYmICFlbXB0eSgkc3VibWl0KSl7CgokdXNlcmxpc3QgPSBleHBsb2RlICgiXG4iICwgJHVzZXJzICk7CiRwYXNzbGlzdCA9IGV4cGxvZGUgKCJcbiIgLCAkcGFzcyApOwpwKCc8Yj5bIE11YXRoIEJzb3VsIF0jIEF0dGFja2luZyAuLi48L2ZvbnQ+PC9iPjxicj4nKTsKZm9yZWFjaCAoJHVzZXJsaXN0IGFzICR1c2VyKSB7CiRfdXNlciA9IHRyaW0oJHVzZXIpOwpmb3JlYWNoICgkcGFzc2xpc3QgYXMgJHBhc3N3b3JkICkgewokX3Bhc3MgPSB0cmltKCRwYXNzd29yZCk7CmlmKCRvcHRpb24gPT0gImZ0cCIpewpmdHBfY2hlY2soJHRhcmdldCwkX3VzZXIsJF9wYXNzLCRjb25uZWN0X3RpbWVvdXQpOwp9CmlmICgkb3B0aW9uID09ICJjcGFuZWwiKQp7CmNwYW5lbF9jaGVjaygkdGFyZ2V0LCRfdXNlciwkX3Bhc3MsJGNvbm5lY3RfdGltZW91dCk7Cn0KfQp9Cn0KCglmb3JtZm9vdCgpOwp9CgoKCgoKCmVsc2VpZiAoJGFjdGlvbiA9PSAnZXRjcHdkJykgewpmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nR2V0IC9ldGMvcGFzc3dkJykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ2V0Y3B3ZCcpOwoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOwokaSA9IDA7CiBlY2hvICI8cD48YnI+PHRleHRhcmVhIGNsYXNzPVwiYXJlYVwiIGlkPVwicGhwY29kZXh4eFwiIG5hbWU9XCJwaHBjb2RleHh4XCIgY29scz1cIjEwMFwiIHJvd3M9XCIyNVwiPiI7CndoaWxlICgkaSA8IDYwMDAwKSB7CgogICAgJGxpbmUgPSBwb3NpeF9nZXRwd3VpZCgkaSk7CiAgICBpZiAoIWVtcHR5KCRsaW5lKSkgewoJCiAgICAgICAgd2hpbGUgKGxpc3QgKCRrZXksICR0bXRfZXRjcHdkKSA9IGVhY2goJGxpbmUpKXsKICAgICAgICAgICAgZWNobyAiIi4kdG10X2V0Y3B3ZC4iXG4iOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgkJCiAgICB9CgogICAkaSsrOwp9CiAgZWNobyAiPC90ZXh0YXJlYT48L3A+IjsKCWZvcm1mb290KCk7Cn0KCmVsc2VpZiAoJGFjdGlvbiA9PSAnZXZhbCcpIHsKCSRwaHBjb2RlID0gdHJpbSgkcGhwY29kZSk7CglpZigkcGhwY29kZSl7CgkJaWYgKCFwcmVnX21hdGNoKCcjPFw/I3NpJywgJHBocGNvZGUpKSB7CgkJCSRwaHBjb2RlID0gIjw/cGhwXG5cbnskcGhwY29kZX1cblxuPz4iOwoJCX0KCQlldmFsKCI/Ii4iPiRwaHBjb2RlPD8iKTsKCX0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFdmFsIFBIUCBDb2RlJykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ2V2YWwnKTsKCW1ha2V0ZXh0KGFycmF5KCd0aXRsZSc9PidQSFAgQ29kZScsJ25hbWUnPT4ncGhwY29kZScsICd2YWx1ZSc9PiRwaHBjb2RlKSk7CglwKCc8cD48YSBocmVmPSJodHRwOi8vd3d3LjRuZ2VsLm5ldC9waHBzcHkvcGx1Z2luLyIgdGFyZ2V0PSJfYmxhbmsiPkdldCBwbHVnaW5zPC9hPjwvcD4nKTsKCWZvcm1mb290ZXIoKTsKfS8vZW5kIGV2YWwKCmVsc2VpZiAoJGFjdGlvbiA9PSAnZWRpdGZpbGUnKSB7CglpZihmaWxlX2V4aXN0cygkb3BmaWxlKSkgewoJCSRmcD1AZm9wZW4oJG9wZmlsZSwncicpOwoJCSRjb250ZW50cz1AZnJlYWQoJGZwLCBmaWxlc2l6ZSgkb3BmaWxlKSk7CgkJQGZjbG9zZSgkZnApOwoJCSRjb250ZW50cz1odG1sc3BlY2lhbGNoYXJzKCRjb250ZW50cyk7Cgl9Cglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQ3JlYXRlIC8gRWRpdCBGaWxlJykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsKCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsKCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQ3VycmVudCBGaWxlIChpbXBvcnQgbmV3IGZpbGUgbmFtZSBhbmQgbmV3IGZpbGUpJywnbmFtZSc9PidlZGl0ZmlsZW5hbWUnLCd2YWx1ZSc9PiRvcGZpbGUsJ25ld2xpbmUnPT4xKSk7CgltYWtldGV4dChhcnJheSgndGl0bGUnPT4nRmlsZSBDb250ZW50JywnbmFtZSc9PidmaWxlY29udGVudCcsJ3ZhbHVlJz0+JGNvbnRlbnRzKSk7Cglmb3JtZm9vdGVyKCk7Cn0vL2VuZCBlZGl0ZmlsZQoKZWxzZWlmICgkYWN0aW9uID09ICduZXd0aW1lJykgewoJJG9wZmlsZW10aW1lID0gQGZpbGVtdGltZSgkb3BmaWxlKTsKCS8vJHRpbWUgPSBzdHJ0b3RpbWUoIiR5ZWFyLSRtb250aC0kZGF5ICRob3VyOiRtaW51dGU6JHNlY29uZCIpOwoJJGNhY2hlbW9udGggPSBhcnJheSgnSmFudWFyeSc9PjEsJ0ZlYnJ1YXJ5Jz0+MiwnTWFyY2gnPT4zLCdBcHJpbCc9PjQsJ01heSc9PjUsJ0p1bmUnPT42LCdKdWx5Jz0+NywnQXVndXN0Jz0+OCwnU2VwdGVtYmVyJz0+OSwnT2N0b2Jlcic9PjEwLCdOb3ZlbWJlcic9PjExLCdEZWNlbWJlcic9PjEyKTsKCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidDbG9uZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkIHRpbWUnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOwoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOwoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidBbHRlciBmaWxlJywnbmFtZSc9PidjdXJmaWxlJywndmFsdWUnPT4kb3BmaWxlLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOwoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidSZWZlcmVuY2UgZmlsZSAoZnVsbHBhdGgpJywnbmFtZSc9Pid0YXJmaWxlJywnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsKCWZvcm1mb290ZXIoKTsKCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidTZXQgbGFzdCBtb2RpZmllZCcpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7CgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0N1cnJlbnQgZmlsZSAoZnVsbHBhdGgpJywnbmFtZSc9PidjdXJmaWxlJywndmFsdWUnPT4kb3BmaWxlLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOwoJcCgnPHA+SW5zdGVhZCAmcmFxdW87Jyk7CglwKCd5ZWFyOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3llYXInLCd2YWx1ZSc9PmRhdGUoJ1knLCRvcGZpbGVtdGltZSksJ3NpemUnPT40KSk7CglwKCdtb250aDonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidtb250aCcsJ3ZhbHVlJz0+ZGF0ZSgnbScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsKCXAoJ2RheTonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYXknLCd2YWx1ZSc9PmRhdGUoJ2QnLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7CglwKCdob3VyOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2hvdXInLCd2YWx1ZSc9PmRhdGUoJ0gnLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7CglwKCdtaW51dGU6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nbWludXRlJywndmFsdWUnPT5kYXRlKCdpJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOwoJcCgnc2Vjb25kOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3NlY29uZCcsJ3ZhbHVlJz0+ZGF0ZSgncycsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsKCXAoJzwvcD4nKTsKCWZvcm1mb290ZXIoKTsKfS8vZW5kIG5ld3RpbWUKCmVsc2VpZiAoJGFjdGlvbiA9PSAnU2gzbGwnKSB7CglpZiAoSVNfV0lOICYmIElTX0NPTSkgewoJCWlmKCRwcm9ncmFtICYmICRwYXJhbWV0ZXIpIHsKCQkJJFNoM2xsPSBuZXcgQ09NKCdTaDNsbC5BcHBsaWNhdGlvbicpOwoJCQkkYSA9ICRTaDNsbC0+U2gzbGxFeGVjdXRlKCRwcm9ncmFtLCRwYXJhbWV0ZXIpOwoJCQltKCdQcm9ncmFtIHJ1biBoYXMgJy4oISRhID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnKSk7CgkJfQoJCSEkcHJvZ3JhbSAmJiAkcHJvZ3JhbSA9ICdjOlx3aW5kb3dzXHN5c3RlbTMyXGNtZC5leGUnOwoJCSEkcGFyYW1ldGVyICYmICRwYXJhbWV0ZXIgPSAnL2MgbmV0IHN0YXJ0ID4gJy5TQV9ST09ULidsb2cudHh0JzsKCQlmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXhlY3V0ZSBQcm9ncmFtJykpOwoJCW1ha2VoaWRlKCdhY3Rpb24nLCdTaDNsbCcpOwoJCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUHJvZ3JhbScsJ25hbWUnPT4ncHJvZ3JhbScsJ3ZhbHVlJz0+JHByb2dyYW0sJ25ld2xpbmUnPT4xKSk7CgkJcCgnPHA+Jyk7CgkJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidQYXJhbWV0ZXInLCduYW1lJz0+J3BhcmFtZXRlcicsJ3ZhbHVlJz0+JHBhcmFtZXRlcikpOwoJCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcsJ3R5cGUnPT4nc3VibWl0JywndmFsdWUnPT4nRXhlY3V0ZScpKTsKCQlwKCc8L3A+Jyk7CgkJZm9ybWZvb3QoKTsKCX0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFeGVjdXRlIENvbW1hbmQnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnU2gzbGwnKTsKCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7CgkJJGV4ZWNmdW5jZGIgPSBhcnJheSgncGhwZnVuYyc9PidwaHBmdW5jJywnd3NjcmlwdCc9Pid3c2NyaXB0JywncHJvY19vcGVuJz0+J3Byb2Nfb3BlbicpOwoJCW1ha2VzZWxlY3QoYXJyYXkoJ3RpdGxlJz0+J1VzZTonLCduYW1lJz0+J2V4ZWNmdW5jJywnb3B0aW9uJz0+JGV4ZWNmdW5jZGIsJ3NlbGVjdGVkJz0+JGV4ZWNmdW5jLCduZXdsaW5lJz0+MSkpOwoJfQoJcCgnPHA+Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0NvbW1hbmQnLCduYW1lJz0+J2NvbW1hbmQnLCd2YWx1ZSc9PiRjb21tYW5kKSk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ3ZhbHVlJz0+J0V4ZWN1dGUnKSk7CglwKCc8L3A+Jyk7Cglmb3JtZm9vdCgpOwoKCWlmICgkY29tbWFuZCkgewoJCXAoJzxociB3aWR0aD0iMTAwJSIgbm9zaGFkZSAvPjxwcmU+Jyk7CgkJaWYgKCRleGVjZnVuYz09J3dzY3JpcHQnICYmIElTX1dJTiAmJiBJU19DT00pIHsKCQkJJHdzaCA9IG5ldyBDT00oJ1dTY3JpcHQuU2gzbGwnKTsKCQkJJGV4ZWMgPSAkd3NoLT5leGVjKCdjbWQuZXhlIC9jICcuJGNvbW1hbmQpOwoJCQkkc3Rkb3V0ID0gJGV4ZWMtPlN0ZE91dCgpOwoJCQkkc3Ryb3V0cHV0ID0gJHN0ZG91dC0+UmVhZEFsbCgpOwoJCQllY2hvICRzdHJvdXRwdXQ7CgkJfSBlbHNlaWYgKCRleGVjZnVuYz09J3Byb2Nfb3BlbicgJiYgSVNfV0lOICYmIElTX0NPTSkgewoJCQkkZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgKCQkJICAgMCA9PiBhcnJheSgncGlwZScsICdyJyksCgkJCSAgIDEgPT4gYXJyYXkoJ3BpcGUnLCAndycpLAoJCQkgICAyID0+IGFycmF5KCdwaXBlJywgJ3cnKQoJCQkpOwoJCQkkcHJvY2VzcyA9IHByb2Nfb3BlbigkX1NFUlZFUlsnQ09NU1BFQyddLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7CgkJCWlmIChpc19yZXNvdXJjZSgkcHJvY2VzcykpIHsKCQkJCWZ3cml0ZSgkcGlwZXNbMF0sICRjb21tYW5kLiJcclxuIik7CgkJCQlmd3JpdGUoJHBpcGVzWzBdLCAiZXhpdFxyXG4iKTsKCQkJCWZjbG9zZSgkcGlwZXNbMF0pOwoJCQkJd2hpbGUgKCFmZW9mKCRwaXBlc1sxXSkpIHsKCQkJCQllY2hvIGZnZXRzKCRwaXBlc1sxXSwgMTAyNCk7CgkJCQl9CgkJCQlmY2xvc2UoJHBpcGVzWzFdKTsKCQkJCXdoaWxlICghZmVvZigkcGlwZXNbMl0pKSB7CgkJCQkJZWNobyBmZ2V0cygkcGlwZXNbMl0sIDEwMjQpOwoJCQkJfQoJCQkJZmNsb3NlKCRwaXBlc1syXSk7CgkJCQlwcm9jX2Nsb3NlKCRwcm9jZXNzKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWVjaG8oZXhlY3V0ZSgkY29tbWFuZCkpOwoJCX0KCQlwKCc8L3ByZT4nKTsKCX0KfS8vZW5kIFNoM2xsCgplbHNlaWYgKCRhY3Rpb24gPT0gJ3BocGVudicpIHsKCSR1cHNpemU9Z2V0Y2ZnKCdmaWxlX3VwbG9hZHMnKSA/IGdldGNmZygndXBsb2FkX21heF9maWxlc2l6ZScpIDogJ05vdCBhbGxvd2VkJzsKCSRhZG1pbm1haWw9aXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddKSA/ICRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSA6IGdldGNmZygnc2VuZG1haWxfZnJvbScpOwoJISRkaXNfZnVuYyAmJiAkZGlzX2Z1bmMgPSAnTm8nOwkKCSRpbmZvID0gYXJyYXkoCgkJMSA9PiBhcnJheSgnU2VydmVyIFRpbWUnLGRhdGUoJ1kvbS9kIGg6aTpzJywkdGltZXN0YW1wKSksCgkJMiA9PiBhcnJheSgnU2VydmVyIERvbWFpbicsJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLAoJCTMgPT4gYXJyYXkoJ1NlcnZlciBJUCcsZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkpLAoJCTQgPT4gYXJyYXkoJ1NlcnZlciBPUycsUEhQX09TKSwKCQk1ID0+IGFycmF5KCdTZXJ2ZXIgT1MgQ2hhcnNldCcsJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pLAoJCTYgPT4gYXJyYXkoJ1NlcnZlciBTb2Z0d2FyZScsJF9TRVJWRVJbJ1NFUlZFUl9TT0ZUV0FSRSddKSwKCQk3ID0+IGFycmF5KCdTZXJ2ZXIgV2ViIFBvcnQnLCRfU0VSVkVSWydTRVJWRVJfUE9SVCddKSwKCQk4ID0+IGFycmF5KCdQSFAgcnVuIG1vZGUnLHN0cnRvdXBwZXIocGhwX3NhcGlfbmFtZSgpKSksCgkJOSA9PiBhcnJheSgnVGhlIGZpbGUgcGF0aCcsX19GSUxFX18pLAoKCQkxMCA9PiBhcnJheSgnUEhQIFZlcnNpb24nLFBIUF9WRVJTSU9OKSwKCQkxMSA9PiBhcnJheSgnUEhQSU5GTycsKElTX1BIUElORk8gPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbihcJ3BocGluZm9cJyk7Ij5ZZXM8L2E+JyA6ICdObycpKSwKCQkxMiA9PiBhcnJheSgnU2FmZSBNb2RlJyxnZXRjZmcoJ3NhZmVfbW9kZScpKSwKCQkxMyA9PiBhcnJheSgnQWRtaW5pc3RyYXRvcicsJGFkbWlubWFpbCksCgkJMTQgPT4gYXJyYXkoJ2FsbG93X3VybF9mb3BlbicsZ2V0Y2ZnKCdhbGxvd191cmxfZm9wZW4nKSksCgkJMTUgPT4gYXJyYXkoJ2VuYWJsZV9kbCcsZ2V0Y2ZnKCdlbmFibGVfZGwnKSksCgkJMTYgPT4gYXJyYXkoJ2Rpc3BsYXlfZXJyb3JzJyxnZXRjZmcoJ2Rpc3BsYXlfZXJyb3JzJykpLAoJCTE3ID0+IGFycmF5KCdyZWdpc3Rlcl9nbG9iYWxzJyxnZXRjZmcoJ3JlZ2lzdGVyX2dsb2JhbHMnKSksCgkJMTggPT4gYXJyYXkoJ21hZ2ljX3F1b3Rlc19ncGMnLGdldGNmZygnbWFnaWNfcXVvdGVzX2dwYycpKSwKCQkxOSA9PiBhcnJheSgnbWVtb3J5X2xpbWl0JyxnZXRjZmcoJ21lbW9yeV9saW1pdCcpKSwKCQkyMCA9PiBhcnJheSgncG9zdF9tYXhfc2l6ZScsZ2V0Y2ZnKCdwb3N0X21heF9zaXplJykpLAoJCTIxID0+IGFycmF5KCd1cGxvYWRfbWF4X2ZpbGVzaXplJywkdXBzaXplKSwKCQkyMiA9PiBhcnJheSgnbWF4X2V4ZWN1dGlvbl90aW1lJyxnZXRjZmcoJ21heF9leGVjdXRpb25fdGltZScpLicgc2Vjb25kKHMpJyksCgkJMjMgPT4gYXJyYXkoJ2Rpc2FibGVfZnVuY3Rpb25zJywkZGlzX2Z1bmMpLAoJKTsKCglpZigkcGhwdmFybmFtZSkgewoJCW0oJHBocHZhcm5hbWUgLicgOiAnLmdldGNmZygkcGhwdmFybmFtZSkpOwoJfQoKCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidTZXJ2ZXIgZW52aXJvbm1lbnQnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywncGhwZW52Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1BsZWFzZSBpbnB1dCBQSFAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIoZWc6bWFnaWNfcXVvdGVzX2dwYyknLCduYW1lJz0+J3BocHZhcm5hbWUnLCd2YWx1ZSc9PiRwaHB2YXJuYW1lLCduZXdsaW5lJz0+MSkpOwoJZm9ybWZvb3RlcigpOwoKCSRocCA9IGFycmF5KDA9PiAnU2VydmVyJywgMT0+ICdQSFAnKTsKCWZvcigkYT0wOyRhPDI7JGErKykgewoJCXAoJzxoMj4nLiRocFskYV0uJyAmcmFxdW87PC9oMj4nKTsKCQlwKCc8dWwgY2xhc3M9ImluZm8iPicpOwoJCWlmICgkYT09MCkgewoJCQlmb3IoJGk9MTskaTw9OTskaSsrKSB7CgkJCQlwKCc8bGk+PHU+Jy4kaW5mb1skaV1bMF0uJzo8L3U+Jy4kaW5mb1skaV1bMV0uJzwvbGk+Jyk7CgkJCX0KCQl9IGVsc2VpZiAoJGEgPT0gMSkgewoJCQlmb3IoJGk9MTA7JGk8PTIzOyRpKyspIHsKCQkJCXAoJzxsaT48dT4nLiRpbmZvWyRpXVswXS4nOjwvdT4nLiRpbmZvWyRpXVsxXS4nPC9saT4nKTsKCQkJfQoJCX0KCQlwKCc8L3VsPicpOwoJfQp9Ly9lbmQgcGhwZW52CgplbHNlIHsKCW0oJ1VuZGVmaW5lZCBBY3Rpb24nKTsKfQoKPz4KPC90ZD48L3RyPjwvdGFibGU+CjxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjMEUwRTBFO2JvcmRlci10b3A6MXB4IHNvbGlkICMwRTBFMEU7YmFja2dyb3VuZDojMEUwRTBFOyI+Cgk8c3BhbiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij48P3BocCBkZWJ1Z2luZm8oKTtvYl9lbmRfZmx1c2goKTs/Pjwvc3Bhbj4KCUNvcHlyaWdodCAoQykgMjAxMy0yMDE0IDxCPltNdWF0aCBCc291bF08L0I+IC0gRGV2ZWxvcCBieSA8YSBocmVmPWh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9ibDRjazI+PEI+TXVhdGggQnNvdWw8L0I+PC9hPiAtIDxCPmh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9ibDRjazI8L0I+IEFsbCBSaWdodHMgUmVzZXJ2ZWQuCjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4KCjw/cGhwCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpTaG93IGluZm8gU2gzbGwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCmZ1bmN0aW9uIG0oJG1zZykgewoJZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZjFmMWYxO2JvcmRlcjoxcHggc29saWQgI2RkZDtwYWRkaW5nOjE1cHg7Zm9udDoxNHB4O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7Ij4nOwoJZWNobyAkbXNnOwoJZWNobyAnPC9kaXY+JzsKfQpmdW5jdGlvbiBzY29va2llKCRrZXksICR2YWx1ZSwgJGxpZmUgPSAwLCAkcHJlZml4ID0gMSkgewoJZ2xvYmFsICRhZG1pbiwgJHRpbWVzdGFtcCwgJF9TRVJWRVI7Cgkka2V5ID0gKCRwcmVmaXggPyAkYWRtaW5bJ2Nvb2tpZXByZSddIDogJycpLiRrZXk7CgkkbGlmZSA9ICRsaWZlID8gJGxpZmUgOiAkYWRtaW5bJ2Nvb2tpZWxpZmUnXTsKCSR1c2Vwb3J0ID0gJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzID8gMSA6IDA7CglzZXRjb29raWUoJGtleSwgJHZhbHVlLCAkdGltZXN0YW1wKyRsaWZlLCAkYWRtaW5bJ2Nvb2tpZXBhdGgnXSwgJGFkbWluWydjb29raWVkb21haW4nXSwgJHVzZXBvcnQpOwp9CQpmdW5jdGlvbiBtdWx0aSgkbnVtLCAkcGVycGFnZSwgJGN1cnBhZ2UsICR0YWJsZW5hbWUpIHsKCSRtdWx0aXBhZ2UgPSAnJzsKCWlmKCRudW0gPiAkcGVycGFnZSkgewoJCSRwYWdlID0gMTA7CgkJJG9mZnNldCA9IDU7CgkJJHBhZ2VzID0gQGNlaWwoJG51bSAvICRwZXJwYWdlKTsKCQlpZigkcGFnZSA+ICRwYWdlcykgewoJCQkkZnJvbSA9IDE7CgkJCSR0byA9ICRwYWdlczsKCQl9IGVsc2UgewoJCQkkZnJvbSA9ICRjdXJwYWdlIC0gJG9mZnNldDsKCQkJJHRvID0gJGN1cnBhZ2UgKyAkcGFnZSAtICRvZmZzZXQgLSAxOwoJCQlpZigkZnJvbSA8IDEpIHsKCQkJCSR0byA9ICRjdXJwYWdlICsgMSAtICRmcm9tOwoJCQkJJGZyb20gPSAxOwoJCQkJaWYoKCR0byAtICRmcm9tKSA8ICRwYWdlICYmICgkdG8gLSAkZnJvbSkgPCAkcGFnZXMpIHsKCQkJCQkkdG8gPSAkcGFnZTsKCQkJCX0KCQkJfSBlbHNlaWYoJHRvID4gJHBhZ2VzKSB7CgkJCQkkZnJvbSA9ICRjdXJwYWdlIC0gJHBhZ2VzICsgJHRvOwoJCQkJJHRvID0gJHBhZ2VzOwoJCQkJaWYoKCR0byAtICRmcm9tKSA8ICRwYWdlICYmICgkdG8gLSAkZnJvbSkgPCAkcGFnZXMpIHsKCQkJCQkkZnJvbSA9ICRwYWdlcyAtICRwYWdlICsgMTsKCQkJCX0KCQkJfQoJCX0KCQkkbXVsdGlwYWdlID0gKCRjdXJwYWdlIC0gJG9mZnNldCA+IDEgJiYgJHBhZ2VzID4gJHBhZ2UgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsIDEpOyI+Rmlyc3Q8L2E+ICcgOiAnJykuKCRjdXJwYWdlID4gMSA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4oJGN1cnBhZ2UgLSAxKS4nKTsiPlByZXY8L2E+ICcgOiAnJyk7CgkJZm9yKCRpID0gJGZyb207ICRpIDw9ICR0bzsgJGkrKykgewoJCQkkbXVsdGlwYWdlIC49ICRpID09ICRjdXJwYWdlID8gJGkuJyAnIDogJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLiRpLicpOyI+WycuJGkuJ108L2E+ICc7CgkJfQoJCSRtdWx0aXBhZ2UgLj0gKCRjdXJwYWdlIDwgJHBhZ2VzID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLigkY3VycGFnZSArIDEpLicpOyI+TmV4dDwvYT4nIDogJycpLigkdG8gPCAkcGFnZXMgPyAnIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLiRwYWdlcy4nKTsiPkxhc3Q8L2E+JyA6ICcnKTsKCQkkbXVsdGlwYWdlID0gJG11bHRpcGFnZSA/ICc8cD5QYWdlczogJy4kbXVsdGlwYWdlLic8L3A+JyA6ICcnOwoJfQoJcmV0dXJuICRtdWx0aXBhZ2U7Cn0KLy8gTG9naW4gcGFnZQpmdW5jdGlvbiBsb2dpbnBhZ2UoKSB7Cj8+CjxodG1sPgo8aGVhZD4KCjxib2R5IGJnY29sb3I9YmxhY2sgYmFja2dyb3VuZD1odHRwOi8vc3RvcmUyLnVwLTAwLmNvbS9BcHIxMy9penI0MDYyMi5naWY+CgoJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgo8dGl0bGU+QmxhYyB0ZWFtIFNoM2xsIC0gRGV2ZWxvcCBCeSBNdWF0aCBCc291bCA8L3RpdGxlPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpBOmxpbmsge3RleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6IGdyZWVuIH0KQTp2aXNpdGVkIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6cmVkfQpBOmFjdGl2ZSB7dGV4dC1kZWNvcmF0aW9uOiBub25lfQpBOmhvdmVyIHt0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6IGdyZWVuO30KaW5wdXQsIHRleHRhcmVhLCBidXR0b24KewoJZm9udC1zaXplOiA5cHQ7Cgljb2xvcjogI2NjYzsKCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwoJYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDsKCWJvcmRlci1sZWZ0OiAxcHggc29saWQgIzc0QTIwMjsKCWJvcmRlci10b3A6IDFweCBzb2xpZCAjNzRBMjAyOwoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzc0QTIwMjsKCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNzRBMjAyOwp9Cgo8L3N0eWxlPgoKICAgICAgIDxCUj48QlI+CjxkaXYgYWxpZ249Y2VudGVyID4KPGZpZWxkc2V0IHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCByZ2IoNjksIDY5LCA2OSk7IHBhZGRpbmc6IDRweDt3aWR0aDo0NTBweDtiZ2NvbG9yOndoaXRlO2FsaWduOmNlbnRlcjtmb250LWZhbWlseTp0YWhvbWE7Zm9udC1zaXplOjEwcHQiPjxsZWdlbmQ+PGZvbnQgY29sb3I9cmVkPjxCPkxvZ2luPC9iPjwvZm9udD48L2xlZ2VuZD4KCjxkaXY+Cjxmb250IGNvbG9yPWdyYXk+Cjxmb250IGNvbG9yPXllbGxvdz49PVsgPEI+TXVhdGggQnNvdWwgU2gzbGw8L0I+IF09PSA8L2ZvbnQ+PEJSPjxCUj4KCjxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIiPgoJPHNwYW4gc3R5bGU9ImZvbnQ6MTBwdCB0YWhvbWE7Ij5QYXNzd29yZDogPC9zcGFuPjxpbnB1dCBuYW1lPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiIHNpemU9IjIwIj4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImRvaW5nIiB2YWx1ZT0ibG9naW4iPgoJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ2luIj4KCTwvZm9ybT4KPEJSPgo8P3BocAplY2hvICIiLiRlcnJfbWVzcy4iIjsKPz4KCgk8Qj48Zm9udCBjb2xvcj1yZWQ+CjxhIGhyZWY9aHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL1RlYW0uSGFja2Vycy5BcmFiaWFuIHRhcmdldD1fYmxhbms+JiMxNTc1OyYjMTU4MTsmIzE1Nzg7JiMxNTg1OyYjMTU3NTsmIzE2MDE7ICYjMTU3NTsmIzE2MDQ7JiMxNjA3OyYjMTYwMzsmIzE1ODU7ICYjMTU3NTsmIzE2MDQ7JiMxNjA1OyYjMTU3ODsmIzE1OTE7JiMxNjA4OyYjMTU4NTt8TXVhdGggQnNvdWw8L2E+PEJSPjwvYj4KCgoKCgo8L2Rpdj4KCgoJPC9maWVsZHNldD4KCgoKPC9oZWFkPgo8L2h0bWw+CgoKPD9waHAJCglleGl0OwoKfS8vZW5kIGxvZ2lucGFnZSgpCgpmdW5jdGlvbiBleGVjdXRlKCRjZmUpIHsKCSRyZXMgPSAnJzsKCWlmICgkY2ZlKSB7CgkJaWYoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsKCQkJQGV4ZWMoJGNmZSwkcmVzKTsKCQkJJHJlcyA9IGpvaW4oIlxuIiwkcmVzKTsKCQl9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ1NoM2xsX2V4ZWMnKSkgewoJCQkkcmVzID0gQFNoM2xsX2V4ZWMoJGNmZSk7CgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgewoJCQlAb2Jfc3RhcnQoKTsKCQkJQHN5c3RlbSgkY2ZlKTsKCQkJJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsKCQkJQG9iX2VuZF9jbGVhbigpOwoJCX0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgewoJCQlAb2Jfc3RhcnQoKTsKCQkJQHBhc3N0aHJ1KCRjZmUpOwoJCQkkcmVzID0gQG9iX2dldF9jb250ZW50cygpOwoJCQlAb2JfZW5kX2NsZWFuKCk7CgkJfSBlbHNlaWYoQGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRjZmUsInIiKSkpIHsKCQkJJHJlcyA9ICcnOwoJCQl3aGlsZSghQGZlb2YoJGYpKSB7CgkJCQkkcmVzIC49IEBmcmVhZCgkZiwxMDI0KTsKCQkJfQoJCQlAcGNsb3NlKCRmKTsKCQl9Cgl9CglyZXR1cm4gJHJlczsKfQpmdW5jdGlvbiB3aGljaCgkcHIpIHsKCSRwYXRoID0gZXhlY3V0ZSgid2hpY2ggJHByIik7CglyZXR1cm4gKCRwYXRoID8gJHBhdGggOiAkcHIpOyAKfQoKZnVuY3Rpb24gY2YoJGZuYW1lLCR0ZXh0KXsKCWlmKCRmcD1AZm9wZW4oJGZuYW1lLCd3JykpIHsKCQlAZnB1dHMoJGZwLEBiYXNlNjRfZGVjb2RlKCR0ZXh0KSk7CgkJQGZjbG9zZSgkZnApOwoJfQp9CgovLyBEZWJ1ZwpmdW5jdGlvbiBkZWJ1Z2luZm8oKSB7CglnbG9iYWwgJHN0YXJ0dGltZTsKCSRtdGltZSA9IGV4cGxvZGUoJyAnLCBtaWNyb3RpbWUoKSk7CgkkdG90YWx0aW1lID0gbnVtYmVyX2Zvcm1hdCgoJG10aW1lWzFdICsgJG10aW1lWzBdIC0gJHN0YXJ0dGltZSksIDYpOwoJZWNobyAnUHJvY2Vzc2VkIGluICcuJHRvdGFsdGltZS4nIHNlY29uZChzKSc7Cn0KCi8vIEZ1bmN0aW9uIGNvbm5lY3QgZGF0YWJhc2UKZnVuY3Rpb24gZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWU9JycsJGNoYXJzZXQ9JycsJGRicG9ydD0nMzMwNicpIHsKCWlmKCEkbGluayA9IEBteXNxbF9jb25uZWN0KCRkYmhvc3QuJzonLiRkYnBvcnQsICRkYnVzZXIsICRkYnBhc3MpKSB7CgkJcCgnPGgyPkNhbiBub3QgY29ubmVjdCB0byBNeVNRTCBzZXJ2ZXI8L2gyPicpOwoJCWV4aXQ7Cgl9CglpZigkbGluayAmJiAkZGJuYW1lKSB7CgkJaWYgKCFAbXlzcWxfc2VsZWN0X2RiKCRkYm5hbWUsICRsaW5rKSkgewoJCQlwKCc8aDI+RGF0YWJhc2Ugc2VsZWN0ZWQgaGFzIGVycm9yPC9oMj4nKTsKCQkJZXhpdDsKCQl9Cgl9CglpZigkbGluayAmJiBteXNxbF9nZXRfc2VydmVyX2luZm8oKSA+ICc0LjEnKSB7CgkJaWYoaW5fYXJyYXkoc3RydG9sb3dlcigkY2hhcnNldCksIGFycmF5KCdnYmsnLCAnYmlnNScsICd1dGY4JykpKSB7CgkJCXEoIlNFVCBjaGFyYWN0ZXJfc2V0X2Nvbm5lY3Rpb249JGNoYXJzZXQsIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cz0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9jbGllbnQ9YmluYXJ5OyIsICRsaW5rKTsKCQl9Cgl9CglyZXR1cm4gJGxpbms7Cn0KCi8vIEFycmF5IHN0cmlwCmZ1bmN0aW9uIHNfYXJyYXkoJiRhcnJheSkgewoJaWYgKGlzX2FycmF5KCRhcnJheSkpIHsKCQlmb3JlYWNoICgkYXJyYXkgYXMgJGsgPT4gJHYpIHsKCQkJJGFycmF5WyRrXSA9IHNfYXJyYXkoJHYpOwoJCX0KCX0gZWxzZSBpZiAoaXNfc3RyaW5nKCRhcnJheSkpIHsKCQkkYXJyYXkgPSBzdHJpcHNsYXNoZXMoJGFycmF5KTsKCX0KCXJldHVybiAkYXJyYXk7Cn0KCi8vIEhUTUwgU3RyaXAKZnVuY3Rpb24gaHRtbF9jbGVhbigkY29udGVudCkgewoJJGNvbnRlbnQgPSBodG1sc3BlY2lhbGNoYXJzKCRjb250ZW50KTsKCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlxuIiwgIjxiciAvPiIsICRjb250ZW50KTsKCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIiAgIiwgIiZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsKCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlx0IiwgIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsKCXJldHVybiAkY29udGVudDsKfQoKLy8gQ2htb2QKZnVuY3Rpb24gZ2V0Q2htb2QoJGZpbGVwYXRoKXsKCXJldHVybiBzdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJGZpbGVwYXRoKSwxMCw4KSwtNCk7Cn0KCmZ1bmN0aW9uIGdldFBlcm1zKCRmaWxlcGF0aCkgewoJJG1vZGUgPSBAZmlsZXBlcm1zKCRmaWxlcGF0aCk7CglpZiAoKCRtb2RlICYgMHhDMDAwKSA9PT0gMHhDMDAwKSB7JHR5cGUgPSAncyc7fQoJZWxzZWlmICgoJG1vZGUgJiAweDQwMDApID09PSAweDQwMDApIHskdHlwZSA9ICdkJzt9CgllbHNlaWYgKCgkbW9kZSAmIDB4QTAwMCkgPT09IDB4QTAwMCkgeyR0eXBlID0gJ2wnO30KCWVsc2VpZiAoKCRtb2RlICYgMHg4MDAwKSA9PT0gMHg4MDAwKSB7JHR5cGUgPSAnLSc7fSAKCWVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHR5cGUgPSAnYic7fQoJZWxzZWlmICgoJG1vZGUgJiAweDIwMDApID09PSAweDIwMDApIHskdHlwZSA9ICdjJzt9CgllbHNlaWYgKCgkbW9kZSAmIDB4MTAwMCkgPT09IDB4MTAwMCkgeyR0eXBlID0gJ3AnO30KCWVsc2UgeyR0eXBlID0gJz8nO30KCgkkb3duZXJbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwNDAwKSA/ICdyJyA6ICctJzsgCgkkb3duZXJbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDIwMCkgPyAndycgOiAnLSc7IAoJJG93bmVyWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDEwMCkgPyAneCcgOiAnLSc7IAoJJGdyb3VwWydyZWFkJ10gPSAoJG1vZGUgJiAwMDA0MCkgPyAncicgOiAnLSc7IAoJJGdyb3VwWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMjApID8gJ3cnIDogJy0nOyAKCSRncm91cFsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAwMTApID8gJ3gnIDogJy0nOyAKCSR3b3JsZFsncmVhZCddID0gKCRtb2RlICYgMDAwMDQpID8gJ3InIDogJy0nOyAKCSR3b3JsZFsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMDAyKSA/ICd3JyA6ICctJzsgCgkkd29ybGRbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMDAxKSA/ICd4JyA6ICctJzsgCgoJaWYoICRtb2RlICYgMHg4MDAgKSB7JG93bmVyWydleGVjdXRlJ10gPSAoJG93bmVyWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fQoJaWYoICRtb2RlICYgMHg0MDAgKSB7JGdyb3VwWydleGVjdXRlJ10gPSAoJGdyb3VwWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fQoJaWYoICRtb2RlICYgMHgyMDAgKSB7JHdvcmxkWydleGVjdXRlJ10gPSAoJHdvcmxkWydleGVjdXRlJ109PSd4JykgPyAndCcgOiAnVCc7fQogCglyZXR1cm4gJHR5cGUuJG93bmVyWydyZWFkJ10uJG93bmVyWyd3cml0ZSddLiRvd25lclsnZXhlY3V0ZSddLiRncm91cFsncmVhZCddLiRncm91cFsnd3JpdGUnXS4kZ3JvdXBbJ2V4ZWN1dGUnXS4kd29ybGRbJ3JlYWQnXS4kd29ybGRbJ3dyaXRlJ10uJHdvcmxkWydleGVjdXRlJ107Cn0KCmZ1bmN0aW9uIGdldFVzZXIoJGZpbGVwYXRoKQl7CglpZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwd3VpZCcpKSB7CgkJJGFycmF5ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGZpbGVwYXRoKSk7CgkJaWYgKCRhcnJheSAmJiBpc19hcnJheSgkYXJyYXkpKSB7CgkJCXJldHVybiAnIC8gPGEgaHJlZj0iIyIgdGl0bGU9IlVzZXI6ICcuJGFycmF5WyduYW1lJ10uJyYjMTMmIzEwUGFzc3dkOiAnLiRhcnJheVsncGFzc3dkJ10uJyYjMTMmIzEwVWlkOiAnLiRhcnJheVsndWlkJ10uJyYjMTMmIzEwZ2lkOiAnLiRhcnJheVsnZ2lkJ10uJyYjMTMmIzEwR2Vjb3M6ICcuJGFycmF5WydnZWNvcyddLicmIzEzJiMxMERpcjogJy4kYXJyYXlbJ2RpciddLicmIzEzJiMxMFNoM2xsOiAnLiRhcnJheVsnU2gzbGwnXS4nIj4nLiRhcnJheVsnbmFtZSddLic8L2E+JzsKCQl9Cgl9CglyZXR1cm4gJyc7Cn0KCi8vIERlbGV0ZSBkaXIKZnVuY3Rpb24gZGVsdHJlZSgkZGVsZGlyKSB7CgkkbXlkaXI9QGRpcigkZGVsZGlyKTsKCXdoaWxlKCRmaWxlPSRteWRpci0+cmVhZCgpKQl7IAkJCgkJaWYoKGlzX2RpcigkZGVsZGlyLicvJy4kZmlsZSkpICYmICgkZmlsZSE9Jy4nKSAmJiAoJGZpbGUhPScuLicpKSB7IAoJCQlAY2htb2QoJGRlbGRpci4nLycuJGZpbGUsMDc1NSk7CgkJCWRlbHRyZWUoJGRlbGRpci4nLycuJGZpbGUpOyAKCQl9CgkJaWYgKGlzX2ZpbGUoJGRlbGRpci4nLycuJGZpbGUpKSB7CgkJCUBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzU1KTsKCQkJQHVubGluaygkZGVsZGlyLicvJy4kZmlsZSk7CgkJfQoJfSAKCSRteWRpci0+Y2xvc2UoKTsgCglAY2htb2QoJGRlbGRpciwwNzU1KTsKCXJldHVybiBAcm1kaXIoJGRlbGRpcikgPyAxIDogMDsKfQoKLy8gQmFja2dyb3VuZApmdW5jdGlvbiBiZygpIHsKCWdsb2JhbCAkYmdjOwoJcmV0dXJuICgkYmdjKyslMj09MCkgPyAnYWx0MScgOiAnYWx0Mic7Cn0KCi8vIEdldCBwYXRoCmZ1bmN0aW9uIGdldFBhdGgoJHNjcmlwdHBhdGgsICRub3dwYXRoKSB7CglpZiAoJG5vd3BhdGggPT0gJy4nKSB7CgkJJG5vd3BhdGggPSAkc2NyaXB0cGF0aDsKCX0KCSRub3dwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm93cGF0aCk7Cgkkbm93cGF0aCA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJG5vd3BhdGgpOwoJaWYgKHN1YnN0cigkbm93cGF0aCwgLTEpICE9ICcvJykgewoJCSRub3dwYXRoID0gJG5vd3BhdGguJy8nOwoJfQoJcmV0dXJuICRub3dwYXRoOwp9CgovLyBHZXQgdXAgcGF0aApmdW5jdGlvbiBnZXRVcFBhdGgoJG5vd3BhdGgpIHsKCSRwYXRoZGIgPSBleHBsb2RlKCcvJywgJG5vd3BhdGgpOwoJJG51bSA9IGNvdW50KCRwYXRoZGIpOwoJaWYgKCRudW0gPiAyKSB7CgkJdW5zZXQoJHBhdGhkYlskbnVtLTFdLCRwYXRoZGJbJG51bS0yXSk7Cgl9CgkkdXBwYXRoID0gaW1wbG9kZSgnLycsICRwYXRoZGIpLicvJzsKCSR1cHBhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICR1cHBhdGgpOwoJcmV0dXJuICR1cHBhdGg7Cn0KCi8vIENvbmZpZwpmdW5jdGlvbiBnZXRjZmcoJHZhcm5hbWUpIHsKCSRyZXN1bHQgPSBnZXRfY2ZnX3ZhcigkdmFybmFtZSk7CglpZiAoJHJlc3VsdCA9PSAwKSB7CgkJcmV0dXJuICdObyc7Cgl9IGVsc2VpZiAoJHJlc3VsdCA9PSAxKSB7CgkJcmV0dXJuICdZZXMnOwoJfSBlbHNlIHsKCQlyZXR1cm4gJHJlc3VsdDsKCX0KfQoKLy8gRnVuY3Rpb24gbmFtZQpmdW5jdGlvbiBnZXRmdW4oJGZ1bk5hbWUpIHsKCXJldHVybiAoZmFsc2UgIT09IGZ1bmN0aW9uX2V4aXN0cygkZnVuTmFtZSkpID8gJ1llcycgOiAnTm8nOwp9CgpmdW5jdGlvbiBHZXRMaXN0KCRkaXIpewoJZ2xvYmFsICRkaXJkYXRhLCRqLCRub3dwYXRoOwoJISRqICYmICRqPTE7CglpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgewoJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgewoJCQkkZj1zdHJfcmVwbGFjZSgnLy8nLCcvJywkZGlyLicvJy4kZmlsZSk7CgkJCWlmKCRmaWxlIT0nLicgJiYgJGZpbGUhPScuLicgJiYgaXNfZGlyKCRmKSl7CgkJCQlpZiAoaXNfd3JpdGFibGUoJGYpKSB7CgkJCQkJJGRpcmRhdGFbJGpdWydmaWxlbmFtZSddPXN0cl9yZXBsYWNlKCRub3dwYXRoLCcnLCRmKTsKCQkJCQkkZGlyZGF0YVskal1bJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGYpKTsKCQkJCQkkZGlyZGF0YVskal1bJ2RpcmNobW9kJ109Z2V0Q2htb2QoJGYpOwoJCQkJCSRkaXJkYXRhWyRqXVsnZGlycGVybSddPWdldFBlcm1zKCRmKTsKCQkJCQkkZGlyZGF0YVskal1bJ2RpcmxpbmsnXT11ZSgkZGlyKTsKCQkJCQkkZGlyZGF0YVskal1bJ3NlcnZlcl9saW5rJ109JGY7CgkJCQkJJGRpcmRhdGFbJGpdWydjbGllbnRfbGluayddPXVlKCRmKTsKCQkJCQkkaisrOwoJCQkJfQoJCQkJR2V0TGlzdCgkZik7CgkJCX0KCQl9CgkJY2xvc2VkaXIoJGRoKTsKCQljbGVhcnN0YXRjYWNoZSgpOwoJCXJldHVybiAkZGlyZGF0YTsKCX0gZWxzZSB7CgkJcmV0dXJuIGFycmF5KCk7Cgl9Cn0KCmZ1bmN0aW9uIHF5KCRzcWwpIHsgCgkvL2VjaG8gJHNxbC4nPGJyPic7CgkkcmVzID0gJGVycm9yID0gJyc7CglpZighJHJlcyA9IEBteXNxbF9xdWVyeSgkc3FsKSkgeyAKCQlyZXR1cm4gMDsKCX0gZWxzZSBpZihpc19yZXNvdXJjZSgkcmVzKSkgewoJCXJldHVybiAxOyAKCX0gZWxzZSB7CgkJcmV0dXJuIDI7Cgl9CQoJcmV0dXJuIDA7Cn0KCmZ1bmN0aW9uIHEoJHNxbCkgeyAKCXJldHVybiBAbXlzcWxfcXVlcnkoJHNxbCk7Cn0KCmZ1bmN0aW9uIGZyKCRxeSl7CglteXNxbF9mcmVlX3Jlc3VsdCgkcXkpOwp9CgpmdW5jdGlvbiBzaXplY291bnQoJHNpemUpIHsKCWlmKCRzaXplID4gMTA3Mzc0MTgyNCkgewoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDczNzQxODI0ICogMTAwKSAvIDEwMCAuICcgRyc7Cgl9IGVsc2VpZigkc2l6ZSA+IDEwNDg1NzYpIHsKCQkkc2l6ZSA9IHJvdW5kKCRzaXplIC8gMTA0ODU3NiAqIDEwMCkgLyAxMDAgLiAnIE0nOwoJfSBlbHNlaWYoJHNpemUgPiAxMDI0KSB7CgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwMjQgKiAxMDApIC8gMTAwIC4gJyBLJzsKCX0gZWxzZSB7CgkJJHNpemUgPSAkc2l6ZSAuICcgQic7Cgl9CglyZXR1cm4gJHNpemU7Cn0KCi8vIFppcApjbGFzcyBQSFBaaXB7Cgl2YXIgJG91dD0nJzsKCWZ1bmN0aW9uIFBIUFppcCgkZGlyKQl7CgkJaWYgKEBmdW5jdGlvbl9leGlzdHMoJ2d6Y29tcHJlc3MnKSkJewoJCQkkY3VyZGlyID0gZ2V0Y3dkKCk7CgkJCWlmIChpc19hcnJheSgkZGlyKSkgJGZpbGVsaXN0ID0gJGRpcjsKCQkJZWxzZXsKCQkJCSRmaWxlbGlzdD0kdGhpcyAtPiBHZXRGaWxlTGlzdCgkZGlyKTsvL0ZpbGUgbGlzdAoJCQkJZm9yZWFjaCgkZmlsZWxpc3QgYXMgJGs9PiR2KSAkZmlsZWxpc3RbXT1zdWJzdHIoJHYsc3RybGVuKCRkaXIpKzEpOwoJCQl9CgkJCWlmICgoIWVtcHR5KCRkaXIpKSYmKCFpc19hcnJheSgkZGlyKSkmJihmaWxlX2V4aXN0cygkZGlyKSkpIGNoZGlyKCRkaXIpOwoJCQllbHNlIGNoZGlyKCRjdXJkaXIpOwoJCQlpZiAoY291bnQoJGZpbGVsaXN0KT4wKXsKCQkJCWZvcmVhY2goJGZpbGVsaXN0IGFzICRmaWxlbmFtZSl7CgkJCQkJaWYgKGlzX2ZpbGUoJGZpbGVuYW1lKSl7CgkJCQkJCSRmZCA9IGZvcGVuICgkZmlsZW5hbWUsICdyJyk7CgkJCQkJCSRjb250ZW50ID0gQGZyZWFkICgkZmQsIGZpbGVzaXplKCRmaWxlbmFtZSkpOwoJCQkJCQlmY2xvc2UgKCRmZCk7CgkJCQkJCWlmIChpc19hcnJheSgkZGlyKSkgJGZpbGVuYW1lID0gYmFzZW5hbWUoJGZpbGVuYW1lKTsKCQkJCQkJJHRoaXMgLT4gYWRkRmlsZSgkY29udGVudCwgJGZpbGVuYW1lKTsKCQkJCQl9CgkJCQl9CgkJCQkkdGhpcy0+b3V0ID0gJHRoaXMgLT4gZmlsZSgpOwoJCQkJY2hkaXIoJGN1cmRpcik7CgkJCX0KCQkJcmV0dXJuIDE7CgkJfQoJCWVsc2UgcmV0dXJuIDA7Cgl9CgoJLy8gU2hvdyBmaWxlIGxpc3QKCWZ1bmN0aW9uIEdldEZpbGVMaXN0KCRkaXIpewoJCXN0YXRpYyAkYTsKCQlpZiAoaXNfZGlyKCRkaXIpKSB7CgkJCWlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7CgkJCQl3aGlsZSAoJGZpbGUgPSByZWFkZGlyKCRkaCkpIHsKCQkJCQlpZigkZmlsZSE9Jy4nICYmICRmaWxlIT0nLi4nKXsKCQkJCQkJJGY9JGRpciAuJy8nLiAkZmlsZTsKCQkJCQkJaWYoaXNfZGlyKCRmKSkgJHRoaXMtPkdldEZpbGVMaXN0KCRmKTsKCQkJCQkJJGFbXT0kZjsKCQkJCQl9CgkJCQl9CgkJCQljbG9zZWRpcigkZGgpOwoJCQl9CgkJfQoJCXJldHVybiAkYTsKCX0KCgl2YXIgJGRhdGFzZWMgICAgICA9IGFycmF5KCk7Cgl2YXIgJGN0cmxfZGlyICAgICA9IGFycmF5KCk7Cgl2YXIgJGVvZl9jdHJsX2RpciA9ICJceDUwXHg0Ylx4MDVceDA2XHgwMFx4MDBceDAwXHgwMCI7Cgl2YXIgJG9sZF9vZmZzZXQgICA9IDA7CgoJZnVuY3Rpb24gdW5peDJEb3NUaW1lKCR1bml4dGltZSA9IDApIHsKCQkkdGltZWFycmF5ID0gKCR1bml4dGltZSA9PSAwKSA/IGdldGRhdGUoKSA6IGdldGRhdGUoJHVuaXh0aW1lKTsKCQlpZiAoJHRpbWVhcnJheVsneWVhciddIDwgMTk4MCkgewoJCQkkdGltZWFycmF5Wyd5ZWFyJ10gICAgPSAxOTgwOwoJCQkkdGltZWFycmF5Wydtb24nXSAgICAgPSAxOwoJCQkkdGltZWFycmF5WydtZGF5J10gICAgPSAxOwoJCQkkdGltZWFycmF5Wydob3VycyddICAgPSAwOwoJCQkkdGltZWFycmF5WydtaW51dGVzJ10gPSAwOwoJCQkkdGltZWFycmF5WydzZWNvbmRzJ10gPSAwOwoJCX0gLy8gZW5kIGlmCgkJcmV0dXJuICgoJHRpbWVhcnJheVsneWVhciddIC0gMTk4MCkgPDwgMjUpIHwgKCR0aW1lYXJyYXlbJ21vbiddIDw8IDIxKSB8ICgkdGltZWFycmF5WydtZGF5J10gPDwgMTYpIHwKCQkJCSgkdGltZWFycmF5Wydob3VycyddIDw8IDExKSB8ICgkdGltZWFycmF5WydtaW51dGVzJ10gPDwgNSkgfCAoJHRpbWVhcnJheVsnc2Vjb25kcyddID4+IDEpOwoJfQoKCWZ1bmN0aW9uIGFkZEZpbGUoJGRhdGEsICRuYW1lLCAkdGltZSA9IDApIHsKCQkkbmFtZSA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJG5hbWUpOwoKCQkkZHRpbWUgPSBkZWNoZXgoJHRoaXMtPnVuaXgyRG9zVGltZSgkdGltZSkpOwoJCSRoZXhkdGltZQk9ICdceCcgLiAkZHRpbWVbNl0gLiAkZHRpbWVbN10KCQkJCQkuICdceCcgLiAkZHRpbWVbNF0gLiAkZHRpbWVbNV0KCQkJCQkuICdceCcgLiAkZHRpbWVbMl0gLiAkZHRpbWVbM10KCQkJCQkuICdceCcgLiAkZHRpbWVbMF0gLiAkZHRpbWVbMV07CgkJZXZhbCgnJGhleGR0aW1lID0gIicgLiAkaGV4ZHRpbWUgLiAnIjsnKTsKCQkkZnIJPSAiXHg1MFx4NGJceDAzXHgwNCI7CgkJJGZyCS49ICJceDE0XHgwMCI7CgkJJGZyCS49ICJceDAwXHgwMCI7CgkJJGZyCS49ICJceDA4XHgwMCI7CgkJJGZyCS49ICRoZXhkdGltZTsKCgkJJHVuY19sZW4gPSBzdHJsZW4oJGRhdGEpOwoJCSRjcmMgPSBjcmMzMigkZGF0YSk7CgkJJHpkYXRhID0gZ3pjb21wcmVzcygkZGF0YSk7CgkJJGNfbGVuID0gc3RybGVuKCR6ZGF0YSk7CgkJJHpkYXRhID0gc3Vic3RyKHN1YnN0cigkemRhdGEsIDAsIHN0cmxlbigkemRhdGEpIC0gNCksIDIpOwoJCSRmciAuPSBwYWNrKCdWJywgJGNyYyk7CgkJJGZyIC49IHBhY2soJ1YnLCAkY19sZW4pOwoJCSRmciAuPSBwYWNrKCdWJywgJHVuY19sZW4pOwoJCSRmciAuPSBwYWNrKCd2Jywgc3RybGVuKCRuYW1lKSk7CgkJJGZyIC49IHBhY2soJ3YnLCAwKTsKCQkkZnIgLj0gJG5hbWU7CgkJJGZyIC49ICR6ZGF0YTsKCQkkZnIgLj0gcGFjaygnVicsICRjcmMpOwoJCSRmciAuPSBwYWNrKCdWJywgJGNfbGVuKTsKCQkkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsKCgkJJHRoaXMgLT4gZGF0YXNlY1tdID0gJGZyOwoJCSRuZXdfb2Zmc2V0ID0gc3RybGVuKGltcGxvZGUoJycsICR0aGlzLT5kYXRhc2VjKSk7CgoJCSRjZHJlYyA9ICJceDUwXHg0Ylx4MDFceDAyIjsKCQkkY2RyZWMgLj0gIlx4MDBceDAwIjsKCQkkY2RyZWMgLj0gIlx4MTRceDAwIjsKCQkkY2RyZWMgLj0gIlx4MDBceDAwIjsKCQkkY2RyZWMgLj0gIlx4MDhceDAwIjsKCQkkY2RyZWMgLj0gJGhleGR0aW1lOwoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJGNyYyk7CgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkY19sZW4pOwoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJHVuY19sZW4pOwoJCSRjZHJlYyAuPSBwYWNrKCd2Jywgc3RybGVuKCRuYW1lKSApOwoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOwoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOwoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOwoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOwoJCSRjZHJlYyAuPSBwYWNrKCdWJywgMzIgKTsKCQkkY2RyZWMgLj0gcGFjaygnVicsICR0aGlzIC0+IG9sZF9vZmZzZXQgKTsKCQkkdGhpcyAtPiBvbGRfb2Zmc2V0ID0gJG5ld19vZmZzZXQ7CgkJJGNkcmVjIC49ICRuYW1lOwoKCQkkdGhpcyAtPiBjdHJsX2RpcltdID0gJGNkcmVjOwoJfQoKCWZ1bmN0aW9uIGZpbGUoKSB7CgkJJGRhdGEgICAgPSBpbXBsb2RlKCcnLCAkdGhpcyAtPiBkYXRhc2VjKTsKCQkkY3RybGRpciA9IGltcGxvZGUoJycsICR0aGlzIC0+IGN0cmxfZGlyKTsKCQlyZXR1cm4gJGRhdGEgLiAkY3RybGRpciAuICR0aGlzIC0+IGVvZl9jdHJsX2RpciAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMgLT4gY3RybF9kaXIpKSAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMgLT4gY3RybF9kaXIpKSAuCXBhY2soJ1YnLCBzdHJsZW4oJGN0cmxkaXIpKSAuIHBhY2soJ1YnLCBzdHJsZW4oJGRhdGEpKSAuICJceDAwXHgwMCI7Cgl9Cn0KCi8vIER1bXAgbXlzcWwKZnVuY3Rpb24gc3FsZHVtcHRhYmxlKCR0YWJsZSwgJGZwPTApIHsKCSR0YWJsZWR1bXAgPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgJHRhYmxlO1xuIjsKCSR0YWJsZWR1bXAgLj0gIkNSRUFURSBUQUJMRSAkdGFibGUgKFxuIjsKCgkkZmlyc3RmaWVsZD0xOwoKCSRmaWVsZHMgPSBxKCJTSE9XIEZJRUxEUyBGUk9NICR0YWJsZSIpOwoJd2hpbGUgKCRmaWVsZCA9IG15c3FsX2ZldGNoX2FycmF5KCRmaWVsZHMpKSB7CgkJaWYgKCEkZmlyc3RmaWVsZCkgewoJCQkkdGFibGVkdW1wIC49ICIsXG4iOwoJCX0gZWxzZSB7CgkJCSRmaXJzdGZpZWxkPTA7CgkJfQoJCSR0YWJsZWR1bXAgLj0gIiAgICRmaWVsZFtGaWVsZF0gJGZpZWxkW1R5cGVdIjsKCQlpZiAoIWVtcHR5KCRmaWVsZFsiRGVmYXVsdCJdKSkgewoJCQkkdGFibGVkdW1wIC49ICIgREVGQVVMVCAnJGZpZWxkW0RlZmF1bHRdJyI7CgkJfQoJCWlmICgkZmllbGRbJ051bGwnXSAhPSAiWUVTIikgewoJCQkkdGFibGVkdW1wIC49ICIgTk9UIE5VTEwiOwoJCX0KCQlpZiAoJGZpZWxkWydFeHRyYSddICE9ICIiKSB7CgkJCSR0YWJsZWR1bXAgLj0gIiAkZmllbGRbRXh0cmFdIjsKCQl9Cgl9CglmcigkZmllbGRzKTsKCgkka2V5cyA9IHEoIlNIT1cgS0VZUyBGUk9NICR0YWJsZSIpOwoJd2hpbGUgKCRrZXkgPSBteXNxbF9mZXRjaF9hcnJheSgka2V5cykpIHsKCQkka25hbWU9JGtleVsnS2V5X25hbWUnXTsKCQlpZiAoJGtuYW1lICE9ICJQUklNQVJZIiAmJiAka2V5WydOb25fdW5pcXVlJ10gPT0gMCkgewoJCQkka25hbWU9IlVOSVFVRXwka25hbWUiOwoJCX0KCQlpZighaXNfYXJyYXkoJGluZGV4WyRrbmFtZV0pKSB7CgkJCSRpbmRleFska25hbWVdID0gYXJyYXkoKTsKCQl9CgkJJGluZGV4WyRrbmFtZV1bXSA9ICRrZXlbJ0NvbHVtbl9uYW1lJ107Cgl9Cglmcigka2V5cyk7CgoJd2hpbGUobGlzdCgka25hbWUsICRjb2x1bW5zKSA9IEBlYWNoKCRpbmRleCkpIHsKCQkkdGFibGVkdW1wIC49ICIsXG4iOwoJCSRjb2xuYW1lcz1pbXBsb2RlKCRjb2x1bW5zLCIsIik7CgoJCWlmICgka25hbWUgPT0gIlBSSU1BUlkiKSB7CgkJCSR0YWJsZWR1bXAgLj0gIiAgIFBSSU1BUlkgS0VZICgkY29sbmFtZXMpIjsKCQl9IGVsc2UgewoJCQlpZiAoc3Vic3RyKCRrbmFtZSwwLDYpID09ICJVTklRVUUiKSB7CgkJCQkka25hbWU9c3Vic3RyKCRrbmFtZSw3KTsKCQkJfQoJCQkkdGFibGVkdW1wIC49ICIgICBLRVkgJGtuYW1lICgkY29sbmFtZXMpIjsKCQl9Cgl9CgoJJHRhYmxlZHVtcCAuPSAiXG4pO1xuXG4iOwoJaWYgKCRmcCkgewoJCWZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7Cgl9IGVsc2UgewoJCWVjaG8gJHRhYmxlZHVtcDsKCX0KCgkkcm93cyA9IHEoIlNFTEVDVCAqIEZST00gJHRhYmxlIik7CgkkbnVtZmllbGRzID0gbXlzcWxfbnVtX2ZpZWxkcygkcm93cyk7Cgl3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyb3dzKSkgewoJCSR0YWJsZWR1bXAgPSAiSU5TRVJUIElOVE8gJHRhYmxlIFZBTFVFUygiOwoKCQkkZmllbGRjb3VudGVyPS0xOwoJCSRmaXJzdGZpZWxkPTE7CgkJd2hpbGUgKCsrJGZpZWxkY291bnRlcjwkbnVtZmllbGRzKSB7CgkJCWlmICghJGZpcnN0ZmllbGQpIHsKCQkJCSR0YWJsZWR1bXAuPSIsICI7CgkJCX0gZWxzZSB7CgkJCQkkZmlyc3RmaWVsZD0wOwoJCQl9CgoJCQlpZiAoIWlzc2V0KCRyb3dbJGZpZWxkY291bnRlcl0pKSB7CgkJCQkkdGFibGVkdW1wIC49ICJOVUxMIjsKCQkJfSBlbHNlIHsKCQkJCSR0YWJsZWR1bXAgLj0gIiciLm15c3FsX2VzY2FwZV9zdHJpbmcoJHJvd1skZmllbGRjb3VudGVyXSkuIiciOwoJCQl9CgkJfQoKCQkkdGFibGVkdW1wIC49ICIpO1xuIjsKCgkJaWYgKCRmcCkgewoJCQlmd3JpdGUoJGZwLCR0YWJsZWR1bXApOwoJCX0gZWxzZSB7CgkJCWVjaG8gJHRhYmxlZHVtcDsKCQl9Cgl9Cglmcigkcm93cyk7CglpZiAoJGZwKSB7CgkJZndyaXRlKCRmcCwiXG4iKTsKCX0gZWxzZSB7CgkJZWNobyAiXG4iOwoJfQp9CgpmdW5jdGlvbiB1ZSgkc3RyKXsKCXJldHVybiB1cmxlbmNvZGUoJHN0cik7Cn0KCmZ1bmN0aW9uIHAoJHN0cil7CgllY2hvICRzdHIuIlxuIjsKfQoKZnVuY3Rpb24gdGJoZWFkKCkgewoJcCgnPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Jyk7Cn0KZnVuY3Rpb24gdGJmb290KCl7CglwKCc8L3RhYmxlPicpOwp9CgpmdW5jdGlvbiBtYWtlaGlkZSgkbmFtZSwkdmFsdWU9JycpewoJcCgiPGlucHV0IGlkPVwiJG5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiRuYW1lXCIgdmFsdWU9XCIkdmFsdWVcIiAvPiIpOwp9CgpmdW5jdGlvbiBtYWtlaW5wdXQoJGFyZyA9IGFycmF5KCkpewoJJGFyZ1snc2l6ZSddID0gJGFyZ1snc2l6ZSddID4gMCA/ICJzaXplPVwiJGFyZ1tzaXplXVwiIiA6ICJzaXplPVwiMTAwXCIiOwoJJGFyZ1snZXh0cmEnXSA9ICRhcmdbJ2V4dHJhJ10gPyAkYXJnWydleHRyYSddIDogJyc7CgkhJGFyZ1sndHlwZSddICYmICRhcmdbJ3R5cGUnXSA9ICd0ZXh0JzsKCSRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXS4nPGJyIC8+JyA6ICcnOwoJJGFyZ1snY2xhc3MnXSA9ICRhcmdbJ2NsYXNzJ10gPyAkYXJnWydjbGFzcyddIDogJ2lucHV0JzsKCWlmICgkYXJnWyduZXdsaW5lJ10pIHsKCQlwKCI8cD4kYXJnW3RpdGxlXTxpbnB1dCBjbGFzcz1cIiRhcmdbY2xhc3NdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBpZD1cIiRhcmdbbmFtZV1cIiB2YWx1ZT1cIiRhcmdbdmFsdWVdXCIgdHlwZT1cIiRhcmdbdHlwZV1cIiAkYXJnW3NpemVdICRhcmdbZXh0cmFdIC8+PC9wPiIpOwoJfSBlbHNlIHsKCQlwKCIkYXJnW3RpdGxlXTxpbnB1dCBjbGFzcz1cIiRhcmdbY2xhc3NdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBpZD1cIiRhcmdbbmFtZV1cIiB2YWx1ZT1cIiRhcmdbdmFsdWVdXCIgdHlwZT1cIiRhcmdbdHlwZV1cIiAkYXJnW3NpemVdICRhcmdbZXh0cmFdIC8+Iik7Cgl9Cn0KCmZ1bmN0aW9uIG1ha2VzZWxlY3QoJGFyZyA9IGFycmF5KCkpewoJaWYgKCRhcmdbJ29uY2hhbmdlJ10pIHsKCQkkb25jaGFuZ2UgPSAnb25jaGFuZ2U9IicuJGFyZ1snb25jaGFuZ2UnXS4nIic7Cgl9CgkkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10gOiAnJzsKCWlmICgkYXJnWyduZXdsaW5lJ10pIHAoJzxwPicpOwoJcCgiJGFyZ1t0aXRsZV0gPHNlbGVjdCBjbGFzcz1cImlucHV0XCIgaWQ9XCIkYXJnW25hbWVdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiAkb25jaGFuZ2U+Iik7CgkJaWYgKGlzX2FycmF5KCRhcmdbJ29wdGlvbiddKSkgewoJCQlmb3JlYWNoICgkYXJnWydvcHRpb24nXSBhcyAka2V5PT4kdmFsdWUpIHsKCQkJCWlmICgkYXJnWydzZWxlY3RlZCddPT0ka2V5KSB7CgkJCQkJcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIiBzZWxlY3RlZD4kdmFsdWU8L29wdGlvbj4iKTsKCQkJCX0gZWxzZSB7CgkJCQkJcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIj4kdmFsdWU8L29wdGlvbj4iKTsKCQkJCX0KCQkJfQoJCX0KCXAoIjwvc2VsZWN0PiIpOwoJaWYgKCRhcmdbJ25ld2xpbmUnXSkgcCgnPC9wPicpOwp9CmZ1bmN0aW9uIGZvcm1oZWFkKCRhcmcgPSBhcnJheSgpKSB7CgkhJGFyZ1snbWV0aG9kJ10gJiYgJGFyZ1snbWV0aG9kJ10gPSAncG9zdCc7CgkhJGFyZ1snYWN0aW9uJ10gJiYgJGFyZ1snYWN0aW9uJ10gPSAkc2VsZjsKCSRhcmdbJ3RhcmdldCddID0gJGFyZ1sndGFyZ2V0J10gPyAidGFyZ2V0PVwiJGFyZ1t0YXJnZXRdXCIiIDogJyc7CgkhJGFyZ1snbmFtZSddICYmICRhcmdbJ25hbWUnXSA9ICdmb3JtMSc7CglwKCI8Zm9ybSBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIGFjdGlvbj1cIiRhcmdbYWN0aW9uXVwiIG1ldGhvZD1cIiRhcmdbbWV0aG9kXVwiICRhcmdbdGFyZ2V0XT4iKTsKCWlmICgkYXJnWyd0aXRsZSddKSB7CgkJcCgnPGgyPicuJGFyZ1sndGl0bGUnXS4nICZyYXF1bzs8L2gyPicpOwoJfQp9CgkKZnVuY3Rpb24gbWFrZXRleHQoJGFyZyA9IGFycmF5KCkpewoJISRhcmdbJ2NvbHMnXSAmJiAkYXJnWydjb2xzJ10gPSAxMDA7CgkhJGFyZ1sncm93cyddICYmICRhcmdbJ3Jvd3MnXSA9IDI1OwoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddLic8YnIgLz4nIDogJyc7CglwKCI8cD4kYXJnW3RpdGxlXTx0ZXh0YXJlYSBjbGFzcz1cImFyZWFcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGNvbHM9XCIkYXJnW2NvbHNdXCIgcm93cz1cIiRhcmdbcm93c11cIiAkYXJnW2V4dHJhXT4kYXJnW3ZhbHVlXTwvdGV4dGFyZWE+PC9wPiIpOwp9CgpmdW5jdGlvbiBmb3JtZm9vdGVyKCRuYW1lID0gJycpewoJISRuYW1lICYmICRuYW1lID0gJ3N1Ym1pdCc7CglwKCc8cD48aW5wdXQgY2xhc3M9ImJ0IiBuYW1lPSInLiRuYW1lLiciIGlkPVwiJy4kbmFtZS4nXCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ij48L3A+Jyk7CglwKCc8L2Zvcm0+Jyk7Cn0KCmZ1bmN0aW9uIGZvcm1mb290KCl7CglwKCc8L2Zvcm0+Jyk7Cn0KCi8vIEV4aXQKZnVuY3Rpb24gcHIoJGEpIHsKCWVjaG8gJzxwcmU+JzsKCXByaW50X3IoJGEpOwoJZWNobyAnPC9wcmU+JzsKfQoKPz4=")); ?>