LoginData.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/game/data/LoginData.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
  12. cc._RF.push(module, '7d48aywt1tPXI2eRhRzXwYP', 'LoginData');
  13. // script/game/data/LoginData.ts
  14. "use strict";
  15. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  16. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  17. return new (P || (P = Promise))(function (resolve, reject) {
  18. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  19. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  20. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  21. step((generator = generator.apply(thisArg, _arguments || [])).next());
  22. });
  23. };
  24. var __generator = (this && this.__generator) || function (thisArg, body) {
  25. var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
  26. return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
  27. function verb(n) { return function (v) { return step([n, v]); }; }
  28. function step(op) {
  29. if (f) throw new TypeError("Generator is already executing.");
  30. while (_) try {
  31. if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
  32. if (y = 0, t) op = [op[0] & 2, t.value];
  33. switch (op[0]) {
  34. case 0: case 1: t = op; break;
  35. case 4: _.label++; return { value: op[1], done: false };
  36. case 5: _.label++; y = op[1]; op = [0]; continue;
  37. case 7: op = _.ops.pop(); _.trys.pop(); continue;
  38. default:
  39. if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
  40. if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
  41. if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
  42. if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
  43. if (t[2]) _.ops.pop();
  44. _.trys.pop(); continue;
  45. }
  46. op = body.call(thisArg, _);
  47. } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
  48. if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
  49. }
  50. };
  51. Object.defineProperty(exports, "__esModule", { value: true });
  52. exports.LoginData = void 0;
  53. var StorageData_1 = require("./StorageData");
  54. /**
  55. * @description 登录数据
  56. * @author 邹勇
  57. */
  58. var LoginData = /** @class */ (function () {
  59. function LoginData() {
  60. this.loadResCompelete = false;
  61. /** 是否登录 */
  62. this.isLogin = false;
  63. this.sessionKey = '';
  64. /** 玩家唯一id */
  65. this.uin = '';
  66. /** 玩家临时id */
  67. this.tempUin = '';
  68. this.loginTicket = '';
  69. }
  70. /**
  71. * 初始化本地配置
  72. * @returns
  73. */
  74. LoginData.prototype.loadLocalRes = function () {
  75. this.loadResCompelete = true;
  76. };
  77. /**
  78. * 登录流程 initApp-->initAd-->connect-->wxLogin-->checkLogin-->getAccountInfo
  79. */
  80. LoginData.prototype.login = function () {
  81. return __awaiter(this, void 0, void 0, function () {
  82. var ranKey, data, response, encode, isFirstIn, tmp_key;
  83. return __generator(this, function (_a) {
  84. switch (_a.label) {
  85. case 0:
  86. this.isLogin = true;
  87. g.appData.init();
  88. g.adData.init();
  89. //有登录记录直接跳转到登录流程最后一步
  90. if (this.sessionKey != '' && this.uin != '') {
  91. this.getAccountInfo();
  92. return [2 /*return*/];
  93. }
  94. ranKey = mk.encrypt.randomString();
  95. data = {
  96. "mac": g.appData.mac,
  97. "psk": ranKey,
  98. "appId": g.appData.appId
  99. };
  100. return [4 /*yield*/, mk.http.sendRequest('connectTest', 'POST', JSON.stringify(data))];
  101. case 1:
  102. response = _a.sent();
  103. if (response.errcode != 0) {
  104. return [2 /*return*/];
  105. }
  106. data = mk.encrypt.decrypt(response.encrypt, ranKey, g.appData.appId);
  107. this.tempUin = JSON.parse(data).tmp_uin;
  108. if (g.wechatData.code != null) { //微信登录
  109. encode = mk.encrypt.encrypt(JSON.stringify({ "code": g.wechatData.code }), this.sessionKey, g.appData.appId);
  110. data = {
  111. "uin": this.uin,
  112. "encrypt": encode
  113. };
  114. }
  115. else { //游客登录
  116. encode = mk.encrypt.encrypt(JSON.stringify({ "code": g.wechatData.code }), ranKey, g.appData.appId);
  117. data = {
  118. "uin": this.tempUin,
  119. "encrypt": encode
  120. };
  121. }
  122. return [4 /*yield*/, mk.http.sendRequest('wxlogin', 'POST', JSON.stringify(data), false, false)];
  123. case 2:
  124. response = _a.sent();
  125. if (response.errcode != 0) {
  126. return [2 /*return*/];
  127. }
  128. if (g.wechatData.code != null) {
  129. data = mk.encrypt.decrypt(response.encrypt, this.sessionKey, g.appData.appId);
  130. }
  131. else {
  132. data = mk.encrypt.decrypt(response.encrypt, ranKey, g.appData.appId);
  133. }
  134. data = JSON.parse(data);
  135. this.loginTicket = data.login_ticket;
  136. mk.storage.setStorage(StorageData_1.StorageKey.loginTicket, this.loginTicket);
  137. isFirstIn = mk.storage.getStorage('isFirstIn');
  138. if (isFirstIn == null) {
  139. this.isFirstIn = true;
  140. mk.storage.setStorage(StorageData_1.StorageKey.isFirstIn, 1);
  141. }
  142. if (this.uin != data.uin) {
  143. this.uin = data.uin;
  144. this.isNew = false;
  145. }
  146. else {
  147. this.isNew = true;
  148. }
  149. mk.storage.setStorage('uin', this.uin);
  150. tmp_key = '';
  151. if (g.wechatData.code != null) {
  152. tmp_key = this.sessionKey;
  153. }
  154. else {
  155. tmp_key = mk.encrypt.randomString();
  156. }
  157. data = {
  158. "tmp_key": tmp_key,
  159. "uin": this.uin,
  160. "login_ticket": this.loginTicket,
  161. "appId": g.appData.appId
  162. };
  163. return [4 /*yield*/, mk.http.sendRequest('checklogin', 'POST', JSON.stringify(data))];
  164. case 3:
  165. response = _a.sent();
  166. if (response.errcode != 0) {
  167. return [2 /*return*/];
  168. }
  169. if (g.wechatData.code != null) {
  170. data = mk.encrypt.decrypt(response.encrypt, this.sessionKey, g.appData.appId);
  171. }
  172. else {
  173. data = mk.encrypt.decrypt(response.encrypt, tmp_key, g.appData.appId);
  174. }
  175. data = JSON.parse(data);
  176. this.sessionKey = data.session_key;
  177. mk.storage.setStorage('sessionKey', this.sessionKey);
  178. if (g.wechatData.code != null) {
  179. if (this.isNew) { //玩过此游戏并且本地数据是本机的
  180. this.getAccountInfo();
  181. }
  182. else { //玩过此游戏 但 本地数据不是本账户的 清空数据 重新登录游戏
  183. this.isNew = false;
  184. g.wechatData.code = null;
  185. this.reload();
  186. }
  187. }
  188. else {
  189. this.getAccountInfo();
  190. }
  191. return [2 /*return*/];
  192. }
  193. });
  194. });
  195. };
  196. LoginData.prototype.getAccountInfo = function () {
  197. return __awaiter(this, void 0, void 0, function () {
  198. var nickname, aa, data, response;
  199. return __generator(this, function (_a) {
  200. switch (_a.label) {
  201. case 0:
  202. nickname = mk.storage.getStorage(StorageData_1.StorageKey.nickname);
  203. if (!nickname) return [3 /*break*/, 1];
  204. g.wechatData.nickName = nickname;
  205. return [3 /*break*/, 3];
  206. case 1:
  207. aa = {
  208. "uin": this.uin,
  209. "login_ticket": this.loginTicket
  210. };
  211. data = {
  212. "uin": this.uin,
  213. "encrypt": mk.encrypt.encrypt(JSON.stringify(aa), this.sessionKey, g.appData.appId)
  214. };
  215. return [4 /*yield*/, mk.http.sendRequest('user', 'POST', JSON.stringify(data), false, false)];
  216. case 2:
  217. response = _a.sent();
  218. if (response.errcode != 0) {
  219. return [2 /*return*/];
  220. }
  221. response = mk.http.checkData(response, true);
  222. data = response.data;
  223. this.isAuth = data.is_auth;
  224. if (this.isAuth) {
  225. g.wechatData.nickName = data.nickname;
  226. g.wechatData.avatar = data.headimgurl;
  227. mk.storage.setStorage(StorageData_1.StorageKey.isAuth, 1);
  228. mk.storage.setStorage(StorageData_1.StorageKey.nickname, g.wechatData.nickName, false);
  229. mk.storage.setStorage(StorageData_1.StorageKey.avatar, g.wechatData.avatar, false);
  230. }
  231. _a.label = 3;
  232. case 3:
  233. //获取游戏数据
  234. g.gameData.init();
  235. return [2 /*return*/];
  236. }
  237. });
  238. });
  239. };
  240. /**
  241. * 本地数据不是本账户的 清空数据 重新登录游戏
  242. */
  243. LoginData.prototype.reload = function () {
  244. };
  245. return LoginData;
  246. }());
  247. exports.LoginData = LoginData;
  248. cc._RF.pop();
  249. }
  250. if (nodeEnv) {
  251. __define(__module.exports, __require, __module);
  252. }
  253. else {
  254. __quick_compile_project__.registerModuleFunc(__filename, function () {
  255. __define(__module.exports, __require, __module);
  256. });
  257. }
  258. })();
  259. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcc2NyaXB0XFxnYW1lXFxkYXRhXFxMb2dpbkRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJDO0FBRTNDOzs7R0FHRztBQUNIO0lBQUE7UUFFVyxxQkFBZ0IsR0FBVyxLQUFLLENBQUM7UUFFeEMsV0FBVztRQUNKLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFekIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUUvQixhQUFhO1FBQ04sUUFBRyxHQUFXLEVBQUUsQ0FBQztRQUV4QixhQUFhO1FBQ04sWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUVyQixnQkFBVyxHQUFXLEVBQUUsQ0FBQztJQXdMcEMsQ0FBQztJQTdLRzs7O09BR0c7SUFDSyxnQ0FBWSxHQUFuQjtRQUVHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ1UseUJBQUssR0FBbEI7Ozs7Ozt3QkFDSSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzt3QkFDcEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFFaEIsb0JBQW9CO3dCQUNwQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFOzRCQUN6QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7NEJBQ3RCLHNCQUFPO3lCQUNWO3dCQUVHLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUNuQyxJQUFJLEdBQVE7NEJBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRzs0QkFDcEIsS0FBSyxFQUFFLE1BQU07NEJBQ2IsT0FBTyxFQUFFLENBQUMs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d0JBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzVDLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLHdCQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUN6RSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyx3QkFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQzt5QkFDeEU7Ozt3QkFHTCxRQUFRO3dCQUNSLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Ozs7O0tBQ3JCO0lBSUQ7O09BRUc7SUFDSywwQkFBTSxHQUFkO0lBRUEsQ0FBQztJQUNMLGdCQUFDO0FBQUQsQ0F2TUEsQUF1TUMsSUFBQTtBQXZNWSw4QkFBUyIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0b3JhZ2VLZXkgfSBmcm9tIFwiLi9TdG9yYWdlRGF0YVwiO1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiDnmbvlvZXmlbDmja5cclxuICogQGF1dGhvciDpgrnli4dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBMb2dpbkRhdGEge1xyXG5cclxuICAgIHB1YmxpYyBsb2FkUmVzQ29tcGVsZXRlOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiog5piv5ZCm55m75b2VICovXHJcbiAgICBwdWJsaWMgaXNMb2dpbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBzZXNzaW9uS2V5OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgICAvKiog546p5a625ZSv5LiAaWQgKi9cclxuICAgIHB1YmxpYyB1aW46IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIC8qKiDnjqnlrrbkuLTml7ZpZCAqL1xyXG4gICAgcHVibGljIHRlbXBVaW46IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIHB1YmxpYyBsb2dpblRpY2tldDogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgcHVibGljIGlzRmlyc3RJbjogYm9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgaXNOZXc6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqIOaYr+WQpuaOiOadgyAqL1xyXG4gICAgcHVibGljIGlzQXV0aDogYm9vbGVhbjtcclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5pys5Zyw6YWN572uXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyBsb2FkTG9jYWxSZXMoKXtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmxvYWRSZXNDb21wZWxldGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55m75b2V5rWB56iLIGluaXRBcHAtLT5pbml0QWQtLT5jb25uZWN0LS0+d3hMb2dpbi0tPmNoZWNrTG9naW4tLT5nZXRBY2NvdW50SW5mb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9naW4oKSB7XHJcbiAgICAgICAgdGhpcy5pc0xvZ2luID0gdHJ1ZTtcclxuICAgICAgICBnLmFwcERhdGEuaW5pdCgpO1xyXG4gICAgICAgIGcuYWREYXRhLmluaXQoKTtcclxuXHJcbiAgICAgICAgLy/mnInnmbvlvZXorrDlvZXnm7TmjqXot7PovazliLDnmbvlvZXmtYHnqIvmnIDlkI7kuIDmraVcclxuICAgICAgICBpZiAodGhpcy5zZXNzaW9uS2V5ICE9ICcnICYmIHRoaXMudWluICE9ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudEluZm8oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJhbktleSA9IG1rLmVuY3J5cHQucmFuZG9tU3RyaW5nKCk7XHJcbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgICAgICAgXCJtYWNcIjogZy5hcHBEYXRhLm1hYyxcclxuICAgICAgICAgICAgXCJwc2tcIjogcmFuS2V5LFxyXG4gICAgICAgICAgICBcImFwcElkXCI6IGcuYXBwRGF0YS5hcHBJZFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jb25uZWN0XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgbWsuaHR0cC5zZW5kUmVxdWVzdCgnY29ubmVjdFRlc3QnLCAnUE9TVCcsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyY29kZSAhPSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YSA9IG1rLmVuY3J5cHQuZGVjcnlwdChyZXNwb25zZS5lbmNyeXB0LCByYW5LZXksIGcuYXBwRGF0YS5hcHBJZCk7XHJcbiAgICAgICAgdGhpcy50ZW1wVWluID0gSlNPTi5wYXJzZShkYXRhKS50bXBfdWluO1xyXG5cclxuICAgICAgICAvL3d4TG9naW5cclxuICAgICAgICBsZXQgZW5jb2RlO1xyXG4gICAgICAgIGlmIChnLndlY2hhdERhdGEuY29kZSAhPSBudWxsKSB7Ly/lvq7kv6HnmbvlvZVcclxuICAgICAgICAgICAgZW5jb2RlID0gbWsuZW5jcnlwdC5lbmNyeXB0KEpTT04uc3RyaW5naWZ5KHsgXCJjb2RlXCI6IGcud2VjaGF0RGF0YS5jb2RlIH0pLCB0aGlzLnNlc3Npb25LZXksIGcuYXBwRGF0YS5hcHBJZCk7XHJcbiAgICAgICAgICAgIGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBcInVpblwiOiB0aGlzLnVpbixcclxuICAgICAgICAgICAgICAgIFwiZW5jcnlwdFwiOiBlbmNvZGVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7Ly/muLjlrqLnmbvlvZVcclxuICAgICAgICAgICAgZW5jb2RlID0gbWsuZW5jcnlwdC5lbmNyeXB0KEpTT04uc3RyaW5naWZ5KHsgXCJjb2RlXCI6IGcud2VjaGF0RGF0YS5jb2RlIH0pLCByYW5LZXksIGcuYXBwRGF0YS5hcHBJZCk7XHJcbiAgICAgICAgICAgIGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBcInVpblwiOiB0aGlzLnRlbXBVaW4sXHJcbiAgICAgICAgICAgICAgICBcImVuY3J5cHRcIjogZW5jb2RlXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgbWsuaHR0cC5zZW5kUmVxdWVzdCgnd3hsb2dpbicsICdQT1NUJywgSlNPTi5zdHJpbmdpZnkoZGF0YSksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycmNvZGUgIT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChnLndlY2hhdERhdGEuY29kZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBtay5lbmNyeXB0LmRlY3J5cHQocmVzcG9uc2UuZW5jcnlwdCwgdGhpcy5zZXNzaW9uS2V5LCBnLmFwcERhdGEuYXBwSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YSA9IG1rLmVuY3J5cHQuZGVjcnlwdChyZXNwb25zZS5lbmNyeXB0LCByYW5LZXksIGcuYXBwRGF0YS5hcHBJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIHRoaXMubG9naW5UaWNrZXQgPSBkYXRhLmxvZ2luX3RpY2tldDtcclxuICAgICAgICBtay5zdG9yYWdlLnNldFN0b3JhZ2UoU3RvcmFnZUtleS5sb2dpblRpY2tldCwgdGhpcy5sb2dpblRpY2tldCk7XHJcblxyXG4gICAgICAgIGxldCBpc0ZpcnN0SW4gPSBtay5zdG9yYWdlLmdldFN0b3JhZ2UoJ2lzRmlyc3RJbicpO1xyXG4gICAgICAgIGlmIChpc0ZpcnN0SW4gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzRmlyc3RJbiA9IHRydWU7XHJcbiAgICAgICAgICAgIG1rLnN0b3JhZ2Uuc2V0U3RvcmFnZShTdG9yYWdlS2V5LmlzRmlyc3RJbiwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy51aW4gIT0gZGF0YS51aW4pIHtcclxuICAgICAgICAgICAgdGhpcy51aW4gPSBkYXRhLnVpbjtcclxuICAgICAgICAgICAgdGhpcy5pc05ldyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc05ldyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1rLnN0b3JhZ2Uuc2V0U3RvcmFnZSgndWluJywgdGhpcy51aW4pO1xyXG5cclxuICAgICAgICAvL2NoZWNrTG9naW5cclxuICAgICAgICBsZXQgdG1wX2tleSA9ICcnO1xyXG4gICAgICAgIGlmIChnLndlY2hhdERhdGEuY29kZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRtcF9rZXkgPSB0aGlzLnNlc3Npb25LZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0bXBfa2V5ID0gbWsuZW5jcnlwdC5yYW5kb21TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGEgPSB7XHJcbiAgICAgICAgICAgIFwidG1wX2tleVwiOiB0bXBfa2V5LFxyXG4gICAgICAgICAgICBcInVpblwiOiB0aGlzLnVpbixcclxuICAgICAgICAgICAgXCJsb2dpbl90aWNrZXRcIjogdGhpcy5sb2dpblRpY2tldCxcclxuICAgICAgICAgICAgXCJhcHBJZFwiOiBnLmFwcERhdGEuYXBwSWRcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBtay5odHRwLnNlbmRSZXF1ZXN0KCdjaGVja2xvZ2luJywgJ1BPU1QnLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycmNvZGUgIT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChnLndlY2hhdERhdGEuY29kZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBtay5lbmNyeXB0LmRlY3J5cHQocmVzcG9uc2UuZW5jcnlwdCwgdGhpcy5zZXNzaW9uS2V5LCBnLmFwcERhdGEuYXBwSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YSA9IG1rLmVuY3J5cHQuZGVjcnlwdChyZXNwb25zZS5lbmNyeXB0LCB0bXBfa2V5LCBnLmFwcERhdGEuYXBwSWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uS2V5ID0gZGF0YS5zZXNzaW9uX2tleTtcclxuXHJcbiAgICAgICAgbWsuc3RvcmFnZS5zZXRTdG9yYWdlKCdzZXNzaW9uS2V5JywgdGhpcy5zZXNzaW9uS2V5KTtcclxuXHJcbiAgICAgICAgaWYgKGcud2VjaGF0RGF0YS5jb2RlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNOZXcpIHsvL+eOqei/h+atpOa4uOaIj+W5tuS4lOacrOWcsOaVsOaNruaYr+acrOacuueahFxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50SW5mbygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Ugey8v546p6L+H5q2k5ri45oiPIOS9hiDmnKzlnLDmlbDmja7kuI3mmK/mnKzotKbmiLfnmoQg5riF56m65pWw5o2uIOmHjeaWsOeZu+W9lea4uOaIj1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc05ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZy53ZWNoYXREYXRhLmNvZGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50SW5mbygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEFjY291bnRJbmZvKCkge1xyXG4gICAgICAgIGxldCBuaWNrbmFtZSA9IG1rLnN0b3JhZ2UuZ2V0U3RvcmFnZShTdG9yYWdlS2V5Lm5pY2tuYW1lKTtcclxuICAgICAgICBpZiAobmlja25hbWUpIHtcclxuICAgICAgICAgICAgZy53ZWNoYXREYXRhLm5pY2tOYW1lID0gbmlja25hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYWEgPSB7XHJcbiAgICAgICAgICAgICAgICBcInVpblwiOiB0aGlzLnVpbixcclxuICAgICAgICAgICAgICAgIFwibG9naW5fdGlja2V0XCI6IHRoaXMubG9naW5UaWNrZXRcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgICAgICAgICAgICBcInVpblwiOiB0aGlzLnVpbixcclxuICAgICAgICAgICAgICAgIFwiZW5jcnlwdFwiOiBtay5lbmNyeXB0LmVuY3J5cHQoSlNPTi5zdHJpbmdpZnkoYWEpLCB0aGlzLnNlc3Npb25LZXksIGcuYXBwRGF0YS5hcHBJZClcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IG1rLmh0dHAuc2VuZFJlcXVlc3QoJ3VzZXInLCAnUE9TVCcsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyY29kZSAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBtay5odHRwLmNoZWNrRGF0YShyZXNwb25zZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgICB0aGlzLmlzQXV0aCA9IGRhdGEuaXNfYXV0aDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNBdXRoKSB7XHJcbiAgICAgICAgICAgICAgICBnLndlY2hhdERhdGEubmlja05hbWUgPSBkYXRhLm5pY2tuYW1lO1xyXG4gICAgICAgICAgICAgICAgZy53ZWNoYXREYXRhLmF2YXRhciA9IGRhdGEuaGVhZGltZ3VybDtcclxuICAgICAgICAgICAgICAgIG1rLnN0b3JhZ2Uuc2V0U3RvcmFnZShTdG9yYWdlS2V5LmlzQXV0aCwgMSk7XHJcbiAgICAgICAgICAgICAgICBtay5zdG9yYWdlLnNldFN0b3JhZ2UoU3RvcmFnZUtleS5uaWNrbmFtZSwgZy53ZWNoYXREYXRhLm5pY2tOYW1lLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBtay5zdG9yYWdlLnNldFN0b3JhZ2UoU3RvcmFnZUtleS5hdmF0YXIsIGcud2VjaGF0RGF0YS5hdmF0YXIsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy/ojrflj5bmuLjmiI/mlbDmja5cclxuICAgICAgICBnLmdhbWVEYXRhLmluaXQoKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pys5Zyw5pWw5o2u5LiN5piv5pys6LSm5oi355qEIOa4heepuuaVsOaNriDph43mlrDnmbvlvZXmuLjmiI9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWxvYWQoKSB7XHJcblxyXG4gICAgfVxyXG59Il19