name-password-strategy.service.js 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import * as tslib_1 from "tslib";
  6. import { Injectable } from '@angular/core';
  7. import { NbAuthIllegalTokenError, NbAuthResult, NbAuthStrategy } from '@nebular/auth';
  8. import { of as observableOf } from 'rxjs';
  9. import { switchMap, map, catchError, concatAll } from 'rxjs/operators';
  10. import { HttpClient, HttpErrorResponse } from '@angular/common/http';
  11. import { ActivatedRoute } from '@angular/router';
  12. import { namePasswordStrategyOptions } from './name-password-strategy-option';
  13. import * as JSEncrypt from 'jsencrypt';
  14. var ResultError = /** @class */ (function () {
  15. function ResultError(message) {
  16. this.message = message;
  17. }
  18. return ResultError;
  19. }());
  20. export { ResultError };
  21. if (false) {
  22. /** @type {?} */
  23. ResultError.prototype.message;
  24. }
  25. var NamePasswordStrategyService = /** @class */ (function (_super) {
  26. tslib_1.__extends(NamePasswordStrategyService, _super);
  27. function NamePasswordStrategyService(http, route) {
  28. var _this = _super.call(this) || this;
  29. _this.http = http;
  30. _this.route = route;
  31. _this.defaultOptions = namePasswordStrategyOptions;
  32. return _this;
  33. }
  34. /**
  35. * @param {?} options
  36. * @return {?}
  37. */
  38. NamePasswordStrategyService.setup = /**
  39. * @param {?} options
  40. * @return {?}
  41. */
  42. function (options) {
  43. return [NamePasswordStrategyService, options];
  44. };
  45. /**
  46. * @param {?=} data
  47. * @return {?}
  48. */
  49. NamePasswordStrategyService.prototype.authenticate = /**
  50. * @param {?=} data
  51. * @return {?}
  52. */
  53. function (data) {
  54. var _this = this;
  55. /** @type {?} */
  56. var module = 'login';
  57. /** @type {?} */
  58. var method = this.getOption(module + ".method");
  59. /** @type {?} */
  60. var url = this.getActionEndpoint(module);
  61. /** @type {?} */
  62. var requireValidToken = this.getOption(module + ".requireValidToken");
  63. return this.getEncryptPassword(data.loginPassword).pipe(map((/**
  64. * @param {?} body
  65. * @return {?}
  66. */
  67. function (body) {
  68. body.loginID = data.loginId;
  69. return _this.http.request(method, url, { body: body, observe: 'response' })
  70. .pipe(map((/**
  71. * @param {?} res
  72. * @return {?}
  73. */
  74. function (res) {
  75. if (_this.getOption(module + ".alwaysFail")) {
  76. throw _this.createFailResponse(data);
  77. }
  78. else if (!_this.getOption('success.getter')(module, res, _this.options)) {
  79. throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
  80. }
  81. return res;
  82. })), map((/**
  83. * @param {?} res
  84. * @return {?}
  85. */
  86. function (res) {
  87. return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
  88. })), catchError((/**
  89. * @param {?} res
  90. * @return {?}
  91. */
  92. function (res) {
  93. return _this.handleResponseError(res, module);
  94. })));
  95. })), concatAll());
  96. };
  97. /**
  98. * @return {?}
  99. */
  100. NamePasswordStrategyService.prototype.logout = /**
  101. * @return {?}
  102. */
  103. function () {
  104. var _this = this;
  105. /** @type {?} */
  106. var module = 'logout';
  107. /** @type {?} */
  108. var method = this.getOption(module + ".method");
  109. /** @type {?} */
  110. var url = this.getActionEndpoint(module);
  111. return observableOf({})
  112. .pipe(switchMap((/**
  113. * @param {?} res
  114. * @return {?}
  115. */
  116. function (res) {
  117. if (!url) {
  118. return observableOf(res);
  119. }
  120. return _this.http.request(method, url, { observe: 'response' });
  121. })), map((/**
  122. * @param {?} res
  123. * @return {?}
  124. */
  125. function (res) {
  126. if (_this.getOption(module + ".alwaysFail")) {
  127. throw _this.createFailResponse();
  128. }
  129. return res;
  130. })), map((/**
  131. * @param {?} res
  132. * @return {?}
  133. */
  134. function (res) {
  135. return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
  136. })), catchError((/**
  137. * @param {?} res
  138. * @return {?}
  139. */
  140. function (res) {
  141. return _this.handleResponseError(res, module);
  142. })));
  143. };
  144. /**
  145. * @param {?=} data
  146. * @return {?}
  147. */
  148. NamePasswordStrategyService.prototype.refreshToken = /**
  149. * @param {?=} data
  150. * @return {?}
  151. */
  152. function (data) {
  153. return undefined;
  154. };
  155. /**
  156. * @param {?=} data
  157. * @return {?}
  158. */
  159. NamePasswordStrategyService.prototype.register = /**
  160. * @param {?=} data
  161. * @return {?}
  162. */
  163. function (data) {
  164. return undefined;
  165. };
  166. /**
  167. * @param {?=} data
  168. * @return {?}
  169. */
  170. NamePasswordStrategyService.prototype.requestPassword = /**
  171. * @param {?=} data
  172. * @return {?}
  173. */
  174. function (data) {
  175. return undefined;
  176. };
  177. /**
  178. * @param {?=} data
  179. * @return {?}
  180. */
  181. NamePasswordStrategyService.prototype.resetPassword = /**
  182. * @param {?=} data
  183. * @return {?}
  184. */
  185. function (data) {
  186. var _this = this;
  187. /** @type {?} */
  188. var module = 'resetPass';
  189. /** @type {?} */
  190. var method = this.getOption(module + ".method");
  191. /** @type {?} */
  192. var url = this.getActionEndpoint(module);
  193. return this.getEncryptPassword(data.loginPasswordNew + '-' + data.loginPasswordOld).pipe(map((/**
  194. * @param {?} body
  195. * @return {?}
  196. */
  197. function (body) {
  198. body.passwordData = body.loginPassword;
  199. return _this.http.request(method, url, { body: body, observe: 'response' })
  200. .pipe(map((/**
  201. * @param {?} res
  202. * @return {?}
  203. */
  204. function (res) {
  205. if (_this.getOption(module + ".alwaysFail")) {
  206. throw _this.createFailResponse(data);
  207. }
  208. else if (!_this.getOption('success.getter')(module, res, _this.options)) {
  209. throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
  210. }
  211. return res;
  212. })), map((/**
  213. * @param {?} res
  214. * @return {?}
  215. */
  216. function (res) {
  217. return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
  218. })), catchError((/**
  219. * @param {?} res
  220. * @return {?}
  221. */
  222. function (res) {
  223. return _this.handleResponseError(res, module);
  224. })));
  225. })), concatAll());
  226. };
  227. /**
  228. * @param {?=} data
  229. * @return {?}
  230. */
  231. NamePasswordStrategyService.prototype.createUser = /**
  232. * @param {?=} data
  233. * @return {?}
  234. */
  235. function (data) {
  236. var _this = this;
  237. /** @type {?} */
  238. var module = 'createUser';
  239. /** @type {?} */
  240. var method = this.getOption(module + ".method");
  241. /** @type {?} */
  242. var url = this.getActionEndpoint(module);
  243. return this.getEncryptPassword(data.loginPassword).pipe(map((/**
  244. * @param {?} body
  245. * @return {?}
  246. */
  247. function (body) {
  248. body.userName = data.userName;
  249. body.loginID = data.loginID;
  250. return _this.http.request(method, url, { body: body, observe: 'response' })
  251. .pipe(map((/**
  252. * @param {?} res
  253. * @return {?}
  254. */
  255. function (res) {
  256. if (_this.getOption(module + ".alwaysFail")) {
  257. throw _this.createFailResponse(data);
  258. }
  259. else if (!_this.getOption('success.getter')(module, res, _this.options)) {
  260. throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
  261. }
  262. return res;
  263. })), map((/**
  264. * @param {?} res
  265. * @return {?}
  266. */
  267. function (res) {
  268. return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
  269. })), catchError((/**
  270. * @param {?} res
  271. * @return {?}
  272. */
  273. function (res) {
  274. return _this.handleResponseError(res, module);
  275. })));
  276. })), concatAll());
  277. };
  278. /**
  279. * @param {?=} data
  280. * @return {?}
  281. */
  282. NamePasswordStrategyService.prototype.updatePasswordForAdmin = /**
  283. * @param {?=} data
  284. * @return {?}
  285. */
  286. function (data) {
  287. var _this = this;
  288. /** @type {?} */
  289. var module = 'updatePasswordForAdmin';
  290. /** @type {?} */
  291. var method = this.getOption(module + ".method");
  292. /** @type {?} */
  293. var url = this.getActionEndpoint(module);
  294. return this.getEncryptPassword(data.loginPassword).pipe(map((/**
  295. * @param {?} body
  296. * @return {?}
  297. */
  298. function (body) {
  299. body.userID = data.userID;
  300. return _this.http.request(method, url, { body: body, observe: 'response' })
  301. .pipe(map((/**
  302. * @param {?} res
  303. * @return {?}
  304. */
  305. function (res) {
  306. if (_this.getOption(module + ".alwaysFail")) {
  307. throw _this.createFailResponse(data);
  308. }
  309. else if (!_this.getOption('success.getter')(module, res, _this.options)) {
  310. throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
  311. }
  312. return res;
  313. })), map((/**
  314. * @param {?} res
  315. * @return {?}
  316. */
  317. function (res) {
  318. return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
  319. })), catchError((/**
  320. * @param {?} res
  321. * @return {?}
  322. */
  323. function (res) {
  324. return _this.handleResponseError(res, module);
  325. })));
  326. })), concatAll());
  327. };
  328. /**
  329. * @param {?} password
  330. * @return {?}
  331. */
  332. NamePasswordStrategyService.prototype.getEncryptPassword = /**
  333. * @param {?} password
  334. * @return {?}
  335. */
  336. function (password) {
  337. var _this = this;
  338. /** @type {?} */
  339. var module = 'getPublicKey';
  340. /** @type {?} */
  341. var method = this.getOption(module + ".method");
  342. /** @type {?} */
  343. var url = this.getActionEndpoint(module);
  344. return this.http.request(method, url, { observe: 'response' })
  345. .pipe(map((/**
  346. * @param {?} res
  347. * @return {?}
  348. */
  349. function (res) {
  350. return encryptPassword(res.body, password);
  351. })), catchError((/**
  352. * @param {?} res
  353. * @return {?}
  354. */
  355. function (res) {
  356. return _this.handleResponseError(res, module);
  357. })));
  358. /**
  359. * @param {?} result
  360. * @param {?} data
  361. * @return {?}
  362. */
  363. function encryptPassword(result, data) {
  364. /** @type {?} */
  365. var now = Date.now();
  366. /** @type {?} */
  367. var encrypt = new JSEncrypt.JSEncrypt();
  368. encrypt.setPublicKey(result.data.publicPEMKey);
  369. /** @type {?} */
  370. var encryptPass = encrypt.encrypt(data + now);
  371. return {
  372. cryptoKeyID: result.data.cryptoKeyID,
  373. utcTimestamp: now,
  374. loginPassword: encryptPass
  375. };
  376. }
  377. };
  378. /**
  379. * @protected
  380. * @param {?} res
  381. * @param {?} module
  382. * @return {?}
  383. */
  384. NamePasswordStrategyService.prototype.handleResponseError = /**
  385. * @protected
  386. * @param {?} res
  387. * @param {?} module
  388. * @return {?}
  389. */
  390. function (res, module) {
  391. /** @type {?} */
  392. var errors = [];
  393. if (res instanceof HttpErrorResponse) {
  394. errors = this.getOption('errors.getter')(module, res, this.options);
  395. }
  396. else if (res instanceof NbAuthIllegalTokenError) {
  397. errors.push(res.message);
  398. }
  399. else if (res instanceof ResultError) {
  400. errors = res.message;
  401. }
  402. else {
  403. errors.push('Something went wrong.');
  404. }
  405. return observableOf(new NbAuthResult(false, res, this.getOption(module + ".redirect.failure"), errors));
  406. };
  407. NamePasswordStrategyService.decorators = [
  408. { type: Injectable }
  409. ];
  410. /** @nocollapse */
  411. NamePasswordStrategyService.ctorParameters = function () { return [
  412. { type: HttpClient },
  413. { type: ActivatedRoute }
  414. ]; };
  415. return NamePasswordStrategyService;
  416. }(NbAuthStrategy));
  417. export { NamePasswordStrategyService };
  418. if (false) {
  419. /**
  420. * @type {?}
  421. * @protected
  422. */
  423. NamePasswordStrategyService.prototype.defaultOptions;
  424. /**
  425. * @type {?}
  426. * @protected
  427. */
  428. NamePasswordStrategyService.prototype.http;
  429. /**
  430. * @type {?}
  431. * @private
  432. */
  433. NamePasswordStrategyService.prototype.route;
  434. }
  435. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZS1wYXNzd29yZC1zdHJhdGVneS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ2UtYWRtaW4tYXV0aC8iLCJzb3VyY2VzIjpbImxpYi9zdHJhdGVneS9uYW1lLXBhc3N3b3JkLXN0cmF0ZWd5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLGNBQWMsRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsRUFBRSxJQUFJLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBK0MsTUFBTSxzQkFBc0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFtQywyQkFBMkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9HLE9BQU8sS0FBSyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBR3ZDO0lBQ0UscUJBQW1CLE9BQWlCO1FBQWpCLFlBQU8sR0FBUCxPQUFPLENBQVU7SUFFcEMsQ0FBQztJQUNILGtCQUFDO0FBQUQsQ0FBQyxBQUpELElBSUM7Ozs7SUFIYSw4QkFBd0I7O0FBS3RDO0lBQ2lELHVEQUFjO0lBUTdELHFDQUFzQixJQUFnQixFQUFVLEtBQXFCO1FBQXJFLFlBQ0UsaUJBQU8sU0FDUjtRQUZxQixVQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsV0FBSyxHQUFMLEtBQUssQ0FBZ0I7UUFGM0Qsb0JBQWMsR0FBb0MsMkJBQTJCLENBQUM7O0lBSXhGLENBQUM7Ozs7O0lBUk0saUNBQUs7Ozs7SUFBWixVQUFhLE9BQXdDO1FBQ25E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QUFJLEdBQUcsWUFBWSx1QkFBdUIsRUFBRTtZQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQjthQUFNLElBQUksR0FBRyxZQUFZLFdBQVcsRUFBRTtZQUNyQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztTQUN0QjthQUFNO1lBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxZQUFZLENBQ2pCLElBQUksWUFBWSxDQUNkLEtBQUssRUFDTCxHQUFHLEVBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBSSxNQUFNLHNCQUFtQixDQUFDLEVBQzVDLE1BQU0sQ0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDOztnQkEzT0YsVUFBVTs7OztnQkFiRixVQUFVO2dCQUVWLGNBQWM7O0lBdVB2QixrQ0FBQztDQUFBLEFBNU9ELENBQ2lELGNBQWMsR0EyTzlEO1NBM09ZLDJCQUEyQjs7Ozs7O0lBTXRDLHFEQUF3Rjs7Ozs7SUFFNUUsMkNBQTBCOzs7OztJQUFFLDRDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE5CX0FVVEhfT1BUSU9OUyxcclxuICBOYkF1dGhJbGxlZ2FsVG9rZW5FcnJvcixcclxuICBOYkF1dGhSZXN1bHQsXHJcbiAgTmJBdXRoU3RyYXRlZ3ksIE5iQXV0aFN0cmF0ZWd5Q2xhc3NcclxufSBmcm9tICdAbmVidWxhci9hdXRoJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgbWFwLCBjYXRjaEVycm9yLCBjb25jYXRBbGwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlLCBIdHRwUmVzcG9uc2VCYXNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyB0aHJvd0Vycm9yIGFzIF9vYnNlcnZhYmxlVGhyb3cgfSBmcm9tICdyeGpzL2luZGV4JztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOYW1lUGFzc3dvcmRBdXRoU3RyYXRlZ3lPcHRpb25zLCBuYW1lUGFzc3dvcmRTdHJhdGVneU9wdGlvbnMgfSBmcm9tICcuL25hbWUtcGFzc3dvcmQtc3RyYXRlZ3ktb3B0aW9uJztcclxuaW1wb3J0ICogYXMgSlNFbmNyeXB0IGZyb20gJ2pzZW5jcnlwdCc7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFJlc3VsdEVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZTogU3RyaW5nW10pIHtcclxuXHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYW1lUGFzc3dvcmRTdHJhdGVneVNlcnZpY2UgZXh0ZW5kcyBOYkF1dGhTdHJhdGVneSB7XHJcblxyXG4gIHN0YXRpYyBzZXR1cChvcHRpb25zOiBOYW1lUGFzc3dvcmRBdXRoU3RyYXRlZ3lPcHRpb25zKTogW05iQXV0aFN0cmF0ZWd5Q2xhc3MsIE5hbWVQYXNzd29yZEF1dGhTdHJhdGVneU9wdGlvbnNdIHtcclxuICAgIHJldHVybiBbTmFtZVBhc3N3b3JkU3RyYXRlZ3lTZXJ2aWNlLCBvcHRpb25zXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkZWZhdWx0T3B0aW9uczogTmFtZVBhc3N3b3JkQXV0aFN0cmF0ZWd5T3B0aW9ucyA9IG5hbWVQYXNzd29yZFN0cmF0ZWd5T3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgYXV0aGVudGljYXRlKGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgY29uc3QgbW9kdWxlID0gJ2xvZ2luJztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ubWV0aG9kYCk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFjdGlvbkVuZHBvaW50KG1vZHVsZSk7XHJcbiAgICBjb25zdCByZXF1aXJlVmFsaWRUb2tlbiA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVxdWlyZVZhbGlkVG9rZW5gKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkubG9naW5JRCA9IGRhdGEubG9naW5JZDtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KG1ldGhvZCwgdXJsLCB7IGJvZHksIG9ic2VydmU6ICdyZXNwb25zZScgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LmFsd2F5c0ZhaWxgKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKGRhdGEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdldE9wdGlvbignc3VjY2Vzcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBSZXN1bHRFcnJvcih0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgcmVzLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVkaXJlY3Quc3VjY2Vzc2ApLFxyXG4gICAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pLCBjb25jYXRBbGwoKSk7XHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBsb2dvdXQoKTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIGNvbnN0IG1vZHVsZSA9ICdsb2dvdXQnO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuXHJcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHt9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHJlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XHJcbiAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KSxcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBOYkF1dGhSZXN1bHQoXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgIHJlcyxcclxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZWRpcmVjdC5zdWNjZXNzYCksXHJcbiAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2hUb2tlbihkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICByZWdpc3RlcihkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICByZXF1ZXN0UGFzc3dvcmQoZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRQYXNzd29yZChkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIGNvbnN0IG1vZHVsZSA9ICdyZXNldFBhc3MnO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmROZXcgKyAnLScgKyBkYXRhLmxvZ2luUGFzc3dvcmRPbGQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkucGFzc3dvcmREYXRhID0gYm9keS5sb2dpblBhc3N3b3JkO1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgYm9keSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVGYWlsUmVzcG9uc2UoZGF0YSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZ2V0T3B0aW9uKCdzdWNjZXNzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc3VsdEVycm9yKHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOYkF1dGhSZXN1bHQoXHJcbiAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICByZXMsXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZWRpcmVjdC5zdWNjZXNzYCksXHJcbiAgICAgICAgICAgICAgW10sXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oJ21lc3NhZ2VzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlc3BvbnNlRXJyb3IocmVzLCBtb2R1bGUpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfSksIGNvbmNhdEFsbCgpKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVVzZXIoZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XHJcbiAgICBjb25zdCBtb2R1bGUgPSAnY3JlYXRlVXNlcic7XHJcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9Lm1ldGhvZGApO1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRBY3Rpb25FbmRwb2ludChtb2R1bGUpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5jcnlwdFBhc3N3b3JkKGRhdGEubG9naW5QYXNzd29yZCkucGlwZShtYXAoKGJvZHkpID0+IHtcclxuICAgICAgYm9keS51c2VyTmFtZSA9IGRhdGEudXNlck5hbWU7XHJcbiAgICAgIGJvZHkubG9naW5JRCA9IGRhdGEubG9naW5JRDtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KG1ldGhvZCwgdXJsLCB7IGJvZHksIG9ic2VydmU6ICdyZXNwb25zZScgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LmFsd2F5c0ZhaWxgKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKGRhdGEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdldE9wdGlvbignc3VjY2Vzcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBSZXN1bHRFcnJvcih0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgcmVzLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVkaXJlY3Quc3VjY2Vzc2ApLFxyXG4gICAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pLCBjb25jYXRBbGwoKSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQYXNzd29yZEZvckFkbWluKGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgY29uc3QgbW9kdWxlID0gJ3VwZGF0ZVBhc3N3b3JkRm9yQWRtaW4nO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkudXNlcklEID0gZGF0YS51c2VySUQ7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChtZXRob2QsIHVybCwgeyBib2R5LCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5hbHdheXNGYWlsYCkpIHtcclxuICAgICAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUZhaWxSZXNwb25zZShkYXRhKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5nZXRPcHRpb24oJ3N1Y2Nlc3MuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzdWx0RXJyb3IodGhpcy5nZXRPcHRpb24oJ21lc3NhZ2VzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5iQXV0aFJlc3VsdChcclxuICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgIHJlcyxcclxuICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LnN1Y2Nlc3NgKSxcclxuICAgICAgICAgICAgICBbXSxcclxuICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChyZXMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9KSwgY29uY2F0QWxsKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldEVuY3J5cHRQYXNzd29yZChwYXNzd29yZCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBtb2R1bGUgPSAnZ2V0UHVibGljS2V5JztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ubWV0aG9kYCk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFjdGlvbkVuZHBvaW50KG1vZHVsZSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGVuY3J5cHRQYXNzd29yZChyZXMuYm9keSwgcGFzc3dvcmQpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuXHJcbiAgICBmdW5jdGlvbiBlbmNyeXB0UGFzc3dvcmQocmVzdWx0LCBkYXRhKSB7XHJcbiAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICBsZXQgZW5jcnlwdCA9IG5ldyBKU0VuY3J5cHQuSlNFbmNyeXB0KCk7XHJcbiAgICAgIGVuY3J5cHQuc2V0UHVibGljS2V5KHJlc3VsdC5kYXRhLnB1YmxpY1BFTUtleSk7XHJcbiAgICAgIGxldCBlbmNyeXB0UGFzcyA9IGVuY3J5cHQuZW5jcnlwdChkYXRhICsgbm93KTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjcnlwdG9LZXlJRDogcmVzdWx0LmRhdGEuY3J5cHRvS2V5SUQsXHJcbiAgICAgICAgdXRjVGltZXN0YW1wOiBub3csXHJcbiAgICAgICAgbG9naW5QYXNzd29yZDogZW5jcnlwdFBhc3NcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlUmVzcG9uc2VFcnJvcihyZXM6IGFueSwgbW9kdWxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgbGV0IGVycm9ycyA9IFtdO1xyXG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIGVycm9ycyA9IHRoaXMuZ2V0T3B0aW9uKCdlcnJvcnMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucyk7XHJcbiAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIE5iQXV0aElsbGVnYWxUb2tlbkVycm9yKSB7XHJcbiAgICAgIGVycm9ycy5wdXNoKHJlcy5tZXNzYWdlKTtcclxuICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgUmVzdWx0RXJyb3IpIHtcclxuICAgICAgZXJyb3JzID0gcmVzLm1lc3NhZ2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlcnJvcnMucHVzaCgnU29tZXRoaW5nIHdlbnQgd3JvbmcuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKFxyXG4gICAgICBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIHJlcyxcclxuICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LmZhaWx1cmVgKSxcclxuICAgICAgICBlcnJvcnNcclxuICAgICAgKSk7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=