123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435 |
- /**
- * @fileoverview added by tsickle
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
- */
- import * as tslib_1 from "tslib";
- import { Injectable } from '@angular/core';
- import { NbAuthIllegalTokenError, NbAuthResult, NbAuthStrategy } from '@nebular/auth';
- import { of as observableOf } from 'rxjs';
- import { switchMap, map, catchError, concatAll } from 'rxjs/operators';
- import { HttpClient, HttpErrorResponse } from '@angular/common/http';
- import { ActivatedRoute } from '@angular/router';
- import { namePasswordStrategyOptions } from './name-password-strategy-option';
- import * as JSEncrypt from 'jsencrypt';
- var ResultError = /** @class */ (function () {
- function ResultError(message) {
- this.message = message;
- }
- return ResultError;
- }());
- export { ResultError };
- if (false) {
- /** @type {?} */
- ResultError.prototype.message;
- }
- var NamePasswordStrategyService = /** @class */ (function (_super) {
- tslib_1.__extends(NamePasswordStrategyService, _super);
- function NamePasswordStrategyService(http, route) {
- var _this = _super.call(this) || this;
- _this.http = http;
- _this.route = route;
- _this.defaultOptions = namePasswordStrategyOptions;
- return _this;
- }
- /**
- * @param {?} options
- * @return {?}
- */
- NamePasswordStrategyService.setup = /**
- * @param {?} options
- * @return {?}
- */
- function (options) {
- return [NamePasswordStrategyService, options];
- };
- /**
- * @param {?=} data
- * @return {?}
- */
- NamePasswordStrategyService.prototype.authenticate = /**
- * @param {?=} data
- * @return {?}
- */
- function (data) {
- var _this = this;
- /** @type {?} */
- var module = 'login';
- /** @type {?} */
- var method = this.getOption(module + ".method");
- /** @type {?} */
- var url = this.getActionEndpoint(module);
- /** @type {?} */
- var requireValidToken = this.getOption(module + ".requireValidToken");
- return this.getEncryptPassword(data.loginPassword).pipe(map((/**
- * @param {?} body
- * @return {?}
- */
- function (body) {
- body.loginID = data.loginId;
- return _this.http.request(method, url, { body: body, observe: 'response' })
- .pipe(map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- if (_this.getOption(module + ".alwaysFail")) {
- throw _this.createFailResponse(data);
- }
- else if (!_this.getOption('success.getter')(module, res, _this.options)) {
- throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
- }
- return res;
- })), map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
- })), catchError((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return _this.handleResponseError(res, module);
- })));
- })), concatAll());
- };
- /**
- * @return {?}
- */
- NamePasswordStrategyService.prototype.logout = /**
- * @return {?}
- */
- function () {
- var _this = this;
- /** @type {?} */
- var module = 'logout';
- /** @type {?} */
- var method = this.getOption(module + ".method");
- /** @type {?} */
- var url = this.getActionEndpoint(module);
- return observableOf({})
- .pipe(switchMap((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- if (!url) {
- return observableOf(res);
- }
- return _this.http.request(method, url, { observe: 'response' });
- })), map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- if (_this.getOption(module + ".alwaysFail")) {
- throw _this.createFailResponse();
- }
- return res;
- })), map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
- })), catchError((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return _this.handleResponseError(res, module);
- })));
- };
- /**
- * @param {?=} data
- * @return {?}
- */
- NamePasswordStrategyService.prototype.refreshToken = /**
- * @param {?=} data
- * @return {?}
- */
- function (data) {
- return undefined;
- };
- /**
- * @param {?=} data
- * @return {?}
- */
- NamePasswordStrategyService.prototype.register = /**
- * @param {?=} data
- * @return {?}
- */
- function (data) {
- return undefined;
- };
- /**
- * @param {?=} data
- * @return {?}
- */
- NamePasswordStrategyService.prototype.requestPassword = /**
- * @param {?=} data
- * @return {?}
- */
- function (data) {
- return undefined;
- };
- /**
- * @param {?=} data
- * @return {?}
- */
- NamePasswordStrategyService.prototype.resetPassword = /**
- * @param {?=} data
- * @return {?}
- */
- function (data) {
- var _this = this;
- /** @type {?} */
- var module = 'resetPass';
- /** @type {?} */
- var method = this.getOption(module + ".method");
- /** @type {?} */
- var url = this.getActionEndpoint(module);
- return this.getEncryptPassword(data.loginPasswordNew + '-' + data.loginPasswordOld).pipe(map((/**
- * @param {?} body
- * @return {?}
- */
- function (body) {
- body.passwordData = body.loginPassword;
- return _this.http.request(method, url, { body: body, observe: 'response' })
- .pipe(map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- if (_this.getOption(module + ".alwaysFail")) {
- throw _this.createFailResponse(data);
- }
- else if (!_this.getOption('success.getter')(module, res, _this.options)) {
- throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
- }
- return res;
- })), map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
- })), catchError((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return _this.handleResponseError(res, module);
- })));
- })), concatAll());
- };
- /**
- * @param {?=} data
- * @return {?}
- */
- NamePasswordStrategyService.prototype.createUser = /**
- * @param {?=} data
- * @return {?}
- */
- function (data) {
- var _this = this;
- /** @type {?} */
- var module = 'createUser';
- /** @type {?} */
- var method = this.getOption(module + ".method");
- /** @type {?} */
- var url = this.getActionEndpoint(module);
- return this.getEncryptPassword(data.loginPassword).pipe(map((/**
- * @param {?} body
- * @return {?}
- */
- function (body) {
- body.userName = data.userName;
- body.loginID = data.loginID;
- return _this.http.request(method, url, { body: body, observe: 'response' })
- .pipe(map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- if (_this.getOption(module + ".alwaysFail")) {
- throw _this.createFailResponse(data);
- }
- else if (!_this.getOption('success.getter')(module, res, _this.options)) {
- throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
- }
- return res;
- })), map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
- })), catchError((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return _this.handleResponseError(res, module);
- })));
- })), concatAll());
- };
- /**
- * @param {?=} data
- * @return {?}
- */
- NamePasswordStrategyService.prototype.updatePasswordForAdmin = /**
- * @param {?=} data
- * @return {?}
- */
- function (data) {
- var _this = this;
- /** @type {?} */
- var module = 'updatePasswordForAdmin';
- /** @type {?} */
- var method = this.getOption(module + ".method");
- /** @type {?} */
- var url = this.getActionEndpoint(module);
- return this.getEncryptPassword(data.loginPassword).pipe(map((/**
- * @param {?} body
- * @return {?}
- */
- function (body) {
- body.userID = data.userID;
- return _this.http.request(method, url, { body: body, observe: 'response' })
- .pipe(map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- if (_this.getOption(module + ".alwaysFail")) {
- throw _this.createFailResponse(data);
- }
- else if (!_this.getOption('success.getter')(module, res, _this.options)) {
- throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options));
- }
- return res;
- })), map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options));
- })), catchError((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return _this.handleResponseError(res, module);
- })));
- })), concatAll());
- };
- /**
- * @param {?} password
- * @return {?}
- */
- NamePasswordStrategyService.prototype.getEncryptPassword = /**
- * @param {?} password
- * @return {?}
- */
- function (password) {
- var _this = this;
- /** @type {?} */
- var module = 'getPublicKey';
- /** @type {?} */
- var method = this.getOption(module + ".method");
- /** @type {?} */
- var url = this.getActionEndpoint(module);
- return this.http.request(method, url, { observe: 'response' })
- .pipe(map((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return encryptPassword(res.body, password);
- })), catchError((/**
- * @param {?} res
- * @return {?}
- */
- function (res) {
- return _this.handleResponseError(res, module);
- })));
- /**
- * @param {?} result
- * @param {?} data
- * @return {?}
- */
- function encryptPassword(result, data) {
- /** @type {?} */
- var now = Date.now();
- /** @type {?} */
- var encrypt = new JSEncrypt.JSEncrypt();
- encrypt.setPublicKey(result.data.publicPEMKey);
- /** @type {?} */
- var encryptPass = encrypt.encrypt(data + now);
- return {
- cryptoKeyID: result.data.cryptoKeyID,
- utcTimestamp: now,
- loginPassword: encryptPass
- };
- }
- };
- /**
- * @protected
- * @param {?} res
- * @param {?} module
- * @return {?}
- */
- NamePasswordStrategyService.prototype.handleResponseError = /**
- * @protected
- * @param {?} res
- * @param {?} module
- * @return {?}
- */
- function (res, module) {
- /** @type {?} */
- var errors = [];
- if (res instanceof HttpErrorResponse) {
- errors = this.getOption('errors.getter')(module, res, this.options);
- }
- else if (res instanceof NbAuthIllegalTokenError) {
- errors.push(res.message);
- }
- else if (res instanceof ResultError) {
- errors = res.message;
- }
- else {
- errors.push('Something went wrong.');
- }
- return observableOf(new NbAuthResult(false, res, this.getOption(module + ".redirect.failure"), errors));
- };
- NamePasswordStrategyService.decorators = [
- { type: Injectable }
- ];
- /** @nocollapse */
- NamePasswordStrategyService.ctorParameters = function () { return [
- { type: HttpClient },
- { type: ActivatedRoute }
- ]; };
- return NamePasswordStrategyService;
- }(NbAuthStrategy));
- export { NamePasswordStrategyService };
- if (false) {
- /**
- * @type {?}
- * @protected
- */
- NamePasswordStrategyService.prototype.defaultOptions;
- /**
- * @type {?}
- * @protected
- */
- NamePasswordStrategyService.prototype.http;
- /**
- * @type {?}
- * @private
- */
- NamePasswordStrategyService.prototype.route;
- }
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZS1wYXNzd29yZC1zdHJhdGVneS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ2UtYWRtaW4tYXV0aC8iLCJzb3VyY2VzIjpbImxpYi9zdHJhdGVneS9uYW1lLXBhc3N3b3JkLXN0cmF0ZWd5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLGNBQWMsRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsRUFBRSxJQUFJLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBK0MsTUFBTSxzQkFBc0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFtQywyQkFBMkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9HLE9BQU8sS0FBSyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBR3ZDO0lBQ0UscUJBQW1CLE9BQWlCO1FBQWpCLFlBQU8sR0FBUCxPQUFPLENBQVU7SUFFcEMsQ0FBQztJQUNILGtCQUFDO0FBQUQsQ0FBQyxBQUpELElBSUM7Ozs7SUFIYSw4QkFBd0I7O0FBS3RDO0lBQ2lELHVEQUFjO0lBUTdELHFDQUFzQixJQUFnQixFQUFVLEtBQXFCO1FBQXJFLFlBQ0UsaUJBQU8sU0FDUjtRQUZxQixVQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsV0FBSyxHQUFMLEtBQUssQ0FBZ0I7UUFGM0Qsb0JBQWMsR0FBb0MsMkJBQTJCLENBQUM7O0lBSXhGLENBQUM7Ozs7O0lBUk0saUNBQUs7Ozs7SUFBWixVQUFhLE9BQXdDO1FBQ25E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QUFJLEdBQUcsWUFBWSx1QkFBdUIsRUFBRTtZQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQjthQUFNLElBQUksR0FBRyxZQUFZLFdBQVcsRUFBRTtZQUNyQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztTQUN0QjthQUFNO1lBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxZQUFZLENBQ2pCLElBQUksWUFBWSxDQUNkLEtBQUssRUFDTCxHQUFHLEVBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBSSxNQUFNLHNCQUFtQixDQUFDLEVBQzVDLE1BQU0sQ0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDOztnQkEzT0YsVUFBVTs7OztnQkFiRixVQUFVO2dCQUVWLGNBQWM7O0lBdVB2QixrQ0FBQztDQUFBLEFBNU9ELENBQ2lELGNBQWMsR0EyTzlEO1NBM09ZLDJCQUEyQjs7Ozs7O0lBTXRDLHFEQUF3Rjs7Ozs7SUFFNUUsMkNBQTBCOzs7OztJQUFFLDRDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE5CX0FVVEhfT1BUSU9OUyxcclxuICBOYkF1dGhJbGxlZ2FsVG9rZW5FcnJvcixcclxuICBOYkF1dGhSZXN1bHQsXHJcbiAgTmJBdXRoU3RyYXRlZ3ksIE5iQXV0aFN0cmF0ZWd5Q2xhc3NcclxufSBmcm9tICdAbmVidWxhci9hdXRoJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgbWFwLCBjYXRjaEVycm9yLCBjb25jYXRBbGwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlLCBIdHRwUmVzcG9uc2VCYXNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyB0aHJvd0Vycm9yIGFzIF9vYnNlcnZhYmxlVGhyb3cgfSBmcm9tICdyeGpzL2luZGV4JztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOYW1lUGFzc3dvcmRBdXRoU3RyYXRlZ3lPcHRpb25zLCBuYW1lUGFzc3dvcmRTdHJhdGVneU9wdGlvbnMgfSBmcm9tICcuL25hbWUtcGFzc3dvcmQtc3RyYXRlZ3ktb3B0aW9uJztcclxuaW1wb3J0ICogYXMgSlNFbmNyeXB0IGZyb20gJ2pzZW5jcnlwdCc7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFJlc3VsdEVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZTogU3RyaW5nW10pIHtcclxuXHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYW1lUGFzc3dvcmRTdHJhdGVneVNlcnZpY2UgZXh0ZW5kcyBOYkF1dGhTdHJhdGVneSB7XHJcblxyXG4gIHN0YXRpYyBzZXR1cChvcHRpb25zOiBOYW1lUGFzc3dvcmRBdXRoU3RyYXRlZ3lPcHRpb25zKTogW05iQXV0aFN0cmF0ZWd5Q2xhc3MsIE5hbWVQYXNzd29yZEF1dGhTdHJhdGVneU9wdGlvbnNdIHtcclxuICAgIHJldHVybiBbTmFtZVBhc3N3b3JkU3RyYXRlZ3lTZXJ2aWNlLCBvcHRpb25zXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkZWZhdWx0T3B0aW9uczogTmFtZVBhc3N3b3JkQXV0aFN0cmF0ZWd5T3B0aW9ucyA9IG5hbWVQYXNzd29yZFN0cmF0ZWd5T3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgYXV0aGVudGljYXRlKGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgY29uc3QgbW9kdWxlID0gJ2xvZ2luJztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ubWV0aG9kYCk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFjdGlvbkVuZHBvaW50KG1vZHVsZSk7XHJcbiAgICBjb25zdCByZXF1aXJlVmFsaWRUb2tlbiA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVxdWlyZVZhbGlkVG9rZW5gKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkubG9naW5JRCA9IGRhdGEubG9naW5JZDtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KG1ldGhvZCwgdXJsLCB7IGJvZHksIG9ic2VydmU6ICdyZXNwb25zZScgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LmFsd2F5c0ZhaWxgKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKGRhdGEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdldE9wdGlvbignc3VjY2Vzcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBSZXN1bHRFcnJvcih0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgcmVzLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVkaXJlY3Quc3VjY2Vzc2ApLFxyXG4gICAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pLCBjb25jYXRBbGwoKSk7XHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBsb2dvdXQoKTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIGNvbnN0IG1vZHVsZSA9ICdsb2dvdXQnO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuXHJcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHt9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHJlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XHJcbiAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KSxcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBOYkF1dGhSZXN1bHQoXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgIHJlcyxcclxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZWRpcmVjdC5zdWNjZXNzYCksXHJcbiAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2hUb2tlbihkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICByZWdpc3RlcihkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICByZXF1ZXN0UGFzc3dvcmQoZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRQYXNzd29yZChkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIGNvbnN0IG1vZHVsZSA9ICdyZXNldFBhc3MnO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmROZXcgKyAnLScgKyBkYXRhLmxvZ2luUGFzc3dvcmRPbGQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkucGFzc3dvcmREYXRhID0gYm9keS5sb2dpblBhc3N3b3JkO1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgYm9keSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVGYWlsUmVzcG9uc2UoZGF0YSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZ2V0T3B0aW9uKCdzdWNjZXNzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc3VsdEVycm9yKHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOYkF1dGhSZXN1bHQoXHJcbiAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICByZXMsXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZWRpcmVjdC5zdWNjZXNzYCksXHJcbiAgICAgICAgICAgICAgW10sXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oJ21lc3NhZ2VzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlc3BvbnNlRXJyb3IocmVzLCBtb2R1bGUpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfSksIGNvbmNhdEFsbCgpKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVVzZXIoZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XHJcbiAgICBjb25zdCBtb2R1bGUgPSAnY3JlYXRlVXNlcic7XHJcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9Lm1ldGhvZGApO1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRBY3Rpb25FbmRwb2ludChtb2R1bGUpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5jcnlwdFBhc3N3b3JkKGRhdGEubG9naW5QYXNzd29yZCkucGlwZShtYXAoKGJvZHkpID0+IHtcclxuICAgICAgYm9keS51c2VyTmFtZSA9IGRhdGEudXNlck5hbWU7XHJcbiAgICAgIGJvZHkubG9naW5JRCA9IGRhdGEubG9naW5JRDtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KG1ldGhvZCwgdXJsLCB7IGJvZHksIG9ic2VydmU6ICdyZXNwb25zZScgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LmFsd2F5c0ZhaWxgKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKGRhdGEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdldE9wdGlvbignc3VjY2Vzcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBSZXN1bHRFcnJvcih0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgcmVzLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVkaXJlY3Quc3VjY2Vzc2ApLFxyXG4gICAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pLCBjb25jYXRBbGwoKSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQYXNzd29yZEZvckFkbWluKGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgY29uc3QgbW9kdWxlID0gJ3VwZGF0ZVBhc3N3b3JkRm9yQWRtaW4nO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkudXNlcklEID0gZGF0YS51c2VySUQ7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChtZXRob2QsIHVybCwgeyBib2R5LCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5hbHdheXNGYWlsYCkpIHtcclxuICAgICAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUZhaWxSZXNwb25zZShkYXRhKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5nZXRPcHRpb24oJ3N1Y2Nlc3MuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzdWx0RXJyb3IodGhpcy5nZXRPcHRpb24oJ21lc3NhZ2VzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5iQXV0aFJlc3VsdChcclxuICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgIHJlcyxcclxuICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LnN1Y2Nlc3NgKSxcclxuICAgICAgICAgICAgICBbXSxcclxuICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChyZXMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9KSwgY29uY2F0QWxsKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldEVuY3J5cHRQYXNzd29yZChwYXNzd29yZCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBtb2R1bGUgPSAnZ2V0UHVibGljS2V5JztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ubWV0aG9kYCk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFjdGlvbkVuZHBvaW50KG1vZHVsZSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGVuY3J5cHRQYXNzd29yZChyZXMuYm9keSwgcGFzc3dvcmQpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuXHJcbiAgICBmdW5jdGlvbiBlbmNyeXB0UGFzc3dvcmQocmVzdWx0LCBkYXRhKSB7XHJcbiAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICBsZXQgZW5jcnlwdCA9IG5ldyBKU0VuY3J5cHQuSlNFbmNyeXB0KCk7XHJcbiAgICAgIGVuY3J5cHQuc2V0UHVibGljS2V5KHJlc3VsdC5kYXRhLnB1YmxpY1BFTUtleSk7XHJcbiAgICAgIGxldCBlbmNyeXB0UGFzcyA9IGVuY3J5cHQuZW5jcnlwdChkYXRhICsgbm93KTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjcnlwdG9LZXlJRDogcmVzdWx0LmRhdGEuY3J5cHRvS2V5SUQsXHJcbiAgICAgICAgdXRjVGltZXN0YW1wOiBub3csXHJcbiAgICAgICAgbG9naW5QYXNzd29yZDogZW5jcnlwdFBhc3NcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlUmVzcG9uc2VFcnJvcihyZXM6IGFueSwgbW9kdWxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgbGV0IGVycm9ycyA9IFtdO1xyXG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIGVycm9ycyA9IHRoaXMuZ2V0T3B0aW9uKCdlcnJvcnMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucyk7XHJcbiAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIE5iQXV0aElsbGVnYWxUb2tlbkVycm9yKSB7XHJcbiAgICAgIGVycm9ycy5wdXNoKHJlcy5tZXNzYWdlKTtcclxuICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgUmVzdWx0RXJyb3IpIHtcclxuICAgICAgZXJyb3JzID0gcmVzLm1lc3NhZ2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlcnJvcnMucHVzaCgnU29tZXRoaW5nIHdlbnQgd3JvbmcuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKFxyXG4gICAgICBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIHJlcyxcclxuICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LmZhaWx1cmVgKSxcclxuICAgICAgICBlcnJvcnNcclxuICAgICAgKSk7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=
|