name-password-strategy.service.js 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,extraRequire,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(function (body) {
  64. body.loginID = data.loginId;
  65. return _this.http.request(method, url, { body: body, observe: 'response' })
  66. .pipe(map(function (res) {
  67. if (_this.getOption(module + ".alwaysFail")) {
  68. throw _this.createFailResponse(data);
  69. }
  70. else if (!_this.getOption('success.getter')(module, res, _this.options)) {
  71. throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
  72. }
  73. return res;
  74. }), map(function (res) {
  75. return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
  76. }), catchError(function (res) {
  77. return _this.handleResponseError(res, module);
  78. }));
  79. }), concatAll());
  80. };
  81. /**
  82. * @return {?}
  83. */
  84. NamePasswordStrategyService.prototype.logout = /**
  85. * @return {?}
  86. */
  87. function () {
  88. var _this = this;
  89. /** @type {?} */
  90. var module = 'logout';
  91. /** @type {?} */
  92. var method = this.getOption(module + ".method");
  93. /** @type {?} */
  94. var url = this.getActionEndpoint(module);
  95. return observableOf({})
  96. .pipe(switchMap(function (res) {
  97. if (!url) {
  98. return observableOf(res);
  99. }
  100. return _this.http.request(method, url, { observe: 'response' });
  101. }), map(function (res) {
  102. if (_this.getOption(module + ".alwaysFail")) {
  103. throw _this.createFailResponse();
  104. }
  105. return res;
  106. }), map(function (res) {
  107. return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
  108. }), catchError(function (res) {
  109. return _this.handleResponseError(res, module);
  110. }));
  111. };
  112. /**
  113. * @param {?=} data
  114. * @return {?}
  115. */
  116. NamePasswordStrategyService.prototype.refreshToken = /**
  117. * @param {?=} data
  118. * @return {?}
  119. */
  120. function (data) {
  121. return undefined;
  122. };
  123. /**
  124. * @param {?=} data
  125. * @return {?}
  126. */
  127. NamePasswordStrategyService.prototype.register = /**
  128. * @param {?=} data
  129. * @return {?}
  130. */
  131. function (data) {
  132. return undefined;
  133. };
  134. /**
  135. * @param {?=} data
  136. * @return {?}
  137. */
  138. NamePasswordStrategyService.prototype.requestPassword = /**
  139. * @param {?=} data
  140. * @return {?}
  141. */
  142. function (data) {
  143. return undefined;
  144. };
  145. /**
  146. * @param {?=} data
  147. * @return {?}
  148. */
  149. NamePasswordStrategyService.prototype.resetPassword = /**
  150. * @param {?=} data
  151. * @return {?}
  152. */
  153. function (data) {
  154. var _this = this;
  155. /** @type {?} */
  156. var module = 'resetPass';
  157. /** @type {?} */
  158. var method = this.getOption(module + ".method");
  159. /** @type {?} */
  160. var url = this.getActionEndpoint(module);
  161. return this.getEncryptPassword(data.loginPasswordNew + '-' + data.loginPasswordOld).pipe(map(function (body) {
  162. body.passwordData = body.loginPassword;
  163. return _this.http.request(method, url, { body: body, observe: 'response' })
  164. .pipe(map(function (res) {
  165. if (_this.getOption(module + ".alwaysFail")) {
  166. throw _this.createFailResponse(data);
  167. }
  168. else if (!_this.getOption('success.getter')(module, res, _this.options)) {
  169. throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
  170. }
  171. return res;
  172. }), map(function (res) {
  173. return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
  174. }), catchError(function (res) {
  175. return _this.handleResponseError(res, module);
  176. }));
  177. }), concatAll());
  178. };
  179. /**
  180. * @param {?=} data
  181. * @return {?}
  182. */
  183. NamePasswordStrategyService.prototype.createUser = /**
  184. * @param {?=} data
  185. * @return {?}
  186. */
  187. function (data) {
  188. var _this = this;
  189. /** @type {?} */
  190. var module = 'createUser';
  191. /** @type {?} */
  192. var method = this.getOption(module + ".method");
  193. /** @type {?} */
  194. var url = this.getActionEndpoint(module);
  195. return this.getEncryptPassword(data.loginPassword).pipe(map(function (body) {
  196. body.userName = data.userName;
  197. body.loginID = data.loginID;
  198. return _this.http.request(method, url, { body: body, observe: 'response' })
  199. .pipe(map(function (res) {
  200. if (_this.getOption(module + ".alwaysFail")) {
  201. throw _this.createFailResponse(data);
  202. }
  203. else if (!_this.getOption('success.getter')(module, res, _this.options)) {
  204. throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
  205. }
  206. return res;
  207. }), map(function (res) {
  208. return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
  209. }), catchError(function (res) {
  210. return _this.handleResponseError(res, module);
  211. }));
  212. }), concatAll());
  213. };
  214. /**
  215. * @param {?=} data
  216. * @return {?}
  217. */
  218. NamePasswordStrategyService.prototype.updatePasswordForAdmin = /**
  219. * @param {?=} data
  220. * @return {?}
  221. */
  222. function (data) {
  223. var _this = this;
  224. /** @type {?} */
  225. var module = 'updatePasswordForAdmin';
  226. /** @type {?} */
  227. var method = this.getOption(module + ".method");
  228. /** @type {?} */
  229. var url = this.getActionEndpoint(module);
  230. return this.getEncryptPassword(data.loginPassword).pipe(map(function (body) {
  231. body.userID = data.userID;
  232. return _this.http.request(method, url, { body: body, observe: 'response' })
  233. .pipe(map(function (res) {
  234. if (_this.getOption(module + ".alwaysFail")) {
  235. throw _this.createFailResponse(data);
  236. }
  237. else if (!_this.getOption('success.getter')(module, res, _this.options)) {
  238. throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
  239. }
  240. return res;
  241. }), map(function (res) {
  242. return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
  243. }), catchError(function (res) {
  244. return _this.handleResponseError(res, module);
  245. }));
  246. }), concatAll());
  247. };
  248. /**
  249. * @param {?} password
  250. * @return {?}
  251. */
  252. NamePasswordStrategyService.prototype.getEncryptPassword = /**
  253. * @param {?} password
  254. * @return {?}
  255. */
  256. function (password) {
  257. var _this = this;
  258. /** @type {?} */
  259. var module = 'getPublicKey';
  260. /** @type {?} */
  261. var method = this.getOption(module + ".method");
  262. /** @type {?} */
  263. var url = this.getActionEndpoint(module);
  264. return this.http.request(method, url, { observe: 'response' })
  265. .pipe(map(function (res) {
  266. return encryptPassword(res.body, password);
  267. }), catchError(function (res) {
  268. return _this.handleResponseError(res, module);
  269. }));
  270. /**
  271. * @param {?} result
  272. * @param {?} data
  273. * @return {?}
  274. */
  275. function encryptPassword(result, data) {
  276. /** @type {?} */
  277. var now = Date.now();
  278. /** @type {?} */
  279. var encrypt = new JSEncrypt.JSEncrypt();
  280. encrypt.setPublicKey(result.data.publicPEMKey);
  281. /** @type {?} */
  282. var encryptPass = encrypt.encrypt(data + now);
  283. return {
  284. cryptoKeyID: result.data.cryptoKeyID,
  285. utcTimestamp: now,
  286. loginPassword: encryptPass
  287. };
  288. }
  289. };
  290. /**
  291. * @protected
  292. * @param {?} res
  293. * @param {?} module
  294. * @return {?}
  295. */
  296. NamePasswordStrategyService.prototype.handleResponseError = /**
  297. * @protected
  298. * @param {?} res
  299. * @param {?} module
  300. * @return {?}
  301. */
  302. function (res, module) {
  303. /** @type {?} */
  304. var errors = [];
  305. if (res instanceof HttpErrorResponse) {
  306. errors = this.getOption('errors.getter')(module, res, this.options);
  307. }
  308. else if (res instanceof NbAuthIllegalTokenError) {
  309. errors.push(res.message);
  310. }
  311. else if (res instanceof ResultError) {
  312. errors = res.message;
  313. }
  314. else {
  315. errors.push('Something went wrong.');
  316. }
  317. return observableOf(new NbAuthResult(false, res, this.getOption(module + ".redirect.failure"), errors));
  318. };
  319. NamePasswordStrategyService.decorators = [
  320. { type: Injectable }
  321. ];
  322. /** @nocollapse */
  323. NamePasswordStrategyService.ctorParameters = function () { return [
  324. { type: HttpClient },
  325. { type: ActivatedRoute }
  326. ]; };
  327. return NamePasswordStrategyService;
  328. }(NbAuthStrategy));
  329. export { NamePasswordStrategyService };
  330. if (false) {
  331. /**
  332. * @type {?}
  333. * @protected
  334. */
  335. NamePasswordStrategyService.prototype.defaultOptions;
  336. /**
  337. * @type {?}
  338. * @protected
  339. */
  340. NamePasswordStrategyService.prototype.http;
  341. /**
  342. * @type {?}
  343. * @private
  344. */
  345. NamePasswordStrategyService.prototype.route;
  346. }
  347. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZS1wYXNzd29yZC1zdHJhdGVneS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ2UtYWRtaW4tYXV0aC8iLCJzb3VyY2VzIjpbImxpYi9zdHJhdGVneS9uYW1lLXBhc3N3b3JkLXN0cmF0ZWd5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLGNBQWMsRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsRUFBRSxJQUFJLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBK0MsTUFBTSxzQkFBc0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFtQywyQkFBMkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9HLE9BQU8sS0FBSyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBR3ZDO0lBQ0UscUJBQW1CLE9BQWlCO1FBQWpCLFlBQU8sR0FBUCxPQUFPLENBQVU7SUFFcEMsQ0FBQztJQUNILGtCQUFDO0FBQUQsQ0FBQyxBQUpELElBSUM7Ozs7SUFIYSw4QkFBd0I7O0FBS3RDO0lBQ2lELHVEQUFjO0lBUTdELHFDQUFzQixJQUFnQixFQUFVLEtBQXFCO1FBQXJFLFlBQ0UsaUJBQU8sU0FDUjtRQUZxQixVQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsV0FBSyxHQUFMLEtBQUssQ0FBZ0I7UUFGM0Qsb0JBQWMsR0FBb0MsMkJBQTJCLENBQUM7O0lBSXhGLENBQUM7Ozs7O0lBUk0saUNBQUs7Ozs7SUFBWixVQUFhLE9BQXdDO1FBQ25E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LENBQUMsQ0FBQztTQUMxQjthQUFNLElBQUksR0FBRyxZQUFZLFdBQVcsRUFBRTtZQUNyQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztTQUN0QjthQUFNO1lBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxZQUFZLENBQ2pCLElBQUksWUFBWSxDQUNkLEtBQUssRUFDTCxHQUFHLEVBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBSSxNQUFNLHNCQUFtQixDQUFDLEVBQzVDLE1BQU0sQ0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDOztnQkEzT0YsVUFBVTs7OztnQkFiRixVQUFVO2dCQUVWLGNBQWM7O0lBdVB2QixrQ0FBQztDQUFBLEFBNU9ELENBQ2lELGNBQWMsR0EyTzlEO1NBM09ZLDJCQUEyQjs7Ozs7O0lBTXRDLHFEQUF3Rjs7Ozs7SUFFNUUsMkNBQTBCOzs7OztJQUFFLDRDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE5CX0FVVEhfT1BUSU9OUyxcclxuICBOYkF1dGhJbGxlZ2FsVG9rZW5FcnJvcixcclxuICBOYkF1dGhSZXN1bHQsXHJcbiAgTmJBdXRoU3RyYXRlZ3ksIE5iQXV0aFN0cmF0ZWd5Q2xhc3NcclxufSBmcm9tICdAbmVidWxhci9hdXRoJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgbWFwLCBjYXRjaEVycm9yLCBjb25jYXRBbGwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlLCBIdHRwUmVzcG9uc2VCYXNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyB0aHJvd0Vycm9yIGFzIF9vYnNlcnZhYmxlVGhyb3cgfSBmcm9tICdyeGpzL2luZGV4JztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOYW1lUGFzc3dvcmRBdXRoU3RyYXRlZ3lPcHRpb25zLCBuYW1lUGFzc3dvcmRTdHJhdGVneU9wdGlvbnMgfSBmcm9tICcuL25hbWUtcGFzc3dvcmQtc3RyYXRlZ3ktb3B0aW9uJztcclxuaW1wb3J0ICogYXMgSlNFbmNyeXB0IGZyb20gJ2pzZW5jcnlwdCc7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFJlc3VsdEVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZTogU3RyaW5nW10pIHtcclxuXHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYW1lUGFzc3dvcmRTdHJhdGVneVNlcnZpY2UgZXh0ZW5kcyBOYkF1dGhTdHJhdGVneSB7XHJcblxyXG4gIHN0YXRpYyBzZXR1cChvcHRpb25zOiBOYW1lUGFzc3dvcmRBdXRoU3RyYXRlZ3lPcHRpb25zKTogW05iQXV0aFN0cmF0ZWd5Q2xhc3MsIE5hbWVQYXNzd29yZEF1dGhTdHJhdGVneU9wdGlvbnNdIHtcclxuICAgIHJldHVybiBbTmFtZVBhc3N3b3JkU3RyYXRlZ3lTZXJ2aWNlLCBvcHRpb25zXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkZWZhdWx0T3B0aW9uczogTmFtZVBhc3N3b3JkQXV0aFN0cmF0ZWd5T3B0aW9ucyA9IG5hbWVQYXNzd29yZFN0cmF0ZWd5T3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgYXV0aGVudGljYXRlKGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgY29uc3QgbW9kdWxlID0gJ2xvZ2luJztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ubWV0aG9kYCk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFjdGlvbkVuZHBvaW50KG1vZHVsZSk7XHJcbiAgICBjb25zdCByZXF1aXJlVmFsaWRUb2tlbiA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVxdWlyZVZhbGlkVG9rZW5gKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkubG9naW5JRCA9IGRhdGEubG9naW5JZDtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KG1ldGhvZCwgdXJsLCB7IGJvZHksIG9ic2VydmU6ICdyZXNwb25zZScgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LmFsd2F5c0ZhaWxgKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKGRhdGEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdldE9wdGlvbignc3VjY2Vzcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBSZXN1bHRFcnJvcih0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgcmVzLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVkaXJlY3Quc3VjY2Vzc2ApLFxyXG4gICAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pLCBjb25jYXRBbGwoKSk7XHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBsb2dvdXQoKTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIGNvbnN0IG1vZHVsZSA9ICdsb2dvdXQnO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuXHJcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHt9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHJlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XHJcbiAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KSxcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBOYkF1dGhSZXN1bHQoXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgIHJlcyxcclxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZWRpcmVjdC5zdWNjZXNzYCksXHJcbiAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2hUb2tlbihkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICByZWdpc3RlcihkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICByZXF1ZXN0UGFzc3dvcmQoZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRQYXNzd29yZChkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIGNvbnN0IG1vZHVsZSA9ICdyZXNldFBhc3MnO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmROZXcgKyAnLScgKyBkYXRhLmxvZ2luUGFzc3dvcmRPbGQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkucGFzc3dvcmREYXRhID0gYm9keS5sb2dpblBhc3N3b3JkO1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgYm9keSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVGYWlsUmVzcG9uc2UoZGF0YSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZ2V0T3B0aW9uKCdzdWNjZXNzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc3VsdEVycm9yKHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOYkF1dGhSZXN1bHQoXHJcbiAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICByZXMsXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZWRpcmVjdC5zdWNjZXNzYCksXHJcbiAgICAgICAgICAgICAgW10sXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oJ21lc3NhZ2VzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlc3BvbnNlRXJyb3IocmVzLCBtb2R1bGUpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfSksIGNvbmNhdEFsbCgpKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVVzZXIoZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XHJcbiAgICBjb25zdCBtb2R1bGUgPSAnY3JlYXRlVXNlcic7XHJcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9Lm1ldGhvZGApO1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRBY3Rpb25FbmRwb2ludChtb2R1bGUpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5jcnlwdFBhc3N3b3JkKGRhdGEubG9naW5QYXNzd29yZCkucGlwZShtYXAoKGJvZHkpID0+IHtcclxuICAgICAgYm9keS51c2VyTmFtZSA9IGRhdGEudXNlck5hbWU7XHJcbiAgICAgIGJvZHkubG9naW5JRCA9IGRhdGEubG9naW5JRDtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KG1ldGhvZCwgdXJsLCB7IGJvZHksIG9ic2VydmU6ICdyZXNwb25zZScgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LmFsd2F5c0ZhaWxgKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKGRhdGEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdldE9wdGlvbignc3VjY2Vzcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBSZXN1bHRFcnJvcih0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgcmVzLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVkaXJlY3Quc3VjY2Vzc2ApLFxyXG4gICAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pLCBjb25jYXRBbGwoKSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQYXNzd29yZEZvckFkbWluKGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgY29uc3QgbW9kdWxlID0gJ3VwZGF0ZVBhc3N3b3JkRm9yQWRtaW4nO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkudXNlcklEID0gZGF0YS51c2VySUQ7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChtZXRob2QsIHVybCwgeyBib2R5LCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5hbHdheXNGYWlsYCkpIHtcclxuICAgICAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUZhaWxSZXNwb25zZShkYXRhKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5nZXRPcHRpb24oJ3N1Y2Nlc3MuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzdWx0RXJyb3IodGhpcy5nZXRPcHRpb24oJ21lc3NhZ2VzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5iQXV0aFJlc3VsdChcclxuICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgIHJlcyxcclxuICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LnN1Y2Nlc3NgKSxcclxuICAgICAgICAgICAgICBbXSxcclxuICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChyZXMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9KSwgY29uY2F0QWxsKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldEVuY3J5cHRQYXNzd29yZChwYXNzd29yZCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBtb2R1bGUgPSAnZ2V0UHVibGljS2V5JztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ubWV0aG9kYCk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFjdGlvbkVuZHBvaW50KG1vZHVsZSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGVuY3J5cHRQYXNzd29yZChyZXMuYm9keSwgcGFzc3dvcmQpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuXHJcbiAgICBmdW5jdGlvbiBlbmNyeXB0UGFzc3dvcmQocmVzdWx0LCBkYXRhKSB7XHJcbiAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICBsZXQgZW5jcnlwdCA9IG5ldyBKU0VuY3J5cHQuSlNFbmNyeXB0KCk7XHJcbiAgICAgIGVuY3J5cHQuc2V0UHVibGljS2V5KHJlc3VsdC5kYXRhLnB1YmxpY1BFTUtleSk7XHJcbiAgICAgIGxldCBlbmNyeXB0UGFzcyA9IGVuY3J5cHQuZW5jcnlwdChkYXRhICsgbm93KTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjcnlwdG9LZXlJRDogcmVzdWx0LmRhdGEuY3J5cHRvS2V5SUQsXHJcbiAgICAgICAgdXRjVGltZXN0YW1wOiBub3csXHJcbiAgICAgICAgbG9naW5QYXNzd29yZDogZW5jcnlwdFBhc3NcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlUmVzcG9uc2VFcnJvcihyZXM6IGFueSwgbW9kdWxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgbGV0IGVycm9ycyA9IFtdO1xyXG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIGVycm9ycyA9IHRoaXMuZ2V0T3B0aW9uKCdlcnJvcnMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucyk7XHJcbiAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIE5iQXV0aElsbGVnYWxUb2tlbkVycm9yKSB7XHJcbiAgICAgIGVycm9ycy5wdXNoKHJlcy5tZXNzYWdlKTtcclxuICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgUmVzdWx0RXJyb3IpIHtcclxuICAgICAgZXJyb3JzID0gcmVzLm1lc3NhZ2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlcnJvcnMucHVzaCgnU29tZXRoaW5nIHdlbnQgd3JvbmcuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKFxyXG4gICAgICBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIHJlcyxcclxuICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LmZhaWx1cmVgKSxcclxuICAgICAgICBlcnJvcnNcclxuICAgICAgKSk7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=