335d5e60eb4ef3ba172e638684edf8ba.json 90 KB

1
  1. {"remainingRequest":"D:\\front\\item\\zyAdmin\\node_modules\\thread-loader\\dist\\cjs.js!D:\\front\\item\\zyAdmin\\node_modules\\babel-loader\\lib\\index.js!D:\\front\\item\\zyAdmin\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\front\\item\\zyAdmin\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\front\\item\\zyAdmin\\src\\pages\\product\\productAdd\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\front\\item\\zyAdmin\\src\\pages\\product\\productAdd\\index.vue","mtime":1761614939049},{"path":"D:\\front\\item\\zyAdmin\\babel.config.js","mtime":1761614925168},{"path":"D:\\front\\item\\zyAdmin\\.babelrc","mtime":1761614925165},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1761614927801},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\thread-loader\\dist\\cjs.js","mtime":1761614937017},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\babel-loader\\lib\\index.js","mtime":1761614927320},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1761614927801},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\vue-loader\\lib\\index.js","mtime":1761614937402}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0FycmF5IGZyb20gIkQ6L2Zyb250L2l0ZW0venlBZG1pbi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9BcnJheS5qcyI7CmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSAiRDovZnJvbnQvaXRlbS96eUFkbWluL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eS5qcyI7CmltcG9ydCBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciBmcm9tICJEOi9mcm9udC9pdGVtL3p5QWRtaW4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIuanMiOwppbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gIkQ6L2Zyb250L2l0ZW0venlBZG1pbi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgX3JlZ2VuZXJhdG9yIGZyb20gIkQ6L2Zyb250L2l0ZW0venlBZG1pbi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3IuanMiOwppbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSAiRDovZnJvbnQvaXRlbS96eUFkbWluL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiRDovZnJvbnQvaXRlbS96eUFkbWluL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mbGF0LW1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZyb20uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNwbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnVuc2NvcGFibGVzLmZsYXQtbWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZmlsdGVyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZmluZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmZsYXQtbWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5zb21lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc2V0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc2V0LmRpZmZlcmVuY2UudjIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zZXQuaW50ZXJzZWN0aW9uLnYyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc2V0LmlzLWRpc2pvaW50LWZyb20udjIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zZXQuaXMtc3Vic2V0LW9mLnYyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc2V0LmlzLXN1cGVyc2V0LW9mLnYyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc2V0LnN5bW1ldHJpYy1kaWZmZXJlbmNlLnYyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc2V0LnVuaW9uLnYyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcyI7CmltcG9ydCB1c2VyTGFiZWwgZnJvbSAnQC9jb21wb25lbnRzL2xhYmVsTGlzdCc7CmltcG9ydCB1c2VMYWJlbCBmcm9tICdAL2NvbXBvbmVudHMvZ29vZHNMYWJlbC91c2VMYWJlbCc7CmltcG9ydCBnb29kc0xhYmVsIGZyb20gJ0AvY29tcG9uZW50cy9nb29kc0xhYmVsJzsKaW1wb3J0IHsgbWFwU3RhdGUgfSBmcm9tICd2dWV4JzsKaW1wb3J0IHVwbG9hZFBpY3R1cmVzIGZyb20gJ0AvY29tcG9uZW50cy91cGxvYWRQaWN0dXJlcyc7CmltcG9ydCBmcmVpZ2h0VGVtcGxhdGUgZnJvbSAnQC9jb21wb25lbnRzL2ZyZWlnaHRUZW1wbGF0ZSc7CmltcG9ydCBjb3Vwb25MaXN0IGZyb20gJ0AvY29tcG9uZW50cy9jb3Vwb25MaXN0JzsKaW1wb3J0IGFkZEF0dHIgZnJvbSAnLi4vcHJvZHVjdEF0dHIvYWRkQXR0cic7CmltcG9ydCBnb29kc0xpc3QgZnJvbSAnQC9jb21wb25lbnRzL2dvb2RzTGlzdC9pbmRleCc7CmltcG9ydCB0YW9CYW8gZnJvbSAnLi90YW9CYW8nOwppbXBvcnQgeyB1c2VyTGFiZWxBZGRBcGkgfSBmcm9tICdAL2FwaS91c2VyJzsKaW1wb3J0IHsgcHJvZHVjdEluZm9BcGksIGNhc2NhZGVyTGlzdEFwaSwgcHJvZHVjdEFkZEFwaSwgZ2VuZXJhdGVBdHRyQXBpLCBwcm9kdWN0R2V0UnVsZUFwaSwgcHJvZHVjdEdldFRlbXBsYXRlQXBpLCBwcm9kdWN0R2V0VGVtcEtleXNBcGksIGNoZWNrQWN0aXZpdHlBcGksIHByb2R1Y3RDYWNoZSwgY2FjaGVEZWxldGUsIHVwbG9hZFR5cGUgYXMgX3VwbG9hZFR5cGUsIGltcG9ydENhcmQsIHByb2R1Y3RDcmVhdGVBcGksIGdldFByb2R1Y3RUeXBlQ29uZmlnLCBydWxlQWRkQXBpLCBwYXJhbUxpc3RBcGksIHBhcmFtSW5mb0FwaSwgcHJvZHVjdFByb3RlY3Rpb25MaXN0QXBpLCBwcm9kdWN0TGFiZWxVc2VMaXN0QXBpIH0gZnJvbSAnQC9hcGkvcHJvZHVjdCc7CmltcG9ydCBTZXR0aW5nIGZyb20gJ0Avc2V0dGluZyc7CmltcG9ydCB7IGdldENvb2tpZXMgfSBmcm9tICdAL2xpYnMvdXRpbCc7CmltcG9ydCB7IHVwbG9hZEJ5UGllY2VzIH0gZnJvbSAnQC91dGlscy91cGxvYWQnOyAvL+W8leWFpXVwbG9hZEJ5UGllY2Vz5pa55rOVCmltcG9ydCB7IGlzRmlsZVVwbG9hZCwgaXNWaWRlb1VwbG9hZCwgYXJyYXlzRXF1YWwgfSBmcm9tICdAL3V0aWxzJzsKaW1wb3J0IGNoZWNrQXJyYXkgZnJvbSAnQC9saWJzL3Blcm1pc3Npb24nOwppbXBvcnQgeyBHb29kc1RhYmxlSGVhZCwgVmlydHVhbFRhYmxlSGVhZCwgVmlydHVhbFRhYmxlSGVhZDIsIGNvbHVtbnMyLCBjb2x1bW5zMywgQ3VzdG9tTGlzdCwgUnVsZVZhbGlkYXRlIH0gZnJvbSAnLi9kZWZhdWx0RGF0YS5qcyc7CmltcG9ydCBCYXNpY0luZm8gZnJvbSAnLi9jb21wb25lbnRzL0Jhc2ljSW5mby52dWUnOwppbXBvcnQgU3BlY1N0b2NrIGZyb20gJy4vY29tcG9uZW50cy9TcGVjU3RvY2sudnVlJzsKaW1wb3J0IFByb2R1Y3REZXRhaWwgZnJvbSAnLi9jb21wb25lbnRzL1Byb2R1Y3REZXRhaWwudnVlJzsKaW1wb3J0IExvZ2lzdGljc1NldHRpbmcgZnJvbSAnLi9jb21wb25lbnRzL0xvZ2lzdGljc1NldHRpbmcudnVlJzsKaW1wb3J0IFByaWNlQ29tbWlzc2lvbiBmcm9tICcuL2NvbXBvbmVudHMvUHJpY2VDb21taXNzaW9uLnZ1ZSc7CmltcG9ydCBNYXJrZXRpbmdTZXR0aW5nIGZyb20gJy4vY29tcG9uZW50cy9NYXJrZXRpbmdTZXR0aW5nLnZ1ZSc7CmltcG9ydCBPdGhlclNldHRpbmcgZnJvbSAnLi9jb21wb25lbnRzL090aGVyU2V0dGluZy52dWUnOwppbXBvcnQgeyBmb3JtYXRSaWNoVGV4dCB9IGZyb20gJ0AvdXRpbHMvZWRpdG9ySW1nJzsKZXhwb3J0IGRlZmF1bHQgewogIG5hbWU6ICdQcm9kdWN0QWRkJywKICBjb21wb25lbnRzOiB7CiAgICB1cGxvYWRQaWN0dXJlczogdXBsb2FkUGljdHVyZXMsCiAgICBmcmVpZ2h0VGVtcGxhdGU6IGZyZWlnaHRUZW1wbGF0ZSwKICAgIGFkZEF0dHI6IGFkZEF0dHIsCiAgICBjb3Vwb25MaXN0OiBjb3Vwb25MaXN0LAogICAgdGFvQmFvOiB0YW9CYW8sCiAgICBnb29kc0xpc3Q6IGdvb2RzTGlzdCwKICAgIHVzZXJMYWJlbDogdXNlckxhYmVsLAogICAgZ29vZHNMYWJlbDogZ29vZHNMYWJlbCwKICAgIHVzZUxhYmVsOiB1c2VMYWJlbCwKICAgIEJhc2ljSW5mbzogQmFzaWNJbmZvLAogICAgU3BlY1N0b2NrOiBTcGVjU3RvY2ssCiAgICBQcm9kdWN0RGV0YWlsOiBQcm9kdWN0RGV0YWlsLAogICAgTG9naXN0aWNzU2V0dGluZzogTG9naXN0aWNzU2V0dGluZywKICAgIFByaWNlQ29tbWlzc2lvbjogUHJpY2VDb21taXNzaW9uLAogICAgTWFya2V0aW5nU2V0dGluZzogTWFya2V0aW5nU2V0dGluZywKICAgIE90aGVyU2V0dGluZzogT3RoZXJTZXR0aW5nCiAgfSwKICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgbGFiZWxTaG93OiBmYWxzZSwKICAgICAgdGFnU2hvdzogZmFsc2UsCiAgICAgIGRhdGFMYWJlbDogW10sCiAgICAgIGhlYWRUYWI6IFt7CiAgICAgICAgdGl0OiAn5Z+656GA5L+h5oGvJywKICAgICAgICBuYW1lOiAnMScKICAgICAgfSwgewogICAgICAgIHRpdDogJ+inhOagvOW6k+WtmCcsCiAgICAgICAgbmFtZTogJzInCiAgICAgIH0sIHsKICAgICAgICB0aXQ6ICfllYblk4Hor6bmg4UnLAogICAgICAgIG5hbWU6ICczJwogICAgICB9LCB7CiAgICAgICAgdGl0OiAn54mp5rWB6K6+572uJywKICAgICAgICBuYW1lOiAnNCcKICAgICAgfSwgewogICAgICAgIHRpdDogJ+S8muWRmOS7ty/kvaPph5EnLAogICAgICAgIG5hbWU6ICc1JwogICAgICB9LCB7CiAgICAgICAgdGl0OiAn6JCl6ZSA6K6+572uJywKICAgICAgICBuYW1lOiAnNicKICAgICAgfSwgewogICAgICAgIHRpdDogJ+WFtuS7luiuvue9ricsCiAgICAgICAgbmFtZTogJzcnCiAgICAgIH1dLAogICAgICB2aXJ0dWFsOiBbewogICAgICAgIHRpdDogJ+aZrumAmuWVhuWTgScsCiAgICAgICAgaWQ6IDAsCiAgICAgICAgdGl0MjogJ+eJqea1geWPkei0pycKICAgICAgfSwgewogICAgICAgIHRpdDogJ+WNoeWvhi/nvZHnm5gnLAogICAgICAgIGlkOiAxLAogICAgICAgIHRpdDI6ICfoh6rliqjlj5HotKcnCiAgICAgIH0sIHsKICAgICAgICB0aXQ6ICfkvJjmg6DliLgnLAogICAgICAgIGlkOiAyLAogICAgICAgIHRpdDI6ICfoh6rliqjlj5HotKcnCiAgICAgIH0sIHsKICAgICAgICB0aXQ6ICfomZrmi5/llYblk4EnLAogICAgICAgIGlkOiAzLAogICAgICAgIHRpdDI6ICfomZrmi5/lj5HotKcnCiAgICAgIH1dLAogICAgICBzZWxldFZpZGVvOiAwLAogICAgICAvL+mAieaLqeinhumikeexu+WeiwogICAgICBjdXN0b21CdG46IDAsCiAgICAgIC8v6Ieq5a6a5LmJ55WZ6KiA5byA5YWzCiAgICAgIGNvbnRlbnQ6ICcnLAogICAgICBjb250ZW50czogJycsCiAgICAgIGZpbGVVcmw6IFNldHRpbmcuYXBpQmFzZVVSTCArICcvZmlsZS91cGxvYWQnLAogICAgICBmaWxlVXJsMjogU2V0dGluZy5hcGlCYXNlVVJMICsgJy9maWxlL3ZpZGVvX3VwbG9hZCcsCiAgICAgIGNhcmRVcmw6IFNldHRpbmcuYXBpQmFzZVVSTCArICcvZmlsZS91cGxvYWQvMScsCiAgICAgIHVwbG9hZF90eXBlOiAnJywKICAgICAgLy/op4bpopHkuIrkvKDnsbvlnosgMSDmnKzlnLDkuIrkvKAgMiAzIDQgT1NT5LiK5LygCiAgICAgIHVwbG9hZERhdGE6IHt9LAogICAgICAvLyDkuIrkvKDlj4LmlbAKICAgICAgaGVhZGVyOiB7fSwKICAgICAgdHlwZTogMCwKICAgICAgbW9kYWxzOiBmYWxzZSwKICAgICAgZ29vZHNfbW9kYWxzOiBmYWxzZSwKICAgICAgc3BpblNob3c6IGZhbHNlLAogICAgICBvcGVuU3ViaW1pdDogZmFsc2UsCiAgICAgIHZpcnR1YWxMaXN0OiBbewogICAgICAgIGtleTogJycsCiAgICAgICAgdmFsdWU6ICcnCiAgICAgIH1dLAogICAgICAvLyDmibnph4/orr7nva7ooajmoLxkYXRhCiAgICAgIG9uZUZvcm1CYXRjaDogW3sKICAgICAgICBwaWM6ICcnLAogICAgICAgIHByaWNlOiB2b2lkIDAsCiAgICAgICAgY29zdDogdm9pZCAwLAogICAgICAgIG90X3ByaWNlOiB2b2lkIDAsCiAgICAgICAgc3RvY2s6IHZvaWQgMCwKICAgICAgICBiYXJfY29kZTogJycsCiAgICAgICAgYmFyX2NvZGVfbnVtYmVyOiAnJywKICAgICAgICB3ZWlnaHQ6IHZvaWQgMCwKICAgICAgICB2b2x1bWU6IHZvaWQgMCwKICAgICAgICB2aXJ0dWFsX2xpc3Q6IFtdCiAgICAgIH1dLAogICAgICAvLyDop4TmoLzmlbDmja4KICAgICAgZm9ybUR5bmFtaWM6IHsKICAgICAgICBhdHRyc05hbWU6ICcnLAogICAgICAgIGF0dHJzVmFsOiAnJwogICAgICB9LAogICAgICBkaXNrX3R5cGU6IDEsCiAgICAgIC8v5Y2h5a+G57G75Z6LCiAgICAgIHRhYkluZGV4OiAwLAogICAgICB0YWJOYW1lOiAnJywKICAgICAgZm9ybUR5bmFtaWNOYW1lRGF0YTogW10sCiAgICAgIGlzQnRuOiBmYWxzZSwKICAgICAgY29sdW1uczI6IGNvbHVtbnMyLAogICAgICBjb2x1bW5zMzogY29sdW1uczMsCiAgICAgIGNvbHVtbnM6IFtdLAogICAgICBjb2x1bW5zSW5zdGFsbDogW10sCiAgICAgIGNvbHVtbnNJbnN0YWwyOiBbXSwKICAgICAgZ3JpZFBpYzogewogICAgICAgIHhsOiA2LAogICAgICAgIGxnOiA4LAogICAgICAgIG1kOiAxMiwKICAgICAgICBzbTogMTIsCiAgICAgICAgeHM6IDEyCiAgICAgIH0sCiAgICAgIGdyaWRCdG46IHsKICAgICAgICB4bDogNCwKICAgICAgICBsZzogOCwKICAgICAgICBtZDogOCwKICAgICAgICBzbTogOCwKICAgICAgICB4czogOAogICAgICB9LAogICAgICAvL+iHquWumuS5ieeVmeiogOS4i+aLiemAieaLqQogICAgICBDdXN0b21MaXN0OiBDdXN0b21MaXN0LAogICAgICAvL+iHquWumuS5ieeVmeiogOWGheWuuQogICAgICBjdXJyZW50SW5kZXg6IDAsCiAgICAgIGZvcm1WYWxpZGF0ZTogewogICAgICAgIHNoYXJlOiAwLAogICAgICAgIGlzX3BhY2s6IDAsCiAgICAgICAgLy/mmK/lkKbmiqXljZUKICAgICAgICBkaXNrX2luZm86ICcnLAogICAgICAgIC8v5Y2h5a+G57G75Z6LCiAgICAgICAgbG9naXN0aWNzOiBbJzEnXSwKICAgICAgICAvL+mAieaLqeeJqea1geaWueW8jwogICAgICAgIGZyZWlnaHQ6IDIsCiAgICAgICAgLy/ov5DotLnorr7nva4KICAgICAgICBwb3N0YWdlOiAwLAogICAgICAgIC8v6K6+572u6L+Q6LS56YeR6aKdCiAgICAgICAgcmVjb21tZW5kOiBbXSwKICAgICAgICAvL+WVhuWTgeaOqOiNkAogICAgICAgIHByZXNhbGVfZGF5OiAxLAogICAgICAgIC8v6aKE5ZSu5Y+R6LSn5pe26Ze0Lee7k+adnwogICAgICAgIHByZXNhbGU6IGZhbHNlLAogICAgICAgIC8v6aKE5ZSu5ZWG5ZOB5byA5YWzCiAgICAgICAgaXNfbGltaXQ6IGZhbHNlLAogICAgICAgIGxpbWl0X3R5cGU6IDAsCiAgICAgICAgbGltaXRfbnVtOiAwLAogICAgICAgIHZpcF9wcm9kdWN0OiBmYWxzZSwKICAgICAgICAvL+S7mOi0ueS8muWRmOS4k+WxnuW8gOWFswogICAgICAgIGN1c3RvbV9mb3JtOiBbXSwKICAgICAgICAvL+iHquWumuS5ieeVmeiogAogICAgICAgIHN0b3JlX25hbWU6ICcnLAogICAgICAgIGNhdGVfaWQ6IFtdLAogICAgICAgIGxhYmVsX2lkOiBbXSwKICAgICAgICBrZXl3b3JkOiAnJywKICAgICAgICB1bml0X25hbWU6ICcnLAogICAgICAgIHN0b3JlX2luZm86ICcnLAogICAgICAgIGltYWdlOiAnJywKICAgICAgICByZWNvbW1lbmRfaW1hZ2U6ICcnLAogICAgICAgIHNsaWRlcl9pbWFnZTogW10sCiAgICAgICAgZGVzY3JpcHRpb246ICcnLAogICAgICAgIGZpY3RpOiAwLAogICAgICAgIGdpdmVfaW50ZWdyYWw6IDAsCiAgICAgICAgc29ydDogMCwKICAgICAgICBpc19zaG93OiAxLAogICAgICAgIGlzX2dpZnQ6IDAsCiAgICAgICAgLy8g5byA5ZCv6YCB56S85ZOBCiAgICAgICAgZ2lmdF9wcmljZTogMCwKICAgICAgICBpc19ob3Q6IDAsCiAgICAgICAgaXNfYmVuZWZpdDogMCwKICAgICAgICBpc19iZXN0OiAwLAogICAgICAgIGlzX25ldzogMCwKICAgICAgICBpc19nb29kOiAwLAogICAgICAgIGlzX3Bvc3RhZ2U6IDAsCiAgICAgICAgaXNfc3ViOiBbXSwKICAgICAgICByZWNvbW1lbmRfbGlzdDogW10sCiAgICAgICAgcGFyYW1zX2xpc3Q6IFtdLAogICAgICAgIC8v5ZWG5ZOB5Y+C5pWwCiAgICAgICAgdmlydHVhbF90eXBlOiAwLAogICAgICAgIC8vIGlzX3N1YjogMCwKICAgICAgICBpZDogMCwKICAgICAgICBzcGVjX3R5cGU6IDAsCiAgICAgICAgaXNfdmlydHVhbDogMCwKICAgICAgICB2aWRlb19saW5rOiAnJywKICAgICAgICAvLyBwb3N0YWdlOiAwLAogICAgICAgIHRlbXBfaWQ6ICcnLAogICAgICAgIGF0dHJzOiBbXSwKICAgICAgICBpdGVtczogW3sKICAgICAgICAgIHBpYzogJycsCiAgICAgICAgICBwcmljZTogMCwKICAgICAgICAgIGNvc3Q6IDAsCiAgICAgICAgICBvdF9wcmljZTogMCwKICAgICAgICAgIHN0b2NrOiAwLAogICAgICAgICAgYmFyX2NvZGU6ICcnLAogICAgICAgICAgYmFyX2NvZGVfbnVtYmVyOiAnJwogICAgICAgIH1dLAogICAgICAgIGFjdGl2aXR5OiBbJ+m7mOiupCcsICfnp5LmnYAnLCAn56CN5Lu3JywgJ+aLvOWboiddLAogICAgICAgIGNvdXBvbk5hbWU6IFtdLAogICAgICAgIGhlYWRlcjogW10sCiAgICAgICAgc2VsZWN0UnVsZTogJycsCiAgICAgICAgY291cG9uX2lkczogW10sCiAgICAgICAgY29tbWFuZF93b3JkOiAnJywKICAgICAgICBtaW5fcXR5OiAxLAogICAgICAgIGxhYmVsX2xpc3Q6IFtdLAogICAgICAgIHByb3RlY3Rpb25fbGlzdDogW10KICAgICAgfSwKICAgICAgcnVsZUxpc3Q6IFtdLAogICAgICB0ZW1wbGF0ZUxpc3Q6IFtdLAogICAgICBjcmVhdGVCbnQ6IHRydWUsCiAgICAgIHNob3dJcHV0OiBmYWxzZSwKICAgICAgbWFueUZvcm1WYWxpZGF0ZTogW10sCiAgICAgIC8vIOWNleinhOagvOihqOagvGRhdGEKICAgICAgb25lRm9ybVZhbGlkYXRlOiBbewogICAgICAgIHBpYzogJycsCiAgICAgICAgcHJpY2U6IDAsCiAgICAgICAgY29zdDogMCwKICAgICAgICBvdF9wcmljZTogMCwKICAgICAgICBzdG9jazogMCwKICAgICAgICBiYXJfY29kZTogJycsCiAgICAgICAgYmFyX2NvZGVfbnVtYmVyOiAnJywKICAgICAgICB3ZWlnaHQ6IDAsCiAgICAgICAgdm9sdW1lOiAwLAogICAgICAgIGJyb2tlcmFnZTogMCwKICAgICAgICBicm9rZXJhZ2VfdHdvOiAwLAogICAgICAgIHZpcF9wcmljZTogMCwKICAgICAgICB2aXJ0dWFsX2xpc3Q6IFtdLAogICAgICAgIGNvdXBvbl9pZDogMAogICAgICB9XSwKICAgICAgaW1hZ2VzOiBbXSwKICAgICAgaW1hZ2VzVGFibGU6ICcnLAogICAgICBjdXJyZW50VGFiOiAnMScsCiAgICAgIGlzQ2hvaWNlOiAnJywKICAgICAgbG9hZGluZzogZmFsc2UsCiAgICAgIG1vZGFsUGljOiBmYWxzZSwKICAgICAgYWRkVmlydHVhbE1vZGVsOiBmYWxzZSwKICAgICAgdGVtcGxhdGU6IGZhbHNlLAogICAgICB1cGxvYWRMaXN0OiBbXSwKICAgICAgdHJlZVNlbGVjdDogW10sCiAgICAgIHBpY1RpdDogJycsCiAgICAgIHRhYmxlSW5kZXg6IDAsCiAgICAgIHJ1bGVWYWxpZGF0ZTogUnVsZVZhbGlkYXRlLAogICAgICBtYW55QnJva2VyYWdlOiB1bmRlZmluZWQsCiAgICAgIG1hbnlCcm9rZXJhZ2VUd286IHVuZGVmaW5lZCwKICAgICAgbWFueVZpcFByaWNlOiB1bmRlZmluZWQsCiAgICAgIG1hbnlWaXBEaXNjb3VudDogdW5kZWZpbmVkLAogICAgICB1cGxvYWQ6IHsKICAgICAgICB2aWRlb0luZzogZmFsc2UgLy8g5piv5ZCm5pi+56S66L+b5bqm5p2h77ybCiAgICAgIH0sCiAgICAgIHZpZGVvSW5nOiBmYWxzZSwKICAgICAgLy8g5piv5ZCm5pi+56S66L+b5bqm5p2h77ybCiAgICAgIHByb2dyZXNzOiAwLAogICAgICAvLyDov5vluqbmnaHpu5jorqQwCiAgICAgIHN0b2NrOiAwLAogICAgICBkaXNrX2luZm86ICcnLAogICAgICB2aWRlb0xpbms6ICcnLAogICAgICBhdHRyczogW10sCiAgICAgIGFjdGl2aXR5OiB7CiAgICAgICAg6buY6K6kOiAncmVkJywKICAgICAgICDnp5LmnYA6ICdibHVlJywKICAgICAgICDnoI3ku7c6ICdncmVlbicsCiAgICAgICAg5ou85ZuiOiAneWVsbG93JwogICAgICB9LAogICAgICBjb3Vwb25OYW1lOiBbXSwKICAgICAgdXBkYXRlSWRzOiBbXSwKICAgICAgdXBkYXRlTmFtZTogW10sCiAgICAgIGNvdXBvbklkczogJycsCiAgICAgIGNvdXBvbk5hbWVzOiBbXSwKICAgICAgcmFrZUJhY2s6IFt7CiAgICAgICAgdGl0bGU6ICfkuIDnuqfov5TkvaMo5YWDKScsCiAgICAgICAgc2xvdDogJ2Jyb2tlcmFnZScsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIHdpZHRoOiA5NQogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICfkuoznuqfov5TkvaMo5YWDKScsCiAgICAgICAgc2xvdDogJ2Jyb2tlcmFnZV90d28nLAogICAgICAgIGFsaWduOiAnY2VudGVyJywKICAgICAgICB3aWR0aDogOTUKICAgICAgfV0sCiAgICAgIG1lbWJlcjogW3sKICAgICAgICB0aXRsZTogJ+S8muWRmOS7tycsCiAgICAgICAgc2xvdDogJ3ZpcF9wcmljZScsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIHdpZHRoOiA5NQogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICfkvJrlkZjmipjmiaMnLAogICAgICAgIHNsb3Q6ICd2aXBfcHJvcG9ydGlvbicsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIHdpZHRoOiA5NQogICAgICB9XSwKICAgICAgY29sdW1uc0luc3RhbE06IFtdLAogICAgICBtb3ZlSW5kZXg6ICcnLAogICAgICBhZGRWYWx1ZTogJycsCiAgICAgIHZpc2libGU6IGZhbHNlLAogICAgICB0eXBlQ29uZmlnOiBbXSwKICAgICAgZ29vZHNUeXBlOiBbXSwKICAgICAgcGFyYW1zVHlwZUxpc3Q6IFtdLAogICAgICBwYXJhbXNUeXBlOiBudWxsLAogICAgICBjYW5TZWw6IHRydWUsCiAgICAgIC8vIOinhOagvOWbvueJh+a3u+WKoOWIpOaWrQogICAgICBjaGFuZ2VBdHRyVmFsdWU6ICcnLAogICAgICAvL+S/ruaUueeahOinhOagvOWAvAogICAgICB0YWJsZUtleTogMCwKICAgICAgcHJvdGVjdGlvbkxpc3Q6IFtdLAogICAgICAvLyDmnI3liqHkv53pmpwKICAgICAgbGFiZWxMaXN0OiBbXSwKICAgICAgdGlsZUxhYmVsTGlzdDogW10KICAgIH07CiAgfSwKICBjb21wdXRlZDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtYXBTdGF0ZSgnbWVkaWEnLCBbJ2lzTW9iaWxlJ10pKSwge30sIHsKICAgIGxhYmVsV2lkdGg6IGZ1bmN0aW9uIGxhYmVsV2lkdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmlzTW9iaWxlID8gdW5kZWZpbmVkIDogJzEyMHB4JzsKICAgIH0sCiAgICBsYWJlbFBvc2l0aW9uOiBmdW5jdGlvbiBsYWJlbFBvc2l0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5pc01vYmlsZSA/ICd0b3AnIDogJ3JpZ2h0JzsKICAgIH0sCiAgICBsYWJlbEJvdHRvbTogZnVuY3Rpb24gbGFiZWxCb3R0b20oKSB7CiAgICAgIHJldHVybiB0aGlzLmlzTW9iaWxlID8gdW5kZWZpbmVkIDogJzE1cHgnOwogICAgfQogIH0pLAogIHdhdGNoOiB7CiAgICB0eXBlQ29uZmlnOiBmdW5jdGlvbiB0eXBlQ29uZmlnKHZhbCkgewogICAgICBpZiAodmFsLmxlbmd0aCkgewogICAgICAgIC8vIOWvuXZpcnR1YWzkuK3nmoRpZOetieS6jnZhbOS4reeahGlk55qECiAgICAgICAgdGhpcy5nb29kc1R5cGUgPSB0aGlzLnZpcnR1YWwuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICByZXR1cm4gdmFsLmluY2x1ZGVzKGl0ZW0uaWQgKyAnJyk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5nb29kc1R5cGUgPSB0aGlzLnZpcnR1YWw7CiAgICAgIH0KICAgIH0KICB9LAogIGJlZm9yZVJvdXRlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVSb3V0ZVVwZGF0ZSh0bywgZnJvbSwgbmV4dCkgewogICAgdGhpcy5idXMuJGVtaXQoJ29uVGFnc1ZpZXdSZWZyZXNoUm91dGVyVmlldycsIHRoaXMuJHJvdXRlLnBhdGgpOwogICAgbmV4dCgpOwogIH0sCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1uczIuc2xpY2UoMCwgOCk7CiAgICB0aGlzLmdldFRva2VuKCk7CiAgfSwKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcigvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yKCkubShmdW5jdGlvbiBfY2FsbGVlKCkgewogICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yKCkudyhmdW5jdGlvbiAoX2NvbnRleHQpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5uKSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGlmICghKF90aGlzLiRyb3V0ZS5wYXJhbXMuaWQgIT09ICcwJyAmJiBfdGhpcy4kcm91dGUucGFyYW1zLmlkKSkgewogICAgICAgICAgICAgIF9jb250ZXh0Lm4gPSAyOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9jb250ZXh0Lm4gPSAxOwogICAgICAgICAgICByZXR1cm4gX3RoaXMuZ2V0SW5mbygpOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBfY29udGV4dC5uID0gMzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGlmIChfdGhpcy4kcm91dGUucGFyYW1zLmlkID09PSAnMCcpIHsKICAgICAgICAgICAgICBfdGhpcy5nZXRQcm9kdWN0Q2FjaGUoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfdGhpcy5nZXRwcm9kdWN0TGFiZWxVc2VMaXN0QXBpKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgaWYgKF90aGlzLiRyb3V0ZS5xdWVyeS50eXBlKSB7CiAgICAgICAgICAgICAgX3RoaXMubW9kYWxzID0gdHJ1ZTsKICAgICAgICAgICAgICBfdGhpcy50eXBlID0gX3RoaXMuJHJvdXRlLnF1ZXJ5LnR5cGU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3RoaXMudHlwZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3RoaXMuZ29vZHNDYXRlZ29yeSgpOwogICAgICAgICAgICBfdGhpcy5wcm9kdWN0R2V0UnVsZSgpOwogICAgICAgICAgICBfdGhpcy5wcm9kdWN0R2V0VGVtcGxhdGUoKTsKICAgICAgICAgICAgX3RoaXMucGFyYW1zR2V0VGVtcGxhdGUoKTsKICAgICAgICAgICAgX3RoaXMudXBsb2FkVHlwZSgpOwogICAgICAgICAgICBfdGhpcy5wcm9kdWN0Q29uZmlnKCk7CiAgICAgICAgICAgIF90aGlzLndhdGNoQWN0aXZpdHkoKTsKICAgICAgICAgICAgX3RoaXMuZ2V0UHJvdGVjdGlvbkxpc3QoKTsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmEoMik7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlKTsKICAgIH0pKSgpOwogIH0sCiAgbWV0aG9kczogewogICAgZ2V0UHJvZHVjdENhY2hlOiBmdW5jdGlvbiBnZXRQcm9kdWN0Q2FjaGUoKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICBwcm9kdWN0Q2FjaGUoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICB2YXIgZGF0YSA9IHJlcy5kYXRhLmluZm87CiAgICAgICAgX3RoaXMyLmdldHByb2R1Y3RMYWJlbFVzZUxpc3RBcGkoKTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgIHZhciBjYXRlX2lkID0gZGF0YS5jYXRlX2lkLm1hcChOdW1iZXIpOwogICAgICAgICAgdmFyIGxhYmVsX2lkID0gZGF0YS5sYWJlbF9pZC5tYXAoTnVtYmVyKTsKICAgICAgICAgIF90aGlzMi5hdHRycyA9IGRhdGEuaXRlbXMgfHwgW107CiAgICAgICAgICB2YXIgaWRzID0gW107CiAgICAgICAgICBpZiAoZGF0YS5jb3Vwb25zKSB7CiAgICAgICAgICAgIGRhdGEuY291cG9ucy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICBpZHMucHVzaChpdGVtLmlkKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIF90aGlzMi5jb3Vwb25OYW1lID0gZGF0YS5jb3Vwb25zOwogICAgICAgICAgfQogICAgICAgICAgX3RoaXMyLmZvcm1WYWxpZGF0ZSA9IGRhdGE7CiAgICAgICAgICBfdGhpczIuZGF0YUxhYmVsID0gZGF0YS5sYWJlbF9pZDsKICAgICAgICAgIF90aGlzMi5mb3JtVmFsaWRhdGUuY291cG9uX2lkcyA9IGlkczsKICAgICAgICAgIF90aGlzMi51cGRhdGVJZHMgPSBpZHM7CiAgICAgICAgICBfdGhpczIudXBkYXRlTmFtZSA9IGRhdGEuY291cG9uczsKICAgICAgICAgIF90aGlzMi5mb3JtVmFsaWRhdGUuY2F0ZV9pZCA9IGNhdGVfaWQ7CiAgICAgICAgICBfdGhpczIub25lRm9ybVZhbGlkYXRlID0gZGF0YS5hdHRyczsKICAgICAgICAgIF90aGlzMi5nZW5lcmF0ZUhlYWRlcihfdGhpczIuYXR0cnMpOwogICAgICAgICAgX3RoaXMyLmZvcm1WYWxpZGF0ZS5sb2dpc3RpY3MgPSBkYXRhLmxvZ2lzdGljcyB8fCBbJzEnXTsKICAgICAgICAgIF90aGlzMi5mb3JtVmFsaWRhdGUuaGVhZGVyID0gW107CiAgICAgICAgICBfdGhpczIubWFueUZvcm1WYWxpZGF0ZSA9IGRhdGEuYXR0cnM7CiAgICAgICAgICBfdGhpczIuc3BlY190eXBlID0gZGF0YS5zcGVjX3R5cGU7CiAgICAgICAgICBfdGhpczIuZm9ybVZhbGlkYXRlLmlzX3ZpcnR1YWwgPSBkYXRhLmlzX3ZpcnR1YWw7CiAgICAgICAgICBfdGhpczIuZm9ybVZhbGlkYXRlLmN1c3RvbV9mb3JtID0gZGF0YS5jdXN0b21fZm9ybSB8fCBbXTsKICAgICAgICAgIGlmIChfdGhpczIuZm9ybVZhbGlkYXRlLmN1c3RvbV9mb3JtLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgIF90aGlzMi5jdXN0b21CdG4gPSAxOwogICAgICAgICAgfQogICAgICAgICAgX3RoaXMyLmF0dHJzLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICBpZiAoaXRlbS5hZGRfcGljKSBfdGhpczIuY2FuU2VsID0gZmFsc2U7CiAgICAgICAgICB9KTsKICAgICAgICAgIF90aGlzMi52aXJ0dWFsYnRuKGRhdGEudmlydHVhbF90eXBlLCAxKTsKICAgICAgICAgIGlmIChkYXRhLnNwZWNfdHlwZSA9PT0gMCkgewogICAgICAgICAgICBfdGhpczIubWFueUZvcm1WYWxpZGF0ZSA9IFtdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3RoaXMyLmNyZWF0ZUJudCA9IHRydWU7CiAgICAgICAgICAgIF90aGlzMi5vbmVGb3JtVmFsaWRhdGUgPSBbewogICAgICAgICAgICAgIHBpYzogZGF0YS5pbWFnZSwKICAgICAgICAgICAgICBwcmljZTogMCwKICAgICAgICAgICAgICBjb3N0OiAwLAogICAgICAgICAgICAgIG90X3ByaWNlOiAwLAogICAgICAgICAgICAgIHN0b2NrOiAwLAogICAgICAgICAgICAgIGJhcl9jb2RlOiAnJywKICAgICAgICAgICAgICBiYXJfY29kZV9udW1iZXI6ICcnLAogICAgICAgICAgICAgIHdlaWdodDogMCwKICAgICAgICAgICAgICB2b2x1bWU6IDAsCiAgICAgICAgICAgICAgYnJva2VyYWdlOiAwLAogICAgICAgICAgICAgIGJyb2tlcmFnZV90d286IDAsCiAgICAgICAgICAgICAgdmlwX3ByaWNlOiAwLAogICAgICAgICAgICAgIHZpcnR1YWxfbGlzdDogW10sCiAgICAgICAgICAgICAgY291cG9uX2lkOiAwCiAgICAgICAgICAgIH1dOwogICAgICAgICAgfQogICAgICAgICAgX3RoaXMyLndhdGNoQWN0aXZpdHkoKTsKICAgICAgICAgIF90aGlzMi5zcGluU2hvdyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIF90aGlzMi4kbWVzc2FnZS5lcnJvcihlcnIubXNnKTsKICAgICAgfSk7CiAgICB9LAogICAgZ2V0UHJvdGVjdGlvbkxpc3Q6IGZ1bmN0aW9uIGdldFByb3RlY3Rpb25MaXN0KCkgewogICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgcHJvZHVjdFByb3RlY3Rpb25MaXN0QXBpKHsKICAgICAgICBwYWdlOiAwLAogICAgICAgIGxpbWl0OiAwLAogICAgICAgIHN0YXR1czogMQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBfdGhpczMucHJvdGVjdGlvbkxpc3QgPSByZXMuZGF0YS5saXN0OwogICAgICB9KTsKICAgIH0sCiAgICBnZXRwcm9kdWN0TGFiZWxVc2VMaXN0QXBpOiBmdW5jdGlvbiBnZXRwcm9kdWN0TGFiZWxVc2VMaXN0QXBpKCkgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKICAgICAgcHJvZHVjdExhYmVsVXNlTGlzdEFwaSgpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgIC8vIOWQiOW5tuaVsOe7hOS4reaJgOacieeahGxpc3QKICAgICAgICBfdGhpczQudGlsZUxhYmVsTGlzdCA9IHJlcy5kYXRhLmZsYXRNYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgIHJldHVybiBpdGVtLmxpc3Q7CiAgICAgICAgfSk7CiAgICAgICAgdmFyIGxhYmVsTGlzdCA9IHJlcy5kYXRhOwogICAgICAgIGlmIChfdGhpczQuZm9ybVZhbGlkYXRlLmxhYmVsX2xpc3QubGVuZ3RoKSB7CiAgICAgICAgICBfdGhpczQuZm9ybVZhbGlkYXRlLmxhYmVsX2xpc3QubWFwKGZ1bmN0aW9uIChlbCkgewogICAgICAgICAgICBsYWJlbExpc3QubWFwKGZ1bmN0aW9uIChyZSkgewogICAgICAgICAgICAgIHJlLmxpc3QubWFwKGZ1bmN0aW9uIChsYWJlbCkgewogICAgICAgICAgICAgICAgaWYgKGxhYmVsLmlkID09PSBlbCkgewogICAgICAgICAgICAgICAgICBsYWJlbC5hY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgbGFiZWwuYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxhYmVsTGlzdC5tYXAoZnVuY3Rpb24gKGVsKSB7CiAgICAgICAgICAgIGVsLmxpc3QubWFwKGZ1bmN0aW9uIChsYWJlbCkgewogICAgICAgICAgICAgIGxhYmVsLmFjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfdGhpczQubGFiZWxMaXN0ID0gbGFiZWxMaXN0OwogICAgICB9KTsKICAgIH0sCiAgICBhZGRQcm90ZWN0aW9uOiBmdW5jdGlvbiBhZGRQcm90ZWN0aW9uKCkgewogICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7CiAgICAgICAgcGF0aDogdGhpcy4kcm91dGVQcm9TdHIgKyAnL3Byb2R1Y3QvcHJvdGVjdGlvbi9saXN0JwogICAgICB9KTsKICAgIH0sCiAgICBwcm9kdWN0Q29uZmlnOiBmdW5jdGlvbiBwcm9kdWN0Q29uZmlnKCkgewogICAgICB2YXIgX3RoaXM1ID0gdGhpczsKICAgICAgZ2V0UHJvZHVjdFR5cGVDb25maWcoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBfdGhpczUudHlwZUNvbmZpZyA9IHJlcy5kYXRhOwogICAgICB9KTsKICAgIH0sCiAgICBiZWZvcmVVcGxvYWQ6IGZ1bmN0aW9uIGJlZm9yZVVwbG9hZChmaWxlKSB7CiAgICAgIHJldHVybiBpc0ZpbGVVcGxvYWQoZmlsZSk7CiAgICB9LAogICAgLy8g5YiG54mH5LiK5LygCiAgICB2aWRlb1NhdmVUb1VybDogZnVuY3Rpb24gdmlkZW9TYXZlVG9VcmwoZmlsZSkgewogICAgICB2YXIgX3RoaXM2ID0gdGhpczsKICAgICAgaWYgKGlzVmlkZW9VcGxvYWQoZmlsZSkpIHsKICAgICAgICB1cGxvYWRCeVBpZWNlcyh7CiAgICAgICAgICBmaWxlOiBmaWxlLAogICAgICAgICAgLy8g6KeG6aKR5a6e5L2TCiAgICAgICAgICBwaWVjZVNpemU6IDMsCiAgICAgICAgICAvLyDliIbniYflpKflsI8KICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIHN1Y2Nlc3MoZGF0YSkgewogICAgICAgICAgICBfdGhpczYuZm9ybVZhbGlkYXRlLnZpZGVvX2xpbmsgPSBkYXRhLmZpbGVfcGF0aDsKICAgICAgICAgICAgX3RoaXM2LnByb2dyZXNzID0gMTAwOwogICAgICAgICAgfSwKICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiBlcnJvcihlKSB7CiAgICAgICAgICAgIF90aGlzNi4kbWVzc2FnZS5lcnJvcihlLm1zZyk7CiAgICAgICAgICB9LAogICAgICAgICAgdXBsb2FkaW5nOiBmdW5jdGlvbiB1cGxvYWRpbmcoY2h1bmssIGFsbENodW5rKSB7CiAgICAgICAgICAgIF90aGlzNi52aWRlb0luZyA9IHRydWU7CiAgICAgICAgICAgIHZhciBzdCA9IE1hdGguZmxvb3IoY2h1bmsgLyBhbGxDaHVuayAqIDEwMCk7CiAgICAgICAgICAgIF90aGlzNi5wcm9ncmVzcyA9IHN0OwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sCiAgICAvLyDnsbvlnovpgInmi6kv5aGr5YWl5YaF5a655Yik5patCiAgICB2aXJ0dWFsYnRuOiBmdW5jdGlvbiB2aXJ0dWFsYnRuKGluZGV4LCB0eXBlKSB7CiAgICAgIHZhciBfdGhpczcgPSB0aGlzOwogICAgICBpZiAodHlwZSAhPSAxKSB7CiAgICAgICAgaWYgKHRoaXMuJHJvdXRlLnBhcmFtcy5pZCkgcmV0dXJuIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+e8lui+keWVhuWTgeS4jeaUr+aMgeWIh+aNouWVhuWTgeexu+WeiycpOwogICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmlzX3N1YiA9IFtdOwogICAgICAgIHZhciBpZCA9IHRoaXMuJHJvdXRlLnBhcmFtcy5pZDsKICAgICAgICBpZiAoaWQpIHsKICAgICAgICAgIGNoZWNrQWN0aXZpdHlBcGkoaWQpLnRoZW4oZnVuY3Rpb24gKHJlcykge30pLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgX3RoaXM3LmZvcm1WYWxpZGF0ZS5zcGVjX3R5cGUgPSBfdGhpczcuc3BlY190eXBlOwogICAgICAgICAgICBfdGhpczcuJG1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLnNwZWNfdHlwZSA9PSAxKSB7CiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGUoMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIOWumuS5ieWfuuehgOWVhuWTgeWSjOiZmuaLn+WVhuWTgeeahOagh+etvumhtemFjee9rgogICAgICB2YXIgYmFzZUhlYWRUYWJzID0gW3sKICAgICAgICB0aXQ6ICfln7rnoYDkv6Hmga8nLAogICAgICAgIG5hbWU6ICcxJwogICAgICB9LCB7CiAgICAgICAgdGl0OiAn6KeE5qC85bqT5a2YJywKICAgICAgICBuYW1lOiAnMicKICAgICAgfSwgewogICAgICAgIHRpdDogJ+WVhuWTgeivpuaDhScsCiAgICAgICAgbmFtZTogJzMnCiAgICAgIH0sIHsKICAgICAgICB0aXQ6ICfnianmtYHorr7nva4nLAogICAgICAgIG5hbWU6ICc0JwogICAgICB9LCB7CiAgICAgICAgdGl0OiAn5Lya5ZGY5Lu3L+S9o+mHkScsCiAgICAgICAgbmFtZTogJzUnCiAgICAgIH0sIHsKICAgICAgICB0aXQ6ICfokKXplIDorr7nva4nLAogICAgICAgIG5hbWU6ICc2JwogICAgICB9LCB7CiAgICAgICAgdGl0OiAn5YW25LuW6K6+572uJywKICAgICAgICBuYW1lOiAnNycKICAgICAgfV07CiAgICAgIHZhciB2aXJ0dWFsSGVhZFRhYnMgPSBbewogICAgICAgIHRpdDogJ+WfuuehgOS/oeaBrycsCiAgICAgICAgbmFtZTogJzEnCiAgICAgIH0sIHsKICAgICAgICB0aXQ6ICfop4TmoLzlupPlrZgnLAogICAgICAgIG5hbWU6ICcyJwogICAgICB9LCB7CiAgICAgICAgdGl0OiAn5ZWG5ZOB6K+m5oOFJywKICAgICAgICBuYW1lOiAnMycKICAgICAgfSwgewogICAgICAgIHRpdDogJ+S8muWRmOS7ty/kvaPph5EnLAogICAgICAgIG5hbWU6ICc0JwogICAgICB9LCB7CiAgICAgICAgdGl0OiAn6JCl6ZSA6K6+572uJywKICAgICAgICBuYW1lOiAnNScKICAgICAgfSwgewogICAgICAgIHRpdDogJ+WFtuS7luiuvue9ricsCiAgICAgICAgbmFtZTogJzYnCiAgICAgIH1dOwogICAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgLy8g5pmu6YCa5ZWG5ZOBCiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPSAwOwogICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXNfdmlydHVhbCA9IDA7CiAgICAgICAgICB0aGlzLmhlYWRUYWIgPSBiYXNlSGVhZFRhYnM7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAvLyDljaHlr4Yv572R55uY5ZWG5ZOBCiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPSAxOwogICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUucG9zdGFnZSA9IDA7CiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5pc192aXJ0dWFsID0gMTsKICAgICAgICAgIHRoaXMuaGVhZFRhYiA9IHZpcnR1YWxIZWFkVGFiczsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIC8vIOS8mOaDoOWIuOWVhuWTgQogICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlID0gMjsKICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmlzX3ZpcnR1YWwgPSAxOwogICAgICAgICAgdGhpcy5oZWFkVGFiID0gdmlydHVhbEhlYWRUYWJzOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgLy8g6Jma5ouf5ZWG5ZOBCiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPSAzOwogICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXNfdmlydHVhbCA9IDE7CiAgICAgICAgICB0aGlzLmhlYWRUYWIgPSB2aXJ0dWFsSGVhZFRhYnM7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSwKICAgIC8vIOaWsOWinuWIhuexuwogICAgYWRkQ2F0ZTogZnVuY3Rpb24gYWRkQ2F0ZSgpIHsKICAgICAgdmFyIF90aGlzOCA9IHRoaXM7CiAgICAgIHRoaXMuJG1vZGFsRm9ybShwcm9kdWN0Q3JlYXRlQXBpKCkpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBfdGhpczguZ29vZHNDYXRlZ29yeSgpOwogICAgICB9KTsKICAgIH0sCiAgICAvLyDnianmtYHmlrnlvI/pgInmi6kKICAgIGxvZ2lzdGljc0J0bjogZnVuY3Rpb24gbG9naXN0aWNzQnRuKGUpIHsKICAgICAgdGhpcy5mb3JtVmFsaWRhdGUubG9naXN0aWNzID0gZTsKICAgIH0sCiAgICAvLyDmlrDlop7moIfnrb4KICAgIGFkZExhYmVsOiBmdW5jdGlvbiBhZGRMYWJlbCgpIHsKICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgIHRoaXMuJG1vZGFsRm9ybSh1c2VyTGFiZWxBZGRBcGkoMCkpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBfdGhpczkudXNlckxhYmVsKCk7CiAgICAgIH0pOwogICAgfSwKICAgIC8vIOmAieaLqeagh+etvgogICAgYWRkR29vZHNUYWc6IGZ1bmN0aW9uIGFkZEdvb2RzVGFnKCkgewogICAgICB0aGlzLnRhZ1Nob3cgPSB0cnVlOwogICAgfSwKICAgIC8vIOiHquWumuS5ieeVmeiogCDlvIDlkK/lhbPpl60KICAgIGN1c3RvbU1lc3NCdG46IGZ1bmN0aW9uIGN1c3RvbU1lc3NCdG4oZSkgewogICAgICBpZiAoIWUpIHsKICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jdXN0b21fZm9ybSA9IFtdOwogICAgICB9CiAgICAgIHRoaXMuY3VzdG9tQnRuID0gZTsKICAgIH0sCiAgICAvLyDoh6rlrprkuYnnlZnoqIAg5paw5aKe6KGo5Y2VCiAgICBhZGRjdXN0b206IGZ1bmN0aW9uIGFkZGN1c3RvbSgpIHsKICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLmN1c3RvbV9mb3JtLmxlbmd0aCA+IDkpIHsKICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+acgOWkmua3u+WKoDEw5p2hJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuY3VzdG9tX2Zvcm0ucHVzaCh7CiAgICAgICAgICB0aXRsZTogJycsCiAgICAgICAgICBsYWJlbDogJ3RleHQnLAogICAgICAgICAgdmFsdWU6ICcnLAogICAgICAgICAgc3RhdHVzOiBmYWxzZQogICAgICAgIH0pOwogICAgICB9CiAgICB9LAogICAgLy8g5Yig6ZmkCiAgICBkZWxjdXN0b206IGZ1bmN0aW9uIGRlbGN1c3RvbShpbmRleCkgewogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jdXN0b21fZm9ybS5zcGxpY2UoaW5kZXgsIDEpOwogICAgfSwKICAgIC8vIOmihOWUruWFt+S9k+aXpeacnwogICAgb25jaGFuZ2VUaW1lOiBmdW5jdGlvbiBvbmNoYW5nZVRpbWUoZSkgewogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5wcmVzYWxlX3RpbWUgPSBlOwogICAgfSwKICAgIC8vIOWVhuWTgeivpuaDhQogICAgZ2V0RWRpdG9yQ29udGVudDogZnVuY3Rpb24gZ2V0RWRpdG9yQ29udGVudChkYXRhKSB7CiAgICAgIHRoaXMuY29udGVudCA9IGRhdGE7CiAgICB9LAogICAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7CiAgICAgIHRoaXMubW9kYWxzID0gZmFsc2U7CiAgICB9LAogICAgLy8g5LiK5Lyg5aS06YOodG9rZW4KICAgIGdldFRva2VuOiBmdW5jdGlvbiBnZXRUb2tlbigpIHsKICAgICAgdGhpcy5oZWFkZXJbJ0F1dGhvcmktemF0aW9uJ10gPSAnQmVhcmVyICcgKyBnZXRDb29raWVzKCd0b2tlbicpOwogICAgfSwKICAgIC8vIOWvvOWFpeWNoeWvhgogICAgdXBGaWxlOiBmdW5jdGlvbiB1cEZpbGUocmVzKSB7CiAgICAgIHZhciBfdGhpczAgPSB0aGlzOwogICAgICBpbXBvcnRDYXJkKHsKICAgICAgICBmaWxlOiByZXMuZGF0YS5zcmMKICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgX3RoaXMwLnZpcnR1YWxMaXN0ID0gX3RoaXMwLnZpcnR1YWxMaXN0LmNvbmNhdChyZXMuZGF0YSk7CiAgICAgIH0pOwogICAgfSwKICAgIC8v6I635Y+W6KeG6aKR5LiK5Lyg57G75Z6LCiAgICB1cGxvYWRUeXBlOiBmdW5jdGlvbiB1cGxvYWRUeXBlKCkgewogICAgICB2YXIgX3RoaXMxID0gdGhpczsKICAgICAgX3VwbG9hZFR5cGUoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBfdGhpczEudXBsb2FkX3R5cGUgPSByZXMuZGF0YS51cGxvYWRfdHlwZTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g5Yid5aeL5YyW5pWw5o2u5bGV56S6CiAgICBpbmZvRGF0YTogZnVuY3Rpb24gaW5mb0RhdGEoZGF0YSwgaXNDb3B5KSB7CiAgICAgIHZhciBfdGhpczEwID0gdGhpczsKICAgICAgdmFyIGNhdGVfaWQgPSBkYXRhLmNhdGVfaWQubWFwKE51bWJlcik7CiAgICAgIHZhciBsYWJlbF9pZCA9IGRhdGEubGFiZWxfaWQubWFwKE51bWJlcik7CiAgICAgIHRoaXMuYXR0cnMgPSBkYXRhLml0ZW1zIHx8IFtdOwogICAgICB2YXIgaWRzID0gW107CiAgICAgIGRhdGEuY291cG9ucy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICBpZHMucHVzaChpdGVtLmlkKTsKICAgICAgfSk7CiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlID0gZGF0YTsKICAgICAgdGhpcy5zZWxldFZpZGVvID0gZGF0YS5zZWxldFZpZGVvOwogICAgICB0aGlzLmNvbnRlbnRzID0gZGF0YS5kZXNjcmlwdGlvbjsKICAgICAgdGhpcy5jb3Vwb25OYW1lID0gZGF0YS5jb3Vwb25zOwogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jb3Vwb25faWRzID0gaWRzOwogICAgICB0aGlzLnVwZGF0ZUlkcyA9IGlkczsKICAgICAgdGhpcy5kYXRhTGFiZWwgPSBkYXRhLmxhYmVsX2lkOwogICAgICB0aGlzLnVwZGF0ZU5hbWUgPSBkYXRhLmNvdXBvbnM7CiAgICAgIHRoaXMudmlydHVhbGJ0bihkYXRhLnZpcnR1YWxfdHlwZSwgMSk7CiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmxvZ2lzdGljcyA9IGRhdGEubG9naXN0aWNzIHx8IFsnMSddOwogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jdXN0b21fZm9ybSA9IGRhdGEuY3VzdG9tX2Zvcm0gfHwgW107CiAgICAgIGlmICh0aGlzLmZvcm1WYWxpZGF0ZS5jdXN0b21fZm9ybS5sZW5ndGggIT0gMCkgewogICAgICAgIHRoaXMuY3VzdG9tQnRuID0gMTsKICAgICAgfQogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jYXRlX2lkID0gY2F0ZV9pZDsKICAgICAgaWYgKGRhdGEuYXR0cikgewogICAgICAgIHRoaXMub25lRm9ybVZhbGlkYXRlID0gW2RhdGEuYXR0cl07CiAgICAgICAgdGhpcy5vbmVGb3JtVmFsaWRhdGVbMF0udmlwX3Byb3BvcnRpb24gPSAodGhpcy5vbmVGb3JtVmFsaWRhdGVbMF0udmlwX3ByaWNlIC8gdGhpcy5vbmVGb3JtVmFsaWRhdGVbMF0ucHJpY2UgKiAxMDApLnRvRml4ZWQoMik7CiAgICAgIH0KICAgICAgdGhpcy5nZXRwcm9kdWN0TGFiZWxVc2VMaXN0QXBpKCk7CiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmhlYWRlciA9IFtdOwogICAgICB0aGlzLnNwZWNfdHlwZSA9IGRhdGEuc3BlY190eXBlOwogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5zcGVjX3R5cGUgPSB0aGlzLnNwZWNfdHlwZTsKICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXNfdmlydHVhbCA9IGRhdGEuaXNfdmlydHVhbDsKICAgICAgdGhpcy5hdHRycy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICBpZiAoaXRlbS5hZGRfcGljKSBfdGhpczEwLmNhblNlbCA9IGZhbHNlOwogICAgICB9KTsKICAgICAgaWYgKGRhdGEuc3BlY190eXBlID09PSAwKSB7CiAgICAgICAgdGhpcy5tYW55Rm9ybVZhbGlkYXRlID0gW107CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5jcmVhdGVCbnQgPSB0cnVlOwogICAgICAgIHRoaXMub25lRm9ybVZhbGlkYXRlID0gW3sKICAgICAgICAgIHBpYzogJycsCiAgICAgICAgICBwcmljZTogMCwKICAgICAgICAgIGNvc3Q6IDAsCiAgICAgICAgICBvdF9wcmljZTogMCwKICAgICAgICAgIHN0b2NrOiAwLAogICAgICAgICAgYmFyX2NvZGU6ICcnLAogICAgICAgICAgYmFyX2NvZGVfbnVtYmVyOiAnJywKICAgICAgICAgIHdlaWdodDogMCwKICAgICAgICAgIHZvbHVtZTogMCwKICAgICAgICAgIGJyb2tlcmFnZTogMCwKICAgICAgICAgIGJyb2tlcmFnZV90d286IDAsCiAgICAgICAgICB2aXBfcHJpY2U6IDAsCiAgICAgICAgICB2aXJ0dWFsX2xpc3Q6IFtdLAogICAgICAgICAgY291cG9uX2lkOiAwCiAgICAgICAgfV07CiAgICAgICAgdGhpcy5nZW5lcmF0ZUhlYWRlcih0aGlzLmF0dHJzKTsKICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMub25lRm9ybUJhdGNoKSwgX3RvQ29uc3VtYWJsZUFycmF5KGRhdGEuYXR0cnMpKTsKICAgICAgfQogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgX3RoaXMxMC5jaGVja0FsbEdyb3VwKGRhdGEuaXNfc3ViKTsKICAgICAgfSwgMTAwMCk7CiAgICAgIHRoaXMud2F0Y2hBY3Rpdml0eSgpOwogICAgfSwKICAgIC8v5YWz6Zet5reY5a6d5by556qX5bm255Sf5oiQ5pWw5o2u77ybCiAgICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKGRhdGEpIHsKICAgICAgdGhpcy5tb2RhbHMgPSBmYWxzZTsKICAgICAgdGhpcy5pbmZvRGF0YShkYXRhLCAxKTsKICAgIH0sCiAgICBjaGVja01vdmU6IGZ1bmN0aW9uIGNoZWNrTW92ZShldnQpIHsKICAgICAgdGhpcy5tb3ZlSW5kZXggPSBldnQuZHJhZ2dlZENvbnRleHQuaW5kZXg7CiAgICB9LAogICAgZW5kOiBmdW5jdGlvbiBlbmQoKSB7CiAgICAgIHRoaXMubW92ZUluZGV4ID0gJyc7CiAgICAgIHRoaXMuZ2VuZXJhdGUoMSk7CiAgICB9LAogICAgLy8g5Y2V54us6K6+572u5Lya5ZGY6K6+572uCiAgICBjaGVja0FsbEdyb3VwQ2hhbmdlOiBmdW5jdGlvbiBjaGVja0FsbEdyb3VwQ2hhbmdlKGRhdGEpIHsKICAgICAgdGhpcy5jaGVja0FsbEdyb3VwKGRhdGEpOwogICAgfSwKICAgIGNoZWNrQWxsR3JvdXA6IGZ1bmN0aW9uIGNoZWNrQWxsR3JvdXAoZGF0YSkgewogICAgICB2YXIgZW5kTGVuZ3RoID0gdGhpcy5hdHRycy5sZW5ndGggKyAzOwogICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuc3BlY190eXBlID09PSAwKSB7CiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWxsID0gdGhpcy5jb2x1bW5zMi5zbGljZSgwLCBlbmRMZW5ndGgpLmNvbmNhdCh0aGlzLnJha2VCYWNrKS5jb25jYXQodGhpcy5tZW1iZXIpOwogICAgICAgIH0gZWxzZSBpZiAoZGF0YS5pbmRleE9mKDApID4gLTEpIHsKICAgICAgICAgIHRoaXMuY29sdW1uc0luc3RhbGwgPSB0aGlzLmNvbHVtbnMyLnNsaWNlKDAsIGVuZExlbmd0aCkuY29uY2F0KHRoaXMubWVtYmVyKTsKICAgICAgICB9IGVsc2UgaWYgKGRhdGEuaW5kZXhPZigxKSA+IC0xKSB7CiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWxsID0gdGhpcy5jb2x1bW5zMi5zbGljZSgwLCBlbmRMZW5ndGgpLmNvbmNhdCh0aGlzLnJha2VCYWNrKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5jb2x1bW5zSW5zdGFsbCA9IHRoaXMuY29sdW1uczIuc2xpY2UoMCwgZW5kTGVuZ3RoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWwyID0gdGhpcy5jb2x1bW5zSW5zdGFsTS5zbGljZSgwLCBlbmRMZW5ndGggKyAxKS5jb25jYXQodGhpcy5yYWtlQmFjaykuY29uY2F0KHRoaXMubWVtYmVyKTsKICAgICAgICB9IGVsc2UgaWYgKGRhdGEuaW5kZXhPZigwKSA+IC0xKSB7CiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWwyID0gdGhpcy5jb2x1bW5zSW5zdGFsTS5zbGljZSgwLCBlbmRMZW5ndGgpLmNvbmNhdCh0aGlzLm1lbWJlcik7CiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmluZGV4T2YoMSkgPiAtMSkgewogICAgICAgICAgdGhpcy5jb2x1bW5zSW5zdGFsMiA9IHRoaXMuY29sdW1uc0luc3RhbE0uc2xpY2UoMCwgZW5kTGVuZ3RoKS5jb25jYXQodGhpcy5yYWtlQmFjayk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuY29sdW1uc0luc3RhbDIgPSB0aGlzLmNvbHVtbnNJbnN0YWxNLnNsaWNlKDAsIGVuZExlbmd0aCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgLy8g5re75Yqg5LyY5oOg5Yi4CiAgICBhZGRDb3Vwb246IGZ1bmN0aW9uIGFkZENvdXBvbigpIHsKICAgICAgdGhpcy4kcmVmcy5jb3Vwb25UZW1wbGF0ZXMuaXNUZW1wbGF0ZSA9IHRydWU7CiAgICAgIHRoaXMuJHJlZnMuY291cG9uVGVtcGxhdGVzLnRhYmxlTGlzdCgpOwogICAgfSwKICAgIC8vIOinhOagvOS4reS8mOaDoOWIuOafpeeciwogICAgc2VlOiBmdW5jdGlvbiBzZWUoZGF0YSwgbmFtZSwgaW5kZXgpIHsKICAgICAgdGhpcy50YWJOYW1lID0gbmFtZTsKICAgICAgdGhpcy50YWJJbmRleCA9IGluZGV4OwogICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlID09PSAxKSB7CiAgICAgICAgaWYgKGRhdGEuZGlza19pbmZvICE9ICcnKSB7CiAgICAgICAgICB0aGlzLmRpc2tfdHlwZSA9IDE7CiAgICAgICAgICB0aGlzLmRpc2tfaW5mbyA9IGRhdGEuZGlza19pbmZvOwogICAgICAgICAgdGhpcy5zdG9jayA9IGRhdGEuc3RvY2s7CiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnZpcnR1YWxfbGlzdC5sZW5ndGgpIHsKICAgICAgICAgIHRoaXMuZGlza190eXBlID0gMjsKICAgICAgICAgIHRoaXMudmlydHVhbExpc3QgPSBkYXRhLnZpcnR1YWxfbGlzdDsKICAgICAgICB9CiAgICAgICAgdGhpcy5hZGRWaXJ0dWFsTW9kZWwgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuJHJlZnMuZ29vZHNDb3Vwb24uaXNUZW1wbGF0ZSA9IHRydWU7CiAgICAgICAgdGhpcy4kcmVmcy5nb29kc0NvdXBvbi50YWJsZUxpc3QoMyk7CiAgICAgIH0KICAgIH0sCiAgICAvLyDkv67mlLnliIbkvaPmr5TkvosKICAgIGNoYW5nZURpc2NvdW50OiBmdW5jdGlvbiBjaGFuZ2VEaXNjb3VudChpbmRleCkgewogICAgICB2YXIgdHlwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ21hbnlGb3JtVmFsaWRhdGUnOwogICAgICAvLyDmoLnmja7liIbkvaPmr5TkvosgdmlwX3Byb3BvcnRpb24g5L+u5pS55Lya5ZGY5Lu3IOS/neeVmTLkvY3lsI/mlbAKICAgICAgdGhpc1t0eXBlXVtpbmRleF0udmlwX3ByaWNlID0gKHRoaXNbdHlwZV1baW5kZXhdLnByaWNlICogKHRoaXNbdHlwZV1baW5kZXhdLnZpcF9wcm9wb3J0aW9uIC8gMTAwKSkudG9GaXhlZCgyKTsKICAgIH0sCiAgICAvLyDkv67mlLnkvJrlkZjku7cKICAgIGNoYW5nZVZpcFByaWNlOiBmdW5jdGlvbiBjaGFuZ2VWaXBQcmljZShpbmRleCkgewogICAgICB2YXIgdHlwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ21hbnlGb3JtVmFsaWRhdGUnOwogICAgICAvLyDmoLnmja7kvJrlkZjku7forqHnrpflh7rliIbkvaPmr5TkvosKICAgICAgdGhpc1t0eXBlXVtpbmRleF0udmlwX3Byb3BvcnRpb24gPSAodGhpc1t0eXBlXVtpbmRleF0udmlwX3ByaWNlIC8gdGhpc1t0eXBlXVtpbmRleF0ucHJpY2UgKiAxMDApLnRvRml4ZWQoMik7CiAgICB9LAogICAgLy8g5re75Yqg5LyY5oOg5Yi4CiAgICBhZGRHb29kc0NvdXBvbjogZnVuY3Rpb24gYWRkR29vZHNDb3Vwb24oaW5kZXgsIG5hbWUpIHsKICAgICAgdGhpcy50YWJJbmRleCA9IGluZGV4OwogICAgICB0aGlzLnRhYk5hbWUgPSBuYW1lOwogICAgICB0aGlzLiRyZWZzLmdvb2RzQ291cG9uLmlzVGVtcGxhdGUgPSB0cnVlOwogICAgICB0aGlzLiRyZWZzLmdvb2RzQ291cG9uLnRhYmxlTGlzdCgzKTsKICAgIH0sCiAgICBhZGRWaXJ0dWFsOiBmdW5jdGlvbiBhZGRWaXJ0dWFsKGluZGV4LCBuYW1lKSB7CiAgICAgIHRoaXMudGFiSW5kZXggPSBpbmRleDsKICAgICAgdGhpcy50YWJOYW1lID0gbmFtZTsKICAgICAgdGhpcy5hZGRWaXJ0dWFsTW9kZWwgPSB0cnVlOwogICAgfSwKICAgIC8vIOaPkOS6pOWNoeWvhuS/oeaBrwogICAgdXBWaXJ0dWFsOiBmdW5jdGlvbiB1cFZpcnR1YWwoKSB7CiAgICAgIGlmICh0aGlzLmRpc2tfdHlwZSA9PSAyKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZpcnR1YWxMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMudmlydHVhbExpc3RbaV07CiAgICAgICAgICBpZiAoIWVsZW1lbnQudmFsdWUpIHsKICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign6K+36L6T5YWl5omA5pyJ5Y2h5a+GJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy4kc2V0KHRoaXNbdGhpcy50YWJOYW1lXVt0aGlzLnRhYkluZGV4XSwgJ3ZpcnR1YWxfbGlzdCcsIHRoaXMudmlydHVhbExpc3QpOwogICAgICAgIHRoaXMuJHNldCh0aGlzW3RoaXMudGFiTmFtZV1bdGhpcy50YWJJbmRleF0sICdzdG9jaycsIHRoaXMudmlydHVhbExpc3QubGVuZ3RoKTsKICAgICAgICB0aGlzLnZpcnR1YWxMaXN0ID0gW3sKICAgICAgICAgIGtleTogJycsCiAgICAgICAgICB2YWx1ZTogJycKICAgICAgICB9XTsKICAgICAgICB0aGlzLiRzZXQodGhpc1t0aGlzLnRhYk5hbWVdW3RoaXMudGFiSW5kZXhdLCAnZGlza19pbmZvJywgJycpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghdGhpcy5kaXNrX2luZm8ubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS5lcnJvcign6K+35aGr5YaZ5Y2h5a+G5L+h5oGvJyk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5zdG9jaykgewogICAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+Whq+WGmeW6k+WtmOaVsOmHjycpOwogICAgICAgIH0KICAgICAgICB0aGlzLiRzZXQodGhpc1t0aGlzLnRhYk5hbWVdW3RoaXMudGFiSW5kZXhdLCAnc3RvY2snLCBOdW1iZXIodGhpcy5zdG9jaykpOwogICAgICAgIHRoaXMuJHNldCh0aGlzW3RoaXMudGFiTmFtZV1bdGhpcy50YWJJbmRleF0sICdzdG9jaycsIE51bWJlcih0aGlzLnN0b2NrKSk7CiAgICAgICAgdGhpcy4kc2V0KHRoaXNbdGhpcy50YWJOYW1lXVt0aGlzLnRhYkluZGV4XSwgJ2Rpc2tfaW5mbycsIHRoaXMuZGlza19pbmZvKTsKICAgICAgICB0aGlzLiRzZXQodGhpc1t0aGlzLnRhYk5hbWVdW3RoaXMudGFiSW5kZXhdLCAndmlydHVhbF9saXN0JywgW10pOwogICAgICB9CiAgICAgIHRoaXMuYWRkVmlydHVhbE1vZGVsID0gZmFsc2U7CiAgICAgIHRoaXMuY2xvc2VWaXJ0dWFsKCk7CiAgICB9LAogICAgLy8gIOWIneWni+WMluWNoeWvhuaVsOaNruS/oeaBrwogICAgY2xvc2VWaXJ0dWFsOiBmdW5jdGlvbiBjbG9zZVZpcnR1YWwoKSB7CiAgICAgIHRoaXMuYWRkVmlydHVhbE1vZGVsID0gZmFsc2U7CiAgICAgIHRoaXMudmlydHVhbExpc3QgPSBbewogICAgICAgIGtleTogJycsCiAgICAgICAgdmFsdWU6ICcnCiAgICAgIH1dOwogICAgICB0aGlzLmRpc2tfaW5mbyA9ICcnOwogICAgICB0aGlzLnN0b2NrID0gMDsKICAgIH0sCiAgICAvL+WvueixoeaVsOe7hOWOu+mHje+8mwogICAgdW5pcXVlQXJyYXk6IGZ1bmN0aW9uIHVuaXF1ZUFycmF5KGFycikgewogICAgICB2YXIgc2VlbiA9IHt9OwogICAgICByZXR1cm4gYXJyLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkgewogICAgICAgIHZhciBrZXkgPSBKU09OLnN0cmluZ2lmeShpdGVtKTsgLy8g5L2/55SoIEpTT04uc3RyaW5naWZ5IOeUn+aIkOWUr+S4gOmUrgogICAgICAgIGlmIChzZWVuW2tleV0pIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2VlbltrZXldID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgLy8g6I635Y+W5LyY5oOg5Yi4aWTmlbDmja4KICAgIG5hbWVJZDogZnVuY3Rpb24gbmFtZUlkKGlkLCBuYW1lcykgewogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jb3Vwb25faWRzID0gaWQ7CiAgICAgIHRoaXMuY291cG9uTmFtZSA9IHRoaXMudW5pcXVlQXJyYXkobmFtZXMpOwogICAgfSwKICAgIC8vIOiOt+WPluS8mOaDoOWIuOS/oeaBrwogICAgZ29vZHNDb3Vwb25JZDogZnVuY3Rpb24gZ29vZHNDb3Vwb25JZChkYXRhKSB7CiAgICAgIHRoaXMuJHNldCh0aGlzW3RoaXMudGFiTmFtZV1bdGhpcy50YWJJbmRleF0sICdjb3Vwb25faWQnLCBkYXRhLmlkKTsKICAgICAgdGhpcy4kc2V0KHRoaXNbdGhpcy50YWJOYW1lXVt0aGlzLnRhYkluZGV4XSwgJ2NvdXBvbl9uYW1lJywgZGF0YS50aXRsZSk7CiAgICAgIHRoaXMuJHJlZnMuZ29vZHNDb3Vwb24uaXNUZW1wbGF0ZSA9IGZhbHNlOwogICAgfSwKICAgIGhhbmRsZUNsb3NlOiBmdW5jdGlvbiBoYW5kbGVDbG9zZShuYW1lKSB7CiAgICAgIHZhciBpbmRleCA9IHRoaXMuY291cG9uTmFtZS5pbmRleE9mKG5hbWUpOwogICAgICB0aGlzLmNvdXBvbk5hbWUuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgdmFyIGNvdXBvbklkcyA9IHRoaXMuZm9ybVZhbGlkYXRlLmNvdXBvbl9pZHM7CiAgICAgIGNvdXBvbklkcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICB0aGlzLnVwZGF0ZUlkcyA9IGNvdXBvbklkczsKICAgICAgdGhpcy51cGRhdGVOYW1lID0gdGhpcy5jb3Vwb25OYW1lOwogICAgfSwKICAgIC8vIOa3u+WKoOi/kOi0ueaooeadvwogICAgYWRkVGVtcDogZnVuY3Rpb24gYWRkVGVtcCgpIHsKICAgICAgdGhpcy4kcmVmcy50ZW1wbGF0ZXMuaXNUZW1wbGF0ZSA9IHRydWU7CiAgICB9LAogICAgYWRkVmlkZW86IGZ1bmN0aW9uIGFkZFZpZGVvKCkgewogICAgICB2YXIgX3RoaXMxMSA9IHRoaXM7CiAgICAgIHRoaXMuJHZpZGVvTW9kYWwoZnVuY3Rpb24gKGUpIHsKICAgICAgICBfdGhpczExLmZvcm1WYWxpZGF0ZS52aWRlb19saW5rID0gZTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g5Yig6Zmk6KeG6aKR77ybCiAgICBkZWxWaWRlbzogZnVuY3Rpb24gZGVsVmlkZW8oKSB7CiAgICAgIHRoaXMuJHNldCh0aGlzLmZvcm1WYWxpZGF0ZSwgJ3ZpZGVvX2xpbmsnLCAnJyk7CiAgICAgIHRoaXMuJHNldCh0aGlzLCAncHJvZ3Jlc3MnLCAwKTsKICAgICAgdGhpcy52aWRlb0luZyA9IGZhbHNlOwogICAgICB0aGlzLnVwbG9hZC52aWRlb0luZyA9IGZhbHNlOwogICAgfSwKICAgIHpoX3VwbG9hZEZpbGU6IGZ1bmN0aW9uIHpoX3VwbG9hZEZpbGUoKSB7CiAgICAgIGlmICh0aGlzLnNlbGV0VmlkZW8gPT0gMSkgewogICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnZpZGVvX2xpbmsgPSB0aGlzLnZpZGVvTGluazsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLiRyZWZzLnJlZmlkLmNsaWNrKCk7CiAgICAgIH0KICAgIH0sCiAgICAvLyDkuIrkvKDop4bpopEKICAgIHpoX3VwbG9hZEZpbGVfY2hhbmdlOiBmdW5jdGlvbiB6aF91cGxvYWRGaWxlX2NoYW5nZShldmZpbGUpIHsKICAgICAgdmFyIF90aGlzMTIgPSB0aGlzOwogICAgICB2YXIgc3VmZml4ID0gZXZmaWxlLnRhcmdldC5maWxlc1swXS5uYW1lLnN1YnN0cihldmZpbGUudGFyZ2V0LmZpbGVzWzBdLm5hbWUuaW5kZXhPZignLicpKTsKICAgICAgaWYgKHN1ZmZpeC5pbmRleE9mKCcubXA0JykgPT09IC0xKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+WPquiDveS4iuS8oE1QNOaWh+S7ticpOwogICAgICB9CiAgICAgIHZhciB0eXBlcyA9IHsKICAgICAgICBrZXk6IGV2ZmlsZS50YXJnZXQuZmlsZXNbMF0ubmFtZSwKICAgICAgICBjb250ZW50VHlwZTogZXZmaWxlLnRhcmdldC5maWxlc1swXS50eXBlCiAgICAgIH07CiAgICAgIHByb2R1Y3RHZXRUZW1wS2V5c0FwaSh0eXBlcykudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgX3RoaXMxMi4kdmlkZW9DbG91ZC52aWRlb1VwbG9hZCh7CiAgICAgICAgICB0eXBlOiByZXMuZGF0YS50eXBlLAogICAgICAgICAgZXZmaWxlOiBldmZpbGUsCiAgICAgICAgICByZXM6IHJlcywKICAgICAgICAgIHVwbG9hZGluZzogZnVuY3Rpb24gdXBsb2FkaW5nKHN0YXR1cywgcHJvZ3Jlc3MpIHsKICAgICAgICAgICAgdGhpcy51cGxvYWQudmlkZW9JbmcgPSBzdGF0dXM7CiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAxMDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgIF90aGlzMTIuZm9ybVZhbGlkYXRlLnZpZGVvX2xpbmsgPSByZXMudXJsOwogICAgICAgICAgX3RoaXMxMi4kbWVzc2FnZS5zdWNjZXNzKCfop4bpopHkuIrkvKDmiJDlip8nKTsKICAgICAgICAgIF90aGlzMTIudXBsb2FkLnZpZGVvSW5nID0gZmFsc2U7CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgX3RoaXMxMi4kbWVzc2FnZS5lcnJvcihyZXMpOwogICAgICAgIH0pOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgX3RoaXMxMi4kbWVzc2FnZS5lcnJvcihyZXMubXNnKTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g5LiK5LiA6aG177ybCiAgICB1cFRhYjogZnVuY3Rpb24gdXBUYWIoKSB7CiAgICAgIHRoaXMuY3VycmVudFRhYiA9IChOdW1iZXIodGhpcy5jdXJyZW50VGFiKSAtIDEpLnRvU3RyaW5nKCk7CiAgICB9LAogICAgLy8g5LiL5LiA6aG177ybCiAgICBkb3duVGFiOiBmdW5jdGlvbiBkb3duVGFiKCkgewogICAgICB0aGlzLmN1cnJlbnRUYWIgPSAoTnVtYmVyKHRoaXMuY3VycmVudFRhYikgKyAxKS50b1N0cmluZygpOwogICAgfSwKICAgIC8vIOWxnuaAp+W8ueeql+Wbnuiwg+WHveaVsO+8mwogICAgdXNlclNlYXJjaHM6IGZ1bmN0aW9uIHVzZXJTZWFyY2hzKCkgewogICAgICB0aGlzLnByb2R1Y3RHZXRSdWxlKCk7CiAgICB9LAogICAgLy8g5re75Yqg6KeE5YiZ77ybCiAgICBhZGRSdWxlOiBmdW5jdGlvbiBhZGRSdWxlKCkgewogICAgICB0aGlzLiRyZWZzLmFkZGF0dHIubW9kYWwgPSB0cnVlOwogICAgfSwKICAgIC8vIOaJuemHj+iuvue9ruWIhuS9o++8mwogICAgYnJva2VyYWdlU2V0VXA6IGZ1bmN0aW9uIGJyb2tlcmFnZVNldFVwKCkgewogICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuaXNfc3ViLmluZGV4T2YoMSkgPiAtMSkgewogICAgICAgIGlmICh0aGlzLm1hbnlCcm9rZXJhZ2UgPD0gMCB8fCB0aGlzLm1hbnlCcm9rZXJhZ2VUd28gPD0gMCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+Whq+WGmei/lOS9o+mHkemineWQjui/m+ihjOaJuemHj+a3u+WKoCcpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1WYWxpZGF0ZS5pc19zdWIuaW5kZXhPZigwKSA+IC0xKSB7CiAgICAgICAgaWYgKHRoaXMubWFueVZpcFByaWNlIDw9IDApIHsKICAgICAgICAgIHJldHVybiB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7floavlhpnkvJrlkZjku7flkI7ov5vooYzmibnph4/mt7vliqAnKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLmlzX3N1Yi5sZW5ndGggPT09IDIpIHsKICAgICAgICBpZiAodGhpcy5tYW55QnJva2VyYWdlIDw9IDAgfHwgdGhpcy5tYW55QnJva2VyYWdlVHdvIDw9IDApIHsKICAgICAgICAgIHJldHVybiB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7floavlhpnlrozph5Hpop3lkI7ov5vooYzmibnph4/mt7vliqAnKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMubWFueVZpcFByaWNlID4gMCAmJiB0aGlzLm1hbnlWaXBEaXNjb3VudCA+IDApIHsKICAgICAgICAgIHJldHVybiB0aGlzLiRtZXNzYWdlLmVycm9yKCfkvJrlkZjku7flkozkvJrlkZjmipjmiaPlj6rog73kuozpgInkuIDmt7vliqAnKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMubWFueUZvcm1WYWxpZGF0ZSksCiAgICAgICAgX3N0ZXA7CiAgICAgIHRyeSB7CiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKICAgICAgICAgIHZhciB2YWwgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgIHRoaXMubWFueUJyb2tlcmFnZSAhPSB1bmRlZmluZWQgJiYgdGhpcy4kc2V0KHZhbCwgJ2Jyb2tlcmFnZScsIHRoaXMubWFueUJyb2tlcmFnZSk7CiAgICAgICAgICB0aGlzLm1hbnlCcm9rZXJhZ2VUd28gIT0gdW5kZWZpbmVkICYmIHRoaXMuJHNldCh2YWwsICdicm9rZXJhZ2VfdHdvJywgdGhpcy5tYW55QnJva2VyYWdlVHdvKTsKICAgICAgICAgIGlmICh0aGlzLm1hbnlWaXBQcmljZSAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3ZpcF9wcmljZScsIHRoaXMubWFueVZpcFByaWNlKTsKICAgICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3ZpcF9wcm9wb3J0aW9uJywgKHZhbC52aXBfcHJpY2UgLyB2YWwucHJpY2UgKiAxMDApLnRvRml4ZWQoMikpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3ZpcF9wcm9wb3J0aW9uJywgdGhpcy5tYW55VmlwRGlzY291bnQpOwogICAgICAgICAgICB0aGlzLiRzZXQodmFsLCAndmlwX3ByaWNlJywgKHZhbC5wcmljZSAqICh0aGlzLm1hbnlWaXBEaXNjb3VudCAvIDEwMCkpLnRvRml4ZWQoMikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBfaXRlcmF0b3IuZigpOwogICAgICB9CiAgICB9LAogICAgLy8g5om56YeP6K6+572u5Lya5ZGY5Lu3CiAgICB2aXBQcmljZVNldFVwOiBmdW5jdGlvbiB2aXBQcmljZVNldFVwKCkgewogICAgICBpZiAodGhpcy5tYW55VmlwUHJpY2UgPD0gMCkgewogICAgICAgIHJldHVybiB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7floavlhpnkvJrlkZjku7flnKjov5vooYzmibnph4/mt7vliqAnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMubWFueUZvcm1WYWxpZGF0ZSksCiAgICAgICAgICBfc3RlcDI7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7CiAgICAgICAgICAgIHZhciB2YWwgPSBfc3RlcDIudmFsdWU7CiAgICAgICAgICAgIHRoaXMuJHNldCh2YWwsICd2aXBfcHJpY2UnLCB0aGlzLm1hbnlWaXBQcmljZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgX2l0ZXJhdG9yMi5mKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgLy8g5paw5aKe5Y2h5a+GCiAgICBoYW5kbGVBZGQ6IGZ1bmN0aW9uIGhhbmRsZUFkZCgpIHsKICAgICAgdGhpcy52aXJ0dWFsTGlzdC5wdXNoKHsKICAgICAgICBrZXk6ICcnLAogICAgICAgIHZhbHVlOiAnJwogICAgICB9KTsKICAgIH0sCiAgICAvLyDliJ3lp4vljJbljaHlr4bkv6Hmga8KICAgIGluaXRWaXJ0dWFsRGF0YTogZnVuY3Rpb24gaW5pdFZpcnR1YWxEYXRhKHN0YXR1cykgewogICAgICB0aGlzLnZpcnR1YWxMaXN0ID0gW3sKICAgICAgICBrZXk6ICcnLAogICAgICAgIHZhbHVlOiAnJwogICAgICB9XTsKICAgIH0sCiAgICByZW1vdmVWaXJ0dWFsOiBmdW5jdGlvbiByZW1vdmVWaXJ0dWFsKGluZGV4KSB7CiAgICAgIHRoaXMudmlydHVhbExpc3Quc3BsaWNlKGluZGV4LCAxKTsKICAgIH0sCiAgICAvLyDmuIXnqbrmibnph4/op4TmoLzkv6Hmga8KICAgIGJhdGNoRGVsOiBmdW5jdGlvbiBiYXRjaERlbCgpIHsKICAgICAgdGhpcy5vbmVGb3JtQmF0Y2ggPSBbewogICAgICAgIHBpYzogJycsCiAgICAgICAgcHJpY2U6IHZvaWQgMCwKICAgICAgICBjb3N0OiB2b2lkIDAsCiAgICAgICAgb3RfcHJpY2U6IHZvaWQgMCwKICAgICAgICBzdG9jazogdm9pZCAwLAogICAgICAgIGJhcl9jb2RlOiAnJywKICAgICAgICBiYXJfY29kZV9udW1iZXI6ICcnLAogICAgICAgIHdlaWdodDogdm9pZCAwLAogICAgICAgIHZvbHVtZTogdm9pZCAwLAogICAgICAgIHZpcnR1YWxfbGlzdDogW10KICAgICAgfV07CiAgICB9LAogICAgY29uZmlybTogZnVuY3Rpb24gY29uZmlybShuYW1lKSB7CiAgICAgIHZhciBfdGhpczEzID0gdGhpczsKICAgICAgdGhpcy5jcmVhdGVCbnQgPSB0cnVlOwogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5zZWxlY3RSdWxlID0gbmFtZTsKICAgICAgdGhpcy5hdHRycyA9IFtdOwogICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuc2VsZWN0UnVsZS50cmltKCkubGVuZ3RoIDw9IDApIHsKICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS5lcnJvcign6K+36YCJ5oup5bGe5oCnJyk7CiAgICAgIH0KICAgICAgdGhpcy5ydWxlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkgewogICAgICAgIGlmIChpdGVtLnJ1bGVfbmFtZSA9PT0gX3RoaXMxMy5mb3JtVmFsaWRhdGUuc2VsZWN0UnVsZSkgewogICAgICAgICAgX3RoaXMxMy5hdHRycyA9IF90b0NvbnN1bWFibGVBcnJheShpdGVtLnJ1bGVfdmFsdWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuY2FuU2VsID0gdHJ1ZTsKICAgICAgdGhpcy5nZW5lcmF0ZUF0dHIodGhpcy5hdHRycyk7CiAgICB9LAogICAgLy8g6YCJ5oup6KeE5qC85qih5p2/CiAgICBoYW5kbGVDb21tYW5kOiBmdW5jdGlvbiBoYW5kbGVDb21tYW5kKGUpIHt9LAogICAgLy8g6I635Y+W5ZWG5ZOB5bGe5oCn5qih5p2/77ybCiAgICBwcm9kdWN0R2V0UnVsZTogZnVuY3Rpb24gcHJvZHVjdEdldFJ1bGUoKSB7CiAgICAgIHZhciBfdGhpczE0ID0gdGhpczsKICAgICAgcHJvZHVjdEdldFJ1bGVBcGkoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBfdGhpczE0LnJ1bGVMaXN0ID0gcmVzLmRhdGE7CiAgICAgIH0pOwogICAgfSwKICAgIC8vIOiOt+WPlui/kOi0ueaooeadv++8mwogICAgcHJvZHVjdEdldFRlbXBsYXRlOiBmdW5jdGlvbiBwcm9kdWN0R2V0VGVtcGxhdGUoKSB7CiAgICAgIHZhciBfdGhpczE1ID0gdGhpczsKICAgICAgcHJvZHVjdEdldFRlbXBsYXRlQXBpKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgX3RoaXMxNS50ZW1wbGF0ZUxpc3QgPSByZXMuZGF0YTsKICAgICAgfSk7CiAgICB9LAogICAgcGFyYW1zR2V0VGVtcGxhdGU6IGZ1bmN0aW9uIHBhcmFtc0dldFRlbXBsYXRlKCkgewogICAgICB2YXIgX3RoaXMxNiA9IHRoaXM7CiAgICAgIHBhcmFtTGlzdEFwaSgpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgIF90aGlzMTYucGFyYW1zVHlwZUxpc3QgPSByZXMuZGF0YS5saXN0OwogICAgICB9KTsKICAgIH0sCiAgICBjaGFuZ2VQYXJhbXNUeXBlOiBmdW5jdGlvbiBjaGFuZ2VQYXJhbXNUeXBlKGUpIHsKICAgICAgZSA/IHRoaXMuZ2V0UGFyYW1zKGUpIDogdGhpcy5mb3JtVmFsaWRhdGUucGFyYW1zX2xpc3QgPSBbXTsKICAgIH0sCiAgICBnZXRQYXJhbXM6IGZ1bmN0aW9uIGdldFBhcmFtcyhpZCkgewogICAgICB2YXIgX3RoaXMxNyA9IHRoaXM7CiAgICAgIHBhcmFtSW5mb0FwaShpZCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgX3RoaXMxNy5mb3JtVmFsaWRhdGUucGFyYW1zX2xpc3QgPSByZXMuZGF0YS52YWx1ZTsKICAgICAgfSk7CiAgICB9LAogICAgaXNTdWJzZXQ6IGZ1bmN0aW9uIGlzU3Vic2V0KGFycjEsIGFycjIpIHsKICAgICAgLy8g5bCG5pWw57uE6L2s5o2i5Li6IFNldO+8jOS7peS+v+i/m+ihjOmrmOaViOeahOWMheWQq+ajgOafpQogICAgICB2YXIgc2V0MSA9IG5ldyBTZXQoYXJyMSk7CiAgICAgIHZhciBzZXQyID0gbmV3IFNldChhcnIyKTsKCiAgICAgIC8vIOajgOafpSBzZXQyIOS4reeahOavj+S4quWFg+e0oOaYr+WQpumDveWcqCBzZXQxIOS4rQogICAgICB2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNldDIpLAogICAgICAgIF9zdGVwMzsKICAgICAgdHJ5IHsKICAgICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykgewogICAgICAgICAgdmFyIGVsZW0gPSBfc3RlcDMudmFsdWU7CiAgICAgICAgICBpZiAoIXNldDEuaGFzKGVsZW0pKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIF9pdGVyYXRvcjMuZShlcnIpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIF9pdGVyYXRvcjMuZigpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfSwKICAgIC8vIOaJuemHj+a3u+WKoAogICAgYmF0Y2hBZGQ6IGZ1bmN0aW9uIGJhdGNoQWRkKCkgewogICAgICB2YXIgX3RoaXMxOCA9IHRoaXM7CiAgICAgIHZhciBhcnIgPSBbXTsKICAgICAgdmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmF0dHJzKSwKICAgICAgICBfc3RlcDQ7CiAgICAgIHRyeSB7CiAgICAgICAgZm9yIChfaXRlcmF0b3I0LnMoKTsgIShfc3RlcDQgPSBfaXRlcmF0b3I0Lm4oKSkuZG9uZTspIHsKICAgICAgICAgIHZhciB2YWwgPSBfc3RlcDQudmFsdWU7CiAgICAgICAgICBpZiAodGhpcy5vbmVGb3JtQmF0Y2hbMF1bdmFsLnZhbHVlXSkgewogICAgICAgICAgICBhcnIucHVzaCh0aGlzLm9uZUZvcm1CYXRjaFswXVt2YWwudmFsdWVdKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOaJuemHj+iuvue9ruWVhuWTgeinhOagvOWxnuaApwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBfaXRlcmF0b3I0LmUoZXJyKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBfaXRlcmF0b3I0LmYoKTsKICAgICAgfQogICAgICB2YXIgYmF0Y2hGaWVsZHMgPSBbJ3BpYycsICdwcmljZScsICdjb3N0JywgJ290X3ByaWNlJywgJ3N0b2NrJywgJ3dlaWdodCcsICd2b2x1bWUnLCAnYmFyX2NvZGUnLCAnYmFyX2NvZGVfbnVtYmVyJ107CiAgICAgIC8vIGNvbnN0IGRlZmF1bHRGaWVsZHMgPSBbJ2Jhcl9jb2RlJywgJ2Jhcl9jb2RlX251bWJlciddOwogICAgICB2YXIgX2l0ZXJhdG9yNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMubWFueUZvcm1WYWxpZGF0ZSksCiAgICAgICAgX3N0ZXA1OwogICAgICB0cnkgewogICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkgewogICAgICAgICAgdmFyIHZhbCA9IF9zdGVwNS52YWx1ZTsKICAgICAgICAgIHZhciBiYXRjaCA9IF90aGlzMTgub25lRm9ybUJhdGNoWzBdOwogICAgICAgICAgLy8g5aaC5p6c5a2Y5Zyo562b6YCJ5p2h5Lu25LiU5ruh6Laz5p2h5Lu2LOaIluaXoOetm+mAieadoeS7tuaXtgogICAgICAgICAgaWYgKCFhcnIubGVuZ3RoIHx8IF90aGlzMTguaXNTdWJzZXQodmFsLmF0dHJfYXJyLCBhcnIpKSB7CiAgICAgICAgICAgIC8vIOiuvue9ruacieWAvOeahOaJuemHj+Wtl+autQogICAgICAgICAgICBiYXRjaEZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkgewogICAgICAgICAgICAgIGlmIChiYXRjaFtmaWVsZF0gJiYgYmF0Y2hbZmllbGRdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCA9PT0gJ3BpYycgJiYgYmF0Y2hbZmllbGRdKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzMTguJHNldCh2YWwsIGZpZWxkLCBiYXRjaFtmaWVsZF0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZCAhPSAncGljJykgewogICAgICAgICAgICAgICAgICBfdGhpczE4LiRzZXQodmFsLCBmaWVsZCwgYmF0Y2hbZmllbGRdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g6K6+572u6buY6K6k5a2X5q61CiAgICAgICAgICAgIC8vIGRlZmF1bHRGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHsKICAgICAgICAgICAgLy8gICB0aGlzLiRzZXQodmFsLCBmaWVsZCwgYmF0Y2hbZmllbGRdKTsKICAgICAgICAgICAgLy8gfSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBmb3IgKF9pdGVyYXRvcjUucygpOyAhKF9zdGVwNSA9IF9pdGVyYXRvcjUubigpKS5kb25lOykgewogICAgICAgICAgX2xvb3AoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIF9pdGVyYXRvcjUuZShlcnIpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIF9pdGVyYXRvcjUuZigpOwogICAgICB9CiAgICB9LAogICAgY2hhbmdlU3BlY0ltZzogZnVuY3Rpb24gY2hhbmdlU3BlY0ltZyhhcnIsIGltZykgewogICAgICB2YXIgX3RoaXMxOSA9IHRoaXM7CiAgICAgIC8vIOWIpOaWreaYr+WQpuWtmOWcqOinhOagvOWbvgogICAgICB2YXIgaXNIYXMgPSBmYWxzZTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLm1hbnlGb3JtVmFsaWRhdGUubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgaXRlbSA9IHRoaXMubWFueUZvcm1WYWxpZGF0ZVtpXTsKICAgICAgICBpZiAoaXRlbS5waWMgJiYgdGhpcy5pc1N1YnNldChpdGVtLmF0dHJfYXJyLCBhcnIpKSB7CiAgICAgICAgICBpc0hhcyA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzSGFzKSB7CiAgICAgICAgdGhpcy4kY29uZmlybSgn5Y+v5Lul5ZCM5q2l5L+u5pS55LiL5pa56K+l6KeE5qC85Zu+54mH77yM56Gu5a6a6KaB5pu/5o2i5ZCX77yfJywgJ+aPkOekuicsIHsKICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn5pu/5o2iJywKICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICfmmoLkuI0nLAogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgX2l0ZXJhdG9yNiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKF90aGlzMTkubWFueUZvcm1WYWxpZGF0ZSksCiAgICAgICAgICAgIF9zdGVwNjsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNi5zKCk7ICEoX3N0ZXA2ID0gX2l0ZXJhdG9yNi5uKCkpLmRvbmU7KSB7CiAgICAgICAgICAgICAgdmFyIHZhbCA9IF9zdGVwNi52YWx1ZTsKICAgICAgICAgICAgICBpZiAoX3RoaXMxOS5pc1N1YnNldCh2YWwuYXR0cl9hcnIsIGFycikpIHsKICAgICAgICAgICAgICAgIF90aGlzMTkuJHNldCh2YWwsICdwaWMnLCBpbWcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIF9pdGVyYXRvcjYuZShlcnIpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgX2l0ZXJhdG9yNi5mKCk7CiAgICAgICAgICB9CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBfaXRlcmF0b3I3ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5tYW55Rm9ybVZhbGlkYXRlKSwKICAgICAgICAgIF9zdGVwNzsKICAgICAgICB0cnkgewogICAgICAgICAgZm9yIChfaXRlcmF0b3I3LnMoKTsgIShfc3RlcDcgPSBfaXRlcmF0b3I3Lm4oKSkuZG9uZTspIHsKICAgICAgICAgICAgdmFyIHZhbCA9IF9zdGVwNy52YWx1ZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNTdWJzZXQodmFsLmF0dHJfYXJyLCBhcnIpKSB7CiAgICAgICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3BpYycsIGltZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIF9pdGVyYXRvcjcuZShlcnIpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBfaXRlcmF0b3I3LmYoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAvLyDnq4vljbPnlJ/miJAKICAgIGdlbmVyYXRlOiBmdW5jdGlvbiBnZW5lcmF0ZSh0eXBlLCBpc0NvcHksIGFycikgewogICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUgPSBbXTsKICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaGVhZGVyID0gW107CiAgICB9LAogICAgY2xlYXJBdHRyOiBmdW5jdGlvbiBjbGVhckF0dHIoKSB7CiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuYXR0cnNOYW1lID0gJyc7CiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuYXR0cnNWYWwgPSAnJzsKICAgIH0sCiAgICAvLyDliKDpmaTop4TmoLwKICAgIGhhbmRsZVJlbW92ZVJvbGU6IGZ1bmN0aW9uIGhhbmRsZVJlbW92ZVJvbGUoaW5kZXgpIHsKICAgICAgdGhpcy5hdHRycy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgaWYgKCF0aGlzLmF0dHJzLmxlbmd0aCkgewogICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmhlYWRlciA9IFtdOwogICAgICAgIHRoaXMubWFueUZvcm1WYWxpZGF0ZSA9IFtdOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuZ2VuZXJhdGVBdHRyKHRoaXMuYXR0cnMpOwogICAgICB9CiAgICB9LAogICAgLy8g5Yig6Zmk6KGo5qC85LitIOWvueW6lOWxnuaApwogICAgZGVsQXR0clRhYmxlOiBmdW5jdGlvbiBkZWxBdHRyVGFibGUodmFsKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5tYW55Rm9ybVZhbGlkYXRlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm1hbnlGb3JtVmFsaWRhdGVbaV07CiAgICAgICAgaWYgKGl0ZW0uYXR0cl9hcnIgJiYgaXRlbS5hdHRyX2Fyci5pbmNsdWRlcyh2YWwpKSB7CiAgICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUuc3BsaWNlKGksIDEpOwogICAgICAgICAgaS0tOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIC8vIOWIoOmZpOWxnuaApwogICAgaGFuZGxlUmVtb3ZlMjogZnVuY3Rpb24gaGFuZGxlUmVtb3ZlMihpdGVtLCBpbmRleCwgdmFsKSB7CiAgICAgIC8vIOWIoOmZpCBtYW55Rm9ybVZhbGlkYXRl5LitIHRpdGxlID0gaXRlbS52YWx1ZSDnmoTlsZ7mgKflgLwKICAgICAgaXRlbS5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAvLyB0aGlzLmdlbmVyYXRlQXR0cih0aGlzLmF0dHJzKTsKICAgICAgdGhpcy5kZWxBdHRyVGFibGUodmFsKTsKICAgIH0sCiAgICAvLyDmlrDlop7op4TmoLwKICAgIGhhbmRsZUFkZFJvbGU6IGZ1bmN0aW9uIGhhbmRsZUFkZFJvbGUoKSB7CiAgICAgIHZhciBkYXRhID0gewogICAgICAgIHZhbHVlOiB0aGlzLmZvcm1EeW5hbWljLmF0dHJzTmFtZSwKICAgICAgICBhZGRfcGljOiAwLAogICAgICAgIGRldGFpbDogW10KICAgICAgfTsKICAgICAgdGhpcy5hdHRycy5wdXNoKGRhdGEpOwogICAgfSwKICAgIGhhbmRsZUFkZFBhcmFtczogZnVuY3Rpb24gaGFuZGxlQWRkUGFyYW1zKCkgewogICAgICB2YXIgZGF0YSA9IHsKICAgICAgICBuYW1lOiAnJywKICAgICAgICB2YWx1ZTogJycKICAgICAgfTsKICAgICAgdGhpcy5mb3JtVmFsaWRhdGUucGFyYW1zX2xpc3QucHVzaChkYXRhKTsKICAgIH0sCiAgICBoYW5kbGVTYXZlQXNUZW1wbGF0ZTogZnVuY3Rpb24gaGFuZGxlU2F2ZUFzVGVtcGxhdGUoKSB7CiAgICAgIHZhciBfdGhpczIwID0gdGhpczsKICAgICAgdGhpcy4kcHJvbXB0KCcnLCAn6K+36L6T5YWl5qih5p2/5ZCN56ewJywgewogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJwogICAgICB9KS50aGVuKGZ1bmN0aW9uIChfcmVmKSB7CiAgICAgICAgdmFyIHZhbHVlID0gX3JlZi52YWx1ZTsKICAgICAgICB2YXIgc3BlYyA9IF90aGlzMjAuYXR0cnMubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSwKICAgICAgICAgICAgZGV0YWlsOiBpdGVtLmRldGFpbC5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZTsKICAgICAgICAgICAgfSkKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgICAgdmFyIGZvcm1EeW5hbWljID0gewogICAgICAgICAgcnVsZV9uYW1lOiB2YWx1ZSwKICAgICAgICAgIHNwZWM6IHNwZWMKICAgICAgICB9OwogICAgICAgIHJ1bGVBZGRBcGkoZm9ybUR5bmFtaWMsIDApLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgX3RoaXMyMC4kbWVzc2FnZS5zdWNjZXNzKHJlcy5tc2cpOwogICAgICAgICAgX3RoaXMyMC5wcm9kdWN0R2V0UnVsZSgpOwogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgIF90aGlzMjAuJG1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CiAgICAgICAgfSk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgIH0sCiAgICAvLyDmlrDlop7kuIDmnaHlsZ7mgKcKICAgIGFkZE9uZUF0dHI6IGZ1bmN0aW9uIGFkZE9uZUF0dHIodmFsLCB2YWwyKSB7CiAgICAgIHRoaXMuZ2VuZXJhdGVBdHRyKHRoaXMuYXR0cnMsIHZhbDIpOwogICAgfSwKICAgIGhhbmRsZUZvY3VzOiBmdW5jdGlvbiBoYW5kbGVGb2N1cyh2YWwpIHsKICAgICAgdGhpcy5jaGFuZ2VBdHRyVmFsdWUgPSB2YWw7CiAgICB9LAogICAgaGFuZGxlQmx1cjogZnVuY3Rpb24gaGFuZGxlQmx1cigpIHsKICAgICAgdGhpcy5jaGFuZ2VBdHRyVmFsdWUgPSAnJzsKICAgIH0sCiAgICBoYW5kbGVTZWxJbWc6IGZ1bmN0aW9uIGhhbmRsZVNlbEltZyhpdGVtKSB7CiAgICAgIHZhciBfdGhpczIxID0gdGhpczsKICAgICAgdGhpcy4kaW1nTW9kYWwoZnVuY3Rpb24gKGUpIHsKICAgICAgICBpdGVtLnBpYyA9IGUuYXR0X2RpcjsKICAgICAgICBfdGhpczIxLmNoYW5nZVNwZWNJbWcoW2l0ZW0udmFsdWVdLCBlLmF0dF9kaXIpOwogICAgICB9KTsKICAgIH0sCiAgICBoYW5kbGVSZW1vdmVJbWc6IGZ1bmN0aW9uIGhhbmRsZVJlbW92ZUltZyhpdGVtKSB7CiAgICAgIGl0ZW0ucGljID0gJyc7CiAgICB9LAogICAgLy8g6KeE5qC85ZCN56ew5pS55Y+YCiAgICBhdHRyQ2hhbmdlVmFsdWU6IGZ1bmN0aW9uIGF0dHJDaGFuZ2VWYWx1ZShpLCB2YWwpIHsKICAgICAgdmFyIF90aGlzMjIgPSB0aGlzOwogICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggJiYgdGhpcy5hdHRyc1tpXS5kZXRhaWwubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5nZW5lcmF0ZUhlYWRlcih0aGlzLmF0dHJzKTsKICAgICAgICBpZiAodGhpcy5tYW55Rm9ybVZhbGlkYXRlLmxlbmd0aCkgewogICAgICAgICAgdGhpcy5tYW55Rm9ybVZhbGlkYXRlLm1hcChmdW5jdGlvbiAoaXRlbSwgaSkgewogICAgICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoaXRlbS5kZXRhaWwpLmluY2x1ZGVzKF90aGlzMjIuY2hhbmdlQXR0clZhbHVlKSkgewogICAgICAgICAgICAgICAgaXRlbS5kZXRhaWxbdmFsXSA9IGl0ZW0uZGV0YWlsW190aGlzMjIuY2hhbmdlQXR0clZhbHVlXTsKICAgICAgICAgICAgICAgIGl0ZW1bdmFsXSA9IGl0ZW1bX3RoaXMyMi5jaGFuZ2VBdHRyVmFsdWVdOwogICAgICAgICAgICAgICAgZGVsZXRlIGl0ZW0uZGV0YWlsW190aGlzMjIuY2hhbmdlQXR0clZhbHVlXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSBpdGVtW190aGlzMjIuY2hhbmdlQXR0clZhbHVlXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgdGhpcy5jaGFuZ2VBdHRyVmFsdWUgPSB2YWw7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuZ2VuZXJhdGVBdHRyKHRoaXMuYXR0cnMpOwogICAgICB9CiAgICB9LAogICAgLy8g6KeE5qC85YC85pS55Y+YCiAgICBhdHRyRGV0YWlsQ2hhbmdlVmFsdWU6IGZ1bmN0aW9uIGF0dHJEZXRhaWxDaGFuZ2VWYWx1ZSh2YWwsIGkpIHsKICAgICAgdmFyIF90aGlzMjMgPSB0aGlzOwogICAgICBpZiAodGhpcy5tYW55Rm9ybVZhbGlkYXRlLmxlbmd0aCkgewogICAgICAgIHZhciBrZXkgPSB0aGlzLmF0dHJzW2ldLnZhbHVlOwogICAgICAgIHRoaXMubWFueUZvcm1WYWxpZGF0ZS5tYXAoZnVuY3Rpb24gKGl0ZW0sIGkpIHsKICAgICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoaXRlbS5kZXRhaWwpLmluY2x1ZGVzKGtleSkgJiYgaXRlbS5kZXRhaWxba2V5XSA9PT0gX3RoaXMyMy5jaGFuZ2VBdHRyVmFsdWUpIHsKICAgICAgICAgICAgICBpdGVtLmRldGFpbFtrZXldID0gdmFsOwogICAgICAgICAgICAgIHZhciBpbmRleCA9IGl0ZW0uYXR0cl9hcnIuZmluZEluZGV4KGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSA9PT0gX3RoaXMyMy5jaGFuZ2VBdHRyVmFsdWU7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgaXRlbS5hdHRyX2FycltpbmRleF0gPSB2YWw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLmNoYW5nZUF0dHJWYWx1ZSA9IHZhbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmdlbmVyYXRlQXR0cih0aGlzLmF0dHJzLCAxKTsKICAgICAgfQogICAgfSwKICAgIC8vIOinhOagvOWbvueJh+a3u+WKoOW8gOWFswogICAgYWRkUGljOiBmdW5jdGlvbiBhZGRQaWMoZSwgaSkgewogICAgICB2YXIgX3RoaXMyNCA9IHRoaXM7CiAgICAgIGlmIChlKSB7CiAgICAgICAgdGhpcy5hdHRycy5tYXAoZnVuY3Rpb24gKGl0ZW0sIGlpKSB7CiAgICAgICAgICBpZiAoaWkgIT09IGkpIHsKICAgICAgICAgICAgX3RoaXMyNC4kc2V0KGl0ZW0sICdhZGRfcGljJywgMCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5jYW5TZWwgPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNhblNlbCA9IHRydWU7CiAgICAgIH0KICAgIH0sCiAgICAvLyDop4TmoLzmi5bmi73mjpLluo/lkI4KICAgIG9uTW92ZVNwZWM6IGZ1bmN0aW9uIG9uTW92ZVNwZWMoKSB7CiAgICAgIHRoaXMuZ2VuZXJhdGVBdHRyKHRoaXMuYXR0cnMpOwogICAgfSwKICAgIGNoYW5nZUN1cnJlbnRJbmRleDogZnVuY3Rpb24gY2hhbmdlQ3VycmVudEluZGV4KGkpIHsKICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBpOwogICAgfSwKICAgIC8vIOeUn+aIkOWVhuWTgeinhOagvOihqOWktAogICAgZ2VuZXJhdGVIZWFkZXI6IGZ1bmN0aW9uIGdlbmVyYXRlSGVhZGVyKGRhdGEpIHsKICAgICAgdmFyIF90aGlzMjUgPSB0aGlzOwogICAgICB2YXIgc3BlY2lmaWNhdGlvbnNDb2x1bW5zID0gZGF0YS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdGl0bGU6IGl0ZW0udmFsdWUsCiAgICAgICAgICBrZXk6IGl0ZW0udmFsdWUsCiAgICAgICAgICBtaW5XaWR0aDogMTQwLAogICAgICAgICAgZml4ZWQ6ICdsZWZ0JwogICAgICAgIH07CiAgICAgIH0pOwogICAgICB2YXIgYXJyOwogICAgICBpZiAoWzEsIDJdLmluY2x1ZGVzKE51bWJlcih0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUpKSkgewogICAgICAgIGFyciA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoc3BlY2lmaWNhdGlvbnNDb2x1bW5zKSwgX3RvQ29uc3VtYWJsZUFycmF5KFZpcnR1YWxUYWJsZUhlYWQpKTsKICAgICAgICAvLyDmib7liLBzbG90IOetieS6jiBmaWN0aXRpb3VzIOWwhnRpdGxl5pS55Li66KeE5qC85ZCN56ewCiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaGVhZGVyLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgaWYgKGl0ZW0uc2xvdCA9PT0gJ2ZpY3RpdGlvdXMnKSB7CiAgICAgICAgICAgIGl0ZW0udGl0bGUgPSBfdGhpczI1LmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPT0gMSA/ICfmt7vliqDljaHlr4Yv572R55uYJyA6ICfpgInmi6nkvJjmg6DliLgnOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLnZpcnR1YWxfdHlwZSA9PSAzKSB7CiAgICAgICAgYXJyID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShzcGVjaWZpY2F0aW9uc0NvbHVtbnMpLCBfdG9Db25zdW1hYmxlQXJyYXkoVmlydHVhbFRhYmxlSGVhZDIpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcnIgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHNwZWNpZmljYXRpb25zQ29sdW1ucyksIF90b0NvbnN1bWFibGVBcnJheShHb29kc1RhYmxlSGVhZCkpOwogICAgICB9CiAgICAgIHRoaXMuJHNldCh0aGlzLmZvcm1WYWxpZGF0ZSwgJ2hlYWRlcicsIGFycik7CiAgICAgIHRoaXMudGFibGVLZXkgKz0gMTsKICAgICAgdGhpcy5jb2x1bW5zSW5zdGFsTSA9IGFycjsKICAgIH0sCiAgICAvKg0KICAgICAqIOeUn+aIkOWxnuaApw0KICAgICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEg6KeE5qC85pWw5o2uDQogICAgICogKi8KICAgIGdlbmVyYXRlQXR0cjogZnVuY3Rpb24gZ2VuZXJhdGVBdHRyKGRhdGEsIHZhbCkgewogICAgICB2YXIgX3RoaXMyNiA9IHRoaXM7CiAgICAgIHRoaXMuZ2VuZXJhdGVIZWFkZXIoZGF0YSk7CiAgICAgIHZhciBjb21iaW5hdGlvbnMgPSB0aGlzLmdlbmVyYXRlQ29tYmluYXRpb25zKGRhdGEpOwogICAgICBjb25zb2xlLmxvZygn6KeE5qC857uE5ZCI5oC75pWw77yaJyArIGNvbWJpbmF0aW9ucy5sZW5ndGgpOwogICAgICB2YXIgdmlydHVhbFR5cGUgPSB0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGU7CiAgICAgIC8vIOWmguaenGNvbWJpbmF0aW9uc+aVsOmHj+i2hei/hyA1MDDvvIzliJnliIbmibnmrKHnlJ/miJDlsZ7mgKcKICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgaWYgKGNvbWJpbmF0aW9ucy5sZW5ndGggPiA1MDApIHsKICAgICAgICB2YXIgYmF0Y2hTaXplID0gTWF0aC5jZWlsKGNvbWJpbmF0aW9ucy5sZW5ndGggLyA1MDApOwogICAgICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoaSkgewogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICB2YXIgZCA9IF90aGlzMjYuZ2VuZXJhdGVBdHRyQmF0Y2goZGF0YSwgY29tYmluYXRpb25zLnNsaWNlKGksIGkgKyBiYXRjaFNpemUpLCB2YWwpOwogICAgICAgICAgICByb3dzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyb3dzKSwgX3RvQ29uc3VtYWJsZUFycmF5KGQpKTsKICAgICAgICAgICAgX3RoaXMyNi5tYW55Rm9ybVZhbGlkYXRlID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShfdGhpczI2Lm9uZUZvcm1CYXRjaCksIF90b0NvbnN1bWFibGVBcnJheShyb3dzKSk7CiAgICAgICAgICB9LCAwKTsKICAgICAgICB9OwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tYmluYXRpb25zLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHsKICAgICAgICAgIF9sb29wMihpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcm93cyA9IHRoaXMuZ2VuZXJhdGVBdHRyQmF0Y2goZGF0YSwgY29tYmluYXRpb25zLCB2YWwpOwogICAgICAgIHRoaXMubWFueUZvcm1WYWxpZGF0ZSA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodGhpcy5vbmVGb3JtQmF0Y2gpLCBfdG9Db25zdW1hYmxlQXJyYXkocm93cykpOwogICAgICB9CiAgICB9LAogICAgLy8g55Sf5oiQ5bGe5oCn5om55qyhCiAgICBnZW5lcmF0ZUF0dHJCYXRjaDogZnVuY3Rpb24gZ2VuZXJhdGVBdHRyQmF0Y2goZGF0YSwgY29tYmluYXRpb25zLCB2YWwpIHsKICAgICAgdmFyIF90aGlzMjcgPSB0aGlzOwogICAgICB2YXIgZXhpc3RpbmdJdGVtcyA9IHRoaXMubWFueUZvcm1WYWxpZGF0ZS5zbGljZSgxKTsgLy8g5o6S6Zmk56ys5LiA6aG56buY6K6k5pWw5o2uCgogICAgICB2YXIgcm93cyA9IGNvbWJpbmF0aW9ucy5tYXAoZnVuY3Rpb24gKGNvbWJpbmF0aW9uKSB7CiAgICAgICAgdmFyIHJvdyA9IHsKICAgICAgICAgIGF0dHJfYXJyOiBjb21iaW5hdGlvbiwKICAgICAgICAgIGRldGFpbDoge30sCiAgICAgICAgICB0aXRsZTogJycsCiAgICAgICAgICBrZXk6ICcnLAogICAgICAgICAgcHJpY2U6IDAsCiAgICAgICAgICBwaWM6ICcnLAogICAgICAgICAgb3RfcHJpY2U6IDAsCiAgICAgICAgICBjb3N0OiAwLAogICAgICAgICAgc3RvY2s6IDAsCiAgICAgICAgICBpc19zaG93OiAxLAogICAgICAgICAgaXNfZGVmYXVsdF9zZWxlY3Q6IDAsCiAgICAgICAgICB1bmlxdWU6ICcnLAogICAgICAgICAgd2VpZ2h0OiAnJywKICAgICAgICAgIHZvbHVtZTogJycsCiAgICAgICAgICBicm9rZXJhZ2U6IDAsCiAgICAgICAgICBicm9rZXJhZ2VfdHdvOiAwLAogICAgICAgICAgdmlwX3ByaWNlOiAwLAogICAgICAgICAgdmlwX3Byb3BvcnRpb246IDAKICAgICAgICB9OwoKICAgICAgICAvLyDorr7nva7omZrmi5/nsbvlnovnm7jlhbPlsZ7mgKcKICAgICAgICBpZiAoX3RoaXMyNy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlID09PSAxKSB7CiAgICAgICAgICByb3cudmlydHVhbF9saXN0ID0gW107CiAgICAgICAgICByb3cuZGlza19pbmZvID0gJyc7CiAgICAgICAgfSBlbHNlIGlmIChfdGhpczI3LmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPT09IDIpIHsKICAgICAgICAgIHJvdy5jb3Vwb25faWQgPSAwOwogICAgICAgICAgcm93LmNvdXBvbl9uYW1lID0gJyc7CiAgICAgICAgfQoKICAgICAgICAvLyDlpITnkIbop4TmoLzlsZ7mgKcKICAgICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHsKICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbWJpbmF0aW9uW2ldOwogICAgICAgICAgcm93W2l0ZW0udmFsdWVdID0gdmFsdWU7CiAgICAgICAgICByb3cudGl0bGUgPSBpdGVtLnZhbHVlOwogICAgICAgICAgcm93LmtleSA9IGl0ZW0udmFsdWU7CiAgICAgICAgICByb3cuZGV0YWlsW2l0ZW0udmFsdWVdID0gdmFsdWU7CgogICAgICAgICAgLy8g5p+l5om+5Yy56YWN55qE546w5pyJ6KeE5qC86aG5CiAgICAgICAgICB2YXIgbWF0Y2hlZEl0ZW0gPSBleGlzdGluZ0l0ZW1zLmZpbmQoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYXR0cl9hcnIgJiYgYXJyYXlzRXF1YWwoaXRlbS5hdHRyX2FyciwgY29tYmluYXRpb24pOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAobWF0Y2hlZEl0ZW0pIHsKICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyb3csIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7CiAgICAgICAgICAgICAgcHJpY2U6IG1hdGNoZWRJdGVtLnByaWNlLAogICAgICAgICAgICAgIGNvc3Q6IG1hdGNoZWRJdGVtLmNvc3QsCiAgICAgICAgICAgICAgb3RfcHJpY2U6IG1hdGNoZWRJdGVtLm90X3ByaWNlLAogICAgICAgICAgICAgIHN0b2NrOiBtYXRjaGVkSXRlbS5zdG9jaywKICAgICAgICAgICAgICBwaWM6IG1hdGNoZWRJdGVtLnBpYywKICAgICAgICAgICAgICB1bmlxdWU6IG1hdGNoZWRJdGVtLnVuaXF1ZSB8fCAnJywKICAgICAgICAgICAgICB3ZWlnaHQ6IG1hdGNoZWRJdGVtLndlaWdodCB8fCAnJywKICAgICAgICAgICAgICB2b2x1bWU6IG1hdGNoZWRJdGVtLnZvbHVtZSB8fCAnJywKICAgICAgICAgICAgICBpc19zaG93OiBtYXRjaGVkSXRlbS5pc19zaG93IHx8IDEsCiAgICAgICAgICAgICAgaXNfZGVmYXVsdF9zZWxlY3Q6IG1hdGNoZWRJdGVtLmlzX2RlZmF1bHRfc2VsZWN0IHx8IDAKICAgICAgICAgICAgfSwgInZvbHVtZSIsIG1hdGNoZWRJdGVtLnZvbHVtZSB8fCAwKSwgImJhcl9jb2RlX251bWJlciIsIG1hdGNoZWRJdGVtLmJhcl9jb2RlX251bWJlciB8fCAwKSwgImlzX3ZpcnR1YWwiLCBtYXRjaGVkSXRlbS5pc192aXJ0dWFsKSwgImJyb2tlcmFnZSIsIG1hdGNoZWRJdGVtLmJyb2tlcmFnZSksICJicm9rZXJhZ2VfdHdvIiwgbWF0Y2hlZEl0ZW0uYnJva2VyYWdlX3R3byksICJ2aXBfcHJpY2UiLCBtYXRjaGVkSXRlbS52aXBfcHJpY2UpLCAidmlwX3Byb3BvcnRpb24iLCBtYXRjaGVkSXRlbS52aXBfcHJvcG9ydGlvbikpOwogICAgICAgICAgICBpZiAoX3RoaXMyNy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlID09PSAxKSB7CiAgICAgICAgICAgICAgcm93LnZpcnR1YWxfbGlzdCA9IG1hdGNoZWRJdGVtLnZpcnR1YWxfbGlzdDsKICAgICAgICAgICAgICByb3cuZGlza19pbmZvID0gbWF0Y2hlZEl0ZW0uZGlza19pbmZvOwogICAgICAgICAgICB9IGVsc2UgaWYgKF90aGlzMjcuZm9ybVZhbGlkYXRlLnZpcnR1YWxfdHlwZSA9PT0gMiAmJiBtYXRjaGVkSXRlbS5jb3Vwb25faWQpIHsKICAgICAgICAgICAgICByb3cuY291cG9uX2lkID0gbWF0Y2hlZEl0ZW0uY291cG9uX2lkOwogICAgICAgICAgICAgIHJvdy5jb3Vwb25fbmFtZSA9IG1hdGNoZWRJdGVtLmNvdXBvbl9uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uYWRkX3BpYyAmJiBjb21iaW5hdGlvbi5pbmNsdWRlcyh2YWwpKSB7CiAgICAgICAgICAgIHZhciBwaWNJdGVtID0gaXRlbS5kZXRhaWwuZmluZChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIHJldHVybiBjb21iaW5hdGlvbi5pbmNsdWRlcyhlLnZhbHVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChwaWNJdGVtKSByb3cucGljID0gcGljSXRlbS5waWM7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJvdzsKICAgICAgfSk7CiAgICAgIHJldHVybiByb3dzOwogICAgfSwKICAgIC8vIOWIh+aNoum7mOiupOmAieS4reinhOagvAogICAgY2hhbmdlRGVmYXVsdFNlbGVjdDogZnVuY3Rpb24gY2hhbmdlRGVmYXVsdFNlbGVjdChlLCBpbmRleCkgewogICAgICAvLyDkuIDkuKrlvIDlkK8g5YW25LuW5YWz6ZetCiAgICAgIHRoaXMubWFueUZvcm1WYWxpZGF0ZS5tYXAoZnVuY3Rpb24gKGl0ZW0sIGkpIHsKICAgICAgICBpZiAoaSAhPT0gaW5kZXgpIHsKICAgICAgICAgIGl0ZW0uaXNfZGVmYXVsdF9zZWxlY3QgPSAwOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChlKSB0aGlzLm1hbnlGb3JtVmFsaWRhdGVbaW5kZXhdLmlzX3Nob3cgPSAxOwogICAgfSwKICAgIC8vIOaUueWPmOaYr+WQpuaYvuekugogICAgY2hhbmdlRGVmYXVsdFNob3c6IGZ1bmN0aW9uIGNoYW5nZURlZmF1bHRTaG93KGluZGV4KSB7CiAgICAgIC8vIOWmguaenOm7mOiupOmAieS4reW8gOWQryDliJnkuI3lj6/pmpDol48KICAgICAgaWYgKHRoaXMubWFueUZvcm1WYWxpZGF0ZVtpbmRleF0uaXNfZGVmYXVsdF9zZWxlY3QgPT09IDEpIHsKICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGVbaW5kZXhdLmlzX3Nob3cgPSAxOwogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+m7mOiupOinhOagvOS4jeWPr+makOiXjycpOwogICAgICB9CiAgICB9LAogICAgLy8g55Sf5oiQ6KeE5qC857uE5ZCICiAgICBnZW5lcmF0ZUNvbWJpbmF0aW9uczogZnVuY3Rpb24gZ2VuZXJhdGVDb21iaW5hdGlvbnMoYXJyKSB7CiAgICAgIHZhciBfdGhpczI4ID0gdGhpczsKICAgICAgdmFyIHByZWZpeCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107CiAgICAgIGlmIChhcnIubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIFtwcmVmaXhdOwogICAgICB9CiAgICAgIHZhciBfYXJyID0gX3RvQXJyYXkoYXJyKSwKICAgICAgICBmaXJzdCA9IF9hcnJbMF0sCiAgICAgICAgcmVzdCA9IF9hcnIuc2xpY2UoMSk7CiAgICAgIHJldHVybiBmaXJzdC5kZXRhaWwuZmxhdE1hcChmdW5jdGlvbiAoZGV0YWlsKSB7CiAgICAgICAgcmV0dXJuIF90aGlzMjguZ2VuZXJhdGVDb21iaW5hdGlvbnMocmVzdCwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwcmVmaXgpLCBbZGV0YWlsLnZhbHVlXSkpOwogICAgICB9KTsKICAgIH0sCiAgICAvLyDmt7vliqDlsZ7mgKcKICAgIGNyZWF0ZUF0dHI6IGZ1bmN0aW9uIGNyZWF0ZUF0dHIobnVtLCBpZHgpIHsKICAgICAgdmFyIF90aGlzMjkgPSB0aGlzOwogICAgICBpZiAobnVtKSB7CiAgICAgICAgLy8g5Yik5pat5piv5ZCm5a2Y5Zyo5ZCM5qC354af5oKJCiAgICAgICAgdmFyIGlzRXhpc3QgPSB0aGlzLmF0dHJzW2lkeF0uZGV0YWlsLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlID09PSBudW07CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGlzRXhpc3QpIHsKICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+inhOagvOWAvOW3suWtmOWcqCcpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmF0dHJzW2lkeF0uZGV0YWlsLnB1c2goewogICAgICAgICAgdmFsdWU6IG51bSwKICAgICAgICAgIHBpYzogJycKICAgICAgICB9KTsKICAgICAgICBpZiAodGhpcy5tYW55Rm9ybVZhbGlkYXRlLmxlbmd0aCkgewogICAgICAgICAgdGhpcy5hZGRPbmVBdHRyKHRoaXMuYXR0cnNbaWR4XS52YWx1ZSwgbnVtKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5nZW5lcmF0ZUF0dHIodGhpcy5hdHRycyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuJHJlZnMuc3BlY1N0b2NrLiRyZWZzWydwb3BvdmVyUmVmXycgKyBpZHhdWzBdLmRvQ2xvc2UoKTsgLy/lhbPpl63nmoQKICAgICAgICB0aGlzLmNsZWFyQXR0cigpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgaWYgKF90aGlzMjkuJHJlZnMuc3BlY1N0b2NrLiRyZWZzWydwb3BvdmVyUmVmXycgKyBpZHhdKSB7CiAgICAgICAgICAgIC8v6YeN54K55piv5Lul5LiL5Lik5Y+lCiAgICAgICAgICAgIF90aGlzMjkuJHJlZnMuc3BlY1N0b2NrLiRyZWZzWydwb3BvdmVyUmVmXycgKyBpZHhdWzBdLmRvU2hvdygpOyAvL+aJk+W8gOeahAogICAgICAgICAgICAvL+mHjeeCueaYr+S7peS4iuS4pOWPpQogICAgICAgICAgfQogICAgICAgIH0sIDIwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLiRyZWZzLnNwZWNTdG9jay4kcmVmc1sncG9wb3ZlclJlZl8nICsgaWR4XVswXS5kb0Nsb3NlKCk7IC8v5YWz6Zet55qECiAgICAgIH0KICAgIH0sCiAgICBoYW5kbGVTaG93UG9wOiBmdW5jdGlvbiBoYW5kbGVTaG93UG9wKGluZGV4KSB7CiAgICAgIHRoaXMuJHJlZnMuc3BlY1N0b2NrLiRyZWZzWydpbnB1dFJlZl8nICsgaW5kZXhdWzBdLmZvY3VzKCk7CiAgICB9LAogICAgLy8g5ZWG5ZOB5YiG57G777ybCiAgICBnb29kc0NhdGVnb3J5OiBmdW5jdGlvbiBnb29kc0NhdGVnb3J5KCkgewogICAgICB2YXIgX3RoaXMzMCA9IHRoaXM7CiAgICAgIGNhc2NhZGVyTGlzdEFwaSgxKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBfdGhpczMwLnRyZWVTZWxlY3QgPSByZXMuZGF0YTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlcykgewogICAgICAgIF90aGlzMzAuJG1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CiAgICAgIH0pOwogICAgfSwKICAgIC8vIOaUueWPmOinhOagvAogICAgY2hhbmdlU3BlYzogZnVuY3Rpb24gY2hhbmdlU3BlYygpIHsKICAgICAgdmFyIF90aGlzMzEgPSB0aGlzOwogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5pc19zdWIgPSBbXTsKICAgICAgdmFyIGlkID0gdGhpcy4kcm91dGUucGFyYW1zLmlkOwogICAgICBpZiAoaWQpIHsKICAgICAgICBjaGVja0FjdGl2aXR5QXBpKGlkKS50aGVuKGZ1bmN0aW9uIChyZXMpIHt9KS5jYXRjaChmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICBfdGhpczMxLmZvcm1WYWxpZGF0ZS5zcGVjX3R5cGUgPSBfdGhpczMxLnNwZWNfdHlwZTsKICAgICAgICAgIF90aGlzMzEuJG1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICAvLyDor6bmg4UKICAgIGdldEluZm86IGZ1bmN0aW9uIGdldEluZm8oKSB7CiAgICAgIHZhciBfdGhpczMyID0gdGhpczsKICAgICAgdGhpcy5zcGluU2hvdyA9IHRydWU7CiAgICAgIHByb2R1Y3RJbmZvQXBpKHRoaXMuJHJvdXRlLnBhcmFtcy5pZCkudGhlbigvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVmMiA9IF9hc3luY1RvR2VuZXJhdG9yKC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3IoKS5tKGZ1bmN0aW9uIF9jYWxsZWUyKHJlcykgewogICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yKCkudyhmdW5jdGlvbiAoX2NvbnRleHQyKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5uKSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgZGF0YSA9IHJlcy5kYXRhLnByb2R1Y3RJbmZvOwogICAgICAgICAgICAgICAgX3RoaXMzMi5pbmZvRGF0YShkYXRhKTsKICAgICAgICAgICAgICAgIF90aGlzMzIuc3BpblNob3cgPSBmYWxzZTsKICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmEoMik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUyKTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeCkgewogICAgICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgICAgfSgpKS5jYXRjaChmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgX3RoaXMzMi5zcGluU2hvdyA9IGZhbHNlOwogICAgICAgIF90aGlzMzIuJG1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CiAgICAgIH0pOwogICAgfSwKICAgIGhhbmRsZVJlbW92ZTogZnVuY3Rpb24gaGFuZGxlUmVtb3ZlKGkpIHsKICAgICAgdGhpcy5pbWFnZXMuc3BsaWNlKGksIDEpOwogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5zbGlkZXJfaW1hZ2Uuc3BsaWNlKGksIDEpOwogICAgICB0aGlzLm9uZUZvcm1WYWxpZGF0ZVswXS5waWMgPSB0aGlzLmZvcm1WYWxpZGF0ZS5zbGlkZXJfaW1hZ2VbMF07CiAgICB9LAogICAgLy8g5YWz6Zet5Zu+54mH5LiK5Lyg5qih5oCB5qGGCiAgICBjaGFuZ2VDYW5jZWw6IGZ1bmN0aW9uIGNoYW5nZUNhbmNlbChtc2cpIHsKICAgICAgdGhpcy5tb2RhbFBpYyA9IGZhbHNlOwogICAgfSwKICAgIC8vIOeCueWHu+WVhuWTgeWbvgogICAgbW9kYWxQaWNUYXA6IGZ1bmN0aW9uIG1vZGFsUGljVGFwKHRpdCkgewogICAgICB2YXIgcGljVGl0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJzsKICAgICAgdmFyIGluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwOwogICAgICB0aGlzLm1vZGFsUGljID0gdHJ1ZTsKICAgICAgdGhpcy5pc0Nob2ljZSA9IHRpdCA9PT0gJ2RhbicgPyAn5Y2V6YCJJyA6ICflpJrpgIknOwogICAgICB0aGlzLnBpY1RpdCA9IHBpY1RpdDsKICAgICAgdGhpcy50YWJsZUluZGV4ID0gaW5kZXg7CiAgICB9LAogICAgLy8g6I635Y+W5Y2V5byg5Zu+54mH5L+h5oGvCiAgICBnZXRQaWM6IGZ1bmN0aW9uIGdldFBpYyhwYykgewogICAgICBzd2l0Y2ggKHRoaXMucGljVGl0KSB7CiAgICAgICAgY2FzZSAnZGFuRnJvbSc6CiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5pbWFnZSA9IHBjLmF0dF9kaXI7CiAgICAgICAgICBpZiAoIXRoaXMuJHJvdXRlLnBhcmFtcy5pZCkgewogICAgICAgICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuc3BlY190eXBlID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5vbmVGb3JtVmFsaWRhdGVbMF0ucGljID0gcGMuYXR0X2RpcjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICBpdGVtLnBpYyA9IHBjLmF0dF9kaXI7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgdGhpcy5vbmVGb3JtQmF0Y2hbMF0ucGljID0gcGMuYXR0X2RpcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZGFuVGFibGUnOgogICAgICAgICAgdGhpcy5vbmVGb3JtVmFsaWRhdGVbdGhpcy50YWJsZUluZGV4XS5waWMgPSBwYy5hdHRfZGlyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZHVvcGknOgogICAgICAgICAgdGhpcy5vbmVGb3JtQmF0Y2hbdGhpcy50YWJsZUluZGV4XS5waWMgPSBwYy5hdHRfZGlyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncmVjb21tZW5kX2ltYWdlJzoKICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnJlY29tbWVuZF9pbWFnZSA9IHBjLmF0dF9kaXI7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKHRoaXMubWFueUZvcm1WYWxpZGF0ZS5sZW5ndGgpIHRoaXMubWFueUZvcm1WYWxpZGF0ZVt0aGlzLnRhYmxlSW5kZXhdLnBpYyA9IHBjLmF0dF9kaXI7CiAgICAgIH0KICAgICAgdGhpcy5tb2RhbFBpYyA9IGZhbHNlOwogICAgfSwKICAgIGRlbGV0ZVJvdzogZnVuY3Rpb24gZGVsZXRlUm93KGluZGV4KSB7CiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnBhcmFtc19saXN0LnNwbGljZShpbmRleCwgMSk7CiAgICB9LAogICAgLy8g6I635Y+W5aSa5byg5Zu+5L+h5oGvCiAgICBnZXRQaWNEOiBmdW5jdGlvbiBnZXRQaWNEKHBjKSB7CiAgICAgIHZhciBfdGhpczMzID0gdGhpczsKICAgICAgdGhpcy5pbWFnZXMgPSBwYzsKICAgICAgdGhpcy5pbWFnZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgX3RoaXMzMy5mb3JtVmFsaWRhdGUuc2xpZGVyX2ltYWdlLnB1c2goaXRlbS5hdHRfZGlyKTsKICAgICAgICBfdGhpczMzLmZvcm1WYWxpZGF0ZS5zbGlkZXJfaW1hZ2UgPSBfdGhpczMzLmZvcm1WYWxpZGF0ZS5zbGlkZXJfaW1hZ2Uuc3BsaWNlKDAsIDEwKTsKICAgICAgfSk7CiAgICAgIHRoaXMub25lRm9ybVZhbGlkYXRlWzBdLnBpYyA9IHRoaXMuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZVswXTsKICAgICAgdGhpcy5tb2RhbFBpYyA9IGZhbHNlOwogICAgfSwKICAgIC8vIOaPkOS6pAogICAgaGFuZGxlU3VibWl0OiBmdW5jdGlvbiBoYW5kbGVTdWJtaXQobmFtZSkgewogICAgICB2YXIgX3RoaXMzNCA9IHRoaXM7CiAgICAgIHRoaXMuJHJlZnNbbmFtZV0udmFsaWRhdGUoZnVuY3Rpb24gKHZhbGlkKSB7CiAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICBfdGhpczM0LmZvcm1WYWxpZGF0ZS50eXBlID0gX3RoaXMzNC50eXBlOwogICAgICAgICAgdmFyIGFyciA9IF90aGlzMzQuZm9ybVZhbGlkYXRlLnNwZWNfdHlwZSA9PT0gMCA/IF90aGlzMzQub25lRm9ybVZhbGlkYXRlIDogX3RoaXMzNC5tYW55Rm9ybVZhbGlkYXRlOwogICAgICAgICAgdmFyIGl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFycikpOwogICAgICAgICAgaWYgKF90aGlzMzQuZm9ybVZhbGlkYXRlLnNwZWNfdHlwZSA9PT0gMSkgewogICAgICAgICAgICBpZiAoaXRlbS5sZW5ndGggPCAyKSByZXR1cm4gX3RoaXMzNC4kbWVzc2FnZS53YXJuaW5nKCfllYblk4Hop4TmoLwt6KeE5qC85pWw6YeP5pyA5bCRMeS4qicpOwogICAgICAgICAgICAvLyDliKDpmaTnrKzkuIDpobkKICAgICAgICAgICAgaXRlbS5zaGlmdCgpOwogICAgICAgICAgfQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpdGVtW2ldLnN0b2NrID4gMTAwMDAwMCkgewogICAgICAgICAgICAgIHJldHVybiBfdGhpczM0LiRtZXNzYWdlLmVycm9yKCfop4TmoLzlupPlrZgt5bqT5a2Y6LaF5Ye657O757uf6IyD5Zu0KDEwMDAwMDApJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChfdGhpczM0LmZvcm1WYWxpZGF0ZS5pc19zdWJbMF0gPT09IDEpIHsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGl0ZW0ubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW1bX2ldLmJyb2tlcmFnZSA9PT0gbnVsbCB8fCBpdGVtW19pXS5icm9rZXJhZ2VfdHdvID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzNC4kbWVzc2FnZS5lcnJvcign6JCl6ZSA6K6+572uLSDkuIDkuoznuqfov5TkvaPkuI3og73kuLrnqbonKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGl0ZW0ubGVuZ3RoOyBfaTIrKykgewogICAgICAgICAgICAgIGlmIChpdGVtW19pMl0udmlwX3ByaWNlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzNC4kbWVzc2FnZS5lcnJvcign6JCl6ZSA6K6+572uLeS8muWRmOS7t+S4jeiDveS4uuepuicpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKF90aGlzMzQuZm9ybVZhbGlkYXRlLmlzX3N1Yi5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgaXRlbS5sZW5ndGg7IF9pMysrKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW1bX2kzXS5icm9rZXJhZ2UgPT09IG51bGwgfHwgaXRlbVtfaTNdLmJyb2tlcmFnZV90d28gPT09IG51bGwgfHwgaXRlbVtfaTNdLnZpcF9wcmljZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMzQuJG1lc3NhZ2UuZXJyb3IoJ+iQpemUgOiuvue9ri0g5LiA5LqM57qn6L+U5L2j5ZKM5Lya5ZGY5Lu35LiN6IO95Li656m6Jyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoX3RoaXMzNC5mb3JtVmFsaWRhdGUuZnJlaWdodCA9PSAzICYmICFfdGhpczM0LmZvcm1WYWxpZGF0ZS50ZW1wX2lkKSB7CiAgICAgICAgICAgIHJldHVybiBfdGhpczM0LiRtZXNzYWdlLndhcm5pbmcoJ+WVhuWTgeS/oeaBry3ov5DotLnmqKHmnb/kuI3og73kuLrnqbonKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBhY3RpdmVJZHMgPSBbXTsKICAgICAgICAgIF90aGlzMzQuZGF0YUxhYmVsLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgYWN0aXZlSWRzLnB1c2goaXRlbS5pZCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIF90aGlzMzQuZm9ybVZhbGlkYXRlLmxhYmVsX2lkID0gYWN0aXZlSWRzOwogICAgICAgICAgaWYgKF90aGlzMzQub3BlblN1YmltaXQpIHJldHVybjsKICAgICAgICAgIF90aGlzMzQub3BlblN1YmltaXQgPSB0cnVlOwogICAgICAgICAgX3RoaXMzNC5mb3JtVmFsaWRhdGUuZGVzY3JpcHRpb24gPSBmb3JtYXRSaWNoVGV4dChfdGhpczM0LmNvbnRlbnQpOwogICAgICAgICAgaWYgKF90aGlzMzQuZm9ybVZhbGlkYXRlLnNwZWNfdHlwZSA9PT0gMCkgewogICAgICAgICAgICBfdGhpczM0LmZvcm1WYWxpZGF0ZS5hdHRycyA9IGl0ZW07CiAgICAgICAgICAgIF90aGlzMzQuZm9ybVZhbGlkYXRlLmhlYWRlciA9IFtdOwogICAgICAgICAgICBfdGhpczM0LmZvcm1WYWxpZGF0ZS5pdGVtcyA9IFtdOwogICAgICAgICAgICBfdGhpczM0LmZvcm1WYWxpZGF0ZS5pc19jb3B5ID0gMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF90aGlzMzQuZm9ybVZhbGlkYXRlLml0ZW1zID0gX3RoaXMzNC5hdHRyczsKICAgICAgICAgICAgX3RoaXMzNC5mb3JtVmFsaWRhdGUuYXR0cnMgPSBpdGVtOwogICAgICAgICAgICBfdGhpczM0LmZvcm1WYWxpZGF0ZS5pc19jb3B5ID0gMTsKICAgICAgICAgIH0KICAgICAgICAgIHByb2R1Y3RBZGRBcGkoX3RoaXMzNC5mb3JtVmFsaWRhdGUpLnRoZW4oLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoLyojX19QVVJFX18qL19yZWdlbmVyYXRvcigpLm0oZnVuY3Rpb24gX2NhbGxlZTMocmVzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcigpLncoZnVuY3Rpb24gKF9jb250ZXh0MykgewogICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLm4pIHsKICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIF90aGlzMzQub3BlblN1YmltaXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBfdGhpczM0LiRtZXNzYWdlLnN1Y2Nlc3MocmVzLm1zZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzMzQuJHJvdXRlLnBhcmFtcy5pZCA9PT0gJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgICBjYWNoZURlbGV0ZSgpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMzNC4kbWVzc2FnZS5lcnJvcihlcnIubXNnKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgIF90aGlzMzQub3BlblN1YmltaXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgIF90aGlzMzQuJHJvdXRlci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogX3RoaXMzNC4kcm91dGVQcm9TdHIgKyAnL3Byb2R1Y3QvcHJvZHVjdF9saXN0JwogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYSgyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LCBfY2FsbGVlMyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDIpIHsKICAgICAgICAgICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0oKSkuY2F0Y2goZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgX3RoaXMzNC5vcGVuU3ViaW1pdCA9IGZhbHNlOwogICAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICAgICAgX3RoaXMzNC4kbWVzc2FnZS5lcnJvcihyZXMubXNnKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIV90aGlzMzQuZm9ybVZhbGlkYXRlLnN0b3JlX25hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzMzQuJG1lc3NhZ2Uud2FybmluZygn5ZWG5ZOB5L+h5oGvLeWVhuWTgeWQjeensOS4jeiDveS4uuepuicpOwogICAgICAgICAgfSBlbHNlIGlmICghX3RoaXMzNC5mb3JtVmFsaWRhdGUuY2F0ZV9pZC5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzMzQuJG1lc3NhZ2Uud2FybmluZygn5ZWG5ZOB5L+h5oGvLeWVhuWTgeWIhuexu+S4jeiDveS4uuepuicpOwogICAgICAgICAgfSBlbHNlIGlmICghX3RoaXMzNC5mb3JtVmFsaWRhdGUudW5pdF9uYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBfdGhpczM0LiRtZXNzYWdlLndhcm5pbmcoJ+WVhuWTgeS/oeaBry3llYblk4HljZXkvY3kuI3og73kuLrnqbonKTsKICAgICAgICAgIH0gZWxzZSBpZiAoIV90aGlzMzQuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZS5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzMzQuJG1lc3NhZ2Uud2FybmluZygn5ZWG5ZOB5L+h5oGvLeWVhuWTgei9ruaSreWbvuS4jeiDveS4uuepuicpOwogICAgICAgICAgfSBlbHNlIGlmICghX3RoaXMzNC5mb3JtVmFsaWRhdGUubG9naXN0aWNzLmxlbmd0aCAmJiAhX3RoaXMzNC5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlKSB7CiAgICAgICAgICAgIHJldHVybiBfdGhpczM0LiRtZXNzYWdlLndhcm5pbmcoJ+eJqea1geiuvue9ri3oh7PlsJHpgInmi6nkuIDnp43nianmtYHmlrnlvI8nKTsKICAgICAgICAgIH0gZWxzZSBpZiAoIV90aGlzMzQuZm9ybVZhbGlkYXRlLnRlbXBfaWQgJiYgX3RoaXMzNC5mb3JtVmFsaWRhdGUuZnJlaWdodCA9PSAzKSB7CiAgICAgICAgICAgIHJldHVybiBfdGhpczM0LiRtZXNzYWdlLndhcm5pbmcoJ+WVhuWTgeS/oeaBry3ov5DotLnmqKHmnb/kuI3og73kuLrnqbonKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKICAgIGNoYW5nZVRlbXBsYXRlOiBmdW5jdGlvbiBjaGFuZ2VUZW1wbGF0ZShtc2cpIHsKICAgICAgdGhpcy50ZW1wbGF0ZSA9IG1zZzsKICAgIH0sCiAgICAvLyDooajljZXpqozor4EKICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wLCBzdGF0dXMsIGVycm9yKSB7CiAgICAgIGlmIChzdGF0dXMgPT09IGZhbHNlKSB7CiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKGVycm9yKTsKICAgICAgfQogICAgfSwKICAgIC8vIOenu+WKqAogICAgaGFuZGxlRHJhZ1N0YXJ0OiBmdW5jdGlvbiBoYW5kbGVEcmFnU3RhcnQoZSwgaXRlbSkgewogICAgICB0aGlzLmRyYWdnaW5nID0gaXRlbTsKICAgIH0sCiAgICBoYW5kbGVEcmFnRW5kOiBmdW5jdGlvbiBoYW5kbGVEcmFnRW5kKGUsIGl0ZW0pIHsKICAgICAgdGhpcy5kcmFnZ2luZyA9IG51bGw7CiAgICB9LAogICAgaGFuZGxlRHJhZ092ZXI6IGZ1bmN0aW9uIGhhbmRsZURyYWdPdmVyKGUpIHsKICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJzsKICAgIH0sCiAgICBoYW5kbGVEcmFnRW50ZXI6IGZ1bmN0aW9uIGhhbmRsZURyYWdFbnRlcihlLCBpdGVtKSB7CiAgICAgIGUuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7CiAgICAgIGlmIChpdGVtID09PSB0aGlzLmRyYWdnaW5nKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBuZXdJdGVtcyA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLmZvcm1WYWxpZGF0ZS5zbGlkZXJfaW1hZ2UpOwogICAgICB2YXIgc3JjID0gbmV3SXRlbXMuaW5kZXhPZih0aGlzLmRyYWdnaW5nKTsKICAgICAgdmFyIGRzdCA9IG5ld0l0ZW1zLmluZGV4T2YoaXRlbSk7CiAgICAgIG5ld0l0ZW1zLnNwbGljZS5hcHBseShuZXdJdGVtcywgW2RzdCwgMF0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShuZXdJdGVtcy5zcGxpY2Uoc3JjLCAxKSkpKTsKICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuc2xpZGVyX2ltYWdlID0gbmV3SXRlbXM7CiAgICB9LAogICAgLy/lr7nosaHmlbDnu4Tljrvph43vvJsKICAgIHVuaXF1ZTogZnVuY3Rpb24gdW5pcXVlKGFycikgewogICAgICB2YXIgcmVzID0gbmV3IE1hcCgpOwogICAgICByZXR1cm4gYXJyLmZpbHRlcihmdW5jdGlvbiAoYXJyKSB7CiAgICAgICAgcmV0dXJuICFyZXMuaGFzKGFyci5wcm9kdWN0X2lkKSAmJiByZXMuc2V0KGFyci5wcm9kdWN0X2lkLCAxKTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g5ZWG5ZOBaWQKICAgIGdldFByb2R1Y3RJZDogZnVuY3Rpb24gZ2V0UHJvZHVjdElkKGRhdGEpIHsKICAgICAgdGhpcy5nb29kc19tb2RhbHMgPSBmYWxzZTsKICAgICAgdGhpcy5mb3JtVmFsaWRhdGUucmVjb21tZW5kX2xpc3QgPSB0aGlzLnVuaXF1ZSh0aGlzLmZvcm1WYWxpZGF0ZS5yZWNvbW1lbmRfbGlzdC5jb25jYXQoZGF0YSkpOwogICAgfSwKICAgIC8vIOmAieaLqeaOqOiNkOWVhuWTgQogICAgY2hhbmdlR29vZHM6IGZ1bmN0aW9uIGNoYW5nZUdvb2RzKCkgewogICAgICB0aGlzLmdvb2RzX21vZGFscyA9IHRydWU7CiAgICAgIHRoaXMuJHJlZnMuZ29vZHNsaXN0LmdldExpc3QoKTsKICAgICAgdGhpcy4kcmVmcy5nb29kc2xpc3QuZ29vZHNDYXRlZ29yeSgpOwogICAgfSwKICAgIC8vIOmAieaLqeeUqOaIt+agh+etvgogICAgYWN0aXZlRGF0YTogZnVuY3Rpb24gYWN0aXZlRGF0YShkYXRhTGFiZWwpIHsKICAgICAgdGhpcy5sYWJlbFNob3cgPSBmYWxzZTsKICAgICAgdGhpcy5kYXRhTGFiZWwgPSBkYXRhTGFiZWw7CiAgICB9LAogICAgLy8g6YCJ5oup5ZWG5ZOB5qCH562+CiAgICBhY3RpdmVMYWJlbDogZnVuY3Rpb24gYWN0aXZlTGFiZWwoZGF0YSkgewogICAgICB0aGlzLnRhZ1Nob3cgPSBmYWxzZTsKICAgICAgdGhpcy5mb3JtVmFsaWRhdGUubGFiZWxfbGlzdCA9IEFycmF5LmZyb20obmV3IFNldChkYXRhKSk7CiAgICB9LAogICAgLy8g5qCH562+5by556qX5YWz6ZetCiAgICBsYWJlbENsb3NlOiBmdW5jdGlvbiBsYWJlbENsb3NlKCkgewogICAgICB0aGlzLmxhYmVsU2hvdyA9IGZhbHNlOwogICAgICB0aGlzLnRhZ1Nob3cgPSBmYWxzZTsKICAgIH0sCiAgICAvLyDliKDpmaTnlKjmiLfmoIfnrb4KICAgIGNsb3NlTGFiZWw6IGZ1bmN0aW9uIGNsb3NlTGFiZWwobGFiZWwpIHsKICAgICAgdmFyIGluZGV4ID0gdGhpcy5kYXRhTGFiZWwuaW5kZXhPZih0aGlzLmRhdGFMYWJlbC5maWx0ZXIoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5pZCA9PSBsYWJlbC5pZDsKICAgICAgfSlbMF0pOwogICAgICB0aGlzLmRhdGFMYWJlbC5zcGxpY2UoaW5kZXgsIDEpOwogICAgfSwKICAgIC8vIOaJk+W8gOmAieaLqeeUqOaIt+agh+etvgogICAgb3BlbkxhYmVsOiBmdW5jdGlvbiBvcGVuTGFiZWwocm93KSB7CiAgICAgIHRoaXMubGFiZWxTaG93ID0gdHJ1ZTsKICAgIH0sCiAgICBoYW5kbGVSZW1vdmVSZWNvbW1lbmQ6IGZ1bmN0aW9uIGhhbmRsZVJlbW92ZVJlY29tbWVuZChpKSB7CiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnJlY29tbWVuZF9saXN0LnNwbGljZShpLCAxKTsKICAgIH0sCiAgICAvLyDmiZPlvIDnmoTokKXplIDmtLvliqjmoIfnrb4KICAgIHdhdGNoQWN0aXZpdHk6IGZ1bmN0aW9uIHdhdGNoQWN0aXZpdHkoKSB7CiAgICAgIHZhciBtYXJrZXRpbmcgPSBbXTsKICAgICAgLy8g5L2/55So5a+56LGh5pig5bCE5LyY5YyW5p2D6ZmQ5Yik5pat6YC76L6RCiAgICAgIHZhciBwZXJtaXNzaW9uTWFwID0gewogICAgICAgIOm7mOiupDogdHJ1ZSwKICAgICAgICDnp5LmnYA6ICdzZWNraWxsJywKICAgICAgICDnoI3ku7c6ICdiYXJnYWluJywKICAgICAgICDmi7zlm6I6ICdjb21iaW5hdGlvbicKICAgICAgfTsKICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuYWN0aXZpdHkuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsKICAgICAgICBpZiAocGVybWlzc2lvbk1hcFtlbF0gPT09IHRydWUgfHwgcGVybWlzc2lvbk1hcFtlbF0gJiYgY2hlY2tBcnJheShwZXJtaXNzaW9uTWFwW2VsXSkpIHsKICAgICAgICAgIG1hcmtldGluZy5wdXNoKGVsKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5hY3Rpdml0eSA9IG1hcmtldGluZzsKICAgIH0KICB9Cn07"},null]}