请使用网页小工具栏Base64储存文件工具解码获取tdl_gui.py
json
{
"version": "1.1",
"createdAt": "2026-08-02T07:59:48.717Z",
"compressionSupported": true,
"files": [
{
"name": "tdl_gui.py",
"extension": "py",
"type": "text/x-python",
"size": 60613,
"lastModified": 1784275851622,
"encoding": "base64",
"compression": "none",
"compressedSize": 60613,
"data": "aW1wb3J0IHRraW50ZXIgYXMgdGsKZnJvbSB0a2ludGVyIGltcG9ydCB0dGssIGZpbGVkaWFsb2csIG1lc3NhZ2Vib3gsIHNjcm9sbGVkdGV4dAppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQgb3MKaW1wb3J0IHN5cwppZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIiBhbmQgbm90IGdldGF0dHIoc3lzLCAnZnJvemVuJywgRmFsc2UpOgogICAgaWYgc3lzLmV4ZWN1dGFibGUgYW5kIHN5cy5leGVjdXRhYmxlLmVuZHN3aXRoKCdweXRob24uZXhlJyk6CiAgICAgICAgaW1wb3J0IG9zIGFzIF9vcwogICAgICAgIF9wdyA9IHN5cy5leGVjdXRhYmxlLnJlcGxhY2UoJ3B5dGhvbi5leGUnLCAncHl0aG9udy5leGUnKQogICAgICAgIGlmIF9vcy5wYXRoLmV4aXN0cyhfcHcpOgogICAgICAgICAgICBpbXBvcnQgc3VicHJvY2VzcyBhcyBfc3AKICAgICAgICAgICAgX3NwLlBvcGVuKFtfcHddICsgc3lzLmFyZ3YpCiAgICAgICAgICAgIHN5cy5leGl0KCkKaW1wb3J0IHVybGxpYi5yZXF1ZXN0CmltcG9ydCB6aXBmaWxlCmltcG9ydCB3aW5yZWcKaW1wb3J0IGpzb24KaW1wb3J0IHJlCgpjbGFzcyBUb29sVGlwOgogICAgIiIi566A5Y2V55qE5oKs5rWu5o+Q56S65qGGIChUb29sdGlwKSDlrp7njrAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aWRnZXQsIHRleHQpOgogICAgICAgIHNlbGYud2lkZ2V0ID0gd2lkZ2V0CiAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAogICAgICAgIHNlbGYudG9vbHRpcF93aW5kb3cgPSBOb25lCiAgICAgICAgc2VsZi53aWRnZXQuYmluZCgiPEVudGVyPiIsIHNlbGYuZW50ZXIpCiAgICAgICAgc2VsZi53aWRnZXQuYmluZCgiPExlYXZlPiIsIHNlbGYubGVhdmUpCgogICAgZGVmIGVudGVyKHNlbGYsIGV2ZW50PU5vbmUpOgogICAgICAgIHgsIHksIF8sIF8gPSBzZWxmLndpZGdldC5iYm94KCJpbnNlcnQiKQogICAgICAgIHggKz0gc2VsZi53aWRnZXQud2luZm9fcm9vdHgoKSArIDI1CiAgICAgICAgeSArPSBzZWxmLndpZGdldC53aW5mb19yb290eSgpICsgMjUKICAgICAgICAKICAgICAgICBzZWxmLnRvb2x0aXBfd2luZG93ID0gdHcgPSB0ay5Ub3BsZXZlbChzZWxmLndpZGdldCkKICAgICAgICB0dy53bV9vdmVycmlkZXJlZGlyZWN0KFRydWUpCiAgICAgICAgdHcud21fZ2VvbWV0cnkoZiIre3h9K3t5fSIpCiAgICAgICAgCiAgICAgICAgbGFiZWwgPSB0ay5MYWJlbCh0dywgdGV4dD1zZWxmLnRleHQsIGp1c3RpZnk9dGsuTEVGVCwKICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9IiNmZmZmZTAiLCByZWxpZWY9dGsuU09MSUQsIGJvcmRlcndpZHRoPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICBmb250PSgidGFob21hIiwgIjkiLCAibm9ybWFsIiksIHBhZHg9MywgcGFkeT0zKQogICAgICAgIGxhYmVsLnBhY2soaXBhZHg9MSkKCiAgICBkZWYgbGVhdmUoc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgaWYgc2VsZi50b29sdGlwX3dpbmRvdzoKICAgICAgICAgICAgc2VsZi50b29sdGlwX3dpbmRvdy5kZXN0cm95KCkKICAgICAgICAgICAgc2VsZi50b29sdGlwX3dpbmRvdyA9IE5vbmUKCmNsYXNzIFRETEd1aUFwcDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290KToKICAgICAgICBzZWxmLnJvb3QgPSByb290CiAgICAgICAgc2VsZi5yb290LnRpdGxlKCJUREwgTWFuYWdlciBHVUkgLSDlrozlhajniYgiKQogICAgICAgIHNlbGYucm9vdC5nZW9tZXRyeSgiOTAweDgwMCIpCiAgICAgICAgCiAgICAgICAgc2VsZi5vdXRwdXRfcXVldWUgPSBxdWV1ZS5RdWV1ZSgpCiAgICAgICAgc2VsZi5jdXJyZW50X3Byb2Nlc3MgPSBOb25lCiAgICAgICAgc2VsZi5jb25maWdfZmlsZSA9ICJ0ZGxfZ3VpX2NvbmZpZy5qc29uIgogICAgICAgIAogICAgICAgIHNlbGYuY3JlYXRlX3dpZGdldHMoKQogICAgICAgIHNlbGYubG9hZF9jb25maWcoKQogICAgICAgIHNlbGYucHJvY2Vzc19xdWV1ZSgpCiAgICAgICAgCiAgICAgICAgIyBTYXZlIGNvbmZpZyBvbiB3aW5kb3cgY2xvc2UKICAgICAgICBzZWxmLnJvb3QucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLm9uX2Nsb3NpbmcpCiAgICAgICAgCiAgICBkZWYgY3JlYXRlX3dpZGdldHMoc2VsZik6CiAgICAgICAgc2VsZi5ub3RlYm9vayA9IHR0ay5Ob3RlYm9vayhzZWxmLnJvb3QpCiAgICAgICAgc2VsZi5ub3RlYm9vay5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUsIHBhZHg9NSwgcGFkeT01KQogICAgICAgIAogICAgICAgICMg5LyY5YyW5qCH562+6aG16aG65bqP77ya5YWo5bGA6K6+572uIC0+IOeZu+W9lSAtPiDlt6Xlhbco5YyF5ZCr5YiX5Ye66IGK5aSp44CB5a+85Ye65oiQ5ZGY44CB5raI5oGv562J6aKE5aSE55CG5bel5YW3KSAtPiDkuIvovb0gLT4g5LiK5LygIC0+IOi9rOWPkQogICAgICAgIHNlbGYudGFiX2dsb2JhbCA9IHR0ay5GcmFtZShzZWxmLm5vdGVib29rKQogICAgICAgIHNlbGYudGFiX2xvZ2luID0gdHRrLkZyYW1lKHNlbGYubm90ZWJvb2spCiAgICAgICAgc2VsZi50YWJfdG9vbHMgPSB0dGsuRnJhbWUoc2VsZi5ub3RlYm9vaykKICAgICAgICBzZWxmLnRhYl9kb3dubG9hZCA9IHR0ay5GcmFtZShzZWxmLm5vdGVib29rKQogICAgICAgIHNlbGYudGFiX3VwbG9hZCA9IHR0ay5GcmFtZShzZWxmLm5vdGVib29rKQogICAgICAgIHNlbGYudGFiX2ZvcndhcmQgPSB0dGsuRnJhbWUoc2VsZi5ub3RlYm9vaykKICAgICAgICBzZWxmLnRhYl9lbnYgPSB0dGsuRnJhbWUoc2VsZi5ub3RlYm9vaykKICAgICAgICAKICAgICAgICBzZWxmLm5vdGVib29rLmFkZChzZWxmLnRhYl9lbnYsIHRleHQ9IjAuIOeOr+Wig+ajgOafpSAoRW52KSIpCiAgICAgICAgc2VsZi5ub3RlYm9vay5hZGQoc2VsZi50YWJfZ2xvYmFsLCB0ZXh0PSIxLiDlhajlsYDorr7nva4gKEdsb2JhbCkiKQogICAgICAgIHNlbGYubm90ZWJvb2suYWRkKHNlbGYudGFiX2xvZ2luLCB0ZXh0PSIyLiDnmbvlvZUgKExvZ2luKSIpCiAgICAgICAgc2VsZi5ub3RlYm9vay5hZGQoc2VsZi50YWJfdG9vbHMsIHRleHQ9IjMuIOW3peWFtyAoVG9vbHMpIikKICAgICAgICBzZWxmLm5vdGVib29rLmFkZChzZWxmLnRhYl9kb3dubG9hZCwgdGV4dD0iNC4g5LiL6L29IChEb3dubG9hZCkiKQogICAgICAgIHNlbGYubm90ZWJvb2suYWRkKHNlbGYudGFiX3VwbG9hZCwgdGV4dD0iNS4g5LiK5LygIChVcGxvYWQpIikKICAgICAgICBzZWxmLm5vdGVib29rLmFkZChzZWxmLnRhYl9mb3J3YXJkLCB0ZXh0PSI2LiDovazlj5EgKEZvcndhcmQpIikKICAgICAgICAKICAgICAgICBzZWxmLnNldHVwX2Vudl90YWIoKQogICAgICAgIHNlbGYuc2V0dXBfZ2xvYmFsX3RhYigpCiAgICAgICAgc2VsZi5zZXR1cF9sb2dpbl90YWIoKQogICAgICAgIHNlbGYuc2V0dXBfdG9vbHNfdGFiKCkKICAgICAgICBzZWxmLnNldHVwX2Rvd25sb2FkX3RhYigpCiAgICAgICAgc2VsZi5zZXR1cF91cGxvYWRfdGFiKCkKICAgICAgICBzZWxmLnNldHVwX2ZvcndhcmRfdGFiKCkKICAgICAgICAKICAgICAgICBjb25zb2xlX2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUoc2VsZi5yb290LCB0ZXh0PSLmjqfliLblj7DovpPlh7ogKENvbnNvbGUgT3V0cHV0KSIpCiAgICAgICAgY29uc29sZV9mcmFtZS5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPUZhbHNlLCBwYWR4PTUsIHBhZHk9NSkKICAgICAgICAKICAgICAgICBwcm9ncmVzc19mcmFtZSA9IHR0ay5GcmFtZShjb25zb2xlX2ZyYW1lKQogICAgICAgIHByb2dyZXNzX2ZyYW1lLnBhY2soZmlsbD10ay5YLCBwYWR4PTUsIHBhZHk9MikKICAgICAgICAKICAgICAgICBzZWxmLnByb2dyZXNzX3ZhciA9IHRrLkRvdWJsZVZhcih2YWx1ZT0wKQogICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyID0gdHRrLlByb2dyZXNzYmFyKHByb2dyZXNzX2ZyYW1lLCB2YXJpYWJsZT1zZWxmLnByb2dyZXNzX3ZhciwgbWF4aW11bT0xMDAsIGxlbmd0aD00MDAsIG1vZGU9J2RldGVybWluYXRlJykKICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0oMCwgMTApKQogICAgICAgIAogICAgICAgIHNlbGYucHJvZ3Jlc3NfbGFiZWwgPSB0dGsuTGFiZWwocHJvZ3Jlc3NfZnJhbWUsIHRleHQ9IuWwsee7qiIsIHdpZHRoPTUwKQogICAgICAgIHNlbGYucHJvZ3Jlc3NfbGFiZWwucGFjayhzaWRlPXRrLkxFRlQpCiAgICAgICAgCiAgICAgICAgc2VsZi5jb25zb2xlX3RleHQgPSBzY3JvbGxlZHRleHQuU2Nyb2xsZWRUZXh0KGNvbnNvbGVfZnJhbWUsIGhlaWdodD0xMCwgc3RhdGU9J2Rpc2FibGVkJywgYmc9J2JsYWNrJywgZmc9J3doaXRlJykKICAgICAgICBzZWxmLmNvbnNvbGVfdGV4dC5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUsIHBhZHg9NSwgcGFkeT01KQogICAgICAgIAogICAgICAgIGJ0bl9mcmFtZSA9IHR0ay5GcmFtZShjb25zb2xlX2ZyYW1lKQogICAgICAgIGJ0bl9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT01KQogICAgICAgIAogICAgICAgIHNlbGYuc3RvcF9idG4gPSB0dGsuQnV0dG9uKGJ0bl9mcmFtZSwgdGV4dD0i5YGc5q2i5b2T5YmN5Lu75YqhIChTdG9wIFRhc2spIiwgY29tbWFuZD1zZWxmLnN0b3BfdGFzaywgc3RhdGU9dGsuRElTQUJMRUQpCiAgICAgICAgc2VsZi5zdG9wX2J0bi5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01LCBleHBhbmQ9VHJ1ZSkKICAgICAgICAKICAgICAgICB0dGsuQnV0dG9uKGJ0bl9mcmFtZSwgdGV4dD0i5riF56m65pel5b+XIChDbGVhcikiLCBjb21tYW5kPXNlbGYuY2xlYXJfY29uc29sZSkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKCiAgICBkZWYgY2xlYXJfY29uc29sZShzZWxmKToKICAgICAgICBzZWxmLmNvbnNvbGVfdGV4dC5jb25maWcoc3RhdGU9J25vcm1hbCcpCiAgICAgICAgc2VsZi5jb25zb2xlX3RleHQuZGVsZXRlKCIxLjAiLCB0ay5FTkQpCiAgICAgICAgc2VsZi5jb25zb2xlX3RleHQuY29uZmlnKHN0YXRlPSdkaXNhYmxlZCcpCiAgICAgICAgc2VsZi5wcm9ncmVzc192YXIuc2V0KDApCiAgICAgICAgc2VsZi5wcm9ncmVzc19sYWJlbC5jb25maWcodGV4dD0i5bCx57uqIikKCiAgICBkZWYgbG9hZF9jb25maWcoc2VsZik6CiAgICAgICAgIiIi5Yqg6L295oyB5LmF5YyW6YWN572uIiIiCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5jb25maWdfZmlsZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmNvbmZpZ19maWxlLCAiciIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ganNvbi5sb2FkKGYpCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAiaW5zdGFsbF9kaXIiIGluIGNvbmZpZzogc2VsZi5pbnN0YWxsX2Rpcl92YXIuc2V0KGNvbmZpZ1siaW5zdGFsbF9kaXIiXSkKICAgICAgICAgICAgICAgIGlmICJnYl9ucyIgaW4gY29uZmlnOiBzZWxmLmdiX25zLnNldChjb25maWdbImdiX25zIl0pCiAgICAgICAgICAgICAgICBpZiAiZ2JfcHJveHkiIGluIGNvbmZpZzogc2VsZi5nYl9wcm94eS5zZXQoY29uZmlnWyJnYl9wcm94eSJdKQogICAgICAgICAgICAgICAgaWYgImdiX3N0b3JhZ2UiIGluIGNvbmZpZzogc2VsZi5nYl9zdG9yYWdlLnNldChjb25maWdbImdiX3N0b3JhZ2UiXSkKICAgICAgICAgICAgICAgIGlmICJkbF9kaXIiIGluIGNvbmZpZzogc2VsZi5kbF9kaXJfdmFyLnNldChjb25maWdbImRsX2RpciJdKQogICAgICAgICAgICAgICAgaWYgInVwX2NoYXQiIGluIGNvbmZpZzogc2VsZi51cF9jaGF0X3Zhci5zZXQoY29uZmlnWyJ1cF9jaGF0Il0pCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHByaW50KGYiRmFpbGVkIHRvIGxvYWQgY29uZmlnOiB7ZX0iKQoKICAgIGRlZiBvbl9jbG9zaW5nKHNlbGYpOgogICAgICAgICIiIueql+WPo+WFs+mXreaXtuS/neWtmOmFjee9riIiIgogICAgICAgIGNvbmZpZyA9IHsKICAgICAgICAgICAgImluc3RhbGxfZGlyIjogc2VsZi5pbnN0YWxsX2Rpcl92YXIuZ2V0KCksCiAgICAgICAgICAgICJnYl9ucyI6IHNlbGYuZ2JfbnMuZ2V0KCksCiAgICAgICAgICAgICJnYl9wcm94eSI6IHNlbGYuZ2JfcHJveHkuZ2V0KCksCiAgICAgICAgICAgICJnYl9zdG9yYWdlIjogc2VsZi5nYl9zdG9yYWdlLmdldCgpLAogICAgICAgICAgICAiZGxfZGlyIjogc2VsZi5kbF9kaXJfdmFyLmdldCgpLAogICAgICAgICAgICAidXBfY2hhdCI6IHNlbGYudXBfY2hhdF92YXIuZ2V0KCkKICAgICAgICB9CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5jb25maWdfZmlsZSwgInciLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgICAgICAgICAganNvbi5kdW1wKGNvbmZpZywgZiwgaW5kZW50PTQpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludChmIkZhaWxlZCB0byBzYXZlIGNvbmZpZzoge2V9IikKICAgICAgICAKICAgICAgICBzZWxmLnJvb3QuZGVzdHJveSgpCgogICAgZGVmIHNldHVwX2xvZ2luX3RhYihzZWxmKToKICAgICAgICBmcmFtZSA9IHR0ay5GcmFtZShzZWxmLnRhYl9sb2dpbiwgcGFkZGluZz0yMCkKICAgICAgICBmcmFtZS5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUpCiAgICAgICAgCiAgICAgICAgdHRrLkxhYmVsKGZyYW1lLCB0ZXh0PSLmj5DnpLo6IOeZu+W9leaTjeS9nOWwhuS8muWcqOaWsOe7iOerr+eql+WPo+S4reaJk+W8gO+8jOivt+WcqOW8ueWHuueahOeql+WPo+S4reaMieaPkOekuuaTjeS9nOOAgiIsIGZvbnQ9KCIiLCAxMCkpLnBhY2soYW5jaG9yPXRrLlcsIHBhZHk9KDAsIDEwKSkKICAgICAgICAKICAgICAgICBkZXNrdG9wX2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUoZnJhbWUsIHRleHQ9IjEuIOahjOmdouWuouaIt+err+eZu+W9lSIsIHBhZGRpbmc9MTApCiAgICAgICAgZGVza3RvcF9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT01KQogICAgICAgIHR0ay5MYWJlbChkZXNrdG9wX2ZyYW1lLCB0ZXh0PSJUZWxlZ3JhbSBEZXNrdG9wIOi3r+W+hCAo55WZ56m65L2/55So6buY6K6kKToiKS5wYWNrKHNpZGU9dGsuTEVGVCkKICAgICAgICBzZWxmLmRlc2t0b3BfcGF0aF92YXIgPSB0ay5TdHJpbmdWYXIoKQogICAgICAgIHR0ay5FbnRyeShkZXNrdG9wX2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi5kZXNrdG9wX3BhdGhfdmFyLCB3aWR0aD00MCkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICB0dGsuQnV0dG9uKGRlc2t0b3BfZnJhbWUsIHRleHQ9IueZu+W9lSIsIGNvbW1hbmQ9c2VsZi5sb2dpbl9kZXNrdG9wKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01KQogICAgICAgIAogICAgICAgIHFyX2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUoZnJhbWUsIHRleHQ9IjIuIOS6jOe7tOeggeeZu+W9lSIsIHBhZGRpbmc9MTApCiAgICAgICAgcXJfZnJhbWUucGFjayhmaWxsPXRrLlgsIHBhZHk9NSkKICAgICAgICB0dGsuTGFiZWwocXJfZnJhbWUsIHRleHQ9IuS9v+eUqOaJi+acuiBUZWxlZ3JhbSBBcHAg5omr5o+P5LqM57u056CBIikucGFjayhzaWRlPXRrLkxFRlQpCiAgICAgICAgdHRrLkJ1dHRvbihxcl9mcmFtZSwgdGV4dD0i6I635Y+W5LqM57u056CB5bm255m75b2VIiwgY29tbWFuZD1zZWxmLmxvZ2luX3FyKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0xNSkKICAgICAgICAKICAgICAgICBjb2RlX2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUoZnJhbWUsIHRleHQ9IjMuIOaJi+acuumqjOivgeeggeeZu+W9lSIsIHBhZGRpbmc9MTApCiAgICAgICAgY29kZV9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT01KQogICAgICAgIHR0ay5MYWJlbChjb2RlX2ZyYW1lLCB0ZXh0PSLovpPlhaXmiYvmnLrlj7fmjqXmlLbpqozor4HnoIEiKS5wYWNrKHNpZGU9dGsuTEVGVCkKICAgICAgICB0dGsuQnV0dG9uKGNvZGVfZnJhbWUsIHRleHQ9IuaJi+acuumqjOivgeeggeeZu+W9lSIsIGNvbW1hbmQ9c2VsZi5sb2dpbl9jb2RlKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0xNSkKCiAgICBkZWYgc2V0dXBfZG93bmxvYWRfdGFiKHNlbGYpOgogICAgICAgIHRvcF9mcmFtZSA9IHR0ay5GcmFtZShzZWxmLnRhYl9kb3dubG9hZCwgcGFkZGluZz0xMCkKICAgICAgICB0b3BfZnJhbWUucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlKQogICAgICAgIAogICAgICAgIHVybF9mcmFtZSA9IHR0ay5MYWJlbEZyYW1lKHRvcF9mcmFtZSwgdGV4dD0i6ZO+5o6lIChVUkxzKSAtIOavj+ihjOS4gOS4qiIsIHBhZGRpbmc9NSkKICAgICAgICB1cmxfZnJhbWUucGFjayhzaWRlPXRrLkxFRlQsIGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUsIHBhZHg9KDAsIDUpKQogICAgICAgIFRvb2xUaXAodXJsX2ZyYW1lLCAi5pSv5oyB6L6T5YWl5aSa5Liq5raI5oGv6ZO+5o6l77yM5L6L5aaCOlxuaHR0cHM6Ly90Lm1lL3RkbC8xIikKICAgICAgICBzZWxmLmRsX3VybF90ZXh0ID0gc2Nyb2xsZWR0ZXh0LlNjcm9sbGVkVGV4dCh1cmxfZnJhbWUsIHdpZHRoPTMwLCBoZWlnaHQ9NikKICAgICAgICBzZWxmLmRsX3VybF90ZXh0LnBhY2soZmlsbD10ay5CT1RILCBleHBhbmQ9VHJ1ZSkKICAgICAgICAKICAgICAgICBqc29uX2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUodG9wX2ZyYW1lLCB0ZXh0PSJKU09OIOWvvOWHuuaWh+S7tiIsIHBhZGRpbmc9NSkKICAgICAgICBqc29uX2ZyYW1lLnBhY2soc2lkZT10ay5SSUdIVCwgZmlsbD10ay5CT1RILCBleHBhbmQ9VHJ1ZSwgcGFkeD0oNSwgMCkpCiAgICAgICAgVG9vbFRpcChqc29uX2ZyYW1lLCAi5pSv5oyB5a+85YWl5LuOIFRlbGVncmFtIOaIliB0ZGwg5a+85Ye655qEIEpTT04g5Y6G5Y+y6K6w5b2V5paH5Lu2IikKICAgICAgICBzZWxmLmRsX2pzb25fbGlzdGJveCA9IHRrLkxpc3Rib3goanNvbl9mcmFtZSwgaGVpZ2h0PTUpCiAgICAgICAgc2VsZi5kbF9qc29uX2xpc3Rib3gucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlKQogICAgICAgIGJ0bl9mcmFtZSA9IHR0ay5GcmFtZShqc29uX2ZyYW1lKQogICAgICAgIGJ0bl9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT0yKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSLmt7vliqAiLCBjb21tYW5kPXNlbGYuYWRkX2RsX2pzb24pLnBhY2soc2lkZT10ay5MRUZULCBleHBhbmQ9VHJ1ZSwgZmlsbD10ay5YKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSLnp7vpmaQiLCBjb21tYW5kPWxhbWJkYTogc2VsZi5yZW1vdmVfbGlzdGJveF9pdGVtKHNlbGYuZGxfanNvbl9saXN0Ym94KSkucGFjayhzaWRlPXRrLkxFRlQsIGV4cGFuZD1UcnVlLCBmaWxsPXRrLlgpCiAgICAgICAgCiAgICAgICAgb3B0X2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUoc2VsZi50YWJfZG93bmxvYWQsIHRleHQ9IuS4i+i9veiuvue9riIsIHBhZGRpbmc9MTApCiAgICAgICAgb3B0X2ZyYW1lLnBhY2soZmlsbD10ay5YLCBwYWR4PTEwLCBwYWR5PTUpCiAgICAgICAgCiAgICAgICAgZGlyX2ZyYW1lID0gdHRrLkZyYW1lKG9wdF9mcmFtZSkKICAgICAgICBkaXJfZnJhbWUucGFjayhmaWxsPXRrLlgsIHBhZHk9MikKICAgICAgICBsYmwgPSB0dGsuTGFiZWwoZGlyX2ZyYW1lLCB0ZXh0PSLkv53lrZjnm67lvZUgKC1kKToiKQogICAgICAgIGxibC5ncmlkKHJvdz0wLCBjb2x1bW49MCwgc3RpY2t5PXRrLlcpCiAgICAgICAgVG9vbFRpcChsYmwsICLlsIbmlofku7bkuIvovb3liLDmjIflrprnmoToh6rlrprkuYnnm67lvZUiKQogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdkbF9kaXJfdmFyJyk6CiAgICAgICAgICAgIHNlbGYuZGxfZGlyX3ZhciA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkVudHJ5KGRpcl9mcmFtZSwgdGV4dHZhcmlhYmxlPXNlbGYuZGxfZGlyX3Zhciwgd2lkdGg9NDApLmdyaWQocm93PTAsIGNvbHVtbj0xLCBwYWR4PTUsIHN0aWNreT10ay5XKQogICAgICAgIHR0ay5CdXR0b24oZGlyX2ZyYW1lLCB0ZXh0PSLmtY/op4guLi4iLCBjb21tYW5kPWxhbWJkYTogc2VsZi5kbF9kaXJfdmFyLnNldChmaWxlZGlhbG9nLmFza2RpcmVjdG9yeSgpKSkuZ3JpZChyb3c9MCwgY29sdW1uPTIpCiAgICAgICAgCiAgICAgICAgbGJsID0gdHRrLkxhYmVsKGRpcl9mcmFtZSwgdGV4dD0i5paH5Lu25ZCN5qih5p2/ICgtLXRlbXBsYXRlKToiKQogICAgICAgIGxibC5ncmlkKHJvdz0xLCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBUb29sVGlwKGxibCwgIuS9v+eUqOiHquWumuS5ieaooeadv+mHjeWRveWQjeaWh+S7tu+8jOS+i+Wmgjpcbnt7IC5EaWFsb2dJRCB9fV97eyAuTWVzc2FnZUlEIH19X3t7IC5GaWxlTmFtZSB9fSIpCiAgICAgICAgc2VsZi5kbF90cGxfdmFyID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkoZGlyX2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi5kbF90cGxfdmFyLCB3aWR0aD00MCkuZ3JpZChyb3c9MSwgY29sdW1uPTEsIHBhZHg9NSwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICAKICAgICAgICBmaWx0ZXJfZnJhbWUgPSB0dGsuRnJhbWUob3B0X2ZyYW1lKQogICAgICAgIGZpbHRlcl9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT0yKQogICAgICAgIGxibCA9IHR0ay5MYWJlbChmaWx0ZXJfZnJhbWUsIHRleHQ9IueZveWQjeWNlSAoLWkpOiIpCiAgICAgICAgbGJsLnBhY2soc2lkZT10ay5MRUZUKQogICAgICAgIFRvb2xUaXAobGJsLCAi5Y+q5LiL6L2954m55a6a5omp5bGV5ZCN55qE5paH5Lu277yM5aaCIGpwZyxwbmciKQogICAgICAgIHNlbGYuZGxfd2hpdGVfdmFyID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkoZmlsdGVyX2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi5kbF93aGl0ZV92YXIsIHdpZHRoPTE1KS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0oNSwgMTUpKQogICAgICAgIAogICAgICAgIGxibCA9IHR0ay5MYWJlbChmaWx0ZXJfZnJhbWUsIHRleHQ9Ium7keWQjeWNlSAoLWUpOiIpCiAgICAgICAgbGJsLnBhY2soc2lkZT10ay5MRUZUKQogICAgICAgIFRvb2xUaXAobGJsLCAi6Lez6L+H54m55a6a5omp5bGV5ZCN55qE5paH5Lu277yM5aaCIG1wNCxmbHZcbuazqOaEjzog55m95ZCN5Y2V5ZKM6buR5ZCN5Y2V5LiN6IO95ZCM5pe25L2/55SoIikKICAgICAgICBzZWxmLmRsX2JsYWNrX3ZhciA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkVudHJ5KGZpbHRlcl9mcmFtZSwgdGV4dHZhcmlhYmxlPXNlbGYuZGxfYmxhY2tfdmFyLCB3aWR0aD0xNSkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICB0dGsuTGFiZWwoZmlsdGVyX2ZyYW1lLCB0ZXh0PSIo5omp5bGV5ZCN5Lul6YCX5Y+35YiG6ZqU77yM5aaCIGpwZyxwbmcpIikucGFjayhzaWRlPXRrLkxFRlQpCiAgICAgICAgCiAgICAgICAgdHRfZnJhbWUgPSB0dGsuRnJhbWUob3B0X2ZyYW1lKQogICAgICAgIHR0X2ZyYW1lLnBhY2soZmlsbD10ay5YLCBwYWR5PTUpCiAgICAgICAgbGJsID0gdHRrLkxhYmVsKHR0X2ZyYW1lLCB0ZXh0PSLnur/nqIvmlbAgKC10KToiKQogICAgICAgIGxibC5wYWNrKHNpZGU9dGsuTEVGVCkKICAgICAgICBUb29sVGlwKGxibCwgIuavj+S4quS4i+i9veS7u+WKoeWIhumFjeeahOe6v+eoi+aVsCIpCiAgICAgICAgc2VsZi5kbF90aHJlYWRzID0gdGsuSW50VmFyKHZhbHVlPTgpCiAgICAgICAgdHRrLlNwaW5ib3godHRfZnJhbWUsIGZyb21fPTEsIHRvPTY0LCB0ZXh0dmFyaWFibGU9c2VsZi5kbF90aHJlYWRzLCB3aWR0aD01KS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01KQogICAgICAgIAogICAgICAgIGxibCA9IHR0ay5MYWJlbCh0dF9mcmFtZSwgdGV4dD0i5bm25Y+R5Lu75YqhICgtbCk6IikKICAgICAgICBsYmwucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9KDE1LDApKQogICAgICAgIFRvb2xUaXAobGJsLCAi5ZCM5pe26L+b6KGM5LiL6L2955qE5Lu75Yqh5pWw6YePIikKICAgICAgICBzZWxmLmRsX3Rhc2tzID0gdGsuSW50VmFyKHZhbHVlPTQpCiAgICAgICAgdHRrLlNwaW5ib3godHRfZnJhbWUsIGZyb21fPTEsIHRvPTY0LCB0ZXh0dmFyaWFibGU9c2VsZi5kbF90YXNrcywgd2lkdGg9NSkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICAKICAgICAgICBjaGtfZnJhbWUgPSB0dGsuRnJhbWUob3B0X2ZyYW1lKQogICAgICAgIGNoa19mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT01KQogICAgICAgIHNlbGYuZGxfY2hrcyA9IHsKICAgICAgICAgICAgJ2Rlc2MnOiB0ay5Cb29sZWFuVmFyKCksICdyZXdyaXRlX2V4dCc6IHRrLkJvb2xlYW5WYXIoKSwgJ2dyb3VwJzogdGsuQm9vbGVhblZhcigpLAogICAgICAgICAgICAnc2tpcF9zYW1lJzogdGsuQm9vbGVhblZhcigpLCAndGFrZW91dCc6IHRrLkJvb2xlYW5WYXIoKSwgJ2NvbnRpbnVlJzogdGsuQm9vbGVhblZhcigpLCAKICAgICAgICAgICAgJ3Jlc3RhcnQnOiB0ay5Cb29sZWFuVmFyKCksICdzZXJ2ZSc6IHRrLkJvb2xlYW5WYXIoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjMSA9IHR0ay5DaGVja2J1dHRvbihjaGtfZnJhbWUsIHRleHQ9IuWPjeW6jyAoLS1kZXNjKSIsIHZhcmlhYmxlPXNlbGYuZGxfY2hrc1snZGVzYyddKQogICAgICAgIGMxLmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeD01KQogICAgICAgIFRvb2xUaXAoYzEsICLmjInlj43luo/kuIvovb3mlofku7bvvIjku47mnIDmlrDliLDmnIDml6fvvInvvIzkvJrlvbHlk43mgaLlpI3kuIvovb3lip/og70iKQogICAgICAgIAogICAgICAgIGMyID0gdHRrLkNoZWNrYnV0dG9uKGNoa19mcmFtZSwgdGV4dD0iTUlNRemHjeWRveWQjSAoLS1yZXdyaXRlLWV4dCkiLCB2YXJpYWJsZT1zZWxmLmRsX2Noa3NbJ3Jld3JpdGVfZXh0J10pCiAgICAgICAgYzIuZ3JpZChyb3c9MCwgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTUpCiAgICAgICAgVG9vbFRpcChjMiwgIuWmguaenOaWh+S7tuaJqeWxleWQjeS4jiBNSU1FIOexu+Wei+S4jeWMuemFje+8jOWwhuiHquWKqOmHjeWRveWQjSIpCiAgICAgICAgCiAgICAgICAgYzMgPSB0dGsuQ2hlY2tidXR0b24oY2hrX2ZyYW1lLCB0ZXh0PSLnm7jlhozmjqLmtYsgKC0tZ3JvdXApIiwgdmFyaWFibGU9c2VsZi5kbF9jaGtzWydncm91cCddKQogICAgICAgIGMzLmdyaWQocm93PTAsIGNvbHVtbj0yLCBzdGlja3k9dGsuVywgcGFkeD01KQogICAgICAgIFRvb2xUaXAoYzMsICLoh6rliqjmo4DmtYvmtojmga/mmK/lkKbkuLrnm7jlhozvvIzlubbkuIvovb3miYDmnInnm7jlhbPmlofku7YiKQogICAgICAgIAogICAgICAgIGM0ID0gdHRrLkNoZWNrYnV0dG9uKGNoa19mcmFtZSwgdGV4dD0i6Lez6L+H55u45ZCMICgtLXNraXAtc2FtZSkiLCB2YXJpYWJsZT1zZWxmLmRsX2Noa3NbJ3NraXBfc2FtZSddKQogICAgICAgIGM0LmdyaWQocm93PTAsIGNvbHVtbj0zLCBzdGlja3k9dGsuVywgcGFkeD01KQogICAgICAgIFRvb2xUaXAoYzQsICLot7Pov4flkI3np7DlkozlpKflsI/lnYfnm7jlkIznmoTmlofku7YiKQogICAgICAgIAogICAgICAgIGM1ID0gdHRrLkNoZWNrYnV0dG9uKGNoa19mcmFtZSwgdGV4dD0iVGFrZW91dOS8muivnSAoLS10YWtlb3V0KSIsIHZhcmlhYmxlPXNlbGYuZGxfY2hrc1sndGFrZW91dCddKQogICAgICAgIGM1LmdyaWQocm93PTEsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeD01LCBwYWR5PTIpCiAgICAgICAgVG9vbFRpcChjNSwgIuWkp+mHj+S4i+i9veaXtuaOqOiNkOW8gOWQr++8jOmZjeS9jui0puWPt+iiq+mZkOa1geeahOmjjumZqSIpCiAgICAgICAgCiAgICAgICAgYzYgPSB0dGsuQ2hlY2tidXR0b24oY2hrX2ZyYW1lLCB0ZXh0PSLmgaLlpI3kuIvovb0gKC0tY29udGludWUpIiwgdmFyaWFibGU9c2VsZi5kbF9jaGtzWydjb250aW51ZSddKQogICAgICAgIGM2LmdyaWQocm93PTEsIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD01LCBwYWR5PTIpCiAgICAgICAgVG9vbFRpcChjNiwgIuWcqOS4jemcgOimgeS6pOS6kueahOaDheWGteS4i+aBouWkjeiiq+S4reaWreeahOS4i+i9vSIpCiAgICAgICAgCiAgICAgICAgYzcgPSB0dGsuQ2hlY2tidXR0b24oY2hrX2ZyYW1lLCB0ZXh0PSLph43mlrDkuIvovb0gKC0tcmVzdGFydCkiLCB2YXJpYWJsZT1zZWxmLmRsX2Noa3NbJ3Jlc3RhcnQnXSkKICAgICAgICBjNy5ncmlkKHJvdz0xLCBjb2x1bW49Miwgc3RpY2t5PXRrLlcsIHBhZHg9NSwgcGFkeT0yKQogICAgICAgIFRvb2xUaXAoYzcsICLml6Dop4bov5vluqbvvIzph43mlrDlvIDlp4vkuIvovb3miYDmnInmlofku7YiKQogICAgICAgIAogICAgICAgIGM4ID0gdHRrLkNoZWNrYnV0dG9uKGNoa19mcmFtZSwgdGV4dD0iSFRUUOaWh+S7tuacjeWKoeWZqCAoLS1zZXJ2ZSkiLCB2YXJpYWJsZT1zZWxmLmRsX2Noa3NbJ3NlcnZlJ10pCiAgICAgICAgYzguZ3JpZChyb3c9MSwgY29sdW1uPTMsIHN0aWNreT10ay5XLCBwYWR4PTUsIHBhZHk9MikKICAgICAgICBUb29sVGlwKGM4LCAi5bCG5paH5Lu25pq06Zyy5Li65pys5ZywIEhUVFAg5pyN5Yqh5Zmo5L6b56ys5LiJ5pa55LiL6L295bel5YW35L2/55SoXG7mjqfliLblj7DkvJrmmL7npLrpk77mjqUiKQogICAgICAgIAogICAgICAgIHR0ay5CdXR0b24oc2VsZi50YWJfZG93bmxvYWQsIHRleHQ9IuW8gOWni+S4i+i9vSIsIGNvbW1hbmQ9c2VsZi5zdGFydF9kb3dubG9hZCwgc3R5bGU9IkFjY2VudC5UQnV0dG9uIikucGFjayhwYWR5PTEwKQoKICAgIGRlZiBzZXR1cF91cGxvYWRfdGFiKHNlbGYpOgogICAgICAgIHRvcF9mcmFtZSA9IHR0ay5GcmFtZShzZWxmLnRhYl91cGxvYWQsIHBhZGRpbmc9MTApCiAgICAgICAgdG9wX2ZyYW1lLnBhY2soZmlsbD10ay5CT1RILCBleHBhbmQ9VHJ1ZSkKICAgICAgICAKICAgICAgICBmaWxlX2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUodG9wX2ZyYW1lLCB0ZXh0PSLlvoXkuIrkvKDmlofku7Yv55uu5b2VIiwgcGFkZGluZz01KQogICAgICAgIGZpbGVfZnJhbWUucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlKQogICAgICAgIFRvb2xUaXAoZmlsZV9mcmFtZSwgIuaUr+aMgemAieaLqeWkmuS4quaWh+S7tuaIluebruW9leS4iuS8oCIpCiAgICAgICAgc2VsZi51cF9saXN0Ym94ID0gdGsuTGlzdGJveChmaWxlX2ZyYW1lLCBoZWlnaHQ9NikKICAgICAgICBzZWxmLnVwX2xpc3Rib3gucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlKQogICAgICAgIAogICAgICAgIGJ0bl9mcmFtZSA9IHR0ay5GcmFtZShmaWxlX2ZyYW1lKQogICAgICAgIGJ0bl9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT0yKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSLmt7vliqDmlofku7YiLCBjb21tYW5kPWxhbWJkYTogc2VsZi5hZGRfaXRlbXNfdG9fbGlzdGJveChzZWxmLnVwX2xpc3Rib3gsIGZpbGVkaWFsb2cuYXNrb3BlbmZpbGVuYW1lcygpKSkucGFjayhzaWRlPXRrLkxFRlQsIGV4cGFuZD1UcnVlLCBmaWxsPXRrLlgpCiAgICAgICAgdHRrLkJ1dHRvbihidG5fZnJhbWUsIHRleHQ9Iua3u+WKoOebruW9lSIsIGNvbW1hbmQ9bGFtYmRhOiBzZWxmLmFkZF9pdGVtc190b19saXN0Ym94KHNlbGYudXBfbGlzdGJveCwgW2ZpbGVkaWFsb2cuYXNrZGlyZWN0b3J5KCldIGlmIGZpbGVkaWFsb2cuYXNrZGlyZWN0b3J5KCkgZWxzZSBbXSkpLnBhY2soc2lkZT10ay5MRUZULCBleHBhbmQ9VHJ1ZSwgZmlsbD10ay5YKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSLnp7vpmaQiLCBjb21tYW5kPWxhbWJkYTogc2VsZi5yZW1vdmVfbGlzdGJveF9pdGVtKHNlbGYudXBfbGlzdGJveCkpLnBhY2soc2lkZT10ay5MRUZULCBleHBhbmQ9VHJ1ZSwgZmlsbD10ay5YKQogICAgICAgIAogICAgICAgIG9wdF9mcmFtZSA9IHR0ay5MYWJlbEZyYW1lKHNlbGYudGFiX3VwbG9hZCwgdGV4dD0i5LiK5Lyg6K6+572uIiwgcGFkZGluZz0xMCkKICAgICAgICBvcHRfZnJhbWUucGFjayhmaWxsPXRrLlgsIHBhZHg9MTAsIHBhZHk9NSkKICAgICAgICAKICAgICAgICB0Z3RfZnJhbWUgPSB0dGsuRnJhbWUob3B0X2ZyYW1lKQogICAgICAgIHRndF9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT0yKQogICAgICAgIGxibCA9IHR0ay5MYWJlbCh0Z3RfZnJhbWUsIHRleHQ9Iuebruagh+iBiuWkqSAoLWMpOiIpCiAgICAgICAgbGJsLmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9dGsuVykKICAgICAgICBUb29sVGlwKGxibCwgIuS4iuS8oOWIsOaMh+WumueahOiBiuWkqeOAguWmguaenOeVmeepuu+8jOWwhuS4iuS8oOWIsOKAnOaUtuiXj+WkueKAneOAgiIpCiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ3VwX2NoYXRfdmFyJyk6CiAgICAgICAgICAgIHNlbGYudXBfY2hhdF92YXIgPSB0ay5TdHJpbmdWYXIoKQogICAgICAgIHR0ay5FbnRyeSh0Z3RfZnJhbWUsIHRleHR2YXJpYWJsZT1zZWxmLnVwX2NoYXRfdmFyLCB3aWR0aD0yMCkuZ3JpZChyb3c9MCwgY29sdW1uPTEsIHBhZHg9NSwgc3RpY2t5PXRrLlcpCiAgICAgICAgCiAgICAgICAgbGJsID0gdHRrLkxhYmVsKHRndF9mcmFtZSwgdGV4dD0i5Li76aKYSUQgKC0tdG9waWMpOiIpCiAgICAgICAgbGJsLmdyaWQocm93PTAsIGNvbHVtbj0yLCBzdGlja3k9dGsuVywgcGFkeD0oMTAsMCkpCiAgICAgICAgVG9vbFRpcChsYmwsICLkuIrkvKDliLDorrrlnZvlnovogYrlpKnnmoTmjIflrprkuLvpophJRCIpCiAgICAgICAgc2VsZi51cF90b3BpY192YXIgPSB0ay5TdHJpbmdWYXIoKQogICAgICAgIHR0ay5FbnRyeSh0Z3RfZnJhbWUsIHRleHR2YXJpYWJsZT1zZWxmLnVwX3RvcGljX3Zhciwgd2lkdGg9MTApLmdyaWQocm93PTAsIGNvbHVtbj0zLCBwYWR4PTUsIHN0aWNreT10ay5XKQogICAgICAgIAogICAgICAgIGxibCA9IHR0ay5MYWJlbCh0Z3RfZnJhbWUsIHRleHQ9Iua2iOaBr+i3r+eUsSAoLS10byk6IikKICAgICAgICBsYmwuZ3JpZChyb3c9MSwgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgVG9vbFRpcChsYmwsICLln7rkuo7ooajovr7lvI/nmoTot6/nlLHlsIbmlofku7bkuIrkvKDliLDkuI3lkIznmoTogYrlpKlcbuWPr+S7pei+k+WFpeihqOi+vuW8j+aIlui3r+eUseaWh+S7tui3r+W+hFxu5L6L5aaCOiBNSU1FIGNvbnRhaW5zICd2aWRlbycgPyAnQ0hBVDEnIDogJyciKQogICAgICAgIHNlbGYudXBfdG9fdmFyID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkodGd0X2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi51cF90b192YXIsIHdpZHRoPTQwKS5ncmlkKHJvdz0xLCBjb2x1bW49MSwgY29sdW1uc3Bhbj0zLCBwYWR4PTUsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgdHRrLkxhYmVsKHRndF9mcmFtZSwgdGV4dD0iKOazqOaEjzogLS10byDkuI4gLWMvLS10b3BpYyDkupLmlqUpIiwgZm9yZWdyb3VuZD0iZ3JheSIpLmdyaWQocm93PTEsIGNvbHVtbj00LCBzdGlja3k9dGsuVykKCiAgICAgICAgbGJsID0gdHRrLkxhYmVsKHRndF9mcmFtZSwgdGV4dD0i6Ieq5a6a5LmJ5qCH6aKYICgtLWNhcHRpb24pOiIpCiAgICAgICAgbGJsLmdyaWQocm93PTIsIGNvbHVtbj0wLCBzdGlja3k9dGsuVykKICAgICAgICBUb29sVGlwKGxibCwgIuS9v+eUqOihqOi+vuW8j+W8leaTjue8luWGmeiHquWumuS5ieagh+mimFxu5L6L5aaCOiBGaWxlTmFtZSArICcgLSB1cGxvYWRlZCBieSB0ZGwnIikKICAgICAgICBzZWxmLnVwX2NhcHRpb25fdmFyID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkodGd0X2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi51cF9jYXB0aW9uX3Zhciwgd2lkdGg9NDApLmdyaWQocm93PTIsIGNvbHVtbj0xLCBjb2x1bW5zcGFuPTMsIHBhZHg9NSwgc3RpY2t5PXRrLlcpCiAgICAgICAgCiAgICAgICAgZmlsdGVyX2ZyYW1lID0gdHRrLkZyYW1lKG9wdF9mcmFtZSkKICAgICAgICBmaWx0ZXJfZnJhbWUucGFjayhmaWxsPXRrLlgsIHBhZHk9NSkKICAgICAgICBsYmwgPSB0dGsuTGFiZWwoZmlsdGVyX2ZyYW1lLCB0ZXh0PSLnmb3lkI3ljZUgKC1pKToiKQogICAgICAgIGxibC5wYWNrKHNpZGU9dGsuTEVGVCkKICAgICAgICBUb29sVGlwKGxibCwgIuWPquS4iuS8oOaJqeWxleWQjeS4uuivpeWIl+ihqOeahOaWh+S7tu+8jOWmgiBqcGcscG5nIikKICAgICAgICBzZWxmLnVwX3doaXRlX3ZhciA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkVudHJ5KGZpbHRlcl9mcmFtZSwgdGV4dHZhcmlhYmxlPXNlbGYudXBfd2hpdGVfdmFyLCB3aWR0aD0xNSkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9KDUsIDE1KSkKICAgICAgICAKICAgICAgICBsYmwgPSB0dGsuTGFiZWwoZmlsdGVyX2ZyYW1lLCB0ZXh0PSLpu5HlkI3ljZUgKC1lKToiKQogICAgICAgIGxibC5wYWNrKHNpZGU9dGsuTEVGVCkKICAgICAgICBUb29sVGlwKGxibCwgIuS4iuS8oOmZpOS6huaJqeWxleWQjeS4uuivpeWIl+ihqOeahOaJgOacieaWh+S7tu+8jOWmgiBtcDRcbuazqOaEjzog55m95ZCN5Y2V5ZKM6buR5ZCN5Y2V5LiN6IO95ZCM5pe25L2/55SoIikKICAgICAgICBzZWxmLnVwX2JsYWNrX3ZhciA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkVudHJ5KGZpbHRlcl9mcmFtZSwgdGV4dHZhcmlhYmxlPXNlbGYudXBfYmxhY2tfdmFyLCB3aWR0aD0xNSkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICAKICAgICAgICB0dF9mcmFtZSA9IHR0ay5GcmFtZShvcHRfZnJhbWUpCiAgICAgICAgdHRfZnJhbWUucGFjayhmaWxsPXRrLlgsIHBhZHk9NSkKICAgICAgICBsYmwgPSB0dGsuTGFiZWwodHRfZnJhbWUsIHRleHQ9Iue6v+eoi+aVsCAoLXQpOiIpCiAgICAgICAgbGJsLnBhY2soc2lkZT10ay5MRUZUKQogICAgICAgIFRvb2xUaXAobGJsLCAi5q+P5Liq5LiK5Lyg5Lu75Yqh5YiG6YWN55qE57q/56iL5pWwIikKICAgICAgICBzZWxmLnVwX3RocmVhZHMgPSB0ay5JbnRWYXIodmFsdWU9OCkKICAgICAgICB0dGsuU3BpbmJveCh0dF9mcmFtZSwgZnJvbV89MSwgdG89NjQsIHRleHR2YXJpYWJsZT1zZWxmLnVwX3RocmVhZHMsIHdpZHRoPTUpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgCiAgICAgICAgbGJsID0gdHRrLkxhYmVsKHR0X2ZyYW1lLCB0ZXh0PSLlubblj5Hku7vliqEgKC1sKToiKQogICAgICAgIGxibC5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0oMTUsMCkpCiAgICAgICAgVG9vbFRpcChsYmwsICLlkIzml7bov5vooYzkuIrkvKDnmoTku7vliqHmlbDph48iKQogICAgICAgIHNlbGYudXBfdGFza3MgPSB0ay5JbnRWYXIodmFsdWU9NCkKICAgICAgICB0dGsuU3BpbmJveCh0dF9mcmFtZSwgZnJvbV89MSwgdG89NjQsIHRleHR2YXJpYWJsZT1zZWxmLnVwX3Rhc2tzLCB3aWR0aD01KS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01KQogICAgICAgIAogICAgICAgIGNoa19mcmFtZSA9IHR0ay5GcmFtZShvcHRfZnJhbWUpCiAgICAgICAgY2hrX2ZyYW1lLnBhY2soZmlsbD10ay5YLCBwYWR5PTUpCiAgICAgICAgc2VsZi51cF9jaGtfcm0gPSB0ay5Cb29sZWFuVmFyKCkKICAgICAgICBzZWxmLnVwX2Noa19waG90byA9IHRrLkJvb2xlYW5WYXIoKQogICAgICAgIAogICAgICAgIGMxID0gdHRrLkNoZWNrYnV0dG9uKGNoa19mcmFtZSwgdGV4dD0i5LiK5Lyg5ZCO5Yig6ZmkICgtLXJtKSIsIHZhcmlhYmxlPXNlbGYudXBfY2hrX3JtKQogICAgICAgIGMxLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgVG9vbFRpcChjMSwgIuaIkOWKn+S4iuS8oOWQjuWIoOmZpOacrOWcsOa6kOaWh+S7tiIpCiAgICAgICAgCiAgICAgICAgYzIgPSB0dGsuQ2hlY2tidXR0b24oY2hrX2ZyYW1lLCB0ZXh0PSLkvZzkuLrnhafniYfkuIrkvKAgKC0tcGhvdG8pIiwgdmFyaWFibGU9c2VsZi51cF9jaGtfcGhvdG8pCiAgICAgICAgYzIucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9MTUpCiAgICAgICAgVG9vbFRpcChjMiwgIuWwhuWbvuWDj+S9nOS4uueFp+eJh+iAjOS4jeaYr+WOn+aWh+S7tuS4iuS8oCIpCiAgICAgICAgCiAgICAgICAgdHRrLkJ1dHRvbihzZWxmLnRhYl91cGxvYWQsIHRleHQ9IuW8gOWni+S4iuS8oCIsIGNvbW1hbmQ9c2VsZi5zdGFydF91cGxvYWQpLnBhY2socGFkeT0xMCkKCiAgICBkZWYgc2V0dXBfZm9yd2FyZF90YWIoc2VsZik6CiAgICAgICAgdG9wX2ZyYW1lID0gdHRrLkZyYW1lKHNlbGYudGFiX2ZvcndhcmQsIHBhZGRpbmc9MTApCiAgICAgICAgdG9wX2ZyYW1lLnBhY2soZmlsbD10ay5CT1RILCBleHBhbmQ9VHJ1ZSkKICAgICAgICAKICAgICAgICBzcmNfZnJhbWUgPSB0dGsuTGFiZWxGcmFtZSh0b3BfZnJhbWUsIHRleHQ9Iuadpea6kCAoLS1mcm9tKSIsIHBhZGRpbmc9NSkKICAgICAgICBzcmNfZnJhbWUucGFjayhzaWRlPXRrLkxFRlQsIGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUsIHBhZHg9KDAsIDUpKQogICAgICAgIFRvb2xUaXAoc3JjX2ZyYW1lLCAi5pSv5oyB5LuO6ZO+5o6l5ZKM5a+85Ye655qESlNPTuaWh+S7tuS4reiOt+WPlua2iOaBr+S7pei9rOWPkSIpCiAgICAgICAgCiAgICAgICAgdHRrLkxhYmVsKHNyY19mcmFtZSwgdGV4dD0i6ZO+5o6lICjmr4/ooYzkuIDkuKopOiIpLnBhY2soYW5jaG9yPXRrLlcpCiAgICAgICAgc2VsZi5md191cmxfdGV4dCA9IHNjcm9sbGVkdGV4dC5TY3JvbGxlZFRleHQoc3JjX2ZyYW1lLCB3aWR0aD0zMCwgaGVpZ2h0PTQpCiAgICAgICAgc2VsZi5md191cmxfdGV4dC5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUpCiAgICAgICAgCiAgICAgICAgdHRrLkxhYmVsKHNyY19mcmFtZSwgdGV4dD0iSlNPTiDlr7zlh7rmlofku7Y6IikucGFjayhhbmNob3I9dGsuVywgcGFkeT0oNSwwKSkKICAgICAgICBzZWxmLmZ3X2pzb25fbGlzdGJveCA9IHRrLkxpc3Rib3goc3JjX2ZyYW1lLCBoZWlnaHQ9MykKICAgICAgICBzZWxmLmZ3X2pzb25fbGlzdGJveC5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUpCiAgICAgICAgYnRuX2ZyYW1lID0gdHRrLkZyYW1lKHNyY19mcmFtZSkKICAgICAgICBidG5fZnJhbWUucGFjayhmaWxsPXRrLlgsIHBhZHk9MikKICAgICAgICB0dGsuQnV0dG9uKGJ0bl9mcmFtZSwgdGV4dD0i5re75YqgSlNPTiIsIGNvbW1hbmQ9bGFtYmRhOiBzZWxmLmFkZF9pdGVtc190b19saXN0Ym94KHNlbGYuZndfanNvbl9saXN0Ym94LCBmaWxlZGlhbG9nLmFza29wZW5maWxlbmFtZXMoZmlsZXR5cGVzPVsoIkpTT04gZmlsZXMiLCAiKi5qc29uIildKSkpLnBhY2soc2lkZT10ay5MRUZULCBleHBhbmQ9VHJ1ZSwgZmlsbD10ay5YKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSLnp7vpmaQiLCBjb21tYW5kPWxhbWJkYTogc2VsZi5yZW1vdmVfbGlzdGJveF9pdGVtKHNlbGYuZndfanNvbl9saXN0Ym94KSkucGFjayhzaWRlPXRrLkxFRlQsIGV4cGFuZD1UcnVlLCBmaWxsPXRrLlgpCiAgICAgICAgCiAgICAgICAgb3B0X2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUoc2VsZi50YWJfZm9yd2FyZCwgdGV4dD0i6L2s5Y+R6K6+572uIiwgcGFkZGluZz0xMCkKICAgICAgICBvcHRfZnJhbWUucGFjayhmaWxsPXRrLlgsIHBhZHg9MTAsIHBhZHk9NSkKICAgICAgICAKICAgICAgICB0Z3RfZnJhbWUgPSB0dGsuRnJhbWUob3B0X2ZyYW1lKQogICAgICAgIHRndF9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT0yKQogICAgICAgIGxibCA9IHR0ay5MYWJlbCh0Z3RfZnJhbWUsIHRleHQ9IuebruaghyAoLS10byk6IikKICAgICAgICBsYmwuZ3JpZChyb3c9MCwgY29sdW1uPTAsIHN0aWNreT10ay5XKQogICAgICAgIFRvb2xUaXAobGJsLCAi6L2s5Y+R55qE55uu5qCH6IGK5aSp77yM5oiW6ICF5Z+65LqO6KGo6L6+5byP55qE5raI5oGv6Lev55SxXG7nqbrlrZfnrKbkuLLooajnpLrovazlj5HliLDmlLbol4/lpLkiKQogICAgICAgIHNlbGYuZndfdG9fdmFyID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkodGd0X2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi5md190b192YXIsIHdpZHRoPTQwKS5ncmlkKHJvdz0wLCBjb2x1bW49MSwgcGFkeD01LCBzdGlja3k9dGsuVykKICAgICAgICB0dGsuTGFiZWwodGd0X2ZyYW1lLCB0ZXh0PSIo6IGK5aSp5ZCNIOaIliDot6/nlLHooajovr7lvI8v5paH5Lu2KSIsIGZvcmVncm91bmQ9ImdyYXkiKS5ncmlkKHJvdz0wLCBjb2x1bW49Miwgc3RpY2t5PXRrLlcpCiAgICAgICAgCiAgICAgICAgbGJsID0gdHRrLkxhYmVsKHRndF9mcmFtZSwgdGV4dD0i57yW6L6RICgtLWVkaXQpOiIpCiAgICAgICAgbGJsLmdyaWQocm93PTEsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIFRvb2xUaXAobGJsLCAi5L2/55So6KGo6L6+5byP5byV5pOO57yW6L6R6L2s5Y+R5YmN55qE5raI5oGvXG7kvovlpoI6IE1lc3NhZ2UuTWVzc2FnZSArICcg5rWL6K+V6L2s5Y+R5raI5oGvJyIpCiAgICAgICAgc2VsZi5md19lZGl0X3ZhciA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkVudHJ5KHRndF9mcmFtZSwgdGV4dHZhcmlhYmxlPXNlbGYuZndfZWRpdF92YXIsIHdpZHRoPTQwKS5ncmlkKHJvdz0xLCBjb2x1bW49MSwgcGFkeD01LCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIAogICAgICAgIGxibCA9IHR0ay5MYWJlbCh0Z3RfZnJhbWUsIHRleHQ9IuaooeW8jyAoLS1tb2RlKToiKQogICAgICAgIGxibC5ncmlkKHJvdz0yLCBjb2x1bW49MCwgc3RpY2t5PXRrLlcpCiAgICAgICAgVG9vbFRpcChsYmwsICJkaXJlY3Q6IOS8mOWFiOS9v+eUqOWumOaWuei9rOWPkUFQSVxuY2xvbmU6IOmAmui/h+WkjeWItuaWueW8j+i9rOWPke+8jOS4jeWQq+i9rOWPkeadpea6kOagh+WktCIpCiAgICAgICAgc2VsZi5md19tb2RlX3ZhciA9IHRrLlN0cmluZ1Zhcih2YWx1ZT0iZGlyZWN0IikKICAgICAgICB0dGsuQ29tYm9ib3godGd0X2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi5md19tb2RlX3ZhciwgdmFsdWVzPVsiZGlyZWN0IiwgImNsb25lIl0sIHN0YXRlPSJyZWFkb25seSIsIHdpZHRoPTEwKS5ncmlkKHJvdz0yLCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NSkKICAgICAgICAKICAgICAgICBjaGtfZnJhbWUgPSB0dGsuRnJhbWUob3B0X2ZyYW1lKQogICAgICAgIGNoa19mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT01KQogICAgICAgIHNlbGYuZndfY2hrcyA9IHsKICAgICAgICAgICAgJ2RyeV9ydW4nOiB0ay5Cb29sZWFuVmFyKCksICdzaWxlbnQnOiB0ay5Cb29sZWFuVmFyKCksICdzaW5nbGUnOiB0ay5Cb29sZWFuVmFyKCksICdkZXNjJzogdGsuQm9vbGVhblZhcigpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGMxID0gdHRrLkNoZWNrYnV0dG9uKGNoa19mcmFtZSwgdGV4dD0i6K+V6L+Q6KGMICgtLWRyeS1ydW4pIiwgdmFyaWFibGU9c2VsZi5md19jaGtzWydkcnlfcnVuJ10pCiAgICAgICAgYzEucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICBUb29sVGlwKGMxLCAi5Y+q5omT5Y2w6L+b5bqm6ICM5LiN5a6e6ZmF5Y+R6YCB5raI5oGv77yM55So5LqO6LCD6K+VIikKICAgICAgICAKICAgICAgICBjMiA9IHR0ay5DaGVja2J1dHRvbihjaGtfZnJhbWUsIHRleHQ9Iumdmem7mOWPkemAgSAoLS1zaWxlbnQpIiwgdmFyaWFibGU9c2VsZi5md19jaGtzWydzaWxlbnQnXSkKICAgICAgICBjMi5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01KQogICAgICAgIFRvb2xUaXAoYzIsICLlj5HpgIHmtojmga/ogIzkuI3pgJrnn6Xlhbbku5bmiJDlkZgiKQogICAgICAgIAogICAgICAgIGMzID0gdHRrLkNoZWNrYnV0dG9uKGNoa19mcmFtZSwgdGV4dD0i5Y+W5raI5YiG57uEICgtLXNpbmdsZSkiLCB2YXJpYWJsZT1zZWxmLmZ3X2Noa3NbJ3NpbmdsZSddKQogICAgICAgIGMzLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgVG9vbFRpcChjMywgIuemgeeUqOiHquWKqOWQiOW5tuWIhue7hOa2iOaBr++8jOWwhuWFtuS9nOS4uuWNleS4qua2iOaBr+i9rOWPkSIpCiAgICAgICAgCiAgICAgICAgYzQgPSB0dGsuQ2hlY2tidXR0b24oY2hrX2ZyYW1lLCB0ZXh0PSLlj43luo8gKC0tZGVzYykiLCB2YXJpYWJsZT1zZWxmLmZ3X2Noa3NbJ2Rlc2MnXSkKICAgICAgICBjNC5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01KQogICAgICAgIFRvb2xUaXAoYzQsICLlr7nmr4/kuKrmnaXmupDnmoTmtojmga/ov5vooYzlj43luo/ovazlj5EiKQogICAgICAgIAogICAgICAgIHR0ay5CdXR0b24oc2VsZi50YWJfZm9yd2FyZCwgdGV4dD0i5byA5aeL6L2s5Y+RIiwgY29tbWFuZD1zZWxmLnN0YXJ0X2ZvcndhcmQpLnBhY2socGFkeT0xMCkKCiAgICBkZWYgc2V0dXBfdG9vbHNfdGFiKHNlbGYpOgogICAgICAgIHRvcF9mcmFtZSA9IHR0ay5GcmFtZShzZWxmLnRhYl90b29scywgcGFkZGluZz0xMCkKICAgICAgICB0b3BfZnJhbWUucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlKQoKICAgICAgICAjIExpc3QgQ2hhdHMKICAgICAgICBjaGF0X2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUodG9wX2ZyYW1lLCB0ZXh0PSLliJflh7rogYrlpKkgKExpc3QgQ2hhdHMpIiwgcGFkZGluZz0xMCkKICAgICAgICBjaGF0X2ZyYW1lLnBhY2soZmlsbD10ay5YLCBwYWR5PTUpCiAgICAgICAgCiAgICAgICAgY19vcHRzX2ZyYW1lID0gdHRrLkZyYW1lKGNoYXRfZnJhbWUpCiAgICAgICAgY19vcHRzX2ZyYW1lLnBhY2soZmlsbD10ay5YKQogICAgICAgIHR0ay5MYWJlbChjX29wdHNfZnJhbWUsIHRleHQ9Iui/h+a7pOWZqCAoLWYpOiIpLnBhY2soc2lkZT10ay5MRUZUKQogICAgICAgIHNlbGYudGxzX2NoYXRfZmlsdGVyID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkoY19vcHRzX2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi50bHNfY2hhdF9maWx0ZXIsIHdpZHRoPTQwKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01KQogICAgICAgIAogICAgICAgIHNlbGYudGxzX2NoYXRfanNvbiA9IHRrLkJvb2xlYW5WYXIoKQogICAgICAgIHR0ay5DaGVja2J1dHRvbihjX29wdHNfZnJhbWUsIHRleHQ9Iui+k+WHukpTT04gKC1vIGpzb24pIiwgdmFyaWFibGU9c2VsZi50bHNfY2hhdF9qc29uKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0xNSkKICAgICAgICB0dGsuQnV0dG9uKGNfb3B0c19mcmFtZSwgdGV4dD0i5omn6KGMIiwgY29tbWFuZD1zZWxmLnRvb2xzX2xpc3RfY2hhdHMpLnBhY2soc2lkZT10ay5MRUZUKQoKICAgICAgICAjIEV4cG9ydCBNZW1iZXJzCiAgICAgICAgbWVtX2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUodG9wX2ZyYW1lLCB0ZXh0PSLlr7zlh7rmiJDlkZggKEV4cG9ydCBNZW1iZXJzKSIsIHBhZGRpbmc9MTApCiAgICAgICAgbWVtX2ZyYW1lLnBhY2soZmlsbD10ay5YLCBwYWR5PTUpCiAgICAgICAgCiAgICAgICAgbV9vcHRzX2ZyYW1lID0gdHRrLkZyYW1lKG1lbV9mcmFtZSkKICAgICAgICBtX29wdHNfZnJhbWUucGFjayhmaWxsPXRrLlgpCiAgICAgICAgdHRrLkxhYmVsKG1fb3B0c19mcmFtZSwgdGV4dD0i6IGK5aSpICgtYyk6IikucGFjayhzaWRlPXRrLkxFRlQpCiAgICAgICAgc2VsZi50bHNfbWVtX2NoYXQgPSB0ay5TdHJpbmdWYXIoKQogICAgICAgIHR0ay5FbnRyeShtX29wdHNfZnJhbWUsIHRleHR2YXJpYWJsZT1zZWxmLnRsc19tZW1fY2hhdCwgd2lkdGg9MjApLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgCiAgICAgICAgdHRrLkxhYmVsKG1fb3B0c19mcmFtZSwgdGV4dD0i6L6T5Ye6ICgtbyk6IikucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9KDEwLDApKQogICAgICAgIHNlbGYudGxzX21lbV9vdXQgPSB0ay5TdHJpbmdWYXIoKQogICAgICAgIHR0ay5FbnRyeShtX29wdHNfZnJhbWUsIHRleHR2YXJpYWJsZT1zZWxmLnRsc19tZW1fb3V0LCB3aWR0aD0yMCkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICAKICAgICAgICBzZWxmLnRsc19tZW1fcmF3ID0gdGsuQm9vbGVhblZhcigpCiAgICAgICAgdHRrLkNoZWNrYnV0dG9uKG1fb3B0c19mcmFtZSwgdGV4dD0i5Y6f5aeL5pWw5o2uICgtLXJhdykiLCB2YXJpYWJsZT1zZWxmLnRsc19tZW1fcmF3KS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0xNSkKICAgICAgICB0dGsuQnV0dG9uKG1fb3B0c19mcmFtZSwgdGV4dD0i5omn6KGMIiwgY29tbWFuZD1zZWxmLnRvb2xzX2V4cG9ydF9tZW1iZXJzKS5wYWNrKHNpZGU9dGsuTEVGVCkKCiAgICAgICAgIyBFeHBvcnQgTWVzc2FnZXMKICAgICAgICBtc2dfZnJhbWUgPSB0dGsuTGFiZWxGcmFtZSh0b3BfZnJhbWUsIHRleHQ9IuWvvOWHuua2iOaBryAoRXhwb3J0IE1lc3NhZ2VzKSIsIHBhZGRpbmc9MTApCiAgICAgICAgbXNnX2ZyYW1lLnBhY2soZmlsbD10ay5YLCBwYWR5PTUpCiAgICAgICAgCiAgICAgICAgbXNnX29wdHNfMSA9IHR0ay5GcmFtZShtc2dfZnJhbWUpCiAgICAgICAgbXNnX29wdHNfMS5wYWNrKGZpbGw9dGsuWCwgcGFkeT0yKQogICAgICAgIHR0ay5MYWJlbChtc2dfb3B0c18xLCB0ZXh0PSLogYrlpKkgKC1jKToiKS5wYWNrKHNpZGU9dGsuTEVGVCkKICAgICAgICBzZWxmLnRsc19tc2dfY2hhdCA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkVudHJ5KG1zZ19vcHRzXzEsIHRleHR2YXJpYWJsZT1zZWxmLnRsc19tc2dfY2hhdCwgd2lkdGg9MTUpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgCiAgICAgICAgdHRrLkxhYmVsKG1zZ19vcHRzXzEsIHRleHQ9IuS4u+mimCAoLS10b3BpYyk6IikucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9KDUsMCkpCiAgICAgICAgc2VsZi50bHNfbXNnX3RvcGljID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkobXNnX29wdHNfMSwgdGV4dHZhcmlhYmxlPXNlbGYudGxzX21zZ190b3BpYywgd2lkdGg9MTApLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgCiAgICAgICAgdHRrLkxhYmVsKG1zZ19vcHRzXzEsIHRleHQ9IuWbnuWkjSAoLS1yZXBseSk6IikucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9KDUsMCkpCiAgICAgICAgc2VsZi50bHNfbXNnX3JlcGx5ID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkobXNnX29wdHNfMSwgdGV4dHZhcmlhYmxlPXNlbGYudGxzX21zZ19yZXBseSwgd2lkdGg9MTApLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgCiAgICAgICAgbXNnX29wdHNfMiA9IHR0ay5GcmFtZShtc2dfZnJhbWUpCiAgICAgICAgbXNnX29wdHNfMi5wYWNrKGZpbGw9dGsuWCwgcGFkeT0yKQogICAgICAgIHR0ay5MYWJlbChtc2dfb3B0c18yLCB0ZXh0PSLojIPlm7QgKC1UKToiKS5wYWNrKHNpZGU9dGsuTEVGVCkKICAgICAgICBzZWxmLnRsc19tc2dfdCA9IHRrLlN0cmluZ1Zhcih2YWx1ZT0idGltZSIpCiAgICAgICAgdHRrLkNvbWJvYm94KG1zZ19vcHRzXzIsIHRleHR2YXJpYWJsZT1zZWxmLnRsc19tc2dfdCwgdmFsdWVzPVsidGltZSIsICJpZCIsICJsYXN0Il0sIHdpZHRoPTgsIHN0YXRlPSJyZWFkb25seSIpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgCiAgICAgICAgdHRrLkxhYmVsKG1zZ19vcHRzXzIsIHRleHQ9IuWAvCAoLWkpOiIpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PSg1LDApKQogICAgICAgIHNlbGYudGxzX21zZ19pID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkobXNnX29wdHNfMiwgdGV4dHZhcmlhYmxlPXNlbGYudGxzX21zZ19pLCB3aWR0aD0yMCkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICAKICAgICAgICB0dGsuTGFiZWwobXNnX29wdHNfMiwgdGV4dD0i6L+H5ruk5ZmoICgtZik6IikucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9KDUsMCkpCiAgICAgICAgc2VsZi50bHNfbXNnX2YgPSB0ay5TdHJpbmdWYXIoKQogICAgICAgIHR0ay5FbnRyeShtc2dfb3B0c18yLCB0ZXh0dmFyaWFibGU9c2VsZi50bHNfbXNnX2YsIHdpZHRoPTI1KS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01KQogICAgICAgIAogICAgICAgIG1zZ19vcHRzXzMgPSB0dGsuRnJhbWUobXNnX2ZyYW1lKQogICAgICAgIG1zZ19vcHRzXzMucGFjayhmaWxsPXRrLlgsIHBhZHk9MikKICAgICAgICB0dGsuTGFiZWwobXNnX29wdHNfMywgdGV4dD0i6L6T5Ye6ICgtbyk6IikucGFjayhzaWRlPXRrLkxFRlQpCiAgICAgICAgc2VsZi50bHNfbXNnX291dCA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkVudHJ5KG1zZ19vcHRzXzMsIHRleHR2YXJpYWJsZT1zZWxmLnRsc19tc2dfb3V0LCB3aWR0aD0yMCkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICAKICAgICAgICBzZWxmLnRsc19tc2dfY29udGVudCA9IHRrLkJvb2xlYW5WYXIoKQogICAgICAgIHNlbGYudGxzX21zZ19yYXcgPSB0ay5Cb29sZWFuVmFyKCkKICAgICAgICBzZWxmLnRsc19tc2dfYWxsID0gdGsuQm9vbGVhblZhcigpCiAgICAgICAgdHRrLkNoZWNrYnV0dG9uKG1zZ19vcHRzXzMsIHRleHQ9IuWQq+WGheWuuSAoLS13aXRoLWNvbnRlbnQpIiwgdmFyaWFibGU9c2VsZi50bHNfbXNnX2NvbnRlbnQpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgdHRrLkNoZWNrYnV0dG9uKG1zZ19vcHRzXzMsIHRleHQ9IuWOn+Wni+aVsOaNriAoLS1yYXcpIiwgdmFyaWFibGU9c2VsZi50bHNfbXNnX3JhdykucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICB0dGsuQ2hlY2tidXR0b24obXNnX29wdHNfMywgdGV4dD0i6Z2e5aqS5L2TICgtLWFsbCkiLCB2YXJpYWJsZT1zZWxmLnRsc19tc2dfYWxsKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01KQogICAgICAgIAogICAgICAgIHR0ay5CdXR0b24obXNnX29wdHNfMywgdGV4dD0i5omn6KGMIiwgY29tbWFuZD1zZWxmLnRvb2xzX2V4cG9ydF9tZXNzYWdlcykucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9MTUpCgogICAgICAgICMgRmlsdGVyIEV4cG9ydCBKU09OCiAgICAgICAgZmlsdGVyX2ZyYW1lID0gdHRrLkxhYmVsRnJhbWUodG9wX2ZyYW1lLCB0ZXh0PSLnrZvpgInlr7zlh7rmlofku7YgKEZpbHRlciBFeHBvcnQgSlNPTikiLCBwYWRkaW5nPTEwKQogICAgICAgIGZpbHRlcl9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT01KQogICAgICAgIAogICAgICAgIGZfcm93MSA9IHR0ay5GcmFtZShmaWx0ZXJfZnJhbWUpCiAgICAgICAgZl9yb3cxLnBhY2soZmlsbD10ay5YLCBwYWR5PTIpCiAgICAgICAgdHRrLkxhYmVsKGZfcm93MSwgdGV4dD0iSlNPTiDmlofku7Y6IikucGFjayhzaWRlPXRrLkxFRlQpCiAgICAgICAgc2VsZi50bHNfZmlsdGVyX3BhdGggPSB0ay5TdHJpbmdWYXIodmFsdWU9InRkbC1leHBvcnQuanNvbiIpCiAgICAgICAgdHRrLkVudHJ5KGZfcm93MSwgdGV4dHZhcmlhYmxlPXNlbGYudGxzX2ZpbHRlcl9wYXRoLCB3aWR0aD00MCkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICB0dGsuQnV0dG9uKGZfcm93MSwgdGV4dD0i5rWP6KeILi4uIiwgY29tbWFuZD1sYW1iZGE6IHNlbGYudGxzX2ZpbHRlcl9wYXRoLnNldChmaWxlZGlhbG9nLmFza29wZW5maWxlbmFtZShmaWxldHlwZXM9WygiSlNPTiBmaWxlcyIsICIqLmpzb24iKV0pKSkucGFjayhzaWRlPXRrLkxFRlQpCiAgICAgICAgCiAgICAgICAgZl9yb3cyID0gdHRrLkZyYW1lKGZpbHRlcl9mcmFtZSkKICAgICAgICBmX3JvdzIucGFjayhmaWxsPXRrLlgsIHBhZHk9MikKICAgICAgICB0dGsuTGFiZWwoZl9yb3cyLCB0ZXh0PSLlhbPplK7or40gKOepuuagvC/pgJflj7fliIbpmpQpOiIpLnBhY2soc2lkZT10ay5MRUZUKQogICAgICAgIHNlbGYudGxzX2ZpbHRlcl9rdyA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkVudHJ5KGZfcm93MiwgdGV4dHZhcmlhYmxlPXNlbGYudGxzX2ZpbHRlcl9rdywgd2lkdGg9MzApLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgCiAgICAgICAgZl9yb3czID0gdHRrLkZyYW1lKGZpbHRlcl9mcmFtZSkKICAgICAgICBmX3JvdzMucGFjayhmaWxsPXRrLlgsIHBhZHk9MikKICAgICAgICBzZWxmLnRsc19maWx0ZXJfZmlsZSA9IHRrLkJvb2xlYW5WYXIodmFsdWU9VHJ1ZSkKICAgICAgICB0dGsuQ2hlY2tidXR0b24oZl9yb3czLCB0ZXh0PSLljLnphY3mlofku7blkI0gKGZpbGUpIiwgdmFyaWFibGU9c2VsZi50bHNfZmlsdGVyX2ZpbGUpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgc2VsZi50bHNfZmlsdGVyX3RleHQgPSB0ay5Cb29sZWFuVmFyKHZhbHVlPVRydWUpCiAgICAgICAgdHRrLkNoZWNrYnV0dG9uKGZfcm93MywgdGV4dD0i5Yy56YWN5YaF5a65ICh0ZXh0KSIsIHZhcmlhYmxlPXNlbGYudGxzX2ZpbHRlcl90ZXh0KS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01KQogICAgICAgIHNlbGYudGxzX2ZpbHRlcl9tb2RlID0gdGsuU3RyaW5nVmFyKHZhbHVlPSJhbnkiKQogICAgICAgIHR0ay5SYWRpb2J1dHRvbihmX3JvdzMsIHRleHQ9IuWMuemFjeS7u+S4gCIsIHZhcmlhYmxlPXNlbGYudGxzX2ZpbHRlcl9tb2RlLCB2YWx1ZT0iYW55IikucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICB0dGsuUmFkaW9idXR0b24oZl9yb3czLCB0ZXh0PSLljLnphY3lhajpg6giLCB2YXJpYWJsZT1zZWxmLnRsc19maWx0ZXJfbW9kZSwgdmFsdWU9ImFsbCIpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgCiAgICAgICAgZl9yb3c0ID0gdHRrLkZyYW1lKGZpbHRlcl9mcmFtZSkKICAgICAgICBmX3JvdzQucGFjayhmaWxsPXRrLlgsIHBhZHk9NSkKICAgICAgICBzZWxmLnRsc19maWx0ZXJfYmFja3VwID0gdGsuQm9vbGVhblZhcih2YWx1ZT1UcnVlKQogICAgICAgIHR0ay5DaGVja2J1dHRvbihmX3JvdzQsIHRleHQ9IuS/ruaUueWJjeWkh+S7veS4uiAuYmFrIiwgdmFyaWFibGU9c2VsZi50bHNfZmlsdGVyX2JhY2t1cCkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICB0dGsuQnV0dG9uKGZfcm93NCwgdGV4dD0i5omn6KGM562b6YCJIiwgY29tbWFuZD1zZWxmLnRvb2xzX2ZpbHRlcl9leHBvcnQpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTE1KQogICAgICAgIHR0ay5CdXR0b24oZl9yb3c0LCB0ZXh0PSLlj6blrZjkuLouLi4iLCBjb21tYW5kPXNlbGYudG9vbHNfZmlsdGVyX2V4cG9ydF9hcykucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICAKICAgIGRlZiBzZXR1cF9lbnZfdGFiKHNlbGYpOgogICAgICAgIHRvcF9mcmFtZSA9IHR0ay5GcmFtZShzZWxmLnRhYl9lbnYsIHBhZGRpbmc9MjApCiAgICAgICAgdG9wX2ZyYW1lLnBhY2soZmlsbD10ay5CT1RILCBleHBhbmQ9VHJ1ZSkKICAgICAgICAKICAgICAgICB0dGsuTGFiZWwodG9wX2ZyYW1lLCB0ZXh0PSJUREwg6L+Q6KGM546v5aKD5qOA5p+l5LiO6YWN572uIiwgZm9udD0oIiIsIDE0LCAiYm9sZCIpKS5wYWNrKGFuY2hvcj10ay5XLCBwYWR5PSgwLCAxMCkpCiAgICAgICAgCiAgICAgICAgIyBTdGF0dXMgTGFiZWwKICAgICAgICBzdGF0dXNfZnJhbWUgPSB0dGsuRnJhbWUodG9wX2ZyYW1lKQogICAgICAgIHN0YXR1c19mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT01KQogICAgICAgIHR0ay5MYWJlbChzdGF0dXNfZnJhbWUsIHRleHQ9IuW9k+WJjeeKtuaAgToiLCBmb250PSgiIiwgMTEpKS5wYWNrKHNpZGU9dGsuTEVGVCkKICAgICAgICBzZWxmLmVudl9zdGF0dXNfbGJsID0gdHRrLkxhYmVsKHN0YXR1c19mcmFtZSwgdGV4dD0i5pyq55+lIiwgZm9udD0oIiIsIDExLCAiYm9sZCIpLCBmb3JlZ3JvdW5kPSJncmF5IikKICAgICAgICBzZWxmLmVudl9zdGF0dXNfbGJsLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIAogICAgICAgICMgSW5zdGFsbGF0aW9uIFBhdGgKICAgICAgICBwYXRoX2ZyYW1lID0gdHRrLkZyYW1lKHRvcF9mcmFtZSkKICAgICAgICBwYXRoX2ZyYW1lLnBhY2soZmlsbD10ay5YLCBwYWR5PTEwKQogICAgICAgIGxibCA9IHR0ay5MYWJlbChwYXRoX2ZyYW1lLCB0ZXh0PSLlronoo4Uv56iL5bqP55uu5b2VOiIpCiAgICAgICAgbGJsLnBhY2soc2lkZT10ay5MRUZUKQogICAgICAgIFRvb2xUaXAobGJsLCAi6K6+572uIFRETCDnmoTkuIvovb3op6Pljovot6/lvoTku6Xlj4rlsIbopoHmt7vliqDliLDnjq/looPlj5jph48gUEFUSCDnmoTot6/lvoTjgIIiKQogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdpbnN0YWxsX2Rpcl92YXInKToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Rpcl92YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9b3MuZ2V0Y3dkKCkpCiAgICAgICAgdHRrLkVudHJ5KHBhdGhfZnJhbWUsIHRleHR2YXJpYWJsZT1zZWxmLmluc3RhbGxfZGlyX3Zhciwgd2lkdGg9NTApLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIHR0ay5CdXR0b24ocGF0aF9mcmFtZSwgdGV4dD0i5rWP6KeILi4uIiwgY29tbWFuZD1sYW1iZGE6IHNlbGYuaW5zdGFsbF9kaXJfdmFyLnNldChmaWxlZGlhbG9nLmFza2RpcmVjdG9yeSgpKSBpZiBmaWxlZGlhbG9nLmFza2RpcmVjdG9yeSgpIGVsc2UgTm9uZSkucGFjayhzaWRlPXRrLkxFRlQpCiAgICAgICAgCiAgICAgICAgIyBCdXR0b25zCiAgICAgICAgYnRuX2ZyYW1lID0gdHRrLkZyYW1lKHRvcF9mcmFtZSkKICAgICAgICBidG5fZnJhbWUucGFjayhmaWxsPXRrLlgsIHBhZHk9MTUpCiAgICAgICAgCiAgICAgICAgdHRrLkJ1dHRvbihidG5fZnJhbWUsIHRleHQ9IjEuIOajgOafpSBUREwg5piv5ZCm5Y+v55SoIiwgY29tbWFuZD1zZWxmLmNoZWNrX3RkbF9lbnYpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTUpCiAgICAgICAgdHRrLkJ1dHRvbihidG5fZnJhbWUsIHRleHQ9IjIuIOS4gOmUruS4i+i9veW5tuWuieijhSAoV2luZG93cyB4NjQpIiwgY29tbWFuZD1zZWxmLmluc3RhbGxfdGRsKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01KQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSIzLiDlsIblronoo4Xnm67lvZXmt7vliqDliLDns7vnu58gUEFUSCIsIGNvbW1hbmQ9c2VsZi5hZGRfdG9fcGF0aCkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSkKICAgICAgICAKICAgICAgICAjIE91dHB1dCBpbmZvCiAgICAgICAgaW5mb19mcmFtZSA9IHR0ay5MYWJlbEZyYW1lKHRvcF9mcmFtZSwgdGV4dD0i546v5aKD5pel5b+XIiwgcGFkZGluZz0xMCkKICAgICAgICBpbmZvX2ZyYW1lLnBhY2soZmlsbD10ay5CT1RILCBleHBhbmQ9VHJ1ZSwgcGFkeT0xMCkKICAgICAgICBzZWxmLmVudl9sb2cgPSBzY3JvbGxlZHRleHQuU2Nyb2xsZWRUZXh0KGluZm9fZnJhbWUsIGhlaWdodD0xMCwgc3RhdGU9J2Rpc2FibGVkJywgYmc9JyNmMGYwZjAnKQogICAgICAgIHNlbGYuZW52X2xvZy5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUpCiAgICAgICAgCiAgICAgICAgIyBBdXRvIGNoZWNrIG9uIHN0YXJ0dXAKICAgICAgICBzZWxmLnJvb3QuYWZ0ZXIoNTAwLCBzZWxmLmNoZWNrX3RkbF9lbnYpCgogICAgZGVmIGxvZ19lbnYoc2VsZiwgbXNnKToKICAgICAgICBzZWxmLmVudl9sb2cuY29uZmlnKHN0YXRlPSdub3JtYWwnKQogICAgICAgIHNlbGYuZW52X2xvZy5pbnNlcnQodGsuRU5ELCBtc2cgKyAiXG4iKQogICAgICAgIHNlbGYuZW52X2xvZy5zZWUodGsuRU5EKQogICAgICAgIHNlbGYuZW52X2xvZy5jb25maWcoc3RhdGU9J2Rpc2FibGVkJykKCiAgICBkZWYgY2hlY2tfdGRsX2VudihzZWxmKToKICAgICAgICBzZWxmLmxvZ19lbnYoIuato+WcqOajgOafpSBUREwg5piv5ZCm5a6J6KOF5Zyo57O757ufIFBBVEgg5LitLi4uIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKFsidGRsIiwgInZlcnNpb24iXSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULCB0ZXh0PVRydWUsIGNyZWF0aW9uZmxhZ3M9c3VicHJvY2Vzcy5DUkVBVEVfTk9fV0lORE9XIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIGVsc2UgMCkKICAgICAgICAgICAgaWYgcmVzdWx0LnJldHVybmNvZGUgPT0gMDoKICAgICAgICAgICAgICAgIHNlbGYuZW52X3N0YXR1c19sYmwuY29uZmlnKHRleHQ9IuW3suWuieijheS4lOWPr+eUqCIsIGZvcmVncm91bmQ9ImdyZWVuIikKICAgICAgICAgICAgICAgIHNlbGYubG9nX2VudihmIuajgOafpeaIkOWKnzoge3Jlc3VsdC5zdGRvdXQuc3RyaXAoKX0iKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0ZGxfcGF0aCA9IHNlbGYuZmluZF90ZGxfcGF0aCgpCiAgICAgICAgICAgICAgICBpZiB0ZGxfcGF0aDoKICAgICAgICAgICAgICAgICAgICB0ZGxfZGlyID0gb3MucGF0aC5kaXJuYW1lKHRkbF9wYXRoKQogICAgICAgICAgICAgICAgICAgIHNlbGYubG9nX2VudihmIlRETCDlronoo4Xnm67lvZU6IHt0ZGxfZGlyfSIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Rpcl92YXIuc2V0KHRkbF9kaXIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmVudl9zdGF0dXNfbGJsLmNvbmZpZyh0ZXh0PSLlkb3ku6TlpLHotKUiLCBmb3JlZ3JvdW5kPSJyZWQiKQogICAgICAgICAgICAgICAgc2VsZi5sb2dfZW52KGYi5ZG95Luk5omn6KGM5aSx6LSlOiB7cmVzdWx0LnN0ZG91dC5zdHJpcCgpfSIpCiAgICAgICAgZXhjZXB0IEZpbGVOb3RGb3VuZEVycm9yOgogICAgICAgICAgICBzZWxmLmVudl9zdGF0dXNfbGJsLmNvbmZpZyh0ZXh0PSLmnKrlronoo4XmiJbmnKrmt7vliqDliLAgUEFUSCIsIGZvcmVncm91bmQ9InJlZCIpCiAgICAgICAgICAgIHNlbGYubG9nX2Vudigi5pyq5om+5YiwICd0ZGwnIOWRveS7pOOAguivt+WFiOWuieijheaIluWwhuWFtui3r+W+hOa3u+WKoOWIsOezu+e7n+eOr+Wig+WPmOmHjyBQQVRIIOS4reOAgiIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBzZWxmLmVudl9zdGF0dXNfbGJsLmNvbmZpZyh0ZXh0PSLmo4Dmn6Xlh7rplJkiLCBmb3JlZ3JvdW5kPSJyZWQiKQogICAgICAgICAgICBzZWxmLmxvZ19lbnYoZiLlj5HnlJ/lvILluLg6IHtzdHIoZSl9IikKCiAgICBkZWYgZmluZF90ZGxfcGF0aChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oWyJ3aGVyZSIsICJ0ZGwiXSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULCB0ZXh0PVRydWUsIGNyZWF0aW9uZmxhZ3M9c3VicHJvY2Vzcy5DUkVBVEVfTk9fV0lORE9XKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oWyJ3aGljaCIsICJ0ZGwiXSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULCB0ZXh0PVRydWUpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiByZXN1bHQucmV0dXJuY29kZSA9PSAwIGFuZCByZXN1bHQuc3Rkb3V0LnN0cmlwKCk6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnN0ZG91dC5zdHJpcCgpLnNwbGl0KCdcbicpWzBdLnN0cmlwKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgaW5zdGFsbF90ZGwoc2VsZik6CiAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJ3aW4zMiI6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2Vycm9yKCLplJnor68iLCAi5LiA6ZSu5a6J6KOF5LuF5pSv5oyBIFdpbmRvd3Mg57O757uf44CCIikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIAogICAgICAgIGluc3RhbGxfZGlyID0gc2VsZi5pbnN0YWxsX2Rpcl92YXIuZ2V0KCkuc3RyaXAoKQogICAgICAgIGlmIG5vdCBpbnN0YWxsX2RpcjoKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93d2FybmluZygi6K2m5ZGKIiwgIuivt+WFiOiuvue9ruWuieijheebruW9le+8gSIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaW5zdGFsbF9kaXIpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhpbnN0YWxsX2RpcikKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoIumUmeivryIsIGYi5peg5rOV5Yib5bu65a6J6KOF55uu5b2VOiB7c3RyKGUpfSIpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgCiAgICAgICAgZGVmIHRhc2soKToKICAgICAgICAgICAgc2VsZi5sb2dfZW52KGYi5byA5aeL5LiL6L29djAuMjAuMSBUREwgKFdpbmRvd3MgYW1kNjQpIOWIsCB7aW5zdGFsbF9kaXJ9Li4uIOiLpeWksei0peivt+aJi+WKqOS4i+i9vWh0dHBzOi8vZ2l0aHViLmNvbS9peWVhci90ZGwvcmVsZWFzZXMvdGFnL3YwLjIwLjEiKQogICAgICAgICAgICB1cmwgPSAiaHR0cHM6Ly9naXRodWIuY29tL2l5ZWFyL3RkbC9yZWxlYXNlcy9kb3dubG9hZC92MC4yMC4xL3RkbF9XaW5kb3dzXzY0Yml0LnppcCIKICAgICAgICAgICAgemlwX3BhdGggPSBvcy5wYXRoLmpvaW4oaW5zdGFsbF9kaXIsICJ0ZGxfZG93bmxvYWRlZC56aXAiKQogICAgICAgICAgICAKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdXJsbGliLnJlcXVlc3QudXJscmV0cmlldmUodXJsLCB6aXBfcGF0aCkKICAgICAgICAgICAgICAgIHNlbGYubG9nX2Vudigi5LiL6L295a6M5oiQ44CC5q2j5Zyo6Kej5Y6LLi4uIikKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX3BhdGgsICdyJykgYXMgemlwX3JlZjoKICAgICAgICAgICAgICAgICAgICB6aXBfcmVmLmV4dHJhY3RhbGwoaW5zdGFsbF9kaXIpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGYubG9nX2VudihmIuino+WOi+WujOaIkO+8gXRkbC5leGUg5bey5o+Q5Y+W5Yiw55uu5b2VOiB7aW5zdGFsbF9kaXJ9IikKICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh6aXBfcGF0aCkKICAgICAgICAgICAgICAgIHNlbGYubG9nX2Vudigi5riF55CG5Li05pe25Y6L57yp5YyF5a6M5oiQ44CCIikKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZi5sb2dfZW52KCJcbuaPkOekuu+8muaCqOWPr+S7peeCueWHuyAn5bCG5a6J6KOF55uu5b2V5re75Yqg5Yiw57O757ufIFBBVEgnIOadpeiuqeWFqOWxgOWPr+eUqOOAgiIpCiAgICAgICAgICAgICAgICBzZWxmLnJvb3QuYWZ0ZXIoMCwgc2VsZi5jaGVja190ZGxfZW52KQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ19lbnYoZiLlronoo4XlpLHotKU6IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIAogICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXRhc2ssIGRhZW1vbj1UcnVlKS5zdGFydCgpCgogICAgZGVmIGFkZF90b19wYXRoKHNlbGYpOgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAid2luMzIiOgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dlcnJvcigi6ZSZ6K+vIiwgIua3u+WKoCBQQVRIIOS7heaUr+aMgSBXaW5kb3dzIOezu+e7n+OAgiIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAKICAgICAgICBpbnN0YWxsX2RpciA9IHNlbGYuaW5zdGFsbF9kaXJfdmFyLmdldCgpLnN0cmlwKCkKICAgICAgICBpZiBub3QgaW5zdGFsbF9kaXIgb3Igbm90IG9zLnBhdGguZXhpc3RzKGluc3RhbGxfZGlyKToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93d2FybmluZygi6K2m5ZGKIiwgIuaXoOaViOeahOWuieijheebruW9le+8jOivt+WFiOehruiupOebruW9leWtmOWcqOOAgiIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYubG9nX2VudihmIuWHhuWkh+Wwhui3r+W+hOa3u+WKoOWIsOeUqOaIt+eOr+Wig+WPmOmHjyBQQVRIOiB7aW5zdGFsbF9kaXJ9IikKICAgICAgICAgICAgCiAgICAgICAgICAgIGtleSA9IHdpbnJlZy5PcGVuS2V5KHdpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwgIkVudmlyb25tZW50IiwgMCwgd2lucmVnLktFWV9BTExfQUNDRVNTKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXRoX3ZhbCwgXyA9IHdpbnJlZy5RdWVyeVZhbHVlRXgoa2V5LCAiUGF0aCIpCiAgICAgICAgICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKICAgICAgICAgICAgICAgIHBhdGhfdmFsID0gIiIKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBwYXRocyA9IFtwIGZvciBwIGluIHBhdGhfdmFsLnNwbGl0KCc7JykgaWYgcF0KICAgICAgICAgICAgaWYgaW5zdGFsbF9kaXIgaW4gcGF0aHM6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ19lbnYoIui3r+W+hOW3suWtmOWcqOS6jueOr+Wig+WPmOmHjyBQQVRIIOS4re+8jOaXoOmcgOmHjeWkjea3u+WKoOOAgiIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRocy5hcHBlbmQoaW5zdGFsbF9kaXIpCiAgICAgICAgICAgICAgICBuZXdfcGF0aCA9ICc7Jy5qb2luKHBhdGhzKQogICAgICAgICAgICAgICAgd2lucmVnLlNldFZhbHVlRXgoa2V5LCAiUGF0aCIsIDAsIHdpbnJlZy5SRUdfRVhQQU5EX1NaLCBuZXdfcGF0aCkKICAgICAgICAgICAgICAgIHNlbGYubG9nX2Vudigi5oiQ5Yqf5re75Yqg5Yiw55So5oi3546v5aKD5Y+Y6YePIFBBVEjvvIFcbuazqOaEj++8mkdVSSDnqIvluo/lj6/og73pnIDopoHph43lkK/miY3og73ojrflj5bliLDmnIDmlrDnmoQgUEFUSCDnjq/looPlj5jph4/jgIIiKQogICAgICAgICAgICAgICAgIyBVcGRhdGUgY3VycmVudCBwcm9jZXNzIGVudmlyb25tZW50IHNvIHdlIGRvbid0IGhhdmUgdG8gcmVzdGFydCBmb3Igc2ltcGxlIGNvbW1hbmRzCiAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWyJQQVRIIl0gPSBpbnN0YWxsX2RpciArICI7IiArIG9zLmVudmlyb24uZ2V0KCJQQVRIIiwgIiIpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgd2lucmVnLkNsb3NlS2V5KGtleSkKICAgICAgICAgICAgc2VsZi5yb290LmFmdGVyKDAsIHNlbGYuY2hlY2tfdGRsX2VudikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHNlbGYubG9nX2VudihmIuS/ruaUueeOr+Wig+WPmOmHj+Wksei0pToge3N0cihlKX1cbuivt+WwneivleS7peeuoeeQhuWRmOi6q+S7vei/kOihjOaIluaJi+WKqOa3u+WKoOOAgiIpCgogICAgZGVmIHNldHVwX2dsb2JhbF90YWIoc2VsZik6CiAgICAgICAgdG9wX2ZyYW1lID0gdHRrLkZyYW1lKHNlbGYudGFiX2dsb2JhbCwgcGFkZGluZz0xMCkKICAgICAgICB0b3BfZnJhbWUucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlKQogICAgICAgIAogICAgICAgIHR0ay5MYWJlbCh0b3BfZnJhbWUsIHRleHQ9IuazqOaEjzog6L+Z5Lqb6YCJ6aG55bCG6KKr6ZmE5Yqg5Yiw5omA5pyJ5omn6KGM55qEIFRETCDlkb3ku6TliY3jgIIiLCBmb250PSgiIiwgMTApLCBmb3JlZ3JvdW5kPSJibHVlIikuZ3JpZChyb3c9MCwgY29sdW1uPTAsIGNvbHVtbnNwYW49Miwgc3RpY2t5PXRrLlcsIHBhZHk9KDAsIDEwKSkKICAgICAgICAKICAgICAgICBsYmwgPSB0dGsuTGFiZWwodG9wX2ZyYW1lLCB0ZXh0PSLlkb3lkI3nqbrpl7QgKC1uLy0tbnMpOiIpCiAgICAgICAgbGJsLmdyaWQocm93PTEsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIFRvb2xUaXAobGJsLCAi5q+P5Liq5ZG95ZCN56m66Ze05Luj6KGo5LiA5LiqIFRlbGVncmFtIOW4kOWPt+OAgueVmeepuum7mOiupOS9v+eUqCBkZWZhdWx044CCIikKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnZ2JfbnMnKTogc2VsZi5nYl9ucyA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkVudHJ5KHRvcF9mcmFtZSwgdGV4dHZhcmlhYmxlPXNlbGYuZ2JfbnMsIHdpZHRoPTIwKS5ncmlkKHJvdz0xLCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NSkKICAgICAgICAKICAgICAgICBsYmwgPSB0dGsuTGFiZWwodG9wX2ZyYW1lLCB0ZXh0PSLku6PnkIYgKC0tcHJveHkpOiIpCiAgICAgICAgbGJsLmdyaWQocm93PTIsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIFRvb2xUaXAobGJsLCAi6K6+572u5Luj55CG77yM5aaCIHNvY2tzNTovL2xvY2FsaG9zdDoxMDgwIOaIliBodHRwOi8vbG9jYWxob3N0OjgwODAiKQogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdnYl9wcm94eScpOiBzZWxmLmdiX3Byb3h5ID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkodG9wX2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi5nYl9wcm94eSwgd2lkdGg9MzApLmdyaWQocm93PTIsIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD01KQogICAgICAgIAogICAgICAgIGxibCA9IHR0ay5MYWJlbCh0b3BfZnJhbWUsIHRleHQ9IuWtmOWCqCAoLS1zdG9yYWdlKToiKQogICAgICAgIGxibC5ncmlkKHJvdz0zLCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBUb29sVGlwKGxibCwgIuiuvue9ruWtmOWCqOexu+Wei+WSjOi3r+W+hOOAglxu6buY6K6kOiB0eXBlPWJvbHQscGF0aD1+Ly50ZGwvZGF0YVxu5Y+v6YCJ57G75Z6LOiBib2x0LCBmaWxlIikKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnZ2Jfc3RvcmFnZScpOiBzZWxmLmdiX3N0b3JhZ2UgPSB0ay5TdHJpbmdWYXIoKQogICAgICAgIHR0ay5FbnRyeSh0b3BfZnJhbWUsIHRleHR2YXJpYWJsZT1zZWxmLmdiX3N0b3JhZ2UsIHdpZHRoPTQwKS5ncmlkKHJvdz0zLCBjb2x1bW49MSwgY29sdW1uc3Bhbj0yLCBzdGlja3k9dGsuVywgcGFkeD01KQogICAgICAgIAogICAgICAgIGxibCA9IHR0ay5MYWJlbCh0b3BfZnJhbWUsIHRleHQ9Ik5UUCDmnI3liqHlmaggKC0tbnRwKToiKQogICAgICAgIGxibC5ncmlkKHJvdz00LCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBUb29sVGlwKGxibCwgIuiuvue9ruaXtumXtOacjeWKoeWZqO+8jOWmgiBwb29sLm50cC5vcmfjgIJcbuWmguaenOS4uuepuuWwhuS9v+eUqOezu+e7n+aXtumXtOOAgiIpCiAgICAgICAgc2VsZi5nYl9udHAgPSB0ay5TdHJpbmdWYXIoKQogICAgICAgIHR0ay5FbnRyeSh0b3BfZnJhbWUsIHRleHR2YXJpYWJsZT1zZWxmLmdiX250cCwgd2lkdGg9MjApLmdyaWQocm93PTQsIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD01KQogICAgICAgIAogICAgICAgIGxibCA9IHR0ay5MYWJlbCh0b3BfZnJhbWUsIHRleHQ9IumHjei/nui2heaXtiAoLS1yZWNvbm5lY3QtdGltZW91dCk6IikKICAgICAgICBsYmwuZ3JpZChyb3c9NSwgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgVG9vbFRpcChsYmwsICLnvZHnu5zkuI3nqLPml7borr7nva7ovoPplb/ml7bpl7TvvIzlpoIgMW0zMHPjgIIwIOihqOekuuaXoOmZkOOAglxu6buY6K6kOiAybSIpCiAgICAgICAgc2VsZi5nYl9yZWN0aW1lb3V0ID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkodG9wX2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi5nYl9yZWN0aW1lb3V0LCB3aWR0aD0xNSkuZ3JpZChyb3c9NSwgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTUpCiAgICAgICAgCiAgICAgICAgbGJsID0gdHRrLkxhYmVsKHRvcF9mcmFtZSwgdGV4dD0i6L+e5o6l5rGg5aSn5bCPICgtLXBvb2wpOiIpCiAgICAgICAgbGJsLmdyaWQocm93PTYsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIFRvb2xUaXAobGJsLCAi5Yqg6YCf6K+36LCD5aSn77yMMCDooajnpLrml6DpmZDjgIJcbum7mOiupDogOCIpCiAgICAgICAgc2VsZi5nYl9wb29sID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICB0dGsuRW50cnkodG9wX2ZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi5nYl9wb29sLCB3aWR0aD0xNSkuZ3JpZChyb3c9NiwgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTUpCiAgICAgICAgCiAgICAgICAgbGJsID0gdHRrLkxhYmVsKHRvcF9mcmFtZSwgdGV4dD0i5Lu75Yqh5bu26L+fICgtLWRlbGF5KToiKQogICAgICAgIGxibC5ncmlkKHJvdz03LCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBUb29sVGlwKGxibCwgIumYsuatoumikee5geivt+axguiiq+mZkOa1ge+8jOiuvue9ruavj+asoeivt+axgumXtOmalO+8jOWmgiA1c+OAglxu6buY6K6kOiAwcyIpCiAgICAgICAgc2VsZi5nYl9kZWxheSA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkVudHJ5KHRvcF9mcmFtZSwgdGV4dHZhcmlhYmxlPXNlbGYuZ2JfZGVsYXksIHdpZHRoPTE1KS5ncmlkKHJvdz03LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NSkKICAgICAgICAKICAgICAgICBzZWxmLmdiX2RlYnVnID0gdGsuQm9vbGVhblZhcigpCiAgICAgICAgY2hrID0gdHRrLkNoZWNrYnV0dG9uKHRvcF9mcmFtZSwgdGV4dD0i5byA5ZCv6LCD6K+V5pel5b+XICgtLWRlYnVnKSIsIHZhcmlhYmxlPXNlbGYuZ2JfZGVidWcpCiAgICAgICAgY2hrLmdyaWQocm93PTgsIGNvbHVtbj0wLCBjb2x1bW5zcGFuPTIsIHN0aWNreT10ay5XLCBwYWR5PTE1KQogICAgICAgIFRvb2xUaXAoY2hrLCAi5Zyo5o6n5Yi25Y+w5Lit6L6T5Ye66K+m57uG55qE5omn6KGM5pel5b+X44CCIikKCiAgICBkZWYgc2hvd19jb25maXJtX2RpYWxvZyhzZWxmLCBjbWRfc3RyKToKICAgICAgICBkaWFsb2cgPSB0ay5Ub3BsZXZlbChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLnRpdGxlKCLnoa7orqTmiafooYwiKQogICAgICAgIGRpYWxvZy5nZW9tZXRyeSgiNjAweDIwMCIpCiAgICAgICAgZGlhbG9nLnJlc2l6YWJsZShGYWxzZSwgRmFsc2UpCiAgICAgICAgZGlhbG9nLnRyYW5zaWVudChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLmdyYWJfc2V0KCkKICAgICAgICAKICAgICAgICBzY3JlZW5feCA9IHNlbGYucm9vdC53aW5mb194KCkgKyAoc2VsZi5yb290LndpbmZvX3dpZHRoKCkgLy8gMikgLSAzMDAKICAgICAgICBzY3JlZW5feSA9IHNlbGYucm9vdC53aW5mb195KCkgKyAoc2VsZi5yb290LndpbmZvX2hlaWdodCgpIC8vIDIpIC0gMTAwCiAgICAgICAgZGlhbG9nLmdlb21ldHJ5KGYiK3tzY3JlZW5feH0re3NjcmVlbl95fSIpCiAgICAgICAgCiAgICAgICAgcmVzdWx0ID0geyJjb25maXJtIjogRmFsc2UsICJjb3B5IjogRmFsc2V9CiAgICAgICAgCiAgICAgICAgaW5mb19mcmFtZSA9IHR0ay5GcmFtZShkaWFsb2csIHBhZGRpbmc9MjApCiAgICAgICAgaW5mb19mcmFtZS5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUpCiAgICAgICAgCiAgICAgICAgdHRrLkxhYmVsKGluZm9fZnJhbWUsIHRleHQ9IuWNs+WwhuaJp+ihjOS7peS4i+WRveS7pDoiLCBmb250PSgiIiwgMTApKS5wYWNrKGFuY2hvcj10ay5XKQogICAgICAgIAogICAgICAgIGNtZF9mcmFtZSA9IHR0ay5GcmFtZShpbmZvX2ZyYW1lLCByZWxpZWY9dGsuU1VOS0VOLCBib3JkZXJ3aWR0aD0xKQogICAgICAgIGNtZF9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT0xMCkKICAgICAgICBjbWRfbGFiZWwgPSB0ay5UZXh0KGNtZF9mcmFtZSwgaGVpZ2h0PTMsIHdyYXA9dGsuV09SRCwgYmc9JyNmNWY1ZjUnLCByZWxpZWY9dGsuRkxBVCkKICAgICAgICBjbWRfbGFiZWwucGFjayhmaWxsPXRrLlgsIHBhZHg9NSwgcGFkeT01KQogICAgICAgIGNtZF9sYWJlbC5pbnNlcnQoIjEuMCIsIGNtZF9zdHIpCiAgICAgICAgY21kX2xhYmVsLmNvbmZpZyhzdGF0ZT0nZGlzYWJsZWQnKQogICAgICAgIAogICAgICAgIGJ0bl9mcmFtZSA9IHR0ay5GcmFtZShpbmZvX2ZyYW1lKQogICAgICAgIGJ0bl9mcmFtZS5wYWNrKGZpbGw9dGsuWCwgcGFkeT0oMTAsIDApKQogICAgICAgIAogICAgICAgIGRlZiBvbl9leGVjdXRlKCk6CiAgICAgICAgICAgIHJlc3VsdFsiY29uZmlybSJdID0gVHJ1ZQogICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCiAgICAgICAgICAgIAogICAgICAgIGRlZiBvbl9jb3B5KCk6CiAgICAgICAgICAgIHJlc3VsdFsiY29weSJdID0gVHJ1ZQogICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCiAgICAgICAgICAgIAogICAgICAgIGRlZiBvbl9vcGVuX2NtZCgpOgogICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCiAgICAgICAgICAgIHN1YnByb2Nlc3MuUG9wZW4oWyJjbWQuZXhlIl0sIGN3ZD1vcy5nZXRjd2QoKSwgY3JlYXRpb25mbGFncz1zdWJwcm9jZXNzLkNSRUFURV9ORVdfQ09OU09MRSkKICAgICAgICAgICAgc2VsZi5yb290LmFmdGVyKDEwMCwgbGFtYmRhOiBzZWxmLnJvb3QuY2xpcGJvYXJkX2NsZWFyKCkpCiAgICAgICAgICAgIHNlbGYucm9vdC5hZnRlcigxNTAsIGxhbWJkYTogc2VsZi5yb290LmNsaXBib2FyZF9hcHBlbmQoY21kX3N0cikpCiAgICAgICAgICAgIAogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSLmiafooYwgKEV4ZWN1dGUpIiwgY29tbWFuZD1vbl9leGVjdXRlLCBzdHlsZT0iQWNjZW50LlRCdXR0b24iKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01LCBleHBhbmQ9VHJ1ZSwgZmlsbD10ay5YKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSLlpI3liLblkb3ku6QgKENvcHkpIiwgY29tbWFuZD1vbl9jb3B5KS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD01LCBleHBhbmQ9VHJ1ZSwgZmlsbD10ay5YKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSLmiZPlvIAgQ01EIiwgY29tbWFuZD1vbl9vcGVuX2NtZCkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9NSwgZXhwYW5kPVRydWUsIGZpbGw9dGsuWCkKICAgICAgICAKICAgICAgICBkaWFsb2cud2FpdF93aW5kb3coKQogICAgICAgIHJldHVybiByZXN1bHRbImNvbmZpcm0iXSwgcmVzdWx0WyJjb3B5Il0KCiAgICBkZWYgZ2V0X2dsb2JhbF9hcmdzKHNlbGYpOgogICAgICAgIGFyZ3MgPSBbXQogICAgICAgIGlmIHNlbGYuZ2JfbnMuZ2V0KCkuc3RyaXAoKTogYXJncy5leHRlbmQoWyItbiIsIHNlbGYuZ2JfbnMuZ2V0KCkuc3RyaXAoKV0pCiAgICAgICAgaWYgc2VsZi5nYl9wcm94eS5nZXQoKS5zdHJpcCgpOiBhcmdzLmV4dGVuZChbIi0tcHJveHkiLCBzZWxmLmdiX3Byb3h5LmdldCgpLnN0cmlwKCldKQogICAgICAgIGlmIHNlbGYuZ2Jfc3RvcmFnZS5nZXQoKS5zdHJpcCgpOiBhcmdzLmV4dGVuZChbIi0tc3RvcmFnZSIsIHNlbGYuZ2Jfc3RvcmFnZS5nZXQoKS5zdHJpcCgpXSkKICAgICAgICBpZiBzZWxmLmdiX250cC5nZXQoKS5zdHJpcCgpOiBhcmdzLmV4dGVuZChbIi0tbnRwIiwgc2VsZi5nYl9udHAuZ2V0KCkuc3RyaXAoKV0pCiAgICAgICAgaWYgc2VsZi5nYl9yZWN0aW1lb3V0LmdldCgpLnN0cmlwKCk6IGFyZ3MuZXh0ZW5kKFsiLS1yZWNvbm5lY3QtdGltZW91dCIsIHNlbGYuZ2JfcmVjdGltZW91dC5nZXQoKS5zdHJpcCgpXSkKICAgICAgICBpZiBzZWxmLmdiX3Bvb2wuZ2V0KCkuc3RyaXAoKTogYXJncy5leHRlbmQoWyItLXBvb2wiLCBzZWxmLmdiX3Bvb2wuZ2V0KCkuc3RyaXAoKV0pCiAgICAgICAgaWYgc2VsZi5nYl9kZWxheS5nZXQoKS5zdHJpcCgpOiBhcmdzLmV4dGVuZChbIi0tZGVsYXkiLCBzZWxmLmdiX2RlbGF5LmdldCgpLnN0cmlwKCldKQogICAgICAgIGlmIHNlbGYuZ2JfZGVidWcuZ2V0KCk6IGFyZ3MuYXBwZW5kKCItLWRlYnVnIikKICAgICAgICByZXR1cm4gYXJncwoKICAgICMgLS0tIFV0aWxpdHkgTWV0aG9kcyAtLS0KICAgIGRlZiBhZGRfaXRlbXNfdG9fbGlzdGJveChzZWxmLCBsaXN0Ym94LCBpdGVtcyk6CiAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgIGlmIGl0ZW06IGxpc3Rib3guaW5zZXJ0KHRrLkVORCwgaXRlbSkKCiAgICBkZWYgcmVtb3ZlX2xpc3Rib3hfaXRlbShzZWxmLCBsaXN0Ym94KToKICAgICAgICBzZWxlY3Rpb24gPSBsaXN0Ym94LmN1cnNlbGVjdGlvbigpCiAgICAgICAgaWYgc2VsZWN0aW9uOgogICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChzZWxlY3Rpb24pOgogICAgICAgICAgICAgICAgbGlzdGJveC5kZWxldGUoaSkKICAgICAgICAgICAgICAgIAogICAgZGVmIGFkZF9kbF9qc29uKHNlbGYpOgogICAgICAgIHNlbGYuYWRkX2l0ZW1zX3RvX2xpc3Rib3goc2VsZi5kbF9qc29uX2xpc3Rib3gsIGZpbGVkaWFsb2cuYXNrb3BlbmZpbGVuYW1lcyhmaWxldHlwZXM9WygiSlNPTiBmaWxlcyIsICIqLmpzb24iKSwgKCJBbGwgZmlsZXMiLCAiKi4qIildKSkKCiAgICBkZWYgdG9vbHNfbGlzdF9jaGF0cyhzZWxmKToKICAgICAgICBjbWQgPSBbInRkbCJdICsgc2VsZi5nZXRfZ2xvYmFsX2FyZ3MoKSArIFsiY2hhdCIsICJscyJdCiAgICAgICAgaWYgc2VsZi50bHNfY2hhdF9maWx0ZXIuZ2V0KCkuc3RyaXAoKTogY21kLmV4dGVuZChbIi1mIiwgc2VsZi50bHNfY2hhdF9maWx0ZXIuZ2V0KCkuc3RyaXAoKV0pCiAgICAgICAgaWYgc2VsZi50bHNfY2hhdF9qc29uLmdldCgpOiBjbWQuZXh0ZW5kKFsiLW8iLCAianNvbiJdKQogICAgICAgIHNlbGYucnVuX2JhY2tncm91bmRfdGFzayhjbWQpCiAgICAgICAgCiAgICBkZWYgdG9vbHNfZXhwb3J0X21lbWJlcnMoc2VsZik6CiAgICAgICAgY21kID0gWyJ0ZGwiXSArIHNlbGYuZ2V0X2dsb2JhbF9hcmdzKCkgKyBbImNoYXQiLCAidXNlcnMiXQogICAgICAgIGlmIHNlbGYudGxzX21lbV9jaGF0LmdldCgpLnN0cmlwKCk6IGNtZC5leHRlbmQoWyItYyIsIHNlbGYudGxzX21lbV9jaGF0LmdldCgpLnN0cmlwKCldKQogICAgICAgIGlmIHNlbGYudGxzX21lbV9vdXQuZ2V0KCkuc3RyaXAoKTogY21kLmV4dGVuZChbIi1vIiwgc2VsZi50bHNfbWVtX291dC5nZXQoKS5zdHJpcCgpXSkKICAgICAgICBpZiBzZWxmLnRsc19tZW1fcmF3LmdldCgpOiBjbWQuYXBwZW5kKCItLXJhdyIpCiAgICAgICAgc2VsZi5ydW5fYmFja2dyb3VuZF90YXNrKGNtZCkKICAgICAgICAKICAgIGRlZiB0b29sc19leHBvcnRfbWVzc2FnZXMoc2VsZik6CiAgICAgICAgY21kID0gWyJ0ZGwiXSArIHNlbGYuZ2V0X2dsb2JhbF9hcmdzKCkgKyBbImNoYXQiLCAiZXhwb3J0Il0KICAgICAgICBpZiBzZWxmLnRsc19tc2dfY2hhdC5nZXQoKS5zdHJpcCgpOiBjbWQuZXh0ZW5kKFsiLWMiLCBzZWxmLnRsc19tc2dfY2hhdC5nZXQoKS5zdHJpcCgpXSkKICAgICAgICBpZiBzZWxmLnRsc19tc2dfdG9waWMuZ2V0KCkuc3RyaXAoKTogY21kLmV4dGVuZChbIi0tdG9waWMiLCBzZWxmLnRsc19tc2dfdG9waWMuZ2V0KCkuc3RyaXAoKV0pCiAgICAgICAgaWYgc2VsZi50bHNfbXNnX3JlcGx5LmdldCgpLnN0cmlwKCk6IGNtZC5leHRlbmQoWyItLXJlcGx5Iiwgc2VsZi50bHNfbXNnX3JlcGx5LmdldCgpLnN0cmlwKCldKQogICAgICAgIAogICAgICAgIHRfdmFsID0gc2VsZi50bHNfbXNnX3QuZ2V0KCkKICAgICAgICBpZiB0X3ZhbDogY21kLmV4dGVuZChbIi1UIiwgdF92YWxdKQogICAgICAgIGlmIHNlbGYudGxzX21zZ19pLmdldCgpLnN0cmlwKCk6IGNtZC5leHRlbmQoWyItaSIsIHNlbGYudGxzX21zZ19pLmdldCgpLnN0cmlwKCldKQogICAgICAgIGlmIHNlbGYudGxzX21zZ19mLmdldCgpLnN0cmlwKCk6IGNtZC5leHRlbmQoWyItZiIsIHNlbGYudGxzX21zZ19mLmdldCgpLnN0cmlwKCldKQogICAgICAgIGlmIHNlbGYudGxzX21zZ19vdXQuZ2V0KCkuc3RyaXAoKTogY21kLmV4dGVuZChbIi1vIiwgc2VsZi50bHNfbXNnX291dC5nZXQoKS5zdHJpcCgpXSkKICAgICAgICAKICAgICAgICBpZiBzZWxmLnRsc19tc2dfY29udGVudC5nZXQoKTogY21kLmFwcGVuZCgiLS13aXRoLWNvbnRlbnQiKQogICAgICAgIGlmIHNlbGYudGxzX21zZ19yYXcuZ2V0KCk6IGNtZC5hcHBlbmQoIi0tcmF3IikKICAgICAgICBpZiBzZWxmLnRsc19tc2dfYWxsLmdldCgpOiBjbWQuYXBwZW5kKCItLWFsbCIpCiAgICAgICAgCiAgICAgICAgc2VsZi5ydW5fYmFja2dyb3VuZF90YXNrKGNtZCkKCiAgICBkZWYgdG9vbHNfZmlsdGVyX2V4cG9ydChzZWxmKToKICAgICAgICBzZWxmLl9maWx0ZXJfZXhwb3J0KHNhdmVfYXM9RmFsc2UpCgogICAgZGVmIHRvb2xzX2ZpbHRlcl9leHBvcnRfYXMoc2VsZik6CiAgICAgICAgc2VsZi5fZmlsdGVyX2V4cG9ydChzYXZlX2FzPVRydWUpCgogICAgZGVmIF9maWx0ZXJfZXhwb3J0KHNlbGYsIHNhdmVfYXM9RmFsc2UpOgogICAgICAgIGpzb25fcGF0aCA9IHNlbGYudGxzX2ZpbHRlcl9wYXRoLmdldCgpLnN0cmlwKCkKICAgICAgICBrd190ZXh0ID0gc2VsZi50bHNfZmlsdGVyX2t3LmdldCgpLnN0cmlwKCkKICAgICAgICBpZiBub3QganNvbl9wYXRoIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyhqc29uX3BhdGgpOgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3d3YXJuaW5nKCLorablkYoiLCAi6K+35oyH5a6a5pyJ5pWI55qEIEpTT04g5paH5Lu26Lev5b6E44CCIikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IGt3X3RleHQ6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd3dhcm5pbmcoIuitpuWRiiIsICLor7fovpPlhaXoh7PlsJHkuIDkuKrlhbPplK7or43jgIIiKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBrZXl3b3JkcyA9IFt3IGZvciB3IGluIGt3X3RleHQucmVwbGFjZSgnLCcsICcgJykuc3BsaXQoKSBpZiB3LnN0cmlwKCldCiAgICAgICAgaWYgbm90IGtleXdvcmRzOgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3d3YXJuaW5nKCLorablkYoiLCAi5YWz6ZSu6K+N5LiN6IO95Li656m644CCIikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oanNvbl9wYXRoLCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkKGYpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dlcnJvcigi6ZSZ6K+vIiwgZiLor7vlj5YgSlNPTiDlpLHotKU6XG57ZX0iKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBtYXRjaF9maWxlID0gc2VsZi50bHNfZmlsdGVyX2ZpbGUuZ2V0KCkKICAgICAgICBtYXRjaF90ZXh0ID0gc2VsZi50bHNfZmlsdGVyX3RleHQuZ2V0KCkKICAgICAgICBtb2RlX2FueSA9IHNlbGYudGxzX2ZpbHRlcl9tb2RlLmdldCgpID09ICJhbnkiCiAgICAgICAgZmlsdGVyZWQgPSBbXQogICAgICAgIGZvciBtc2cgaW4gZGF0YS5nZXQoJ21lc3NhZ2VzJywgW10pOgogICAgICAgICAgICBmaWxlX25hbWUgPSBtc2cuZ2V0KCdmaWxlJywgJycpCiAgICAgICAgICAgIHRleHRfY29udGVudCA9IG1zZy5nZXQoJ3RleHQnLCAnJykKICAgICAgICAgICAgbWF0Y2hlcyA9IFtdCiAgICAgICAgICAgIGZvciBrdyBpbiBrZXl3b3JkczoKICAgICAgICAgICAgICAgIGt3X2wgPSBrdy5sb3dlcigpCiAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCiAgICAgICAgICAgICAgICBpZiBtYXRjaF9maWxlIGFuZCBrd19sIGluIGZpbGVfbmFtZS5sb3dlcigpOgogICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgaWYgbWF0Y2hfdGV4dCBhbmQga3dfbCBpbiBzdHIodGV4dF9jb250ZW50KS5sb3dlcigpOgogICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoZm91bmQpCiAgICAgICAgICAgIGlmIChtb2RlX2FueSBhbmQgYW55KG1hdGNoZXMpKSBvciAobm90IG1vZGVfYW55IGFuZCBhbGwobWF0Y2hlcykpOgogICAgICAgICAgICAgICAgZmlsdGVyZWQuYXBwZW5kKG1zZykKICAgICAgICB0b3RhbCA9IGxlbihkYXRhLmdldCgnbWVzc2FnZXMnLCBbXSkpCiAgICAgICAga2VwdCA9IGxlbihmaWx0ZXJlZCkKICAgICAgICBkYXRhWydtZXNzYWdlcyddID0gZmlsdGVyZWQKICAgICAgICBpZiBzYXZlX2FzOgogICAgICAgICAgICBvdXRfcGF0aCA9IGZpbGVkaWFsb2cuYXNrc2F2ZWFzZmlsZW5hbWUoCiAgICAgICAgICAgICAgICBkZWZhdWx0ZXh0ZW5zaW9uPSIuanNvbiIsIGZpbGV0eXBlcz1bKCJKU09OIGZpbGVzIiwgIiouanNvbiIpXSwKICAgICAgICAgICAgICAgIGluaXRpYWxmaWxlPSJ0ZGwtZXhwb3J0X2ZpbHRlcmVkLmpzb24iCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgbm90IG91dF9wYXRoOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3V0X3BhdGggPSBqc29uX3BhdGgKICAgICAgICAgICAgaWYgc2VsZi50bHNfZmlsdGVyX2JhY2t1cC5nZXQoKToKICAgICAgICAgICAgICAgIGltcG9ydCBzaHV0aWwKICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5Mihqc29uX3BhdGgsIGpzb25fcGF0aCArICIuYmFrIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihvdXRfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICAgICAganNvbi5kdW1wKGRhdGEsIGYsIGVuc3VyZV9hc2NpaT1GYWxzZSkKICAgICAgICAgICAgbXNnID0gZiLnrZvpgInlrozmiJDjgILlhbEge3RvdGFsfSDmnaHmtojmga/vvIzkv53nlZkge2tlcHR9IOadoeOAglxu6L6T5Ye6OiB7b3V0X3BhdGh9IgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dpbmZvKCLlrozmiJAiLCBtc2cpCiAgICAgICAgICAgIHNlbGYubG9nX21zZyhtc2cgKyAiXG4iKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoIumUmeivryIsIGYi5YaZ5YWl5paH5Lu25aSx6LSlOlxue2V9IikKCiAgICAjIC0tLSBMb2dpbiBNZXRob2RzIC0tLQogICAgZGVmIHJ1bl9pbnRlcmFjdGl2ZV9jbWQoc2VsZiwgY21kKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNyZWF0aW9uZmxhZ3MgPSBzdWJwcm9jZXNzLkNSRUFURV9ORVdfQ09OU09MRSBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIiBlbHNlIDAKICAgICAgICAgICAgc3VicHJvY2Vzcy5Qb3BlbihjbWQsIGNyZWF0aW9uZmxhZ3M9Y3JlYXRpb25mbGFncykKICAgICAgICAgICAgc2VsZi5sb2dfbXNnKGYi5bey5Zyo5paw56qX5Y+j5Lit6L+Q6KGMOiB7JyAnLmpvaW4oY21kKX1cbiIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dlcnJvcigi6ZSZ6K+vIiwgZiLml6Dms5XlkK/liqjov5vnqIs6IHtzdHIoZSl9IikKCiAgICBkZWYgbG9naW5fZGVza3RvcChzZWxmKToKICAgICAgICBjbWQgPSBbInRkbCJdICsgc2VsZi5nZXRfZ2xvYmFsX2FyZ3MoKSArIFsibG9naW4iXQogICAgICAgIGlmIHNlbGYuZGVza3RvcF9wYXRoX3Zhci5nZXQoKS5zdHJpcCgpOiBjbWQuZXh0ZW5kKFsiLWQiLCBzZWxmLmRlc2t0b3BfcGF0aF92YXIuZ2V0KCkuc3RyaXAoKV0pCiAgICAgICAgc2VsZi5ydW5faW50ZXJhY3RpdmVfY21kKGNtZCkKCiAgICBkZWYgbG9naW5fcXIoc2VsZik6CiAgICAgICAgc2VsZi5ydW5faW50ZXJhY3RpdmVfY21kKFsidGRsIl0gKyBzZWxmLmdldF9nbG9iYWxfYXJncygpICsgWyJsb2dpbiIsICItVCIsICJxciJdKQoKICAgIGRlZiBsb2dpbl9jb2RlKHNlbGYpOgogICAgICAgIHNlbGYucnVuX2ludGVyYWN0aXZlX2NtZChbInRkbCJdICsgc2VsZi5nZXRfZ2xvYmFsX2FyZ3MoKSArIFsibG9naW4iLCAiLVQiLCAiY29kZSJdKQoKICAgICMgLS0tIERvd25sb2FkIE1ldGhvZHMgLS0tCiAgICBkZWYgc3RhcnRfZG93bmxvYWQoc2VsZik6CiAgICAgICAgdXJscyA9IFt1LnN0cmlwKCkgZm9yIHUgaW4gc2VsZi5kbF91cmxfdGV4dC5nZXQoIjEuMCIsIHRrLkVORCkuc3BsaXRsaW5lcygpIGlmIHUuc3RyaXAoKV0KICAgICAgICBqc29ucyA9IHNlbGYuZGxfanNvbl9saXN0Ym94LmdldCgwLCB0ay5FTkQpCiAgICAgICAgCiAgICAgICAgaWYgbm90IHVybHMgYW5kIG5vdCBqc29uczoKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93d2FybmluZygi6K2m5ZGKIiwgIuivt+iHs+WwkeaPkOS+m+S4gOS4qumTvuaOpeaIlkpTT07mlofku7bjgIIiKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgCiAgICAgICAgY21kID0gWyJ0ZGwiXSArIHNlbGYuZ2V0X2dsb2JhbF9hcmdzKCkgKyBbImRsIl0KICAgICAgICBmb3IgdSBpbiB1cmxzOiBjbWQuZXh0ZW5kKFsiLXUiLCB1XSkKICAgICAgICBmb3IgaiBpbiBqc29uczogY21kLmV4dGVuZChbIi1mIiwgal0pCiAgICAgICAgICAgIAogICAgICAgIGlmIHNlbGYuZGxfZGlyX3Zhci5nZXQoKS5zdHJpcCgpOiBjbWQuZXh0ZW5kKFsiLWQiLCBzZWxmLmRsX2Rpcl92YXIuZ2V0KCkuc3RyaXAoKV0pCiAgICAgICAgaWYgc2VsZi5kbF90cGxfdmFyLmdldCgpLnN0cmlwKCk6IGNtZC5leHRlbmQoWyItLXRlbXBsYXRlIiwgc2VsZi5kbF90cGxfdmFyLmdldCgpLnN0cmlwKCldKQogICAgICAgIGlmIHNlbGYuZGxfd2hpdGVfdmFyLmdldCgpLnN0cmlwKCk6IGNtZC5leHRlbmQoWyItaSIsIHNlbGYuZGxfd2hpdGVfdmFyLmdldCgpLnN0cmlwKCldKQogICAgICAgIGlmIHNlbGYuZGxfYmxhY2tfdmFyLmdldCgpLnN0cmlwKCk6IGNtZC5leHRlbmQoWyItZSIsIHNlbGYuZGxfYmxhY2tfdmFyLmdldCgpLnN0cmlwKCldKQogICAgICAgICAgICAKICAgICAgICBjbWQuZXh0ZW5kKFsiLXQiLCBzdHIoc2VsZi5kbF90aHJlYWRzLmdldCgpKSwgIi1sIiwgc3RyKHNlbGYuZGxfdGFza3MuZ2V0KCkpXSkKICAgICAgICAKICAgICAgICBmb3Iga2V5LCB2YXIgaW4gc2VsZi5kbF9jaGtzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIHZhci5nZXQoKTogY21kLmFwcGVuZChmIi0te2tleS5yZXBsYWNlKCdfJywgJy0nKX0iKQogICAgICAgICAgICAKICAgICAgICAjIFJ1biB0aGUgY29tbWFuZCBpbiBiYWNrZ3JvdW5kCiAgICAgICAgc2VsZi5ydW5fYmFja2dyb3VuZF90YXNrKGNtZCkKCiAgICAjIC0tLSBVcGxvYWQgTWV0aG9kcyAtLS0KICAgIGRlZiBzdGFydF91cGxvYWQoc2VsZik6CiAgICAgICAgcGF0aHMgPSBzZWxmLnVwX2xpc3Rib3guZ2V0KDAsIHRrLkVORCkKICAgICAgICBpZiBub3QgcGF0aHM6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd3dhcm5pbmcoIuitpuWRiiIsICLor7foh7PlsJHmt7vliqDkuIDkuKrlvoXkuIrkvKDnmoTmlofku7bmiJbnm67lvZXjgIIiKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgCiAgICAgICAgY21kID0gWyJ0ZGwiXSArIHNlbGYuZ2V0X2dsb2JhbF9hcmdzKCkgKyBbInVwIl0KICAgICAgICBmb3IgcCBpbiBwYXRoczogY21kLmV4dGVuZChbIi1wIiwgcF0pCiAgICAgICAgICAgIAogICAgICAgIGlmIHNlbGYudXBfdG9fdmFyLmdldCgpLnN0cmlwKCk6CiAgICAgICAgICAgIGNtZC5leHRlbmQoWyItLXRvIiwgc2VsZi51cF90b192YXIuZ2V0KCkuc3RyaXAoKV0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgc2VsZi51cF9jaGF0X3Zhci5nZXQoKS5zdHJpcCgpOiBjbWQuZXh0ZW5kKFsiLWMiLCBzZWxmLnVwX2NoYXRfdmFyLmdldCgpLnN0cmlwKCldKQogICAgICAgICAgICBpZiBzZWxmLnVwX3RvcGljX3Zhci5nZXQoKS5zdHJpcCgpOiBjbWQuZXh0ZW5kKFsiLS10b3BpYyIsIHNlbGYudXBfdG9waWNfdmFyLmdldCgpLnN0cmlwKCldKQogICAgICAgICAgICAKICAgICAgICBpZiBzZWxmLnVwX2NhcHRpb25fdmFyLmdldCgpLnN0cmlwKCk6IGNtZC5leHRlbmQoWyItLWNhcHRpb24iLCBzZWxmLnVwX2NhcHRpb25fdmFyLmdldCgpLnN0cmlwKCldKQogICAgICAgIGlmIHNlbGYudXBfd2hpdGVfdmFyLmdldCgpLnN0cmlwKCk6IGNtZC5leHRlbmQoWyItaSIsIHNlbGYudXBfd2hpdGVfdmFyLmdldCgpLnN0cmlwKCldKQogICAgICAgIGlmIHNlbGYudXBfYmxhY2tfdmFyLmdldCgpLnN0cmlwKCk6IGNtZC5leHRlbmQoWyItZSIsIHNlbGYudXBfYmxhY2tfdmFyLmdldCgpLnN0cmlwKCldKQogICAgICAgICAgICAKICAgICAgICBjbWQuZXh0ZW5kKFsiLXQiLCBzdHIoc2VsZi51cF90aHJlYWRzLmdldCgpKSwgIi1sIiwgc3RyKHNlbGYudXBfdGFza3MuZ2V0KCkpXSkKICAgICAgICAKICAgICAgICBpZiBzZWxmLnVwX2Noa19ybS5nZXQoKTogY21kLmFwcGVuZCgiLS1ybSIpCiAgICAgICAgaWYgc2VsZi51cF9jaGtfcGhvdG8uZ2V0KCk6IGNtZC5hcHBlbmQoIi0tcGhvdG8iKQogICAgICAgIAogICAgICAgIHNlbGYucnVuX2JhY2tncm91bmRfdGFzayhjbWQpCgogICAgIyAtLS0gRm9yd2FyZCBNZXRob2RzIC0tLQogICAgZGVmIHN0YXJ0X2ZvcndhcmQoc2VsZik6CiAgICAgICAgdXJscyA9IFt1LnN0cmlwKCkgZm9yIHUgaW4gc2VsZi5md191cmxfdGV4dC5nZXQoIjEuMCIsIHRrLkVORCkuc3BsaXRsaW5lcygpIGlmIHUuc3RyaXAoKV0KICAgICAgICBqc29ucyA9IHNlbGYuZndfanNvbl9saXN0Ym94LmdldCgwLCB0ay5FTkQpCiAgICAgICAgCiAgICAgICAgaWYgbm90IHVybHMgYW5kIG5vdCBqc29uczoKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93d2FybmluZygi6K2m5ZGKIiwgIuivt+iHs+WwkeaPkOS+m+S4gOS4quadpea6kOmTvuaOpeaIlkpTT07mlofku7bjgIIiKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgCiAgICAgICAgY21kID0gWyJ0ZGwiXSArIHNlbGYuZ2V0X2dsb2JhbF9hcmdzKCkgKyBbImZvcndhcmQiXQogICAgICAgIGZvciB1IGluIHVybHM6IGNtZC5leHRlbmQoWyItLWZyb20iLCB1XSkKICAgICAgICBmb3IgaiBpbiBqc29uczogY21kLmV4dGVuZChbIi0tZnJvbSIsIGpdKQogICAgICAgICAgICAKICAgICAgICBpZiBzZWxmLmZ3X3RvX3Zhci5nZXQoKS5zdHJpcCgpOiBjbWQuZXh0ZW5kKFsiLS10byIsIHNlbGYuZndfdG9fdmFyLmdldCgpLnN0cmlwKCldKQogICAgICAgIGlmIHNlbGYuZndfZWRpdF92YXIuZ2V0KCkuc3RyaXAoKTogY21kLmV4dGVuZChbIi0tZWRpdCIsIHNlbGYuZndfZWRpdF92YXIuZ2V0KCkuc3RyaXAoKV0pCiAgICAgICAgCiAgICAgICAgaWYgc2VsZi5md19tb2RlX3Zhci5nZXQoKSAhPSAiZGlyZWN0IjogY21kLmV4dGVuZChbIi0tbW9kZSIsIHNlbGYuZndfbW9kZV92YXIuZ2V0KCldKQogICAgICAgICAgICAKICAgICAgICBmb3Iga2V5LCB2YXIgaW4gc2VsZi5md19jaGtzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIHZhci5nZXQoKTogY21kLmFwcGVuZChmIi0te2tleS5yZXBsYWNlKCdfJywgJy0nKX0iKQogICAgICAgICAgICAKICAgICAgICBzZWxmLnJ1bl9iYWNrZ3JvdW5kX3Rhc2soY21kKQoKICAgICMgLS0tIFRhc2sgRXhlY3V0aW9uIC0tLQogICAgZGVmIHJ1bl9iYWNrZ3JvdW5kX3Rhc2soc2VsZiwgY21kKToKICAgICAgICBpZiBzZWxmLmN1cnJlbnRfcHJvY2VzcyBhbmQgc2VsZi5jdXJyZW50X3Byb2Nlc3MucG9sbCgpIGlzIE5vbmU6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd3dhcm5pbmcoIuitpuWRiiIsICLlvZPliY3mnInku7vliqHmraPlnKjov5DooYzvvIzor7flhYjlgZzmraLlroPjgIIiKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgCiAgICAgICAgY21kX3N0ciA9ICcgJy5qb2luKGNtZCkKICAgICAgICAKICAgICAgICBjb25maXJtLCBjb3B5X2NtZCA9IHNlbGYuc2hvd19jb25maXJtX2RpYWxvZyhjbWRfc3RyKQogICAgICAgIGlmIG5vdCBjb25maXJtOgogICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgCiAgICAgICAgaWYgY29weV9jbWQ6CiAgICAgICAgICAgIHNlbGYucm9vdC5jbGlwYm9hcmRfY2xlYXIoKQogICAgICAgICAgICBzZWxmLnJvb3QuY2xpcGJvYXJkX2FwcGVuZChjbWRfc3RyKQogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dpbmZvKCLmj5DnpLoiLCAi5ZG95Luk5bey5aSN5Yi25Yiw5Ymq6LS05p2/77yBIikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIAogICAgICAgIHNlbGYubG9nX21zZyhmIj09PT09PT09PT0g5byA5aeL5omn6KGMID09PT09PT09PT1cbiIpCiAgICAgICAgc2VsZi5sb2dfbXNnKGYi5ZG95LukOiB7Y21kX3N0cn1cbiIpCiAgICAgICAgCiAgICAgICAgc2VsZi5zdG9wX2J0bi5jb25maWcoc3RhdGU9dGsuTk9STUFMKQogICAgICAgIAogICAgICAgIGRlZiB0YXNrKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvID0gTm9uZQogICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8gPSBzdWJwcm9jZXNzLlNUQVJUVVBJTkZPKCkKICAgICAgICAgICAgICAgICAgICBzdGFydHVwaW5mby5kd0ZsYWdzIHw9IHN1YnByb2Nlc3MuU1RBUlRGX1VTRVNIT1dXSU5ET1cKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICMgVXNlIG9zLmVudmlyb24gdG8gcGFzcyB1cGRhdGVkIFBBVEggaWYgaXQgd2FzIGNoYW5nZWQKICAgICAgICAgICAgICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbigKICAgICAgICAgICAgICAgICAgICBjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwKICAgICAgICAgICAgICAgICAgICB0ZXh0PVRydWUsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0ncmVwbGFjZScsIAogICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvPXN0YXJ0dXBpbmZvLCBlbnY9ZW52CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuY3VycmVudF9wcm9jZXNzLnN0ZG91dDoKICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dF9xdWV1ZS5wdXQobGluZSkKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9wcm9jZXNzLndhaXQoKQogICAgICAgICAgICAgICAgc2VsZi5vdXRwdXRfcXVldWUucHV0KGYiXG49PT09PT09PT09IOS7u+WKoeWujOaIkCAo6YCA5Ye656CBOiB7c2VsZi5jdXJyZW50X3Byb2Nlc3MucmV0dXJuY29kZX0pID09PT09PT09PT1cbiIpCiAgICAgICAgICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0X3F1ZXVlLnB1dChmIlxuW+mUmeivr106IOaJvuS4jeWIsCAndGRsJyDlkb3ku6TjgILor7flhYjlnKjjgJDnjq/looPmo4Dmn6XjgJHmoIfnrb7pobXkuK3lronoo4XmiJbphY3nva4gUEFUSOOAglxuIikKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgc2VsZi5vdXRwdXRfcXVldWUucHV0KGYiXG5b5omn6KGM6ZSZ6K+vXToge3N0cihlKX1cbiIpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzZWxmLm91dHB1dF9xdWV1ZS5wdXQoIlRBU0tfRE9ORSIpCiAgICAgICAgICAgICAgICAKICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD10YXNrLCBkYWVtb249VHJ1ZSkuc3RhcnQoKQoKICAgIGRlZiBzdG9wX3Rhc2soc2VsZik6CiAgICAgICAgaWYgc2VsZi5jdXJyZW50X3Byb2Nlc3MgYW5kIHNlbGYuY3VycmVudF9wcm9jZXNzLnBvbGwoKSBpcyBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIG9zLmtpbGwgd2l0aCBzaWduYWwuU0lHVEVSTSBtaWdodCBub3QgdGVybWluYXRlIGNoaWxkIHByb2Nlc3NlcyBvZiB0aGUgY29tbWFuZC4KICAgICAgICAgICAgICAgICMgU2luY2UgdGRsIGlzIGEgc2luZ2xlIGJpbmFyeSwgdGVybWluYXRlKCkgdXN1YWxseSBzdWZmaWNlcy4KICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9wcm9jZXNzLnRlcm1pbmF0ZSgpCiAgICAgICAgICAgICAgICBzZWxmLmxvZ19tc2coIlxuW+eUqOaIt+W8uuWItue7iOatouS6huS7u+WKoV1cbiIpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYubG9nX21zZyhmIlxuW+WBnOatouS7u+WKoeaXtuWHuumUmV06IHtzdHIoZSl9XG4iKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc2VsZi5zdG9wX2J0bi5jb25maWcoc3RhdGU9dGsuRElTQUJMRUQpCgogICAgZGVmIHByb2Nlc3NfcXVldWUoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgbXNnID0gc2VsZi5vdXRwdXRfcXVldWUuZ2V0X25vd2FpdCgpCiAgICAgICAgICAgICAgICBpZiBtc2cgPT0gIlRBU0tfRE9ORSI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdG9wX2J0bi5jb25maWcoc3RhdGU9dGsuRElTQUJMRUQpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYubG9nX21zZyhtc2cpCiAgICAgICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgogICAgICAgICAgICBwYXNzCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5yb290LmFmdGVyKDEwMCwgc2VsZi5wcm9jZXNzX3F1ZXVlKQoKICAgIGRlZiBsb2dfbXNnKHNlbGYsIG1zZyk6CiAgICAgICAgcHJvZ3Jlc3NfcGF0dGVybiA9IHJlLmNvbXBpbGUocicoXGQrKD86XC5cZCspPylccyolJykKICAgICAgICBzcGVlZF9wYXR0ZXJuID0gcmUuY29tcGlsZShyJyhcZCsoPzpcLlxkKyk/XHMqW0tNR1RdP0IvcyknKQogICAgICAgIAogICAgICAgIHByb2dyZXNzX21hdGNoID0gcHJvZ3Jlc3NfcGF0dGVybi5zZWFyY2gobXNnKQogICAgICAgIGlmIHByb2dyZXNzX21hdGNoOgogICAgICAgICAgICBwZXJjZW50ID0gZmxvYXQocHJvZ3Jlc3NfbWF0Y2guZ3JvdXAoMSkpCiAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3NfdmFyLnNldChwZXJjZW50KQogICAgICAgICAgICAKICAgICAgICAgICAgc3BlZWRfbWF0Y2ggPSBzcGVlZF9wYXR0ZXJuLnNlYXJjaChtc2cpCiAgICAgICAgICAgIHNwZWVkX3RleHQgPSBzcGVlZF9tYXRjaC5ncm91cCgxKSBpZiBzcGVlZF9tYXRjaCBlbHNlICIiCiAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3NfbGFiZWwuY29uZmlnKHRleHQ9ZiLov5vluqY6IHtwZXJjZW50Oi4xZn0lICB7c3BlZWRfdGV4dH0iKQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgc2VsZi5pc19wcm9ncmVzc19saW5lKG1zZyk6CiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9sYXN0X3Byb2dyZXNzX2xpbmUobXNnKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgCiAgICAgICAgc2VsZi5jb25zb2xlX3RleHQuY29uZmlnKHN0YXRlPSdub3JtYWwnKQogICAgICAgIHNlbGYuY29uc29sZV90ZXh0Lmluc2VydCh0ay5FTkQsIG1zZykKICAgICAgICBzZWxmLmNvbnNvbGVfdGV4dC5zZWUodGsuRU5EKQogICAgICAgIHNlbGYuY29uc29sZV90ZXh0LmNvbmZpZyhzdGF0ZT0nZGlzYWJsZWQnKQoKICAgIGRlZiBpc19wcm9ncmVzc19saW5lKHNlbGYsIGxpbmUpOgogICAgICAgIHByb2dyZXNzX2luZGljYXRvcnMgPSBbJyUnLCAnZG93bmxvYWRlZCcsICd1cGxvYWRpbmcnLCAnZG93bmxvYWRpbmcnLCAndHJhbnNmZXJyaW5nJywgJ0IvcycsICdNaUInLCAnS2lCJywgJ0dpQiddCiAgICAgICAgbGluZV9sb3dlciA9IGxpbmUubG93ZXIoKQogICAgICAgIHJldHVybiBhbnkoaW5kIGluIGxpbmVfbG93ZXIgZm9yIGluZCBpbiBwcm9ncmVzc19pbmRpY2F0b3JzKSBhbmQgbGVuKGxpbmUuc3RyaXAoKSkgPCAyMDAKCiAgICBkZWYgdXBkYXRlX2xhc3RfcHJvZ3Jlc3NfbGluZShzZWxmLCBtc2cpOgogICAgICAgIHNlbGYuY29uc29sZV90ZXh0LmNvbmZpZyhzdGF0ZT0nbm9ybWFsJykKICAgICAgICBjb250ZW50ID0gc2VsZi5jb25zb2xlX3RleHQuZ2V0KCIxLjAiLCB0ay5FTkQpCiAgICAgICAgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcbicpCiAgICAgICAgCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSAtIDEsIC0xLCAtMSk6CiAgICAgICAgICAgIGlmIGxpbmVzW2ldLnN0cmlwKCk6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX3Byb2dyZXNzX2xpbmUobGluZXNbaV0pOgogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gbXNnLnJzdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25zb2xlX3RleHQuZGVsZXRlKCIxLjAiLCB0ay5FTkQpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25zb2xlX3RleHQuaW5zZXJ0KCIxLjAiLCAnXG4nLmpvaW4obGluZXMpKQogICAgICAgICAgICAgICAgICAgIHNlbGYuY29uc29sZV90ZXh0LnNlZSh0ay5FTkQpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25zb2xlX3RleHQuY29uZmlnKHN0YXRlPSdkaXNhYmxlZCcpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIAogICAgICAgIHNlbGYuY29uc29sZV90ZXh0Lmluc2VydCh0ay5FTkQsIG1zZykKICAgICAgICBzZWxmLmNvbnNvbGVfdGV4dC5zZWUodGsuRU5EKQogICAgICAgIHNlbGYuY29uc29sZV90ZXh0LmNvbmZpZyhzdGF0ZT0nZGlzYWJsZWQnKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHJvb3QgPSB0ay5UaygpCiAgICAKICAgICMg5bCd6K+V5L2/55SoIHR0a3RoZW1lcyDmiJbogIXlhoXnva7kuLvpopjmj5DljYflpJbop4IKICAgIHRyeToKICAgICAgICByb290LnRrLmNhbGwoInNvdXJjZSIsICJhenVyZS50Y2wiKQogICAgICAgIHJvb3QudGsuY2FsbCgic2V0X3RoZW1lIiwgImxpZ2h0IikKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgc3R5bGUgPSB0dGsuU3R5bGUoKQogICAgICAgIGlmICdjbGFtJyBpbiBzdHlsZS50aGVtZV9uYW1lcygpOgogICAgICAgICAgICBzdHlsZS50aGVtZV91c2UoJ2NsYW0nKQogICAgICAgICAgICAKICAgIGFwcCA9IFRETEd1aUFwcChyb290KQogICAgcm9vdC5tYWlubG9vcCgpCg=="
}
]
}