e51b48bceb73caf91314bc1ed9b0ff51.json 229 KB

1
  1. {"remainingRequest":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\babel-loader\\lib\\index.js!E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\src\\views\\goods\\sale\\AddGoodsOneStore.vue?vue&type=script&lang=js&","dependencies":[{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\src\\views\\goods\\sale\\AddGoodsOneStore.vue","mtime":1655374732000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\babel.config.js","mtime":1655374732000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\vue-loader\\lib\\index.js","mtime":1655715099000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KaW1wb3J0IEN1c3RvbWVyUHJpY2UgZnJvbSAiLi4vY29tcG9uZW50cy9DdXN0b21lclByaWNlIjsKaW1wb3J0IExhZGRlclByaWNlIGZyb20gIi4uL2NvbXBvbmVudHMvTGFkZGVyUHJpY2UiOwppbXBvcnQgQ3VzdG9tZXJUeXBlUHJpY2UgZnJvbSAiLi4vY29tcG9uZW50cy9DdXN0b21lclR5cGVQcmljZSI7IC8vIGltcG9ydCBHb29kc0NhdGVnb3J5IGZyb20gIkAvY29tcG9uZW50L2NvbW1vbi9Hb29kc0NhdGVnb3J5LnZ1ZSI7CgppbXBvcnQgQnJhbmRTZWxNb2RlbCBmcm9tICJAL2NvbXBvbmVudC9nb29kcy9CcmFuZFNlbE1vZGVsLnZ1ZSI7CmltcG9ydCBUaW55bWNlIGZyb20gIkAvY29tcG9uZW50L1RpbnltY2UiOwppbXBvcnQgVXBsb2FkUWluaXUgZnJvbSAiQC9jb21wb25lbnQvY29tbW9uL1VwbG9hZFFpbml1LnZ1ZSI7IC8vIOaWsOWinuWIhuexuwoKaW1wb3J0IEFkZENhdGUgZnJvbSAiQC9jb21wb25lbnQvZ29vZHMvQWRkQ2F0ZS52dWUiOwppbXBvcnQgQWRkQnJhbmQgZnJvbSAiLi4vbWFuYWdlRy9BZGRCcmFuZCI7CmltcG9ydCB7IGdldEFsbEV4cHJlc3NSdWxlLCBnZXRBbGxDdXN0b21lclNvdXJjZSB9IGZyb20gIkAvYXBpL1N5c3RlbSI7CmltcG9ydCB7IGdldEFsbFVuaXQsIGRlZmluZVNwZWMsIFNwZWNNYW5hZ2VnZXRBbGwsIGdldFF1aWNrR29vZHNJbmZvLCBlZGl0UXVpY2tHb29kcywgYWRkQmFzaWNBbmRQdWJsaXNoR29vZHMsIGdldEFsbENhdGVnb3J5UG9zdCB9IGZyb20gIkAvYXBpL2dvb2RzIjsKaW1wb3J0IHsgYWRkUGF1c2VTYXZlLCBkZWxQYXVzZVNhdmUsIGdldFBhdXNlU2F2ZSB9IGZyb20gIkAvYXBpL2NvbW1vbiI7CmNvbnN0IHByaWNlRGF0YUxpID0gewogIGVuYWJsZWRMYWRkZXI6IDAsCiAgbWFya2V0UHJpY2U6ICIiLAogIG1lbWJlclByaWNlOiAiIiwKICBzYWxlUHJpY2U6ICIiLAogIHNldE51bTogMSwKICBpc1NhbGU6IDUsCiAgc2FsZVByaWNlQXJlYVR5cGU6IDEsCiAgLy8g5a6i5oi357G75Z6L5ZKM5a6i5oi35b+r6YCf6LCD5Lu3CiAgY3VzdG9tZXJUeXBlUHJpY2U6IFtdLAogIGN1c3RvbWVyVHlwZVByaWNlT3BlbjogZmFsc2UsCiAgY3VzdG9tZXJQcmljZTogW10sCiAgY3VzdG9tZXJQcmljZU9wZW46IGZhbHNlLAogIGxhZGRlclByaWNlOiBbCiAgICAvKiB7CiAgICAgIGZyb206IDEsCiAgICAgIHByaWNlOiAwLjAxLAogICAgICB0bzogMgogICAgfSwgewogICAgICBmcm9tOiAzLAogICAgICBwcmljZTogMC4wMSwKICAgICAgdG86IDQKICAgIH0sCiAgICB7CiAgICAgIGZyb206IDUsCiAgICAgIHByaWNlOiAwLjAxLAogICAgICB0bzogOTk5OTk5OTk5CiAgICB9ICovCiAgXQp9OwppbXBvcnQgQ2xpZW50TGlzdE1vZGFsIGZyb20gIkAvY29tcG9uZW50L2NvbW1vbi9DbGllbnRMaXN0TW9kYWwiOwppbXBvcnQgUmVnaW9uVHJlZSBmcm9tICJAL2NvbXBvbmVudC9jb21tb24vUmVnaW9uVHJlZSI7CmltcG9ydCB7IG1hcEdldHRlcnMgfSBmcm9tICJ2dWV4IjsKaW1wb3J0IHsgQ3VzdG9tZXJQcmljZUFkanVzdG1lbnRBZGQsIGFkZEN1c3RvbWVyVHlwZVByaWNlQWRqdXN0bWVudCwgZ2V0Q3VzdG9tZXJQcmljZUJ5R29vZHNJZHMsIGdldEN1c3RvbWVyVHlwZVByaWNlQnlHb29kc0lkcyB9IGZyb20gIkAvYXBpL1ByaWNlIjsKaW1wb3J0IHsgZ2V0QWxsTWVyY2hhbnRMaXN0IH0gZnJvbSAiQC9hcGkvTWVyY2hhbnRzIjsKZXhwb3J0IGRlZmF1bHQgewogIG5hbWU6ICJBZGRCYXNlRGF0YSIsCiAgY29tcG9uZW50czogewogICAgLy8gR29vZHNDYXRlZ29yeSwKICAgIEJyYW5kU2VsTW9kZWwsCiAgICBUaW55bWNlLAogICAgVXBsb2FkUWluaXUsCiAgICBBZGRDYXRlLAogICAgQWRkQnJhbmQsCiAgICBSZWdpb25UcmVlLAogICAgQ2xpZW50TGlzdE1vZGFsLAogICAgQ3VzdG9tZXJQcmljZSwKICAgIEN1c3RvbWVyVHlwZVByaWNlLAogICAgTGFkZGVyUHJpY2UKICB9LAoKICBkYXRhKCkgewogICAgY29uc3QgdmFsaWRhdGVVbml0ID0gKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaykgPT4gewogICAgICBpZiAodmFsdWUudW5pdE5hbWUgPT09ICIiKSB7CiAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKCLor7forr7nva7ln7rmnKzljZXkvY0iKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2FsbGJhY2soKTsKICAgICAgfQogICAgfTsKCiAgICByZXR1cm4gewogICAgICB1bml0aXNNYXN0ZXI6ICIiLAogICAgICB1bml0X2luZGV4OiAwLAogICAgICBza3VfaW5kZXg6IDAsCiAgICAgIGxhZGRlclByaWNlOiBbXSwKICAgICAgZW5hYmxlZExhZGRlcjogMCwKICAgICAgbGFkZGVyX3ByaWNlX3Nob3c6IGZhbHNlLAogICAgICAvLyDpmLbmoq/ku7flvLnnqpcKICAgICAgdHlwZV9wcmljZV9zaG93OiBmYWxzZSwKICAgICAgLy8g5a6i5oi357G75Z6L5Lu35by556qXCiAgICAgIGN1c3RvbWVyVHlwZVByaWNlT3BlbjogZmFsc2UsCiAgICAgIC8vIOWuouaIt+exu+Wei+S7t+W8ueeql+W8gOWFswogICAgICBjdXN0b21lclR5cGVQcmljZTogW10sCiAgICAgIC8vIOWuouaIt+exu+Wei+S7t+W8ueeql+aVsOaNrgogICAgICBjdXN0b21lclByaWNlT3BlbjogZmFsc2UsCiAgICAgIGN1c3RvbWVyUHJpY2U6IFtdLAogICAgICBhcHBvaW50X3ByaWNlX3Nob3c6IGZhbHNlLAogICAgICAvLyDlrqLmiLfmjIflrprku7flvLnnqpcKICAgICAgY3VzdG9tZXJfc2hvdzogZmFsc2UsCiAgICAgIC8vIOe7j+iQpeWxj+iUvS0+5a6i5oi35YiX6KGo5by556qX6YCJ5oupCiAgICAgIGN1c3RvbWVyX2xpc3Q6IFtdLAogICAgICAvLyDnu4/okKXlsY/olL0tPuWuouaIt+WIl+ihqAogICAgICBjdXN0b21lcl90eXBlX2NoZWNrOiBbXSwKICAgICAgLy8g57uP6JCl5bGP6JS9LT7lrqLmiLfnsbvlnovpgInmi6nmlbDnu4QKICAgICAgY3VzdG9tZXJfdHlwZV9saXN0OiBbXSwKICAgICAgLy8g57uP6JCl5bGP6JS9LT7lrqLmiLfnsbvlnovliJfooagKICAgICAgcmVnaW9uX2FycjogW10sCiAgICAgIC8vIOe7j+iQpeWxj+iUvS0+5b2T5YmN5ZWG5ZOB5bey6YCJ5oup6L+H55qE5Yy65Z+fCiAgICAgIHBhZ2VfdGFiczogIjEiLAogICAgICAvLyDpobXpnaJ0YWLliIfmjaIKICAgICAgZXhwcmVzc19saXN0OiBbXSwKICAgICAgLy8g6L+Q6LS55qih54mI5YiX6KGoCiAgICAgIGlzRWRpdFNwZWM6IDUsCiAgICAgIC8vIDUg6KGo56S65q2k5ZWG5ZOB5LuO5pyq6YeH6LSt6L+H77yM5YWB6K6455So5oi36ZqP5oSP57yW6L6R5Y2V5L2N5ZKM5bGe5oCn77ybNCDooajnpLrllYblk4Hlt7Lnu4/ph4fotK3ov4fvvIzpmpDol4/mt7vliqDlsZ7mgKfmjInpkq7vvIzpgb/lhY1za3VpZOmHjee7hAogICAgICAvLyDorqHph4/ljZXkvY0KICAgICAgc2VsZl9zcGVjX3ZhbDogIiIsCiAgICAgIC8vIOiHquWumuS5ieWxnuaAp+WAvOi+k+WFpeahhgogICAgICBzcGVjX25hbWVfaW5kZXg6IDAsCiAgICAgIC8vIOWxnuaAp+WQjWluZGV4CiAgICAgIHNlbGZfc3BlY19pbnB1dDogZmFsc2UsCiAgICAgIC8vIOaYvuekuuiHquWumuS5ieWxnuaAp+WAvOi+k+WFpeahhgogICAgICBzcGVjX21vZGVsOiBmYWxzZSwKICAgICAgLy8g6YCJ5oup5bGe5oCn5YC85by556qXCiAgICAgIHNwZWNfaXRlbV9jaGVjazogW10sCiAgICAgIC8vIOWxnuaAp+WAvOW8ueeql+WNlemAiXZhbHVlCiAgICAgIGlzX2luZGV0ZXJtaW5hdGVfc3BlYzogZmFsc2UsCiAgICAgIC8vIOaJuemHj+mAieaLqeWxnuaAp+WAvCDlhajpgInpgInmi6nmoYbnirbmgIEKICAgICAgc3BlY19jaGVja19hbGw6IGZhbHNlLAogICAgICAvLyDlsZ7mgKflgLwg5YWo6YCJ6YCJ5oup5qGGdmFsdWUKICAgICAgc3BlY19kYXRhOiBbXSwKICAgICAgLy8g5bGe5oCn5YiX6KGoCiAgICAgIHNwZWNfZGF0YV9jaGlsZDogW10sCiAgICAgIC8vIOWxnuaAp+WAvOWIl+ihqAogICAgICBzcGVjX3RhYmxlX0RhdGE6IFtdLAogICAgICAvLyDop4TmoLzmmI7nu4YKICAgICAgc2t1X2xpc3Q6IFsvLyDllYblk4HlsZ7mgKfliJfooagKICAgICAgewogICAgICAgIHNwZWNfZGF0YV9jaGlsZDogW10sCiAgICAgICAgZ3JvdXBTcGVjSWQ6ICIiLAogICAgICAgIHNlbGZfc3BlY192YWw6ICIiLAogICAgICAgIHNlbGZfc3BlY19pbnB1dDogZmFsc2UsCiAgICAgICAgZ3JvdXBTcGVjTmFtZTogIiIsCiAgICAgICAgcGFyYW1zOiBbXQogICAgICB9XSwKICAgICAgYWRkX21vZGVsOiBmYWxzZSwKICAgICAgLy8g5paw5bu65YiG57G7CiAgICAgIGRpYWxvZ1RpdGxlOiAi5paw5bu65YiG57G7IiwKICAgICAgcGlkX2FycjogW10sCiAgICAgIGFkZF9CcmFuZDogZmFsc2UsCiAgICAgIC8vIOaWsOWinuWTgeeJjAogICAgICBwYWdlTmFtZTogIiIsCiAgICAgIC8vIOaaguWtmOaVsOaNruWPguaVsAogICAgICBsb2FkaW5nOiBmYWxzZSwKICAgICAgaW1nX2xpc3Q6IFtdLAogICAgICAvLyDlhbPplK7or40KICAgICAgZHluYW1pY1RhZ3M6IFtdLAogICAgICBpbnB1dFZpc2libGU6IGZhbHNlLAogICAgICBpbnB1dFZhbHVlOiAiIiwKICAgICAgLy8g5YWz6ZSu6K+NIEVORAogICAgICBhc3Npc3RfbW9kZWw6IGZhbHNlLAogICAgICBlZGl0X2Fzc2lzdF9tb2RlbDogZmFsc2UsCiAgICAgIGFzc2lzdF9pbmRleDogMCwKICAgICAgdW5pdF9vcHRpb25zOiBbXSwKICAgICAgLy8g6K6h6YeP5Y2V5L2N5by556qXCiAgICAgIGFzc2lzdF9mb3JtOiB7CiAgICAgICAgdW5pdE5hbWU6ICIiLAogICAgICAgIGJhckNvZGU6ICIiLAogICAgICAgIGlzTWFzdGVyOiA0LAogICAgICAgIGlzRGVmYXVsdDogNCwKICAgICAgICBpc0VkaXRTcGVjOiA1LAogICAgICAgIHVuaXRJZDogIiIsCiAgICAgICAgY29udmVyc2lvbjogIiIKICAgICAgfSwKICAgICAgc2VsX2JyYW5kOiBmYWxzZSwKICAgICAgLy8g5omT5byA5ZOB54mM6YCJ5oup5by556qXCiAgICAgIHNlbF9zaG9wOiBmYWxzZSwKICAgICAgLy8g5omT5byA5bqX6ZO66YCJ5oup5by556qXCiAgICAgIG1hc3Rlcl91bml0X25hbWU6ICIiLAogICAgICBiYXNlX2Zvcm06IHsKICAgICAgICAvLyAg5Z+65pys5L+h5oGvCiAgICAgICAgZW5hYmxlU3RhdHVzOiA1LAogICAgICAgIC8vIOaYr+WQpuS4iuaetgogICAgICAgIGlzRGlzdHJpYnV0aW9uOiA0LAogICAgICAgIC8v6LSf5bqT5a2Y6ZSA5ZSuCiAgICAgICAgaXNTaGllbGQ6IDQsCiAgICAgICAgLy8g57uP6JCl5bGP6JS9IDTlhbPpl60gNeW8gOWQrwogICAgICAgIGlzRXE6IDQsCiAgICAgICAgLy8g5oqE56CB5ZWG5ZOBCiAgICAgICAgc3BlY1R5cGU6IDEsCiAgICAgICAgLy8g5piv5ZCm5aSa6KeE5qC8CiAgICAgICAgZGVsVW5pdElkczogW10sCiAgICAgICAgLy8g6L6F5Yqp5Y2V5L2N5Yig6ZmkZGVsVW5pdElkcyAodW5pdElkKQogICAgICAgIGRlbFNwZWNTa3VJZHM6IFtdLAogICAgICAgIC8vIOWxnuaAp+WIoOmZpGRlbFNwZWNTa3VJZHPvvIjov5nkuKrnlKhpZO+8iQogICAgICAgIGJyYW5jaFVuaXQ6IFtdLAogICAgICAgIGJyYW5kTmFtZTogIiIsCiAgICAgICAgY2F0ZWdvcnlJZDogIiIsCiAgICAgICAgYXNzaXN0Q2F0ZWdvcnlJZDogIiIsCiAgICAgICAgY2F0ZWdvcnlQYXRoOiBbXSwKICAgICAgICAvLyDliIbnsbvpgInmi6kKICAgICAgICBhc3Npc3RDYXRlZ29yeVBhdGg6IFtdLAogICAgICAgIC8vIOWIhuexu+mAieaLqQogICAgICAgIHVuaXREYXRhOiBbXSwKICAgICAgICBtYXN0ZXJVbml0OiB7CiAgICAgICAgICBiYXJDb2RlOiAiIiwKICAgICAgICAgIHdlaWdodDogIiIsCiAgICAgICAgICBpc01hc3RlcjogNSwKICAgICAgICAgIGlzRGVmYXVsdDogNSwKICAgICAgICAgIHVuaXROYW1lOiAiIiwKICAgICAgICAgIHVuaXRJZDogIiIKICAgICAgICB9LAogICAgICAgIGRlc2NyaWJlOiAiIiwKICAgICAgICB0aXRsZTogIiIsCiAgICAgICAgc3RvcmFnZTogIiIsCiAgICAgICAgY29kZTogIiIsCiAgICAgICAgYmFyQ29kZTogIiIsCiAgICAgICAgLy8g5ZWG5ZOB5p2h56CBCiAgICAgICAgd2VpZ2h0OiAiIiwKICAgICAgICAvLyDllYblk4Hph43ph48KICAgICAgICBleHBpcmVUaW1lOiAiIiwKICAgICAgICBicmFuZElkOiAiIiwKICAgICAgICB0YWc6ICIiLAogICAgICAgIGRlc2NyaXB0aW9uOiAiIiwKICAgICAgICBzYWxlc1Nob3A6ICIiLAogICAgICAgIGltYWdlczogW10sCiAgICAgICAgZGVsaXZlcnlTdXBJZHM6IFsiMSIsICIyIl0sCiAgICAgICAgLy8g54mp5rWB5pSv5oyBIOWbuuWumuWAvCAxIOW/q+mAkiAyIOiHquaPkCDkvKDlj4LmoLzlvI/vvJoxLDIKICAgICAgICBleHByZXNzVHlwZTogMSwKICAgICAgICAvLyDlv6vpgJLov5DotLkgMSDljIXpgq4gMiDov5DotLnmqKHniYggMyDlm7rlrprotLnnlKgKICAgICAgICBleHByZXNzRmVlOiAiIiwKICAgICAgICAvLyDlm7rlrprotLnnlKgKICAgICAgICBzaG93RXhwcmVzczogNSwKICAgICAgICAvLyDmmK/lkKblsZXnpLrlv6vpgJIgNeWxleekuiA05LiN5bGV56S6CiAgICAgICAgcnVsZUlkOiAiIiwKICAgICAgICAvLyDov5DotLnmqKHniYhpZAogICAgICAgIG5vdEFyZWE6IFtdLAogICAgICAgIC8v57uP6JCl5bGP6JS95Zyw5Yy6CiAgICAgICAgbm90Q3VzdG9tZXJUeXBlOiAiIiwKICAgICAgICAvL+e7j+iQpeWxj+iUvSDlrqLmiLfnsbvlnovlsY/olL0KICAgICAgICBub3RDdXN0b21lcjogIiIsCiAgICAgICAgLy/nu4/okKXlsY/olL0g5a6i5oi35bGP6JS9CiAgICAgICAgbWVyY2hhbnRJZDogIiIgLy/llYbmiLdJRAoKICAgICAgfSwKICAgICAgc2VsX2NpdGllczogW10sCiAgICAgIC8vIOWVhuaIt+WIl+ihqAogICAgICBiYXNlX3J1bGVzOiB7CiAgICAgICAgLy8g5Z+65pys5L+h5oGv6aqM6K+BCiAgICAgICAgaW1hZ2VzOiBbewogICAgICAgICAgdHlwZTogImFycmF5IiwKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbWVzc2FnZTogIuivt+S4iuS8oOWVhuWTgeWbvueJhyIsCiAgICAgICAgICB0cmlnZ2VyOiAiY2hhbmdlIgogICAgICAgIH1dLAogICAgICAgIHRpdGxlOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAi6K+36L6T5YWl5ZWG5ZOB5ZCN56ewIiwKICAgICAgICAgIHRyaWdnZXI6ICJibHVyIgogICAgICAgIH1dLAogICAgICAgIGNhdGVnb3J5SWQ6IFt7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIG1lc3NhZ2U6ICLor7fpgInmi6nllYblk4HliIbnsbsiLAogICAgICAgICAgdHJpZ2dlcjogImNoYW5nZSIKICAgICAgICB9XSwKICAgICAgICBleHBpcmVUaW1lOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAi6K+36L6T5YWl5ZWG5ZOB5L+d6LSo5pyfIiwKICAgICAgICAgIHRyaWdnZXI6ICJibHVyIgogICAgICAgIH1dLAogICAgICAgIC8vIGJyYW5kSWQ6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36YCJ5oup5ZWG5ZOB5ZOB54mMJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0sCiAgICAgICAgLy8gZGVzY3JpYmU6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5ZWG5ZOB5o+P6L+wJywgdHJpZ2dlcjogJ2JsdXInIH1dLAogICAgICAgIG1hc3RlclVuaXQ6IFt7CiAgICAgICAgICB2YWxpZGF0b3I6IHZhbGlkYXRlVW5pdCwKICAgICAgICAgIHRyaWdnZXI6ICJjaGFuZ2UiCiAgICAgICAgfV0sCiAgICAgICAgZGVsaXZlcnlTdXBJZHM6IFt7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIHR5cGU6ICJhcnJheSIsCiAgICAgICAgICBtZXNzYWdlOiAi6K+36YCJ5oup54mp5rWB5pSv5oyBIiwKICAgICAgICAgIHRyaWdnZXI6ICJjaGFuZ2UiCiAgICAgICAgfV0sCiAgICAgICAgcnVsZUlkOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAi6K+36YCJ5oup6L+Q6LS55qih5p2/IiwKICAgICAgICAgIHRyaWdnZXI6ICJjaGFuZ2UiCiAgICAgICAgfV0sCiAgICAgICAgZXhwcmVzc0ZlZTogW3sKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbWVzc2FnZTogIuivt+i+k+WFpei/kOi0uSIsCiAgICAgICAgICB0cmlnZ2VyOiAiYmx1ciIKICAgICAgICB9XSAvLyBicmFuY2hVbml0OiBbeyByZXF1aXJlZDogdHJ1ZSwgdHlwZTogJ2FycmF5JywgbWVzc2FnZTogJ+ivt+iuvue9rui+heWKqeWNleS9jScsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dCiAgICAgICAgLy8gdGFnOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+iuvue9ruWVhuWTgeWFs+mUruivjScsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dCgogICAgICB9LAogICAgICBnb29kc19pZDogMCwKICAgICAgbGlzdF9wYWdlX2RhdGE6ICIxXzEwIiwKICAgICAgdW5pdF9kYXRhOiBbXSwKICAgICAgLy8g5Y2V5L2N5piO57uGCiAgICAgIHRhYnNfYWN0aXZlOiAiIiwKICAgICAgLy8g5aSa5bGe5oCn5Y2V5L2N5YiH5o2iCiAgICAgIGlzTmV3OiA1LAogICAgICAvLyA1IOagh+ekuui/meaYr+S4gOS4quacgOi/keaWsOWinueahOWVhuWTge+8jOWfuuacrOWNleS9jeS4uuacgOWwj+WNleS9je+8jDTmoIfnpLrov5nmmK/kuYvliY3nmoTogIHmlbDmja7vvIzln7rmnKzljZXkvY3kuLrmnIDlpKfljZXkvY0KICAgICAgY2F0ZWdvcnlfZGF0YTogW10sCiAgICAgIC8v5ZWG5ZOB5YiG57G75YiX6KGoCiAgICAgIGNhdGVfcHJvcHM6IHsKICAgICAgICBsYWJlbDogInRpdGxlIiwKICAgICAgICB2YWx1ZTogImlkIiwKICAgICAgICBjaGVja1N0cmljdGx5OiB0cnVlCiAgICAgIH0sCiAgICAgIGFzc2lzdF9jYXRlOiBbewogICAgICAgIGFzc2lzdENhdGVnb3J5UGF0aDogW10KICAgICAgfV0sCiAgICAgIHNrdV9pZDogIiIKICAgIH07CiAgfSwKCiAgY29tcHV0ZWQ6IHsgLi4ubWFwR2V0dGVycyh7CiAgICAgIHNhbGVQcmljZVRpbWVzOiAiTVVzZXIvc2FsZVByaWNlVGltZXMiLAogICAgICBzeXN0ZW1UeXBlOiAiTVVzZXIvc3lzdGVtVHlwZSIgLy8g5b2T5YmN5ZCO5Y+wCgogICAgfSkKICB9LAoKICBhc3luYyBjcmVhdGVkKCkgewogICAgLy8g5ZWG5oi3566h55CGCiAgICBhd2FpdCB0aGlzLmdldEFsbE1lcmNoYW50TGlzdCgpOyAvLyDllYblk4HliIbnsbvliJfooagKCiAgICBhd2FpdCB0aGlzLmdldEFsbENhdGVnb3J5UG9zdCgpOwogICAgdGhpcy5wYWdlTmFtZSA9IHRoaXMuJHJvdXRlLm5hbWU7IC8vIOWxnuaAp+euoeeQhgoKICAgIGF3YWl0IHRoaXMuU3BlY01hbmFnZWdldEFsbCgpOwogICAgYXdhaXQgdGhpcy5nZXRBbGxVbml0KCk7IC8vIOWuouaIt+exu+WeiwoKICAgIGF3YWl0IHRoaXMuZ2V0QWxsQ3VzdG9tZXJTb3VyY2UoKTsKCiAgICBpZiAodGhpcy4kcm91dGUucGFyYW1zLmlkKSB7CiAgICAgIHRoaXMuZ29vZHNfaWQgPSB0aGlzLiRyb3V0ZS5wYXJhbXMuaWQ7CiAgICAgIHRoaXMubGlzdF9wYWdlX2RhdGEgPSB0aGlzLiRyb3V0ZS5wYXJhbXMucGFnZTsKICAgICAgYXdhaXQgdGhpcy5nZXRHb29kc0Jhc2ljSW5mb0J5SWQoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIOiOt+WPluaaguWtmOS/oeaBrwogICAgICBhd2FpdCB0aGlzLmdldFBhdXNlU2F2ZSgpOwogICAgfQoKICAgIGF3YWl0IHRoaXMuZ2V0QWxsRXhwcmVzc1J1bGUoKTsKICB9LAoKICBtZXRob2RzOiB7CiAgICAvLyDojrflj5bov5DotLnmqKHniYgKICAgIGFzeW5jIGdldEFsbEV4cHJlc3NSdWxlKCkgewogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gYXdhaXQgZ2V0QWxsRXhwcmVzc1J1bGUoKTsKICAgICAgdGhpcy5leHByZXNzX2xpc3QgPSBkYXRhOwogICAgfSwKCiAgICBpc0RlZmF1bHRDaGFuZ2UodmFsLCBpbmRleCwgc0luZGV4KSB7CiAgICAgIGlmICh2YWwgPT09IDUpIHsKICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CgogICAgICAgIGlmICh0aGlzLmJhc2VfZm9ybS5zcGVjVHlwZSA9PT0gMikgewogICAgICAgICAgdGFyZ2V0LmZvckVhY2goKGl0ZW0sIGluZGV4VSkgPT4gewogICAgICAgICAgICBpdGVtLnNwZWNfdGFibGVfRGF0YS5mb3JFYWNoKChpdGVtQiwgaW5kZXhCKSA9PiB7CiAgICAgICAgICAgICAgaWYgKGluZGV4VSAhPT0gc0luZGV4KSB7CiAgICAgICAgICAgICAgICBpdGVtQi5pc0RlZmF1bHQgPSA0OwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXhCICE9PSBpbmRleCkgewogICAgICAgICAgICAgICAgICBpdGVtQi5pc0RlZmF1bHQgPSA0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0LmZvckVhY2goKGl0ZW0sIGluZGV4VSkgPT4gewogICAgICAgICAgICBpZiAoaW5kZXhVICE9PSBpbmRleCkgewogICAgICAgICAgICAgIGl0ZW0uaXNEZWZhdWx0ID0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnVuaXRfZGF0YSA9IHRhcmdldDsKICAgICAgfQogICAgfSwKCiAgICAvLyDor7fmsYLln7rmnKzljZXkvY3mlbDmja4KICAgIGFzeW5jIGdldEFsbFVuaXQoKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBkYXRhCiAgICAgIH0gPSBhd2FpdCBnZXRBbGxVbml0KHsKICAgICAgICBwYWdlOiAxLAogICAgICAgIHBhZ2VTaXplOiA5OQogICAgICB9KTsKICAgICAgdGhpcy51bml0X29wdGlvbnMgPSBkYXRhOwogICAgfSwKCiAgICBtb2RlbENsb3NlKCkgewogICAgICB0aGlzLmFkZF9tb2RlbCA9IGZhbHNlOwogICAgfSwKCiAgICAvLyDmiZPlvIDmlrDlop7lvLnnqpcKICAgIG9wZW5Nb2RlbCh0aXRsZSwgcm93KSB7CiAgICAgIHRoaXMuYWRkX21vZGVsID0gdHJ1ZTsKICAgICAgdGhpcy5kaWFsb2dUaXRsZSA9IHRpdGxlOwoKICAgICAgaWYgKHRpdGxlID09PSAi5paw5bu65a2Q5YiG57G7IikgewogICAgICAgIGxldCBsaW5rID0gcm93LmxpbmsgPyByb3cubGluay5zcGxpdCgiLCIpLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChpdGVtKTsKICAgICAgICB9KSA6IFtdOwogICAgICAgIGxpbmsucHVzaChyb3cuaWQpOwogICAgICAgIHRoaXMucGlkX2FyciA9IGxpbms7CiAgICAgIH0KICAgIH0sCgogICAgLy8g5paw5aKeL+e8lui+keWIhuexuwogICAgYXN5bmMgc3ViQ2F0ZWdvcnkoKSB7CiAgICAgIHRoaXMuZ2V0QWxsQ2F0ZWdvcnlQb3N0KCk7CiAgICAgIHRoaXMuJG1lc3NhZ2UoIuaWsOW7uuWIhuexu+aIkOWKnyIpOwogICAgfSwKCiAgICAvLyDmlrDlu7rlk4HniYwKICAgIHN1Ym1pdEJyYW5kKCkgewogICAgICB0aGlzLmFkZF9CcmFuZCA9IGZhbHNlOwogICAgfSwKCiAgICAvLyDmt7vliqDmmoLlrZgKICAgIGFzeW5jIEFkZFRlbSgpIHsKICAgICAgY29uc3QgcGFyYW1zID0geyAuLi50aGlzLmJhc2VfZm9ybSwKICAgICAgICBzcGVjR3JvdXA6IHRoaXMuc2t1X2xpc3QsCiAgICAgICAgc3BlY011bHRpcGxlOiB0aGlzLnNwZWNfdGFibGVfRGF0YSwKICAgICAgICB0YWc6IHRoaXMuZHluYW1pY1RhZ3MsCiAgICAgICAgYXNzaXN0X2NhdGU6IHRoaXMuYXNzaXN0X2NhdGUKICAgICAgfTsKICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGFkZFBhdXNlU2F2ZSh7CiAgICAgICAga2V5OiB0aGlzLnBhZ2VOYW1lLAogICAgICAgIGRhdGE6IHBhcmFtcwogICAgICB9KTsKICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgIHR5cGU6ICJzdWNjZXNzIiwKICAgICAgICBtZXNzYWdlOiAi5pqC5a2Y5oiQ5YqfIgogICAgICB9KTsKCiAgICAgIGlmICh0aGlzLnN5c3RlbVR5cGUgPT09IDMpIHsKICAgICAgICB0aGlzLiRjbG9zZUN1cnJlbnRHb0VkaXQoYC9nb29kcy9zYWxlL01lcmNoYW50c0dvb2RzYCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy4kY2xvc2VDdXJyZW50R29FZGl0KGAvZ29vZHMvc2FsZS9QdWJsaXNoR29vZHNgKTsKICAgICAgfQogICAgfSwKCiAgICAvLyDliKDpmaTmmoLlrZjkv6Hmga8KICAgIGFzeW5jIGRlbFBhdXNlU2F2ZSgpIHsKICAgICAgY29uc3QgZGF0YSA9IGRlbFBhdXNlU2F2ZSh7CiAgICAgICAga2V5OiB0aGlzLnBhZ2VOYW1lCiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDojrflj5bmmoLlrZjkv6Hmga8KICAgIGFzeW5jIGdldFBhdXNlU2F2ZSgpIHsKICAgICAgY29uc3QgewogICAgICAgIGRhdGEKICAgICAgfSA9IGF3YWl0IGdldFBhdXNlU2F2ZSh7CiAgICAgICAga2V5OiB0aGlzLnBhZ2VOYW1lCiAgICAgIH0pOwogICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZGF0YSkgPT09ICJ7fSIpIHJldHVybjsKICAgICAgdGhpcy5iYXNlX2Zvcm0gPSB7IC4uLmRhdGEsCiAgICAgICAgY2F0ZWdvcnlQYXRoOiBBcnJheS5pc0FycmF5KGRhdGEuY2F0ZWdvcnlQYXRoKSA/IGRhdGEuY2F0ZWdvcnlQYXRoIDogW10sCiAgICAgICAgYXNzaXN0Q2F0ZWdvcnlQYXRoOiBBcnJheS5pc0FycmF5KGRhdGEuYXNzaXN0Q2F0ZWdvcnlQYXRoKSA/IGRhdGEuYXNzaXN0Q2F0ZWdvcnlQYXRoIDogW10KICAgICAgfTsKICAgICAgdGhpcy5hc3Npc3RfY2F0ZSA9IGRhdGEuYXNzaXN0X2NhdGUgfHwgW3sKICAgICAgICBhc3Npc3RDYXRlZ29yeVBhdGg6IFtdCiAgICAgIH1dOwogICAgICB0aGlzLnNrdV9saXN0ID0gZGF0YS5zcGVjR3JvdXAgfHwgW107CiAgICAgIHRoaXMuc3BlY190YWJsZV9EYXRhID0gZGF0YS5zcGVjTXVsdGlwbGUgfHwgW107CiAgICAgIHRoaXMuZHluYW1pY1RhZ3MgPSBkYXRhLnRhZyB8fCBbXTsKCiAgICAgIGlmIChkYXRhLmltYWdlcykgewogICAgICAgIHRoaXMuaW1nX2xpc3QgPSBkYXRhLmltYWdlcy5tYXAoaXRlbSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBuYW1lOiAiIiwKICAgICAgICAgICAgdXJsOiBpdGVtCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9CiAgICB9LAoKICAgIC8vIOinhOagvOWbvueJhwogICAgdXBsb2FkU3BlY1N1Y2Nlc3ModmFsLCBpbmRleCwgaW5kZXhVKSB7CiAgICAgIGxldCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CgogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICB0YXJnZXRbaW5kZXhdLnNwZWNJbWFnZSA9IHsKICAgICAgICAgIG5hbWU6ICIiLAogICAgICAgICAgdXJsOiB2YWwKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIHRhcmdldFtpbmRleFVdLnNwZWNfdGFibGVfRGF0YVtpbmRleF0uc3BlY0ltYWdlID0gewogICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICB1cmw6IHZhbAogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgfSwKCiAgICAvLyDmt7vliqDop4TmoLzpobnnm64KICAgIGFkZFNrdVAoKSB7CiAgICAgIGlmICghdGhpcy5nb29kc19pZCkgewogICAgICAgIHRoaXMuc2t1X2xpc3QucHVzaCh7CiAgICAgICAgICBzcGVjX2RhdGFfY2hpbGQ6IFtdLAogICAgICAgICAgc2VsZl9zcGVjX2lucHV0OiBmYWxzZSwKICAgICAgICAgIHNlbGZfc3BlY192YWw6ICIiLAogICAgICAgICAgZ3JvdXBTcGVjSWQ6ICIiLAogICAgICAgICAgZ3JvdXBTcGVjTmFtZTogIiIsCiAgICAgICAgICBwYXJhbXM6IFtdCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy4kY29uZmlybSgi5paw5aKe6KeE5qC85Lya5a+86Ie05Y6f5pyJ5bqT5a2Y6YeN572uLOivt+iwqOaFjuaTjeS9nCEg5piv5ZCm57un57utPyIsICLmj5DnpLoiLCB7CiAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIue7p+e7reaWsOWiniIsCiAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5Y+W5raIIiwKICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgIH0pLnRoZW4oKCkgPT4gewogICAgICAgICAgdGhpcy5za3VfbGlzdC5wdXNoKHsKICAgICAgICAgICAgc3BlY19kYXRhX2NoaWxkOiBbXSwKICAgICAgICAgICAgc2VsZl9zcGVjX2lucHV0OiBmYWxzZSwKICAgICAgICAgICAgc2VsZl9zcGVjX3ZhbDogIiIsCiAgICAgICAgICAgIGdyb3VwU3BlY0lkOiAiIiwKICAgICAgICAgICAgZ3JvdXBTcGVjTmFtZTogIiIsCiAgICAgICAgICAgIHBhcmFtczogW10KICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICB9LAoKICAgIC8vIOinhOagvOaYjuWIh+aNogogICAgZ3JvdXBTcGVjSWRDaGFuZ2UodmFsLCBpbmRleFMpIHsKICAgICAgbGV0IHRhcmdldCA9IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMuc2t1X2xpc3QpOwogICAgICBjb25zdCBzcGVjRGF0YUl0ZW0gPSB0aGlzLnNwZWNfZGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gdmFsKTsKICAgICAgdGFyZ2V0W2luZGV4U10uZ3JvdXBTcGVjTmFtZSA9IHNwZWNEYXRhSXRlbS5zcGVjTmFtZTsKICAgICAgdGFyZ2V0W2luZGV4U10uc3BlY19kYXRhX2NoaWxkID0gc3BlY0RhdGFJdGVtLmNoaWxkIHx8IFtdOwogICAgICB0YXJnZXRbaW5kZXhTXS5wYXJhbXMgPSBbXTsKICAgICAgdGhpcy5za3VfbGlzdCA9IHRhcmdldDsgLy8g6YeN5o6S6KeE5qC857uE5ZCICiAgICAgIC8vIHRoaXMuc3BlY0dyb3VwUmVzdCgpCiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc2t1X2xpc3QpCiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc3BlY190YWJsZV9EYXRhKQogICAgfSwKCiAgICAvLyDph43mjpLop4TmoLznu4TlkIgKICAgIHNwZWNHcm91cFJlc3QoKSB7CiAgICAgIC8vIOe8lui+kemhtemdouWtmOWCqOivpuaDheaOpeWPo+i/lOWbnuinhOagvOe7hOWQiGlkCiAgICAgIC8vIHRoaXMuc3BlY190YWJsZV9EYXRhLmZvckVhY2goaXRlbSA9PiB7CiAgICAgIC8vICAgaWYgKGl0ZW0uc3BlY0dyb3VwSGFzaCAmJiB0aGlzLmJhc2VfZm9ybS5kZWxTcGVjU2t1SWRzLmluZGV4T2YoaXRlbS5zcGVjR3JvdXBIYXNoKSA9PT0gLTEpIHsKICAgICAgLy8gICAgIHRoaXMuYmFzZV9mb3JtLmRlbFNwZWNTa3VJZHMucHVzaChpdGVtLnNwZWNHcm91cEhhc2gpCiAgICAgIC8vICAgfQogICAgICAvLyB9KQogICAgICBjb25zdCBza3VBcnIgPSB0aGlzLnNrdV9saXN0Lm1hcChpdGVtID0+IHsKICAgICAgICBpdGVtLnBhcmFtcyA9IGl0ZW0ucGFyYW1zLm1hcChpdGVtUCA9PiB7CiAgICAgICAgICByZXR1cm4geyAuLi5pdGVtUCwKICAgICAgICAgICAgZ3JvdXBTcGVjTmFtZTogaXRlbS5ncm91cFNwZWNOYW1lCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBpdGVtLnBhcmFtczsKICAgICAgfSk7CiAgICAgIGxldCBza3VBcnJEbyA9IFtdOwoKICAgICAgaWYgKHNrdUFyci5sZW5ndGgpIHsKICAgICAgICBza3VBcnJEbyA9IHRoaXMuZG9FeGNoYW5nZShza3VBcnIpOwogICAgICB9IC8vIOWkh+S7veS4gOS7veinhOagvOaYjue7hu+8jOeUqOadpeWhq+WFhemHjeaOkuinhOagvOe7hOS5i+WJjeeahOWbvueJhwoKCiAgICAgIGNvbnN0IGNsb25lVW5pdERhdGEgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CiAgICAgIHRoaXMudW5pdF9kYXRhID0gdGhpcy51bml0X2RhdGEubWFwKChpdGVtLCBpbmRleCkgPT4gewogICAgICAgIGNvbnN0IGNsb25lU3BlY0dyb3VwID0gY2xvbmVVbml0RGF0YVtpbmRleF0uc3BlY190YWJsZV9EYXRhIHx8IFtdOwogICAgICAgIHJldHVybiB7IC4uLml0ZW0sCiAgICAgICAgICBzcGVjX3RhYmxlX0RhdGE6IHNrdUFyckRvLm1hcChpdGVtU3AgPT4gewogICAgICAgICAgICBjb25zdCBpbmRleFNTID0gY2xvbmVTcGVjR3JvdXAuZmluZEluZGV4KGl0ZW1DID0+IGl0ZW1DLmlkID09PSBpdGVtU3AuaWQpOwogICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtU3AsCiAgICAgICAgICAgICAgYmFyQ29kZTogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10uYmFyQ29kZSA6IGl0ZW1TcC5iYXJDb2RlLAogICAgICAgICAgICAgIHdlaWdodDogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10ud2VpZ2h0IDogaXRlbVNwLndlaWdodCwKICAgICAgICAgICAgICBpc0RlZmF1bHQ6IGluZGV4U1MgPiAtMSA/IGNsb25lU3BlY0dyb3VwW2luZGV4U1NdLmlzRGVmYXVsdCA6IGl0ZW1TcC5pc0RlZmF1bHQsCiAgICAgICAgICAgICAgc3BlY0ltYWdlOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5zcGVjSW1hZ2UgOiBpdGVtU3Auc3BlY0ltYWdlLAogICAgICAgICAgICAgIGludmVudG9yeTogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10uaW52ZW50b3J5IDogaXRlbVNwLmludmVudG9yeSB8fCAwLAogICAgICAgICAgICAgIGlzRWRpdFNwZWM6IGluZGV4U1MgPiAtMSA/IGNsb25lU3BlY0dyb3VwW2luZGV4U1NdLmlzRWRpdFNwZWMgOiBpdGVtU3AuaXNFZGl0U3BlYyB8fCA1LAogICAgICAgICAgICAgIHNhbGVQcmljZTogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10uc2FsZVByaWNlIDogaXRlbVNwLnNhbGVQcmljZSwKICAgICAgICAgICAgICBlbmFibGVkTGFkZGVyOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5lbmFibGVkTGFkZGVyIDogaXRlbVNwLmVuYWJsZWRMYWRkZXIsCiAgICAgICAgICAgICAgbGFkZGVyUHJpY2U6IGluZGV4U1MgPiAtMSA/IGNsb25lU3BlY0dyb3VwW2luZGV4U1NdLmxhZGRlclByaWNlIDogaXRlbVNwLmxhZGRlclByaWNlLAogICAgICAgICAgICAgIG1hcmtldFByaWNlOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5tYXJrZXRQcmljZSA6IGl0ZW1TcC5tYXJrZXRQcmljZSwKICAgICAgICAgICAgICBtZW1iZXJQcmljZTogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10ubWVtYmVyUHJpY2UgOiBpdGVtU3AubWVtYmVyUHJpY2UsCiAgICAgICAgICAgICAgc2V0TnVtOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5zZXROdW0gOiBpdGVtU3Auc2V0TnVtIHx8IDEsCiAgICAgICAgICAgICAgaXNTYWxlOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5pc1NhbGUgOiBpdGVtU3AuaXNTYWxlIHx8IDUsCiAgICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2U6IGluZGV4U1MgPiAtMSA/IGNsb25lU3BlY0dyb3VwW2luZGV4U1NdLmN1c3RvbWVyVHlwZVByaWNlIDogaXRlbVNwLmN1c3RvbWVyVHlwZVByaWNlIHx8IFtdLAogICAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlT3BlbjogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10uY3VzdG9tZXJUeXBlUHJpY2VPcGVuIDogaXRlbVNwLmN1c3RvbWVyVHlwZVByaWNlT3BlbiB8fCBmYWxzZSwKICAgICAgICAgICAgICBjdXN0b21lclByaWNlOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5jdXN0b21lclByaWNlIDogaXRlbVNwLmN1c3RvbWVyUHJpY2UgfHwgW10sCiAgICAgICAgICAgICAgY3VzdG9tZXJQcmljZU9wZW46IGluZGV4U1MgPiAtMSA/IGNsb25lU3BlY0dyb3VwW2luZGV4U1NdLmN1c3RvbWVyUHJpY2VPcGVuIDogaXRlbVNwLmN1c3RvbWVyUHJpY2VPcGVuIHx8IGZhbHNlCiAgICAgICAgICAgIH07CiAgICAgICAgICB9KQogICAgICAgIH07CiAgICAgIH0pOyAvLyDliKTmlq3mmK/lkKbmmK/lpJrlsZ7mgKcKCiAgICAgIHRoaXMuYmFzZV9mb3JtLnNwZWNUeXBlID0gdGhpcy51bml0X2RhdGEuc29tZShpdGVtID0+IGl0ZW0uc3BlY190YWJsZV9EYXRhICYmIGl0ZW0uc3BlY190YWJsZV9EYXRhLmxlbmd0aCA+IDApID8gMiA6IDE7CgogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDIgJiYgIXRoaXMudGFic19hY3RpdmUpIHsKICAgICAgICB0aGlzLnRhYnNfYWN0aXZlID0gdGhpcy51bml0X2RhdGFbMF0udW5pdE5hbWU7CiAgICAgIH0KICAgIH0sCgogICAgLy8g6KeE5qC857uE5ZCICiAgICBkb0V4Y2hhbmdlKGRvdWJsZUFycmF5cykgewogICAgICBjb25zdCBsZW4gPSBkb3VibGVBcnJheXMubGVuZ3RoOwoKICAgICAgaWYgKGxlbiA+PSAyKSB7CiAgICAgICAgY29uc3QgbGVuMSA9IGRvdWJsZUFycmF5c1swXS5sZW5ndGg7CiAgICAgICAgY29uc3QgbGVuMiA9IGRvdWJsZUFycmF5c1sxXS5sZW5ndGg7CiAgICAgICAgY29uc3QgbmV3bGVuID0gbGVuMSAqIGxlbjI7CiAgICAgICAgY29uc3QgdGVtcCA9IG5ldyBBcnJheShuZXdsZW4pOwogICAgICAgIGxldCBpbmRleCA9IDA7CgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuMTsgaSsrKSB7CiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbjI7IGorKykgewogICAgICAgICAgICB0ZW1wW2luZGV4XSA9IHsKICAgICAgICAgICAgICBncm91cFNwZWNJZDogZG91YmxlQXJyYXlzWzBdW2ldLmdyb3VwU3BlY0lkICsgIl8iICsgZG91YmxlQXJyYXlzWzFdW2pdLmdyb3VwU3BlY0lkLAogICAgICAgICAgICAgIGdyb3VwU3BlY05hbWU6IGRvdWJsZUFycmF5c1swXVtpXS5ncm91cFNwZWNOYW1lICsgIl8iICsgZG91YmxlQXJyYXlzWzFdW2pdLmdyb3VwU3BlY05hbWUsCiAgICAgICAgICAgICAgaWQ6IGRvdWJsZUFycmF5c1swXVtpXS5pZCArICJfIiArIGRvdWJsZUFycmF5c1sxXVtqXS5pZCwKICAgICAgICAgICAgICBzcGVjTmFtZTogZG91YmxlQXJyYXlzWzBdW2ldLnNwZWNOYW1lICsgIl8iICsgZG91YmxlQXJyYXlzWzFdW2pdLnNwZWNOYW1lLAogICAgICAgICAgICAgIHNwZWNJbWFnZTogewogICAgICAgICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICAgICAgICB1cmw6ICIiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBzZXROdW06IDEsCiAgICAgICAgICAgICAgaXNTYWxlOiA1LAogICAgICAgICAgICAgIHNhbGVQcmljZTogMC4wMSwKICAgICAgICAgICAgICBlbmFibGVkTGFkZGVyOiAwLAogICAgICAgICAgICAgIGxhZGRlclByaWNlOiBbXSwKICAgICAgICAgICAgICBtYXJrZXRQcmljZTogMC4wMSwKICAgICAgICAgICAgICBtZW1iZXJQcmljZTogIiIsCiAgICAgICAgICAgICAgYmFyQ29kZTogIiIsCiAgICAgICAgICAgICAgd2VpZ2h0OiAiIiwKICAgICAgICAgICAgICBpc0RlZmF1bHQ6IDQsCiAgICAgICAgICAgICAgLy8g5a6i5oi357G75Z6L5ZKM5a6i5oi35b+r6YCf6LCD5Lu3CiAgICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2U6IFtdLAogICAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlT3BlbjogZmFsc2UsCiAgICAgICAgICAgICAgY3VzdG9tZXJQcmljZTogW10sCiAgICAgICAgICAgICAgY3VzdG9tZXJQcmljZU9wZW46IGZhbHNlCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBsZXQgbmV3QXJyYXkgPSBuZXcgQXJyYXkobGVuIC0gMSk7CiAgICAgICAgbmV3QXJyYXlbMF0gPSB0ZW1wOwoKICAgICAgICBpZiAobGVuID4gMikgewogICAgICAgICAgbGV0IF9jb3VudCA9IDE7CgogICAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBuZXdBcnJheVtfY291bnRdID0gZG91YmxlQXJyYXlzW2ldOwogICAgICAgICAgICBfY291bnQrKzsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzLmRvRXhjaGFuZ2UobmV3QXJyYXkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBkb3VibGVBcnJheXNbMF0ubWFwKGl0ZW0gPT4gewogICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwKICAgICAgICAgICAgc3BlY0ltYWdlOiB7CiAgICAgICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICAgICAgdXJsOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXROdW06IDEsCiAgICAgICAgICAgIGlzU2FsZTogNSwKICAgICAgICAgICAgYmFyQ29kZTogIiIsCiAgICAgICAgICAgIHdlaWdodDogIiIsCiAgICAgICAgICAgIGlzRGVmYXVsdDogNCwKICAgICAgICAgICAgc2FsZVByaWNlOiAwLjAxLAogICAgICAgICAgICBlbmFibGVkTGFkZGVyOiAwLAogICAgICAgICAgICBsYWRkZXJQcmljZTogW10sCiAgICAgICAgICAgIG1hcmtldFByaWNlOiAwLjAxLAogICAgICAgICAgICBtZW1iZXJQcmljZTogIiIsCiAgICAgICAgICAgIC8vIOWuouaIt+exu+Wei+WSjOWuouaIt+W/q+mAn+iwg+S7twogICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZTogW10sCiAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlT3BlbjogZmFsc2UsCiAgICAgICAgICAgIGN1c3RvbWVyUHJpY2U6IFtdLAogICAgICAgICAgICBjdXN0b21lclByaWNlT3BlbjogZmFsc2UKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCgogICAgLy8g6Ieq5a6a5LmJ5bGe5oCn5YC86L6T5YWl5qGG56Gu5a6aICDmt7vliqDoh6rlrprkuYnlsZ7mgKcKICAgIGFzeW5jIHNlbGZTcGVjQ29uZmlybShpbmRleCkgewogICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnNrdV9saXN0KTsKCiAgICAgIGlmICghdGFyZ2V0W2luZGV4XS5zZWxmX3NwZWNfdmFsKSB7CiAgICAgICAgdGFyZ2V0W2luZGV4XS5zZWxmX3NwZWNfaW5wdXQgPSBmYWxzZTsKICAgICAgICB0aGlzLnNrdV9saXN0ID0gdGFyZ2V0OwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgewogICAgICAgIGRhdGEKICAgICAgfSA9IGF3YWl0IGRlZmluZVNwZWMoewogICAgICAgIHNwZWNOYW1lOiB0YXJnZXRbaW5kZXhdLnNlbGZfc3BlY192YWwsCiAgICAgICAgcGlkOiB0YXJnZXRbaW5kZXhdLmdyb3VwU3BlY0lkLAogICAgICAgIGhpZGRlbjogNAogICAgICB9KTsKICAgICAgdGFyZ2V0W2luZGV4XS5zZWxmX3NwZWNfaW5wdXQgPSBmYWxzZTsKICAgICAgdGFyZ2V0W2luZGV4XS5wYXJhbXMucHVzaCh7CiAgICAgICAgc3BlY05hbWU6IGRhdGEuc3BlY05hbWUsCiAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgZ3JvdXBTcGVjSWQ6IHRhcmdldFtpbmRleF0uZ3JvdXBTcGVjSWQKICAgICAgfSk7CiAgICAgIHRhcmdldFtpbmRleF0uc2VsZl9zcGVjX3ZhbCA9ICIiOwogICAgICB0aGlzLnNrdV9saXN0ID0gdGFyZ2V0OyAvLyDph43mjpLop4TmoLznu4TlkIgKCiAgICAgIHRoaXMuc3BlY0dyb3VwUmVzdCgpOwogICAgfSwKCiAgICAvLyDmlrDlop7op4TmoLzlgLwKICAgIGFkZFNwZWNWYWwoaW5kZXhTKSB7CiAgICAgIHRoaXMuc3BlY19tb2RlbCA9IHRydWU7CiAgICAgIHRoaXMuc3BlY19kYXRhX2NoaWxkID0gdGhpcy5za3VfbGlzdFtpbmRleFNdLnNwZWNfZGF0YV9jaGlsZDsKICAgICAgdGhpcy5zcGVjX25hbWVfaW5kZXggPSBpbmRleFM7CiAgICAgIHRoaXMuc3BlY19pdGVtX2NoZWNrID0gdGhpcy5za3VfbGlzdFtpbmRleFNdLnBhcmFtcy5tYXAoaXRlbSA9PiBpdGVtLmlkKTsgLy8g5L2/55So5bGe5oCn5YC85Y2V6YCJ5pa55rOV77yM5Li65LqG6K6+572u5YWo6YCJ6YCJ5oup5qGG54q25oCBCgogICAgICB0aGlzLnNwZWNJdGVtQ2hhbmdlKHRoaXMuc3BlY19pdGVtX2NoZWNrKTsKICAgIH0sCgogICAgLy8g6YCJ5oup5bGe5oCn5YC8CiAgICBzZWxTcGVjVmFsKCkgewogICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnNrdV9saXN0KTsKICAgICAgY29uc3Qgc3BlY3ZhbCA9IHRoaXMuc3BlY19kYXRhX2NoaWxkLmZpbHRlcihpdGVtID0+IHsKICAgICAgICByZXR1cm4gdGhpcy5zcGVjX2l0ZW1fY2hlY2suZmluZEluZGV4KGl0ZW1TID0+IGl0ZW1TID09PSBpdGVtLmlkKSA+IC0xOwogICAgICB9KS5tYXAoaXRlbSA9PiB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHNwZWNOYW1lOiBpdGVtLnNwZWNOYW1lLAogICAgICAgICAgaWQ6IGl0ZW0uaWQsCiAgICAgICAgICBncm91cFNwZWNJZDogaXRlbS5waWQKICAgICAgICB9OwogICAgICB9KTsKICAgICAgdGFyZ2V0W3RoaXMuc3BlY19uYW1lX2luZGV4XS5wYXJhbXMgPSB0aGlzLiRfY29tbW9uLnVuaXF1ZSh0YXJnZXRbdGhpcy5zcGVjX25hbWVfaW5kZXhdLnBhcmFtcy5jb25jYXQoc3BlY3ZhbCksIFsiaWQiXSk7CiAgICAgIHRoaXMuc2t1X2xpc3QgPSB0YXJnZXQ7CiAgICAgIHRoaXMuc3BlY19tb2RlbCA9IGZhbHNlOyAvLyDph43mjpLop4TmoLznu4TlkIgKCiAgICAgIHRoaXMuc3BlY0dyb3VwUmVzdCgpOwogICAgfSwKCiAgICAvLyDlsZ7mgKflgLzlhajpgIkKICAgIGNoZWNrQWxsU3BlY0NoYW5nZSh2YWwpIHsKICAgICAgdGhpcy5pc19pbmRldGVybWluYXRlX3NwZWMgPSBmYWxzZTsKCiAgICAgIGlmICh2YWwpIHsKICAgICAgICB0aGlzLnNwZWNfaXRlbV9jaGVjayA9IHRoaXMuc3BlY19kYXRhX2NoaWxkLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiBpdGVtLmlkOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc3BlY19pdGVtX2NoZWNrID0gW107CiAgICAgIH0KICAgIH0sCgogICAgLy8g5bGe5oCn5YC85Y2V6YCJCiAgICBzcGVjSXRlbUNoYW5nZSh2YWwpIHsKICAgICAgbGV0IGNoZWNrZWRDb3VudCA9IHZhbC5sZW5ndGg7CiAgICAgIHRoaXMuc3BlY19jaGVja19hbGwgPSBjaGVja2VkQ291bnQgPT09IHRoaXMuc3BlY19kYXRhX2NoaWxkLmxlbmd0aDsKICAgICAgdGhpcy5pc19pbmRldGVybWluYXRlX3NwZWMgPSBjaGVja2VkQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA8IHRoaXMuc3BlY19kYXRhX2NoaWxkLmxlbmd0aDsKICAgIH0sCgogICAgLy8g5Yig6Zmk6KeE5qC85YC8CiAgICBkZWxTcGVjVmFsKGluZGV4QywgaW5kZXhTLCBpdGVtQykgewogICAgICB0aGlzLiRjb25maXJtKCLnoa7lrpropoHliKDpmaTor6Xop4TmoLzlgLzlkJc/IiwgIuaPkOekuiIsIHsKICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuehruWumiIsCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIuWPlua2iCIsCiAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgIH0pLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICAgIC8vIOe8lui+kemhtemdouinhOagvOaYjue7huaTjeS9nAogICAgICAgIGlmICh0aGlzLmdvb2RzX2lkKSB7CiAgICAgICAgICB0aGlzLmJhc2VfZm9ybS5kZWxTcGVjU2t1SWRzID0gdGhpcy5zcGVjX3RhYmxlX0RhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zcGVjTmFtZS5pbmRleE9mKGl0ZW1DLnNwZWNOYW1lKSA+IC0xKS5tYXAoaXRlbU0gPT4gewogICAgICAgICAgICByZXR1cm4gaXRlbU0uc3BlY0dyb3VwSGFzaDsKICAgICAgICAgIH0pOwogICAgICAgIH0gLy8g5paw5aKe6aG16Z2i6KeE5qC85piO57uG5pON5L2cCgoKICAgICAgICB0aGlzLnVuaXRfZGF0YSA9IHRoaXMudW5pdF9kYXRhLm1hcChpdGVtVSA9PiB7CiAgICAgICAgICByZXR1cm4geyAuLi5pdGVtVSwKICAgICAgICAgICAgc3BlY190YWJsZV9EYXRhOiBpdGVtVS5zcGVjX3RhYmxlX0RhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zcGVjTmFtZS5pbmRleE9mKGl0ZW1DLnNwZWNOYW1lKSA9PT0gLTEpCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMuc2t1X2xpc3QpOwogICAgICAgIHRhcmdldFtpbmRleFNdLnBhcmFtcy5zcGxpY2UoaW5kZXhDLCAxKTsKICAgICAgICB0aGlzLnNrdV9saXN0ID0gdGFyZ2V0OwogICAgICB9KTsKICAgIH0sCgogICAgLy8g5Yig6Zmk6KeE5qC857uECiAgICBkZWxHcm91cFNwZWNJZChpbmRleFMpIHsKICAgICAgdGhpcy4kY29uZmlybSgi56Gu5a6a6KaB5Yig6Zmk6K+l6KeE5qC857uE5ZCXPyIsICLmj5DnpLoiLCB7CiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLnoa7lrpoiLAogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICLlj5bmtogiLAogICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICB9KS50aGVuKGFzeW5jICgpID0+IHsKICAgICAgICB0aGlzLnNrdV9saXN0LnNwbGljZShpbmRleFMsIDEpOwoKICAgICAgICBpZiAodGhpcy5nb29kc19pZCkgewogICAgICAgICAgdGhpcy5iYXNlX2Zvcm0uZGVsU3BlY1NrdUlkcyA9IHRoaXMuYmFzZV9mb3JtLnNwZWNNdWx0aXBsZS5tYXAoaXRlbSA9PiB7CiAgICAgICAgICAgIHJldHVybiBpdGVtLnNwZWNHcm91cEhhc2g7CiAgICAgICAgICB9KTsKICAgICAgICB9IC8vIOmHjeaOkuinhOagvOe7hOWQiAoKCiAgICAgICAgdGhpcy5zcGVjR3JvdXBSZXN0KCk7CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDojrflj5blsZ7mgKfliJfooagKICAgIGFzeW5jIFNwZWNNYW5hZ2VnZXRBbGwoKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBkYXRhLAogICAgICAgIHBhZ2VUb3RhbAogICAgICB9ID0gYXdhaXQgU3BlY01hbmFnZWdldEFsbCh7CiAgICAgICAgcGFnZTogMSwKICAgICAgICBwYWdlU2l6ZTogNTAKICAgICAgfSk7CiAgICAgIHRoaXMuc3BlY19kYXRhID0gZGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtLnNwZWNOYW1lICE9PSAi6K6h6YeP5Y2V5L2NIik7IC8vIHRoaXMudW5pdF9vcHRpb25zID0gZGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5zcGVjTmFtZSA9PT0gJ+iuoemHj+WNleS9jScpLmNoaWxkCiAgICB9LAoKICAgIC8vIOmAieaLqeWbvueJhwogICAgdXBsb2FkU3VjY2Vzcyh2YWwsIHJlcywgZmlsZSwgZmlsZUxpc3QpIHsKICAgICAgY29uc3QgaW1nQXJyID0gZmlsZUxpc3QubWFwKGl0ZW0gPT4gewogICAgICAgIHJldHVybiBpdGVtLmNvbnRlbnQ7CiAgICAgIH0pOwoKICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLmltYWdlcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLmJhc2VfZm9ybS5pbWFnZXMgPSB0aGlzLmJhc2VfZm9ybS5pbWFnZXMuY29uY2F0KGltZ0Fycik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5iYXNlX2Zvcm0uaW1hZ2VzID0gaW1nQXJyOwogICAgICB9CgogICAgICB0aGlzLmltZ19saXN0ID0gdGhpcy5iYXNlX2Zvcm0uaW1hZ2VzLm1hcChpdGVtID0+IHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICBjb250ZW50OiBpdGVtCiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9LAoKICAgIGltZ1NvcnRDaGFuZ2UoZmlsZUxpc3QpIHsKICAgICAgdGhpcy5iYXNlX2Zvcm0uaW1hZ2VzID0gZmlsZUxpc3QubWFwKGl0ZW0gPT4gewogICAgICAgIHJldHVybiBpdGVtLmNvbnRlbnQ7CiAgICAgIH0pOwogICAgfSwKCiAgICB1cGxvYWRSZW1vdmUoZmlsZSwgZmlsZUxpc3QpIHsKICAgICAgdGhpcy5iYXNlX2Zvcm0uaW1hZ2VzID0gZmlsZUxpc3QubWFwKGl0ZW0gPT4gewogICAgICAgIHJldHVybiBpdGVtLmNvbnRlbnQ7CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDlhbPplK7or43liKDpmaQKICAgIGhhbmRsZUNsb3NlKHRhZykgewogICAgICB0aGlzLmR5bmFtaWNUYWdzLnNwbGljZSh0aGlzLmR5bmFtaWNUYWdzLmluZGV4T2YodGFnKSwgMSk7CiAgICB9LAoKICAgIC8vIOWFs+mUruivjeaYvuekuui+k+WFpeahhgogICAgc2hvd0lucHV0KCkgewogICAgICB0aGlzLmlucHV0VmlzaWJsZSA9IHRydWU7CiAgICAgIHRoaXMuJG5leHRUaWNrKF8gPT4gewogICAgICAgIHRoaXMuJHJlZnMuc2F2ZVRhZ0lucHV0LiRyZWZzLmlucHV0LmZvY3VzKCk7CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDlhbPplK7or43mmL7npLrovpPlhaXnoa7lrpoKICAgIGhhbmRsZUlucHV0Q29uZmlybSgpIHsKICAgICAgbGV0IGlucHV0VmFsdWUgPSB0aGlzLmlucHV0VmFsdWU7CgogICAgICBpZiAoaW5wdXRWYWx1ZSkgewogICAgICAgIHRoaXMuZHluYW1pY1RhZ3MucHVzaChpbnB1dFZhbHVlKTsKICAgICAgfQoKICAgICAgdGhpcy5pbnB1dFZpc2libGUgPSBmYWxzZTsKICAgICAgdGhpcy5pbnB1dFZhbHVlID0gIiI7CiAgICB9LAoKICAgIC8vIOWFs+mUruivjUVORAogICAgLy8g6K6+572u6K6h6YeP5Y2V5L2NCiAgICAvLyDliKDpmaTovoXliqnljZXkvY0KICAgIGRlbEZ1VW5pdChyb3csIGl0KSB7CiAgICAgIHRoaXMuYmFzZV9mb3JtLmJyYW5jaFVuaXQuc3BsaWNlKGl0LCAxKTsKCiAgICAgIGlmICh0aGlzLmdvb2RzX2lkKSB7CiAgICAgICAgaWYgKHJvdy51bml0SWQgJiYgdGhpcy5iYXNlX2Zvcm0uZGVsVW5pdElkcy5pbmRleE9mKHJvdy51bml0SWQpID09PSAtMSkgewogICAgICAgICAgdGhpcy5iYXNlX2Zvcm0uZGVsVW5pdElkcy5wdXNoKHJvdy51bml0SWQpOwogICAgICAgIH0KCiAgICAgICAgY29uc3Qgc3BlYyA9IHRoaXMudW5pdF9kYXRhLmZpbmQoaXRlbSA9PiBpdGVtLnVuaXROYW1lID09PSByb3cudW5pdE5hbWUpOwoKICAgICAgICBpZiAoc3BlYyAmJiBzcGVjLnNwZWNHcm91cEhhc2gpIHsKICAgICAgICAgIGlmICh0aGlzLmJhc2VfZm9ybS5kZWxTcGVjU2t1SWRzLmluZGV4T2Yoc3BlYy5zcGVjR3JvdXBIYXNoKSA9PT0gLTEpIHsKICAgICAgICAgICAgdGhpcy5iYXNlX2Zvcm0uZGVsU3BlY1NrdUlkcy5wdXNoKHNwZWMuc3BlY0dyb3VwSGFzaCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB0aGlzLnVuaXRfZGF0YS5zcGxpY2UoaXQgKyAxLCAxKTsKICAgIH0sCgogICAgLy8g5paw5aKe6L6F5Yqp5Y2V5L2NCiAgICBhZGRGdVVuaXQoKSB7CiAgICAgIHRoaXMuYXNzaXN0X21vZGVsID0gdHJ1ZTsKICAgICAgdGhpcy5lZGl0X2Fzc2lzdF9tb2RlbCA9IGZhbHNlOwogICAgICB0aGlzLmFzc2lzdF9mb3JtID0gewogICAgICAgIHVuaXROYW1lOiAiIiwKICAgICAgICBpc01hc3RlcjogNCwKICAgICAgICB1bml0SWQ6ICIiLAogICAgICAgIGNvbnZlcnNpb246ICIiCiAgICAgIH07CiAgICB9LAoKICAgIC8vIOS/ruaUuemZhOWNleS9jQogICAgRWRpdEZ1VW5pdChpdCkgewogICAgICB0aGlzLmFzc2lzdF9tb2RlbCA9IHRydWU7CiAgICAgIHRoaXMuZWRpdF9hc3Npc3RfbW9kZWwgPSB0cnVlOwogICAgICB0aGlzLmFzc2lzdF9mb3JtID0gdGhpcy5iYXNlX2Zvcm0uYnJhbmNoVW5pdFtpdF07CiAgICAgIHRoaXMuYXNzaXN0X2luZGV4ID0gaXQ7CiAgICB9LAoKICAgIC8vIOW8ueeql+aPkOS6pCDovoXliqnljZXkvY0KICAgIHN1YkFzc2lzdCgpIHsKICAgICAgaWYgKCF0aGlzLmFzc2lzdF9mb3JtLmNvbnZlcnNpb24pIHsKICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoIuivt+i+k+WFpeWNleS9jeaNoueul+WFs+ezuyIpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKCF0aGlzLmFzc2lzdF9mb3JtLnVuaXROYW1lKSB7CiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCLor7fpgInmi6novoXliqnljZXkvY0iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHRoaXMuYmFzZV9mb3JtLmJyYW5jaFVuaXQucHVzaCh7IC4uLnRoaXMuYXNzaXN0X2Zvcm0sCiAgICAgICAgaXNFZGl0U3BlYzogNQogICAgICB9KTsKCiAgICAgIGlmICh0aGlzLmJhc2VfZm9ybS5zcGVjVHlwZSA9PT0gMikgewogICAgICAgIGNvbnN0IHNwZWNUYWJsZURhdGEgPSB0aGlzLnVuaXRfZGF0YVswXSA/IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMudW5pdF9kYXRhWzBdLnNwZWNfdGFibGVfRGF0YSB8fCBbXSkgOiBbXTsKICAgICAgICB0aGlzLnVuaXRfZGF0YS5wdXNoKHsgLi4udGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy5hc3Npc3RfZm9ybSksCiAgICAgICAgICAuLi50aGlzLiRfY29tbW9uLmRlZXBDbG9uZShwcmljZURhdGFMaSksCiAgICAgICAgICBpc01hc3RlcjogNCwKICAgICAgICAgIGlzRWRpdFNwZWM6IDUsCiAgICAgICAgICBzcGVjSW1hZ2U6IHsKICAgICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICAgIHVybDogIiIKICAgICAgICAgIH0sCiAgICAgICAgICBzcGVjX3RhYmxlX0RhdGE6IHNwZWNUYWJsZURhdGEKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnVuaXRfZGF0YS5wdXNoKHsgLi4udGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy5hc3Npc3RfZm9ybSksCiAgICAgICAgICAuLi50aGlzLiRfY29tbW9uLmRlZXBDbG9uZShwcmljZURhdGFMaSksCiAgICAgICAgICBpc01hc3RlcjogNCwKICAgICAgICAgIGlzRWRpdFNwZWM6IDUsCiAgICAgICAgICBzcGVjSW1hZ2U6IHsKICAgICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICAgIHVybDogIiIKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSAvLyDph43mjpLop4TmoLznu4TlkIgKCgogICAgICB0aGlzLnNwZWNHcm91cFJlc3QoKTsKICAgICAgdGhpcy5hc3Npc3RfbW9kZWwgPSBmYWxzZTsKICAgIH0sCgogICAgLy8g5Z+65pys5Y2V5L2N5YiH5o2iCiAgICBtYXN0ZXJVbml0Q2hhbmdlKHZhbCkgewogICAgICB0aGlzLmJhc2VfZm9ybS5tYXN0ZXJVbml0LnVuaXROYW1lID0gdGhpcy51bml0X29wdGlvbnMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IHZhbCkudW5pdE5hbWU7CiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy51bml0X2RhdGEuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pc01hc3RlciA9PT0gNSk7CgogICAgICBpZiAoaW5kZXggPT09IC0xKSB7CiAgICAgICAgdGhpcy51bml0X2RhdGEudW5zaGlmdCh7IC4uLnRoaXMuYmFzZV9mb3JtLm1hc3RlclVuaXQsCiAgICAgICAgICAuLi50aGlzLiRfY29tbW9uLmRlZXBDbG9uZShwcmljZURhdGFMaSksCiAgICAgICAgICBpc01hc3RlcjogNSwKICAgICAgICAgIHNwZWNJbWFnZTogewogICAgICAgICAgICBuYW1lOiAiIiwKICAgICAgICAgICAgdXJsOiAiIgogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuJHNldCh0aGlzLnVuaXRfZGF0YSwgaW5kZXgsIHsgLi4udGhpcy51bml0X2RhdGFbaW5kZXhdLAogICAgICAgICAgLi4udGhpcy5iYXNlX2Zvcm0ubWFzdGVyVW5pdAogICAgICAgIH0pOwogICAgICB9IC8vIOmHjeaOkuinhOagvOe7hOWQiAoKCiAgICAgIHRoaXMuc3BlY0dyb3VwUmVzdCgpOwoKICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLnNwZWNUeXBlID09PSAyKSB7CiAgICAgICAgdGhpcy50YWJzX2FjdGl2ZSA9IHRoaXMudW5pdF9kYXRhWzBdLnVuaXROYW1lOwogICAgICB9CiAgICB9LAoKICAgIC8vIOi+heWKqeWNleS9jeWIh+aNogogICAgYnJhbmNoVW5pdENoYW5nZSh2YWwpIHsKICAgICAgdGhpcy5hc3Npc3RfZm9ybS51bml0TmFtZSA9IHRoaXMudW5pdF9vcHRpb25zLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSB2YWwpLnVuaXROYW1lOwogICAgfSwKCiAgICAvLyDojrflj5bor6bmg4UKICAgIGFzeW5jIGdldEdvb2RzQmFzaWNJbmZvQnlJZCgpIHsKICAgICAgY29uc3QgewogICAgICAgIGRhdGEKICAgICAgfSA9IGF3YWl0IGdldFF1aWNrR29vZHNJbmZvKHRoaXMuZ29vZHNfaWQpOwogICAgICB0aGlzLnJlZ2lvbl9hcnIgPSBkYXRhLm5vdEFyZWE7CiAgICAgIHRoaXMuY3VzdG9tZXJfdHlwZV9jaGVjayA9IGRhdGEubm90Q3VzdG9tZXJUeXBlID8gZGF0YS5ub3RDdXN0b21lclR5cGUuc3BsaXQoIiwiKS5tYXAoaXRlbSA9PiBwYXJzZUludChpdGVtKSkgOiBbXTsKICAgICAgdGhpcy5jdXN0b21lcl9saXN0ID0gZGF0YS5ub3RDdXN0b21lckxpc3RzIHx8IFtdOwogICAgICB0aGlzLmlzRWRpdFNwZWMgPSBkYXRhLmlzRWRpdFNwZWM7IC8vIHJldHVybgoKICAgICAgbGV0IG1hc3RlclVuaXQgPSBkYXRhLnVuaXREYXRhLmZpbmQoaXRlbSA9PiBpdGVtLmlzTWFzdGVyID09PSA1KSB8fCB7CiAgICAgICAgYmFyQ29kZTogIiIsCiAgICAgICAgd2VpZ2h0OiAiIiwKICAgICAgICBpc01hc3RlcjogNSwKICAgICAgICBpc0RlZmF1bHQ6IDUsCiAgICAgICAgdW5pdE5hbWU6ICIiLAogICAgICAgIHVuaXRJZDogIiIKICAgICAgfTsKICAgICAgdGhpcy5pc05ldyA9IG1hc3RlclVuaXQgPyBtYXN0ZXJVbml0LmlzTmV3IHx8IDQgOiA0OwogICAgICBsZXQgYnJhbmNoVW5pdCA9IFtdOwoKICAgICAgaWYgKGRhdGEuc3BlY1R5cGUgPT09IDIpIHsKICAgICAgICBjb25zdCB1bml0RGF0YSA9IGRhdGEudW5pdERhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc01hc3RlciA9PT0gNCk7CiAgICAgICAgYnJhbmNoVW5pdCA9ICh1bml0RGF0YSB8fCBbXSkubWFwKGl0ZW0gPT4gewogICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwKICAgICAgICAgICAgaXNFZGl0U3BlYzogZGF0YS5pc0VkaXRTcGVjCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGRhdGEuc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICBjb25zdCB1bml0RGF0YSA9IGRhdGEuc3BlY011bHRpcGxlLmZpbHRlcihpdGVtID0+IGl0ZW0uaXNNYXN0ZXIgPT09IDQpOwogICAgICAgIGJyYW5jaFVuaXQgPSAodW5pdERhdGEgfHwgW10pLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNvbnZlcnNpb246IGl0ZW0uY29udmVyc2lvbiwKICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsCiAgICAgICAgICAgIGlzTWFzdGVyOiBpdGVtLmlzTWFzdGVyLAogICAgICAgICAgICB1bml0SWQ6IGl0ZW0udW5pdElkLAogICAgICAgICAgICB1bml0TmFtZTogaXRlbS51bml0TmFtZSwKICAgICAgICAgICAgaXNFZGl0U3BlYzogaXRlbS5pc0VkaXRTcGVjCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9CgogICAgICB0aGlzLmJhc2VfZm9ybSA9IHsgLi4uZGF0YSwKICAgICAgICBtYXN0ZXJVbml0OiBtYXN0ZXJVbml0LAogICAgICAgIHN0b3JhZ2U6IGRhdGEuc3RvcmFnZSwKICAgICAgICBkZWxVbml0SWRzOiBbXSwKICAgICAgICBkZWxTcGVjU2t1SWRzOiBbXSwKICAgICAgICBzcGVjVHlwZTogZGF0YS5zcGVjVHlwZSwKICAgICAgICBicmFuY2hVbml0OiBicmFuY2hVbml0LAogICAgICAgIGNhdGVnb3J5UGF0aDogZGF0YS5jYXRlZ29yeVBhdGggPyBkYXRhLmNhdGVnb3J5UGF0aC5zcGxpdCgiLCIpLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChpdGVtKTsKICAgICAgICB9KSA6IFtdLAogICAgICAgIGNhdGVnb3J5SWQ6IGRhdGEuY2F0ZWdvcnlJZCwKICAgICAgICBhc3Npc3RDYXRlZ29yeUlkOiBkYXRhLmFzc2lzdENhdGVnb3J5SWQsCiAgICAgICAgYXNzaXN0Q2F0ZWdvcnlQYXRoOiBkYXRhLmFzc2lzdENhdGVnb3J5UGF0aCB8fCBbXSwKICAgICAgICBpc0VxOiBkYXRhLmlzRXEsCiAgICAgICAgLy8g5oqE56CB5ZWG5ZOBCiAgICAgICAgaXNEaXN0cmlidXRpb246IGRhdGEuaXNEaXN0cmlidXRpb24sCiAgICAgICAgLy8g6LSf5bqT5a2Y6ZSA5ZSuCiAgICAgICAgaXNTaGllbGQ6IGRhdGEuaXNTaGllbGQsCiAgICAgICAgLy8g57uP6JCl5bGP6JS9CiAgICAgICAgZGVsaXZlcnlTdXBJZHM6IGRhdGEuZGVsaXZlcnlTdXBJZHMuc3BsaXQoIiwiKSwKICAgICAgICAvLyDnianmtYHmlK/mjIEg5Zu65a6a5YC8IDEg5b+r6YCSIDIg6Ieq5o+QIOS8oOWPguagvOW8j++8mjEsMgogICAgICAgIGV4cHJlc3NUeXBlOiBkYXRhLmV4cHJlc3NUeXBlLAogICAgICAgIC8vIOW/q+mAkui/kOi0uSAxIOWMhemCriAyIOi/kOi0ueaooeeJiCAzIOWbuuWumui0ueeUqAogICAgICAgIGV4cHJlc3NGZWU6IGRhdGEuZXhwcmVzc0ZlZSwKICAgICAgICAvLyDlm7rlrprotLnnlKgKICAgICAgICBzaG93RXhwcmVzczogZGF0YS5zaG93RXhwcmVzcywKICAgICAgICAvLyDmmK/lkKblsZXnpLrlv6vpgJIgNeWxleekuiA05LiN5bGV56S6CiAgICAgICAgcnVsZUlkOiBkYXRhLnJ1bGVJZCAvLyDov5DotLnmqKHniYhpZAoKICAgICAgfTsgLy8g5Ymv5YiG57G7CgogICAgICBpZiAoZGF0YS5hc3Npc3RDYXRlZ29yeVBhdGggJiYgZGF0YS5hc3Npc3RDYXRlZ29yeVBhdGgubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5hc3Npc3RfY2F0ZSA9IGRhdGEuYXNzaXN0Q2F0ZWdvcnlQYXRoLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGFzc2lzdENhdGVnb3J5UGF0aDogaXRlbS5zcGxpdCgiLCIpLm1hcChpdGVtZSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGl0ZW1lKTsKICAgICAgICAgICAgfSkKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5hc3Npc3RfY2F0ZSA9IFt7CiAgICAgICAgICBhc3Npc3RDYXRlZ29yeVBhdGg6IFtdCiAgICAgICAgfV07CiAgICAgIH0KCiAgICAgIHRoaXMuaW1nX2xpc3QgPSBkYXRhLmltYWdlcy5tYXAoaXRlbSA9PiB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIG5hbWU6ICIiLAogICAgICAgICAgdXJsOiBpdGVtCiAgICAgICAgfTsKICAgICAgfSk7CiAgICAgIHRoaXMuZHluYW1pY1RhZ3MgPSBkYXRhLnRhZy5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pOyAvLyDlpJrop4TmoLzmlbDmja4KCiAgICAgIGlmIChwYXJzZUludCh0aGlzLmJhc2VfZm9ybS5zcGVjVHlwZSkgPT09IDIpIHsKICAgICAgICB0aGlzLnNrdV9saXN0ID0gZGF0YS5zcGVjR3JvdXAubWFwKGl0ZW0gPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc3BlY19kYXRhX2NoaWxkOiB0aGlzLnNwZWNfZGF0YS5maW5kKGl0ZW1GID0+IGl0ZW1GLmlkID09PSBpdGVtLmdyb3VwU3BlYy5zcGVjSWQpLmNoaWxkLAogICAgICAgICAgICBncm91cFNwZWNJZDogaXRlbS5ncm91cFNwZWMuc3BlY0lkLAogICAgICAgICAgICBncm91cFNwZWNOYW1lOiBpdGVtLmdyb3VwU3BlYy5zcGVjTmFtZSwKICAgICAgICAgICAgc2VsZl9zcGVjX3ZhbDogIiIsCiAgICAgICAgICAgIHNlbGZfc3BlY19pbnB1dDogZmFsc2UsCiAgICAgICAgICAgIHBhcmFtczogaXRlbS5wYXJhbXMubWFwKGl0ZW1DID0+IHsKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaWQ6IGl0ZW1DLnNwZWNWYWx1ZUlkLAogICAgICAgICAgICAgICAgc3BlY05hbWU6IGl0ZW1DLnNwZWNWYWx1ZU5hbWUsCiAgICAgICAgICAgICAgICBncm91cFNwZWNJZDogaXRlbS5ncm91cFNwZWMuc3BlY0lkCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy51bml0X2RhdGEgPSBkYXRhLnVuaXREYXRhLm1hcChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHNwZWNUYWJsZURhdGEgPSBkYXRhLnNwZWNNdWx0aXBsZS5maWx0ZXIoaXRlbVUgPT4gaXRlbVUudW5pdElkID09PSBpdGVtLnVuaXRJZCkubWFwKGl0ZW1TUCA9PiB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgaXNFZGl0U3BlYzogaXRlbVNQLmlzRWRpdFNwZWMsCiAgICAgICAgICAgICAgaW52ZW50b3J5OiBpdGVtU1AuaW52ZW50b3J5IC0gMCwKICAgICAgICAgICAgICBzcGVjR3JvdXBIYXNoOiBpdGVtU1Auc3BlY0dyb3VwSGFzaCwKICAgICAgICAgICAgICBpZF9EOiBpdGVtU1AuaWQsCiAgICAgICAgICAgICAgY29udmVyc2lvbjogaXRlbVNQLmNvbnZlcnNpb24sCiAgICAgICAgICAgICAgdW5pdElkOiBpdGVtU1AudW5pdElkLAogICAgICAgICAgICAgIHNwZWNOYW1lOiAoaXRlbVNQLnNwZWNHcm91cCB8fCBbXSkubWFwKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtUC5zcGVjVmFsdWVOYW1lOwogICAgICAgICAgICAgIH0pLmpvaW4oIl8iKSwKICAgICAgICAgICAgICBpZDogKGl0ZW1TUC5zcGVjR3JvdXAgfHwgW10pLm1hcChpdGVtUCA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVAuc3BlY1ZhbHVlSWQ7CiAgICAgICAgICAgICAgfSkuam9pbigiXyIpLAogICAgICAgICAgICAgIGdyb3VwU3BlY0lkOiAoaXRlbVNQLnNwZWNHcm91cCB8fCBbXSkubWFwKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtUC5zcGVjSWQ7CiAgICAgICAgICAgICAgfSkuam9pbigiXyIpLAogICAgICAgICAgICAgIGdyb3VwU3BlY05hbWU6IChpdGVtU1Auc3BlY0dyb3VwIHx8IFtdKS5tYXAoaXRlbVAgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1QLnNwZWNOYW1lOwogICAgICAgICAgICAgIH0pLmpvaW4oIl8iKSwKICAgICAgICAgICAgICBzcGVjSW1hZ2U6IHsKICAgICAgICAgICAgICAgIG5hbWU6ICIiLAogICAgICAgICAgICAgICAgdXJsOiBpdGVtU1Auc3BlY0ltYWdlIHx8ICIiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBiYXJDb2RlOiBpdGVtU1AuYmFyQ29kZSwKICAgICAgICAgICAgICB3ZWlnaHQ6IGl0ZW1TUC53ZWlnaHQsCiAgICAgICAgICAgICAgaXNEZWZhdWx0OiBpdGVtU1AuaXNEZWZhdWx0LAogICAgICAgICAgICAgIHNhbGVQcmljZTogaXRlbVNQLnNhbGVQcmljZS5zYWxlUHJpY2UsCiAgICAgICAgICAgICAgZW5hYmxlZExhZGRlcjogaXRlbVNQLnNhbGVQcmljZS5lbmFibGVkTGFkZGVyLAogICAgICAgICAgICAgIGxhZGRlclByaWNlOiBpdGVtU1Auc2FsZVByaWNlLmxhZGRlclByaWNlLAogICAgICAgICAgICAgIG1hcmtldFByaWNlOiBpdGVtU1Auc2FsZVByaWNlLm1hcmtldFByaWNlLAogICAgICAgICAgICAgIG1lbWJlclByaWNlOiBpdGVtU1AubWVtYmVyUHJpY2UsCiAgICAgICAgICAgICAgc2V0TnVtOiBpdGVtU1Auc2FsZVByaWNlLnNldE51bSwKICAgICAgICAgICAgICBpc1NhbGU6IGl0ZW1TUC5pc1NhbGUgfHwgNSwKICAgICAgICAgICAgICAvLyDlrqLmiLfnsbvlnovlkozlrqLmiLflv6vpgJ/osIPku7cKICAgICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZTogW10sCiAgICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2VPcGVuOiBmYWxzZSwKICAgICAgICAgICAgICBjdXN0b21lclByaWNlOiBbXSwKICAgICAgICAgICAgICBjdXN0b21lclByaWNlT3BlbjogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwKICAgICAgICAgICAgc3BlY190YWJsZV9EYXRhOiBzcGVjVGFibGVEYXRhCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIHRoaXMudGFic19hY3RpdmUgPSB0aGlzLnVuaXRfZGF0YVswXS51bml0TmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnVuaXRfZGF0YSA9IGRhdGEuc3BlY011bHRpcGxlLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGlzRWRpdFNwZWM6IGl0ZW0uaXNFZGl0U3BlYywKICAgICAgICAgICAgaW52ZW50b3J5OiBpdGVtLmludmVudG9yeSAtIDAsCiAgICAgICAgICAgIHNwZWNHcm91cEhhc2g6IGl0ZW0uc3BlY0dyb3VwSGFzaCwKICAgICAgICAgICAgaWRfRDogaXRlbS5pZCwKICAgICAgICAgICAgaXNNYXN0ZXI6IGl0ZW0uaXNNYXN0ZXIsCiAgICAgICAgICAgIGNvbnZlcnNpb246IGl0ZW0uY29udmVyc2lvbiwKICAgICAgICAgICAgdW5pdE5hbWU6IGl0ZW0udW5pdE5hbWUsCiAgICAgICAgICAgIHVuaXRJZDogaXRlbS51bml0SWQsCiAgICAgICAgICAgIHNwZWNJbWFnZTogewogICAgICAgICAgICAgIG5hbWU6ICIiLAogICAgICAgICAgICAgIHVybDogaXRlbS5zcGVjSW1hZ2UgfHwgIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYmFyQ29kZTogaXRlbS5iYXJDb2RlLAogICAgICAgICAgICB3ZWlnaHQ6IGl0ZW0ud2VpZ2h0LAogICAgICAgICAgICBpc0RlZmF1bHQ6IGl0ZW0uaXNEZWZhdWx0LAogICAgICAgICAgICBzYWxlUHJpY2U6IGl0ZW0uc2FsZVByaWNlLnNhbGVQcmljZSwKICAgICAgICAgICAgZW5hYmxlZExhZGRlcjogaXRlbS5zYWxlUHJpY2UuZW5hYmxlZExhZGRlciwKICAgICAgICAgICAgbGFkZGVyUHJpY2U6IGl0ZW0uc2FsZVByaWNlLmxhZGRlclByaWNlLAogICAgICAgICAgICBtYXJrZXRQcmljZTogaXRlbS5zYWxlUHJpY2UubWFya2V0UHJpY2UsCiAgICAgICAgICAgIG1lbWJlclByaWNlOiBpdGVtLm1lbWJlclByaWNlLAogICAgICAgICAgICBzZXROdW06IGl0ZW0uc2FsZVByaWNlLnNldE51bSwKICAgICAgICAgICAgaXNTYWxlOiBpdGVtLmlzU2FsZSB8fCA1LAogICAgICAgICAgICAvLyDlrqLmiLfnsbvlnovlkozlrqLmiLflv6vpgJ/osIPku7cKICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2U6IFtdLAogICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZU9wZW46IGZhbHNlLAogICAgICAgICAgICBjdXN0b21lclByaWNlOiBbXSwKICAgICAgICAgICAgY3VzdG9tZXJQcmljZU9wZW46IGZhbHNlCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9IC8vIOiOt+WPluaMh+WumuWVhuWTgeeahOacgOWQjueUn+aViOeahOWuouaIt+iwg+S7t+WNleaVsOaNrgoKCiAgICAgIGF3YWl0IHRoaXMuZ2V0Q3VzdG9tZXJQcmljZUJ5R29vZHNJZHMoKTsgLy/ojrflj5bmjIflrprllYblk4HnmoTmnIDlkI7nlJ/mlYjnmoTlrqLmiLfnsbvlnovosIPku7fmlbDmja4KCiAgICAgIGF3YWl0IHRoaXMuZ2V0Q3VzdG9tZXJUeXBlUHJpY2VCeUdvb2RzSWRzKCk7CiAgICB9LAoKICAgIC8vIOWPkeW4g+WVhuWTgQogICAgYXN5bmMgc3VibWl0R29vZHMoKSB7CiAgICAgIC8vIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRoaXMudW5pdF9kYXRhKSkKICAgICAgLy8gY29uc29sZS5sb2codGhpcy51bml0X2RhdGEpCiAgICAgIC8vIHJldHVybgogICAgICB0aGlzLiRyZWZzWyJiYXNlX2Zvcm0iXS52YWxpZGF0ZShhc3luYyB2YWxpZCA9PiB7CiAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICBsZXQgc3BlY0dyb3VwID0gW107CiAgICAgICAgICBsZXQgc3BlY011bHRpcGxlID0gW107CgogICAgICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLnNwZWNUeXBlID09PSAyKSB7CiAgICAgICAgICAgIC8vIOWkmuinhOagvAogICAgICAgICAgICBzcGVjR3JvdXAgPSB0aGlzLnNrdV9saXN0Lm1hcChpdGVtID0+IHsKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZ3JvdXBTcGVjOiB7CiAgICAgICAgICAgICAgICAgIHNwZWNOYW1lOiBpdGVtLmdyb3VwU3BlY05hbWUsCiAgICAgICAgICAgICAgICAgIHNwZWNJZDogaXRlbS5ncm91cFNwZWNJZAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHBhcmFtczogaXRlbS5wYXJhbXMubWFwKGl0ZW0gPT4gewogICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHNwZWNWYWx1ZUlkOiBpdGVtLmlkLAogICAgICAgICAgICAgICAgICAgIHNwZWNWYWx1ZU5hbWU6IGl0ZW0uc3BlY05hbWUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMudW5pdF9kYXRhLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICAgICAgaXRlbS5zcGVjX3RhYmxlX0RhdGEuZm9yRWFjaChpdGVtU1AgPT4gewogICAgICAgICAgICAgICAgbGV0IHNwZWNJZEcgPSAoaXRlbVNQLmlkICsgIiIpLnNwbGl0KCJfIik7CiAgICAgICAgICAgICAgICBsZXQgc3BlY05hbWVHID0gaXRlbVNQLnNwZWNOYW1lLnNwbGl0KCJfIik7CiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBTcGVjTmFtZUcgPSBpdGVtU1AuZ3JvdXBTcGVjTmFtZS5zcGxpdCgiXyIpOwogICAgICAgICAgICAgICAgbGV0IGdyb3VwU3BlY0lkRyA9IChpdGVtU1AuZ3JvdXBTcGVjSWQgKyAiIikuc3BsaXQoIl8iKTsKICAgICAgICAgICAgICAgIGxldCBzcGVjR3JvdXBTID0gZ3JvdXBTcGVjSWRHLm1hcCgoaXRlbVVVLCBpbmRleFVVKSA9PiB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgc3BlY0lkOiBncm91cFNwZWNJZEdbaW5kZXhVVV0sCiAgICAgICAgICAgICAgICAgICAgc3BlY05hbWU6IGdyb3VwU3BlY05hbWVHW2luZGV4VVVdLAogICAgICAgICAgICAgICAgICAgIHNwZWNWYWx1ZU5hbWU6IHNwZWNOYW1lR1tpbmRleFVVXSwKICAgICAgICAgICAgICAgICAgICBzcGVjVmFsdWVJZDogc3BlY0lkR1tpbmRleFVVXQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBsZXQgc2FsZVByaWNlUyA9IHsKICAgICAgICAgICAgICAgICAgY29udmVyc2lvbjogaXRlbS5jb252ZXJzaW9uIHx8IDAsCiAgICAgICAgICAgICAgICAgIHVuaXROYW1lOiBpdGVtLnVuaXROYW1lICsgIl8iICsgaXRlbVNQLnNwZWNOYW1lLAogICAgICAgICAgICAgICAgICB1bml0SWQ6IGl0ZW0udW5pdElkLAogICAgICAgICAgICAgICAgICBpc01hc3RlcjogaXRlbS5pc01hc3RlciwKICAgICAgICAgICAgICAgICAgZGVsZXRlU3RhdHVzOiBpdGVtU1AuZGVsZXRlU3RhdHVzIHx8IDQsCiAgICAgICAgICAgICAgICAgIGVuYWJsZWRMYWRkZXI6IGl0ZW1TUC5lbmFibGVkTGFkZGVyLAogICAgICAgICAgICAgICAgICBzYWxlUHJpY2VBcmVhVHlwZTogMSwKICAgICAgICAgICAgICAgICAgc2FsZVByaWNlOiBpdGVtU1Auc2FsZVByaWNlLAogICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogaXRlbVNQLmxhZGRlclByaWNlLAogICAgICAgICAgICAgICAgICBtYXJrZXRQcmljZTogaXRlbVNQLm1hcmtldFByaWNlLAogICAgICAgICAgICAgICAgICBtZW1iZXJQcmljZTogaXRlbVNQLm1lbWJlclByaWNlLAogICAgICAgICAgICAgICAgICBzZXROdW06IGl0ZW1TUC5zZXROdW0sCiAgICAgICAgICAgICAgICAgIGlzU2FsZTogaXRlbVNQLmlzU2FsZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGxldCBjdXN0b21lclByaWNlID0gW107CiAgICAgICAgICAgICAgICBpdGVtU1AuY3VzdG9tZXJQcmljZS5mb3JFYWNoKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLnByaWNlSWQpIHsKICAgICAgICAgICAgICAgICAgICBjdXN0b21lclByaWNlLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IGl0ZW1QLnByaWNlLAogICAgICAgICAgICAgICAgICAgICAgdW5pdE5hbWU6IGl0ZW1QLnVuaXROYW1lLAogICAgICAgICAgICAgICAgICAgICAgYWRqUHJpY2V0YWc6IGl0ZW1QLmFkalByaWNldGFnLAogICAgICAgICAgICAgICAgICAgICAgY3VzdG9tZXJOYW1lOiBpdGVtUC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgY3VzdG9tZXJJZDogaXRlbVAuaWQsCiAgICAgICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogaXRlbVAubGFkZGVyUHJpY2UKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBsZXQgY3VzdG9tZXJUeXBlUHJpY2UgPSBbXTsKICAgICAgICAgICAgICAgIGl0ZW1TUC5jdXN0b21lclR5cGVQcmljZS5mb3JFYWNoKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLnByaWNlSWQpIHsKICAgICAgICAgICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBpdGVtUC5wcmljZSwKICAgICAgICAgICAgICAgICAgICAgIHVuaXROYW1lOiBpdGVtUC51bml0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGFkalByaWNldGFnOiBpdGVtUC5hZGpQcmljZXRhZywKICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyTmFtZTogaXRlbVAubmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyVHlwZTogaXRlbVAuaWQsCiAgICAgICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogaXRlbVAubGFkZGVyUHJpY2UKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBzcGVjTXVsdGlwbGUucHVzaCh7CiAgICAgICAgICAgICAgICAgIHVuaXRJZDogaXRlbS51bml0SWQsCiAgICAgICAgICAgICAgICAgIHVuaXROYW1lOiBpdGVtLnVuaXROYW1lLAogICAgICAgICAgICAgICAgICBpc01hc3RlcjogaXRlbS5pc01hc3RlciwKICAgICAgICAgICAgICAgICAgY29udmVyc2lvbjogaXRlbS5jb252ZXJzaW9uIHx8IDAsCiAgICAgICAgICAgICAgICAgIHNwZWNJbWFnZTogaXRlbVNQLnNwZWNJbWFnZS51cmwsCiAgICAgICAgICAgICAgICAgIGlzRGVmYXVsdDogaXRlbVNQLmlzRGVmYXVsdCwKICAgICAgICAgICAgICAgICAgYmFyQ29kZTogaXRlbVNQLmJhckNvZGUsCiAgICAgICAgICAgICAgICAgIHdlaWdodDogaXRlbVNQLndlaWdodCwKICAgICAgICAgICAgICAgICAgc3BlY0dyb3VwOiBzcGVjR3JvdXBTLAogICAgICAgICAgICAgICAgICBzYWxlUHJpY2U6IHNhbGVQcmljZVMsCiAgICAgICAgICAgICAgICAgIGN1c3RvbWVyUHJpY2U6IGN1c3RvbWVyUHJpY2UsCiAgICAgICAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlOiBjdXN0b21lclR5cGVQcmljZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8g5Y2V6KeE5qC8CiAgICAgICAgICAgIHNwZWNNdWx0aXBsZSA9IHRoaXMudW5pdF9kYXRhLm1hcChpdGVtID0+IHsKICAgICAgICAgICAgICBjb25zdCBzYWxlUHJpY2VTID0gewogICAgICAgICAgICAgICAgY29udmVyc2lvbjogaXRlbS5jb252ZXJzaW9uIHx8IDAsCiAgICAgICAgICAgICAgICB1bml0TmFtZTogaXRlbS51bml0TmFtZSwKICAgICAgICAgICAgICAgIHVuaXRJZDogaXRlbS51bml0SWQsCiAgICAgICAgICAgICAgICBpc01hc3RlcjogaXRlbS5pc01hc3RlciwKICAgICAgICAgICAgICAgIGRlbGV0ZVN0YXR1czogaXRlbS5kZWxldGVTdGF0dXMgfHwgNCwKICAgICAgICAgICAgICAgIGVuYWJsZWRMYWRkZXI6IGl0ZW0uZW5hYmxlZExhZGRlciwKICAgICAgICAgICAgICAgIHNhbGVQcmljZUFyZWFUeXBlOiAxLAogICAgICAgICAgICAgICAgc2FsZVByaWNlOiBpdGVtLnNhbGVQcmljZSwKICAgICAgICAgICAgICAgIGxhZGRlclByaWNlOiBpdGVtLmxhZGRlclByaWNlLAogICAgICAgICAgICAgICAgbWFya2V0UHJpY2U6IGl0ZW0ubWFya2V0UHJpY2UsCiAgICAgICAgICAgICAgICBtZW1iZXJQcmljZTogaXRlbS5tZW1iZXJQcmljZSwKICAgICAgICAgICAgICAgIHNldE51bTogaXRlbS5zZXROdW0sCiAgICAgICAgICAgICAgICBpc1NhbGU6IGl0ZW0uaXNTYWxlCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBsZXQgY3VzdG9tZXJQcmljZSA9IFtdOwogICAgICAgICAgICAgIGl0ZW0uY3VzdG9tZXJQcmljZS5mb3JFYWNoKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgIGlmICghaXRlbVAucHJpY2VJZCkgewogICAgICAgICAgICAgICAgICBjdXN0b21lclByaWNlLnB1c2goewogICAgICAgICAgICAgICAgICAgIHByaWNlOiBpdGVtUC5wcmljZSwKICAgICAgICAgICAgICAgICAgICB1bml0TmFtZTogaXRlbVAudW5pdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgYWRqUHJpY2V0YWc6IGl0ZW1QLmFkalByaWNldGFnLAogICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyTmFtZTogaXRlbVAubmFtZSwKICAgICAgICAgICAgICAgICAgICBjdXN0b21lcklkOiBpdGVtUC5pZCwKICAgICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogaXRlbVAubGFkZGVyUHJpY2UKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgbGV0IGN1c3RvbWVyVHlwZVByaWNlID0gW107CiAgICAgICAgICAgICAgaXRlbS5jdXN0b21lclR5cGVQcmljZS5mb3JFYWNoKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgIGlmICghaXRlbVAucHJpY2VJZCkgewogICAgICAgICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwcmljZTogaXRlbVAucHJpY2UsCiAgICAgICAgICAgICAgICAgICAgYWRqUHJpY2V0YWc6IGl0ZW1QLmFkalByaWNldGFnLAogICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyTmFtZTogaXRlbVAubmFtZSwKICAgICAgICAgICAgICAgICAgICBjdXN0b21lclR5cGU6IGl0ZW1QLmlkLAogICAgICAgICAgICAgICAgICAgIHVuaXROYW1lOiBpdGVtUC51bml0TmFtZSwKICAgICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogaXRlbVAubGFkZGVyUHJpY2UKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGJhckNvZGU6IGl0ZW0uYmFyQ29kZSwKICAgICAgICAgICAgICAgIHdlaWdodDogaXRlbS53ZWlnaHQsCiAgICAgICAgICAgICAgICBpc0RlZmF1bHQ6IGl0ZW0uaXNEZWZhdWx0LAogICAgICAgICAgICAgICAgdW5pdElkOiBpdGVtLnVuaXRJZCwKICAgICAgICAgICAgICAgIHVuaXROYW1lOiBpdGVtLnVuaXROYW1lLAogICAgICAgICAgICAgICAgaXNNYXN0ZXI6IGl0ZW0uaXNNYXN0ZXIsCiAgICAgICAgICAgICAgICBjb252ZXJzaW9uOiBpdGVtLmNvbnZlcnNpb24gfHwgMCwKICAgICAgICAgICAgICAgIHNwZWNJbWFnZTogaXRlbS5zcGVjSW1hZ2UudXJsLAogICAgICAgICAgICAgICAgc3BlY0dyb3VwOiBbXSwKICAgICAgICAgICAgICAgIHNhbGVQcmljZTogc2FsZVByaWNlUywKICAgICAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlOiBjdXN0b21lclR5cGVQcmljZSwKICAgICAgICAgICAgICAgIGN1c3RvbWVyUHJpY2U6IGN1c3RvbWVyUHJpY2UKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCBpc0ZTYWxlID0gc3BlY011bHRpcGxlLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5zYWxlUHJpY2UuaXNTYWxlID09PSA0KTsKCiAgICAgICAgICBpZiAoaXNGU2FsZSkgewogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoIuiHs+WwkeS/neeVmeS4gOadoeinhOagvOeahOmUgOWUrueKtuaAgeS4uuOAkOWQr+eUqOOAkSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgICAgY29uc3QgdW5pdERhdGEgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLmJhc2VfZm9ybS5icmFuY2hVbml0KTsKICAgICAgICAgIHVuaXREYXRhLnVuc2hpZnQodGhpcy5iYXNlX2Zvcm0ubWFzdGVyVW5pdCk7CiAgICAgICAgICBjb25zdCBub3RDdXN0b21lciA9IHRoaXMuY3VzdG9tZXJfbGlzdC5tYXAoaXRlbSA9PiB7CiAgICAgICAgICAgIHJldHVybiBpdGVtLmlkOwogICAgICAgICAgfSk7IC8vIOWJr+WIhuexu+aVsOaNrue7hOijhQoKICAgICAgICAgIGxldCBhc3Npc3RDYXRlZ29yeVBhdGggPSBbXTsKICAgICAgICAgIGxldCBhc3Npc3RDYXRlZ29yeUlkID0gW107IC8vIOi/h+a7pOWPquaciemAieaLqeWIhuexu+eahOaVsOaNrgoKICAgICAgICAgIGNvbnN0IGFzc2lzdENhdGUgPSB0aGlzLmFzc2lzdF9jYXRlLmZpbHRlcihpdGVtID0+ICEhaXRlbS5hc3Npc3RDYXRlZ29yeVBhdGgubGVuZ3RoKTsKICAgICAgICAgIGFzc2lzdENhdGUuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgICAgYXNzaXN0Q2F0ZWdvcnlQYXRoLnB1c2goaXRlbS5hc3Npc3RDYXRlZ29yeVBhdGguam9pbigiLCIpKTsKICAgICAgICAgICAgYXNzaXN0Q2F0ZWdvcnlJZC5wdXNoKGl0ZW0uYXNzaXN0Q2F0ZWdvcnlQYXRoW2l0ZW0uYXNzaXN0Q2F0ZWdvcnlQYXRoLmxlbmd0aCAtIDFdKTsKICAgICAgICAgIH0pOwogICAgICAgICAgY29uc3QgcGFyYW1zID0gewogICAgICAgICAgICBtZXJjaGFudElkOiB0aGlzLmJhc2VfZm9ybS5tZXJjaGFudElkLAogICAgICAgICAgICBjYXRlZ29yeVBhdGg6IHRoaXMuYmFzZV9mb3JtLmNhdGVnb3J5UGF0aC5qb2luKCIsIiksCiAgICAgICAgICAgIGNhdGVnb3J5SWQ6IHRoaXMuYmFzZV9mb3JtLmNhdGVnb3J5SWQsCiAgICAgICAgICAgIGFzc2lzdENhdGVnb3J5UGF0aDogYXNzaXN0Q2F0ZWdvcnlQYXRoLAogICAgICAgICAgICBhc3Npc3RDYXRlZ29yeUlkOiBhc3Npc3RDYXRlZ29yeUlkLmpvaW4oIiwiKSwKICAgICAgICAgICAgdGl0bGU6IHRoaXMuYmFzZV9mb3JtLnRpdGxlLAogICAgICAgICAgICBzdG9yYWdlOiB0aGlzLmJhc2VfZm9ybS5zdG9yYWdlLAogICAgICAgICAgICBkZWxVbml0SWRzOiB0aGlzLmJhc2VfZm9ybS5kZWxVbml0SWRzLAogICAgICAgICAgICBkZWxTcGVjU2t1SWRzOiB0aGlzLmJhc2VfZm9ybS5kZWxTcGVjU2t1SWRzLAogICAgICAgICAgICBzcGVjVHlwZTogdGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUsCiAgICAgICAgICAgIGNyZWF0ZVVzZXJOYW1lOiB0aGlzLnVzZXJOYW1lLAogICAgICAgICAgICBzcGVjR3JvdXA6IHNwZWNHcm91cCwKICAgICAgICAgICAgc3BlY011bHRpcGxlOiBzcGVjTXVsdGlwbGUsCiAgICAgICAgICAgIHVuaXREYXRhOiB1bml0RGF0YSwKICAgICAgICAgICAgZGVzY3JpYmU6IHRoaXMuYmFzZV9mb3JtLmRlc2NyaWJlLAogICAgICAgICAgICBjb2RlOiB0aGlzLmJhc2VfZm9ybS5jb2RlLAogICAgICAgICAgICBiYXJDb2RlOiB0aGlzLmJhc2VfZm9ybS5iYXJDb2RlLAogICAgICAgICAgICB3ZWlnaHQ6IHRoaXMuYmFzZV9mb3JtLndlaWdodCwKICAgICAgICAgICAgZXhwaXJlVGltZTogdGhpcy5iYXNlX2Zvcm0uZXhwaXJlVGltZSwKICAgICAgICAgICAgYnJhbmRJZDogdGhpcy5iYXNlX2Zvcm0uYnJhbmRJZCwKICAgICAgICAgICAgdGFnOiB0aGlzLmR5bmFtaWNUYWdzLmpvaW4oIiwiKSwKICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuYmFzZV9mb3JtLmRlc2NyaXB0aW9uLAogICAgICAgICAgICBub1NhbGVzU2hvcDogIiIsCiAgICAgICAgICAgIGltYWdlczogdGhpcy5iYXNlX2Zvcm0uaW1hZ2VzLAogICAgICAgICAgICBlbmFibGVTdGF0dXM6IHRoaXMuYmFzZV9mb3JtLmVuYWJsZVN0YXR1cywKICAgICAgICAgICAgaXNFcTogdGhpcy5iYXNlX2Zvcm0uaXNFcSwKICAgICAgICAgICAgLy/mioTnoIHllYblk4EKICAgICAgICAgICAgaXNEaXN0cmlidXRpb246IHRoaXMuYmFzZV9mb3JtLmlzRGlzdHJpYnV0aW9uLAogICAgICAgICAgICAvL+aYr+WQpui0n+W6k+WtmOmUgOWUrgogICAgICAgICAgICBpc1NoaWVsZDogdGhpcy5iYXNlX2Zvcm0uaXNTaGllbGQsCiAgICAgICAgICAgIC8v57uP6JCl5bGP6JS9CiAgICAgICAgICAgIGRlbGl2ZXJ5U3VwSWRzOiB0aGlzLmJhc2VfZm9ybS5kZWxpdmVyeVN1cElkcy5qb2luKCIsIiksCiAgICAgICAgICAgIC8vIOeJqea1geaUr+aMgSDlm7rlrprlgLwgMSDlv6vpgJIgMiDoh6rmj5Ag5Lyg5Y+C5qC85byP77yaMSwyCiAgICAgICAgICAgIGV4cHJlc3NUeXBlOiB0aGlzLmJhc2VfZm9ybS5leHByZXNzVHlwZSwKICAgICAgICAgICAgLy8g5b+r6YCS6L+Q6LS5IDEg5YyF6YKuIDIg6L+Q6LS55qih54mIIDMg5Zu65a6a6LS555SoCiAgICAgICAgICAgIGV4cHJlc3NGZWU6IHRoaXMuYmFzZV9mb3JtLmV4cHJlc3NGZWUsCiAgICAgICAgICAgIC8vIOWbuuWumui0ueeUqAogICAgICAgICAgICBzaG93RXhwcmVzczogdGhpcy5iYXNlX2Zvcm0uc2hvd0V4cHJlc3MsCiAgICAgICAgICAgIC8vIOaYr+WQpuWxleekuuW/q+mAkiA15bGV56S6IDTkuI3lsZXnpLoKICAgICAgICAgICAgcnVsZUlkOiB0aGlzLmJhc2VfZm9ybS5ydWxlSWQsCiAgICAgICAgICAgIC8vIOi/kOi0ueaooeeJiGlkCiAgICAgICAgICAgIG5vdEFyZWE6IHRoaXMuYmFzZV9mb3JtLmlzU2hpZWxkID09PSA1ID8gdGhpcy5iYXNlX2Zvcm0ubm90QXJlYSA6IFtdLAogICAgICAgICAgICAvLyDnu4/okKXlsY/olL3lnLDljLoKICAgICAgICAgICAgbm90Q3VzdG9tZXJUeXBlOiB0aGlzLmJhc2VfZm9ybS5pc1NoaWVsZCA9PT0gNSA/IHRoaXMuY3VzdG9tZXJfdHlwZV9jaGVjay5qb2luKCIsIikgOiAiIiwKICAgICAgICAgICAgLy/nu4/okKXlsY/olL0g5a6i5oi357G75Z6L5bGP6JS9CiAgICAgICAgICAgIG5vdEN1c3RvbWVyOiB0aGlzLmJhc2VfZm9ybS5pc1NoaWVsZCA9PT0gNSA/IG5vdEN1c3RvbWVyLmpvaW4oIiwiKSA6ICIiLAogICAgICAgICAgICAvL+e7j+iQpeWxj+iUvSDlrqLmiLflsY/olL0KICAgICAgICAgICAgaXNTdG9yZTogdGhpcy5zeXN0ZW1UeXBlID09PSAzCiAgICAgICAgICB9OyAvLyBjb25zb2xlLmxvZyhwYXJhbXMpCiAgICAgICAgICAvLyByZXR1cm4KCiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgbGV0IHRhcmdldCA9IHt9OwoKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICh0aGlzLiRyb3V0ZS5wYXJhbXMuaWQpIHsKICAgICAgICAgICAgICB0YXJnZXQgPSBhd2FpdCBlZGl0UXVpY2tHb29kcyh7IC4uLnBhcmFtcywKICAgICAgICAgICAgICAgIGlkOiB0aGlzLmdvb2RzX2lkLAogICAgICAgICAgICAgICAgYmFzaWNHb29kc0lkOiB0aGlzLmJhc2VfZm9ybS5iYXNpY0dvb2RzSWQKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0YXJnZXQgPSBhd2FpdCBhZGRCYXNpY0FuZFB1Ymxpc2hHb29kcyhwYXJhbXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgdHlwZTogInN1Y2Nlc3MiLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICLmj5DkuqTmiJDlip8iCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhd2FpdCB0aGlzLmRlbFBhdXNlU2F2ZSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuc3lzdGVtVHlwZSA9PT0gMykgewogICAgICAgICAgICAgIGF3YWl0IHRoaXMuJGNsb3NlQ3VycmVudEdvRWRpdChgL2dvb2RzL3NhbGUvTWVyY2hhbnRzR29vZHNgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRjbG9zZUN1cnJlbnRHb0VkaXQoYC9nb29kcy9zYWxlL1B1Ymxpc2hHb29kc2ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDllYblk4HliIbnsbvpgInmi6kKICAgIGNhdGVnb3J5Q2hhbmdlKHZhbCkgewogICAgICB0aGlzLmJhc2VfZm9ybS5jYXRlZ29yeUlkID0gdmFsW3ZhbC5sZW5ndGggLSAxXTsKICAgIH0sCgogICAgLy8g5ZWG5ZOB5Ymv5YiG57G76YCJ5oupCiAgICBjYXRlZ29yeUFzc2lzdENoYW5nZSh2YWwpIHsKICAgICAgdGhpcy5iYXNlX2Zvcm0uYXNzaXN0Q2F0ZWdvcnlJZCA9IHZhbFt2YWwubGVuZ3RoIC0gMV07CiAgICB9LAoKICAgIC8vIOWTgeeJjOmAieaLqQogICAgYnJhbmRDb25maXJtKHZhbCkgewogICAgICBpZiAodmFsLmxlbmd0aCA+IDEpIHsKICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgIHR5cGU6ICJlcnJvciIsCiAgICAgICAgICBtZXNzYWdlOiAi6K+36YCJ5oup5LiA5Liq5ZOB54mM77yBIgogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdGhpcy5iYXNlX2Zvcm0uYnJhbmROYW1lID0gdmFsWzBdLnRpdGxlOwogICAgICB0aGlzLmJhc2VfZm9ybS5icmFuZElkID0gdmFsWzBdLmlkOwogICAgfSwKCiAgICAvLyDorqHnrpfluILlnLrku7cKICAgIHNhbGVQcmljZUJsdXIoaW5kZXgsIGluZGV4VSkgewogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CiAgICAgICAgY29uc3QgbWFya2V0UHJpY2UgPSB0aGlzLiROUC50aW1lcyh0YXJnZXRbaW5kZXhdLnNhbGVQcmljZSwgdGhpcy5zYWxlUHJpY2VUaW1lcyk7CiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHsgLi4udGFyZ2V0W2luZGV4XSwKICAgICAgICAgIG1hcmtldFByaWNlOiBtYXJrZXRQcmljZQogICAgICAgIH07IC8vIOW9k+WJjeWkseWOu+eEpueCueeahOS4uuS4u+WNleS9jQoKICAgICAgICBpZiAodGFyZ2V0W2luZGV4XS5pc01hc3RlciA9PT0gNSkgewogICAgICAgICAgLy8g5Y2V5L2N5o2i566X5YWz57O75a2Y5Zyo5LiU6L+Z5Liq5Y2V5L2N5Li66L6F5Yqp5Y2V5L2N5LiU5b2T5YmN5Y2V5L2N5pyq6K6+572u6L+H5Lu35qC8CiAgICAgICAgICB0YXJnZXQuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgICAgaWYgKGl0ZW0uY29udmVyc2lvbiAmJiBpdGVtLmlzTWFzdGVyID09PSA0ICYmICFpdGVtLnNhbGVQcmljZSkgewogICAgICAgICAgICAgIGl0ZW0uc2FsZVByaWNlID0gdGhpcy4kTlAudGltZXModGFyZ2V0W2luZGV4XS5zYWxlUHJpY2UsIGl0ZW0uY29udmVyc2lvbik7CiAgICAgICAgICAgICAgaXRlbS5tYXJrZXRQcmljZSA9IHRoaXMuJE5QLnRpbWVzKG1hcmtldFByaWNlLCBpdGVtLmNvbnZlcnNpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMudW5pdF9kYXRhW2luZGV4VV0uc3BlY190YWJsZV9EYXRhW2luZGV4XS5tYXJrZXRQcmljZSA9IHRoaXMuJE5QLnRpbWVzKHRoaXMudW5pdF9kYXRhW2luZGV4VV0uc3BlY190YWJsZV9EYXRhW2luZGV4XS5zYWxlUHJpY2UsIHRoaXMuc2FsZVByaWNlVGltZXMpOwogICAgICB9CiAgICB9LAoKICAgIC8vIOS8muWRmOS7t+WkseWOu+eEpueCuQogICAgbWVtYmVyUHJpY2VCbHVyKGluZGV4KSB7CiAgICAgIC8vIOagueaNruavlOS+i+iHquWKqOaNoueulyDkvJrlkZjku7cKICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLnNwZWNUeXBlID09PSAxKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy51bml0X2RhdGEpOwogICAgICAgIHRhcmdldC5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgaWYgKGl0ZW0uY29udmVyc2lvbiAmJiBpdGVtLmlzTWFzdGVyID09PSA0KSB7CiAgICAgICAgICAgIGl0ZW0ubWVtYmVyUHJpY2UgPSB0aGlzLiROUC50aW1lcyh0YXJnZXRbaW5kZXhdLm1lbWJlclByaWNlLCBpdGVtLmNvbnZlcnNpb24pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgICB9CiAgICB9LAoKICAgIC8vIOinhOagvOaYjue7huWQjOatpeaVsOaNrgogICAgb3RoZXJTZXRQcmljZShyb3csIGluZGV4KSB7CiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMudW5pdF9kYXRhKTsKICAgICAgdGFyZ2V0W2luZGV4XS5zcGVjX3RhYmxlX0RhdGEgPSB0YXJnZXRbaW5kZXhdLnNwZWNfdGFibGVfRGF0YS5tYXAoaXRlbSA9PiB7CiAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwKICAgICAgICAgIG1hcmtldFByaWNlOiByb3cubWFya2V0UHJpY2UsCiAgICAgICAgICBtZW1iZXJQcmljZTogcm93Lm1lbWJlclByaWNlLAogICAgICAgICAgc2FsZVByaWNlOiByb3cuc2FsZVByaWNlLAogICAgICAgICAgZW5hYmxlZExhZGRlcjogcm93LmVuYWJsZWRMYWRkZXIsCiAgICAgICAgICBsYWRkZXJQcmljZTogcm93LmxhZGRlclByaWNlLAogICAgICAgICAgc2V0TnVtOiByb3cuc2V0TnVtLAogICAgICAgICAgaXNTYWxlOiByb3cuaXNTYWxlIHx8IDUsCiAgICAgICAgICBzcGVjSW1hZ2U6IHJvdy5zcGVjSW1hZ2UsCiAgICAgICAgICBiYXJDb2RlOiByb3cuYmFyQ29kZSwKICAgICAgICAgIHdlaWdodDogcm93LndlaWdodCwKICAgICAgICAgIC8vIOWuouaIt+exu+Wei+WSjOWuouaIt+W/q+mAn+iwg+S7twogICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2U6IHJvdy5jdXN0b21lclR5cGVQcmljZSwKICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlT3Blbjogcm93LmN1c3RvbWVyVHlwZVByaWNlT3BlbiwKICAgICAgICAgIGN1c3RvbWVyUHJpY2U6IHJvdy5jdXN0b21lclByaWNlLAogICAgICAgICAgY3VzdG9tZXJQcmljZU9wZW46IHJvdy5jdXN0b21lclByaWNlT3BlbgogICAgICAgIH07CiAgICAgIH0pOwogICAgICB0aGlzLnVuaXRfZGF0YSA9IHRhcmdldDsKICAgIH0sCgogICAgLy8g6KeE5qC85piO57uG5Yig6ZmkCiAgICBzcGVjRGV0YWlsRGVsKHJvdywgaW5kZXgpIHsKICAgICAgbGV0IHRhcmdldCA9IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMudW5pdF9kYXRhKTsKCiAgICAgIGlmICh0aGlzLmdvb2RzX2lkKSB7CiAgICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLmRlbFNwZWNTa3VJZHMuaW5kZXhPZihyb3cuc3BlY0dyb3VwSGFzaCkgPT09IC0xKSB7CiAgICAgICAgICB0aGlzLmJhc2VfZm9ybS5kZWxTcGVjU2t1SWRzLnB1c2gocm93LnNwZWNHcm91cEhhc2gpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGFyZ2V0ID0gdGFyZ2V0Lm1hcChpdGVtID0+IHsKICAgICAgICBpdGVtLnNwZWNfdGFibGVfRGF0YS5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIHJldHVybiBpdGVtOwogICAgICB9KTsgLy8gdGFyZ2V0WzBdLnNwZWNfdGFibGVfRGF0YS5zcGxpY2UoaW5kZXgsIDEpCgogICAgICBjb25zdCBzcGVjTmFtZUFyciA9IHJvdy5zcGVjTmFtZS5pbmRleE9mKCJfIikgPyByb3cuc3BlY05hbWUuc3BsaXQoIl8iKSA6IHJvdy5zcGVjTmFtZTsKICAgICAgbGV0IGlzRmFsc2VWYWwgPSAiIjsKCiAgICAgIGZvciAobGV0IGkgaW4gc3BlY05hbWVBcnIpIHsKICAgICAgICBsZXQgaXRlbVMgPSBzcGVjTmFtZUFycltpXTsKICAgICAgICBjb25zdCBpc0hhdmUgPSB0YXJnZXQuc29tZShpdGVtVSA9PiB7CiAgICAgICAgICByZXR1cm4gaXRlbVUuc3BlY190YWJsZV9EYXRhLmZpbmQoaXRlbSA9PiBpdGVtLnNwZWNOYW1lLmluZGV4T2YoaXRlbVMpID4gLTEpOwogICAgICAgIH0pOwoKICAgICAgICBpZiAoIWlzSGF2ZSkgewogICAgICAgICAgaXNGYWxzZVZhbCA9IGl0ZW1TOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IC8vIGNvbnNvbGUubG9nKCJpc1N0YXksIiwgaXNGYWxzZVZhbCk7CgoKICAgICAgaWYgKGlzRmFsc2VWYWwpIHsKICAgICAgICB0aGlzLnNrdV9saXN0LmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCBpbmRleFAgPSBpdGVtLnBhcmFtcy5maW5kSW5kZXgoaXRlbVAgPT4gaXRlbVAuc3BlY05hbWUgPT09IGlzRmFsc2VWYWwpOwoKICAgICAgICAgIGlmIChpbmRleFAgPiAtMSkgewogICAgICAgICAgICBpdGVtLnBhcmFtcy5zcGxpY2UoaW5kZXhQLCAxKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgICAgdGhpcy51bml0X2RhdGEgPSB0YXJnZXQ7CiAgICB9LAoKICAgIC8vIOmAieaLqeWVhumTugogICAgc2VsQ2hvc2UodmFsLCByb3cpIHsKICAgICAgdGhpcy5iYXNlX2Zvcm0uc2hvcElkID0gcm93WzBdLmlkOwogICAgICB0aGlzLmJhc2VfZm9ybS5zaG9wTmFtZSA9IHJvd1swXS5uYW1lOwogICAgfSwKCiAgICAvLyDlnLDljLrpgInmi6kKICAgIHNlbFJlZ2lvbihyb3cpIHsKICAgICAgdGhpcy5iYXNlX2Zvcm0ubm90QXJlYSA9IHJvdy5tYXAoaXRlbSA9PiB7CiAgICAgICAgcmV0dXJuIGl0ZW0uY29kZVBhdGg7CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDojrflj5blrqLmiLfnsbvlnosKICAgIGFzeW5jIGdldEFsbEN1c3RvbWVyU291cmNlKCkgewogICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0QWxsQ3VzdG9tZXJTb3VyY2UoewogICAgICAgIHBhZ2U6IDEsCiAgICAgICAgcGFnZVNpemU6IDUwCiAgICAgIH0pOwogICAgICB0aGlzLmN1c3RvbWVyX3R5cGVfbGlzdCA9IGRhdGEuZGF0YTsKICAgIH0sCgogICAgLy8g6YCJ5oup5a6i5oi3CiAgICBjdXN0b21lclNlbCh2YWwpIHsKICAgICAgdGhpcy5jdXN0b21lcl9saXN0ID0gdmFsOwogICAgfSwKCiAgICAvLyDliKDpmaTlrqLmiLcKICAgIGRlbGV0ZUN1c3RvbWVyKGluZGV4KSB7CiAgICAgIHRoaXMuY3VzdG9tZXJfbGlzdC5zcGxpY2UoaW5kZXgsIDEpOwogICAgfSwKCiAgICAvLyDmiZPlvIDmjIflrprku7flvLnnqpcKICAgIG9wZW5Nb2RhbChpbmRleCwga2V5LCByb3csIGluZGV4VSkgewogICAgICAvLyDojrflj5bpmLbmoq/ku7fmlbDmja7vvIzlgZrpmLbmoq/ku7fosIPku7cKICAgICAgaWYgKHJvdykgewogICAgICAgIHRoaXMudW5pdGlzTWFzdGVyID0gcm93LmlzTWFzdGVyOwogICAgICAgIHRoaXMuc2t1X2lkID0gcm93LmlkOwogICAgICAgIHRoaXMubGFkZGVyUHJpY2UgPSByb3cubGFkZGVyUHJpY2U7CiAgICAgICAgdGhpcy5lbmFibGVkTGFkZGVyID0gcm93LmVuYWJsZWRMYWRkZXI7CgogICAgICAgIGlmIChrZXkgPT09ICJ0eXBlX3ByaWNlX3Nob3ciKSB7CiAgICAgICAgICAvLyDlrqLmiLfnsbvlnovmjIflrprku7fosIPku7fmlbDmja4KICAgICAgICAgIHRoaXMuY3VzdG9tZXJUeXBlUHJpY2VPcGVuID0gcm93LmN1c3RvbWVyVHlwZVByaWNlT3BlbjsKICAgICAgICAgIHRoaXMuY3VzdG9tZXJUeXBlUHJpY2UgPSByb3cuY3VzdG9tZXJUeXBlUHJpY2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoa2V5ID09PSAiYXBwb2ludF9wcmljZV9zaG93IikgewogICAgICAgICAgLy8g5a6i5oi35oyH5a6a5Lu36LCD5Lu35pWw5o2uCiAgICAgICAgICB0aGlzLmN1c3RvbWVyUHJpY2VPcGVuID0gcm93LmN1c3RvbWVyUHJpY2VPcGVuOwogICAgICAgICAgdGhpcy5jdXN0b21lclByaWNlID0gcm93LmN1c3RvbWVyUHJpY2U7CiAgICAgICAgfQogICAgICB9CgogICAgICB0aGlzLnNrdV9pbmRleCA9IGluZGV4OwoKICAgICAgaWYgKGluZGV4VSA+IC0xKSB7CiAgICAgICAgdGhpcy51bml0X2luZGV4ID0gaW5kZXhVOwogICAgICB9CgogICAgICB0aGlzW2tleV0gPSB0cnVlOwogICAgfSwKCiAgICAvLyDmjIflrprku7fmlbDmja7noa7lrpoKICAgIGFwcG9pbnRQcmljZUNvbmZpcm0oY3VzdG9tZXJQcmljZU9wZW4sIGN1c3RvbWVyUHJpY2UpIHsKICAgICAgY29uc29sZS5sb2coY3VzdG9tZXJQcmljZSk7CgogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICAvLyDljZXop4TmoLwKICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CiAgICAgICAgdGFyZ2V0W3RoaXMuc2t1X2luZGV4XS5jdXN0b21lclByaWNlT3BlbiA9IGN1c3RvbWVyUHJpY2VPcGVuOwogICAgICAgIHRhcmdldFt0aGlzLnNrdV9pbmRleF0uY3VzdG9tZXJQcmljZSA9IGN1c3RvbWVyUHJpY2VPcGVuID8gY3VzdG9tZXJQcmljZSA6IFtdOwogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgICB9IGVsc2UgewogICAgICAgIC8vIOWkmuinhOagvAogICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMudW5pdF9kYXRhKTsKICAgICAgICB0YXJnZXRbdGhpcy51bml0X2luZGV4XS5zcGVjX3RhYmxlX0RhdGFbdGhpcy5za3VfaW5kZXhdLmN1c3RvbWVyUHJpY2VPcGVuID0gY3VzdG9tZXJQcmljZU9wZW47CiAgICAgICAgdGFyZ2V0W3RoaXMudW5pdF9pbmRleF0uc3BlY190YWJsZV9EYXRhW3RoaXMuc2t1X2luZGV4XS5jdXN0b21lclByaWNlID0gY3VzdG9tZXJQcmljZU9wZW4gPyBjdXN0b21lclByaWNlIDogW107CiAgICAgICAgdGhpcy51bml0X2RhdGEgPSB0YXJnZXQ7CiAgICAgIH0KICAgIH0sCgogICAgLy8g5oyH5a6a5Lu35pWw5o2u5Y+W5raICiAgICBhcHBvaW50UHJpY2VDYW5jZWwoKSB7CiAgICAgIHRoaXMuYXBwb2ludF9wcmljZV9zaG93ID0gZmFsc2U7CiAgICB9LAoKICAgIHR5cGVQcmljZUNvbmZpcm0oY3VzdG9tZXJUeXBlUHJpY2VPcGVuLCBjdXN0b21lclR5cGVQcmljZSkgewogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICAvLyDljZXop4TmoLwKICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CiAgICAgICAgdGFyZ2V0W3RoaXMuc2t1X2luZGV4XS5jdXN0b21lclR5cGVQcmljZU9wZW4gPSBjdXN0b21lclR5cGVQcmljZU9wZW47CiAgICAgICAgdGFyZ2V0W3RoaXMuc2t1X2luZGV4XS5jdXN0b21lclR5cGVQcmljZSA9IGN1c3RvbWVyVHlwZVByaWNlT3BlbiA/IGN1c3RvbWVyVHlwZVByaWNlIDogW107CiAgICAgICAgdGhpcy51bml0X2RhdGEgPSB0YXJnZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8g5aSa6KeE5qC8CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy51bml0X2RhdGEpOwogICAgICAgIHRhcmdldFt0aGlzLnVuaXRfaW5kZXhdLnNwZWNfdGFibGVfRGF0YVt0aGlzLnNrdV9pbmRleF0uY3VzdG9tZXJUeXBlUHJpY2VPcGVuID0gY3VzdG9tZXJUeXBlUHJpY2VPcGVuOwogICAgICAgIHRhcmdldFt0aGlzLnVuaXRfaW5kZXhdLnNwZWNfdGFibGVfRGF0YVt0aGlzLnNrdV9pbmRleF0uY3VzdG9tZXJUeXBlUHJpY2UgPSBjdXN0b21lclR5cGVQcmljZU9wZW4gPyBjdXN0b21lclR5cGVQcmljZSA6IFtdOwogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgICB9CiAgICB9LAoKICAgIHR5cGVQcmljZUNhbmNlbCgpIHsKICAgICAgdGhpcy50eXBlX3ByaWNlX3Nob3cgPSBmYWxzZTsKICAgIH0sCgogICAgLy8g6Zi25qKv5Lu36K6+572uCiAgICBsYWRkZXJQcmljZUNvbmZpcm0oZW5hYmxlZExhZGRlciwgbGFkZGVyUHJpY2UpIHsKICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLnNwZWNUeXBlID09PSAxKSB7CiAgICAgICAgLy8g5Y2V6KeE5qC8CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy51bml0X2RhdGEpOwoKICAgICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uaXNFcSA9PT0gNSkgewogICAgICAgICAgLy8g5oqE56CB5ZWG5ZOB5qC55o2u5q+U5L6L6Ieq5Yqo5o2i566X6ZSA5ZSu5Lu3CiAgICAgICAgICB0YXJnZXQuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgICAgaXRlbS5lbmFibGVkTGFkZGVyID0gZW5hYmxlZExhZGRlcjsKCiAgICAgICAgICAgIGlmIChlbmFibGVkTGFkZGVyKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0uY29udmVyc2lvbiAmJiBpdGVtLmlzTWFzdGVyID09PSA0KSB7CiAgICAgICAgICAgICAgICBpdGVtLmxhZGRlclByaWNlID0gbGFkZGVyUHJpY2UubWFwKGxhZGRlciA9PiB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmxhZGRlciwKICAgICAgICAgICAgICAgICAgICBwcmljZTogdGhpcy4kTlAudGltZXMobGFkZGVyLnByaWNlLCBpdGVtLmNvbnZlcnNpb24pCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaXRlbS5sYWRkZXJQcmljZSA9IGxhZGRlclByaWNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpdGVtLmxhZGRlclByaWNlID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0YXJnZXRbdGhpcy5za3VfaW5kZXhdLmVuYWJsZWRMYWRkZXIgPSBlbmFibGVkTGFkZGVyOwogICAgICAgICAgdGFyZ2V0W3RoaXMuc2t1X2luZGV4XS5sYWRkZXJQcmljZSA9IGVuYWJsZWRMYWRkZXIgPyBsYWRkZXJQcmljZSA6IFtdOwogICAgICAgIH0KCiAgICAgICAgdGhpcy51bml0X2RhdGEgPSB0YXJnZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8g5aSa6KeE5qC8CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy51bml0X2RhdGEpOwogICAgICAgIHRhcmdldFt0aGlzLnVuaXRfaW5kZXhdLnNwZWNfdGFibGVfRGF0YVt0aGlzLnNrdV9pbmRleF0uZW5hYmxlZExhZGRlciA9IGVuYWJsZWRMYWRkZXI7CiAgICAgICAgdGFyZ2V0W3RoaXMudW5pdF9pbmRleF0uc3BlY190YWJsZV9EYXRhW3RoaXMuc2t1X2luZGV4XS5sYWRkZXJQcmljZSA9IGVuYWJsZWRMYWRkZXIgPyBsYWRkZXJQcmljZSA6IFtdOwogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgICB9CiAgICB9LAoKICAgIGxhZGRlclByaWNlQ2FuY2VsKCkgewogICAgICB0aGlzLmxhZGRlcl9wcmljZV9zaG93ID0gZmFsc2U7CiAgICB9LAoKICAgIC8vIOWuouaIt+iwg+S7t+WNlQogICAgYXN5bmMgQ3VzdG9tZXJQcmljZUFkanVzdG1lbnRBZGQocGFyYW1zKSB7CiAgICAgIGlmICghcGFyYW1zLmxlbmd0aCkgcmV0dXJuOwogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gYXdhaXQgQ3VzdG9tZXJQcmljZUFkanVzdG1lbnRBZGQocGFyYW1zKTsKICAgIH0sCgogICAgLy8g5a6i5oi357G75Z6L6LCD5Lu35Y2VCiAgICBhc3luYyBhZGRDdXN0b21lclR5cGVQcmljZUFkanVzdG1lbnQocGFyYW1zKSB7CiAgICAgIGlmICghcGFyYW1zLmxlbmd0aCkgcmV0dXJuOwogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gYXdhaXQgYWRkQ3VzdG9tZXJUeXBlUHJpY2VBZGp1c3RtZW50KHBhcmFtcyk7CiAgICB9LAoKICAgIC8vIOWVhuWTgeWIhuexu+WIl+ihqAogICAgYXN5bmMgZ2V0QWxsQ2F0ZWdvcnlQb3N0KCkgewogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gYXdhaXQgZ2V0QWxsQ2F0ZWdvcnlQb3N0KHsKICAgICAgICBlbmFibGVTdGF0dXM6IDUKICAgICAgfSk7CgogICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZGF0YSkgPT09ICJ7fSIpIHsKICAgICAgICB0aGlzLmNhdGVnb3J5X2RhdGEgPSBbXTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNhdGVnb3J5X2RhdGEgPSBkYXRhOwogICAgICB9CiAgICB9LAoKICAgIC8vIOiHquWumuS5iemAieaLqeWNs+aUueWPmAogICAgY2xpY2tDaGFuZ2UoZXZlbnQpIHsKICAgICAgZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5maXJzdENoaWxkLmNsaWNrKCk7CiAgICB9LAoKICAgIGRlbEFzc2lzdENhdGUoaW5kZXgpIHsKICAgICAgdGhpcy5hc3Npc3RfY2F0ZS5zcGxpY2UoaW5kZXgsIDEpOwogICAgfSwKCiAgICBhZGRBc3Npc3RDYXRlKCkgewogICAgICB0aGlzLmFzc2lzdF9jYXRlLnB1c2goewogICAgICAgIGFzc2lzdENhdGVnb3J5UGF0aDogW10KICAgICAgfSk7CiAgICB9LAoKICAgIC8vIOiOt+WPluWVhuaIt+WIl+ihqAogICAgYXN5bmMgZ2V0QWxsTWVyY2hhbnRMaXN0KCkgewogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gYXdhaXQgZ2V0QWxsTWVyY2hhbnRMaXN0KCk7CiAgICAgIHRoaXMuc2VsX2NpdGllcyA9IGRhdGE7CiAgICB9LAoKICAgIC8vIOaKhOeggeWVhuWTgeWIh+aNogogICAgaXNFcUNoYW5nZSh2YWwpIHsKICAgICAgaWYgKHRoaXMuaXNFZGl0U3BlYyAhPT0gNCAmJiB2YWwgPT09IDUpIHsKICAgICAgICB0aGlzLmJhc2VfZm9ybS5tYXN0ZXJVbml0ID0gewogICAgICAgICAgaXNEZWZhdWx0OiA1LAogICAgICAgICAgaXNNYXN0ZXI6IDUsCiAgICAgICAgICB3ZWlnaHQ6ICIiLAogICAgICAgICAgdW5pdE5hbWU6ICIiLAogICAgICAgICAgdW5pdElkOiAiIiwKICAgICAgICAgIGJhckNvZGU6ICIiCiAgICAgICAgfTsKICAgICAgICB0aGlzLmJhc2VfZm9ybS5icmFuY2hVbml0ID0gW107CiAgICAgICAgdGhpcy51bml0X2RhdGEgPSBbXTsKICAgICAgfQogICAgfSwKCiAgICAvLyDojrflj5bmjIflrprllYblk4HnmoTmnIDlkI7nlJ/mlYjnmoTlrqLmiLfosIPku7fljZXmlbDmja4KICAgIGFzeW5jIGdldEN1c3RvbWVyUHJpY2VCeUdvb2RzSWRzKCkgewogICAgICBjb25zdCB7CiAgICAgICAgZGF0YSwKICAgICAgICBwYWdlVG90YWwKICAgICAgfSA9IGF3YWl0IGdldEN1c3RvbWVyUHJpY2VCeUdvb2RzSWRzKHsKICAgICAgICBnb29kc0lkOiB0aGlzLmdvb2RzX2lkLAogICAgICAgIHBhZ2U6IDEsCiAgICAgICAgcGFnZVNpemU6IDIwMAogICAgICB9KTsKICAgICAgdGhpcy5jdXN0b21lclByaWNlID0gZGF0YTsKICAgIH0sCgogICAgLy8g6I635Y+W5oyH5a6a5ZWG5ZOB55qE5pyA5ZCO55Sf5pWI55qE5a6i5oi357G75Z6L6LCD5Lu35pWw5o2uCiAgICBhc3luYyBnZXRDdXN0b21lclR5cGVQcmljZUJ5R29vZHNJZHMoKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBkYXRhCiAgICAgIH0gPSBhd2FpdCBnZXRDdXN0b21lclR5cGVQcmljZUJ5R29vZHNJZHMoewogICAgICAgIGdvb2RzSWQ6IHRoaXMuZ29vZHNfaWQsCiAgICAgICAgcGFnZTogMSwKICAgICAgICBwYWdlU2l6ZTogMjAKICAgICAgfSk7CiAgICAgIHRoaXMuY3VzdG9tZXJUeXBlUHJpY2UgPSBkYXRhOwogICAgICB0aGlzLmFkanVzdG1lbnREYXRhKCk7CiAgICB9LAoKICAgIGFkanVzdG1lbnREYXRhKCkgewogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICB0aGlzLnVuaXRfZGF0YSA9IHRoaXMudW5pdF9kYXRhLm1hcChpdGVtID0+IHsKICAgICAgICAgIC8v5a6i5oi357G75Z6L5Lu3CiAgICAgICAgICBsZXQgY3VzdG9tZXJUeXBlUHJpY2UgPSBbXTsKICAgICAgICAgIHRoaXMuY3VzdG9tZXJUeXBlUHJpY2UuZm9yRWFjaCh0eXBlID0+IHsKICAgICAgICAgICAgaWYgKHR5cGUuc2FsZVByaWNlICYmIHR5cGUuc2FsZVByaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgIHR5cGUuc2FsZVByaWNlLmZvckVhY2gocGl0ZW0gPT4gewogICAgICAgICAgICAgICAgaWYgKHBhcnNlSW50KHBpdGVtLnNrdUlkKSA9PT0gaXRlbS5pZF9EKSB7CiAgICAgICAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlLnB1c2goewogICAgICAgICAgICAgICAgICAgIGFkalByaWNldGFnOiBwaXRlbS5hZGpQcmljZXRhZywKICAgICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogcGl0ZW0ubGFkZGVyUHJpY2UgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgcHJpY2U6IHBpdGVtLnByaWNlLAogICAgICAgICAgICAgICAgICAgIG5hbWU6IHR5cGUuY3VzdG9tZXJUeXBlTmFtZSwKICAgICAgICAgICAgICAgICAgICBpZDogdHlwZS5jdXN0b21lclR5cGUsCiAgICAgICAgICAgICAgICAgICAgcHJpY2VJZDogdHlwZS5pZAogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7IC8v5a6i5oi35Lu3CgogICAgICAgICAgbGV0IGN1c3RvbWVyUHJpY2UgPSBbXTsKICAgICAgICAgIHRoaXMuY3VzdG9tZXJQcmljZS5mb3JFYWNoKHR5cGUgPT4gewogICAgICAgICAgICBpZiAodHlwZS5zYWxlUHJpY2UgJiYgdHlwZS5zYWxlUHJpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgdHlwZS5zYWxlUHJpY2UuZm9yRWFjaChwaXRlbSA9PiB7CiAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQocGl0ZW0uc2t1SWQpID09PSBpdGVtLmlkX0QpIHsKICAgICAgICAgICAgICAgICAgY3VzdG9tZXJQcmljZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBhZGpQcmljZXRhZzogcGl0ZW0uYWRqUHJpY2V0YWcsCiAgICAgICAgICAgICAgICAgICAgbGFkZGVyUHJpY2U6IHBpdGVtLmxhZGRlclByaWNlIHx8IFtdLAogICAgICAgICAgICAgICAgICAgIHByaWNlOiBwaXRlbS5wcmljZSwKICAgICAgICAgICAgICAgICAgICBuYW1lOiB0eXBlLmN1c3RvbWVyTmFtZSwKICAgICAgICAgICAgICAgICAgICBpZDogdHlwZS5jdXN0b21lcklkLAogICAgICAgICAgICAgICAgICAgIHByaWNlSWQ6IHR5cGUuaWQKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwKICAgICAgICAgICAgLy8g5a6i5oi357G75Z6L5ZKM5a6i5oi35b+r6YCf6LCD5Lu3CiAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlOiBjdXN0b21lclR5cGVQcmljZSwKICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2VPcGVuOiBjdXN0b21lclR5cGVQcmljZS5sZW5ndGggPiAwLAogICAgICAgICAgICBjdXN0b21lclByaWNlOiBjdXN0b21lclByaWNlLAogICAgICAgICAgICBjdXN0b21lclByaWNlT3BlbjogY3VzdG9tZXJQcmljZS5sZW5ndGggPiAwCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGhpcy51bml0X2RhdGEubWFwKGl0ZW1VID0+IHsKICAgICAgICAgIHJldHVybiB7IC4uLml0ZW1VLAogICAgICAgICAgICBzcGVjX3RhYmxlX0RhdGE6IGl0ZW1VLnNwZWNfdGFibGVfRGF0YS5tYXAoaXRlbSA9PiB7CiAgICAgICAgICAgICAgLy/lrqLmiLfnsbvlnovku7cKICAgICAgICAgICAgICBsZXQgY3VzdG9tZXJUeXBlUHJpY2UgPSBbXTsKICAgICAgICAgICAgICB0aGlzLmN1c3RvbWVyVHlwZVByaWNlLmZvckVhY2godHlwZSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodHlwZS5zYWxlUHJpY2UgJiYgdHlwZS5zYWxlUHJpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgIHR5cGUuc2FsZVByaWNlLmZvckVhY2gocGl0ZW0gPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUludChwaXRlbS5za3VJZCkgPT09IGl0ZW0uaWRfRCkgewogICAgICAgICAgICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2UucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkalByaWNldGFnOiBwaXRlbS5hZGpQcmljZXRhZywKICAgICAgICAgICAgICAgICAgICAgICAgbGFkZGVyUHJpY2U6IHBpdGVtLmxhZGRlclByaWNlIHx8IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogcGl0ZW0ucHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHR5cGUuY3VzdG9tZXJUeXBlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHR5cGUuY3VzdG9tZXJUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICBwcmljZUlkOiB0eXBlLmlkCiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOyAvL+WuouaIt+S7twoKICAgICAgICAgICAgICBsZXQgY3VzdG9tZXJQcmljZSA9IFtdOwogICAgICAgICAgICAgIHRoaXMuY3VzdG9tZXJQcmljZS5mb3JFYWNoKHR5cGUgPT4gewogICAgICAgICAgICAgICAgaWYgKHR5cGUuc2FsZVByaWNlICYmIHR5cGUuc2FsZVByaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICB0eXBlLnNhbGVQcmljZS5mb3JFYWNoKHBpdGVtID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQocGl0ZW0uc2t1SWQpID09PSBpdGVtLmlkX0QpIHsKICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyUHJpY2UucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkalByaWNldGFnOiBwaXRlbS5hZGpQcmljZXRhZywKICAgICAgICAgICAgICAgICAgICAgICAgbGFkZGVyUHJpY2U6IHBpdGVtLmxhZGRlclByaWNlIHx8IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogcGl0ZW0ucHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHR5cGUuY3VzdG9tZXJOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBpZDogdHlwZS5jdXN0b21lcklkLAogICAgICAgICAgICAgICAgICAgICAgICBwcmljZUlkOiB0eXBlLmlkCiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybiB7IC4uLml0ZW0sCiAgICAgICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZTogY3VzdG9tZXJUeXBlUHJpY2UsCiAgICAgICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZU9wZW46IGN1c3RvbWVyVHlwZVByaWNlLmxlbmd0aCA+IDAsCiAgICAgICAgICAgICAgICBjdXN0b21lclByaWNlOiBjdXN0b21lclByaWNlLAogICAgICAgICAgICAgICAgY3VzdG9tZXJQcmljZU9wZW46IGN1c3RvbWVyUHJpY2UubGVuZ3RoID4gMAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9CgogICAgICBjb25zb2xlLmxvZygiIHRoaXMudW5pdF9kYXRhOiIsIHRoaXMudW5pdF9kYXRhKTsKICAgIH0KCiAgfQp9Ow=="},{"version":3,"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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CAxCA;;IAyCAC;MACA;IACA,CA3CA;;IA4CA;IACAC;MACA;MACA;;MACA;QACA,sBACAC;UACA;QACA,CAFA,CADA,GAIA,EAJA;QAKAC;QACA;MACA;IACA,CAzDA;;IA0DA;IACA;MACA;MACA;IACA,CA9DA;;IA+DA;IACAC;MACA;IACA,CAlEA;;IAmEA;IACA;MACA,iBACA,iBADA;QAEAC,wBAFA;QAGAC,kCAHA;QAIAhD,qBAJA;QAKA8B;MALA;MAOA;MACA;QACAmB,kBADA;QAEA9H;MAFA;MAIA;MAEA;QACA4F,eADA;QAEAE;MAFA;;MAIA;QACA;MACA,CAFA,MAEA;QACA;MACA;IACA,CA5FA;;IA6FA;IACA;MACA;QACAgC;MADA;IAGA,CAlGA;;IAmGA;IACA;MACA;QAAA9H;MAAA;QACA8H;MADA;MAIA;MACA,mBACA,OADA;QAEA5D,iDACAlE,iBADA,GAEA,EAJA;QAKAmE,6DACAnE,uBADA,GAEA;MAPA;MASA;QAAAmE;MAAA;MACA;MACA;MACA;;MACA;QACA;UACA;YACA/E,QADA;YAEA2I;UAFA;QAIA,CALA;MAMA;IACA,CA/HA;;IAgIA;IACAC;MACA;;MACA;QACAd;UACA9H,QADA;UAEA2I;QAFA;MAIA,CALA,MAKA;QACAb;UACA9H,QADA;UAEA2I;QAFA;MAIA;;MACA;IACA,CA/IA;;IAgJA;IACAE;MACA;QACA;UACAzG,mBADA;UAEAN,sBAFA;UAGAF,iBAHA;UAIAW,eAJA;UAKAC,iBALA;UAMAC;QANA;MAQA,CATA,MASA;QACA,cACA,4BADA,EAEA,IAFA,EAGA;UACAqG,yBADA;UAEAC,sBAFA;UAGAvC;QAHA,CAHA,EAQAwC,IARA,CAQA;UACA;YACA5G,mBADA;YAEAN,sBAFA;YAGAF,iBAHA;YAIAW,eAJA;YAKAC,iBALA;YAMAC;UANA;QAQA,CAjBA;MAkBA;IACA,CA/KA;;IAgLA;IACAwG;MACA;MACA;MACAnB;MACAA;MACAA;MACA,uBANA,CAOA;MACA;MACA;MACA;IACA,CA5LA;;IA6LA;IACAoB;MACA;MACA;MACA;MACA;MACA;MACA;MA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CAsB,MADA,CACAvC,kDADA,EAEAwC,GAFA,CAEAK;YACA;UACA,CAJA;QAKA,CARA,CASA;;;QACA;UACA,SACA,QADA;YAEAvI,8CACA0F,oDADA;UAFA;QAMA,CAPA;QASA;QACAD;QACA;MACA,CA1BA;IA2BA,CAlfA;;IAmfA;IACA+C;MACA;QACA/B,uBADA;QAEAC,sBAFA;QAGAvC;MAHA,GAIAwC,IAJA,CAIA;QACA;;QACA;UACA,+DACAjB;YACA;UACA,CAHA;QAKA,CARA,CASA;;;QACA;MACA,CAfA;IAgBA,CArgBA;;IAugBA;IACA;MACA;QAAAnH;QAAAkK;MAAA;QACA7C,OADA;QAEAC;MAFA;MAKA,+DANA,CAOA;IACA,CAhhBA;;IAihBA;IACA6C;MACA;QACA;MACA,CAFA;;MAIA;QACA;MACA,CAFA,MAEA;QACA;MACA;;MACA;QACA;UACA/K,QADA;UAEAgL;QAFA;MAIA,CALA;IAMA,CAliBA;;IAmiBAC;MACA;QACA;MACA,CAFA;IAGA,CAviBA;;IAwiBAC;MACA;QACA;MACA,CAFA;IAGA,CA5iBA;;IA6iBA;IACAC;MACA;IACA,CAhjBA;;IAijBA;IACAC;MACA;MACA;QACA;MACA,CAFA;IAGA,CAvjBA;;IAwjBA;IACAC;MACA;;MACA;QACA;MACA;;MACA;MACA;IACA,CAhkBA;;IAikBA;IACA;IACA;IACAC;MACA;;MACA;QACA,IACAjD,cACA,oDAFA,EAGA;UACA;QACA;;QACA,iCACAN,sCADA;;QAGA;UACA,IACA,+DADA,EAEA;YACA;UACA;QACA;MACA;;MACA;IACA,CAzlBA;;IA0lBA;IACAwD;MACA;MACA;MACA;QACA9H,YADA;QAEAE,WAFA;QAGAE,UAHA;QAIAC;MAJA;IAMA,CApmBA;;IAqmBA;IACA0H;MACA;MACA;MACA;MACA;IACA,CA3mBA;;IA4mBA;IACAC;MACA;QACA;QACA;MACA;;MACA;QACA;QACA;MACA;;MACA,iCACA,mBADA;QAEA9J;MAFA;;MAIA;QACA,0CACA,gEADA,GAEA,EAFA;QAGA,sBACA,4CADA;UAEA,uCAFA;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CApBA;MAsBA;IACA,CA/uCA;;IAgvCA;IACA+N;MACA;;MACA;QACA;UACA;QACA;MACA;;MAEA3F;QACAC;QACA;MACA,CAHA,EARA,CAYA;;MACA,gDACAM,uBADA,GAEAA,YAFA;MAGA;;MACA;QACA;QACA;UACA,kCACAN,yCADA;QAGA,CAJA;;QAKA;UACA2F;UACA;QACA;MACA,CA5BA,CA8BA;;;MACA;QACA;UACA,qCACAxB,sCADA;;UAGA;YACAnE;UACA;QACA,CAPA;MAQA;;MACA;IACA,CA3xCA;;IA6xCA;IACA4F;MACA;MACA;IACA,CAjyCA;;IAkyCA;IACAC;MACA;QACA;MACA,CAFA;IAGA,CAvyCA;;IAwyCA;IACA;MACA;QACA3F,OADA;QAEAC;MAFA;MAKA;IACA,CAhzCA;;IAizCA;IACA2F;MACA;IACA,CApzCA;;IAqzCA;IACAC;MACA;IACA,CAxzCA;;IAyzCA;IACAC;MACA;MACA;QACA;QACA;QACA;QACA;;QACA;UACA;UACA;UACA;QACA;;QACA;UACA;UACA;UACA;QACA;MACA;;MACA;;MACA;QACA;MACA;;MACA;IACA,CAj1CA;;IAk1CA;IACAC;MACAC;;MACA;QACA;QACA;QACAnG;QACAA,2DACArI,aADA,GAEA,EAFA;QAGA;MACA,CARA,MAQA;QACA;QACA;QACAqI,wCACA,cADA,EAEApI,iBAFA,GAEAA,iBAFA;QAGAoI,wCACA,cADA,EAEArI,aAFA,GAEAC,sCAFA;QAGA;MACA;IACA,CAx2CA;;IAy2CA;IACAwO;MACA;IACA,CA52CA;;IA62CAC;MACA;QACA;QACA;QACArG;QACAA,mEACAvI,iBADA,GAEA,EAFA;QAGA;MACA,CARA,MAQA;QACA;QACA;QACAuI,wCACA,cADA,EAEAtI,qBAFA,GAEAA,qBAFA;QAGAsI,wCACA,cADA,EAEAvI,iBAFA,GAEAC,8CAFA;QAGA;MACA;IACA,CAj4CA;;IAk4CA4O;MACA;IACA,CAp4CA;;IAq4CA;IACAC;MACA;QACA;QACA;;QACA;UACA;UACAvG;YACAC;;YACA;cACA;gBACAA;kBACA,SACA,SADA;oBAEA0E;kBAFA;gBAIA,CALA;cAMA,CAPA,MAOA;gBACA1E;cACA;YACA,CAXA,MAWA;cACAA;YACA;UACA,CAhBA;QAiBA,CAnBA,MAmBA;UACAD;UACAA,qDACAnI,WADA,GAEA,EAFA;QAGA;;QACA;MACA,CA7BA,MA6BA;QACA;QACA;QACAmI,wCACA,cADA,EAEA9I,aAFA,GAEAA,aAFA;QAGA8I,wCACA,cADA,EAEAnI,WAFA,GAEAX,gCAFA;QAGA;MACA;IACA,CA/6CA;;IAg7CAsP;MACA;IACA,CAl7CA;;IAm7CA;IACA;MACA;MACA;QAAA1N;MAAA;IACA,CAv7CA;;IAw7CA;IACA;MACA;MACA;QAAAA;MAAA;IACA,CA57CA;;IA67CA;IACA;MACA;QAAAA;MAAA;QACAuD;MADA;;MAIA;QACA;MACA,CAFA,MAEA;QACA;MACA;IACA,CAx8CA;;IAy8CA;IACAoK;MACAC;IACA,CA58CA;;IA68CAC;MACA;IACA,CA/8CA;;IAg9CAC;MACA;QACA3J;MADA;IAGA,CAp9CA;;IAq9CA;IACA;MACA;QAAAnE;MAAA;MACA;IACA,CAz9CA;;IA09CA;IACA+N;MACA;QACA;UACA/K,YADA;UAEAD,WAFA;UAGAuB,UAHA;UAIAzB,YAJA;UAKAI,UALA;UAMAH;QANA;QAQA;QACA;MACA;IACA,CAx+CA;;IAy+CA;IACA;MACA;QAAA9C;QAAAkK;MAAA;QACA8D,sBADA;QAEA3G,OAFA;QAGAC;MAHA;MAKA;IACA,CAj/CA;;IAk/CA;IACA;MACA;QAAAtH;MAAA;QACAgO,sBADA;QAEA3G,OAFA;QAGAC;MAHA;MAKA;MACA;IACA,CA3/CA;;IA4/CA2G;MACA;QACA;UACA;UACA;UACA;YACA;cACArI;gBACA;kBACAjH;oBACAmN,8BADA;oBAEA/M,oCAFA;oBAGA8M,kBAHA;oBAIAzM,2BAJA;oBAKA6J,qBALA;oBAMAiF;kBANA;gBAQA;cACA,CAXA;YAYA;UACA,CAfA,EAHA,CAmBA;;UACA;UACA;YACA;cACAtI;gBACA;kBACA/G;oBACAiN,8BADA;oBAEA/M,oCAFA;oBAGA8M,kBAHA;oBAIAzM,uBAJA;oBAKA6J,mBALA;oBAMAiF;kBANA;gBAQA;cACA,CAXA;YAYA;UACA,CAfA;UAgBA,SACA,OADA;YAEA;YACAvP,oCAHA;YAIAC,mDAJA;YAKAC,4BALA;YAMAC;UANA;QAQA,CA7CA;MA8CA,CA/CA,MA+CA;QACA;UACA,SACA,QADA;YAEA2C;cACA;cACA;cACA;gBACA;kBACAmE;oBACA;sBACAjH;wBACAmN,8BADA;wBAEA/M,oCAFA;wBAGA8M,kBAHA;wBAIAzM,2BAJA;wBAKA6J,qBALA;wBAMAiF;sBANA;oBAQA;kBACA,CAXA;gBAYA;cACA,CAfA,EAHA,CAmBA;;cACA;cACA;gBACA;kBACAtI;oBACA;sBACA/G;wBACAiN,8BADA;wBAEA/M,oCAFA;wBAGA8M,kBAHA;wBAIAzM,uBAJA;wBAKA6J,mBALA;wBAMAiF;sBANA;oBAQA;kBACA,CAXA;gBAYA;cACA,CAfA;cAgBA,SACA,OADA;gBAEAvP,oCAFA;gBAGAC,mDAHA;gBAIAC,4BAJA;gBAKAC;cALA;YAOA,CA5CA;UAFA;QAgDA,CAjDA;MAkDA;;MACAuO;IACA;;EAjmDA;AAnOA","names":["getAllUnit","defineSpec","SpecManagegetAll","getQuickGoodsInfo","editQuickGoods","addBasicAndPublishGoods","getAllCategoryPost","enabledLadder","marketPrice","memberPrice","salePrice","setNum","isSale","salePriceAreaType","customerTypePrice","customerTypePriceOpen","customerPrice","customerPriceOpen","ladderPrice","CustomerPriceAdjustmentAdd","addCustomerTypePriceAdjustment","getCustomerPriceByGoodsIds","getCustomerTypePriceByGoodsIds","name","components","BrandSelModel","Tinymce","UploadQiniu","AddCate","AddBrand","RegionTree","ClientListModal","CustomerPrice","CustomerTypePrice","LadderPrice","data","callback","unitisMaster","unit_index","sku_index","ladder_price_show","type_price_show","appoint_price_show","customer_show","customer_list","customer_type_check","customer_type_list","region_arr","page_tabs","express_list","isEditSpec","self_spec_val","spec_name_index","self_spec_input","spec_model","spec_item_check","is_indeterminate_spec","spec_check_all","spec_data","spec_data_child","spec_table_Data","sku_list","groupSpecId","groupSpecName","params","add_model","dialogTitle","pid_arr","add_Brand","pageName","loading","img_list","dynamicTags","inputVisible","inputValue","assist_model","edit_assist_model","assist_index","unit_options","assist_form","unitName","barCode","isMaster","isDefault","unitId","conversion","sel_brand","sel_shop","master_unit_name","base_form","enableStatus","isDistribution","isShield","isEq","specType","delUnitIds","delSpecSkuIds","branchUnit","brandName","categoryId","assistCategoryId","categoryPath","assistCategoryPath","unitData","masterUnit","weight","describe","title","storage","code","expireTime","brandId","tag","description","salesShop","images","deliverySupIds","expressType","expressFee","showExpress","ruleId","notArea","notCustomerType","notCustomer","merchantId","sel_cities","base_rules","type","required","message","trigger","validator","goods_id","list_page_data","unit_data","tabs_active","isNew","category_data","cate_props","label","value","checkStrictly","assist_cate","sku_id","computed","salePriceTimes","systemType","methods","isDefaultChange","target","item","itemB","page","pageSize","modelClose","openModel","row","link","submitBrand","specGroup","specMultiple","key","url","uploadSpecSuccess","addSkuP","confirmButtonText","cancelButtonText","then","groupSpecIdChange","specGroupRest","skuArrDo","itemC","indexSS","cloneSpecGroup","itemSp","specImage","inventory","doExchange","temp","doubleArrays","id","specName","index","newArray","_count","pid","hidden","addSpecVal","selSpecVal","filter","map","checkAllSpecChange","specItemChange","checkedCount","delSpecVal","itemM","delGroupSpecId","pageTotal","uploadSuccess","content","imgSortChange","uploadRemove","handleClose","showInput","handleInputConfirm","delFuUnit","addFuUnit","EditFuUnit","subAssist","masterUnitChange","branchUnitChange","itemF","child","itemU","itemSP","specGroupHash","id_D","itemP","join","groupSpec","specId","specValueId","specValueName","deleteStatus","price","adjPricetag","customerName","customerId","customerType","assistCate","createUserName","noSalesShop","isStore","basicGoodsId","categoryChange","categoryAssistChange","brandConfirm","salePriceBlur","memberPriceBlur","otherSetPrice","specDetailDel","isFalseVal","selChose","selRegion","customerSel","deleteCustomer","openModal","appointPriceConfirm","console","appointPriceCancel","typePriceConfirm","typePriceCancel","ladderPriceConfirm","ladderPriceCancel","clickChange","event","delAssistCate","addAssistCate","isEqChange","goodsId","adjustmentData","priceId"],"sourceRoot":"src/views/goods/sale","sources":["AddGoodsOneStore.vue"],"sourcesContent":["<!--添加基础资料-->\n<template>\n <ContainerTit>\n <div slot=\"headr\">\n <el-button v-if=\"!goods_id\" :loding=\"loading\" @click=\"AddTem\">\n 暂存\n </el-button>\n <el-button\n v-if=\"$route.name !== 'BaseDataDetail'\"\n type=\"primary\"\n :loading=\"loading\"\n @click=\"submitGoods\"\n >\n 提交保存\n </el-button>\n </div>\n <div class=\"detail-tab-item\" style=\"padding: 0 20px\">\n <el-tabs v-model=\"page_tabs\">\n <el-tab-pane label=\"商品信息\" name=\"1\"></el-tab-pane>\n <el-tab-pane\n :disabled=\"base_form.isShield === 4\"\n label=\"经营屏蔽\"\n name=\"2\"\n ></el-tab-pane>\n </el-tabs>\n </div>\n <el-form\n ref=\"base_form\"\n :model=\"base_form\"\n label-width=\"120px\"\n :rules=\"base_rules\"\n size=\"small\"\n >\n <div v-show=\"page_tabs === '1'\">\n <div class=\"detail-tab-item\">\n <div class=\"detail-tab-title clearfix\">\n <span class=\"float_left\">商品相册</span>\n <span style=\"font-size: 12px; font-weight: normal; color: #e6a23c\">\n (温馨提示:建议上传尺寸375px*375px,格式:jpg,jpeg,png;\n 大小:建议小于1M。)\n </span>\n </div>\n <div class=\"detail-tab-main\">\n <el-form-item prop=\"images\" label-width=\"20px\">\n <UploadQiniu\n :limit=\"10\"\n :file-list=\"img_list\"\n @uploadSuccess=\"uploadSuccess\"\n @imgSortChange=\"imgSortChange\"\n @handleRemove=\"uploadRemove\"\n />\n </el-form-item>\n </div>\n </div>\n <!-- 基本信息-->\n <div class=\"detail-tab-item\">\n <p class=\"detail-tab-title\">基本信息</p>\n <div class=\"detail-tab-main\">\n <el-row>\n <el-col :span=\"8\">\n <el-form-item label=\"商品名称:\" prop=\"title\">\n <el-input\n v-model=\"base_form.title\"\n style=\"width: 240px\"\n placeholder=\"请输入商品名称\"\n ></el-input>\n </el-form-item>\n <el-form-item label=\"商品品牌:\" prop=\"brandId\">\n <el-input\n v-model=\"base_form.brandName\"\n readonly\n style=\"width: 240px\"\n placeholder=\"请选择商品品牌\"\n >\n <i\n slot=\"suffix\"\n class=\"el-input__icon el-icon-search\"\n @click=\"sel_brand = true\"\n ></i>\n </el-input>\n <el-button\n style=\"margin-left: 5px\"\n size=\"mini\"\n type=\"text\"\n @click=\"add_Brand = true\"\n >\n 【新建品牌】\n </el-button>\n </el-form-item>\n <el-form-item label=\"商户:\">\n <el-select\n v-if=\"!goods_id\"\n v-model=\"base_form.merchantId\"\n placeholder=\"选择商户\"\n style=\"width: 240px\"\n clearable\n >\n <el-option\n v-for=\"(item, index) in sel_cities\"\n :key=\"index\"\n :label=\"item.name\"\n :value=\"item.id\"\n ></el-option>\n </el-select>\n <el-input\n v-else\n v-model=\"base_form.merchantName\"\n style=\"width: 240px\"\n disabled\n ></el-input>\n </el-form-item>\n <el-form-item\n v-if=\"shelfLifeSetUp === 5\"\n label=\"保质期:\"\n prop=\"expireTime\"\n >\n <el-input-number\n v-model=\"base_form.expireTime\"\n style=\"width: 240px\"\n :controls=\"false\"\n placeholder=\"请输入商品保质期\"\n ></el-input-number>\n 天\n </el-form-item>\n <el-form-item label=\"商品卖点:\" prop=\"describe\">\n <el-input\n v-model=\"base_form.describe\"\n style=\"width: 240px\"\n placeholder=\"请输入商品卖点\"\n ></el-input>\n </el-form-item>\n <el-form-item label=\"抄码商品:\" prop=\"describe\">\n <el-switch\n v-model=\"base_form.isEq\"\n active-color=\"#36B365\"\n inactive-color=\"#ff4949\"\n active-text=\"是\"\n inactive-text=\"否\"\n :inactive-value=\"4\"\n :active-value=\"5\"\n @change=\"isEqChange\"\n ></el-switch>\n </el-form-item>\n <el-form-item label=\"负库存销售:\">\n <el-switch\n v-model=\"base_form.isDistribution\"\n active-color=\"#36B365\"\n inactive-color=\"#ff4949\"\n :active-value=\"5\"\n :inactive-value=\"4\"\n active-text=\"启用\"\n inactive-text=\"禁用\"\n ></el-switch>\n </el-form-item>\n <el-form-item label=\"经营屏蔽:\">\n <el-switch\n v-model=\"base_form.isShield\"\n active-color=\"#36B365\"\n inactive-color=\"#ff4949\"\n :active-value=\"5\"\n :inactive-value=\"4\"\n active-text=\"启用\"\n inactive-text=\"禁用\"\n ></el-switch>\n </el-form-item>\n </el-col>\n <el-col :span=\"8\">\n <el-form-item label=\"商品分类:\" prop=\"categoryId\">\n <el-cascader\n v-model=\"base_form.categoryPath\"\n clearable\n style=\"width: 240px\"\n placeholder=\"请选择商品分类\"\n :options=\"category_data\"\n :props=\"cate_props\"\n @change=\"categoryChange\"\n >\n <div slot-scope=\"scope\" @click=\"clickChange\">\n {{ scope.data.title }}\n </div>\n </el-cascader>\n <el-button size=\"mini\" type=\"text\" @click=\"add_model = true\">\n 【新建分类】\n </el-button>\n </el-form-item>\n <el-form-item label=\"副分类:\">\n <div v-for=\"(item, index) in assist_cate\" :key=\"index\">\n <el-cascader\n v-model=\"item.assistCategoryPath\"\n clearable\n style=\"width: 240px\"\n placeholder=\"请选择商品分类\"\n :options=\"category_data\"\n :props=\"cate_props\"\n >\n <div slot-scope=\"scope\" @click=\"clickChange\">\n {{ scope.data.title }}\n </div>\n </el-cascader>\n <el-button\n v-if=\"index === 0\"\n size=\"mini\"\n type=\"text\"\n @click=\"addAssistCate\"\n >\n 【添加】\n </el-button>\n <el-button\n v-if=\"assist_cate.length > 1\"\n size=\"mini\"\n type=\"text\"\n @click=\"delAssistCate(index)\"\n >\n 【删除】\n </el-button>\n </div>\n </el-form-item>\n </el-col>\n <el-col :span=\"8\">\n <el-form-item label=\"商品编码:\" prop=\"code\">\n <el-input\n v-model=\"base_form.code\"\n style=\"width: 240px\"\n disabled\n placeholder=\"商品编码自动生成\"\n ></el-input>\n </el-form-item>\n <el-form-item label=\"货架编码:\" prop=\"code\">\n <el-input\n v-model=\"base_form.storage\"\n style=\"width: 240px\"\n placeholder=\"货架编码\"\n ></el-input>\n </el-form-item>\n <el-form-item label=\"是否上架:\">\n <el-switch\n v-model=\"base_form.enableStatus\"\n active-color=\"#36B365\"\n inactive-color=\"#ff4949\"\n :active-value=\"5\"\n :inactive-value=\"4\"\n active-text=\"上架\"\n inactive-text=\"下架\"\n ></el-switch>\n </el-form-item>\n <el-form-item label=\"关键词:\" prop=\"tag\">\n <el-tag\n v-for=\"tag in dynamicTags\"\n :key=\"tag\"\n closable\n :disable-transitions=\"false\"\n @close=\"handleClose(tag)\"\n >\n {{ tag }}\n </el-tag>\n <el-input\n v-if=\"inputVisible\"\n ref=\"saveTagInput\"\n v-model=\"inputValue\"\n class=\"input-new-tag\"\n size=\"small\"\n @keyup.enter.native=\"handleInputConfirm\"\n @blur=\"handleInputConfirm\"\n ></el-input>\n <el-button\n v-else\n class=\"button-new-tag\"\n size=\"small\"\n @click=\"showInput\"\n >\n + 新增\n </el-button>\n </el-form-item>\n </el-col>\n </el-row>\n </div>\n </div>\n <!-- 基本信息 END-->\n <!-- 商品单位-->\n <div class=\"detail-tab-item\">\n <div class=\"clearfix detail-tab-title\">\n <span class=\"float_left\">商品单位</span>\n <el-button\n size=\"mini\"\n type=\"text\"\n @click=\"$router.push('/goods/manageG/UnitMeasurement')\"\n >\n 【单位管理】\n </el-button>\n <el-button size=\"mini\" type=\"text\" @click=\"SpecManagegetAll\">\n 【刷新】\n </el-button>\n <span style=\"font-size: 12px; font-weight: normal; color: #e6a23c\">\n (温馨提示:基本单位一经设置不允许修改,基本单位应为最小度量单位)\n </span>\n </div>\n <div>\n <el-form-item prop=\"masterUnit\">\n <div slot=\"label\">\n <span style=\"color: #e60000\">*</span>\n <span>基本单位</span>\n <el-tooltip\n effect=\"dark\"\n content=\"基本单位与辅助单位之间须有固定的换算关系,例如:1箱牛奶=24盒,【单位关系】为24,基本单位为【盒】,辅助单位为【箱】\"\n placement=\"top-start\"\n >\n <i class=\"el-icon-info\"></i>\n </el-tooltip>\n :\n </div>\n <el-select\n v-model=\"base_form.masterUnit.unitId\"\n style=\"width: 240px\"\n :disabled=\"isEditSpec === 4\"\n placeholder=\"请选择基本单位\"\n @change=\"masterUnitChange\"\n >\n <el-option\n v-for=\"(itemU, indexU) in unit_options\"\n :key=\"indexU\"\n :disabled=\"\n base_form.isEq === 5 &&\n itemU.unitName !== 'KG' &&\n itemU.unitName !== '斤'\n \"\n :label=\"itemU.unitName\"\n :value=\"itemU.id\"\n ></el-option>\n </el-select>\n </el-form-item>\n <el-form-item label=\"辅助单位:\" prop=\"branchUnit\">\n <el-tag\n v-for=\"(itemA, indext) in base_form.branchUnit\"\n :key=\"indext\"\n :closable=\"isEditSpec === 5 || base_form.isEq === 5\"\n :disable-transitions=\"false\"\n @close=\"delFuUnit(itemA, indext)\"\n >\n <span v-if=\"itemA.isNew === 4\">\n 1{{ base_form.masterUnit.unitName }}={{ itemA.conversion\n }}{{ itemA.unitName }}\n </span>\n <span v-else>\n 1{{ itemA.unitName }}={{ itemA.conversion\n }}{{ base_form.masterUnit.unitName }}\n </span>\n </el-tag>\n <el-button\n v-if=\"\n base_form.isEq === 4 ||\n (base_form.isEq === 5 && base_form.branchUnit.length < 1)\n \"\n :disabled=\"!base_form.masterUnit.unitName\"\n type=\"text\"\n class=\"button-new-tag\"\n size=\"mini\"\n @click=\"addFuUnit\"\n >\n + 新增\n </el-button>\n </el-form-item>\n </div>\n </div>\n <!-- 商品单位 END-->\n <div\n v-if=\"isEditSpec === 5 || base_form.specType === 2\"\n class=\"detail-tab-item\"\n >\n <div class=\"detail-tab-title\">\n <span>商品属性</span>\n <el-button\n size=\"mini\"\n type=\"text\"\n @click=\"$router.push('/goods/manageG/SpecManage')\"\n >\n 【属性管理】\n </el-button>\n <el-button size=\"mini\" type=\"text\" @click=\"SpecManagegetAll\">\n 【刷新】\n </el-button>\n <span\n v-if=\"isEditSpec === 5\"\n style=\"font-size: 12px; font-weight: normal; color: #e6a23c\"\n >\n (温馨提示:在该商品【采购之前】若不设置商品属性,在该商品【采购之后】,属性不允许重新设置,请谨慎操作!)\n </span>\n <span\n v-else\n style=\"font-size: 12px; font-weight: normal; color: #e6a23c\"\n >\n (温馨提示:请确认当前属性是否有库存,一旦删除该属性无法售卖;新增规格会导致原有库存重置;请谨慎操作!)\n </span>\n </div>\n <div class=\"detail-tab-main\">\n <div v-for=\"(itemS, indexS) in sku_list\" :key=\"indexS\">\n <el-form-item\n class=\"sku-name-item\"\n prop=\"groupSpecId\"\n label=\"属性名:\"\n >\n <el-select\n v-model=\"itemS.groupSpecId\"\n style=\"width: 240px\"\n :disabled=\"!base_form.masterUnit.unitName || isEditSpec === 4\"\n filterable\n placeholder=\"请选择\"\n @change=\"groupSpecIdChange($event, indexS)\"\n >\n <el-option\n v-for=\"(itemU, indexU) in spec_data\"\n :key=\"indexU\"\n :label=\"itemU.specName\"\n :value=\"itemU.id\"\n ></el-option>\n </el-select>\n <el-button\n v-if=\"isEditSpec === 5\"\n type=\"text\"\n icon=\"el-icon-delete\"\n style=\"color: #ff4040; font-size: 16px\"\n @click=\"delGroupSpecId(indexS)\"\n ></el-button>\n </el-form-item>\n <el-form-item label=\"属性值:\" prop=\"params\">\n <el-tag\n v-for=\"(itemC, indexC) in itemS.params\"\n :key=\"indexC\"\n :closable=\"isEditSpec === 5\"\n :disable-transitions=\"false\"\n @close=\"delSpecVal(indexC, indexS, itemC)\"\n >\n {{ itemC.specName }}\n </el-tag>\n <el-button\n :disabled=\"!itemS.groupSpecId\"\n type=\"text\"\n @click=\"addSpecVal(indexS)\"\n >\n + 新增\n </el-button>\n <el-input\n v-if=\"itemS.self_spec_input\"\n v-model=\"itemS.self_spec_val\"\n size=\"small\"\n style=\"width: 200px\"\n placeholder=\"请输入内容\"\n @change=\"selfSpecConfirm(indexS)\"\n >\n <el-button\n slot=\"append\"\n icon=\"el-icon-check\"\n @click=\"selfSpecConfirm(indexS)\"\n ></el-button>\n </el-input>\n <el-button\n v-else\n :disabled=\"!itemS.groupSpecId\"\n type=\"text\"\n @click=\"itemS.self_spec_input = true\"\n >\n + 自定义属性值\n </el-button>\n </el-form-item>\n </div>\n <el-form-item\n v-if=\"isEditSpec === 5\"\n label-width=\"50px\"\n class=\"sku-name-item\"\n >\n <el-button @click=\"addSkuP\">添加规格项目</el-button>\n </el-form-item>\n </div>\n </div>\n <!-- 无属性价格管理-->\n <div v-if=\"base_form.specType === 1\" class=\"detail-tab-item\">\n <div class=\"detail-tab-title\">\n <span>规格明细</span>\n </div>\n <el-table style=\"width: 98%; margin: 0 auto\" :data=\"unit_data\">\n <el-table-column\n prop=\"unitName\"\n label=\"规格\"\n min-width=\"80\"\n ></el-table-column>\n <el-table-column prop=\"specImage\" label=\"规格图片\" min-width=\"140\">\n <template slot-scope=\"scope\">\n <UploadQiniu\n :width=\"50\"\n is-btn=\"picture\"\n :file-list=\"\n scope.row.specImage.url ? [scope.row.specImage] : []\n \"\n @uploadSuccess=\"uploadSpecSuccess($event, scope.$index)\"\n ></UploadQiniu>\n </template>\n </el-table-column>\n <el-table-column label=\"销售价/元\" min-width=\"120\">\n <template slot-scope=\"scope\">\n <el-input-number\n v-model=\"scope.row.salePrice\"\n size=\"mini\"\n :controls=\"false\"\n :disabled=\"base_form.isEq === 5 && scope.row.isMaster === 4\"\n :min=\"0\"\n style=\"width: 100%\"\n @blur=\"salePriceBlur(scope.$index)\"\n ></el-input-number>\n </template>\n </el-table-column>\n <el-table-column\n prop=\"memberPrice\"\n label=\"会员价/元\"\n min-width=\"100\"\n >\n <template slot-scope=\"scope\">\n <el-input-number\n v-model=\"scope.row.memberPrice\"\n style=\"width: 100%\"\n :disabled=\"base_form.isEq === 5 && scope.row.isMaster === 4\"\n :controls=\"false\"\n placeholder=\"会员价\"\n size=\"small\"\n :min=\"0\"\n @blur=\"memberPriceBlur(scope.$index)\"\n ></el-input-number>\n </template>\n </el-table-column>\n <el-table-column\n prop=\"marketPrice\"\n label=\"市场价/元\"\n min-width=\"100\"\n >\n <template slot-scope=\"scope\">\n <el-input-number\n v-model=\"scope.row.marketPrice\"\n style=\"width: 100%\"\n :controls=\"false\"\n placeholder=\"市场价\"\n size=\"small\"\n :min=\"0\"\n ></el-input-number>\n </template>\n </el-table-column>\n <el-table-column label=\"起订数量\" min-width=\"100\">\n <template slot-scope=\"scope\">\n <el-input-number\n v-model=\"scope.row.setNum\"\n style=\"width: 100%\"\n :controls=\"false\"\n placeholder=\"起订数量\"\n size=\"small\"\n ></el-input-number>\n </template>\n </el-table-column>\n <el-table-column label=\"是否销售\" min-width=\"100\">\n <template slot-scope=\"scope\">\n <el-switch\n v-model=\"scope.row.isSale\"\n class=\"switchStyle\"\n active-text=\"启用\"\n inactive-text=\"禁用\"\n active-color=\"#2153D4\"\n inactive-color=\"#879BBA\"\n :active-value=\"5\"\n :inactive-value=\"4\"\n ></el-switch>\n </template>\n </el-table-column>\n <el-table-column\n v-if=\"!!goods_id\"\n prop=\"inventory\"\n label=\"库存\"\n min-width=\"100\"\n >\n <template slot-scope=\"scope\">\n {{\n scope.row.isEditSpec === 5 ? \"无记录\" : scope.row.inventory\n }}\n </template>\n </el-table-column>\n <el-table-column label=\"商品条码\" min-width=\"140px\">\n <template slot-scope=\"scope\">\n <el-input\n v-model=\"scope.row.barCode\"\n style=\"width: 100%\"\n size=\"small\"\n placeholder=\"请输入商品条码\"\n ></el-input>\n </template>\n </el-table-column>\n <el-table-column label=\"商品重量/g\" min-width=\"120px\">\n <template slot-scope=\"scope\">\n <el-input\n v-model=\"scope.row.weight\"\n style=\"width: 100%\"\n size=\"small\"\n placeholder=\"请输入商品重量\"\n ></el-input>\n </template>\n </el-table-column>\n <el-table-column label=\"默认单位\" min-width=\"120px\">\n <template slot-scope=\"scope\">\n <el-switch\n v-model=\"scope.row.isDefault\"\n active-color=\"#36B365\"\n inactive-color=\"#ff4949\"\n active-text=\"是\"\n inactive-text=\"否\"\n :inactive-value=\"4\"\n :active-value=\"5\"\n @change=\"isDefaultChange($event, scope.$index)\"\n ></el-switch>\n </template>\n </el-table-column>\n <el-table-column label=\"阶梯价\" min-width=\"100\">\n <template slot-scope=\"scope\">\n <el-button\n v-if=\"\n scope.row.ladderPrice.length &&\n scope.row.enabledLadder === 1\n \"\n type=\"primary\"\n size=\"mini\"\n @click=\"\n openModal(scope.$index, 'ladder_price_show', scope.row)\n \"\n >\n 已设置\n </el-button>\n <el-button\n v-else\n type=\"info\"\n :disabled=\"base_form.isEq === 5 && scope.row.isMaster === 4\"\n size=\"mini\"\n @click=\"\n openModal(scope.$index, 'ladder_price_show', scope.row)\n \"\n >\n 去设置\n </el-button>\n </template>\n </el-table-column>\n <el-table-column label=\"客户类型价\" min-width=\"100\">\n <template slot-scope=\"scope\">\n <el-button\n v-if=\"\n scope.row.customerTypePrice.length &&\n scope.row.customerTypePriceOpen\n \"\n type=\"primary\"\n :disabled=\"base_form.isEq === 5 && scope.row.isMaster === 4\"\n size=\"mini\"\n @click=\"openModal(scope.$index, 'type_price_show', scope.row)\"\n >\n 已设置\n </el-button>\n <el-button\n v-else\n type=\"info\"\n :disabled=\"base_form.isEq === 5 && scope.row.isMaster === 4\"\n size=\"mini\"\n @click=\"openModal(scope.$index, 'type_price_show', scope.row)\"\n >\n 去设置\n </el-button>\n </template>\n </el-table-column>\n <el-table-column label=\"客户指定价\" min-width=\"100\">\n <template slot-scope=\"scope\">\n <el-button\n v-if=\"\n scope.row.customerPrice.length &&\n scope.row.customerPriceOpen\n \"\n type=\"primary\"\n :disabled=\"base_form.isEq === 5 && scope.row.isMaster === 4\"\n size=\"mini\"\n @click=\"\n openModal(scope.$index, 'appoint_price_show', scope.row)\n \"\n >\n 已设置\n </el-button>\n <el-button\n v-else\n type=\"info\"\n size=\"mini\"\n :disabled=\"base_form.isEq === 5 && scope.row.isMaster === 4\"\n @click=\"\n openModal(scope.$index, 'appoint_price_show', scope.row)\n \"\n >\n 去设置\n </el-button>\n </template>\n </el-table-column>\n </el-table>\n </div>\n <!-- 多规格-->\n <div v-if=\"base_form.specType === 2\" class=\"detail-tab-item\">\n <div class=\"detail-tab-title\">\n <span>规格明细</span>\n </div>\n <el-tabs v-model=\"tabs_active\" type=\"card\">\n <el-tab-pane\n v-for=\"(itemU, indexU) in unit_data\"\n :key=\"indexU\"\n :label=\"itemU.unitName\"\n :name=\"itemU.unitName\"\n >\n <el-table\n style=\"width: 98%; margin: 0 auto\"\n :data=\"itemU.spec_table_Data\"\n >\n <el-table-column\n v-for=\"(item, index) in sku_list\"\n :key=\"index\"\n prop=\"specName\"\n min-width=\"80\"\n :label=\"item.groupSpecName\"\n >\n <template slot-scope=\"scope\">\n {{\n scope.row.specName.indexOf(\"_\") > -1\n ? scope.row.specName.split(\"_\")[index] || \"\"\n : scope.row.specName\n }}\n </template>\n </el-table-column>\n <el-table-column\n prop=\"specImage\"\n label=\"规格图片\"\n min-width=\"140\"\n >\n <template slot-scope=\"scope\">\n <UploadQiniu\n :width=\"50\"\n is-btn=\"picture\"\n :file-list=\"\n scope.row.specImage.url ? [scope.row.specImage] : []\n \"\n @uploadSuccess=\"\n uploadSpecSuccess($event, scope.$index, indexU)\n \"\n ></UploadQiniu>\n </template>\n </el-table-column>\n\n <el-table-column label=\"销售价/元\" min-width=\"120\">\n <template slot-scope=\"scope\">\n <el-input-number\n v-model=\"scope.row.salePrice\"\n size=\"mini\"\n :controls=\"false\"\n :min=\"0\"\n style=\"width: 100%\"\n @blur=\"salePriceBlur(scope.$index, indexU)\"\n ></el-input-number>\n </template>\n </el-table-column>\n <el-table-column\n prop=\"memberPrice\"\n label=\"会员价/元\"\n min-width=\"100\"\n >\n <template slot-scope=\"scope\">\n <el-input-number\n v-model=\"scope.row.memberPrice\"\n style=\"width: 100%\"\n :controls=\"false\"\n placeholder=\"会员价\"\n size=\"small\"\n :min=\"0\"\n ></el-input-number>\n </template>\n </el-table-column>\n <el-table-column\n prop=\"marketPrice\"\n label=\"市场价/元\"\n min-width=\"100\"\n >\n <template slot-scope=\"scope\">\n <el-input-number\n v-model=\"scope.row.marketPrice\"\n style=\"width: 100%\"\n :controls=\"false\"\n placeholder=\"市场价\"\n size=\"small\"\n :min=\"0\"\n ></el-input-number>\n </template>\n </el-table-column>\n <el-table-column label=\"起订数量\" min-width=\"100\">\n <template slot-scope=\"scope\">\n <el-input-number\n v-model=\"scope.row.setNum\"\n style=\"width: 80px\"\n :controls=\"false\"\n placeholder=\"起订数量\"\n size=\"small\"\n ></el-input-number>\n </template>\n </el-table-column>\n <el-table-column label=\"是否销售\" min-width=\"100\">\n <template slot-scope=\"scope\">\n <el-switch\n v-model=\"scope.row.isSale\"\n class=\"switchStyle\"\n active-text=\"启用\"\n inactive-text=\"禁用\"\n active-color=\"#2153D4\"\n inactive-color=\"#879BBA\"\n :active-value=\"5\"\n :inactive-value=\"4\"\n ></el-switch>\n </template>\n </el-table-column>\n <el-table-column\n v-if=\"!!goods_id\"\n prop=\"inventory\"\n label=\"库存\"\n min-width=\"100\"\n >\n <template slot-scope=\"scope\">\n {{\n scope.row.isEditSpec === 5\n ? \"无记录\"\n : scope.row.inventory\n }}\n </template>\n </el-table-column>\n <el-table-column label=\"商品条码\" min-width=\"140px\">\n <template slot-scope=\"scope\">\n <el-input\n v-model=\"scope.row.barCode\"\n size=\"small\"\n style=\"width: 100%\"\n placeholder=\"请输入商品条码\"\n ></el-input>\n </template>\n </el-table-column>\n <el-table-column label=\"商品重量/g\" min-width=\"120px\">\n <template slot-scope=\"scope\">\n <el-input\n v-model=\"scope.row.weight\"\n style=\"width: 100%\"\n size=\"small\"\n placeholder=\"请输入商品重量\"\n ></el-input>\n </template>\n </el-table-column>\n <el-table-column label=\"默认属性\" min-width=\"120px\">\n <template slot-scope=\"scope\">\n <el-switch\n v-model=\"scope.row.isDefault\"\n active-color=\"#36B365\"\n inactive-color=\"#ff4949\"\n active-text=\"是\"\n inactive-text=\"否\"\n :inactive-value=\"4\"\n :active-value=\"5\"\n @change=\"isDefaultChange($event, scope.$index, indexU)\"\n ></el-switch>\n </template>\n </el-table-column>\n <el-table-column label=\"阶梯价\" min-width=\"100\">\n <template slot-scope=\"scope\">\n <el-button\n v-if=\"\n scope.row.ladderPrice.length &&\n scope.row.enabledLadder === 1\n \"\n type=\"primary\"\n size=\"mini\"\n @click=\"\n openModal(\n scope.$index,\n 'ladder_price_show',\n scope.row,\n indexU\n )\n \"\n >\n 已设置\n </el-button>\n <el-button\n v-else\n type=\"info\"\n size=\"mini\"\n @click=\"\n openModal(\n scope.$index,\n 'ladder_price_show',\n scope.row,\n indexU\n )\n \"\n >\n 去设置\n </el-button>\n </template>\n </el-table-column>\n <el-table-column label=\"客户类型价\" min-width=\"100\">\n <template slot-scope=\"scope\">\n <el-button\n v-if=\"\n scope.row.customerTypePrice.length &&\n scope.row.customerTypePriceOpen\n \"\n type=\"primary\"\n size=\"mini\"\n @click=\"\n openModal(\n scope.$index,\n 'type_price_show',\n scope.row,\n indexU\n )\n \"\n >\n 已设置\n </el-button>\n <el-button\n v-else\n type=\"info\"\n size=\"mini\"\n @click=\"\n openModal(\n scope.$index,\n 'type_price_show',\n scope.row,\n indexU\n )\n \"\n >\n 去设置\n </el-button>\n </template>\n </el-table-column>\n <el-table-column label=\"客户指定价\" min-width=\"100\">\n <template slot-scope=\"scope\">\n <el-button\n v-if=\"\n scope.row.customerPrice.length &&\n scope.row.customerPriceOpen\n \"\n type=\"primary\"\n size=\"mini\"\n @click=\"\n openModal(\n scope.$index,\n 'appoint_price_show',\n scope.row,\n indexU\n )\n \"\n >\n 已设置\n </el-button>\n <el-button\n v-else\n type=\"info\"\n size=\"mini\"\n @click=\"\n openModal(\n scope.$index,\n 'appoint_price_show',\n scope.row,\n indexU\n )\n \"\n >\n 去设置\n </el-button>\n </template>\n </el-table-column>\n <el-table-column label=\"操作\" min-width=\"160\">\n <template slot-scope=\"scope\">\n <el-button\n v-if=\"itemU.isMaster === 5\"\n :disabled=\"scope.row.isEditSpec === 4\"\n type=\"danger\"\n size=\"small\"\n plain\n @click=\"specDetailDel(scope.row, scope.$index)\"\n >\n 删除\n </el-button>\n <el-button\n type=\"primary\"\n size=\"small\"\n plain\n @click=\"otherSetPrice(scope.row, indexU)\"\n >\n 同步\n </el-button>\n </template>\n </el-table-column>\n </el-table>\n </el-tab-pane>\n </el-tabs>\n </div>\n <!-- 物流设置 -->\n <div class=\"detail-tab-item\">\n <div class=\"detail-tab-title\">\n <span>物流设置</span>\n </div>\n <el-form-item v-if=\"false\" label=\"物流支持:\" prop=\"deliverySupIds\">\n <el-checkbox-group v-model=\"base_form.deliverySupIds\">\n <el-checkbox label=\"1\">快递</el-checkbox>\n <el-checkbox label=\"2\">自提</el-checkbox>\n </el-checkbox-group>\n <p\n v-if=\"!goods_id\"\n class=\"form-tip\"\n @click=\"$router.push('/SystemSettings/jiaoyiset/Delivery')\"\n >\n <el-button type=\"text\" size=\"small\">【配送方式配置】</el-button>\n </p>\n </el-form-item>\n <br />\n <el-form-item label=\"快递运费:\">\n <el-radio-group v-model=\"base_form.expressType\">\n <el-radio :label=\"1\">包邮</el-radio>\n <el-radio :label=\"2\">运费模版</el-radio>\n <el-radio :label=\"3\">统一运费</el-radio>\n </el-radio-group>\n </el-form-item>\n <br />\n <div v-if=\"base_form.expressType === 2\">\n <el-form-item label=\"运费模板:\" prop=\"ruleId\">\n <el-select v-model=\"base_form.ruleId\" placeholder=\"请选择\">\n <el-option\n v-for=\"(item, index) in express_list\"\n :key=\"index\"\n :label=\"item.title\"\n :value=\"item.id\"\n ></el-option>\n </el-select>\n </el-form-item>\n </div>\n <div v-if=\"base_form.expressType === 3\">\n <el-form-item label=\"统一运费:\" prop=\"expressFee\">\n <el-input-number\n v-model=\"base_form.expressFee\"\n :controls=\"false\"\n ></el-input-number>\n <span>元</span>\n </el-form-item>\n </div>\n <el-form-item v-if=\"false\" label=\"是否展示快递:\">\n <el-radio-group v-model=\"base_form.showExpress\">\n <el-radio :label=\"4\">不展示</el-radio>\n <el-radio :label=\"5\">展示</el-radio>\n </el-radio-group>\n </el-form-item>\n </div>\n <div class=\"detail-tab-item\">\n <div class=\"detail-tab-title\">\n <span>商品详情</span>\n </div>\n <div class=\"info-main\" style=\"padding: 0 49px\">\n <Tinymce v-model=\"base_form.description\" :height=\"300\" />\n </div>\n </div>\n </div>\n\n <!-- 经营屏蔽-->\n <div v-if=\"page_tabs === '2'\">\n <div class=\"page-tip-div\">\n <i class=\"el-icon-info\"></i>\n 符合以下条件的客户用将无法看到此商品\n </div>\n <el-row :gutter=\"10\">\n <el-col :span=\"8\">\n <div class=\"detail-tab-item\" style=\"margin-bottom: 0\">\n <div class=\"detail-tab-title\">地区屏蔽</div>\n <div\n class=\"detail-tab-main\"\n style=\"height: calc(100vh - 380px); overflow: auto\"\n >\n <RegionTree\n :checked-key=\"region_arr\"\n @checkChange=\"selRegion\"\n />\n </div>\n </div>\n </el-col>\n <el-col :span=\"16\">\n <div class=\"detail-tab-item\">\n <div class=\"detail-tab-title\">客户类型屏蔽</div>\n <div class=\"detail-tab-main\">\n <div\n v-if=\"!customer_type_list.length\"\n style=\"text-align: center\"\n >\n 暂无客户类型\n </div>\n <el-checkbox-group v-model=\"customer_type_check\">\n <el-checkbox\n v-for=\"(item, index) in customer_type_list\"\n :key=\"index\"\n :label=\"item.id\"\n >\n {{ item.name }}\n </el-checkbox>\n </el-checkbox-group>\n </div>\n </div>\n <div class=\"detail-tab-item\">\n <div class=\"detail-tab-title clearfix\">\n <span class=\"float_left\">客户屏蔽</span>\n <div class=\"float_right\">\n <el-button\n type=\"primary\"\n size=\"mini\"\n @click=\"customer_show = true\"\n >\n 选择客户\n </el-button>\n </div>\n </div>\n <div class=\"detail-tab-main\">\n <el-table :data=\"customer_list\">\n <el-table-column\n show-overflow-tooltip\n prop=\"code\"\n label=\"编号\"\n ></el-table-column>\n <el-table-column\n show-overflow-tooltip\n prop=\"name\"\n label=\"姓名\"\n ></el-table-column>\n <el-table-column\n prop=\"customerType\"\n label=\"类型\"\n ></el-table-column>\n <el-table-column\n prop=\"shopName\"\n label=\"所属商铺\"\n show-overflow-tooltip\n ></el-table-column>\n <el-table-column label=\"管理\">\n <template slot-scope=\"scope\">\n <el-button\n type=\"text\"\n @click=\"deleteCustomer(scope.$index)\"\n >\n 删除\n </el-button>\n </template>\n </el-table-column>\n </el-table>\n </div>\n </div>\n </el-col>\n </el-row>\n </div>\n </el-form>\n\n <el-dialog\n :close-on-press-escape=\"false\"\n :close-on-click-modal=\"false\"\n title=\"新增辅助单位\"\n :visible.sync=\"assist_model\"\n width=\"40%\"\n >\n <el-form\n style=\"text-align: center\"\n :model=\"assist_form\"\n size=\"small\"\n inline\n >\n <div v-if=\"isNew === 4\">\n <el-form-item prop=\"conversion\">\n 1\n {{ base_form.masterUnit.unitName }}\n =\n </el-form-item>\n <el-form-item prop=\"unitName\">\n <el-input-number\n v-model=\"assist_form.conversion\"\n :controls=\"false\"\n ></el-input-number>\n <el-select\n v-model=\"assist_form.unitId\"\n placeholder=\"请选择辅助单位\"\n @change=\"branchUnitChange\"\n >\n <el-option\n v-for=\"(item, index) in unit_options\"\n :key=\"index\"\n :label=\"item.unitName\"\n :value=\"item.id\"\n :disabled=\"item.id === base_form.masterUnit.unitId\"\n ></el-option>\n </el-select>\n </el-form-item>\n </div>\n <!-- v-if=\"\n base_form.isEq === 4 ||\n (base_form.isEq === 5 && item.unitName === '件')\n \"-->\n <div v-else>\n <el-form-item prop=\"conversion\">\n 1\n <el-select\n v-model=\"assist_form.unitId\"\n placeholder=\"请选择辅助单位\"\n @change=\"branchUnitChange\"\n >\n <template v-for=\"(item, index) in unit_options\">\n <el-option\n :key=\"index\"\n :label=\"item.unitName\"\n :value=\"item.id\"\n :disabled=\"item.id === base_form.masterUnit.unitId\"\n ></el-option>\n </template>\n </el-select>\n =\n </el-form-item>\n <el-form-item prop=\"unitName\">\n <el-input-number\n v-model=\"assist_form.conversion\"\n :controls=\"false\"\n ></el-input-number>\n {{ base_form.masterUnit.unitName }}\n </el-form-item>\n </div>\n </el-form>\n <span slot=\"footer\" class=\"dialog-footer\">\n <el-button @click=\"assist_model = false\">取 消</el-button>\n <el-button type=\"primary\" @click=\"subAssist\">确 定</el-button>\n </span>\n </el-dialog>\n <!-- 属性值 -->\n <el-dialog\n :close-on-press-escape=\"false\"\n :close-on-click-modal=\"false\"\n title=\"属性值\"\n :visible.sync=\"spec_model\"\n width=\"40%\"\n >\n <el-checkbox\n v-model=\"spec_check_all\"\n :indeterminate=\"is_indeterminate_spec\"\n @change=\"checkAllSpecChange\"\n >\n 全选\n </el-checkbox>\n <div style=\"margin: 15px 0\"></div>\n <el-checkbox-group v-model=\"spec_item_check\" @change=\"specItemChange\">\n <el-checkbox\n v-for=\"(item, index) in spec_data_child\"\n :key=\"index\"\n :label=\"item.id\"\n >\n {{ item.specName }}\n </el-checkbox>\n </el-checkbox-group>\n <span slot=\"footer\" class=\"dialog-footer\">\n <el-button @click=\"spec_model = false\">取 消</el-button>\n <el-button type=\"primary\" @click=\"selSpecVal\">确 定</el-button>\n </span>\n </el-dialog>\n <BrandSelModel\n :is-check=\"false\"\n :is-show-add=\"true\"\n :dialog-visible=\"sel_brand\"\n :enable=\"true\"\n @close=\"sel_brand = false\"\n @confirm=\"brandConfirm\"\n />\n <!----------------- 添加分类 ----------->\n <AddCate\n v-if=\"add_model\"\n :dialog-title=\"dialogTitle\"\n :is-show=\"add_model\"\n :pid-path=\"pid_arr\"\n @confirm=\"subCategory\"\n @cancel=\"modelClose\"\n />\n <!-- 新建品牌-->\n <el-drawer\n class=\"edit-drawer\"\n size=\"50%\"\n :visible.sync=\"add_Brand\"\n direction=\"rtl\"\n >\n <AddBrand v-if=\"add_Brand\" @submitBrand=\"submitBrand\" />\n </el-drawer>\n <!-- 客户选择-->\n <ClientListModal\n v-if=\"customer_show\"\n :is-show=\"customer_show\"\n :is-check=\"true\"\n :is-show-add=\"true\"\n @cancel=\"customer_show = false\"\n @confirm=\"customerSel\"\n />\n <CustomerPrice\n v-if=\"appoint_price_show\"\n :is-show=\"appoint_price_show\"\n :ladder-price=\"ladderPrice\"\n :enabled-ladder=\"enabledLadder\"\n :customer-price-open=\"customerPriceOpen\"\n :customer-price=\"customerPrice\"\n :sku-id=\"sku_id\"\n @confirm=\"appointPriceConfirm\"\n @cancel=\"appointPriceCancel\"\n />\n <CustomerTypePrice\n v-if=\"type_price_show\"\n :is-show=\"type_price_show\"\n :ladder-price=\"ladderPrice\"\n :enabled-ladder=\"enabledLadder\"\n :sku-id=\"sku_id\"\n :customer-type-price-open=\"customerTypePriceOpen\"\n :customer-type-price=\"customerTypePrice\"\n @confirm=\"typePriceConfirm\"\n @cancel=\"typePriceCancel\"\n />\n <!-- 阶梯价弹窗-->\n <LadderPrice\n v-if=\"ladder_price_show\"\n :enabled-ladder=\"enabledLadder\"\n :disabled=\"\n base_form.isEq === 5 && unitisMaster === 4 && base_form.specType === 1\n \"\n :ladder-price=\"ladderPrice\"\n :is-show=\"ladder_price_show\"\n @confirm=\"ladderPriceConfirm\"\n @cancel=\"ladderPriceCancel\"\n />\n </ContainerTit>\n</template>\n\n<script>\n import CustomerPrice from \"../components/CustomerPrice\";\n import LadderPrice from \"../components/LadderPrice\";\n import CustomerTypePrice from \"../components/CustomerTypePrice\";\n // import GoodsCategory from \"@/component/common/GoodsCategory.vue\";\n import BrandSelModel from \"@/component/goods/BrandSelModel.vue\";\n import Tinymce from \"@/component/Tinymce\";\n import UploadQiniu from \"@/component/common/UploadQiniu.vue\";\n // 新增分类\n import AddCate from \"@/component/goods/AddCate.vue\";\n import AddBrand from \"../manageG/AddBrand\";\n import { getAllExpressRule, getAllCustomerSource } from \"@/api/System\";\n import {\n getAllUnit,\n defineSpec,\n SpecManagegetAll,\n getQuickGoodsInfo,\n editQuickGoods,\n addBasicAndPublishGoods,\n getAllCategoryPost,\n } from \"@/api/goods\";\n import { addPauseSave, delPauseSave, getPauseSave } from \"@/api/common\";\n const priceDataLi = {\n enabledLadder: 0,\n marketPrice: \"\",\n memberPrice: \"\",\n salePrice: \"\",\n setNum: 1,\n isSale: 5,\n salePriceAreaType: 1,\n // 客户类型和客户快速调价\n customerTypePrice: [],\n customerTypePriceOpen: false,\n customerPrice: [],\n customerPriceOpen: false,\n ladderPrice: [\n /* {\n from: 1,\n price: 0.01,\n to: 2\n }, {\n from: 3,\n price: 0.01,\n to: 4\n },\n {\n from: 5,\n price: 0.01,\n to: 999999999\n } */\n ],\n };\n import ClientListModal from \"@/component/common/ClientListModal\";\n import RegionTree from \"@/component/common/RegionTree\";\n import { mapGetters } from \"vuex\";\n import {\n CustomerPriceAdjustmentAdd,\n addCustomerTypePriceAdjustment,\n getCustomerPriceByGoodsIds,\n getCustomerTypePriceByGoodsIds,\n } from \"@/api/Price\";\n import { getAllMerchantList } from \"@/api/Merchants\";\n export default {\n name: \"AddBaseData\",\n components: {\n // GoodsCategory,\n BrandSelModel,\n Tinymce,\n UploadQiniu,\n AddCate,\n AddBrand,\n RegionTree,\n ClientListModal,\n CustomerPrice,\n CustomerTypePrice,\n LadderPrice,\n },\n data() {\n const validateUnit = (rule, value, callback) => {\n if (value.unitName === \"\") {\n callback(new Error(\"请设置基本单位\"));\n } else {\n callback();\n }\n };\n return {\n unitisMaster: \"\",\n unit_index: 0,\n sku_index: 0,\n ladderPrice: [],\n enabledLadder: 0,\n ladder_price_show: false, // 阶梯价弹窗\n type_price_show: false, // 客户类型价弹窗\n customerTypePriceOpen: false, // 客户类型价弹窗开关\n customerTypePrice: [], // 客户类型价弹窗数据\n customerPriceOpen: false,\n customerPrice: [],\n appoint_price_show: false, // 客户指定价弹窗\n customer_show: false, // 经营屏蔽->客户列表弹窗选择\n customer_list: [], // 经营屏蔽->客户列表\n customer_type_check: [], // 经营屏蔽->客户类型选择数组\n customer_type_list: [], // 经营屏蔽->客户类型列表\n region_arr: [], // 经营屏蔽->当前商品已选择过的区域\n page_tabs: \"1\", // 页面tab切换\n express_list: [], // 运费模版列表\n isEditSpec: 5, // 5 表示此商品从未采购过,允许用户随意编辑单位和属性;4 表示商品已经采购过,隐藏添加属性按钮,避免skuid重组\n // 计量单位\n self_spec_val: \"\", // 自定义属性值输入框\n spec_name_index: 0, // 属性名index\n self_spec_input: false, // 显示自定义属性值输入框\n spec_model: false, // 选择属性值弹窗\n spec_item_check: [], // 属性值弹窗单选value\n is_indeterminate_spec: false, // 批量选择属性值 全选选择框状态\n spec_check_all: false, // 属性值 全选选择框value\n spec_data: [], // 属性列表\n spec_data_child: [], // 属性值列表\n spec_table_Data: [], // 规格明细\n sku_list: [\n // 商品属性列表\n {\n spec_data_child: [],\n groupSpecId: \"\",\n self_spec_val: \"\",\n self_spec_input: false,\n groupSpecName: \"\",\n params: [],\n },\n ],\n add_model: false, // 新建分类\n dialogTitle: \"新建分类\",\n pid_arr: [],\n add_Brand: false, // 新增品牌\n pageName: \"\", // 暂存数据参数\n loading: false,\n img_list: [],\n // 关键词\n dynamicTags: [],\n inputVisible: false,\n inputValue: \"\",\n // 关键词 END\n assist_model: false,\n edit_assist_model: false,\n assist_index: 0,\n unit_options: [],\n // 计量单位弹窗\n assist_form: {\n unitName: \"\",\n barCode: \"\",\n isMaster: 4,\n isDefault: 4,\n isEditSpec: 5,\n unitId: \"\",\n conversion: \"\",\n },\n sel_brand: false, // 打开品牌选择弹窗\n sel_shop: false, // 打开店铺选择弹窗\n master_unit_name: \"\",\n base_form: {\n // 基本信息\n enableStatus: 5, // 是否上架\n isDistribution: 4, //负库存销售\n isShield: 4, // 经营屏蔽 4关闭 5开启\n isEq: 4, // 抄码商品\n specType: 1, // 是否多规格\n delUnitIds: [], // 辅助单位删除delUnitIds (unitId)\n delSpecSkuIds: [], // 属性删除delSpecSkuIds(这个用id)\n branchUnit: [],\n brandName: \"\",\n categoryId: \"\",\n assistCategoryId: \"\",\n categoryPath: [], // 分类选择\n assistCategoryPath: [], // 分类选择\n unitData: [],\n masterUnit: {\n barCode: \"\",\n weight: \"\",\n isMaster: 5,\n isDefault: 5,\n unitName: \"\",\n unitId: \"\",\n },\n describe: \"\",\n title: \"\",\n storage: \"\",\n code: \"\",\n barCode: \"\", // 商品条码\n weight: \"\", // 商品重量\n expireTime: \"\",\n brandId: \"\",\n tag: \"\",\n description: \"\",\n salesShop: \"\",\n images: [],\n deliverySupIds: [\"1\", \"2\"], // 物流支持 固定值 1 快递 2 自提 传参格式:1,2\n expressType: 1, // 快递运费 1 包邮 2 运费模版 3 固定费用\n expressFee: \"\", // 固定费用\n showExpress: 5, // 是否展示快递 5展示 4不展示\n ruleId: \"\", // 运费模版id\n notArea: [], //经营屏蔽地区\n notCustomerType: \"\", //经营屏蔽 客户类型屏蔽\n notCustomer: \"\", //经营屏蔽 客户屏蔽\n merchantId: \"\", //商户ID\n },\n sel_cities: [], // 商户列表\n base_rules: {\n // 基本信息验证\n images: [\n {\n type: \"array\",\n required: true,\n message: \"请上传商品图片\",\n trigger: \"change\",\n },\n ],\n title: [\n { required: true, message: \"请输入商品名称\", trigger: \"blur\" },\n ],\n categoryId: [\n { required: true, message: \"请选择商品分类\", trigger: \"change\" },\n ],\n expireTime: [\n { required: true, message: \"请输入商品保质期\", trigger: \"blur\" },\n ],\n // brandId: [{ required: true, message: '请选择商品品牌', trigger: 'change' }],\n // describe: [{ required: true, message: '请输入商品描述', trigger: 'blur' }],\n masterUnit: [{ validator: validateUnit, trigger: \"change\" }],\n deliverySupIds: [\n {\n required: true,\n type: \"array\",\n message: \"请选择物流支持\",\n trigger: \"change\",\n },\n ],\n ruleId: [\n { required: true, message: \"请选择运费模板\", trigger: \"change\" },\n ],\n expressFee: [\n { required: true, message: \"请输入运费\", trigger: \"blur\" },\n ],\n // branchUnit: [{ required: true, type: 'array', message: '请设置辅助单位', trigger: 'change' }]\n // tag: [{ required: true, message: '请设置商品关键词', trigger: 'change' }]\n },\n goods_id: 0,\n list_page_data: \"1_10\",\n unit_data: [], // 单位明细\n tabs_active: \"\", // 多属性单位切换\n isNew: 5, // 5 标示这是一个最近新增的商品,基本单位为最小单位,4标示这是之前的老数据,基本单位为最大单位\n category_data: [], //商品分类列表\n cate_props: {\n label: \"title\",\n value: \"id\",\n checkStrictly: true,\n },\n assist_cate: [\n {\n assistCategoryPath: [],\n },\n ],\n sku_id: \"\",\n };\n },\n computed: {\n ...mapGetters({\n salePriceTimes: \"MUser/salePriceTimes\",\n systemType: \"MUser/systemType\", // 当前后台\n }),\n },\n async created() {\n // 商户管理\n await this.getAllMerchantList();\n // 商品分类列表\n await this.getAllCategoryPost();\n this.pageName = this.$route.name;\n // 属性管理\n await this.SpecManagegetAll();\n await this.getAllUnit();\n // 客户类型\n await this.getAllCustomerSource();\n if (this.$route.params.id) {\n this.goods_id = this.$route.params.id;\n this.list_page_data = this.$route.params.page;\n await this.getGoodsBasicInfoById();\n } else {\n // 获取暂存信息\n await this.getPauseSave();\n }\n await this.getAllExpressRule();\n },\n methods: {\n // 获取运费模版\n async getAllExpressRule() {\n const { data } = await getAllExpressRule();\n\n this.express_list = data;\n },\n isDefaultChange(val, index, sIndex) {\n if (val === 5) {\n const target = this.$_common.deepClone(this.unit_data);\n if (this.base_form.specType === 2) {\n target.forEach((item, indexU) => {\n item.spec_table_Data.forEach((itemB, indexB) => {\n if (indexU !== sIndex) {\n itemB.isDefault = 4;\n } else {\n if (indexB !== index) {\n itemB.isDefault = 4;\n }\n }\n });\n });\n } else {\n target.forEach((item, indexU) => {\n if (indexU !== index) {\n item.isDefault = 4;\n }\n });\n }\n this.unit_data = target;\n }\n },\n // 请求基本单位数据\n async getAllUnit() {\n const { data } = await getAllUnit({\n page: 1,\n pageSize: 99,\n });\n\n this.unit_options = data;\n },\n modelClose() {\n this.add_model = false;\n },\n // 打开新增弹窗\n openModel(title, row) {\n this.add_model = true;\n this.dialogTitle = title;\n if (title === \"新建子分类\") {\n let link = row.link\n ? row.link.split(\",\").map((item) => {\n return parseInt(item);\n })\n : [];\n link.push(row.id);\n this.pid_arr = link;\n }\n },\n // 新增/编辑分类\n async subCategory() {\n this.getAllCategoryPost();\n this.$message(\"新建分类成功\");\n },\n // 新建品牌\n submitBrand() {\n this.add_Brand = false;\n },\n // 添加暂存\n async AddTem() {\n const params = {\n ...this.base_form,\n specGroup: this.sku_list,\n specMultiple: this.spec_table_Data,\n tag: this.dynamicTags,\n assist_cate: this.assist_cate,\n };\n this.loading = true;\n const data = await addPauseSave({\n key: this.pageName,\n data: params,\n });\n this.loading = false;\n\n this.$message({\n type: \"success\",\n message: \"暂存成功\",\n });\n if (this.systemType === 3) {\n this.$closeCurrentGoEdit(`/goods/sale/MerchantsGoods`);\n } else {\n this.$closeCurrentGoEdit(`/goods/sale/PublishGoods`);\n }\n },\n // 删除暂存信息\n async delPauseSave() {\n const data = delPauseSave({\n key: this.pageName,\n });\n },\n // 获取暂存信息\n async getPauseSave() {\n const { data } = await getPauseSave({\n key: this.pageName,\n });\n\n if (JSON.stringify(data) === \"{}\") return;\n this.base_form = {\n ...data,\n categoryPath: Array.isArray(data.categoryPath)\n ? data.categoryPath\n : [],\n assistCategoryPath: Array.isArray(data.assistCategoryPath)\n ? data.assistCategoryPath\n : [],\n };\n this.assist_cate = data.assist_cate || [{ assistCategoryPath: [] }];\n this.sku_list = data.specGroup || [];\n this.spec_table_Data = data.specMultiple || [];\n this.dynamicTags = data.tag || [];\n if (data.images) {\n this.img_list = data.images.map((item) => {\n return {\n name: \"\",\n url: item,\n };\n });\n }\n },\n // 规格图片\n uploadSpecSuccess(val, index, indexU) {\n let target = this.$_common.deepClone(this.unit_data);\n if (this.base_form.specType === 1) {\n target[index].specImage = {\n name: \"\",\n url: val,\n };\n } else {\n target[indexU].spec_table_Data[index].specImage = {\n name: \"\",\n url: val,\n };\n }\n this.unit_data = target;\n },\n // 添加规格项目\n addSkuP() {\n if (!this.goods_id) {\n this.sku_list.push({\n spec_data_child: [],\n self_spec_input: false,\n self_spec_val: \"\",\n groupSpecId: \"\",\n groupSpecName: \"\",\n params: [],\n });\n } else {\n this.$confirm(\n \"新增规格会导致原有库存重置,请谨慎操作! 是否继续?\",\n \"提示\",\n {\n confirmButtonText: \"继续新增\",\n cancelButtonText: \"取消\",\n type: \"warning\",\n }\n ).then(() => {\n this.sku_list.push({\n spec_data_child: [],\n self_spec_input: false,\n self_spec_val: \"\",\n groupSpecId: \"\",\n groupSpecName: \"\",\n params: [],\n });\n });\n }\n },\n // 规格明切换\n groupSpecIdChange(val, indexS) {\n let target = this.$_common.deepClone(this.sku_list);\n const specDataItem = this.spec_data.find((item) => item.id === val);\n target[indexS].groupSpecName = specDataItem.specName;\n target[indexS].spec_data_child = specDataItem.child || [];\n target[indexS].params = [];\n this.sku_list = target;\n // 重排规格组合\n // this.specGroupRest()\n // console.log(this.sku_list)\n // console.log(this.spec_table_Data)\n },\n // 重排规格组合\n specGroupRest() {\n // 编辑页面存储详情接口返回规格组合id\n // this.spec_table_Data.forEach(item => {\n // if (item.specGroupHash && this.base_form.delSpecSkuIds.indexOf(item.specGroupHash) === -1) {\n // this.base_form.delSpecSkuIds.push(item.specGroupHash)\n // }\n // })\n\n const skuArr = this.sku_list.map((item) => {\n item.params = item.params.map((itemP) => {\n return {\n ...itemP,\n groupSpecName: item.groupSpecName,\n };\n });\n return item.params;\n });\n\n let skuArrDo = [];\n if (skuArr.length) {\n skuArrDo = this.doExchange(skuArr);\n }\n // 备份一份规格明细,用来填充重排规格组之前的图片\n const cloneUnitData = this.$_common.deepClone(this.unit_data);\n this.unit_data = this.unit_data.map((item, index) => {\n const cloneSpecGroup = cloneUnitData[index].spec_table_Data || [];\n return {\n ...item,\n spec_table_Data: skuArrDo.map((itemSp) => {\n const indexSS = cloneSpecGroup.findIndex(\n (itemC) => itemC.id === itemSp.id\n );\n return {\n ...itemSp,\n barCode:\n indexSS > -1\n ? cloneSpecGroup[indexSS].barCode\n : itemSp.barCode,\n weight:\n indexSS > -1 ? cloneSpecGroup[indexSS].weight : itemSp.weight,\n isDefault:\n indexSS > -1\n ? cloneSpecGroup[indexSS].isDefault\n : itemSp.isDefault,\n specImage:\n indexSS > -1\n ? cloneSpecGroup[indexSS].specImage\n : itemSp.specImage,\n inventory:\n indexSS > -1\n ? cloneSpecGroup[indexSS].inventory\n : itemSp.inventory || 0,\n isEditSpec:\n indexSS > -1\n ? cloneSpecGroup[indexSS].isEditSpec\n : itemSp.isEditSpec || 5,\n salePrice:\n indexSS > -1\n ? cloneSpecGroup[indexSS].salePrice\n : itemSp.salePrice,\n enabledLadder:\n indexSS > -1\n ? cloneSpecGroup[indexSS].enabledLadder\n : itemSp.enabledLadder,\n ladderPrice:\n indexSS > -1\n ? cloneSpecGroup[indexSS].ladderPrice\n : itemSp.ladderPrice,\n marketPrice:\n indexSS > -1\n ? cloneSpecGroup[indexSS].marketPrice\n : itemSp.marketPrice,\n memberPrice:\n indexSS > -1\n ? cloneSpecGroup[indexSS].memberPrice\n : itemSp.memberPrice,\n setNum:\n indexSS > -1\n ? cloneSpecGroup[indexSS].setNum\n : itemSp.setNum || 1,\n isSale:\n indexSS > -1\n ? cloneSpecGroup[indexSS].isSale\n : itemSp.isSale || 5,\n customerTypePrice:\n indexSS > -1\n ? cloneSpecGroup[indexSS].customerTypePrice\n : itemSp.customerTypePrice || [],\n customerTypePriceOpen:\n indexSS > -1\n ? cloneSpecGroup[indexSS].customerTypePriceOpen\n : itemSp.customerTypePriceOpen || false,\n customerPrice:\n indexSS > -1\n ? cloneSpecGroup[indexSS].customerPrice\n : itemSp.customerPrice || [],\n customerPriceOpen:\n indexSS > -1\n ? cloneSpecGroup[indexSS].customerPriceOpen\n : itemSp.customerPriceOpen || false,\n };\n }),\n };\n });\n // 判断是否是多属性\n this.base_form.specType = this.unit_data.some(\n (item) => item.spec_table_Data && item.spec_table_Data.length > 0\n )\n ? 2\n : 1;\n if (this.base_form.specType === 2 && !this.tabs_active) {\n this.tabs_active = this.unit_data[0].unitName;\n }\n },\n // 规格组合\n doExchange(doubleArrays) {\n const len = doubleArrays.length;\n if (len >= 2) {\n const len1 = doubleArrays[0].length;\n const len2 = doubleArrays[1].length;\n const newlen = len1 * len2;\n const temp = new Array(newlen);\n let index = 0;\n for (let i = 0; i < len1; i++) {\n for (let j = 0; j < len2; j++) {\n temp[index] = {\n groupSpecId:\n doubleArrays[0][i].groupSpecId +\n \"_\" +\n doubleArrays[1][j].groupSpecId,\n groupSpecName:\n doubleArrays[0][i].groupSpecName +\n \"_\" +\n doubleArrays[1][j].groupSpecName,\n id: doubleArrays[0][i].id + \"_\" + doubleArrays[1][j].id,\n specName:\n doubleArrays[0][i].specName +\n \"_\" +\n doubleArrays[1][j].specName,\n specImage: {\n name: \"\",\n url: \"\",\n },\n setNum: 1,\n isSale: 5,\n salePrice: 0.01,\n enabledLadder: 0,\n ladderPrice: [],\n marketPrice: 0.01,\n memberPrice: \"\",\n barCode: \"\",\n weight: \"\",\n isDefault: 4,\n // 客户类型和客户快速调价\n customerTypePrice: [],\n customerTypePriceOpen: false,\n customerPrice: [],\n customerPriceOpen: false,\n };\n index++;\n }\n }\n let newArray = new Array(len - 1);\n newArray[0] = temp;\n if (len > 2) {\n let _count = 1;\n for (let i = 2; i < len; i++) {\n newArray[_count] = doubleArrays[i];\n _count++;\n }\n }\n return this.doExchange(newArray);\n } else {\n return doubleArrays[0].map((item) => {\n return {\n ...item,\n specImage: {\n name: \"\",\n url: \"\",\n },\n setNum: 1,\n isSale: 5,\n barCode: \"\",\n weight: \"\",\n isDefault: 4,\n salePrice: 0.01,\n enabledLadder: 0,\n ladderPrice: [],\n marketPrice: 0.01,\n memberPrice: \"\",\n // 客户类型和客户快速调价\n customerTypePrice: [],\n customerTypePriceOpen: false,\n customerPrice: [],\n customerPriceOpen: false,\n };\n });\n }\n },\n // 自定义属性值输入框确定 添加自定义属性\n async selfSpecConfirm(index) {\n const target = this.$_common.deepClone(this.sku_list);\n if (!target[index].self_spec_val) {\n target[index].self_spec_input = false;\n this.sku_list = target;\n return;\n }\n const { data } = await defineSpec({\n specName: target[index].self_spec_val,\n pid: target[index].groupSpecId,\n hidden: 4,\n });\n\n target[index].self_spec_input = false;\n\n target[index].params.push({\n specName: data.specName,\n id: data.id,\n groupSpecId: target[index].groupSpecId,\n });\n target[index].self_spec_val = \"\";\n this.sku_list = target;\n // 重排规格组合\n this.specGroupRest();\n },\n // 新增规格值\n addSpecVal(indexS) {\n this.spec_model = true;\n this.spec_data_child = this.sku_list[indexS].spec_data_child;\n this.spec_name_index = indexS;\n this.spec_item_check = this.sku_list[indexS].params.map(\n (item) => item.id\n );\n // 使用属性值单选方法,为了设置全选选择框状态\n this.specItemChange(this.spec_item_check);\n },\n // 选择属性值\n selSpecVal() {\n const target = this.$_common.deepClone(this.sku_list);\n const specval = this.spec_data_child\n .filter((item) => {\n return (\n this.spec_item_check.findIndex((itemS) => itemS === item.id) > -1\n );\n })\n .map((item) => {\n return {\n specName: item.specName,\n id: item.id,\n groupSpecId: item.pid,\n };\n });\n target[this.spec_name_index].params = this.$_common.unique(\n target[this.spec_name_index].params.concat(specval),\n [\"id\"]\n );\n this.sku_list = target;\n this.spec_model = false;\n // 重排规格组合\n this.specGroupRest();\n },\n // 属性值全选\n checkAllSpecChange(val) {\n this.is_indeterminate_spec = false;\n if (val) {\n this.spec_item_check = this.spec_data_child.map((item) => {\n return item.id;\n });\n } else {\n this.spec_item_check = [];\n }\n },\n // 属性值单选\n specItemChange(val) {\n let checkedCount = val.length;\n this.spec_check_all = checkedCount === this.spec_data_child.length;\n this.is_indeterminate_spec =\n checkedCount > 0 && checkedCount < this.spec_data_child.length;\n },\n // 删除规格值\n delSpecVal(indexC, indexS, itemC) {\n this.$confirm(\"确定要删除该规格值吗?\", \"提示\", {\n confirmButtonText: \"确定\",\n cancelButtonText: \"取消\",\n type: \"warning\",\n }).then(async () => {\n // 编辑页面规格明细操作\n if (this.goods_id) {\n this.base_form.delSpecSkuIds = this.spec_table_Data\n .filter((item) => item.specName.indexOf(itemC.specName) > -1)\n .map((itemM) => {\n return itemM.specGroupHash;\n });\n }\n // 新增页面规格明细操作\n this.unit_data = this.unit_data.map((itemU) => {\n return {\n ...itemU,\n spec_table_Data: itemU.spec_table_Data.filter(\n (item) => item.specName.indexOf(itemC.specName) === -1\n ),\n };\n });\n\n const target = this.$_common.deepClone(this.sku_list);\n target[indexS].params.splice(indexC, 1);\n this.sku_list = target;\n });\n },\n // 删除规格组\n delGroupSpecId(indexS) {\n this.$confirm(\"确定要删除该规格组吗?\", \"提示\", {\n confirmButtonText: \"确定\",\n cancelButtonText: \"取消\",\n type: \"warning\",\n }).then(async () => {\n this.sku_list.splice(indexS, 1);\n if (this.goods_id) {\n this.base_form.delSpecSkuIds = this.base_form.specMultiple.map(\n (item) => {\n return item.specGroupHash;\n }\n );\n }\n // 重排规格组合\n this.specGroupRest();\n });\n },\n\n // 获取属性列表\n async SpecManagegetAll() {\n const { data, pageTotal } = await SpecManagegetAll({\n page: 1,\n pageSize: 50,\n });\n\n this.spec_data = data.filter((item) => item.specName !== \"计量单位\");\n // this.unit_options = data.find(item => item.specName === '计量单位').child\n },\n // 选择图片\n uploadSuccess(val, res, file, fileList) {\n const imgArr = fileList.map((item) => {\n return item.content;\n });\n\n if (this.base_form.images.length) {\n this.base_form.images = this.base_form.images.concat(imgArr);\n } else {\n this.base_form.images = imgArr;\n }\n this.img_list = this.base_form.images.map((item) => {\n return {\n name: \"\",\n content: item,\n };\n });\n },\n imgSortChange(fileList) {\n this.base_form.images = fileList.map((item) => {\n return item.content;\n });\n },\n uploadRemove(file, fileList) {\n this.base_form.images = fileList.map((item) => {\n return item.content;\n });\n },\n // 关键词删除\n handleClose(tag) {\n this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);\n },\n // 关键词显示输入框\n showInput() {\n this.inputVisible = true;\n this.$nextTick((_) => {\n this.$refs.saveTagInput.$refs.input.focus();\n });\n },\n // 关键词显示输入确定\n handleInputConfirm() {\n let inputValue = this.inputValue;\n if (inputValue) {\n this.dynamicTags.push(inputValue);\n }\n this.inputVisible = false;\n this.inputValue = \"\";\n },\n // 关键词END\n // 设置计量单位\n // 删除辅助单位\n delFuUnit(row, it) {\n this.base_form.branchUnit.splice(it, 1);\n if (this.goods_id) {\n if (\n row.unitId &&\n this.base_form.delUnitIds.indexOf(row.unitId) === -1\n ) {\n this.base_form.delUnitIds.push(row.unitId);\n }\n const spec = this.unit_data.find(\n (item) => item.unitName === row.unitName\n );\n if (spec && spec.specGroupHash) {\n if (\n this.base_form.delSpecSkuIds.indexOf(spec.specGroupHash) === -1\n ) {\n this.base_form.delSpecSkuIds.push(spec.specGroupHash);\n }\n }\n }\n this.unit_data.splice(it + 1, 1);\n },\n // 新增辅助单位\n addFuUnit() {\n this.assist_model = true;\n this.edit_assist_model = false;\n this.assist_form = {\n unitName: \"\",\n isMaster: 4,\n unitId: \"\",\n conversion: \"\",\n };\n },\n // 修改附单位\n EditFuUnit(it) {\n this.assist_model = true;\n this.edit_assist_model = true;\n this.assist_form = this.base_form.branchUnit[it];\n this.assist_index = it;\n },\n // 弹窗提交 辅助单位\n subAssist() {\n if (!this.assist_form.conversion) {\n this.$message.warning(\"请输入单位换算关系\");\n return;\n }\n if (!this.assist_form.unitName) {\n this.$message.warning(\"请选择辅助单位\");\n return;\n }\n this.base_form.branchUnit.push({\n ...this.assist_form,\n isEditSpec: 5,\n });\n if (this.base_form.specType === 2) {\n const specTableData = this.unit_data[0]\n ? this.$_common.deepClone(this.unit_data[0].spec_table_Data || [])\n : [];\n this.unit_data.push({\n ...this.$_common.deepClone(this.assist_form),\n ...this.$_common.deepClone(priceDataLi),\n isMaster: 4,\n isEditSpec: 5,\n specImage: {\n name: \"\",\n url: \"\",\n },\n spec_table_Data: specTableData,\n });\n } else {\n this.unit_data.push({\n ...this.$_common.deepClone(this.assist_form),\n ...this.$_common.deepClone(priceDataLi),\n isMaster: 4,\n isEditSpec: 5,\n specImage: {\n name: \"\",\n url: \"\",\n },\n });\n }\n // 重排规格组合\n this.specGroupRest();\n this.assist_model = false;\n },\n // 基本单位切换\n masterUnitChange(val) {\n this.base_form.masterUnit.unitName = this.unit_options.find(\n (item) => item.id === val\n ).unitName;\n const index = this.unit_data.findIndex((item) => item.isMaster === 5);\n if (index === -1) {\n this.unit_data.unshift({\n ...this.base_form.masterUnit,\n ...this.$_common.deepClone(priceDataLi),\n isMaster: 5,\n specImage: {\n name: \"\",\n url: \"\",\n },\n });\n } else {\n this.$set(this.unit_data, index, {\n ...this.unit_data[index],\n ...this.base_form.masterUnit,\n });\n }\n // 重排规格组合\n this.specGroupRest();\n if (this.base_form.specType === 2) {\n this.tabs_active = this.unit_data[0].unitName;\n }\n },\n // 辅助单位切换\n branchUnitChange(val) {\n this.assist_form.unitName = this.unit_options.find(\n (item) => item.id === val\n ).unitName;\n },\n // 获取详情\n async getGoodsBasicInfoById() {\n const { data } = await getQuickGoodsInfo(this.goods_id);\n\n this.region_arr = data.notArea;\n this.customer_type_check = data.notCustomerType\n ? data.notCustomerType.split(\",\").map((item) => parseInt(item))\n : [];\n this.customer_list = data.notCustomerLists || [];\n\n this.isEditSpec = data.isEditSpec;\n // return\n\n let masterUnit = data.unitData.find((item) => item.isMaster === 5) || {\n barCode: \"\",\n weight: \"\",\n isMaster: 5,\n isDefault: 5,\n unitName: \"\",\n unitId: \"\",\n };\n this.isNew = masterUnit ? masterUnit.isNew || 4 : 4;\n let branchUnit = [];\n if (data.specType === 2) {\n const unitData = data.unitData.filter((item) => item.isMaster === 4);\n branchUnit = (unitData || []).map((item) => {\n return {\n ...item,\n isEditSpec: data.isEditSpec,\n };\n });\n } else if (data.specType === 1) {\n const unitData = data.specMultiple.filter(\n (item) => item.isMaster === 4\n );\n branchUnit = (unitData || []).map((item) => {\n return {\n conversion: item.conversion,\n id: item.id,\n isMaster: item.isMaster,\n unitId: item.unitId,\n unitName: item.unitName,\n isEditSpec: item.isEditSpec,\n };\n });\n }\n this.base_form = {\n ...data,\n masterUnit: masterUnit,\n storage: data.storage,\n delUnitIds: [],\n delSpecSkuIds: [],\n specType: data.specType,\n branchUnit: branchUnit,\n categoryPath: data.categoryPath\n ? data.categoryPath.split(\",\").map((item) => {\n return parseInt(item);\n })\n : [],\n categoryId: data.categoryId,\n assistCategoryId: data.assistCategoryId,\n assistCategoryPath: data.assistCategoryPath || [],\n isEq: data.isEq, // 抄码商品\n isDistribution: data.isDistribution, // 负库存销售\n isShield: data.isShield, // 经营屏蔽\n deliverySupIds: data.deliverySupIds.split(\",\"), // 物流支持 固定值 1 快递 2 自提 传参格式:1,2\n expressType: data.expressType, // 快递运费 1 包邮 2 运费模版 3 固定费用\n expressFee: data.expressFee, // 固定费用\n showExpress: data.showExpress, // 是否展示快递 5展示 4不展示\n ruleId: data.ruleId, // 运费模版id\n };\n // 副分类\n if (data.assistCategoryPath && data.assistCategoryPath.length) {\n this.assist_cate = data.assistCategoryPath.map((item) => {\n return {\n assistCategoryPath: item.split(\",\").map((iteme) => {\n return parseInt(iteme);\n }),\n };\n });\n } else {\n this.assist_cate = [\n {\n assistCategoryPath: [],\n },\n ];\n }\n this.img_list = data.images.map((item) => {\n return {\n name: \"\",\n url: item,\n };\n });\n this.dynamicTags = data.tag.filter((item) => !!item);\n // 多规格数据\n if (parseInt(this.base_form.specType) === 2) {\n this.sku_list = data.specGroup.map((item) => {\n return {\n spec_data_child: this.spec_data.find(\n (itemF) => itemF.id === item.groupSpec.specId\n ).child,\n groupSpecId: item.groupSpec.specId,\n groupSpecName: item.groupSpec.specName,\n self_spec_val: \"\",\n self_spec_input: false,\n params: item.params.map((itemC) => {\n return {\n id: itemC.specValueId,\n specName: itemC.specValueName,\n groupSpecId: item.groupSpec.specId,\n };\n }),\n };\n });\n this.unit_data = data.unitData.map((item) => {\n const specTableData = data.specMultiple\n .filter((itemU) => itemU.unitId === item.unitId)\n .map((itemSP) => {\n return {\n isEditSpec: itemSP.isEditSpec,\n inventory: itemSP.inventory - 0,\n specGroupHash: itemSP.specGroupHash,\n id_D: itemSP.id,\n conversion: itemSP.conversion,\n unitId: itemSP.unitId,\n specName: (itemSP.specGroup || [])\n .map((itemP) => {\n return itemP.specValueName;\n })\n .join(\"_\"),\n id: (itemSP.specGroup || [])\n .map((itemP) => {\n return itemP.specValueId;\n })\n .join(\"_\"),\n groupSpecId: (itemSP.specGroup || [])\n .map((itemP) => {\n return itemP.specId;\n })\n .join(\"_\"),\n groupSpecName: (itemSP.specGroup || [])\n .map((itemP) => {\n return itemP.specName;\n })\n .join(\"_\"),\n specImage: {\n name: \"\",\n url: itemSP.specImage || \"\",\n },\n barCode: itemSP.barCode,\n weight: itemSP.weight,\n isDefault: itemSP.isDefault,\n salePrice: itemSP.salePrice.salePrice,\n enabledLadder: itemSP.salePrice.enabledLadder,\n ladderPrice: itemSP.salePrice.ladderPrice,\n marketPrice: itemSP.salePrice.marketPrice,\n memberPrice: itemSP.memberPrice,\n setNum: itemSP.salePrice.setNum,\n isSale: itemSP.isSale || 5,\n // 客户类型和客户快速调价\n customerTypePrice: [],\n customerTypePriceOpen: false,\n customerPrice: [],\n customerPriceOpen: false,\n };\n });\n return {\n ...item,\n spec_table_Data: specTableData,\n };\n });\n this.tabs_active = this.unit_data[0].unitName;\n } else {\n this.unit_data = data.specMultiple.map((item) => {\n return {\n isEditSpec: item.isEditSpec,\n inventory: item.inventory - 0,\n specGroupHash: item.specGroupHash,\n id_D: item.id,\n isMaster: item.isMaster,\n conversion: item.conversion,\n unitName: item.unitName,\n unitId: item.unitId,\n specImage: {\n name: \"\",\n url: item.specImage || \"\",\n },\n barCode: item.barCode,\n weight: item.weight,\n isDefault: item.isDefault,\n salePrice: item.salePrice.salePrice,\n enabledLadder: item.salePrice.enabledLadder,\n ladderPrice: item.salePrice.ladderPrice,\n marketPrice: item.salePrice.marketPrice,\n memberPrice: item.memberPrice,\n setNum: item.salePrice.setNum,\n isSale: item.isSale || 5,\n // 客户类型和客户快速调价\n customerTypePrice: [],\n customerTypePriceOpen: false,\n customerPrice: [],\n customerPriceOpen: false,\n };\n });\n }\n // 获取指定商品的最后生效的客户调价单数据\n await this.getCustomerPriceByGoodsIds();\n //获取指定商品的最后生效的客户类型调价数据\n await this.getCustomerTypePriceByGoodsIds();\n },\n // 发布商品\n async submitGoods() {\n // console.log(JSON.stringify(this.unit_data))\n // console.log(this.unit_data)\n // return\n this.$refs[\"base_form\"].validate(async (valid) => {\n if (valid) {\n let specGroup = [];\n let specMultiple = [];\n if (this.base_form.specType === 2) {\n // 多规格\n specGroup = this.sku_list.map((item) => {\n return {\n groupSpec: {\n specName: item.groupSpecName,\n specId: item.groupSpecId,\n },\n params: item.params.map((item) => {\n return {\n specValueId: item.id,\n specValueName: item.specName,\n };\n }),\n };\n });\n this.unit_data.forEach((item) => {\n item.spec_table_Data.forEach((itemSP) => {\n let specIdG = (itemSP.id + \"\").split(\"_\");\n let specNameG = itemSP.specName.split(\"_\");\n let groupSpecNameG = itemSP.groupSpecName.split(\"_\");\n let groupSpecIdG = (itemSP.groupSpecId + \"\").split(\"_\");\n let specGroupS = groupSpecIdG.map((itemUU, indexUU) => {\n return {\n specId: groupSpecIdG[indexUU],\n specName: groupSpecNameG[indexUU],\n specValueName: specNameG[indexUU],\n specValueId: specIdG[indexUU],\n };\n });\n let salePriceS = {\n conversion: item.conversion || 0,\n unitName: item.unitName + \"_\" + itemSP.specName,\n unitId: item.unitId,\n isMaster: item.isMaster,\n deleteStatus: itemSP.deleteStatus || 4,\n enabledLadder: itemSP.enabledLadder,\n salePriceAreaType: 1,\n salePrice: itemSP.salePrice,\n ladderPrice: itemSP.ladderPrice,\n marketPrice: itemSP.marketPrice,\n memberPrice: itemSP.memberPrice,\n setNum: itemSP.setNum,\n isSale: itemSP.isSale,\n };\n let customerPrice = [];\n itemSP.customerPrice.forEach((itemP) => {\n if (!item.priceId) {\n customerPrice.push({\n price: itemP.price,\n unitName: itemP.unitName,\n adjPricetag: itemP.adjPricetag,\n customerName: itemP.name,\n customerId: itemP.id,\n ladderPrice: itemP.ladderPrice,\n });\n }\n });\n let customerTypePrice = [];\n itemSP.customerTypePrice.forEach((itemP) => {\n if (!item.priceId) {\n customerTypePrice.push({\n price: itemP.price,\n unitName: itemP.unitName,\n adjPricetag: itemP.adjPricetag,\n customerName: itemP.name,\n customerType: itemP.id,\n ladderPrice: itemP.ladderPrice,\n });\n }\n });\n specMultiple.push({\n unitId: item.unitId,\n unitName: item.unitName,\n isMaster: item.isMaster,\n conversion: item.conversion || 0,\n specImage: itemSP.specImage.url,\n isDefault: itemSP.isDefault,\n barCode: itemSP.barCode,\n weight: itemSP.weight,\n specGroup: specGroupS,\n salePrice: salePriceS,\n customerPrice: customerPrice,\n customerTypePrice: customerTypePrice,\n });\n });\n });\n } else {\n // 单规格\n specMultiple = this.unit_data.map((item) => {\n const salePriceS = {\n conversion: item.conversion || 0,\n unitName: item.unitName,\n unitId: item.unitId,\n isMaster: item.isMaster,\n deleteStatus: item.deleteStatus || 4,\n enabledLadder: item.enabledLadder,\n salePriceAreaType: 1,\n salePrice: item.salePrice,\n ladderPrice: item.ladderPrice,\n marketPrice: item.marketPrice,\n memberPrice: item.memberPrice,\n setNum: item.setNum,\n isSale: item.isSale,\n };\n let customerPrice = [];\n item.customerPrice.forEach((itemP) => {\n if (!itemP.priceId) {\n customerPrice.push({\n price: itemP.price,\n unitName: itemP.unitName,\n adjPricetag: itemP.adjPricetag,\n customerName: itemP.name,\n customerId: itemP.id,\n ladderPrice: itemP.ladderPrice,\n });\n }\n });\n let customerTypePrice = [];\n item.customerTypePrice.forEach((itemP) => {\n if (!itemP.priceId) {\n customerTypePrice.push({\n price: itemP.price,\n adjPricetag: itemP.adjPricetag,\n customerName: itemP.name,\n customerType: itemP.id,\n unitName: itemP.unitName,\n ladderPrice: itemP.ladderPrice,\n });\n }\n });\n return {\n barCode: item.barCode,\n weight: item.weight,\n isDefault: item.isDefault,\n unitId: item.unitId,\n unitName: item.unitName,\n isMaster: item.isMaster,\n conversion: item.conversion || 0,\n specImage: item.specImage.url,\n specGroup: [],\n salePrice: salePriceS,\n customerTypePrice: customerTypePrice,\n customerPrice: customerPrice,\n };\n });\n }\n const isFSale = specMultiple.every(\n (item) => item.salePrice.isSale === 4\n );\n if (isFSale) {\n this.$message.warning(\"至少保留一条规格的销售状态为【启用】\");\n return;\n }\n const unitData = this.$_common.deepClone(this.base_form.branchUnit);\n unitData.unshift(this.base_form.masterUnit);\n const notCustomer = this.customer_list.map((item) => {\n return item.id;\n });\n // 副分类数据组装\n let assistCategoryPath = [];\n let assistCategoryId = [];\n // 过滤只有选择分类的数据\n const assistCate = this.assist_cate.filter(\n (item) => !!item.assistCategoryPath.length\n );\n assistCate.forEach((item) => {\n assistCategoryPath.push(item.assistCategoryPath.join(\",\"));\n assistCategoryId.push(\n item.assistCategoryPath[item.assistCategoryPath.length - 1]\n );\n });\n const params = {\n merchantId: this.base_form.merchantId,\n categoryPath: this.base_form.categoryPath.join(\",\"),\n categoryId: this.base_form.categoryId,\n assistCategoryPath: assistCategoryPath,\n assistCategoryId: assistCategoryId.join(\",\"),\n title: this.base_form.title,\n storage: this.base_form.storage,\n delUnitIds: this.base_form.delUnitIds,\n delSpecSkuIds: this.base_form.delSpecSkuIds,\n specType: this.base_form.specType,\n createUserName: this.userName,\n specGroup: specGroup,\n specMultiple: specMultiple,\n unitData: unitData,\n describe: this.base_form.describe,\n code: this.base_form.code,\n barCode: this.base_form.barCode,\n weight: this.base_form.weight,\n expireTime: this.base_form.expireTime,\n brandId: this.base_form.brandId,\n tag: this.dynamicTags.join(\",\"),\n description: this.base_form.description,\n noSalesShop: \"\",\n images: this.base_form.images,\n enableStatus: this.base_form.enableStatus,\n isEq: this.base_form.isEq, //抄码商品\n isDistribution: this.base_form.isDistribution, //是否负库存销售\n isShield: this.base_form.isShield, //经营屏蔽\n deliverySupIds: this.base_form.deliverySupIds.join(\",\"), // 物流支持 固定值 1 快递 2 自提 传参格式:1,2\n expressType: this.base_form.expressType, // 快递运费 1 包邮 2 运费模版 3 固定费用\n expressFee: this.base_form.expressFee, // 固定费用\n showExpress: this.base_form.showExpress, // 是否展示快递 5展示 4不展示\n ruleId: this.base_form.ruleId, // 运费模版id\n notArea:\n this.base_form.isShield === 5 ? this.base_form.notArea : [], // 经营屏蔽地区\n notCustomerType:\n this.base_form.isShield === 5\n ? this.customer_type_check.join(\",\")\n : \"\", //经营屏蔽 客户类型屏蔽\n notCustomer:\n this.base_form.isShield === 5 ? notCustomer.join(\",\") : \"\", //经营屏蔽 客户屏蔽\n isStore: this.systemType === 3,\n };\n // console.log(params)\n // return\n this.loading = true;\n let target = {};\n try {\n if (this.$route.params.id) {\n target = await editQuickGoods({\n ...params,\n id: this.goods_id,\n basicGoodsId: this.base_form.basicGoodsId,\n });\n } else {\n target = await addBasicAndPublishGoods(params);\n }\n this.loading = false;\n\n this.$message({\n type: \"success\",\n message: \"提交成功\",\n });\n await this.delPauseSave();\n if (this.systemType === 3) {\n await this.$closeCurrentGoEdit(`/goods/sale/MerchantsGoods`);\n } else {\n await this.$closeCurrentGoEdit(`/goods/sale/PublishGoods`);\n }\n } finally {\n this.loading = false;\n }\n }\n });\n },\n // 商品分类选择\n categoryChange(val) {\n this.base_form.categoryId = val[val.length - 1];\n },\n // 商品副分类选择\n categoryAssistChange(val) {\n this.base_form.assistCategoryId = val[val.length - 1];\n },\n // 品牌选择\n brandConfirm(val) {\n if (val.length > 1) {\n this.$message({\n type: \"error\",\n message: \"请选择一个品牌!\",\n });\n return;\n }\n this.base_form.brandName = val[0].title;\n this.base_form.brandId = val[0].id;\n },\n // 计算市场价\n salePriceBlur(index, indexU) {\n if (this.base_form.specType === 1) {\n const target = this.$_common.deepClone(this.unit_data);\n const marketPrice = this.$NP.times(\n target[index].salePrice,\n this.salePriceTimes\n );\n target[index] = {\n ...target[index],\n marketPrice: marketPrice,\n };\n // 当前失去焦点的为主单位\n if (target[index].isMaster === 5) {\n // 单位换算关系存在且这个单位为辅助单位且当前单位未设置过价格\n target.forEach((item) => {\n if (item.conversion && item.isMaster === 4 && !item.salePrice) {\n item.salePrice = this.$NP.times(\n target[index].salePrice,\n item.conversion\n );\n item.marketPrice = this.$NP.times(marketPrice, item.conversion);\n }\n });\n }\n\n this.unit_data = target;\n } else {\n this.unit_data[indexU].spec_table_Data[\n index\n ].marketPrice = this.$NP.times(\n this.unit_data[indexU].spec_table_Data[index].salePrice,\n this.salePriceTimes\n );\n }\n }, // 会员价失去焦点\n memberPriceBlur(index) {\n // 根据比例自动换算 会员价\n if (this.base_form.specType === 1) {\n const target = this.$_common.deepClone(this.unit_data);\n target.forEach((item) => {\n if (item.conversion && item.isMaster === 4) {\n item.memberPrice = this.$NP.times(\n target[index].memberPrice,\n item.conversion\n );\n }\n });\n this.unit_data = target;\n }\n },\n // 规格明细同步数据\n otherSetPrice(row, index) {\n const target = this.$_common.deepClone(this.unit_data);\n target[index].spec_table_Data = target[index].spec_table_Data.map(\n (item) => {\n return {\n ...item,\n marketPrice: row.marketPrice,\n memberPrice: row.memberPrice,\n salePrice: row.salePrice,\n enabledLadder: row.enabledLadder,\n ladderPrice: row.ladderPrice,\n setNum: row.setNum,\n isSale: row.isSale || 5,\n specImage: row.specImage,\n barCode: row.barCode,\n weight: row.weight,\n // 客户类型和客户快速调价\n customerTypePrice: row.customerTypePrice,\n customerTypePriceOpen: row.customerTypePriceOpen,\n customerPrice: row.customerPrice,\n customerPriceOpen: row.customerPriceOpen,\n };\n }\n );\n this.unit_data = target;\n },\n // 规格明细删除\n specDetailDel(row, index) {\n let target = this.$_common.deepClone(this.unit_data);\n if (this.goods_id) {\n if (this.base_form.delSpecSkuIds.indexOf(row.specGroupHash) === -1) {\n this.base_form.delSpecSkuIds.push(row.specGroupHash);\n }\n }\n\n target = target.map((item) => {\n item.spec_table_Data.splice(index, 1);\n return item;\n });\n // target[0].spec_table_Data.splice(index, 1)\n const specNameArr = row.specName.indexOf(\"_\")\n ? row.specName.split(\"_\")\n : row.specName;\n let isFalseVal = \"\";\n for (let i in specNameArr) {\n let itemS = specNameArr[i];\n const isHave = target.some((itemU) => {\n return itemU.spec_table_Data.find(\n (item) => item.specName.indexOf(itemS) > -1\n );\n });\n if (!isHave) {\n isFalseVal = itemS;\n break;\n }\n }\n\n // console.log(\"isStay,\", isFalseVal);\n if (isFalseVal) {\n this.sku_list.forEach((item) => {\n const indexP = item.params.findIndex(\n (itemP) => itemP.specName === isFalseVal\n );\n if (indexP > -1) {\n item.params.splice(indexP, 1);\n }\n });\n }\n this.unit_data = target;\n },\n\n // 选择商铺\n selChose(val, row) {\n this.base_form.shopId = row[0].id;\n this.base_form.shopName = row[0].name;\n },\n // 地区选择\n selRegion(row) {\n this.base_form.notArea = row.map((item) => {\n return item.codePath;\n });\n },\n // 获取客户类型\n async getAllCustomerSource() {\n const data = await getAllCustomerSource({\n page: 1,\n pageSize: 50,\n });\n\n this.customer_type_list = data.data;\n },\n // 选择客户\n customerSel(val) {\n this.customer_list = val;\n },\n // 删除客户\n deleteCustomer(index) {\n this.customer_list.splice(index, 1);\n },\n // 打开指定价弹窗\n openModal(index, key, row, indexU) {\n // 获取阶梯价数据,做阶梯价调价\n if (row) {\n this.unitisMaster = row.isMaster;\n this.sku_id = row.id;\n this.ladderPrice = row.ladderPrice;\n this.enabledLadder = row.enabledLadder;\n if (key === \"type_price_show\") {\n // 客户类型指定价调价数据\n this.customerTypePriceOpen = row.customerTypePriceOpen;\n this.customerTypePrice = row.customerTypePrice;\n }\n if (key === \"appoint_price_show\") {\n // 客户指定价调价数据\n this.customerPriceOpen = row.customerPriceOpen;\n this.customerPrice = row.customerPrice;\n }\n }\n this.sku_index = index;\n if (indexU > -1) {\n this.unit_index = indexU;\n }\n this[key] = true;\n },\n // 指定价数据确定\n appointPriceConfirm(customerPriceOpen, customerPrice) {\n console.log(customerPrice);\n if (this.base_form.specType === 1) {\n // 单规格\n const target = this.$_common.deepClone(this.unit_data);\n target[this.sku_index].customerPriceOpen = customerPriceOpen;\n target[this.sku_index].customerPrice = customerPriceOpen\n ? customerPrice\n : [];\n this.unit_data = target;\n } else {\n // 多规格\n const target = this.$_common.deepClone(this.unit_data);\n target[this.unit_index].spec_table_Data[\n this.sku_index\n ].customerPriceOpen = customerPriceOpen;\n target[this.unit_index].spec_table_Data[\n this.sku_index\n ].customerPrice = customerPriceOpen ? customerPrice : [];\n this.unit_data = target;\n }\n },\n // 指定价数据取消\n appointPriceCancel() {\n this.appoint_price_show = false;\n },\n typePriceConfirm(customerTypePriceOpen, customerTypePrice) {\n if (this.base_form.specType === 1) {\n // 单规格\n const target = this.$_common.deepClone(this.unit_data);\n target[this.sku_index].customerTypePriceOpen = customerTypePriceOpen;\n target[this.sku_index].customerTypePrice = customerTypePriceOpen\n ? customerTypePrice\n : [];\n this.unit_data = target;\n } else {\n // 多规格\n const target = this.$_common.deepClone(this.unit_data);\n target[this.unit_index].spec_table_Data[\n this.sku_index\n ].customerTypePriceOpen = customerTypePriceOpen;\n target[this.unit_index].spec_table_Data[\n this.sku_index\n ].customerTypePrice = customerTypePriceOpen ? customerTypePrice : [];\n this.unit_data = target;\n }\n },\n typePriceCancel() {\n this.type_price_show = false;\n },\n // 阶梯价设置\n ladderPriceConfirm(enabledLadder, ladderPrice) {\n if (this.base_form.specType === 1) {\n // 单规格\n const target = this.$_common.deepClone(this.unit_data);\n if (this.base_form.isEq === 5) {\n // 抄码商品根据比例自动换算销售价\n target.forEach((item) => {\n item.enabledLadder = enabledLadder;\n if (enabledLadder) {\n if (item.conversion && item.isMaster === 4) {\n item.ladderPrice = ladderPrice.map((ladder) => {\n return {\n ...ladder,\n price: this.$NP.times(ladder.price, item.conversion),\n };\n });\n } else {\n item.ladderPrice = ladderPrice;\n }\n } else {\n item.ladderPrice = [];\n }\n });\n } else {\n target[this.sku_index].enabledLadder = enabledLadder;\n target[this.sku_index].ladderPrice = enabledLadder\n ? ladderPrice\n : [];\n }\n this.unit_data = target;\n } else {\n // 多规格\n const target = this.$_common.deepClone(this.unit_data);\n target[this.unit_index].spec_table_Data[\n this.sku_index\n ].enabledLadder = enabledLadder;\n target[this.unit_index].spec_table_Data[\n this.sku_index\n ].ladderPrice = enabledLadder ? ladderPrice : [];\n this.unit_data = target;\n }\n },\n ladderPriceCancel() {\n this.ladder_price_show = false;\n },\n // 客户调价单\n async CustomerPriceAdjustmentAdd(params) {\n if (!params.length) return;\n const { data } = await CustomerPriceAdjustmentAdd(params);\n },\n // 客户类型调价单\n async addCustomerTypePriceAdjustment(params) {\n if (!params.length) return;\n const { data } = await addCustomerTypePriceAdjustment(params);\n },\n // 商品分类列表\n async getAllCategoryPost() {\n const { data } = await getAllCategoryPost({\n enableStatus: 5,\n });\n\n if (JSON.stringify(data) === \"{}\") {\n this.category_data = [];\n } else {\n this.category_data = data;\n }\n },\n // 自定义选择即改变\n clickChange(event) {\n event.target.parentElement.parentElement.firstChild.click();\n },\n delAssistCate(index) {\n this.assist_cate.splice(index, 1);\n },\n addAssistCate() {\n this.assist_cate.push({\n assistCategoryPath: [],\n });\n },\n // 获取商户列表\n async getAllMerchantList() {\n const { data } = await getAllMerchantList();\n this.sel_cities = data;\n },\n // 抄码商品切换\n isEqChange(val) {\n if (this.isEditSpec !== 4 && val === 5) {\n this.base_form.masterUnit = {\n isDefault: 5,\n isMaster: 5,\n weight: \"\",\n unitName: \"\",\n unitId: \"\",\n barCode: \"\",\n };\n this.base_form.branchUnit = [];\n this.unit_data = [];\n }\n },\n // 获取指定商品的最后生效的客户调价单数据\n async getCustomerPriceByGoodsIds() {\n const { data, pageTotal } = await getCustomerPriceByGoodsIds({\n goodsId: this.goods_id,\n page: 1,\n pageSize: 200,\n });\n this.customerPrice = data;\n },\n // 获取指定商品的最后生效的客户类型调价数据\n async getCustomerTypePriceByGoodsIds() {\n const { data } = await getCustomerTypePriceByGoodsIds({\n goodsId: this.goods_id,\n page: 1,\n pageSize: 20,\n });\n this.customerTypePrice = data;\n this.adjustmentData();\n },\n adjustmentData() {\n if (this.base_form.specType === 1) {\n this.unit_data = this.unit_data.map((item) => {\n //客户类型价\n let customerTypePrice = [];\n this.customerTypePrice.forEach((type) => {\n if (type.salePrice && type.salePrice.length) {\n type.salePrice.forEach((pitem) => {\n if (parseInt(pitem.skuId) === item.id_D) {\n customerTypePrice.push({\n adjPricetag: pitem.adjPricetag,\n ladderPrice: pitem.ladderPrice || [],\n price: pitem.price,\n name: type.customerTypeName,\n id: type.customerType,\n priceId: type.id,\n });\n }\n });\n }\n });\n //客户价\n let customerPrice = [];\n this.customerPrice.forEach((type) => {\n if (type.salePrice && type.salePrice.length) {\n type.salePrice.forEach((pitem) => {\n if (parseInt(pitem.skuId) === item.id_D) {\n customerPrice.push({\n adjPricetag: pitem.adjPricetag,\n ladderPrice: pitem.ladderPrice || [],\n price: pitem.price,\n name: type.customerName,\n id: type.customerId,\n priceId: type.id,\n });\n }\n });\n }\n });\n return {\n ...item,\n // 客户类型和客户快速调价\n customerTypePrice: customerTypePrice,\n customerTypePriceOpen: customerTypePrice.length > 0,\n customerPrice: customerPrice,\n customerPriceOpen: customerPrice.length > 0,\n };\n });\n } else {\n this.unit_data = this.unit_data.map((itemU) => {\n return {\n ...itemU,\n spec_table_Data: itemU.spec_table_Data.map((item) => {\n //客户类型价\n let customerTypePrice = [];\n this.customerTypePrice.forEach((type) => {\n if (type.salePrice && type.salePrice.length) {\n type.salePrice.forEach((pitem) => {\n if (parseInt(pitem.skuId) === item.id_D) {\n customerTypePrice.push({\n adjPricetag: pitem.adjPricetag,\n ladderPrice: pitem.ladderPrice || [],\n price: pitem.price,\n name: type.customerTypeName,\n id: type.customerType,\n priceId: type.id,\n });\n }\n });\n }\n });\n //客户价\n let customerPrice = [];\n this.customerPrice.forEach((type) => {\n if (type.salePrice && type.salePrice.length) {\n type.salePrice.forEach((pitem) => {\n if (parseInt(pitem.skuId) === item.id_D) {\n customerPrice.push({\n adjPricetag: pitem.adjPricetag,\n ladderPrice: pitem.ladderPrice || [],\n price: pitem.price,\n name: type.customerName,\n id: type.customerId,\n priceId: type.id,\n });\n }\n });\n }\n });\n return {\n ...item,\n customerTypePrice: customerTypePrice,\n customerTypePriceOpen: customerTypePrice.length > 0,\n customerPrice: customerPrice,\n customerPriceOpen: customerPrice.length > 0,\n };\n }),\n };\n });\n }\n console.log(\" this.unit_data:\", this.unit_data);\n },\n },\n };\n</script>\n<style scoped>\n .sku-name-item {\n background-color: #f4f4f4;\n padding: 5px 0;\n }\n</style>\n"]}]}