e5c3d1a7438851c0be2b58925ea4c420.json 100 KB

1
  1. {"remainingRequest":"D:\\test\\ssi-satoken\\ui\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\test\\ssi-satoken\\ui\\src\\views\\sysManager\\userManager\\index.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\test\\ssi-satoken\\ui\\src\\views\\sysManager\\userManager\\index.vue","mtime":1696909835000},{"path":"D:\\test\\ssi-satoken\\ui\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1697005520931},{"path":"D:\\test\\ssi-satoken\\ui\\node_modules\\babel-loader\\lib\\index.js","mtime":1697005523218},{"path":"D:\\test\\ssi-satoken\\ui\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1697005520931},{"path":"D:\\test\\ssi-satoken\\ui\\node_modules\\vue-loader\\lib\\index.js","mtime":1697005524089}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQge2RlYm91bmNlfSBmcm9tICdsb2Rhc2gnDQppbXBvcnQge3VzZXJpbmZvRGVjcnlwdH0gZnJvbSAiQC91dGlscy9zbXV0aWwiOw0KDQpleHBvcnQgZGVmYXVsdCB7DQogIG5hbWU6ICJVc2VyIiwNCiAgZGF0YSgpIHsNCiAgICByZXR1cm4gew0KICAgICAgcGlja2VyT3B0aW9uczp7DQogICAgICAgIGRpc2FibGVkRGF0ZSh0aW1lKXsNCiAgICAgICAgICByZXR1cm4gdGltZS5nZXRUaW1lKCk8RGF0ZS5ub3coKS04LjY0ZTcNCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgIHN5c1JvbGU6JycsDQogICAgICBpZDogdW5kZWZpbmVkLA0KICAgICAgdXNlcm5hbWU6IHVuZGVmaW5lZCwNCiAgICAgIG5pY2tuYW1lOiB1bmRlZmluZWQsDQogICAgICBpZGNhcmQ6IHVuZGVmaW5lZCwNCiAgICAgIHBob25lbnVtYmVyOiB1bmRlZmluZWQsDQogICAgICBtYWlsYm94OiB1bmRlZmluZWQsDQogICAgICBzdGF0dXM6ICIwIiwNCiAgICAgIHVzZXJ0eXBlOiAiMCIsDQogICAgICByZW1hcms6IHVuZGVmaW5lZCwNCiAgICAgIGV4cERhdGU6IHVuZGVmaW5lZCwNCiAgICAgIC8vIOinkuiJsuihqOagvOaVsOaNrg0KICAgICAganN1c2VyaWQ6ICcnLA0KICAgICAgcm9sZUxpc3Q6IFtdLA0KICAgICAganN1c2VybmFtZTogJycsDQogICAgICBqc25pY2tuYW1lOiAnJywNCiAgICAgIHVzZXJSb2xlSWQ6ICcnLA0KICAgICAganN1c2VydHlwZTogJycsDQogICAgICBzdGF0dXNPcHRpb25zOiBbDQogICAgICAgIHt2YWx1ZTogJzAnLCBsYWJlbDogJ+ato+W4uCd9LA0KICAgICAgICB7dmFsdWU6ICcxJywgbGFiZWw6ICfplIHlrponfSwNCiAgICAgICAge3ZhbHVlOiAnMicsIGxhYmVsOiAn5rOo6ZSAJ30NCiAgICAgIF0sDQogICAgICB0eXBlT3B0aW9uczogWw0KICAgICAgICB7dmFsdWU6ICcwJywgbGFiZWw6ICfnrqHnkIblkZgnfSwNCiAgICAgICAge3ZhbHVlOiAnMScsIGxhYmVsOiAn5Lia5Yqh55So5oi3J30NCiAgICAgIF0sDQogICAgICAvLyDpga7nvanlsYINCiAgICAgIGxvYWRpbmc6IHRydWUsDQogICAgICBzaG93VGFibGU6IHRydWUsDQogICAgICAvLyDpgInkuK3mlbDnu4QNCiAgICAgIGlkczogW10sDQogICAgICAvLyDpnZ7ljZXkuKrnpoHnlKgNCiAgICAgIHNpbmdsZTogdHJ1ZSwNCiAgICAgIC8vIOmdnuWkmuS4quemgeeUqA0KICAgICAgbXVsdGlwbGU6IHRydWUsDQogICAgICBjdXJyZW50UGFnZTogMSwNCiAgICAgIHBhZ2VTaXplOiAxMCwNCiAgICAgIC8vIOaAu+adoeaVsA0KICAgICAgdG90YWw6IDAsDQogICAgICAvLyDnlKjmiLfooajmoLzmlbDmja4NCiAgICAgIHVzZXJMaXN0OiBbXSwNCiAgICAgIGxvY2t0aXRsZToi6Ym05Yir5pON5L2cIiwNCiAgICAgIC8vIOW8ueWHuuWxguagh+mimA0KICAgICAgdGl0bGU6ICIiLA0KICAgICAgLy8g6KeS6Imy5YiG6YWN5by55Ye65bGC5qCH6aKYDQogICAgICBqc3RpdGxlOiAiIiwNCiAgICAgIC8vIOaYr+WQpuaYvuekuuW8ueWHuuWxgg0KICAgICAgb3BlbjogZmFsc2UsDQogICAgICBsb2Nrb3BlbjpmYWxzZSwNCiAgICAgIC8vIOinkuiJsuaYr+WQpuaYvuekuuW8ueWHuuWxgg0KICAgICAganNvcGVuOiBmYWxzZSwNCiAgICAgIC8vIOm7mOiupOWvhueggQ0KICAgICAgaW5pdFBhc3N3b3JkOiB1bmRlZmluZWQsDQogICAgICAvLyDop5LoibLpgInpobkNCiAgICAgIHJvbGVPcHRpb25zOiBbXSwNCiAgICAgIC8vIOihqOWNleWPguaVsA0KICAgICAgZm9ybToge30sDQogICAgICBsb2NrZm9ybTp7fSwNCiAgICAgIC8vIOafpeivouWPguaVsA0KICAgICAgcXVlcnlQYXJhbXM6IHsNCiAgICAgICAgdXNlcm5hbWU6IHVuZGVmaW5lZCwNCiAgICAgICAgcGhvbmVudW1iZXI6IHVuZGVmaW5lZCwNCiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQNCiAgICAgIH0sDQogICAgICBtZW51RXhwYW5kOiBmYWxzZSwNCiAgICAgIC8vIOiPnOWNleWIl+ihqA0KICAgICAgbWVudU9wdGlvbnM6IFtdLA0KICAgICAgZGVmYXVsdFByb3BzOiB7DQogICAgICAgIGNoaWxkcmVuOiAiY2hpbGRyZW4iLA0KICAgICAgICBsYWJlbDogImxhYmVsIg0KICAgICAgfSwNCiAgICAgIGVkaXQ6IGZhbHNlLA0KICAgICAgLy8g6KGo5Y2V5qCh6aqMDQogICAgICBydWxlczogew0KICAgICAgICB1c2VybmFtZTogWw0KICAgICAgICAgIHtyZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogIueUqOaIt+i0puWPt+S4jeiDveS4uuepuiIsIHRyaWdnZXI6ICJibHVyIn0sDQogICAgICAgICAge21pbjogNSwgbWF4OiAyMCwgbWVzc2FnZTogJ+eUqOaIt+i0puWPt+mVv+W6puW/hemhu+S7i+S6jiA1IOWSjCAyMCDkuYvpl7QnLCB0cmlnZ2VyOiAnYmx1cid9DQogICAgICAgIF0sDQogICAgICAgIG5pY2tuYW1lOiBbDQogICAgICAgICAge3JlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAi55So5oi35aeT5ZCN5LiN6IO95Li656m6IiwgdHJpZ2dlcjogImJsdXIifSwNCiAgICAgICAgICB7bWluOiAyLCBtYXg6IDMwLCBtZXNzYWdlOiAn55So5oi35aeT5ZCN6ZW/5bqm5b+F6aG75LuL5LqOIDIg5ZKMIDMwIOS5i+mXtCcsIHRyaWdnZXI6ICdibHVyJ30NCiAgICAgICAgXSwNCiAgICAgICAgaWRjYXJkOiBbDQogICAgICAgICAge3JlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAi6Lqr5Lu96K+B5Y+356CB5LiN6IO95Li656m6IiwgdHJpZ2dlcjogImJsdXIifSwNCiAgICAgICAgICB7bWluOiAxNSwgbWF4OiAxOCwgbWVzc2FnZTogJ+i6q+S7veivgeWPt+ivt+i+k+WFpTE15L2N5oiW6ICFMTjkvY0nLCB0cmlnZ2VyOiAnYmx1cid9DQogICAgICAgIF0sDQogICAgICAgIG1haWxib3g6IFsNCiAgICAgICAgICB7cmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICLpgq7nrrHkuI3og73kuLrnqboiLCB0cmlnZ2VyOiAiYmx1ciJ9LA0KICAgICAgICAgIHt0eXBlOiAiZW1haWwiLCBtZXNzYWdlOiAi6K+36L6T5YWl5q2j56Gu55qE6YKu566x5Zyw5Z2AIiwgdHJpZ2dlcjogWyJibHVyIiwgImNoYW5nZSJdfQ0KICAgICAgICBdLA0KICAgICAgICBwaG9uZW51bWJlcjogWw0KICAgICAgICAgIHtyZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogIuaJi+acuuWPt+eggeS4jeiDveS4uuepuiIsIHRyaWdnZXI6ICJibHVyIn0sDQogICAgICAgICAge3BhdHRlcm46IC9eMVszfDR8NXw2fDd8OHw5XVswLTldXGR7OH0kLywgbWVzc2FnZTogIuivt+i+k+WFpeato+ehrueahOaJi+acuuWPt+eggSIsIHRyaWdnZXI6ICJibHVyIn0NCiAgICAgICAgXQ0KICAgICAgfQ0KICAgIH07DQogIH0sDQogIHdhdGNoOiB7fSwNCiAgY3JlYXRlZCgpIHsNCiAgICB0aGlzLmdldExpc3QoKQ0KICAgIHRoaXMuZ2V0VXNlckJ5Um9sZSgpDQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICBhc3luYyBnZXRVc2VyQnlSb2xlKCl7DQogICAgICAvLyDojrflj5blvZPliY3nlKjmiLfnmoTop5LoibINCiAgICAgIGxldCBzeXNUaW1lMg0KICAgICAgbGV0IGxrMg0KICAgICAgYXdhaXQgdGhpcy4kYXhpb3MuZ2V0KCcvc3lzUG9saWN5Q29udHJvbGxlci9nZXRMaWNlbnNlS2V5JykudGhlbigocmVzKSA9PiB7DQogICAgICAgIHN5c1RpbWUyID0gcmVzLmRhdGEuc3lzVGltZQ0KICAgICAgICBsazIgPSByZXMuZGF0YS5saw0KICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICB9KQ0KICAgICAgdmFyIHNlYXJjaFBhcmFtczIgPSB7DQogICAgICAgIHN5c1RpbWU6IHN5c1RpbWUyLA0KICAgICAgICBsazogbGsyDQogICAgICB9DQogICAgICBhd2FpdCB0aGlzLiRheGlvcy5nZXQoJy9zeXNSb2xlQ29udHJvbGxlci9nZXRVc2VyQnlSb2xlJywge3BhcmFtczogc2VhcmNoUGFyYW1zMn0pLnRoZW4oKHJlcykgPT4gew0KICAgICAgICB0aGlzLnN5c1JvbGUgPSByZXMuZGF0YQ0KICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICB9KQ0KICAgIH0sDQogICAgLy8g5qCR5p2D6ZmQ77yI5bGV5byAL+aKmOWPoO+8iQ0KICAgIGhhbmRsZUNoZWNrZWRUcmVlRXhwYW5kKHZhbHVlLCB0eXBlKSB7DQogICAgICBpZiAodHlwZSA9PSAnbWVudScpIHsNCiAgICAgICAgbGV0IHRyZWVMaXN0ID0gdGhpcy5tZW51T3B0aW9uczsNCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmVlTGlzdC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIHRoaXMuJHJlZnMubWVudS5zdG9yZS5ub2Rlc01hcFt0cmVlTGlzdFtpXS5pZF0uZXhwYW5kZWQgPSB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQoNCiAgICBzZXRSb3dDbGFzcyh7cm93LCByb3dJbmRleH0pew0KICAgICAgaWYocm93LnNpZ25zdHIgPT09ICcxJyl7DQogICAgICAgIHJldHVybiAiYmFja2dyb3VuZDogI0ZGRUZENSI7DQogICAgICB9DQogICAgfSwNCiAgICAvLyDms6jplIDmk43kvZwNCiAgICBoYW5kbGVMb2dPZmYoKXsNCiAgICAgIGxldCBfc2VsZWN0RGF0YSA9IHRoaXMuJHJlZnMudXNlclRhYmxlLmdldFJhZGlvUmVjb3JkKHRydWUpDQogICAgICBpZiAoX3NlbGVjdERhdGEgPT0gbnVsbCkgew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnd2FybmluZycsDQogICAgICAgICAgbWVzc2FnZTogJ+ivt+mAieaLqeiusOW9lSEnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGlmIChfc2VsZWN0RGF0YS5pZCA9PSAxKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywNCiAgICAgICAgICBtZXNzYWdlOiAn5YaF572u57O757uf566h55CG5ZGY55So5oi35LiN6IO95rOo6ZSAIScNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgaWYgKF9zZWxlY3REYXRhLmlkID09IDIpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflhoXnva7lrqHorqHnrqHnkIblkZjnlKjmiLfkuI3og73ms6jplIAhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBpZiAoX3NlbGVjdERhdGEuaWQgPT0gMjQpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflhoXnva7lrqHmoLjnrqHnkIblkZjnlKjmiLfkuI3og73ms6jplIAhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBpZiAoX3NlbGVjdERhdGEuc3RhdHVzID09IDIpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflt7Lms6jplIDnmoTotKblj7fkuI3og73lho3mrKHms6jplIAhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBpZiAoX3NlbGVjdERhdGEuc2lnbnN0ciA9PSAnMScpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflrZjlnKjlvoXlrqHmoLjvvIzlrqHmoLjnrqHnkIblkZjlrqHmoLjlkI7or7fliLfmlrDliJfooagnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIHRoaXMuJHByb21wdCgn6K+36L6T5YWl55m75b2V5a+G56CBJywgJ+mJtOWIq+aTjeS9nCcsIHsNCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLA0KICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywNCiAgICAgICAgaW5wdXRUeXBlOiAncGFzc3dvcmQnLA0KICAgICAgICAvLyBjdXN0b21DbGFzczonbm8tYXV0b2ZpbGwtcHdkJywNCiAgICAgICAgaW5wdXRWYWxpZGF0b3I6ICh2YWwpID0+IHsNCiAgICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbC5sZW5ndGggPCAxIHx8IHZhbC5sZW5ndGggPiAyMCkgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgaW5wdXRFcnJvck1lc3NhZ2U6ICfkuI3og73kuLrnqbos5pyA5aSa5Y+v5b2V5YWlMjDkuKrlrZfnrKYnLA0KICAgICAgICBiZWZvcmVDbG9zZShhY3Rpb24sIGluc3RhbmNlLCBkb25lKSB7DQogICAgICAgICAgaWYgKGFjdGlvbiA9PT0gImNvbmZpcm0iKSB7DQogICAgICAgICAgICBpbnN0YW5jZS4kcmVmc1siY29uZmlybSJdLiRlbC5vbmNsaWNrID0gKGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDsNCiAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsICE9IDApIHsNCiAgICAgICAgICAgICAgICBkb25lKCk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGRvbmUoKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pLnRoZW4oYXN5bmMgKHt2YWx1ZX0pID0+IHsNCiAgICAgICAgdGhpcy5kb0xvZ29mZihfc2VsZWN0RGF0YSwgdmFsdWUpDQogICAgICB9KS5jYXRjaCgoZSkgPT4gew0KICAgICAgfSkNCiAgICB9LA0KICAgIC8qKg0KICAgICAqIOazqOmUgOaPkOS6pA0KICAgICAqLw0KICAgIGRvTG9nb2ZmOiBkZWJvdW5jZShhc3luYyBmdW5jdGlvbiAoX3NlbGVjdERhdGEsIGFnYWluUHdkKSB7DQogICAgICBsZXQgc3lzVGltZQ0KICAgICAgbGV0IGxrDQogICAgICBhd2FpdCB0aGlzLiRheGlvcy5nZXQoJy9zeXNQb2xpY3lDb250cm9sbGVyL2dldExpY2Vuc2VLZXknKS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgc3lzVGltZSA9IHJlcy5kYXRhLnN5c1RpbWUNCiAgICAgICAgbGsgPSByZXMuZGF0YS5saw0KICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICB9KQ0KDQogICAgICBjb25zdCBwYXJhbSA9IHsNCiAgICAgICAgaWQ6IF9zZWxlY3REYXRhLmlkLA0KICAgICAgICBhZ2FpblB3ZDogYWdhaW5Qd2QsDQogICAgICAgIHN5c1RpbWU6IHN5c1RpbWUsDQogICAgICAgIGxrOiBsaw0KICAgICAgfQ0KICAgICAgYXdhaXQgdGhpcy4kYXhpb3MucG9zdCgnL3N5c1VzZXJDb250cm9sbGVyL2xvZ09mZlVzZXInLCBwYXJhbSkudGhlbigocmVzKSA9PiB7DQogICAgICAgIGlmIChyZXMuY29kZSA9PSAwKSB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsDQogICAgICAgICAgICBtZXNzYWdlOiByZXMuZGF0YQ0KICAgICAgICAgIH0pOw0KICAgICAgICAgIHRoaXMuZ2V0TGlzdCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgdHlwZTogJ2Vycm9yJywNCiAgICAgICAgICAgIG1lc3NhZ2U6IHJlcy5kYXRhDQogICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnZXJyb3InLA0KICAgICAgICAgIG1lc3NhZ2U6ICfliKDpmaTlpLHotKUhJw0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pDQogICAgfSwgNTAwKSwNCiAgICAvLyDliJfooajnirbmgIHmoLzlvI/ljJYNCiAgICBzdGF0dXNGb3JtYXQoe2NlbGxWYWx1ZX0pIHsNCiAgICAgIGxldCBiZWxvbmdUbyA9ICfmnKrnn6XnmoTnsbvlnosnDQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhdHVzT3B0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICBpZiAoY2VsbFZhbHVlID09ICIwIikgew0KICAgICAgICAgIGJlbG9uZ1RvID0gIuato+W4uCINCiAgICAgICAgfSBlbHNlIGlmIChjZWxsVmFsdWUgPT0gIjEiKSB7DQogICAgICAgICAgYmVsb25nVG8gPSAi6ZSB5a6aIg0KICAgICAgICB9IGVsc2UgaWYgKGNlbGxWYWx1ZSA9PSAiMiIpIHsNCiAgICAgICAgICBiZWxvbmdUbyA9ICLms6jplIAiDQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBiZWxvbmdUbw0KICAgIH0sDQogICAgLy8g5YiX6KGo54q25oCB5qC85byP5YyWDQogICAgc2ZzaCh7Y2VsbFZhbHVlfSkgew0KICAgICAgbGV0IGJlbG9uZ1RvID0gJ+WQpicNCiAgICAgIGlmIChjZWxsVmFsdWUgPT0gIjEiKSB7DQogICAgICAgIGJlbG9uZ1RvID0gIuaYryINCiAgICAgIH0NCiAgICAgIHJldHVybiBiZWxvbmdUbw0KICAgIH0sDQogICAgLy8g5YiX6KGo54q25oCB5qC85byP5YyWDQogICAgdHlwZUZvcm1hdCh7Y2VsbFZhbHVlfSkgew0KICAgICAgbGV0IGJlbG9uZ1RvID0gJ+acquefpeeahOexu+WeiycNCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50eXBlT3B0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICBpZiAoY2VsbFZhbHVlID09ICIwIikgew0KICAgICAgICAgIGJlbG9uZ1RvID0gIueuoeeQhuWRmCINCiAgICAgICAgfSBlbHNlIGlmIChjZWxsVmFsdWUgPT0gIjEiKSB7DQogICAgICAgICAgYmVsb25nVG8gPSAi5Lia5Yqh55So5oi3Ig0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gYmVsb25nVG8NCiAgICB9LA0KICAgIC8qKiDmkJzntKLmjInpkq7mk43kvZwgKi8NCiAgICBoYW5kbGVRdWVyeTogZGVib3VuY2UoZnVuY3Rpb24gKCkgew0KICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDENCiAgICAgIHRoaXMucGFnZVNpemUgPSAxMA0KICAgICAgdGhpcy5nZXRMaXN0KCkNCiAgICB9LCAxMDAwKSwNCiAgICAvKiog5p+l6K+i55So5oi35YiX6KGoICovDQogICAgYXN5bmMgZ2V0TGlzdCgpIHsNCiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7DQogICAgICBsZXQgc3lzVGltZQ0KICAgICAgbGV0IGxrDQogICAgICBhd2FpdCB0aGlzLiRheGlvcy5nZXQoJy9zeXNQb2xpY3lDb250cm9sbGVyL2dldExpY2Vuc2VLZXknKS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgc3lzVGltZSA9IHJlcy5kYXRhLnN5c1RpbWUNCiAgICAgICAgbGsgPSByZXMuZGF0YS5saw0KICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOw0KICAgICAgfSkNCg0KICAgICAgdmFyIHNlYXJjaFBhcmFtcyA9IHsNCiAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsDQogICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLA0KICAgICAgICB1c2VybmFtZTogdGhpcy5xdWVyeVBhcmFtcy51c2VybmFtZSwNCiAgICAgICAgcGhvbmVudW1iZXI6IHRoaXMucXVlcnlQYXJhbXMucGhvbmVudW1iZXIsDQogICAgICAgIHN0YXR1czogdGhpcy5xdWVyeVBhcmFtcy5zdGF0dXMsDQogICAgICAgIHN5c1RpbWU6IHN5c1RpbWUsDQogICAgICAgIGxrOiBsaw0KICAgICAgfQ0KICAgICAgYXdhaXQgdGhpcy4kYXhpb3MuZ2V0KCcvc3lzVXNlckNvbnRyb2xsZXIvZ2V0QWxsJywNCiAgICAgICAge3BhcmFtczogc2VhcmNoUGFyYW1zfSkudGhlbigocmVzKSA9PiB7DQogICAgICAgIHRoaXMudXNlckxpc3QgPSByZXMuZGF0YQ0KICAgICAgICB0aGlzLnRvdGFsID0gcmVzLmRhdGEubGVuZ3RoDQoNCiAgICAgICAgaWYgKHJlcy5kYXRhLnJlY29yZHMgPT0gJycpIHsNCiAgICAgICAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpcy5zaG93VGFibGUgPSB0cnVlDQogICAgICAgIH0NCiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gew0KICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsNCiAgICAgICAgLy8gdGhpcy4kbWVzc2FnZS5lcnJvcihlcnJvcikNCiAgICAgIH0pDQogICAgfSwNCiAgICAvLyDnlKjmiLfnirbmgIHkv67mlLkNCiAgICBoYW5kbGVTdGF0dXNDaGFuZ2Uocm93KSB7DQogICAgICBsZXQgdGV4dCA9IHJvdy5zdGF0dXMgPT09ICIwIiA/ICLlkK/nlKgiIDogIuWBnOeUqCI7DQogICAgICB0aGlzLiRtb2RhbC5jb25maXJtKCfnoa7orqTopoEiJyArIHRleHQgKyAnIiInICsgcm93LnVzZXJOYW1lICsgJyLnlKjmiLflkJfvvJ8nKS50aGVuKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgcmV0dXJuIGNoYW5nZVVzZXJTdGF0dXMocm93LnVzZXJJZCwgcm93LnN0YXR1cyk7DQogICAgICB9KS50aGVuKCgpID0+IHsNCiAgICAgICAgdGhpcy4kbW9kYWwubXNnU3VjY2Vzcyh0ZXh0ICsgIuaIkOWKnyIpOw0KICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgew0KICAgICAgICByb3cuc3RhdHVzID0gcm93LnN0YXR1cyA9PT0gIjAiID8gIjEiIDogIjAiOw0KICAgICAgfSk7DQogICAgfSwNCiAgICAvLyDlj5bmtojmjInpkq4NCiAgICBjYW5jZWwoKSB7DQogICAgICB0aGlzLmdldExpc3QoKQ0KICAgICAgdGhpcy5vcGVuID0gZmFsc2U7DQogICAgICB0aGlzLnJlc2V0KCk7DQogICAgfSwNCiAgICAvLyDop5LoibLlj5bmtojmjInpkq4NCiAgICBqc2NhbmNlbCgpIHsNCiAgICAgIHRoaXMuanNvcGVuID0gZmFsc2U7DQogICAgICB0aGlzLnVzZXJSb2xlSWQgPSAnJw0KICAgICAgdGhpcy5tZW51T3B0aW9ucz1bXQ0KICAgIH0sDQogICAgLy8g6KGo5Y2V6YeN572uDQogICAgcmVzZXQoKSB7DQogICAgICB0aGlzLmVkaXQgPSBmYWxzZTsNCiAgICAgIHRoaXMuZm9ybSA9IHsNCiAgICAgICAgaWQ6IHVuZGVmaW5lZCwNCiAgICAgICAgdXNlcm5hbWU6IHVuZGVmaW5lZCwNCiAgICAgICAgbmlja25hbWU6IHVuZGVmaW5lZCwNCiAgICAgICAgaWRjYXJkOiB1bmRlZmluZWQsDQogICAgICAgIHBob25lbnVtYmVyOiB1bmRlZmluZWQsDQogICAgICAgIG1haWxib3g6IHVuZGVmaW5lZCwNCiAgICAgICAgc3RhdHVzOiAiMCIsDQogICAgICAgIHVzZXJ0eXBlOiAiMCIsDQogICAgICAgIHJlbWFyazogdW5kZWZpbmVkLA0KICAgICAgICBleHBEYXRlOiB1bmRlZmluZWQNCiAgICAgIH07DQoNCiAgICAgIGlmICh0aGlzLiRyZWZzWyJmb3JtIl0pIHsNCiAgICAgICAgdGhpcy4kcmVmc1siZm9ybSJdLmNsZWFyVmFsaWRhdGUoKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8qKiDph43nva7mjInpkq7mk43kvZwgKi8NCiAgICByZXNldFF1ZXJ5KCkgew0KICAgICAgdGhpcy5yZXNldEZvcm0oInF1ZXJ5Rm9ybSIpOw0KICAgIH0sDQogICAgLyoqIOaWsOWinuaMiemSruaTjeS9nCAqLw0KICAgIGhhbmRsZUFkZCgpIHsNCiAgICAgIHRoaXMucmVzZXQoKTsNCiAgICAgIHRoaXMuZWRpdCA9IGZhbHNlOw0KICAgICAgdGhpcy5vcGVuID0gdHJ1ZTsNCiAgICAgIHRoaXMudGl0bGUgPSAi5re75Yqg55So5oi3IjsNCiAgICAgIHRoaXMuZm9ybS5wYXNzd29yZCA9IHRoaXMuaW5pdFBhc3N3b3JkOw0KICAgIH0sDQogICAgLyoqIOaPkOS6pOaMiemSriAqLw0KICAgIHN1Ym1pdEZvcm06IGRlYm91bmNlKGZ1bmN0aW9uICgpIHsNCiAgICAgIHRoaXMuJHJlZnNbImZvcm0iXS52YWxpZGF0ZShhc3luYyB2YWxpZCA9PiB7DQogICAgICAgIGlmICh2YWxpZCkgew0KICAgICAgICAgIGlmICh0aGlzLmZvcm0uaWQgIT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICB0aGlzLiRwcm9tcHQoJ+ivt+i+k+WFpeeZu+W9leWvhueggScsICfpibTliKvmk43kvZwnLCB7DQogICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgICAgICAgIGlucHV0VHlwZTogJ3Bhc3N3b3JkJywNCiAgICAgICAgICAgICAgLy8gY3VzdG9tQ2xhc3M6J25vLWF1dG9maWxsLXB3ZCcsDQogICAgICAgICAgICAgIGlucHV0VmFsaWRhdG9yOiAodmFsKSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwubGVuZ3RoIDwgMSB8fCB2YWwubGVuZ3RoID4gMjApIHsNCiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgIGlucHV0RXJyb3JNZXNzYWdlOiAn5LiN6IO95Li656m6LOacgOWkmuWPr+W9leWFpTIw5Liq5a2X56ymJywNCiAgICAgICAgICAgICAgYmVmb3JlQ2xvc2UoYWN0aW9uLCBpbnN0YW5jZSwgZG9uZSkgew0KICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICJjb25maXJtIikgew0KICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuJHJlZnNbImNvbmZpcm0iXS4kZWwub25jbGljayA9IChmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgICAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7DQogICAgICAgICAgICAgICAgICAgIGlmIChlLmRldGFpbCAhPSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICB9KSgpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICBkb25lKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KS50aGVuKGFzeW5jICh7dmFsdWV9KSA9PiB7DQogICAgICAgICAgICAgIGxldCBzeXNUaW1lDQogICAgICAgICAgICAgIGxldCBsaw0KICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRheGlvcy5nZXQoJy9zeXNQb2xpY3lDb250cm9sbGVyL2dldExpY2Vuc2VLZXknKS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgICAgICAgICBzeXNUaW1lID0gcmVzLmRhdGEuc3lzVGltZQ0KICAgICAgICAgICAgICAgIGxrID0gcmVzLmRhdGEubGsNCiAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIHRoaXMuZm9ybS5zeXNUaW1lID0gc3lzVGltZQ0KICAgICAgICAgICAgICB0aGlzLmZvcm0ubGsgPSBsaw0KICAgICAgICAgICAgICB0aGlzLmZvcm0uYWdhaW5Qd2QgPSB2YWx1ZQ0KDQogICAgICAgICAgICAgIC8vIOabtOaWsOaTjeS9nA0KICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRheGlvcy5wb3N0KCcvc3lzVXNlckNvbnRyb2xsZXIvdXBkYXRlVXNlcicsIHRoaXMuZm9ybSkudGhlbigocmVzKSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKHJlcy5jb2RlID09IDApIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2VzcyhyZXMuZGF0YSkNCiAgICAgICAgICAgICAgICAgIHRoaXMub3BlbiA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpOw0KICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMaXN0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChyZXMuY29kZSA9PSAxKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKHJlcy5kYXRhKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHsNCiAgICAgICAgICAgICAgICAvLyB0aGlzLiRtZXNzYWdlLmVycm9yKGVycm9yKQ0KICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9KS5jYXRjaCgoZSkgPT4gew0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy4kcHJvbXB0KCfor7fovpPlhaXnmbvlvZXlr4bnoIEnLCAn6Ym05Yir5pON5L2cJywgew0KICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgICAgICAgICBpbnB1dFR5cGU6ICdwYXNzd29yZCcsDQogICAgICAgICAgICAgIC8vIGN1c3RvbUNsYXNzOiduby1hdXRvZmlsbC1wd2QnLA0KICAgICAgICAgICAgICBpbnB1dFZhbGlkYXRvcjogKHZhbCkgPT4gew0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsLmxlbmd0aCA8IDEgfHwgdmFsLmxlbmd0aCA+IDIwKSB7DQogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICBpbnB1dEVycm9yTWVzc2FnZTogJ+S4jeiDveS4uuepuizmnIDlpJrlj6/lvZXlhaUyMOS4quWtl+espicsDQogICAgICAgICAgICAgIGJlZm9yZUNsb3NlKGFjdGlvbiwgaW5zdGFuY2UsIGRvbmUpIHsNCiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAiY29uZmlybSIpIHsNCiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLiRyZWZzWyJjb25maXJtIl0uJGVsLm9uY2xpY2sgPSAoZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50Ow0KICAgICAgICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwgIT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfSkoKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgZG9uZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkudGhlbihhc3luYyAoe3ZhbHVlfSkgPT4gew0KICAgICAgICAgICAgICBsZXQgc3lzVGltZQ0KICAgICAgICAgICAgICBsZXQgbGsNCiAgICAgICAgICAgICAgYXdhaXQgdGhpcy4kYXhpb3MuZ2V0KCcvc3lzUG9saWN5Q29udHJvbGxlci9nZXRMaWNlbnNlS2V5JykudGhlbigocmVzKSA9PiB7DQogICAgICAgICAgICAgICAgc3lzVGltZSA9IHJlcy5kYXRhLnN5c1RpbWUNCiAgICAgICAgICAgICAgICBsayA9IHJlcy5kYXRhLmxrDQogICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gew0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB0aGlzLmZvcm0uc3lzVGltZSA9IHN5c1RpbWUNCiAgICAgICAgICAgICAgdGhpcy5mb3JtLmxrID0gbGsNCiAgICAgICAgICAgICAgdGhpcy5mb3JtLmFnYWluUHdkID0gdmFsdWUNCg0KICAgICAgICAgICAgICAvLyDmm7TmlrDmk43kvZwNCiAgICAgICAgICAgICAgYXdhaXQgdGhpcy4kYXhpb3MucG9zdCgnL3N5c1VzZXJDb250cm9sbGVyL2FkZFVzZXInLCB0aGlzLmZvcm0pLnRoZW4oKHJlcykgPT4gew0KICAgICAgICAgICAgICAgIGlmIChyZXMuY29kZSA9PSAwKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MocmVzLmRhdGEpDQogICAgICAgICAgICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTsNCiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGlzdCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAocmVzLmNvZGUgPT0gMSkgew0KICAgICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihyZXMuZGF0YSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2UNCiAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICAgICAgICAgICAgLy8gdGhpcy4kbWVzc2FnZS5lcnJvcihlcnJvcikNCiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSkuY2F0Y2goKGUpID0+IHsNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9LCAxMDAwKSwNCiAgICAvKiog6YeN572u5a+G56CB5oyJ6ZKu5pON5L2cICovDQogICAgaGFuZGxlUmVzZXRQd2Qocm93KSB7DQogICAgICBpZiAocm93LnNpZ25zdHIgPT0gJzEnKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywNCiAgICAgICAgICBtZXNzYWdlOiAn5a2Y5Zyo5b6F5a6h5qC477yM5a6h5qC4566h55CG5ZGY5a6h5qC45ZCO6K+35Yi35paw5YiX6KGoJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBpZiAocm93LnN0YXR1cyA9PSAnMicpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflt7Lms6jplIDnmoTotKblj7fkuI3og73liJ3lp4sv6YeN572u5a+G56CBIScNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybg0KICAgICAgfQ0KDQogICAgICB0aGlzLiRwcm9tcHQoJ+ivt+i+k+WFpeeZu+W9leWvhueggScsICfpibTliKvmk43kvZwnLCB7DQogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgIGlucHV0VHlwZTogJ3Bhc3N3b3JkJywNCiAgICAgICAgLy8gY3VzdG9tQ2xhc3M6J25vLWF1dG9maWxsLXB3ZCcsDQogICAgICAgIGlucHV0VmFsaWRhdG9yOiAodmFsKSA9PiB7DQogICAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwubGVuZ3RoIDwgMSB8fCB2YWwubGVuZ3RoID4gMjApIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGlucHV0RXJyb3JNZXNzYWdlOiAn5LiN6IO95Li656m6LOacgOWkmuWPr+W9leWFpTIw5Liq5a2X56ymJywNCiAgICAgICAgYmVmb3JlQ2xvc2UoYWN0aW9uLCBpbnN0YW5jZSwgZG9uZSkgew0KICAgICAgICAgIGlmIChhY3Rpb24gPT09ICJjb25maXJtIikgew0KICAgICAgICAgICAgaW5zdGFuY2UuJHJlZnNbImNvbmZpcm0iXS4kZWwub25jbGljayA9IChmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7DQogICAgICAgICAgICAgIGlmIChlLmRldGFpbCAhPSAwKSB7DQogICAgICAgICAgICAgICAgZG9uZSgpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkb25lKCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KS50aGVuKGFzeW5jICh7dmFsdWV9KSA9PiB7DQogICAgICAgIHRoaXMuZG9SZXNldFB3ZChyb3csIHZhbHVlKQ0KICAgICAgfSkuY2F0Y2goKGUpID0+IHsNCiAgICAgIH0pDQogICAgfSwNCiAgICBkb1Jlc2V0UHdkOiBkZWJvdW5jZShhc3luYyBmdW5jdGlvbiAocm93LGFnYWluUHdkKSB7DQogICAgICBsZXQgc3lzVGltZQ0KICAgICAgbGV0IGxrDQogICAgICBhd2FpdCB0aGlzLiRheGlvcy5nZXQoJy9zeXNQb2xpY3lDb250cm9sbGVyL2dldExpY2Vuc2VLZXknKS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgc3lzVGltZSA9IHJlcy5kYXRhLnN5c1RpbWUNCiAgICAgICAgbGsgPSByZXMuZGF0YS5saw0KICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICB9KQ0KDQogICAgICBjb25zdCBwYXJhbSA9IHsNCiAgICAgICAgaWQ6IHJvdy5pZCwNCiAgICAgICAgYWdhaW5Qd2Q6IGFnYWluUHdkLA0KICAgICAgICBzeXNUaW1lOiBzeXNUaW1lLA0KICAgICAgICBsazogbGsNCiAgICAgIH0NCiAgICAgIGF3YWl0IHRoaXMuJGF4aW9zLnBvc3QoJy9zeXNVc2VyQ29udHJvbGxlci9yZXNldFBhc3N3b3JkJywgcGFyYW0pLnRoZW4oKHJlcykgPT4gew0KICAgICAgICBpZiAocmVzLmNvZGUgPT0gMCkgew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLA0KICAgICAgICAgICAgbWVzc2FnZTogJ+WIm+W7uuW5tuWPkemAgeaIkOWKnyEnDQogICAgICAgICAgfSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICB0eXBlOiAnZXJyb3InLA0KICAgICAgICAgICAgbWVzc2FnZTogcmVzLmRhdGENCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgIHR5cGU6ICdlcnJvcicsDQogICAgICAgICAgbWVzc2FnZTogJ+WIm+W7uuWvhueggeWksei0pSEnDQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkNCiAgICB9LCAxMDAwKSwNCg0KICAgIC8qKiDliKDpmaTmjInpkq7mk43kvZwgKi8NCiAgICBoYW5kbGVEZWxldGUoKSB7DQogICAgICBjb25zdCBfc2VsZWN0RGF0YSA9IHRoaXMuJHJlZnMudXNlclRhYmxlLmdldFJhZGlvUmVjb3JkKHRydWUpDQogICAgICBpZiAoX3NlbGVjdERhdGEgPT0gbnVsbCkgew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnd2FybmluZycsDQogICAgICAgICAgbWVzc2FnZTogJ+ivt+mAieaLqeiusOW9lSEnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGlmIChfc2VsZWN0RGF0YS5pZCA9PSAxKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywNCiAgICAgICAgICBtZXNzYWdlOiAn5YaF572u57O757uf566h55CG5ZGY5LiN6IO95Yig6ZmkIScNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgaWYgKF9zZWxlY3REYXRhLmlkID09IDIpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflhoXnva7lrqHorqHnrqHnkIblkZjkuI3og73liKDpmaQhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBpZiAoX3NlbGVjdERhdGEuaWQgPT0gMjQpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflhoXnva7lrqHmoLjnrqHnkIblkZjkuI3og73liKDpmaQhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICB0aGlzLiRwcm9tcHQoJ+ivt+i+k+WFpeWvhueggScsICfpibTliKvmk43kvZwnLCB7DQogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgIGlucHV0VHlwZTogJ3Bhc3N3b3JkJywNCiAgICAgICAgLy8gY3VzdG9tQ2xhc3M6J25vLWF1dG9maWxsLXB3ZCcsDQogICAgICAgIGlucHV0VmFsaWRhdG9yOiAodmFsKSA9PiB7DQogICAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwubGVuZ3RoIDwgMSB8fCB2YWwubGVuZ3RoID4gMjApIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGlucHV0RXJyb3JNZXNzYWdlOiAn5LiN6IO95Li656m6LOacgOWkmuWPr+W9leWFpTIw5Liq5a2X56ymJywNCiAgICAgICAgYmVmb3JlQ2xvc2UoYWN0aW9uLCBpbnN0YW5jZSwgZG9uZSkgew0KICAgICAgICAgIGlmIChhY3Rpb24gPT09ICJjb25maXJtIikgew0KICAgICAgICAgICAgaW5zdGFuY2UuJHJlZnNbImNvbmZpcm0iXS4kZWwub25jbGljayA9IChmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7DQogICAgICAgICAgICAgIGlmIChlLmRldGFpbCAhPSAwKSB7DQogICAgICAgICAgICAgICAgZG9uZSgpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkb25lKCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KS50aGVuKGFzeW5jICh7dmFsdWV9KSA9PiB7DQogICAgICAgIHRoaXMuZG9EZWxldGUoX3NlbGVjdERhdGEsIHZhbHVlKQ0KICAgICAgfSkuY2F0Y2goKGUpID0+IHsNCiAgICAgIH0pDQogICAgfSwNCiAgICAvKioNCiAgICAgKiDliKDpmaTmj5DkuqQNCiAgICAgKi8NCiAgICBkb0RlbGV0ZTogZGVib3VuY2UoYXN5bmMgZnVuY3Rpb24gKF9zZWxlY3REYXRhLCBhZ2FpblB3ZCkgew0KICAgICAgbGV0IHN5c1RpbWUNCiAgICAgIGxldCBsaw0KICAgICAgYXdhaXQgdGhpcy4kYXhpb3MuZ2V0KCcvc3lzUG9saWN5Q29udHJvbGxlci9nZXRMaWNlbnNlS2V5JykudGhlbigocmVzKSA9PiB7DQogICAgICAgIHN5c1RpbWUgPSByZXMuZGF0YS5zeXNUaW1lDQogICAgICAgIGxrID0gcmVzLmRhdGEubGsNCiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gew0KICAgICAgfSkNCg0KICAgICAgY29uc3QgcGFyYW0gPSB7DQogICAgICAgIGlkOiBfc2VsZWN0RGF0YS5pZCwNCiAgICAgICAgYWdhaW5Qd2Q6IGFnYWluUHdkLA0KICAgICAgICBzeXNUaW1lOiBzeXNUaW1lLA0KICAgICAgICBsazogbGsNCiAgICAgIH0NCiAgICAgIGF3YWl0IHRoaXMuJGF4aW9zLnBvc3QoJy9zeXNVc2VyQ29udHJvbGxlci9kZWxVc2VyJywgcGFyYW0pLnRoZW4oKHJlcykgPT4gew0KICAgICAgICBpZiAocmVzLmNvZGUgPT0gMCkgew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLA0KICAgICAgICAgICAgbWVzc2FnZTogcmVzLmRhdGENCiAgICAgICAgICB9KTsNCiAgICAgICAgICB0aGlzLmdldExpc3QoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsDQogICAgICAgICAgICBtZXNzYWdlOiByZXMuZGF0YQ0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ2Vycm9yJywNCiAgICAgICAgICBtZXNzYWdlOiAn5Yig6Zmk5aSx6LSlIScNCiAgICAgICAgfSk7DQogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0sIDUwMCksDQogICAgLyoqIOS/ruaUueaMiemSruaTjeS9nCAqLw0KICAgIGhhbmRsZVVwZGF0ZSgpIHsNCiAgICAgIHRoaXMucmVzZXQoKTsNCiAgICAgIGxldCBfc2VsZWN0RGF0YSA9IHRoaXMuJHJlZnMudXNlclRhYmxlLmdldFJhZGlvUmVjb3JkKHRydWUpDQogICAgICBpZiAoX3NlbGVjdERhdGEgPT0gbnVsbCkgew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnd2FybmluZycsDQogICAgICAgICAgbWVzc2FnZTogJ+ivt+mAieaLqeiusOW9lSEnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGlmIChfc2VsZWN0RGF0YS5pZCA9PSAxKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywNCiAgICAgICAgICBtZXNzYWdlOiAn5YaF572u57O757uf566h55CG5ZGY5LiN6IO95L+u5pS5IScNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgaWYgKF9zZWxlY3REYXRhLmlkID09IDIpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflhoXnva7lrqHorqHnrqHnkIblkZjkuI3og73kv67mlLkhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBpZiAoX3NlbGVjdERhdGEuaWQgPT0gMjQpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflhoXnva7lrqHmoLjnrqHnkIblkZjkuI3og73kv67mlLkhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBpZiAoX3NlbGVjdERhdGEuc3RhdHVzID09IDIpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICfms6jplIDnmoTotKblj7fkuI3og73mk43kvZwhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBpZiAoX3NlbGVjdERhdGEuc2lnbnN0ciA9PSAnMScpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflrZjlnKjlvoXlrqHmoLjvvIzlrqHmoLjnrqHnkIblkZjlrqHmoLjlkI7or7fliLfmlrDliJfooagnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIHRoaXMuZm9ybSA9IF9zZWxlY3REYXRhOw0KICAgICAgdGhpcy5vcGVuID0gdHJ1ZTsNCiAgICAgIHRoaXMudGl0bGUgPSAi5L+u5pS555So5oi3IjsNCiAgICAgIHRoaXMuZWRpdCA9IHRydWU7DQogICAgfSwNCg0KICAgIC8vIOWPlua2iOaMiemSrg0KICAgIGxvY2tmb3JtY2FuY2VsKCkgew0KICAgICAgdGhpcy5sb2Nrb3BlbiA9IGZhbHNlOw0KICAgICAgdGhpcy5sb2NrZm9ybSA9IHt9DQogICAgfSwNCiAgICBzdWJsb2NrZm9ybSgpew0KICAgICAgaWYgKHRoaXMubG9ja2Zvcm0uZXhwRGF0ZT09bnVsbCB8fCB0aGlzLmxvY2tmb3JtLmV4cERhdGU9PXVuZGVmaW5lZCl7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywNCiAgICAgICAgICBtZXNzYWdlOiAn6K+36YCJ5oup5oiq5q2i5pel5pyfIScNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMubG9ja2Zvcm0ucGFzc3dvcmQ9PW51bGwgfHwgdGhpcy5sb2NrZm9ybS5wYXNzd29yZD09dW5kZWZpbmVkKXsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICfor7fovpPlhaXnmbvlvZXlr4bnoIEhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBjb25zdCBfc2VsZWN0RGF0YSA9IHRoaXMuJHJlZnMudXNlclRhYmxlLmdldFJhZGlvUmVjb3JkKHRydWUpDQogICAgICB0aGlzLmRvUmVsb2NrKF9zZWxlY3REYXRhLCB0aGlzLmxvY2tmb3JtLnBhc3N3b3JkLHRoaXMubG9ja2Zvcm0uZXhwRGF0ZSkNCiAgICB9LA0KICAgIC8qKiDop6PplIHmjInpkq7mk43kvZwgKi8NCiAgICBoYW5kbGVSZWxvY2soKSB7DQogICAgICBjb25zdCBfc2VsZWN0RGF0YSA9IHRoaXMuJHJlZnMudXNlclRhYmxlLmdldFJhZGlvUmVjb3JkKHRydWUpDQogICAgICBpZiAoX3NlbGVjdERhdGEgPT0gbnVsbCkgew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnd2FybmluZycsDQogICAgICAgICAgbWVzc2FnZTogJ+ivt+mAieaLqeiusOW9lSEnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGlmIChfc2VsZWN0RGF0YS5zdGF0dXMgPT0gMikgew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnd2FybmluZycsDQogICAgICAgICAgbWVzc2FnZTogJ+azqOmUgOeahOi0puWPt+S4jeiDveaTjeS9nCEnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGlmIChfc2VsZWN0RGF0YS5zdGF0dXMgIT09ICcxJykgew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnd2FybmluZycsDQogICAgICAgICAgbWVzc2FnZTogJ+WPquiDveWvueOAkOmUgeWumuOAkeeKtuaAgeeahOi/m+ihjOino+mUgSEnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGlmIChfc2VsZWN0RGF0YS5zaWduc3RyID09ICcxJykgew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnd2FybmluZycsDQogICAgICAgICAgbWVzc2FnZTogJ+WtmOWcqOW+heWuoeaguO+8jOWuoeaguOeuoeeQhuWRmOWuoeaguOWQjuivt+WIt+aWsOWIl+ihqCcNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybg0KICAgICAgfQ0KDQogICAgICAvLyDliKTmlq3mmK/lkKbkuLTml7botKblj7cNCiAgICAgIGlmIChfc2VsZWN0RGF0YS5leHBEYXRlKXsNCiAgICAgICAgdGhpcy5sb2Nrb3BlbiA9IHRydWUNCiAgICAgIH0NCiAgICAgIGVsc2V7DQogICAgICAgIHRoaXMuJHByb21wdCgn6K+36L6T5YWl55m75b2V5a+G56CBJywgJ+mJtOWIq+aTjeS9nCcsIHsNCiAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgICAgaW5wdXRUeXBlOiAncGFzc3dvcmQnLA0KICAgICAgICAgIC8vIGN1c3RvbUNsYXNzOiduby1hdXRvZmlsbC1wd2QnLA0KICAgICAgICAgIGlucHV0VmFsaWRhdG9yOiAodmFsKSA9PiB7DQogICAgICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbC5sZW5ndGggPCAxIHx8IHZhbC5sZW5ndGggPiAyMCkgew0KICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBpbnB1dEVycm9yTWVzc2FnZTogJ+S4jeiDveS4uuepuizmnIDlpJrlj6/lvZXlhaUyMOS4quWtl+espicsDQogICAgICAgICAgYmVmb3JlQ2xvc2UoYWN0aW9uLCBpbnN0YW5jZSwgZG9uZSkgew0KICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gImNvbmZpcm0iKSB7DQogICAgICAgICAgICAgIGluc3RhbmNlLiRyZWZzWyJjb25maXJtIl0uJGVsLm9uY2xpY2sgPSAoZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7DQogICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsICE9IDApIHsNCiAgICAgICAgICAgICAgICAgIGRvbmUoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pKCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBkb25lKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9KS50aGVuKGFzeW5jICh7dmFsdWV9KSA9PiB7DQogICAgICAgICAgdGhpcy5kb1JlbG9jayhfc2VsZWN0RGF0YSwgdmFsdWUpDQogICAgICAgIH0pLmNhdGNoKChlKSA9PiB7DQogICAgICAgIH0pDQogICAgICB9DQogICAgfSwNCiAgICAvKioNCiAgICAgKiDop6PplIHmj5DkuqQNCiAgICAgKi8NCiAgICBkb1JlbG9jazogZGVib3VuY2UoYXN5bmMgZnVuY3Rpb24gKF9zZWxlY3REYXRhLCBhZ2FpblB3ZCxleHBEYXRlKSB7DQogICAgICBsZXQgc3lzVGltZQ0KICAgICAgbGV0IGxrDQogICAgICBhd2FpdCB0aGlzLiRheGlvcy5nZXQoJy9zeXNQb2xpY3lDb250cm9sbGVyL2dldExpY2Vuc2VLZXknKS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgc3lzVGltZSA9IHJlcy5kYXRhLnN5c1RpbWUNCiAgICAgICAgbGsgPSByZXMuZGF0YS5saw0KICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICB9KQ0KICAgICAgY29uc3QgcGFyYW0gPSB7DQogICAgICAgIGlkOiBfc2VsZWN0RGF0YS5pZCwNCiAgICAgICAgYWdhaW5Qd2Q6IGFnYWluUHdkLA0KICAgICAgICBleHBEYXRlOmV4cERhdGUsDQogICAgICAgIHN5c1RpbWU6IHN5c1RpbWUsDQogICAgICAgIGxrOiBsaw0KICAgICAgfQ0KICAgICAgYXdhaXQgdGhpcy4kYXhpb3MucG9zdCgnL3N5c1VzZXJDb250cm9sbGVyL3JlbG9ja1VzZXInLCBwYXJhbSkudGhlbigocmVzKSA9PiB7DQogICAgICAgIGlmIChyZXMuY29kZSA9PSAwKSB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsDQogICAgICAgICAgICBtZXNzYWdlOiByZXMuZGF0YQ0KICAgICAgICAgIH0pOw0KICAgICAgICAgIHRoaXMuZ2V0TGlzdCgpOw0KICAgICAgICAgIHRoaXMubG9ja2Zvcm1jYW5jZWwoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsDQogICAgICAgICAgICBtZXNzYWdlOiByZXMuZGF0YQ0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ2Vycm9yJywNCiAgICAgICAgICBtZXNzYWdlOiAn6Kej6ZSB5aSx6LSlIScNCiAgICAgICAgfSk7DQogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0sIDEwMDApLA0KDQogICAgLyoqDQogICAgICog6KeS6Imy57G75Z6L5pS55Y+Y5pe25pu05pS55p2D6ZmQ5YiX6KGoDQogICAgICogQHBhcmFtIHJvd1JvbGVJZA0KICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fQ0KICAgICAqLw0KICAgIGdldE1lbnUocm93Um9sZUlkKXsNCiAgICAgIGNvbnN0IGEgPSB0aGlzLiRheGlvcw0KICAgICAgY29uc3QgX3RoaXMgPSB0aGlzDQogICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICBsZXQgc3lzVGltZQ0KICAgICAgICBsZXQgbGsNCiAgICAgICAgYXdhaXQgYS5nZXQoJy9zeXNQb2xpY3lDb250cm9sbGVyL2dldExpY2Vuc2VLZXknKS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgICBzeXNUaW1lID0gcmVzLmRhdGEuc3lzVGltZQ0KICAgICAgICAgIGxrID0gcmVzLmRhdGEubGsNCiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICAgIH0pDQoNCg0KICAgICAgICB2YXIgcGFyYW0xID0gew0KICAgICAgICAgIHJvbGVJZDogcm93Um9sZUlkLA0KICAgICAgICAgIHN5c1RpbWU6IHN5c1RpbWUsDQogICAgICAgICAgbGs6IGxrDQogICAgICAgIH0NCg0KICAgICAgICBhd2FpdCBhLmdldCgnL3N5c01lbnVDb250cm9sbGVyL3JvbGVNZW51VHJlZXNlbGVjdEZvclVzZXInLA0KICAgICAgICAgIHtwYXJhbXM6IHBhcmFtMX0pLnRoZW4oKHJlcykgPT4gew0KICAgICAgICAgIF90aGlzLm1lbnVPcHRpb25zID0gcmVzLmRhdGEubWVudXM7DQogICAgICAgIH0pDQogICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHsNCiAgICAgICAgY29uc29sZS5lcnJvcign6I635Y+W55So5oi36KeS6Imy5Ye66ZSZJyArIGVycm9yKQ0KICAgICAgfSkNCiAgICB9LA0KICAgIGdldFVzZXJSb2xlKHVzZXJpZCkgew0KICAgICAgY29uc3QgYSA9IHRoaXMuJGF4aW9zDQogICAgICBjb25zdCBfdGhpcyA9IHRoaXMNCiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgIGxldCBzeXNUaW1lDQogICAgICAgIGxldCBsaw0KICAgICAgICBhd2FpdCBhLmdldCgnL3N5c1BvbGljeUNvbnRyb2xsZXIvZ2V0TGljZW5zZUtleScpLnRoZW4oKHJlcykgPT4gew0KICAgICAgICAgIHN5c1RpbWUgPSByZXMuZGF0YS5zeXNUaW1lDQogICAgICAgICAgbGsgPSByZXMuZGF0YS5saw0KICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHsNCiAgICAgICAgfSkNCg0KICAgICAgICB2YXIgdXNlclJvbGVQYXJhbXMgPSB7DQogICAgICAgICAgdXNlcklkOiB1c2VyaWQsDQogICAgICAgICAgc3lzVGltZTogc3lzVGltZSwNCiAgICAgICAgICBsazogbGsNCiAgICAgICAgfQ0KICAgICAgICBhd2FpdCBhLmdldCgnL3N5c1VzZXJDb250cm9sbGVyL2dldFVzZXJSb2xlJywNCiAgICAgICAgICB7cGFyYW1zOiB1c2VyUm9sZVBhcmFtc30pLnRoZW4ocmVzID0+IHsNCiAgICAgICAgaWYgKHJlcy5kYXRhPT11bmRlZmluZWQpew0KICAgICAgICAgIF90aGlzLnVzZXJSb2xlSWQgPSAnJw0KICAgICAgICB9DQogICAgICAgIGVsc2V7DQogICAgICAgICAgX3RoaXMudXNlclJvbGVJZCA9IHJlcy5kYXRhLnJvbGVJZA0KICAgICAgICB9DQogICAgICAgICAgLy8g6L+U5ZuedXNlclJvbGXlr7nosaENCiAgICAgICAgICByZXNvbHZlKHJlcy5kYXRhKQ0KICAgICAgICB9KQ0KDQogICAgICAgIGxldCBzeXNUaW1lMQ0KICAgICAgICBsZXQgbGsxDQogICAgICAgIGF3YWl0ICBhLmdldCgnL3N5c1BvbGljeUNvbnRyb2xsZXIvZ2V0TGljZW5zZUtleScpLnRoZW4oKHJlcykgPT4gew0KICAgICAgICAgIHN5c1RpbWUxID0gcmVzLmRhdGEuc3lzVGltZQ0KICAgICAgICAgIGxrMSA9IHJlcy5kYXRhLmxrDQogICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gew0KICAgICAgICB9KQ0KICAgICAgICB2YXIgcGFyYW0xID0gew0KICAgICAgICAgIHJvbGVJZDogX3RoaXMudXNlclJvbGVJZCwNCiAgICAgICAgICBzeXNUaW1lOiBzeXNUaW1lMSwNCiAgICAgICAgICBsazogbGsxDQogICAgICAgIH0NCg0KICAgICAgICBhd2FpdCBhLmdldCgnL3N5c01lbnVDb250cm9sbGVyL3JvbGVNZW51VHJlZXNlbGVjdEZvclVzZXInLA0KICAgICAgICAgIHtwYXJhbXM6IHBhcmFtMX0pLnRoZW4oKHJlcykgPT4gew0KICAgICAgICAgIF90aGlzLm1lbnVPcHRpb25zID0gcmVzLmRhdGEubWVudXM7DQogICAgICAgIH0pDQogICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHsNCiAgICAgICAgY29uc29sZS5lcnJvcign6I635Y+W55So5oi36KeS6Imy5Ye66ZSZJyArIGVycm9yKQ0KICAgICAgfSkNCiAgICB9LA0KICAgIGdldFJvbGVCeVR5cGUodXNlcnR5cGUpIHsNCiAgICAgIC8vIOagueaNrueUqOaIt+exu+Wei+iOt+WPluinkuiJsuWIl+ihqA0KICAgICAgY29uc3QgYSA9IHRoaXMuJGF4aW9zDQogICAgICBsZXQgX3RoaXMgPSB0aGlzDQogICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICBsZXQgc3lzVGltZQ0KICAgICAgICBsZXQgbGsNCiAgICAgICAgYXdhaXQgYS5nZXQoJy9zeXNQb2xpY3lDb250cm9sbGVyL2dldExpY2Vuc2VLZXknKS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgICBzeXNUaW1lID0gcmVzLmRhdGEuc3lzVGltZQ0KICAgICAgICAgIGxrID0gcmVzLmRhdGEubGsNCiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICAgIH0pDQoNCiAgICAgICAgdmFyIHNlYXJjaFBhcmFtcyA9IHsNCiAgICAgICAgICB1c2VydHlwZTogdXNlcnR5cGUsDQogICAgICAgICAgc3lzVGltZTogc3lzVGltZSwNCiAgICAgICAgICBsazogbGsNCiAgICAgICAgfQ0KICAgICAgICBhd2FpdCBhLmdldCgnL3N5c1JvbGVDb250cm9sbGVyL2dldFJvbGVCeVR5cGUnLA0KICAgICAgICAgIHtwYXJhbXM6IHNlYXJjaFBhcmFtc30pLnRoZW4ocmVzID0+IHsNCiAgICAgICAgICBpZiAocmVzLmNvZGUgPT0gMCkgew0KICAgICAgICAgICAgLy8g6L+U5Zue6KeS6Imy5YiX6KGoDQogICAgICAgICAgICBfdGhpcy5yb2xlTGlzdCA9IHJlcy5kYXRhDQogICAgICAgICAgICByZXNvbHZlKHJlcy5kYXRhKQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAvLyDovpPlh7rlkI7nq6/ov5Tlm57kv6Hmga8NCiAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLA0KICAgICAgICAgICAgICBtZXNzYWdlOiByZXMuZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlDQogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoZXJyb3IpDQogICAgICB9KQ0KICAgIH0sDQogICAgLyoqIOWIhumFjeinkuiJsuaTjeS9nCAqLw0KICAgIGhhbmRsZUF1dGhSb2xlOiBkZWJvdW5jZShmdW5jdGlvbiAocm93KSB7DQogICAgICBpZiAodGhpcy5zeXNSb2xlLnJvbGVLZXk9PSdYVEdMJyAmJiByb3cudXNlcnR5cGU9PScxJyl7DQogICAgICAgIC8vIOezu+e7n+euoeeQhuWRmOS4jeiDvee7meS4muWKoeeUqOaIt+WIhumFjeadg+mZkA0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnd2FybmluZycsDQogICAgICAgICAgbWVzc2FnZTogJ+ezu+e7n+euoeeQhuWRmOS4jeiDvee7meS4muWKoeeUqOaIt+WIhumFjeadg+mZkO+8jOivt+S4muWKoeeuoeeQhuWRmOi/m+ihjOWIhumFjSEnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGlmIChyb3cuaWQgPT0gMSkgew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnd2FybmluZycsDQogICAgICAgICAgbWVzc2FnZTogJ+WGhee9ruezu+e7n+euoeeQhuWRmOS4jeiDveWIhumFjeinkuiJsiEnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGlmIChyb3cuaWQgPT0gMikgew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICB0eXBlOiAnd2FybmluZycsDQogICAgICAgICAgbWVzc2FnZTogJ+WGhee9ruWuoeiuoeeuoeeQhuWRmOS4jeiDveWIhumFjeinkuiJsiEnDQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGlmIChyb3cuaWQgPT0gMjQpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICflhoXnva7lrqHmoLjnrqHnkIblkZjkuI3og73liIbphY3op5LoibIhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBpZiAocm93LnN0YXR1cyA9PSAnMicpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLA0KICAgICAgICAgIG1lc3NhZ2U6ICfms6jplIDnmoTotKblj7fkuI3og73mk43kvZwhJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBpZiAocm93LnNpZ25zdHIgPT0gJzEnKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywNCiAgICAgICAgICBtZXNzYWdlOiAn5a2Y5Zyo5b6F5a6h5qC477yM5a6h5qC4566h55CG5ZGY5a6h5qC45ZCO6K+35Yi35paw5YiX6KGoJw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQoNCiAgICAgIHRoaXMuanN1c2VyaWQgPSByb3cuaWQNCiAgICAgIHRoaXMuanN1c2VybmFtZSA9IHJvdy51c2VybmFtZQ0KICAgICAgdGhpcy5qc25pY2tuYW1lID0gcm93Lm5pY2tuYW1lDQoNCiAgICAgIHRoaXMuZ2V0Um9sZUJ5VHlwZShyb3cudXNlcnR5cGUpDQogICAgICB0aGlzLmdldFVzZXJSb2xlKHRoaXMuanN1c2VyaWQpDQogICAgICB0aGlzLmpzb3BlbiA9IHRydWU7DQogICAgICB0aGlzLnRpdGxlID0gIuWIhumFjeinkuiJsiI7DQogICAgICAvLyBQcm9taXNlLmFsbChbdGhpcy5nZXRSb2xlQnlUeXBlKHJvdy51c2VydHlwZSksIHRoaXMuZ2V0VXNlclJvbGUodGhpcy5qc3VzZXJpZCldKS50aGVuKChyZXMpID0+IHsNCiAgICAgIC8vICAgaWYgKHJlc1sxXSAhPSAnJyAmJiByZXNbMV0gIT0gdW5kZWZpbmVkKSB7DQogICAgICAvLyAgICAgY29uc3Qgcm9sZVRhYmxlID0gdGhpcy4kcmVmcy54VGFibGUuZ2V0VGFibGVEYXRhKCkNCiAgICAgIC8vICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvbGVUYWJsZS50YWJsZURhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgIC8vICAgICAgIGlmIChyZXNbMV0ucm9sZUlkID09IHJvbGVUYWJsZS50YWJsZURhdGFbaV0ucm9sZUlkKSB7DQogICAgICAvLyAgICAgICAgIC8vIOWwhuWOn+acieeahOinkuiJsuWLvumAieS4ig0KICAgICAgLy8gICAgICAgICB0aGlzLiRyZWZzLnhUYWJsZS5zZXRDaGVja2JveFJvdyhyb2xlVGFibGUudGFibGVEYXRhW2ldLCB0cnVlKQ0KICAgICAgLy8gICAgICAgfQ0KICAgICAgLy8gICAgIH0NCiAgICAgIC8vICAgfQ0KICAgICAgLy8gfSkuY2F0Y2goZSA9PiB7DQogICAgICAvLyAgIHRoaXMubG9hZGluZyA9IGZhbHNlDQogICAgICAvLyAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoIuiOt+WPluWIhumFjeinkuiJsuW8guW4uO+8miIgKyBlKQ0KICAgICAgLy8gfSkNCiAgICB9LCAxMDAwKSwNCg0KDQogICAgLyoqIOinkuiJsuWIhumFjeaPkOS6pOaMiemSriAqLw0KICAgIGpzc3VibWl0Rm9ybTogZGVib3VuY2UoYXN5bmMgZnVuY3Rpb24gKCkgew0KICAgICAgdGhpcy4kcHJvbXB0KCfor7fovpPlhaXnmbvlvZXlr4bnoIEnLCAn6Ym05Yir5pON5L2cJywgew0KICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgICBpbnB1dFR5cGU6ICdwYXNzd29yZCcsDQogICAgICAgIC8vIGN1c3RvbUNsYXNzOiduby1hdXRvZmlsbC1wd2QnLA0KICAgICAgICBpbnB1dFZhbGlkYXRvcjogKHZhbCkgPT4gew0KICAgICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsLmxlbmd0aCA8IDEgfHwgdmFsLmxlbmd0aCA+IDIwKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBpbnB1dEVycm9yTWVzc2FnZTogJ+S4jeiDveS4uuepuizmnIDlpJrlj6/lvZXlhaUyMOS4quWtl+espicsDQogICAgICAgIGJlZm9yZUNsb3NlKGFjdGlvbiwgaW5zdGFuY2UsIGRvbmUpIHsNCiAgICAgICAgICBpZiAoYWN0aW9uID09PSAiY29uZmlybSIpIHsNCiAgICAgICAgICAgIGluc3RhbmNlLiRyZWZzWyJjb25maXJtIl0uJGVsLm9uY2xpY2sgPSAoZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50Ow0KICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwgIT0gMCkgew0KICAgICAgICAgICAgICAgIGRvbmUoKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG9uZSgpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSkudGhlbihhc3luYyAoe3ZhbHVlfSkgPT4gew0KICAgICAgICBsZXQgc3lzVGltZQ0KICAgICAgICBsZXQgbGsNCiAgICAgICAgYXdhaXQgdGhpcy4kYXhpb3MuZ2V0KCcvc3lzUG9saWN5Q29udHJvbGxlci9nZXRMaWNlbnNlS2V5JykudGhlbigocmVzKSA9PiB7DQogICAgICAgICAgc3lzVGltZSA9IHJlcy5kYXRhLnN5c1RpbWUNCiAgICAgICAgICBsayA9IHJlcy5kYXRhLmxrDQogICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gew0KICAgICAgICB9KQ0KDQogICAgICAgIC8vIOaPkOS6pOWQjuWPsOinkuiJsuWIhumFjQ0KICAgICAgICBjb25zdCBwYXJhbSA9IHsNCiAgICAgICAgICB1c2VySWQ6IHRoaXMuanN1c2VyaWQsDQogICAgICAgICAgcm9sZUlkOiB0aGlzLnVzZXJSb2xlSWQsDQogICAgICAgICAgc3lzVGltZTogc3lzVGltZSwNCiAgICAgICAgICBsazogbGssDQogICAgICAgICAgYWdhaW5Qd2Q6IHZhbHVlDQogICAgICAgIH0NCiAgICAgICAgYXdhaXQgdGhpcy4kYXhpb3MucG9zdCgnL3N5c1VzZXJDb250cm9sbGVyL2F1dGhSb2xlJywgcGFyYW0pLnRoZW4oKHJlcykgPT4gew0KICAgICAgICAgIGlmIChyZXMuY29kZSA9PSAwKSB7DQogICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLA0KICAgICAgICAgICAgICBtZXNzYWdlOiByZXMuZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLmpzY2FuY2VsKCkNCiAgICAgICAgICAgIHRoaXMuZ2V0TGlzdCgpDQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLA0KICAgICAgICAgICAgICBtZXNzYWdlOiByZXMuZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfQ0KICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsDQogICAgICAgICAgICBtZXNzYWdlOiAn6KeS6Imy5YiG6YWN5aSx6LSlIScNCiAgICAgICAgICB9KTsNCiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgICB9KQ0KICAgICAgfSkuY2F0Y2goKGUpID0+IHsNCiAgICAgIH0pDQogICAgfSwgMTAwMCkNCiAgfQ0KfTsNCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwUA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/sysManager/userManager","sourcesContent":["<template>\r\n <div class=\"app-container\">\r\n <el-row :gutter=\"24\">\r\n <!--用户数据-->\r\n <el-col :span=\"24\" :xs=\"24\">\r\n <el-form :model=\"queryParams\" ref=\"queryForm\" size=\"small\" :inline=\"true\" label-width=\"68px\">\r\n <el-form-item label=\"用户账号\" prop=\"username\">\r\n <el-input\r\n maxlength=\"20\"\r\n v-model=\"queryParams.username\"\r\n placeholder=\"请输入用户账号\"\r\n clearable\r\n style=\"width: 240px\"\r\n />\r\n </el-form-item>\r\n <el-form-item label=\"手机号码\" prop=\"phonenumber\">\r\n <el-input\r\n maxlength=\"11\"\r\n v-model=\"queryParams.phonenumber\"\r\n placeholder=\"请输入手机号码\"\r\n clearable\r\n style=\"width: 240px\"\r\n />\r\n </el-form-item>\r\n <el-form-item label=\"用户状态\" prop=\"status\">\r\n <el-select\r\n v-model=\"queryParams.status\"\r\n placeholder=\"请选择用户状态\"\r\n clearable\r\n style=\"width: 240px\"\r\n >\r\n <el-option\r\n v-for=\"item in statusOptions\"\r\n :key=\"item.value\"\r\n :label=\"item.label\"\r\n :value=\"item.value\">\r\n </el-option>\r\n </el-select>\r\n </el-form-item>\r\n <el-form-item>\r\n <el-button type=\"primary\" icon=\"el-icon-search\" size=\"mini\" @click=\"handleQuery\">搜索</el-button>\r\n <el-button icon=\"el-icon-refresh\" size=\"mini\" @click=\"resetQuery\">重置</el-button>\r\n </el-form-item>\r\n </el-form>\r\n <el-row :gutter=\"10\" class=\"mb8\">\r\n <el-col :span=\"1.5\">\r\n <el-button\r\n type=\"primary\"\r\n plain\r\n icon=\"el-icon-plus\"\r\n size=\"mini\"\r\n @click=\"handleAdd\"\r\n v-hasPermi=\"['system:user:add']\"\r\n >新增\r\n </el-button>\r\n </el-col>\r\n <el-col :span=\"1.5\">\r\n <el-button\r\n type=\"success\"\r\n plain\r\n icon=\"el-icon-edit\"\r\n size=\"mini\"\r\n @click=\"handleUpdate\"\r\n v-hasPermi=\"['system:user:edit']\"\r\n >修改\r\n </el-button>\r\n </el-col>\r\n<!-- <el-col :span=\"1.5\">-->\r\n<!-- <el-button-->\r\n<!-- type=\"danger\"-->\r\n<!-- plain-->\r\n<!-- icon=\"el-icon-delete\"-->\r\n<!-- size=\"mini\"-->\r\n<!-- @click=\"handleDelete\"-->\r\n<!-- v-hasPermi=\"['system:user:remove']\"-->\r\n<!-- >删除-->\r\n<!-- </el-button>-->\r\n<!-- </el-col>-->\r\n <el-col :span=\"1.5\">\r\n <el-button\r\n type=\"danger\"\r\n plain\r\n icon=\"el-icon-delete\"\r\n size=\"mini\"\r\n @click=\"handleLogOff\"\r\n v-hasPermi=\"['system:user:logoff']\"\r\n >注销\r\n </el-button>\r\n </el-col>\r\n <el-col :span=\"1.5\">\r\n <el-button\r\n type=\"success\"\r\n plain\r\n icon=\"el-icon-unlock\"\r\n size=\"mini\"\r\n @click=\"handleRelock\"\r\n v-hasPermi=\"['system:user:relock']\"\r\n >解锁\r\n </el-button>\r\n </el-col>\r\n </el-row>\r\n <div style=\"padding-top: 10px\">\r\n <vxe-table\r\n :row-style=\"setRowClass\"\r\n ref=\"userTable\"\r\n align=\"center\"\r\n :loading=\"loading\"\r\n class=\"mytable-style\"\r\n auto-resize\r\n border\r\n resizable\r\n highlight-current-row\r\n show-overflow\r\n max-height=\"700\"\r\n :radio-config=\"{trigger: 'row'}\"\r\n :data=\"userList.slice((currentPage-1)*pageSize,currentPage*pageSize)\"\r\n >\r\n <vxe-column type=\"radio\" width=\"60\"/>\r\n <vxe-table-column field=\"username\" title=\"用户账号\"/>\r\n <vxe-table-column field=\"nickname\" title=\"用户姓名\"/>\r\n <vxe-table-column field=\"idcard\" title=\"身份证号码\"/>\r\n <vxe-table-column field=\"mailbox\" title=\"用户邮箱\"/>\r\n <vxe-table-column field=\"phonenumber\" title=\"手机号码\"/>\r\n <vxe-table-column field=\"status\" title=\"用户状态\" :formatter=\"statusFormat\"/>\r\n <vxe-table-column field=\"usertype\" title=\"用户类型\" :formatter=\"typeFormat\"/>\r\n <vxe-table-column field=\"signstr\" title=\"是否审核\" :formatter=\"sfsh\"/>\r\n <vxe-table-column field=\"expDate\" title=\"账号截止日期\"/>\r\n <vxe-table-column title=\"操作\" width=\"320\">\r\n <template slot-scope=\"scope\">\r\n <el-button\r\n v-if=\"scope.row.id !== 1 && scope.row.id !== 2 && scope.row.id !== 24\"\r\n size=\"mini\"\r\n type=\"text\"\r\n icon=\"el-icon-edit\"\r\n @click=\"handleResetPwd(scope.row)\"\r\n v-hasPermi=\"['system:user:send']\"\r\n >初始/重置密码\r\n </el-button>\r\n <el-button\r\n v-if=\"scope.row.id !== 1 && scope.row.id !== 2 && scope.row.id !== 24\"\r\n size=\"mini\"\r\n type=\"text\"\r\n icon=\"el-icon-circle-check\"\r\n @click=\"handleAuthRole(scope.row)\"\r\n v-hasPermi=\"['system:user:role']\"\r\n >分配角色\r\n </el-button>\r\n </template>\r\n </vxe-table-column>\r\n </vxe-table>\r\n\r\n <vxe-pager\r\n v-show=\"showTable\"\r\n perfect\r\n :current-page.sync=\"currentPage\"\r\n :page-size.sync=\"pageSize\"\r\n :total=\"total\"\r\n :page-sizes=\"[10,50,100]\"\r\n :layouts=\"['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']\"\r\n >\r\n </vxe-pager>\r\n </div>\r\n </el-col>\r\n </el-row>\r\n\r\n <!-- 添加或修改用户配置对话框 -->\r\n <el-dialog :title=\"title\" :visible.sync=\"open\" width=\"750px\" append-to-body>\r\n <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" width=\"730px\" label-width=\"100px\">\r\n <el-row>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"用户账号\" prop=\"username\">\r\n <el-input id=\"un\" ref=\"un\" style=\"width: 220px\" v-model=\"form.username\" placeholder=\"请输入用户账号\"\r\n maxlength=\"20\" :disabled=\"edit\"/>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"身份证号码\" prop=\"idcard\">\r\n <el-input style=\"width: 220px\" v-model=\"form.idcard\" placeholder=\"请输入身份证号码\" maxlength=\"18\" :disabled=\"edit\"/>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"用户类型\">\r\n <el-select style=\"width: 220px\" v-model=\"form.usertype\" placeholder=\"请选择类型\" :disabled=\"edit\">\r\n <el-option\r\n v-for=\"item in typeOptions\"\r\n :key=\"item.value\"\r\n :label=\"item.label\"\r\n :value=\"item.value\"\r\n ></el-option>\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"用户姓名\" prop=\"nickname\">\r\n <el-input style=\"width: 220px\" v-model=\"form.nickname\" placeholder=\"请输入用户姓名\" maxlength=\"30\"/>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"手机号码\" prop=\"phonenumber\">\r\n <el-input style=\"width: 220px\" v-model=\"form.phonenumber\" placeholder=\"请输入手机号码\" maxlength=\"11\"/>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"用户邮箱\" prop=\"mailbox\">\r\n <el-input style=\"width: 220px\" v-model=\"form.mailbox\" placeholder=\"请输入邮箱\" maxlength=\"50\"/>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"账号截止日期\">\r\n <el-date-picker\r\n value-format=\"yyyy-MM-dd\"\r\n v-model=\"form.expDate\"\r\n type=\"date\"\r\n placeholder=\"请选择账号截止日期\"\r\n :picker-options=\"pickerOptions\">\r\n </el-date-picker>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\" class=\"dialog-footer\">\r\n <el-button type=\"primary\" @click=\"submitForm\">确 定</el-button>\r\n <el-button @click=\"cancel\">取 消</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 解锁用户对于临时账号需要弹出页面选择截止日期 -->\r\n <el-dialog :title=\"locktitle\" :visible.sync=\"lockopen\" width=\"430px\" append-to-body>\r\n <el-form ref=\"lockform\" :model=\"lockform\" width=\"430px\" label-width=\"120px\">\r\n <font size=\"3\" color=\"red\">解锁临时账号,需要重置账号截止日期!</font>\r\n <el-row>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"账号截止日期\">\r\n <el-date-picker\r\n style=\"width: 220px\"\r\n value-format=\"yyyy-MM-dd\"\r\n v-model=\"lockform.expDate\"\r\n type=\"date\"\r\n placeholder=\"请选择账号截止日期\"\r\n :picker-options=\"pickerOptions\">\r\n </el-date-picker>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"输入登录密码\">\r\n <el-input\r\n style=\"width: 220px\"\r\n v-model=\"lockform.password\"\r\n type=\"password\"\r\n auto-complete=\"off\"\r\n placeholder=\"密码\"\r\n maxlength=\"20\"\r\n />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\" class=\"dialog-footer\">\r\n <el-button type=\"primary\" @click=\"sublockform\">确 定</el-button>\r\n <el-button @click=\"lockformcancel\">取 消</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 分配角色对话框 -->\r\n <el-dialog :title=\"jstitle\" :visible.sync=\"jsopen\" width=\"650px\" append-to-body>\r\n <el-form width=\"630px\" label-width=\"80px\">\r\n <el-row>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"用户账号\">\r\n <el-input style=\"width: 220px\" v-model=\"jsusername\"\r\n maxlength=\"20\" :disabled=\"true\"/>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"用户姓名\">\r\n <el-input style=\"width: 220px\" v-model=\"jsnickname\" maxlength=\"30\" :disabled=\"true\"/>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"角色类型\" style=\"width: 100px\">\r\n <el-select style=\"width: 220px\" v-model=\"userRoleId\" placeholder=\"请选择类型\" :disabled=\"edit\" @change=\"getMenu(userRoleId)\">\r\n <el-option\r\n v-for=\"item in roleList\"\r\n :key=\"item.roleId\"\r\n :label=\"item.roleName\"\r\n :value=\"item.roleId\"\r\n ></el-option>\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"菜单权限\">\r\n <el-checkbox v-model=\"menuExpand\" @change=\"handleCheckedTreeExpand($event, 'menu')\">展开/折叠</el-checkbox>\r\n <el-tree\r\n class=\"tree-border\"\r\n :data=\"menuOptions\"\r\n ref=\"menu\"\r\n node-key=\"id\"\r\n empty-text=\"无数据,请选择角色类型!\"\r\n :props=\"defaultProps\"\r\n ></el-tree>\r\n </el-form-item>\r\n\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n\r\n <div slot=\"footer\" class=\"dialog-footer\">\r\n <el-button type=\"primary\" @click=\"jssubmitForm\">确 定</el-button>\r\n <el-button @click=\"jscancel\">取 消</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport {debounce} from 'lodash'\r\nimport {userinfoDecrypt} from \"@/utils/smutil\";\r\n\r\nexport default {\r\n name: \"User\",\r\n data() {\r\n return {\r\n pickerOptions:{\r\n disabledDate(time){\r\n return time.getTime()<Date.now()-8.64e7\r\n }\r\n },\r\n sysRole:'',\r\n id: undefined,\r\n username: undefined,\r\n nickname: undefined,\r\n idcard: undefined,\r\n phonenumber: undefined,\r\n mailbox: undefined,\r\n status: \"0\",\r\n usertype: \"0\",\r\n remark: undefined,\r\n expDate: undefined,\r\n // 角色表格数据\r\n jsuserid: '',\r\n roleList: [],\r\n jsusername: '',\r\n jsnickname: '',\r\n userRoleId: '',\r\n jsusertype: '',\r\n statusOptions: [\r\n {value: '0', label: '正常'},\r\n {value: '1', label: '锁定'},\r\n {value: '2', label: '注销'}\r\n ],\r\n typeOptions: [\r\n {value: '0', label: '管理员'},\r\n {value: '1', label: '业务用户'}\r\n ],\r\n // 遮罩层\r\n loading: true,\r\n showTable: true,\r\n // 选中数组\r\n ids: [],\r\n // 非单个禁用\r\n single: true,\r\n // 非多个禁用\r\n multiple: true,\r\n currentPage: 1,\r\n pageSize: 10,\r\n // 总条数\r\n total: 0,\r\n // 用户表格数据\r\n userList: [],\r\n locktitle:\"鉴别操作\",\r\n // 弹出层标题\r\n title: \"\",\r\n // 角色分配弹出层标题\r\n jstitle: \"\",\r\n // 是否显示弹出层\r\n open: false,\r\n lockopen:false,\r\n // 角色是否显示弹出层\r\n jsopen: false,\r\n // 默认密码\r\n initPassword: undefined,\r\n // 角色选项\r\n roleOptions: [],\r\n // 表单参数\r\n form: {},\r\n lockform:{},\r\n // 查询参数\r\n queryParams: {\r\n username: undefined,\r\n phonenumber: undefined,\r\n status: undefined\r\n },\r\n menuExpand: false,\r\n // 菜单列表\r\n menuOptions: [],\r\n defaultProps: {\r\n children: \"children\",\r\n label: \"label\"\r\n },\r\n edit: false,\r\n // 表单校验\r\n rules: {\r\n username: [\r\n {required: true, message: \"用户账号不能为空\", trigger: \"blur\"},\r\n {min: 5, max: 20, message: '用户账号长度必须介于 5 和 20 之间', trigger: 'blur'}\r\n ],\r\n nickname: [\r\n {required: true, message: \"用户姓名不能为空\", trigger: \"blur\"},\r\n {min: 2, max: 30, message: '用户姓名长度必须介于 2 和 30 之间', trigger: 'blur'}\r\n ],\r\n idcard: [\r\n {required: true, message: \"身份证号码不能为空\", trigger: \"blur\"},\r\n {min: 15, max: 18, message: '身份证号请输入15位或者18位', trigger: 'blur'}\r\n ],\r\n mailbox: [\r\n {required: true, message: \"邮箱不能为空\", trigger: \"blur\"},\r\n {type: \"email\", message: \"请输入正确的邮箱地址\", trigger: [\"blur\", \"change\"]}\r\n ],\r\n phonenumber: [\r\n {required: true, message: \"手机号码不能为空\", trigger: \"blur\"},\r\n {pattern: /^1[3|4|5|6|7|8|9][0-9]\\d{8}$/, message: \"请输入正确的手机号码\", trigger: \"blur\"}\r\n ]\r\n }\r\n };\r\n },\r\n watch: {},\r\n created() {\r\n this.getList()\r\n this.getUserByRole()\r\n },\r\n methods: {\r\n async getUserByRole(){\r\n // 获取当前用户的角色\r\n let sysTime2\r\n let lk2\r\n await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime2 = res.data.sysTime\r\n lk2 = res.data.lk\r\n }).catch((error) => {\r\n })\r\n var searchParams2 = {\r\n sysTime: sysTime2,\r\n lk: lk2\r\n }\r\n await this.$axios.get('/sysRoleController/getUserByRole', {params: searchParams2}).then((res) => {\r\n this.sysRole = res.data\r\n }).catch((error) => {\r\n })\r\n },\r\n // 树权限(展开/折叠)\r\n handleCheckedTreeExpand(value, type) {\r\n if (type == 'menu') {\r\n let treeList = this.menuOptions;\r\n for (let i = 0; i < treeList.length; i++) {\r\n this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value;\r\n }\r\n }\r\n },\r\n\r\n setRowClass({row, rowIndex}){\r\n if(row.signstr === '1'){\r\n return \"background: #FFEFD5\";\r\n }\r\n },\r\n // 注销操作\r\n handleLogOff(){\r\n let _selectData = this.$refs.userTable.getRadioRecord(true)\r\n if (_selectData == null) {\r\n this.$message({\r\n type: 'warning',\r\n message: '请选择记录!'\r\n });\r\n return\r\n }\r\n if (_selectData.id == 1) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置系统管理员用户不能注销!'\r\n });\r\n return\r\n }\r\n if (_selectData.id == 2) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置审计管理员用户不能注销!'\r\n });\r\n return\r\n }\r\n if (_selectData.id == 24) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置审核管理员用户不能注销!'\r\n });\r\n return\r\n }\r\n if (_selectData.status == 2) {\r\n this.$message({\r\n type: 'warning',\r\n message: '已注销的账号不能再次注销!'\r\n });\r\n return\r\n }\r\n if (_selectData.signstr == '1') {\r\n this.$message({\r\n type: 'warning',\r\n message: '存在待审核,审核管理员审核后请刷新列表'\r\n });\r\n return\r\n }\r\n this.$prompt('请输入登录密码', '鉴别操作', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputType: 'password',\r\n // customClass:'no-autofill-pwd',\r\n inputValidator: (val) => {\r\n if (val === null || val.length < 1 || val.length > 20) {\r\n return false;\r\n }\r\n },\r\n inputErrorMessage: '不能为空,最多可录入20个字符',\r\n beforeClose(action, instance, done) {\r\n if (action === \"confirm\") {\r\n instance.$refs[\"confirm\"].$el.onclick = (function (e) {\r\n e = e || window.event;\r\n if (e.detail != 0) {\r\n done();\r\n }\r\n })();\r\n } else {\r\n done();\r\n }\r\n }\r\n }).then(async ({value}) => {\r\n this.doLogoff(_selectData, value)\r\n }).catch((e) => {\r\n })\r\n },\r\n /**\r\n * 注销提交\r\n */\r\n doLogoff: debounce(async function (_selectData, againPwd) {\r\n let sysTime\r\n let lk\r\n await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n })\r\n\r\n const param = {\r\n id: _selectData.id,\r\n againPwd: againPwd,\r\n sysTime: sysTime,\r\n lk: lk\r\n }\r\n await this.$axios.post('/sysUserController/logOffUser', param).then((res) => {\r\n if (res.code == 0) {\r\n this.$message({\r\n type: 'success',\r\n message: res.data\r\n });\r\n this.getList();\r\n } else {\r\n this.$message({\r\n type: 'error',\r\n message: res.data\r\n });\r\n }\r\n }).catch((error) => {\r\n this.$message({\r\n type: 'error',\r\n message: '删除失败!'\r\n });\r\n this.loading = false\r\n })\r\n }, 500),\r\n // 列表状态格式化\r\n statusFormat({cellValue}) {\r\n let belongTo = '未知的类型'\r\n for (let i = 0; i < this.statusOptions.length; i++) {\r\n if (cellValue == \"0\") {\r\n belongTo = \"正常\"\r\n } else if (cellValue == \"1\") {\r\n belongTo = \"锁定\"\r\n } else if (cellValue == \"2\") {\r\n belongTo = \"注销\"\r\n }\r\n }\r\n return belongTo\r\n },\r\n // 列表状态格式化\r\n sfsh({cellValue}) {\r\n let belongTo = '否'\r\n if (cellValue == \"1\") {\r\n belongTo = \"是\"\r\n }\r\n return belongTo\r\n },\r\n // 列表状态格式化\r\n typeFormat({cellValue}) {\r\n let belongTo = '未知的类型'\r\n for (let i = 0; i < this.typeOptions.length; i++) {\r\n if (cellValue == \"0\") {\r\n belongTo = \"管理员\"\r\n } else if (cellValue == \"1\") {\r\n belongTo = \"业务用户\"\r\n }\r\n }\r\n return belongTo\r\n },\r\n /** 搜索按钮操作 */\r\n handleQuery: debounce(function () {\r\n this.currentPage = 1\r\n this.pageSize = 10\r\n this.getList()\r\n }, 1000),\r\n /** 查询用户列表 */\r\n async getList() {\r\n this.loading = true;\r\n let sysTime\r\n let lk\r\n await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n this.loading = false;\r\n })\r\n\r\n var searchParams = {\r\n currentPage: this.currentPage,\r\n pageSize: this.pageSize,\r\n username: this.queryParams.username,\r\n phonenumber: this.queryParams.phonenumber,\r\n status: this.queryParams.status,\r\n sysTime: sysTime,\r\n lk: lk\r\n }\r\n await this.$axios.get('/sysUserController/getAll',\r\n {params: searchParams}).then((res) => {\r\n this.userList = res.data\r\n this.total = res.data.length\r\n\r\n if (res.data.records == '') {\r\n this.showTable = false\r\n } else {\r\n this.showTable = true\r\n }\r\n this.loading = false\r\n }).catch((error) => {\r\n this.loading = false;\r\n // this.$message.error(error)\r\n })\r\n },\r\n // 用户状态修改\r\n handleStatusChange(row) {\r\n let text = row.status === \"0\" ? \"启用\" : \"停用\";\r\n this.$modal.confirm('确认要\"' + text + '\"\"' + row.userName + '\"用户吗?').then(function () {\r\n return changeUserStatus(row.userId, row.status);\r\n }).then(() => {\r\n this.$modal.msgSuccess(text + \"成功\");\r\n }).catch(function () {\r\n row.status = row.status === \"0\" ? \"1\" : \"0\";\r\n });\r\n },\r\n // 取消按钮\r\n cancel() {\r\n this.getList()\r\n this.open = false;\r\n this.reset();\r\n },\r\n // 角色取消按钮\r\n jscancel() {\r\n this.jsopen = false;\r\n this.userRoleId = ''\r\n this.menuOptions=[]\r\n },\r\n // 表单重置\r\n reset() {\r\n this.edit = false;\r\n this.form = {\r\n id: undefined,\r\n username: undefined,\r\n nickname: undefined,\r\n idcard: undefined,\r\n phonenumber: undefined,\r\n mailbox: undefined,\r\n status: \"0\",\r\n usertype: \"0\",\r\n remark: undefined,\r\n expDate: undefined\r\n };\r\n\r\n if (this.$refs[\"form\"]) {\r\n this.$refs[\"form\"].clearValidate();\r\n }\r\n },\r\n /** 重置按钮操作 */\r\n resetQuery() {\r\n this.resetForm(\"queryForm\");\r\n },\r\n /** 新增按钮操作 */\r\n handleAdd() {\r\n this.reset();\r\n this.edit = false;\r\n this.open = true;\r\n this.title = \"添加用户\";\r\n this.form.password = this.initPassword;\r\n },\r\n /** 提交按钮 */\r\n submitForm: debounce(function () {\r\n this.$refs[\"form\"].validate(async valid => {\r\n if (valid) {\r\n if (this.form.id != undefined) {\r\n this.$prompt('请输入登录密码', '鉴别操作', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputType: 'password',\r\n // customClass:'no-autofill-pwd',\r\n inputValidator: (val) => {\r\n if (val === null || val.length < 1 || val.length > 20) {\r\n return false;\r\n }\r\n },\r\n inputErrorMessage: '不能为空,最多可录入20个字符',\r\n beforeClose(action, instance, done) {\r\n if (action === \"confirm\") {\r\n instance.$refs[\"confirm\"].$el.onclick = (function (e) {\r\n e = e || window.event;\r\n if (e.detail != 0) {\r\n done();\r\n }\r\n })();\r\n } else {\r\n done();\r\n }\r\n }\r\n }).then(async ({value}) => {\r\n let sysTime\r\n let lk\r\n await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n })\r\n this.form.sysTime = sysTime\r\n this.form.lk = lk\r\n this.form.againPwd = value\r\n\r\n // 更新操作\r\n await this.$axios.post('/sysUserController/updateUser', this.form).then((res) => {\r\n if (res.code == 0) {\r\n this.$message.success(res.data)\r\n this.open = false;\r\n this.reset();\r\n this.getList();\r\n }\r\n if (res.code == 1) {\r\n this.$message.error(res.data)\r\n }\r\n this.loading = false\r\n }).catch((error) => {\r\n // this.$message.error(error)\r\n this.loading = false\r\n })\r\n }).catch((e) => {\r\n })\r\n } else {\r\n this.$prompt('请输入登录密码', '鉴别操作', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputType: 'password',\r\n // customClass:'no-autofill-pwd',\r\n inputValidator: (val) => {\r\n if (val === null || val.length < 1 || val.length > 20) {\r\n return false;\r\n }\r\n },\r\n inputErrorMessage: '不能为空,最多可录入20个字符',\r\n beforeClose(action, instance, done) {\r\n if (action === \"confirm\") {\r\n instance.$refs[\"confirm\"].$el.onclick = (function (e) {\r\n e = e || window.event;\r\n if (e.detail != 0) {\r\n done();\r\n }\r\n })();\r\n } else {\r\n done();\r\n }\r\n }\r\n }).then(async ({value}) => {\r\n let sysTime\r\n let lk\r\n await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n })\r\n this.form.sysTime = sysTime\r\n this.form.lk = lk\r\n this.form.againPwd = value\r\n\r\n // 更新操作\r\n await this.$axios.post('/sysUserController/addUser', this.form).then((res) => {\r\n if (res.code == 0) {\r\n this.$message.success(res.data)\r\n this.open = false;\r\n this.reset();\r\n this.getList();\r\n }\r\n if (res.code == 1) {\r\n this.$message.error(res.data)\r\n }\r\n this.loading = false\r\n }).catch((error) => {\r\n // this.$message.error(error)\r\n this.loading = false\r\n })\r\n }).catch((e) => {\r\n })\r\n }\r\n }\r\n });\r\n }, 1000),\r\n /** 重置密码按钮操作 */\r\n handleResetPwd(row) {\r\n if (row.signstr == '1') {\r\n this.$message({\r\n type: 'warning',\r\n message: '存在待审核,审核管理员审核后请刷新列表'\r\n });\r\n return\r\n }\r\n if (row.status == '2') {\r\n this.$message({\r\n type: 'warning',\r\n message: '已注销的账号不能初始/重置密码!'\r\n });\r\n return\r\n }\r\n\r\n this.$prompt('请输入登录密码', '鉴别操作', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputType: 'password',\r\n // customClass:'no-autofill-pwd',\r\n inputValidator: (val) => {\r\n if (val === null || val.length < 1 || val.length > 20) {\r\n return false;\r\n }\r\n },\r\n inputErrorMessage: '不能为空,最多可录入20个字符',\r\n beforeClose(action, instance, done) {\r\n if (action === \"confirm\") {\r\n instance.$refs[\"confirm\"].$el.onclick = (function (e) {\r\n e = e || window.event;\r\n if (e.detail != 0) {\r\n done();\r\n }\r\n })();\r\n } else {\r\n done();\r\n }\r\n }\r\n }).then(async ({value}) => {\r\n this.doResetPwd(row, value)\r\n }).catch((e) => {\r\n })\r\n },\r\n doResetPwd: debounce(async function (row,againPwd) {\r\n let sysTime\r\n let lk\r\n await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n })\r\n\r\n const param = {\r\n id: row.id,\r\n againPwd: againPwd,\r\n sysTime: sysTime,\r\n lk: lk\r\n }\r\n await this.$axios.post('/sysUserController/resetPassword', param).then((res) => {\r\n if (res.code == 0) {\r\n this.$message({\r\n type: 'success',\r\n message: '创建并发送成功!'\r\n });\r\n } else {\r\n this.$message({\r\n type: 'error',\r\n message: res.data\r\n });\r\n }\r\n }).catch((error) => {\r\n this.$message({\r\n type: 'error',\r\n message: '创建密码失败!'\r\n });\r\n this.loading = false\r\n })\r\n }, 1000),\r\n\r\n /** 删除按钮操作 */\r\n handleDelete() {\r\n const _selectData = this.$refs.userTable.getRadioRecord(true)\r\n if (_selectData == null) {\r\n this.$message({\r\n type: 'warning',\r\n message: '请选择记录!'\r\n });\r\n return\r\n }\r\n if (_selectData.id == 1) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置系统管理员不能删除!'\r\n });\r\n return\r\n }\r\n if (_selectData.id == 2) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置审计管理员不能删除!'\r\n });\r\n return\r\n }\r\n if (_selectData.id == 24) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置审核管理员不能删除!'\r\n });\r\n return\r\n }\r\n this.$prompt('请输入密码', '鉴别操作', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputType: 'password',\r\n // customClass:'no-autofill-pwd',\r\n inputValidator: (val) => {\r\n if (val === null || val.length < 1 || val.length > 20) {\r\n return false;\r\n }\r\n },\r\n inputErrorMessage: '不能为空,最多可录入20个字符',\r\n beforeClose(action, instance, done) {\r\n if (action === \"confirm\") {\r\n instance.$refs[\"confirm\"].$el.onclick = (function (e) {\r\n e = e || window.event;\r\n if (e.detail != 0) {\r\n done();\r\n }\r\n })();\r\n } else {\r\n done();\r\n }\r\n }\r\n }).then(async ({value}) => {\r\n this.doDelete(_selectData, value)\r\n }).catch((e) => {\r\n })\r\n },\r\n /**\r\n * 删除提交\r\n */\r\n doDelete: debounce(async function (_selectData, againPwd) {\r\n let sysTime\r\n let lk\r\n await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n })\r\n\r\n const param = {\r\n id: _selectData.id,\r\n againPwd: againPwd,\r\n sysTime: sysTime,\r\n lk: lk\r\n }\r\n await this.$axios.post('/sysUserController/delUser', param).then((res) => {\r\n if (res.code == 0) {\r\n this.$message({\r\n type: 'success',\r\n message: res.data\r\n });\r\n this.getList();\r\n } else {\r\n this.$message({\r\n type: 'error',\r\n message: res.data\r\n });\r\n }\r\n }).catch((error) => {\r\n this.$message({\r\n type: 'error',\r\n message: '删除失败!'\r\n });\r\n this.loading = false\r\n })\r\n }, 500),\r\n /** 修改按钮操作 */\r\n handleUpdate() {\r\n this.reset();\r\n let _selectData = this.$refs.userTable.getRadioRecord(true)\r\n if (_selectData == null) {\r\n this.$message({\r\n type: 'warning',\r\n message: '请选择记录!'\r\n });\r\n return\r\n }\r\n if (_selectData.id == 1) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置系统管理员不能修改!'\r\n });\r\n return\r\n }\r\n if (_selectData.id == 2) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置审计管理员不能修改!'\r\n });\r\n return\r\n }\r\n if (_selectData.id == 24) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置审核管理员不能修改!'\r\n });\r\n return\r\n }\r\n if (_selectData.status == 2) {\r\n this.$message({\r\n type: 'warning',\r\n message: '注销的账号不能操作!'\r\n });\r\n return\r\n }\r\n if (_selectData.signstr == '1') {\r\n this.$message({\r\n type: 'warning',\r\n message: '存在待审核,审核管理员审核后请刷新列表'\r\n });\r\n return\r\n }\r\n this.form = _selectData;\r\n this.open = true;\r\n this.title = \"修改用户\";\r\n this.edit = true;\r\n },\r\n\r\n // 取消按钮\r\n lockformcancel() {\r\n this.lockopen = false;\r\n this.lockform = {}\r\n },\r\n sublockform(){\r\n if (this.lockform.expDate==null || this.lockform.expDate==undefined){\r\n this.$message({\r\n type: 'warning',\r\n message: '请选择截止日期!'\r\n });\r\n return\r\n }\r\n if (this.lockform.password==null || this.lockform.password==undefined){\r\n this.$message({\r\n type: 'warning',\r\n message: '请输入登录密码!'\r\n });\r\n return\r\n }\r\n const _selectData = this.$refs.userTable.getRadioRecord(true)\r\n this.doRelock(_selectData, this.lockform.password,this.lockform.expDate)\r\n },\r\n /** 解锁按钮操作 */\r\n handleRelock() {\r\n const _selectData = this.$refs.userTable.getRadioRecord(true)\r\n if (_selectData == null) {\r\n this.$message({\r\n type: 'warning',\r\n message: '请选择记录!'\r\n });\r\n return\r\n }\r\n if (_selectData.status == 2) {\r\n this.$message({\r\n type: 'warning',\r\n message: '注销的账号不能操作!'\r\n });\r\n return\r\n }\r\n if (_selectData.status !== '1') {\r\n this.$message({\r\n type: 'warning',\r\n message: '只能对【锁定】状态的进行解锁!'\r\n });\r\n return\r\n }\r\n if (_selectData.signstr == '1') {\r\n this.$message({\r\n type: 'warning',\r\n message: '存在待审核,审核管理员审核后请刷新列表'\r\n });\r\n return\r\n }\r\n\r\n // 判断是否临时账号\r\n if (_selectData.expDate){\r\n this.lockopen = true\r\n }\r\n else{\r\n this.$prompt('请输入登录密码', '鉴别操作', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputType: 'password',\r\n // customClass:'no-autofill-pwd',\r\n inputValidator: (val) => {\r\n if (val === null || val.length < 1 || val.length > 20) {\r\n return false;\r\n }\r\n },\r\n inputErrorMessage: '不能为空,最多可录入20个字符',\r\n beforeClose(action, instance, done) {\r\n if (action === \"confirm\") {\r\n instance.$refs[\"confirm\"].$el.onclick = (function (e) {\r\n e = e || window.event;\r\n if (e.detail != 0) {\r\n done();\r\n }\r\n })();\r\n } else {\r\n done();\r\n }\r\n }\r\n }).then(async ({value}) => {\r\n this.doRelock(_selectData, value)\r\n }).catch((e) => {\r\n })\r\n }\r\n },\r\n /**\r\n * 解锁提交\r\n */\r\n doRelock: debounce(async function (_selectData, againPwd,expDate) {\r\n let sysTime\r\n let lk\r\n await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n })\r\n const param = {\r\n id: _selectData.id,\r\n againPwd: againPwd,\r\n expDate:expDate,\r\n sysTime: sysTime,\r\n lk: lk\r\n }\r\n await this.$axios.post('/sysUserController/relockUser', param).then((res) => {\r\n if (res.code == 0) {\r\n this.$message({\r\n type: 'success',\r\n message: res.data\r\n });\r\n this.getList();\r\n this.lockformcancel();\r\n } else {\r\n this.$message({\r\n type: 'error',\r\n message: res.data\r\n });\r\n }\r\n }).catch((error) => {\r\n this.$message({\r\n type: 'error',\r\n message: '解锁失败!'\r\n });\r\n this.loading = false\r\n })\r\n }, 1000),\r\n\r\n /**\r\n * 角色类型改变时更改权限列表\r\n * @param rowRoleId\r\n * @returns {Promise<unknown>}\r\n */\r\n getMenu(rowRoleId){\r\n const a = this.$axios\r\n const _this = this\r\n return new Promise(async function (resolve, reject) {\r\n let sysTime\r\n let lk\r\n await a.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n })\r\n\r\n\r\n var param1 = {\r\n roleId: rowRoleId,\r\n sysTime: sysTime,\r\n lk: lk\r\n }\r\n\r\n await a.get('/sysMenuController/roleMenuTreeselectForUser',\r\n {params: param1}).then((res) => {\r\n _this.menuOptions = res.data.menus;\r\n })\r\n }).catch((error) => {\r\n console.error('获取用户角色出错' + error)\r\n })\r\n },\r\n getUserRole(userid) {\r\n const a = this.$axios\r\n const _this = this\r\n return new Promise(async function (resolve, reject) {\r\n let sysTime\r\n let lk\r\n await a.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n })\r\n\r\n var userRoleParams = {\r\n userId: userid,\r\n sysTime: sysTime,\r\n lk: lk\r\n }\r\n await a.get('/sysUserController/getUserRole',\r\n {params: userRoleParams}).then(res => {\r\n if (res.data==undefined){\r\n _this.userRoleId = ''\r\n }\r\n else{\r\n _this.userRoleId = res.data.roleId\r\n }\r\n // 返回userRole对象\r\n resolve(res.data)\r\n })\r\n\r\n let sysTime1\r\n let lk1\r\n await a.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime1 = res.data.sysTime\r\n lk1 = res.data.lk\r\n }).catch((error) => {\r\n })\r\n var param1 = {\r\n roleId: _this.userRoleId,\r\n sysTime: sysTime1,\r\n lk: lk1\r\n }\r\n\r\n await a.get('/sysMenuController/roleMenuTreeselectForUser',\r\n {params: param1}).then((res) => {\r\n _this.menuOptions = res.data.menus;\r\n })\r\n }).catch((error) => {\r\n console.error('获取用户角色出错' + error)\r\n })\r\n },\r\n getRoleByType(usertype) {\r\n // 根据用户类型获取角色列表\r\n const a = this.$axios\r\n let _this = this\r\n return new Promise(async function (resolve, reject) {\r\n let sysTime\r\n let lk\r\n await a.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n })\r\n\r\n var searchParams = {\r\n usertype: usertype,\r\n sysTime: sysTime,\r\n lk: lk\r\n }\r\n await a.get('/sysRoleController/getRoleByType',\r\n {params: searchParams}).then(res => {\r\n if (res.code == 0) {\r\n // 返回角色列表\r\n _this.roleList = res.data\r\n resolve(res.data)\r\n } else {\r\n // 输出后端返回信息\r\n this.$message({\r\n type: 'error',\r\n message: res.data\r\n });\r\n }\r\n })\r\n }).catch((error) => {\r\n this.loading = false\r\n this.$message.error(error)\r\n })\r\n },\r\n /** 分配角色操作 */\r\n handleAuthRole: debounce(function (row) {\r\n if (this.sysRole.roleKey=='XTGL' && row.usertype=='1'){\r\n // 系统管理员不能给业务用户分配权限\r\n this.$message({\r\n type: 'warning',\r\n message: '系统管理员不能给业务用户分配权限,请业务管理员进行分配!'\r\n });\r\n return\r\n }\r\n if (row.id == 1) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置系统管理员不能分配角色!'\r\n });\r\n return\r\n }\r\n if (row.id == 2) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置审计管理员不能分配角色!'\r\n });\r\n return\r\n }\r\n if (row.id == 24) {\r\n this.$message({\r\n type: 'warning',\r\n message: '内置审核管理员不能分配角色!'\r\n });\r\n return\r\n }\r\n if (row.status == '2') {\r\n this.$message({\r\n type: 'warning',\r\n message: '注销的账号不能操作!'\r\n });\r\n return\r\n }\r\n if (row.signstr == '1') {\r\n this.$message({\r\n type: 'warning',\r\n message: '存在待审核,审核管理员审核后请刷新列表'\r\n });\r\n return\r\n }\r\n\r\n this.jsuserid = row.id\r\n this.jsusername = row.username\r\n this.jsnickname = row.nickname\r\n\r\n this.getRoleByType(row.usertype)\r\n this.getUserRole(this.jsuserid)\r\n this.jsopen = true;\r\n this.title = \"分配角色\";\r\n // Promise.all([this.getRoleByType(row.usertype), this.getUserRole(this.jsuserid)]).then((res) => {\r\n // if (res[1] != '' && res[1] != undefined) {\r\n // const roleTable = this.$refs.xTable.getTableData()\r\n // for (var i = 0; i < roleTable.tableData.length; i++) {\r\n // if (res[1].roleId == roleTable.tableData[i].roleId) {\r\n // // 将原有的角色勾选上\r\n // this.$refs.xTable.setCheckboxRow(roleTable.tableData[i], true)\r\n // }\r\n // }\r\n // }\r\n // }).catch(e => {\r\n // this.loading = false\r\n // this.$message.error(\"获取分配角色异常:\" + e)\r\n // })\r\n }, 1000),\r\n\r\n\r\n /** 角色分配提交按钮 */\r\n jssubmitForm: debounce(async function () {\r\n this.$prompt('请输入登录密码', '鉴别操作', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputType: 'password',\r\n // customClass:'no-autofill-pwd',\r\n inputValidator: (val) => {\r\n if (val === null || val.length < 1 || val.length > 20) {\r\n return false;\r\n }\r\n },\r\n inputErrorMessage: '不能为空,最多可录入20个字符',\r\n beforeClose(action, instance, done) {\r\n if (action === \"confirm\") {\r\n instance.$refs[\"confirm\"].$el.onclick = (function (e) {\r\n e = e || window.event;\r\n if (e.detail != 0) {\r\n done();\r\n }\r\n })();\r\n } else {\r\n done();\r\n }\r\n }\r\n }).then(async ({value}) => {\r\n let sysTime\r\n let lk\r\n await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {\r\n sysTime = res.data.sysTime\r\n lk = res.data.lk\r\n }).catch((error) => {\r\n })\r\n\r\n // 提交后台角色分配\r\n const param = {\r\n userId: this.jsuserid,\r\n roleId: this.userRoleId,\r\n sysTime: sysTime,\r\n lk: lk,\r\n againPwd: value\r\n }\r\n await this.$axios.post('/sysUserController/authRole', param).then((res) => {\r\n if (res.code == 0) {\r\n this.$message({\r\n type: 'success',\r\n message: res.data\r\n });\r\n this.jscancel()\r\n this.getList()\r\n } else {\r\n this.$message({\r\n type: 'error',\r\n message: res.data\r\n });\r\n }\r\n }).catch((error) => {\r\n this.$message({\r\n type: 'error',\r\n message: '角色分配失败!'\r\n });\r\n this.loading = false\r\n })\r\n }).catch((e) => {\r\n })\r\n }, 1000)\r\n }\r\n};\r\n</script>\r\n<!--<style rel=\"stylesheet/scss\" lang=\"scss\">-->\r\n<!--.no-autofill-pwd{-->\r\n<!-- .el-message-box__content{-->\r\n<!-- .el-input__inner{-->\r\n<!-- text-security:disc!important;-->\r\n<!-- -webkit-text-security:disc!important;-->\r\n<!-- }-->\r\n<!-- }-->\r\n<!--}-->\r\n<!--</style>-->\r\n"]}]}