8b16dd9df32704e8bd9c60316ffef98b.json 214 KB

1
  1. {"remainingRequest":"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\\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"},{"version":3,"names":["userLabel","useLabel","goodsLabel","mapState","uploadPictures","freightTemplate","couponList","addAttr","goodsList","taoBao","userLabelAddApi","productInfoApi","cascaderListApi","productAddApi","generateAttrApi","productGetRuleApi","productGetTemplateApi","productGetTempKeysApi","checkActivityApi","productCache","cacheDelete","uploadType","importCard","productCreateApi","getProductTypeConfig","ruleAddApi","paramListApi","paramInfoApi","productProtectionListApi","productLabelUseListApi","Setting","getCookies","uploadByPieces","isFileUpload","isVideoUpload","arraysEqual","checkArray","GoodsTableHead","VirtualTableHead","VirtualTableHead2","columns2","columns3","CustomList","RuleValidate","BasicInfo","SpecStock","ProductDetail","LogisticsSetting","PriceCommission","MarketingSetting","OtherSetting","formatRichText","name","components","data","labelShow","tagShow","dataLabel","headTab","tit","virtual","id","tit2","seletVideo","customBtn","content","contents","fileUrl","apiBaseURL","fileUrl2","cardUrl","upload_type","uploadData","header","type","modals","goods_modals","spinShow","openSubimit","virtualList","key","value","oneFormBatch","pic","price","cost","ot_price","stock","bar_code","bar_code_number","weight","volume","virtual_list","formDynamic","attrsName","attrsVal","disk_type","tabIndex","tabName","formDynamicNameData","isBtn","columns","columnsInstall","columnsInstal2","gridPic","xl","lg","md","sm","xs","gridBtn","currentIndex","formValidate","share","is_pack","disk_info","logistics","freight","postage","recommend","presale_day","presale","is_limit","limit_type","limit_num","vip_product","custom_form","store_name","cate_id","label_id","keyword","unit_name","store_info","image","recommend_image","slider_image","description","ficti","give_integral","sort","is_show","is_gift","gift_price","is_hot","is_benefit","is_best","is_new","is_good","is_postage","is_sub","recommend_list","params_list","virtual_type","spec_type","is_virtual","video_link","temp_id","attrs","items","activity","couponName","selectRule","coupon_ids","command_word","min_qty","label_list","protection_list","ruleList","templateList","createBnt","showIput","manyFormValidate","oneFormValidate","brokerage","brokerage_two","vip_price","coupon_id","images","imagesTable","currentTab","isChoice","loading","modalPic","addVirtualModel","template","uploadList","treeSelect","picTit","tableIndex","ruleValidate","manyBrokerage","undefined","manyBrokerageTwo","manyVipPrice","manyVipDiscount","upload","videoIng","progress","videoLink","默认","秒杀","砍价","拼团","updateIds","updateName","couponIds","couponNames","rakeBack","title","slot","align","width","member","columnsInstalM","moveIndex","addValue","visible","typeConfig","goodsType","paramsTypeList","paramsType","canSel","changeAttrValue","tableKey","protectionList","labelList","tileLabelList","computed","_objectSpread","labelWidth","isMobile","labelPosition","labelBottom","watch","val","length","filter","item","includes","beforeRouteUpdate","to","from","next","bus","$emit","$route","path","created","slice","getToken","mounted","_this","_asyncToGenerator","_regenerator","m","_callee","w","_context","n","params","getInfo","getProductCache","getproductLabelUseListApi","query","goodsCategory","productGetRule","productGetTemplate","paramsGetTemplate","productConfig","watchActivity","getProtectionList","a","methods","_this2","then","res","info","Array","isArray","map","Number","ids","coupons","push","generateHeader","add_pic","virtualbtn","catch","err","$message","error","msg","_this3","page","limit","status","list","_this4","flatMap","el","re","label","active","addProtection","$router","$routeProStr","_this5","beforeUpload","file","videoSaveToUrl","_this6","pieceSize","success","file_path","e","uploading","chunk","allChunk","st","Math","floor","index","_this7","generate","baseHeadTabs","virtualHeadTabs","addCate","_this8","$modalForm","logisticsBtn","addLabel","_this9","addGoodsTag","customMessBtn","addcustom","warning","delcustom","splice","onchangeTime","presale_time","getEditorContent","cancel","upFile","_this0","src","concat","_this1","infoData","isCopy","_this10","attr","vip_proportion","toFixed","_toConsumableArray","setTimeout","checkAllGroup","onClose","checkMove","evt","draggedContext","end","checkAllGroupChange","endLength","indexOf","addCoupon","$refs","couponTemplates","isTemplate","tableList","see","goodsCoupon","changeDiscount","arguments","changeVipPrice","addGoodsCoupon","addVirtual","upVirtual","i","element","$set","closeVirtual","uniqueArray","arr","seen","JSON","stringify","nameId","names","goodsCouponId","handleClose","addTemp","templates","addVideo","_this11","$videoModal","delVideo","zh_uploadFile","refid","click","zh_uploadFile_change","evfile","_this12","suffix","target","files","substr","types","contentType","$videoCloud","videoUpload","url","upTab","toString","downTab","userSearchs","addRule","addattr","modal","brokerageSetUp","_iterator","_createForOfIteratorHelper","_step","s","done","f","vipPriceSetUp","_iterator2","_step2","handleAdd","initVirtualData","removeVirtual","batchDel","confirm","_this13","trim","forEach","rule_name","rule_value","generateAttr","handleCommand","_this14","_this15","_this16","changeParamsType","getParams","_this17","isSubset","arr1","arr2","set1","Set","set2","_iterator3","_step3","elem","has","batchAdd","_this18","_iterator4","_step4","batchFields","_iterator5","_step5","_loop","batch","attr_arr","field","changeSpecImg","img","_this19","isHas","$confirm","confirmButtonText","cancelButtonText","_iterator6","_step6","_iterator7","_step7","clearAttr","handleRemoveRole","delAttrTable","handleRemove2","handleAddRole","detail","handleAddParams","handleSaveAsTemplate","_this20","$prompt","_ref","spec","addOneAttr","val2","handleFocus","handleBlur","handleSelImg","_this21","$imgModal","att_dir","handleRemoveImg","attrChangeValue","_this22","Object","keys","attrDetailChangeValue","_this23","findIndex","addPic","_this24","ii","onMoveSpec","changeCurrentIndex","_this25","specificationsColumns","minWidth","fixed","_this26","combinations","generateCombinations","console","log","virtualType","rows","batchSize","ceil","_loop2","d","generateAttrBatch","_this27","existingItems","combination","row","is_default_select","unique","coupon_name","matchedItem","find","assign","_defineProperty","picItem","changeDefaultSelect","changeDefaultShow","_this28","prefix","_arr","_toArray","first","rest","createAttr","num","idx","_this29","isExist","some","specStock","doClose","doShow","handleShowPop","focus","_this30","changeSpec","_this31","_this32","_ref2","_callee2","_context2","productInfo","_x","apply","handleRemove","changeCancel","modalPicTap","getPic","pc","deleteRow","getPicD","_this33","handleSubmit","_this34","validate","valid","parse","shift","activeIds","is_copy","_ref3","_callee3","_context3","_x2","changeTemplate","prop","handleDragStart","dragging","handleDragEnd","handleDragOver","dataTransfer","dropEffect","handleDragEnter","effectAllowed","newItems","dst","Map","product_id","set","getProductId","changeGoods","goodslist","getList","activeData","activeLabel","labelClose","closeLabel","openLabel","handleRemoveRecommend","marketing","permissionMap"],"sources":["src/pages/product/productAdd/index.vue"],"sourcesContent":["<template>\r\n <div class=\"\" id=\"shopp-manager\" v-loading=\"spinShow\">\r\n <pages-header\r\n ref=\"pageHeader\"\r\n :title=\"$route.params.id ? '编辑商品' : '添加商品'\"\r\n :backUrl=\"$routeProStr + '/product/product_list'\"\r\n ></pages-header>\r\n <el-card :bordered=\"false\" shadow=\"never\" class=\"mt16\" :body-style=\"{ padding: '0px 20px' }\">\r\n <el-tabs v-model=\"currentTab\">\r\n <el-tab-pane v-for=\"(item, index) in headTab\" :key=\"index\" :label=\"item.tit\" :name=\"item.name\"></el-tab-pane>\r\n </el-tabs>\r\n <el-form\r\n class=\"formValidate mt20\"\r\n ref=\"formValidate\"\r\n :rules=\"ruleValidate\"\r\n :model=\"formValidate\"\r\n :label-width=\"labelWidth\"\r\n :label-position=\"labelPosition\"\r\n @submit.native.prevent\r\n >\r\n <!-- 基础信息-->\r\n <basic-info\r\n v-show=\"currentTab === '1'\"\r\n :isCai=\"type\"\r\n :formValidate=\"formValidate\"\r\n :goodsType=\"goodsType\"\r\n :treeSelect=\"treeSelect\"\r\n :tileLabelList=\"tileLabelList\"\r\n :progress=\"progress\"\r\n :upload=\"upload\"\r\n :videoIng=\"videoIng\"\r\n @virtualbtn=\"virtualbtn\"\r\n @handleDragStart=\"handleDragStart\"\r\n @handleDragOver=\"handleDragOver\"\r\n @handleDragEnter=\"handleDragEnter\"\r\n @handleDragEnd=\"handleDragEnd\"\r\n @handleRemove=\"handleRemove\"\r\n @modalPicTap=\"modalPicTap\"\r\n @addVideo=\"addVideo\"\r\n @delVideo=\"delVideo\"\r\n @addCate=\"addCate\"\r\n @addGoodsTag=\"addGoodsTag\"\r\n ></basic-info>\r\n\r\n <!-- 规格库存-->\r\n <spec-stock\r\n ref=\"specStock\"\r\n v-show=\"currentTab === '2'\"\r\n :formValidate=\"formValidate\"\r\n :ruleList=\"ruleList\"\r\n :attrs=\"attrs\"\r\n :manyFormValidate=\"manyFormValidate\"\r\n :oneFormValidate=\"oneFormValidate\"\r\n :tableKey=\"tableKey\"\r\n :oneFormBatch=\"oneFormBatch\"\r\n :formDynamic=\"formDynamic\"\r\n :canSel=\"canSel\"\r\n @changeSpec=\"changeSpec\"\r\n @confirm=\"confirm\"\r\n @onMoveSpec=\"onMoveSpec\"\r\n @changeCurrentIndex=\"changeCurrentIndex\"\r\n @handleRemoveRole=\"handleRemoveRole\"\r\n @attrChangeValue=\"attrChangeValue\"\r\n @handleFocus=\"handleFocus\"\r\n @addPic=\"addPic\"\r\n @handleRemove2=\"handleRemove2\"\r\n @attrDetailChangeValue=\"attrDetailChangeValue\"\r\n @handleBlur=\"handleBlur\"\r\n @handleSelImg=\"handleSelImg\"\r\n @handleRemoveImg=\"handleRemoveImg\"\r\n @handleShowPop=\"handleShowPop\"\r\n @createAttr=\"createAttr\"\r\n @handleAddRole=\"handleAddRole\"\r\n @handleSaveAsTemplate=\"handleSaveAsTemplate\"\r\n @batchAdd=\"batchAdd\"\r\n @batchDel=\"batchDel\"\r\n @modalPicTap=\"modalPicTap\"\r\n @changeDefaultSelect=\"changeDefaultSelect\"\r\n @changeDefaultShow=\"changeDefaultShow\"\r\n @addGoodsCoupon=\"addGoodsCoupon\"\r\n @see=\"see\"\r\n @addVirtual=\"addVirtual\"\r\n ></spec-stock>\r\n\r\n <!-- 商品详情-->\r\n <product-detail\r\n v-show=\"currentTab === '3'\"\r\n :contents=\"contents\"\r\n :content=\"content\"\r\n @getEditorContent=\"getEditorContent\"\r\n ></product-detail>\r\n\r\n <!-- 物流设置-->\r\n <logistics-setting\r\n v-show=\"headTab.length === 7 ? currentTab === '4' : false\"\r\n :formValidate=\"formValidate\"\r\n :templateList=\"templateList\"\r\n @logisticsBtn=\"logisticsBtn\"\r\n @addTemp=\"addTemp\"\r\n ></logistics-setting>\r\n\r\n <!-- 会员价/佣金 -->\r\n <price-commission\r\n v-show=\"headTab.length === 7 ? currentTab === '5' : currentTab === '4'\"\r\n :formValidate=\"formValidate\"\r\n :oneFormValidate=\"oneFormValidate\"\r\n :manyFormValidate=\"manyFormValidate\"\r\n :columnsInstall=\"columnsInstall\"\r\n :columnsInstal2=\"columnsInstal2\"\r\n :manyBrokerage.sync=\"manyBrokerage\"\r\n :manyBrokerageTwo.sync=\"manyBrokerageTwo\"\r\n :manyVipPrice.sync=\"manyVipPrice\"\r\n :manyVipDiscount.sync=\"manyVipDiscount\"\r\n @checkAllGroupChange=\"checkAllGroupChange\"\r\n @changeVipPrice=\"changeVipPrice\"\r\n @changeDiscount=\"changeDiscount\"\r\n @brokerageSetUp=\"brokerageSetUp\"\r\n ></price-commission>\r\n\r\n <!-- 营销设置-->\r\n <marketing-setting\r\n v-show=\"headTab.length === 7 ? currentTab === '6' : currentTab === '5'\"\r\n :formValidate=\"formValidate\"\r\n :couponName=\"couponName\"\r\n :dataLabel=\"dataLabel\"\r\n :activity=\"activity\"\r\n @handleClose=\"handleClose\"\r\n @addCoupon=\"addCoupon\"\r\n @openLabel=\"openLabel\"\r\n @closeLabel=\"closeLabel\"\r\n @addLabel=\"addLabel\"\r\n @onchangeTime=\"onchangeTime\"\r\n @handleRemoveRecommend=\"handleRemoveRecommend\"\r\n @changeGoods=\"changeGoods\"\r\n ></marketing-setting>\r\n\r\n <!-- 其他设置-->\r\n <other-setting\r\n v-show=\"headTab.length === 7 ? currentTab === '7' : currentTab === '6'\"\r\n :formValidate=\"formValidate\"\r\n :customBtn.sync=\"customBtn\"\r\n :paramsType=\"paramsType\"\r\n :paramsTypeList=\"paramsTypeList\"\r\n :protectionList=\"protectionList\"\r\n :CustomList=\"CustomList\"\r\n @modalPicTap=\"modalPicTap\"\r\n @changeParamsType=\"changeParamsType\"\r\n @deleteRow=\"deleteRow\"\r\n @handleAddParams=\"handleAddParams\"\r\n @addProtection=\"addProtection\"\r\n @customMessBtn=\"customMessBtn\"\r\n @delcustom=\"delcustom\"\r\n @addcustom=\"addcustom\"\r\n ></other-setting>\r\n\r\n <el-form-item>\r\n <el-button v-if=\"currentTab !== '1'\" v-db-click @click=\"upTab\">上一步</el-button>\r\n <el-button\r\n class=\"submission\"\r\n v-if=\"currentTab !== '7' && formValidate.virtual_type == 0\"\r\n v-db-click\r\n @click=\"downTab\"\r\n >下一步</el-button\r\n >\r\n <el-button\r\n class=\"submission\"\r\n v-if=\"currentTab !== '6' && formValidate.virtual_type != 0\"\r\n v-db-click\r\n @click=\"downTab\"\r\n >下一步</el-button\r\n >\r\n <el-button\r\n type=\"primary\"\r\n class=\"submission\"\r\n v-db-click\r\n @click=\"handleSubmit('formValidate')\"\r\n v-if=\"$route.params.id || currentTab !== '1'\"\r\n >保存</el-button\r\n >\r\n </el-form-item>\r\n </el-form>\r\n <el-dialog :visible.sync=\"modalPic\" width=\"950px\" scrollable title=\"上传商品图\" :close-on-click-modal=\"false\">\r\n <uploadPictures\r\n :isChoice=\"isChoice\"\r\n @getPic=\"getPic\"\r\n @getPicD=\"getPicD\"\r\n :gridBtn=\"gridBtn\"\r\n :gridPic=\"gridPic\"\r\n v-if=\"modalPic\"\r\n ></uploadPictures>\r\n </el-dialog>\r\n <el-dialog\r\n :visible.sync=\"addVirtualModel\"\r\n width=\"720px\"\r\n title=\"添加卡密\"\r\n :show-close=\"true\"\r\n :close-on-click-modal=\"false\"\r\n @closed=\"initVirtualData\"\r\n >\r\n <div class=\"trip\"></div>\r\n <div class=\"type-radio\">\r\n <el-form label-width=\"85px\">\r\n <el-form-item label=\"卡密类型:\">\r\n <el-radio-group v-model=\"disk_type\" size=\"large\">\r\n <el-radio :label=\"1\">固定卡密</el-radio>\r\n <el-radio :label=\"2\">一次性卡密</el-radio>\r\n </el-radio-group>\r\n <div v-if=\"disk_type == 1\">\r\n <div class=\"stock-disk\">\r\n <el-input v-model=\"disk_info\" size=\"large\" type=\"textarea\" :rows=\"4\" placeholder=\"填写卡密信息\" />\r\n </div>\r\n <div class=\"stock-input\">\r\n <!-- <el-input type=\"number\" v-model=\"stock\" size=\"large\" :min='0' placeholder=\"填写库存数量\">\r\n <span slot=\"append\">件</span>\r\n </el-input> -->\r\n <el-input-number :controls=\"false\" :max=\"100000\" :min=\"1\" :step=\"1\" :precision=\"0\" v-model=\"stock\" />\r\n <span class=\"pl10\">件</span>\r\n </div>\r\n </div>\r\n <div class=\"scroll-virtual\" v-if=\"disk_type == 2\">\r\n <div class=\"virtual-data mb10\" v-for=\"(item, index) in virtualList\" :key=\"index\">\r\n <span class=\"mr10 virtual-title\">卡号{{ index + 1 }}:</span>\r\n <el-input\r\n class=\"mr10\"\r\n type=\"text\"\r\n v-model.trim=\"item.key\"\r\n style=\"width: 150px\"\r\n placeholder=\"请输入卡号(非必填)\"\r\n ></el-input>\r\n <span class=\"mr10 virtual-title\">卡密{{ index + 1 }}:</span>\r\n <el-input\r\n class=\"mr10\"\r\n type=\"text\"\r\n v-model.trim=\"item.value\"\r\n style=\"width: 150px\"\r\n placeholder=\"请输入卡密\"\r\n ></el-input>\r\n <span class=\"deteal-btn\" v-db-click @click=\"removeVirtual(index)\">删除</span>\r\n </div>\r\n </div>\r\n <div class=\"add-more\" v-if=\"disk_type == 2\">\r\n <el-button class=\"h-33\" type=\"primary\" v-db-click @click=\"handleAdd\">新增</el-button>\r\n <el-upload\r\n class=\"ml10\"\r\n :action=\"cardUrl\"\r\n :data=\"uploadData\"\r\n :headers=\"header\"\r\n :on-success=\"upFile\"\r\n :before-upload=\"beforeUpload\"\r\n >\r\n <el-button>导入卡密</el-button>\r\n </el-upload>\r\n </div>\r\n </el-form-item>\r\n </el-form>\r\n </div>\r\n <span slot=\"footer\" class=\"dialog-footer\">\r\n <el-button v-db-click @click=\"closeVirtual\">取 消</el-button>\r\n <el-button type=\"primary\" v-db-click @click=\"upVirtual\">确 定</el-button>\r\n </span>\r\n </el-dialog>\r\n </el-card>\r\n <freightTemplate\r\n :template=\"template\"\r\n v-on:changeTemplate=\"changeTemplate\"\r\n @addSuccess=\"productGetTemplate\"\r\n ref=\"templates\"\r\n ></freightTemplate>\r\n <add-attr ref=\"addattr\" @getList=\"userSearchs\"></add-attr>\r\n <coupon-list\r\n ref=\"couponTemplates\"\r\n @nameId=\"nameId\"\r\n :couponids=\"formValidate.coupon_ids\"\r\n :updateIds=\"updateIds\"\r\n :updateName=\"updateName\"\r\n ></coupon-list>\r\n <coupon-list ref=\"goodsCoupon\" many=\"one\" :luckDraw=\"true\" @getCouponId=\"goodsCouponId\"></coupon-list>\r\n <!-- 生成淘宝京东表单-->\r\n <el-dialog\r\n :visible.sync=\"modals\"\r\n @closed=\"cancel\"\r\n class=\"Box\"\r\n title=\"复制淘宝、天猫、京东、苏宁、1688\"\r\n :close-on-click-modal=\"false\"\r\n width=\"720px\"\r\n >\r\n <tao-bao ref=\"taobaos\" v-if=\"modals\" @on-close=\"onClose\"></tao-bao>\r\n </el-dialog>\r\n <el-dialog :visible.sync=\"goods_modals\" title=\"商品列表\" footerHide class=\"paymentFooter\" scrollable width=\"1000px\">\r\n <goods-list v-if=\"goods_modals\" ref=\"goodslist\" :ischeckbox=\"true\" @getProductId=\"getProductId\"></goods-list>\r\n </el-dialog>\r\n <!-- 用户标签 -->\r\n <el-dialog\r\n :visible.sync=\"labelShow\"\r\n title=\"请选择用户标签\"\r\n :show-close=\"true\"\r\n width=\"540px\"\r\n :close-on-click-modal=\"false\"\r\n >\r\n <userLabel ref=\"userLabel\" @activeData=\"activeData\" @close=\"labelClose\"></userLabel>\r\n </el-dialog>\r\n <!-- 商品标签 -->\r\n <el-dialog\r\n :visible.sync=\"tagShow\"\r\n title=\"请选择商品标签\"\r\n :show-close=\"true\"\r\n width=\"540px\"\r\n :close-on-click-modal=\"false\"\r\n >\r\n <goodsLabel\r\n ref=\"goodsLabel\"\r\n :defaultLabelList=\"labelList\"\r\n @activeLabel=\"activeLabel\"\r\n @close=\"labelClose\"\r\n ></goodsLabel>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport userLabel from '@/components/labelList';\r\nimport useLabel from '@/components/goodsLabel/useLabel';\r\nimport goodsLabel from '@/components/goodsLabel';\r\nimport { mapState } from 'vuex';\r\nimport uploadPictures from '@/components/uploadPictures';\r\nimport freightTemplate from '@/components/freightTemplate';\r\nimport couponList from '@/components/couponList';\r\nimport addAttr from '../productAttr/addAttr';\r\nimport goodsList from '@/components/goodsList/index';\r\nimport taoBao from './taoBao';\r\nimport { userLabelAddApi } from '@/api/user';\r\nimport {\r\n productInfoApi,\r\n cascaderListApi,\r\n productAddApi,\r\n generateAttrApi,\r\n productGetRuleApi,\r\n productGetTemplateApi,\r\n productGetTempKeysApi,\r\n checkActivityApi,\r\n productCache,\r\n cacheDelete,\r\n uploadType,\r\n importCard,\r\n productCreateApi,\r\n getProductTypeConfig,\r\n ruleAddApi,\r\n paramListApi,\r\n paramInfoApi,\r\n productProtectionListApi,\r\n productLabelUseListApi,\r\n} from '@/api/product';\r\nimport Setting from '@/setting';\r\nimport { getCookies } from '@/libs/util';\r\nimport { uploadByPieces } from '@/utils/upload'; //引入uploadByPieces方法\r\nimport { isFileUpload, isVideoUpload, arraysEqual } from '@/utils';\r\nimport checkArray from '@/libs/permission';\r\nimport {\r\n GoodsTableHead,\r\n VirtualTableHead,\r\n VirtualTableHead2,\r\n columns2,\r\n columns3,\r\n CustomList,\r\n RuleValidate,\r\n} from './defaultData.js';\r\nimport BasicInfo from './components/BasicInfo.vue';\r\nimport SpecStock from './components/SpecStock.vue';\r\nimport ProductDetail from './components/ProductDetail.vue';\r\nimport LogisticsSetting from './components/LogisticsSetting.vue';\r\nimport PriceCommission from './components/PriceCommission.vue';\r\nimport MarketingSetting from './components/MarketingSetting.vue';\r\nimport OtherSetting from './components/OtherSetting.vue';\r\nimport { formatRichText } from '@/utils/editorImg';\r\n\r\nexport default {\r\n name: 'ProductAdd',\r\n components: {\r\n uploadPictures,\r\n freightTemplate,\r\n addAttr,\r\n couponList,\r\n taoBao,\r\n goodsList,\r\n userLabel,\r\n goodsLabel,\r\n useLabel,\r\n BasicInfo,\r\n SpecStock,\r\n ProductDetail,\r\n LogisticsSetting,\r\n PriceCommission,\r\n MarketingSetting,\r\n OtherSetting,\r\n },\r\n data() {\r\n return {\r\n labelShow: false,\r\n tagShow: false,\r\n dataLabel: [],\r\n headTab: [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '物流设置', name: '4' },\r\n { tit: '会员价/佣金', name: '5' },\r\n { tit: '营销设置', name: '6' },\r\n { tit: '其他设置', name: '7' },\r\n ],\r\n virtual: [\r\n { tit: '普通商品', id: 0, tit2: '物流发货' },\r\n { tit: '卡密/网盘', id: 1, tit2: '自动发货' },\r\n { tit: '优惠券', id: 2, tit2: '自动发货' },\r\n { tit: '虚拟商品', id: 3, tit2: '虚拟发货' },\r\n ],\r\n seletVideo: 0, //选择视频类型\r\n customBtn: 0, //自定义留言开关\r\n content: '',\r\n contents: '',\r\n fileUrl: Setting.apiBaseURL + '/file/upload',\r\n fileUrl2: Setting.apiBaseURL + '/file/video_upload',\r\n cardUrl: Setting.apiBaseURL + '/file/upload/1',\r\n upload_type: '', //视频上传类型 1 本地上传 2 3 4 OSS上传\r\n uploadData: {}, // 上传参数\r\n header: {},\r\n type: 0,\r\n modals: false,\r\n goods_modals: false,\r\n spinShow: false,\r\n openSubimit: false,\r\n virtualList: [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ],\r\n // 批量设置表格data\r\n oneFormBatch: [\r\n {\r\n pic: '',\r\n price: void 0,\r\n cost: void 0,\r\n ot_price: void 0,\r\n stock: void 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: void 0,\r\n volume: void 0,\r\n virtual_list: [],\r\n },\r\n ],\r\n\r\n // 规格数据\r\n formDynamic: {\r\n attrsName: '',\r\n attrsVal: '',\r\n },\r\n disk_type: 1, //卡密类型\r\n tabIndex: 0,\r\n tabName: '',\r\n formDynamicNameData: [],\r\n isBtn: false,\r\n columns2: columns2,\r\n columns3: columns3,\r\n columns: [],\r\n columnsInstall: [],\r\n columnsInstal2: [],\r\n gridPic: {\r\n xl: 6,\r\n lg: 8,\r\n md: 12,\r\n sm: 12,\r\n xs: 12,\r\n },\r\n gridBtn: {\r\n xl: 4,\r\n lg: 8,\r\n md: 8,\r\n sm: 8,\r\n xs: 8,\r\n },\r\n //自定义留言下拉选择\r\n CustomList: CustomList,\r\n //自定义留言内容\r\n currentIndex: 0,\r\n\r\n formValidate: {\r\n share: 0,\r\n is_pack: 0,//是否报单\r\n disk_info: '', //卡密类型\r\n logistics: ['1'], //选择物流方式\r\n freight: 2, //运费设置\r\n postage: 0, //设置运费金额\r\n recommend: [], //商品推荐\r\n presale_day: 1, //预售发货时间-结束\r\n presale: false, //预售商品开关\r\n is_limit: false,\r\n limit_type: 0,\r\n limit_num: 0,\r\n vip_product: false, //付费会员专属开关\r\n custom_form: [], //自定义留言\r\n store_name: '',\r\n cate_id: [],\r\n label_id: [],\r\n keyword: '',\r\n unit_name: '',\r\n store_info: '',\r\n image: '',\r\n recommend_image: '',\r\n slider_image: [],\r\n description: '',\r\n ficti: 0,\r\n give_integral: 0,\r\n sort: 0,\r\n is_show: 1,\r\n is_gift: 0, // 开启送礼品\r\n gift_price: 0,\r\n is_hot: 0,\r\n is_benefit: 0,\r\n is_best: 0,\r\n is_new: 0,\r\n is_good: 0,\r\n is_postage: 0,\r\n is_sub: [],\r\n recommend_list: [],\r\n params_list: [], //商品参数\r\n virtual_type: 0,\r\n // is_sub: 0,\r\n id: 0,\r\n spec_type: 0,\r\n is_virtual: 0,\r\n video_link: '',\r\n // postage: 0,\r\n temp_id: '',\r\n attrs: [],\r\n items: [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n },\r\n ],\r\n activity: ['默认', '秒杀', '砍价', '拼团'],\r\n couponName: [],\r\n header: [],\r\n selectRule: '',\r\n coupon_ids: [],\r\n command_word: '',\r\n min_qty: 1,\r\n label_list: [],\r\n protection_list: [],\r\n },\r\n ruleList: [],\r\n templateList: [],\r\n createBnt: true,\r\n showIput: false,\r\n manyFormValidate: [],\r\n // 单规格表格data\r\n oneFormValidate: [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ],\r\n images: [],\r\n imagesTable: '',\r\n currentTab: '1',\r\n isChoice: '',\r\n loading: false,\r\n modalPic: false,\r\n addVirtualModel: false,\r\n template: false,\r\n uploadList: [],\r\n treeSelect: [],\r\n picTit: '',\r\n tableIndex: 0,\r\n ruleValidate: RuleValidate,\r\n manyBrokerage: undefined,\r\n manyBrokerageTwo: undefined,\r\n manyVipPrice: undefined,\r\n manyVipDiscount: undefined,\r\n upload: {\r\n videoIng: false, // 是否显示进度条;\r\n },\r\n videoIng: false, // 是否显示进度条;\r\n progress: 0, // 进度条默认0\r\n stock: 0,\r\n disk_info: '',\r\n videoLink: '',\r\n attrs: [],\r\n activity: { 默认: 'red', 秒杀: 'blue', 砍价: 'green', 拼团: 'yellow' },\r\n couponName: [],\r\n updateIds: [],\r\n updateName: [],\r\n couponIds: '',\r\n couponNames: [],\r\n rakeBack: [\r\n {\r\n title: '一级返佣(元)',\r\n slot: 'brokerage',\r\n align: 'center',\r\n width: 95,\r\n },\r\n {\r\n title: '二级返佣(元)',\r\n slot: 'brokerage_two',\r\n align: 'center',\r\n width: 95,\r\n },\r\n ],\r\n member: [\r\n {\r\n title: '会员价',\r\n slot: 'vip_price',\r\n align: 'center',\r\n width: 95,\r\n },\r\n {\r\n title: '会员折扣',\r\n slot: 'vip_proportion',\r\n align: 'center',\r\n width: 95,\r\n },\r\n ],\r\n columnsInstalM: [],\r\n moveIndex: '',\r\n addValue: '',\r\n visible: false,\r\n typeConfig: [],\r\n goodsType: [],\r\n paramsTypeList: [],\r\n paramsType: null,\r\n canSel: true, // 规格图片添加判断\r\n changeAttrValue: '', //修改的规格值\r\n tableKey: 0,\r\n protectionList: [], // 服务保障\r\n labelList: [],\r\n tileLabelList: [],\r\n };\r\n },\r\n computed: {\r\n ...mapState('media', ['isMobile']),\r\n labelWidth() {\r\n return this.isMobile ? undefined : '120px';\r\n },\r\n labelPosition() {\r\n return this.isMobile ? 'top' : 'right';\r\n },\r\n labelBottom() {\r\n return this.isMobile ? undefined : '15px';\r\n },\r\n },\r\n watch: {\r\n typeConfig(val) {\r\n if (val.length) {\r\n // 对virtual中的id等于val中的id的\r\n this.goodsType = this.virtual.filter((item) => {\r\n return val.includes(item.id + '');\r\n });\r\n } else {\r\n this.goodsType = this.virtual;\r\n }\r\n },\r\n },\r\n beforeRouteUpdate(to, from, next) {\r\n this.bus.$emit('onTagsViewRefreshRouterView', this.$route.path);\r\n next();\r\n },\r\n created() {\r\n this.columns = this.columns2.slice(0, 8);\r\n this.getToken();\r\n },\r\n async mounted() {\r\n if (this.$route.params.id !== '0' && this.$route.params.id) {\r\n await this.getInfo();\r\n } else if (this.$route.params.id === '0') {\r\n this.getProductCache();\r\n } else {\r\n this.getproductLabelUseListApi();\r\n }\r\n if (this.$route.query.type) {\r\n this.modals = true;\r\n this.type = this.$route.query.type;\r\n } else {\r\n this.type = 0;\r\n }\r\n this.goodsCategory();\r\n this.productGetRule();\r\n this.productGetTemplate();\r\n this.paramsGetTemplate();\r\n this.uploadType();\r\n this.productConfig();\r\n this.watchActivity();\r\n this.getProtectionList();\r\n },\r\n methods: {\r\n getProductCache() {\r\n productCache()\r\n .then((res) => {\r\n let data = res.data.info;\r\n this.getproductLabelUseListApi();\r\n\r\n if (!Array.isArray(data)) {\r\n let cate_id = data.cate_id.map(Number);\r\n let label_id = data.label_id.map(Number);\r\n this.attrs = data.items || [];\r\n let ids = [];\r\n if (data.coupons) {\r\n data.coupons.map((item) => {\r\n ids.push(item.id);\r\n });\r\n this.couponName = data.coupons;\r\n }\r\n\r\n this.formValidate = data;\r\n this.dataLabel = data.label_id;\r\n this.formValidate.coupon_ids = ids;\r\n this.updateIds = ids;\r\n this.updateName = data.coupons;\r\n this.formValidate.cate_id = cate_id;\r\n this.oneFormValidate = data.attrs;\r\n this.generateHeader(this.attrs);\r\n this.formValidate.logistics = data.logistics || ['1'];\r\n this.formValidate.header = [];\r\n this.manyFormValidate = data.attrs;\r\n this.spec_type = data.spec_type;\r\n this.formValidate.is_virtual = data.is_virtual;\r\n this.formValidate.custom_form = data.custom_form || [];\r\n if (this.formValidate.custom_form.length != 0) {\r\n this.customBtn = 1;\r\n }\r\n this.attrs.map((item) => {\r\n if (item.add_pic) this.canSel = false;\r\n });\r\n this.virtualbtn(data.virtual_type, 1);\r\n if (data.spec_type === 0) {\r\n this.manyFormValidate = [];\r\n } else {\r\n this.createBnt = true;\r\n this.oneFormValidate = [\r\n {\r\n pic: data.image,\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ];\r\n }\r\n this.watchActivity();\r\n this.spinShow = false;\r\n }\r\n })\r\n .catch((err) => {\r\n this.$message.error(err.msg);\r\n });\r\n },\r\n getProtectionList() {\r\n productProtectionListApi({ page: 0, limit: 0, status: 1 }).then((res) => {\r\n this.protectionList = res.data.list;\r\n });\r\n },\r\n getproductLabelUseListApi() {\r\n productLabelUseListApi().then((res) => {\r\n // 合并数组中所有的list\r\n this.tileLabelList = res.data.flatMap((item) => item.list);\r\n let labelList = res.data;\r\n if (this.formValidate.label_list.length) {\r\n this.formValidate.label_list.map((el) => {\r\n labelList.map((re) => {\r\n re.list.map((label) => {\r\n if (label.id === el) {\r\n label.active = true;\r\n } else {\r\n label.active = false;\r\n }\r\n });\r\n });\r\n });\r\n } else {\r\n labelList.map((el) => {\r\n el.list.map((label) => {\r\n label.active = false;\r\n });\r\n });\r\n }\r\n this.labelList = labelList;\r\n });\r\n },\r\n addProtection() {\r\n this.$router.push({ path: this.$routeProStr + '/product/protection/list' });\r\n },\r\n productConfig() {\r\n getProductTypeConfig().then((res) => {\r\n this.typeConfig = res.data;\r\n });\r\n },\r\n beforeUpload(file) {\r\n return isFileUpload(file);\r\n },\r\n // 分片上传\r\n videoSaveToUrl(file) {\r\n if (isVideoUpload(file)) {\r\n uploadByPieces({\r\n file: file, // 视频实体\r\n pieceSize: 3, // 分片大小\r\n success: (data) => {\r\n this.formValidate.video_link = data.file_path;\r\n this.progress = 100;\r\n },\r\n error: (e) => {\r\n this.$message.error(e.msg);\r\n },\r\n uploading: (chunk, allChunk) => {\r\n this.videoIng = true;\r\n let st = Math.floor((chunk / allChunk) * 100);\r\n this.progress = st;\r\n },\r\n });\r\n }\r\n return false;\r\n },\r\n // 类型选择/填入内容判断\r\n virtualbtn(index, type) {\r\n if (type != 1) {\r\n if (this.$route.params.id) return this.$message.error('编辑商品不支持切换商品类型');\r\n this.formValidate.is_sub = [];\r\n let id = this.$route.params.id;\r\n if (id) {\r\n checkActivityApi(id)\r\n .then((res) => {})\r\n .catch((res) => {\r\n this.formValidate.spec_type = this.spec_type;\r\n this.$message.error(res.msg);\r\n });\r\n } else {\r\n if (this.formValidate.spec_type == 1) {\r\n this.generate(1);\r\n }\r\n }\r\n }\r\n // 定义基础商品和虚拟商品的标签页配置\r\n const baseHeadTabs = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '物流设置', name: '4' },\r\n { tit: '会员价/佣金', name: '5' },\r\n { tit: '营销设置', name: '6' },\r\n { tit: '其他设置', name: '7' },\r\n ];\r\n const virtualHeadTabs = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '会员价/佣金', name: '4' },\r\n { tit: '营销设置', name: '5' },\r\n { tit: '其他设置', name: '6' },\r\n ];\r\n\r\n switch (index) {\r\n case 0: // 普通商品\r\n this.formValidate.virtual_type = 0;\r\n this.formValidate.is_virtual = 0;\r\n this.headTab = baseHeadTabs;\r\n break;\r\n\r\n case 1: // 卡密/网盘商品\r\n this.formValidate.virtual_type = 1;\r\n this.formValidate.postage = 0;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = virtualHeadTabs;\r\n break;\r\n\r\n case 2: // 优惠券商品\r\n this.formValidate.virtual_type = 2;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = virtualHeadTabs;\r\n break;\r\n\r\n case 3: // 虚拟商品\r\n this.formValidate.virtual_type = 3;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = virtualHeadTabs;\r\n break;\r\n }\r\n },\r\n // 新增分类\r\n addCate() {\r\n this.$modalForm(productCreateApi()).then(() => this.goodsCategory());\r\n },\r\n // 物流方式选择\r\n logisticsBtn(e) {\r\n this.formValidate.logistics = e;\r\n },\r\n // 新增标签\r\n addLabel() {\r\n this.$modalForm(userLabelAddApi(0)).then(() => this.userLabel());\r\n },\r\n // 选择标签\r\n addGoodsTag() {\r\n this.tagShow = true;\r\n },\r\n // 自定义留言 开启关闭\r\n customMessBtn(e) {\r\n if (!e) {\r\n this.formValidate.custom_form = [];\r\n }\r\n this.customBtn = e;\r\n },\r\n // 自定义留言 新增表单\r\n addcustom() {\r\n if (this.formValidate.custom_form.length > 9) {\r\n this.$message.warning('最多添加10条');\r\n } else {\r\n this.formValidate.custom_form.push({\r\n title: '',\r\n label: 'text',\r\n value: '',\r\n status: false,\r\n });\r\n }\r\n },\r\n // 删除\r\n delcustom(index) {\r\n this.formValidate.custom_form.splice(index, 1);\r\n },\r\n // 预售具体日期\r\n onchangeTime(e) {\r\n this.formValidate.presale_time = e;\r\n },\r\n // 商品详情\r\n getEditorContent(data) {\r\n this.content = data;\r\n },\r\n cancel() {\r\n this.modals = false;\r\n },\r\n // 上传头部token\r\n getToken() {\r\n this.header['Authori-zation'] = 'Bearer ' + getCookies('token');\r\n },\r\n // 导入卡密\r\n upFile(res) {\r\n importCard({ file: res.data.src }).then((res) => {\r\n this.virtualList = this.virtualList.concat(res.data);\r\n });\r\n },\r\n //获取视频上传类型\r\n uploadType() {\r\n uploadType().then((res) => {\r\n this.upload_type = res.data.upload_type;\r\n });\r\n },\r\n // 初始化数据展示\r\n infoData(data, isCopy) {\r\n let cate_id = data.cate_id.map(Number);\r\n let label_id = data.label_id.map(Number);\r\n this.attrs = data.items || [];\r\n let ids = [];\r\n data.coupons.map((item) => {\r\n ids.push(item.id);\r\n });\r\n this.formValidate = data;\r\n this.seletVideo = data.seletVideo;\r\n this.contents = data.description;\r\n this.couponName = data.coupons;\r\n this.formValidate.coupon_ids = ids;\r\n this.updateIds = ids;\r\n this.dataLabel = data.label_id;\r\n this.updateName = data.coupons;\r\n this.virtualbtn(data.virtual_type, 1);\r\n this.formValidate.logistics = data.logistics || ['1'];\r\n this.formValidate.custom_form = data.custom_form || [];\r\n if (this.formValidate.custom_form.length != 0) {\r\n this.customBtn = 1;\r\n }\r\n this.formValidate.cate_id = cate_id;\r\n if (data.attr) {\r\n this.oneFormValidate = [data.attr];\r\n this.oneFormValidate[0].vip_proportion = (\r\n (this.oneFormValidate[0].vip_price / this.oneFormValidate[0].price) *\r\n 100\r\n ).toFixed(2);\r\n }\r\n this.getproductLabelUseListApi();\r\n\r\n this.formValidate.header = [];\r\n this.spec_type = data.spec_type;\r\n this.formValidate.spec_type = this.spec_type;\r\n this.formValidate.is_virtual = data.is_virtual;\r\n this.attrs.map((item) => {\r\n if (item.add_pic) this.canSel = false;\r\n });\r\n if (data.spec_type === 0) {\r\n this.manyFormValidate = [];\r\n } else {\r\n this.createBnt = true;\r\n this.oneFormValidate = [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ];\r\n\r\n this.generateHeader(this.attrs);\r\n this.manyFormValidate = [...this.oneFormBatch, ...data.attrs];\r\n }\r\n\r\n setTimeout((e) => {\r\n this.checkAllGroup(data.is_sub);\r\n }, 1000);\r\n this.watchActivity();\r\n },\r\n //关闭淘宝弹窗并生成数据;\r\n onClose(data) {\r\n this.modals = false;\r\n this.infoData(data, 1);\r\n },\r\n\r\n checkMove(evt) {\r\n this.moveIndex = evt.draggedContext.index;\r\n },\r\n end() {\r\n this.moveIndex = '';\r\n this.generate(1);\r\n },\r\n // 单独设置会员设置\r\n checkAllGroupChange(data) {\r\n this.checkAllGroup(data);\r\n },\r\n checkAllGroup(data) {\r\n let endLength = this.attrs.length + 3;\r\n if (this.formValidate.spec_type === 0) {\r\n if (data.length === 2) {\r\n this.columnsInstall = this.columns2.slice(0, endLength).concat(this.rakeBack).concat(this.member);\r\n } else if (data.indexOf(0) > -1) {\r\n this.columnsInstall = this.columns2.slice(0, endLength).concat(this.member);\r\n } else if (data.indexOf(1) > -1) {\r\n this.columnsInstall = this.columns2.slice(0, endLength).concat(this.rakeBack);\r\n } else {\r\n this.columnsInstall = this.columns2.slice(0, endLength);\r\n }\r\n } else {\r\n if (data.length === 2) {\r\n this.columnsInstal2 = this.columnsInstalM\r\n .slice(0, endLength + 1)\r\n .concat(this.rakeBack)\r\n .concat(this.member);\r\n } else if (data.indexOf(0) > -1) {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, endLength).concat(this.member);\r\n } else if (data.indexOf(1) > -1) {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, endLength).concat(this.rakeBack);\r\n } else {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, endLength);\r\n }\r\n }\r\n },\r\n // 添加优惠券\r\n addCoupon() {\r\n this.$refs.couponTemplates.isTemplate = true;\r\n this.$refs.couponTemplates.tableList();\r\n },\r\n // 规格中优惠券查看\r\n see(data, name, index) {\r\n this.tabName = name;\r\n this.tabIndex = index;\r\n\r\n if (this.formValidate.virtual_type === 1) {\r\n if (data.disk_info != '') {\r\n this.disk_type = 1;\r\n this.disk_info = data.disk_info;\r\n this.stock = data.stock;\r\n } else if (data.virtual_list.length) {\r\n this.disk_type = 2;\r\n this.virtualList = data.virtual_list;\r\n }\r\n this.addVirtualModel = true;\r\n } else {\r\n this.$refs.goodsCoupon.isTemplate = true;\r\n this.$refs.goodsCoupon.tableList(3);\r\n }\r\n },\r\n // 修改分佣比例\r\n changeDiscount(index, type = 'manyFormValidate') {\r\n // 根据分佣比例 vip_proportion 修改会员价 保留2位小数\r\n this[type][index].vip_price = (this[type][index].price * (this[type][index].vip_proportion / 100)).toFixed(2);\r\n },\r\n // 修改会员价\r\n changeVipPrice(index, type = 'manyFormValidate') {\r\n // 根据会员价计算出分佣比例\r\n this[type][index].vip_proportion = ((this[type][index].vip_price / this[type][index].price) * 100).toFixed(2);\r\n },\r\n // 添加优惠券\r\n addGoodsCoupon(index, name) {\r\n this.tabIndex = index;\r\n this.tabName = name;\r\n this.$refs.goodsCoupon.isTemplate = true;\r\n this.$refs.goodsCoupon.tableList(3);\r\n },\r\n addVirtual(index, name) {\r\n this.tabIndex = index;\r\n this.tabName = name;\r\n this.addVirtualModel = true;\r\n },\r\n // 提交卡密信息\r\n upVirtual() {\r\n if (this.disk_type == 2) {\r\n for (let i = 0; i < this.virtualList.length; i++) {\r\n const element = this.virtualList[i];\r\n if (!element.value) {\r\n this.$message.error('请输入所有卡密');\r\n return;\r\n }\r\n }\r\n this.$set(this[this.tabName][this.tabIndex], 'virtual_list', this.virtualList);\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', this.virtualList.length);\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n this.$set(this[this.tabName][this.tabIndex], 'disk_info', '');\r\n } else {\r\n if (!this.disk_info.length) {\r\n return this.$message.error('请填写卡密信息');\r\n }\r\n if (!this.stock) {\r\n return this.$message.error('请填写库存数量');\r\n }\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', Number(this.stock));\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', Number(this.stock));\r\n this.$set(this[this.tabName][this.tabIndex], 'disk_info', this.disk_info);\r\n this.$set(this[this.tabName][this.tabIndex], 'virtual_list', []);\r\n }\r\n this.addVirtualModel = false;\r\n this.closeVirtual();\r\n },\r\n // 初始化卡密数据信息\r\n closeVirtual() {\r\n this.addVirtualModel = false;\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n this.disk_info = '';\r\n this.stock = 0;\r\n },\r\n //对象数组去重;\r\n uniqueArray(arr) {\r\n const seen = {};\r\n return arr.filter((item) => {\r\n const key = JSON.stringify(item); // 使用 JSON.stringify 生成唯一键\r\n if (seen[key]) {\r\n return false;\r\n } else {\r\n seen[key] = true;\r\n return true;\r\n }\r\n });\r\n },\r\n // 获取优惠券id数据\r\n nameId(id, names) {\r\n this.formValidate.coupon_ids = id;\r\n this.couponName = this.uniqueArray(names);\r\n },\r\n // 获取优惠券信息\r\n goodsCouponId(data) {\r\n this.$set(this[this.tabName][this.tabIndex], 'coupon_id', data.id);\r\n this.$set(this[this.tabName][this.tabIndex], 'coupon_name', data.title);\r\n this.$refs.goodsCoupon.isTemplate = false;\r\n },\r\n handleClose(name) {\r\n let index = this.couponName.indexOf(name);\r\n this.couponName.splice(index, 1);\r\n let couponIds = this.formValidate.coupon_ids;\r\n couponIds.splice(index, 1);\r\n this.updateIds = couponIds;\r\n this.updateName = this.couponName;\r\n },\r\n // 添加运费模板\r\n addTemp() {\r\n this.$refs.templates.isTemplate = true;\r\n },\r\n addVideo() {\r\n this.$videoModal((e) => {\r\n this.formValidate.video_link = e;\r\n });\r\n },\r\n // 删除视频;\r\n delVideo() {\r\n this.$set(this.formValidate, 'video_link', '');\r\n this.$set(this, 'progress', 0);\r\n this.videoIng = false;\r\n this.upload.videoIng = false;\r\n },\r\n zh_uploadFile() {\r\n if (this.seletVideo == 1) {\r\n this.formValidate.video_link = this.videoLink;\r\n } else {\r\n this.$refs.refid.click();\r\n }\r\n },\r\n // 上传视频\r\n zh_uploadFile_change(evfile) {\r\n let suffix = evfile.target.files[0].name.substr(evfile.target.files[0].name.indexOf('.'));\r\n if (suffix.indexOf('.mp4') === -1) {\r\n return this.$message.error('只能上传MP4文件');\r\n }\r\n let types = {\r\n key: evfile.target.files[0].name,\r\n contentType: evfile.target.files[0].type,\r\n };\r\n productGetTempKeysApi(types)\r\n .then((res) => {\r\n this.$videoCloud\r\n .videoUpload({\r\n type: res.data.type,\r\n evfile: evfile,\r\n res: res,\r\n uploading(status, progress) {\r\n this.upload.videoIng = status;\r\n if (res.status == 200) {\r\n this.progress = 100;\r\n }\r\n },\r\n })\r\n .then((res) => {\r\n this.formValidate.video_link = res.url;\r\n this.$message.success('视频上传成功');\r\n this.upload.videoIng = false;\r\n })\r\n .catch((res) => {\r\n this.$message.error(res);\r\n });\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 上一页;\r\n upTab() {\r\n this.currentTab = (Number(this.currentTab) - 1).toString();\r\n },\r\n // 下一页;\r\n downTab() {\r\n this.currentTab = (Number(this.currentTab) + 1).toString();\r\n },\r\n // 属性弹窗回调函数;\r\n userSearchs() {\r\n this.productGetRule();\r\n },\r\n // 添加规则;\r\n addRule() {\r\n this.$refs.addattr.modal = true;\r\n },\r\n // 批量设置分佣;\r\n brokerageSetUp() {\r\n if (this.formValidate.is_sub.indexOf(1) > -1) {\r\n if (this.manyBrokerage <= 0 || this.manyBrokerageTwo <= 0) {\r\n return this.$message.error('请填写返佣金额后进行批量添加');\r\n }\r\n } else if (this.formValidate.is_sub.indexOf(0) > -1) {\r\n if (this.manyVipPrice <= 0) {\r\n return this.$message.error('请填写会员价后进行批量添加');\r\n }\r\n }\r\n if (this.formValidate.is_sub.length === 2) {\r\n if (this.manyBrokerage <= 0 || this.manyBrokerageTwo <= 0) {\r\n return this.$message.error('请填写完金额后进行批量添加');\r\n }\r\n if (this.manyVipPrice > 0 && this.manyVipDiscount > 0) {\r\n return this.$message.error('会员价和会员折扣只能二选一添加');\r\n }\r\n }\r\n for (let val of this.manyFormValidate) {\r\n this.manyBrokerage != undefined && this.$set(val, 'brokerage', this.manyBrokerage);\r\n this.manyBrokerageTwo != undefined && this.$set(val, 'brokerage_two', this.manyBrokerageTwo);\r\n if (this.manyVipPrice != undefined) {\r\n this.$set(val, 'vip_price', this.manyVipPrice);\r\n this.$set(val, 'vip_proportion', ((val.vip_price / val.price) * 100).toFixed(2));\r\n } else {\r\n this.$set(val, 'vip_proportion', this.manyVipDiscount);\r\n this.$set(val, 'vip_price', (val.price * (this.manyVipDiscount / 100)).toFixed(2));\r\n }\r\n }\r\n },\r\n // 批量设置会员价\r\n vipPriceSetUp() {\r\n if (this.manyVipPrice <= 0) {\r\n return this.$message.error('请填写会员价在进行批量添加');\r\n } else {\r\n for (let val of this.manyFormValidate) {\r\n this.$set(val, 'vip_price', this.manyVipPrice);\r\n }\r\n }\r\n },\r\n // 新增卡密\r\n handleAdd() {\r\n this.virtualList.push({\r\n key: '',\r\n value: '',\r\n });\r\n },\r\n // 初始化卡密信息\r\n initVirtualData(status) {\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n },\r\n removeVirtual(index) {\r\n this.virtualList.splice(index, 1);\r\n },\r\n // 清空批量规格信息\r\n batchDel() {\r\n this.oneFormBatch = [\r\n {\r\n pic: '',\r\n price: void 0,\r\n cost: void 0,\r\n ot_price: void 0,\r\n stock: void 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: void 0,\r\n volume: void 0,\r\n virtual_list: [],\r\n },\r\n ];\r\n },\r\n confirm(name) {\r\n this.createBnt = true;\r\n this.formValidate.selectRule = name;\r\n this.attrs = [];\r\n if (this.formValidate.selectRule.trim().length <= 0) {\r\n return this.$message.error('请选择属性');\r\n }\r\n this.ruleList.forEach((item, index) => {\r\n if (item.rule_name === this.formValidate.selectRule) {\r\n this.attrs = [...item.rule_value];\r\n }\r\n });\r\n this.canSel = true;\r\n this.generateAttr(this.attrs);\r\n },\r\n // 选择规格模板\r\n handleCommand(e) {},\r\n // 获取商品属性模板;\r\n productGetRule() {\r\n productGetRuleApi().then((res) => {\r\n this.ruleList = res.data;\r\n });\r\n },\r\n // 获取运费模板;\r\n productGetTemplate() {\r\n productGetTemplateApi().then((res) => {\r\n this.templateList = res.data;\r\n });\r\n },\r\n paramsGetTemplate() {\r\n paramListApi().then((res) => {\r\n this.paramsTypeList = res.data.list;\r\n });\r\n },\r\n changeParamsType(e) {\r\n e ? this.getParams(e) : (this.formValidate.params_list = []);\r\n },\r\n getParams(id) {\r\n paramInfoApi(id).then((res) => {\r\n this.formValidate.params_list = res.data.value;\r\n });\r\n },\r\n isSubset(arr1, arr2) {\r\n // 将数组转换为 Set,以便进行高效的包含检查\r\n const set1 = new Set(arr1);\r\n const set2 = new Set(arr2);\r\n\r\n // 检查 set2 中的每个元素是否都在 set1 中\r\n for (let elem of set2) {\r\n if (!set1.has(elem)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n // 批量添加\r\n batchAdd() {\r\n let arr = [];\r\n for (let val of this.attrs) {\r\n if (this.oneFormBatch[0][val.value]) {\r\n arr.push(this.oneFormBatch[0][val.value]);\r\n }\r\n }\r\n\r\n // 批量设置商品规格属性\r\n const batchFields = [\r\n 'pic',\r\n 'price',\r\n 'cost',\r\n 'ot_price',\r\n 'stock',\r\n 'weight',\r\n 'volume',\r\n 'bar_code',\r\n 'bar_code_number',\r\n ];\r\n // const defaultFields = ['bar_code', 'bar_code_number'];\r\n\r\n for (let val of this.manyFormValidate) {\r\n const batch = this.oneFormBatch[0];\r\n // 如果存在筛选条件且满足条件,或无筛选条件时\r\n if (!arr.length || this.isSubset(val.attr_arr, arr)) {\r\n // 设置有值的批量字段\r\n batchFields.forEach((field) => {\r\n if (batch[field] && batch[field] !== undefined) {\r\n if (field === 'pic' && batch[field]) {\r\n this.$set(val, field, batch[field]);\r\n } else if (field != 'pic') {\r\n this.$set(val, field, batch[field]);\r\n }\r\n }\r\n });\r\n\r\n // 设置默认字段\r\n // defaultFields.forEach((field) => {\r\n // this.$set(val, field, batch[field]);\r\n // });\r\n }\r\n }\r\n },\r\n changeSpecImg(arr, img) {\r\n // 判断是否存在规格图\r\n let isHas = false;\r\n for (let i = 1; i < this.manyFormValidate.length; i++) {\r\n let item = this.manyFormValidate[i];\r\n if (item.pic && this.isSubset(item.attr_arr, arr)) {\r\n isHas = true;\r\n break;\r\n }\r\n }\r\n if (isHas) {\r\n this.$confirm('可以同步修改下方该规格图片,确定要替换吗?', '提示', {\r\n confirmButtonText: '替换',\r\n cancelButtonText: '暂不',\r\n type: 'warning',\r\n })\r\n .then(() => {\r\n for (let val of this.manyFormValidate) {\r\n if (this.isSubset(val.attr_arr, arr)) {\r\n this.$set(val, 'pic', img);\r\n }\r\n }\r\n })\r\n .catch(() => {});\r\n } else {\r\n for (let val of this.manyFormValidate) {\r\n if (this.isSubset(val.attr_arr, arr)) {\r\n this.$set(val, 'pic', img);\r\n }\r\n }\r\n }\r\n },\r\n // 立即生成\r\n generate(type, isCopy, arr) {\r\n this.manyFormValidate = [];\r\n this.formValidate.header = [];\r\n },\r\n clearAttr() {\r\n this.formDynamic.attrsName = '';\r\n this.formDynamic.attrsVal = '';\r\n },\r\n\r\n // 删除规格\r\n handleRemoveRole(index) {\r\n this.attrs.splice(index, 1);\r\n this.manyFormValidate.splice(index, 1);\r\n if (!this.attrs.length) {\r\n this.formValidate.header = [];\r\n this.manyFormValidate = [];\r\n } else {\r\n this.generateAttr(this.attrs);\r\n }\r\n },\r\n // 删除表格中 对应属性\r\n delAttrTable(val) {\r\n for (let i = 0; i < this.manyFormValidate.length; i++) {\r\n let item = this.manyFormValidate[i];\r\n if (item.attr_arr && item.attr_arr.includes(val)) {\r\n this.manyFormValidate.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n },\r\n // 删除属性\r\n handleRemove2(item, index, val) {\r\n // 删除 manyFormValidate中 title = item.value 的属性值\r\n item.splice(index, 1);\r\n // this.generateAttr(this.attrs);\r\n this.delAttrTable(val);\r\n },\r\n // 新增规格\r\n handleAddRole() {\r\n let data = {\r\n value: this.formDynamic.attrsName,\r\n add_pic: 0,\r\n detail: [],\r\n };\r\n this.attrs.push(data);\r\n },\r\n handleAddParams() {\r\n let data = {\r\n name: '',\r\n value: '',\r\n };\r\n this.formValidate.params_list.push(data);\r\n },\r\n handleSaveAsTemplate() {\r\n this.$prompt('', '请输入模板名称', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n })\r\n .then(({ value }) => {\r\n let spec = this.attrs.map((item) => {\r\n return {\r\n value: item.value,\r\n detail: item.detail.map((e) => e.value),\r\n };\r\n });\r\n let formDynamic = {\r\n rule_name: value,\r\n spec: spec,\r\n };\r\n ruleAddApi(formDynamic, 0)\r\n .then((res) => {\r\n this.$message.success(res.msg);\r\n this.productGetRule();\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n })\r\n .catch(() => {});\r\n },\r\n // 新增一条属性\r\n addOneAttr(val, val2) {\r\n this.generateAttr(this.attrs, val2);\r\n },\r\n handleFocus(val) {\r\n this.changeAttrValue = val;\r\n },\r\n handleBlur() {\r\n this.changeAttrValue = '';\r\n },\r\n handleSelImg(item) {\r\n this.$imgModal((e) => {\r\n item.pic = e.att_dir;\r\n this.changeSpecImg([item.value], e.att_dir);\r\n });\r\n },\r\n handleRemoveImg(item) {\r\n item.pic = '';\r\n },\r\n // 规格名称改变\r\n attrChangeValue(i, val) {\r\n if (val.trim().length && this.attrs[i].detail.length) {\r\n this.generateHeader(this.attrs);\r\n if (this.manyFormValidate.length) {\r\n this.manyFormValidate.map((item, i) => {\r\n if (i > 0) {\r\n if (Object.keys(item.detail).includes(this.changeAttrValue)) {\r\n item.detail[val] = item.detail[this.changeAttrValue];\r\n item[val] = item[this.changeAttrValue];\r\n delete item.detail[this.changeAttrValue];\r\n delete item[this.changeAttrValue];\r\n }\r\n }\r\n });\r\n this.changeAttrValue = val;\r\n }\r\n } else {\r\n this.generateAttr(this.attrs);\r\n }\r\n },\r\n // 规格值改变\r\n attrDetailChangeValue(val, i) {\r\n if (this.manyFormValidate.length) {\r\n let key = this.attrs[i].value;\r\n this.manyFormValidate.map((item, i) => {\r\n if (i > 0) {\r\n if (Object.keys(item.detail).includes(key) && item.detail[key] === this.changeAttrValue) {\r\n item.detail[key] = val;\r\n let index = item.attr_arr.findIndex((item) => item === this.changeAttrValue);\r\n item.attr_arr[index] = val;\r\n }\r\n }\r\n });\r\n this.changeAttrValue = val;\r\n } else {\r\n this.generateAttr(this.attrs, 1);\r\n }\r\n },\r\n // 规格图片添加开关\r\n addPic(e, i) {\r\n if (e) {\r\n this.attrs.map((item, ii) => {\r\n if (ii !== i) {\r\n this.$set(item, 'add_pic', 0);\r\n }\r\n });\r\n this.canSel = false;\r\n } else {\r\n this.canSel = true;\r\n }\r\n },\r\n // 规格拖拽排序后\r\n onMoveSpec() {\r\n this.generateAttr(this.attrs);\r\n },\r\n changeCurrentIndex(i) {\r\n this.currentIndex = i;\r\n },\r\n // 生成商品规格表头\r\n generateHeader(data) {\r\n let specificationsColumns = data.map((item) => ({\r\n title: item.value,\r\n key: item.value,\r\n minWidth: 140,\r\n fixed: 'left',\r\n }));\r\n let arr;\r\n if ([1, 2].includes(Number(this.formValidate.virtual_type))) {\r\n arr = [...specificationsColumns, ...VirtualTableHead];\r\n // 找到slot 等于 fictitious 将title改为规格名称\r\n this.formValidate.header.map((item) => {\r\n if (item.slot === 'fictitious') {\r\n item.title = this.formValidate.virtual_type == 1 ? '添加卡密/网盘' : '选择优惠券';\r\n }\r\n });\r\n } else if (this.formValidate.virtual_type == 3) {\r\n arr = [...specificationsColumns, ...VirtualTableHead2];\r\n } else {\r\n arr = [...specificationsColumns, ...GoodsTableHead];\r\n }\r\n this.$set(this.formValidate, 'header', arr);\r\n this.tableKey += 1;\r\n this.columnsInstalM = arr;\r\n },\r\n /*\r\n * 生成属性\r\n * @param {Array} data 规格数据\r\n * */\r\n generateAttr(data, val) {\r\n this.generateHeader(data);\r\n const combinations = this.generateCombinations(data);\r\n console.log('规格组合总数:' + combinations.length);\r\n const virtualType = this.formValidate.virtual_type;\r\n // 如果combinations数量超过 500,则分批次生成属性\r\n let rows = [];\r\n if (combinations.length > 500) {\r\n const batchSize = Math.ceil(combinations.length / 500);\r\n for (let i = 0; i < combinations.length; i += batchSize) {\r\n setTimeout((e) => {\r\n let d = this.generateAttrBatch(data, combinations.slice(i, i + batchSize), val);\r\n rows = [...rows, ...d];\r\n this.manyFormValidate = [...this.oneFormBatch, ...rows];\r\n }, 0);\r\n }\r\n } else {\r\n rows = this.generateAttrBatch(data, combinations, val);\r\n this.manyFormValidate = [...this.oneFormBatch, ...rows];\r\n }\r\n },\r\n // 生成属性批次\r\n generateAttrBatch(data, combinations, val) {\r\n const existingItems = this.manyFormValidate.slice(1); // 排除第一项默认数据\r\n\r\n const rows = combinations.map((combination) => {\r\n const row = {\r\n attr_arr: combination,\r\n detail: {},\r\n title: '',\r\n key: '',\r\n price: 0,\r\n pic: '',\r\n ot_price: 0,\r\n cost: 0,\r\n stock: 0,\r\n is_show: 1,\r\n is_default_select: 0,\r\n unique: '',\r\n weight: '',\r\n volume: '',\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n vip_proportion: 0,\r\n };\r\n\r\n // 设置虚拟类型相关属性\r\n if (this.formValidate.virtual_type === 1) {\r\n row.virtual_list = [];\r\n row.disk_info = '';\r\n } else if (this.formValidate.virtual_type === 2) {\r\n row.coupon_id = 0;\r\n row.coupon_name = '';\r\n }\r\n\r\n // 处理规格属性\r\n data.forEach((item, i) => {\r\n const value = combination[i];\r\n row[item.value] = value;\r\n row.title = item.value;\r\n row.key = item.value;\r\n row.detail[item.value] = value;\r\n\r\n // 查找匹配的现有规格项\r\n const matchedItem = existingItems.find((item) => item.attr_arr && arraysEqual(item.attr_arr, combination));\r\n\r\n if (matchedItem) {\r\n Object.assign(row, {\r\n price: matchedItem.price,\r\n cost: matchedItem.cost,\r\n ot_price: matchedItem.ot_price,\r\n stock: matchedItem.stock,\r\n pic: matchedItem.pic,\r\n unique: matchedItem.unique || '',\r\n weight: matchedItem.weight || '',\r\n volume: matchedItem.volume || '',\r\n is_show: matchedItem.is_show || 1,\r\n is_default_select: matchedItem.is_default_select || 0,\r\n volume: matchedItem.volume || 0,\r\n bar_code_number: matchedItem.bar_code_number || 0,\r\n is_virtual: matchedItem.is_virtual,\r\n brokerage: matchedItem.brokerage,\r\n brokerage_two: matchedItem.brokerage_two,\r\n vip_price: matchedItem.vip_price,\r\n vip_proportion: matchedItem.vip_proportion,\r\n });\r\n\r\n if (this.formValidate.virtual_type === 1) {\r\n row.virtual_list = matchedItem.virtual_list;\r\n row.disk_info = matchedItem.disk_info;\r\n } else if (this.formValidate.virtual_type === 2 && matchedItem.coupon_id) {\r\n row.coupon_id = matchedItem.coupon_id;\r\n row.coupon_name = matchedItem.coupon_name;\r\n }\r\n } else if (item.add_pic && combination.includes(val)) {\r\n const picItem = item.detail.find((e) => combination.includes(e.value));\r\n if (picItem) row.pic = picItem.pic;\r\n }\r\n });\r\n return row;\r\n });\r\n return rows;\r\n },\r\n // 切换默认选中规格\r\n changeDefaultSelect(e, index) {\r\n // 一个开启 其他关闭\r\n this.manyFormValidate.map((item, i) => {\r\n if (i !== index) {\r\n item.is_default_select = 0;\r\n }\r\n });\r\n if (e) this.manyFormValidate[index].is_show = 1;\r\n },\r\n // 改变是否显示\r\n changeDefaultShow(index) {\r\n // 如果默认选中开启 则不可隐藏\r\n if (this.manyFormValidate[index].is_default_select === 1) {\r\n this.manyFormValidate[index].is_show = 1;\r\n this.$message.error('默认规格不可隐藏');\r\n }\r\n },\r\n // 生成规格组合\r\n generateCombinations(arr, prefix = []) {\r\n if (arr.length === 0) {\r\n return [prefix];\r\n }\r\n const [first, ...rest] = arr;\r\n return first.detail.flatMap((detail) => this.generateCombinations(rest, [...prefix, detail.value]));\r\n },\r\n // 添加属性\r\n createAttr(num, idx) {\r\n if (num) {\r\n // 判断是否存在同样熟悉\r\n var isExist = this.attrs[idx].detail.some((item) => item.value === num);\r\n if (isExist) {\r\n this.$message.error('规格值已存在');\r\n return;\r\n }\r\n this.attrs[idx].detail.push({ value: num, pic: '' });\r\n if (this.manyFormValidate.length) {\r\n this.addOneAttr(this.attrs[idx].value, num);\r\n } else {\r\n this.generateAttr(this.attrs);\r\n }\r\n\r\n this.$refs.specStock.$refs['popoverRef_' + idx][0].doClose(); //关闭的\r\n this.clearAttr();\r\n setTimeout(() => {\r\n if (this.$refs.specStock.$refs['popoverRef_' + idx]) {\r\n //重点是以下两句\r\n this.$refs.specStock.$refs['popoverRef_' + idx][0].doShow(); //打开的\r\n //重点是以上两句\r\n }\r\n }, 20);\r\n } else {\r\n this.$refs.specStock.$refs['popoverRef_' + idx][0].doClose(); //关闭的\r\n }\r\n },\r\n handleShowPop(index) {\r\n this.$refs.specStock.$refs['inputRef_' + index][0].focus();\r\n },\r\n // 商品分类;\r\n goodsCategory() {\r\n cascaderListApi(1)\r\n .then((res) => {\r\n this.treeSelect = res.data;\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 改变规格\r\n changeSpec() {\r\n this.formValidate.is_sub = [];\r\n let id = this.$route.params.id;\r\n if (id) {\r\n checkActivityApi(id)\r\n .then((res) => {})\r\n .catch((res) => {\r\n this.formValidate.spec_type = this.spec_type;\r\n this.$message.error(res.msg);\r\n });\r\n }\r\n },\r\n // 详情\r\n getInfo() {\r\n this.spinShow = true;\r\n productInfoApi(this.$route.params.id)\r\n .then(async (res) => {\r\n let data = res.data.productInfo;\r\n this.infoData(data);\r\n this.spinShow = false;\r\n })\r\n .catch((res) => {\r\n this.spinShow = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n handleRemove(i) {\r\n this.images.splice(i, 1);\r\n this.formValidate.slider_image.splice(i, 1);\r\n this.oneFormValidate[0].pic = this.formValidate.slider_image[0];\r\n },\r\n // 关闭图片上传模态框\r\n changeCancel(msg) {\r\n this.modalPic = false;\r\n },\r\n // 点击商品图\r\n modalPicTap(tit, picTit = '', index = 0) {\r\n this.modalPic = true;\r\n this.isChoice = tit === 'dan' ? '单选' : '多选';\r\n this.picTit = picTit;\r\n this.tableIndex = index;\r\n },\r\n // 获取单张图片信息\r\n getPic(pc) {\r\n switch (this.picTit) {\r\n case 'danFrom':\r\n this.formValidate.image = pc.att_dir;\r\n if (!this.$route.params.id) {\r\n if (this.formValidate.spec_type === 0) {\r\n this.oneFormValidate[0].pic = pc.att_dir;\r\n } else {\r\n this.manyFormValidate.map((item) => {\r\n item.pic = pc.att_dir;\r\n });\r\n this.oneFormBatch[0].pic = pc.att_dir;\r\n }\r\n }\r\n break;\r\n case 'danTable':\r\n this.oneFormValidate[this.tableIndex].pic = pc.att_dir;\r\n break;\r\n case 'duopi':\r\n this.oneFormBatch[this.tableIndex].pic = pc.att_dir;\r\n break;\r\n case 'recommend_image':\r\n this.formValidate.recommend_image = pc.att_dir;\r\n break;\r\n default:\r\n if (this.manyFormValidate.length) this.manyFormValidate[this.tableIndex].pic = pc.att_dir;\r\n }\r\n this.modalPic = false;\r\n },\r\n deleteRow(index) {\r\n this.formValidate.params_list.splice(index, 1);\r\n },\r\n // 获取多张图信息\r\n getPicD(pc) {\r\n this.images = pc;\r\n this.images.map((item) => {\r\n this.formValidate.slider_image.push(item.att_dir);\r\n this.formValidate.slider_image = this.formValidate.slider_image.splice(0, 10);\r\n });\r\n this.oneFormValidate[0].pic = this.formValidate.slider_image[0];\r\n this.modalPic = false;\r\n },\r\n // 提交\r\n handleSubmit(name) {\r\n this.$refs[name].validate((valid) => {\r\n if (valid) {\r\n this.formValidate.type = this.type;\r\n let arr = this.formValidate.spec_type === 0 ? this.oneFormValidate : this.manyFormValidate;\r\n let item = JSON.parse(JSON.stringify(arr));\r\n if (this.formValidate.spec_type === 1) {\r\n if (item.length < 2) return this.$message.warning('商品规格-规格数量最少1个');\r\n // 删除第一项\r\n item.shift();\r\n }\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].stock > 1000000) {\r\n return this.$message.error('规格库存-库存超出系统范围(1000000)');\r\n }\r\n }\r\n if (this.formValidate.is_sub[0] === 1) {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].brokerage === null || item[i].brokerage_two === null) {\r\n return this.$message.error('营销设置- 一二级返佣不能为空');\r\n }\r\n }\r\n } else {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].vip_price === null) {\r\n return this.$message.error('营销设置-会员价不能为空');\r\n }\r\n }\r\n }\r\n if (this.formValidate.is_sub.length === 2) {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].brokerage === null || item[i].brokerage_two === null || item[i].vip_price === null) {\r\n return this.$message.error('营销设置- 一二级返佣和会员价不能为空');\r\n }\r\n }\r\n }\r\n if (this.formValidate.freight == 3 && !this.formValidate.temp_id) {\r\n return this.$message.warning('商品信息-运费模板不能为空');\r\n }\r\n let activeIds = [];\r\n this.dataLabel.forEach((item) => {\r\n activeIds.push(item.id);\r\n });\r\n this.formValidate.label_id = activeIds;\r\n if (this.openSubimit) return;\r\n this.openSubimit = true;\r\n this.formValidate.description = formatRichText(this.content);\r\n if (this.formValidate.spec_type === 0) {\r\n this.formValidate.attrs = item;\r\n this.formValidate.header = [];\r\n this.formValidate.items = [];\r\n this.formValidate.is_copy = 0;\r\n } else {\r\n this.formValidate.items = this.attrs;\r\n this.formValidate.attrs = item;\r\n this.formValidate.is_copy = 1;\r\n }\r\n productAddApi(this.formValidate)\r\n .then(async (res) => {\r\n this.openSubimit = false;\r\n this.$message.success(res.msg);\r\n if (this.$route.params.id === '0') {\r\n cacheDelete().catch((err) => {\r\n this.$message.error(err.msg);\r\n });\r\n }\r\n setTimeout(() => {\r\n this.openSubimit = false;\r\n this.$router.push({ path: this.$routeProStr + '/product/product_list' });\r\n }, 500);\r\n })\r\n .catch((res) => {\r\n setTimeout((e) => {\r\n this.openSubimit = false;\r\n }, 1000);\r\n this.$message.error(res.msg);\r\n });\r\n } else {\r\n if (!this.formValidate.store_name) {\r\n return this.$message.warning('商品信息-商品名称不能为空');\r\n } else if (!this.formValidate.cate_id.length) {\r\n return this.$message.warning('商品信息-商品分类不能为空');\r\n } else if (!this.formValidate.unit_name) {\r\n return this.$message.warning('商品信息-商品单位不能为空');\r\n } else if (!this.formValidate.slider_image.length) {\r\n return this.$message.warning('商品信息-商品轮播图不能为空');\r\n } else if (!this.formValidate.logistics.length && !this.formValidate.virtual_type) {\r\n return this.$message.warning('物流设置-至少选择一种物流方式');\r\n } else if (!this.formValidate.temp_id && this.formValidate.freight == 3) {\r\n return this.$message.warning('商品信息-运费模板不能为空');\r\n }\r\n }\r\n });\r\n },\r\n changeTemplate(msg) {\r\n this.template = msg;\r\n },\r\n // 表单验证\r\n validate(prop, status, error) {\r\n if (status === false) {\r\n this.$message.warning(error);\r\n }\r\n },\r\n // 移动\r\n handleDragStart(e, item) {\r\n this.dragging = item;\r\n },\r\n handleDragEnd(e, item) {\r\n this.dragging = null;\r\n },\r\n handleDragOver(e) {\r\n e.dataTransfer.dropEffect = 'move';\r\n },\r\n handleDragEnter(e, item) {\r\n e.dataTransfer.effectAllowed = 'move';\r\n if (item === this.dragging) {\r\n return;\r\n }\r\n const newItems = [...this.formValidate.slider_image];\r\n const src = newItems.indexOf(this.dragging);\r\n const dst = newItems.indexOf(item);\r\n newItems.splice(dst, 0, ...newItems.splice(src, 1));\r\n this.formValidate.slider_image = newItems;\r\n },\r\n //对象数组去重;\r\n unique(arr) {\r\n const res = new Map();\r\n return arr.filter((arr) => !res.has(arr.product_id) && res.set(arr.product_id, 1));\r\n },\r\n // 商品id\r\n getProductId(data) {\r\n this.goods_modals = false;\r\n this.formValidate.recommend_list = this.unique(this.formValidate.recommend_list.concat(data));\r\n },\r\n // 选择推荐商品\r\n changeGoods() {\r\n this.goods_modals = true;\r\n this.$refs.goodslist.getList();\r\n this.$refs.goodslist.goodsCategory();\r\n },\r\n // 选择用户标签\r\n activeData(dataLabel) {\r\n this.labelShow = false;\r\n this.dataLabel = dataLabel;\r\n },\r\n // 选择商品标签\r\n activeLabel(data) {\r\n this.tagShow = false;\r\n this.formValidate.label_list = Array.from(new Set(data));\r\n },\r\n // 标签弹窗关闭\r\n labelClose() {\r\n this.labelShow = false;\r\n this.tagShow = false;\r\n },\r\n // 删除用户标签\r\n closeLabel(label) {\r\n let index = this.dataLabel.indexOf(this.dataLabel.filter((d) => d.id == label.id)[0]);\r\n this.dataLabel.splice(index, 1);\r\n },\r\n // 打开选择用户标签\r\n openLabel(row) {\r\n this.labelShow = true;\r\n },\r\n handleRemoveRecommend(i) {\r\n this.formValidate.recommend_list.splice(i, 1);\r\n },\r\n // 打开的营销活动标签\r\n watchActivity() {\r\n let marketing = [];\r\n // 使用对象映射优化权限判断逻辑\r\n const permissionMap = {\r\n 默认: true,\r\n 秒杀: 'seckill',\r\n 砍价: 'bargain',\r\n 拼团: 'combination',\r\n };\r\n this.formValidate.activity.forEach((el) => {\r\n if (permissionMap[el] === true || (permissionMap[el] && checkArray(permissionMap[el]))) {\r\n marketing.push(el);\r\n }\r\n });\r\n this.formValidate.activity = marketing;\r\n },\r\n },\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n@use './productAdd.scss' as *;\r\n</style>\r\n"],"mappings":"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","ignoreList":[]}]}