@linid-dm/directory-manager-client-core
Version:
Core package by providing a set of angular components for the Directory Manager app.
148 lines • 21.5 kB
JavaScript
/**
* Copyright (C) 2020-2024 Linagora
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version, provided you comply with the Additional Terms applicable for
* LinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU
* Affero General Public License, subsections (b), (c), and (e), pursuant to
* which these Appropriate Legal Notices must notably (i) retain the display of
* the "LinID™" trademark/logo at the top of the interface window, the display
* of the “You are using the Open Source and free version of LinID™, powered by
* Linagora © 2009–2013. Contribute to LinID R&D by subscribing to an Enterprise
* offer!” infobox and in the e-mails sent with the Program, notice appended to
* any type of outbound messages (e.g. e-mail and meeting requests) as well as
* in the LinID Directory Manager user interface, (ii) retain all hypertext
* links between LinID Directory Manager and https://linid.org/, as well as
* between LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA
* intellectual property rights over its trademarks and commercial brands. Other
* Additional Terms apply, see <http://www.linagora.com/licenses/> for more
* details.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License and
* its applicable Additional Terms for LinID Directory Manager along with this
* program. If not, see <http://www.gnu.org/licenses/> for the GNU Affero
* General Public License version 3 and <http://www.linagora.com/licenses/> for
* the Additional Terms applicable to the LinID Directory Manager software.
*/
import { Injectable } from '@angular/core';
import { first, of, switchMap } from 'rxjs';
import { HomepageGuard } from './features/homepage/homepage.guard';
import { DataDetailGuard } from './features/homepage/resource-page/data-detail/data-detail.guard';
import { LoginGuard } from './features/login/login.guard';
import * as i0 from "@angular/core";
import * as i1 from "@ngxs/store";
import * as i2 from "ngx-toastr";
import * as i3 from "@angular/router";
import * as i4 from "angular-oauth2-oidc";
import * as i5 from "../../shared";
import * as i6 from "./features/homepage/resource-page/resource-page.guard";
import * as i7 from "./features/homepage/resource-page/data-detail/data-detail.guard";
export const GUARDS = {
LoginGuard: 'LoginGuard',
HomepageGuard: 'HomepageGuard',
ResourcePageGuard: 'ResourcePageGuard',
DataDetailGuard: 'DataDetailGuard',
};
export class AppGuard {
// you may need to include dependencies of individual guards if specified in guard constructor
constructor(_store$, _actions$, _toastrService, _router, _oauthService, _env, _resourcePageGuard, _dataDetailGuard) {
this._store$ = _store$;
this._actions$ = _actions$;
this._toastrService = _toastrService;
this._router = _router;
this._oauthService = _oauthService;
this._env = _env;
this._resourcePageGuard = _resourcePageGuard;
this._dataDetailGuard = _dataDetailGuard;
}
// This method gets triggered when the route is hit
canActivate(route, state) {
this._route = route;
this._state = state;
if (!route.data) {
of(true);
return;
}
// this.route.data.guards is an array of strings set in routing configuration
if (!this._route.data.canActivateGuards ||
!this._route.data.canActivateGuards.length) {
of(true);
return;
}
return this.executeGuards('canActivateGuards');
}
canDeactivate(component, route, state, nextState) {
this._route = route;
this._state = state;
this._component = component;
this._nextState = nextState;
if (!route.data) {
of(true);
return;
}
// this.route.data.guards is an array of strings set in routing configuration
if (!this._route.data.canDeactivateGuards ||
!this._route.data.canDeactivateGuards.length) {
of(true);
return;
}
return this.executeGuards('canDeactivateGuards');
}
// Execute the guards sent in the route data
executeGuards(guardType, guardIndex = 0) {
return this.activateGuard(guardType, this._route.data[guardType][guardIndex]).pipe(first(), switchMap((guardResponse) => {
if (guardResponse &&
guardIndex < this._route.data[guardType].length - 1) {
return this.executeGuards(guardType, guardIndex + 1);
}
else {
return of(guardResponse);
}
}));
}
// Create an instance of the guard and fire canActivate method returning a promise
activateGuard(guardType, guardKey) {
let guard;
switch (guardKey) {
case GUARDS.LoginGuard:
guard = new LoginGuard(this._router, this._store$, this._oauthService, this._env);
break;
case GUARDS.HomepageGuard:
guard = new HomepageGuard(this._store$, this._actions$, this._toastrService);
break;
case GUARDS.ResourcePageGuard:
this._resourcePageGuard.resetGuardProperties();
guard = this._resourcePageGuard;
break;
case GUARDS.DataDetailGuard:
this._dataDetailGuard.resetGuardProperties();
guard = this._dataDetailGuard;
break;
default:
break;
}
if (guardType === 'canActivateGuards') {
return guard.canActivate(this._route, this._state);
}
else if (guardType === 'canDeactivateGuards' &&
guard instanceof DataDetailGuard) {
return guard.canDeactivate(this._component, this._route, this._state, this._nextState);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: AppGuard, deps: [{ token: i1.Store }, { token: i1.Actions }, { token: i2.ToastrService }, { token: i3.Router }, { token: i4.OAuthService }, { token: i5.EnvService }, { token: i6.ResourcePageGuard }, { token: i7.DataDetailGuard }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: AppGuard, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: AppGuard, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: () => [{ type: i1.Store }, { type: i1.Actions }, { type: i2.ToastrService }, { type: i3.Router }, { type: i4.OAuthService }, { type: i5.EnvService }, { type: i6.ResourcePageGuard }, { type: i7.DataDetailGuard }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbGlicy9jbGllbnQtY29yZS9zcmMvbGliL2RtLWNvcmUvYXBwL2FwcC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBWTNDLE9BQU8sRUFBYyxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlFQUFpRSxDQUFDO0FBRWxHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7O0FBRTFELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRztJQUNwQixVQUFVLEVBQUUsWUFBWTtJQUN4QixhQUFhLEVBQUUsZUFBZTtJQUM5QixpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsZUFBZSxFQUFFLGlCQUFpQjtDQUNuQyxDQUFDO0FBS0YsTUFBTSxPQUFPLFFBQVE7SUFDbkIsOEZBQThGO0lBQzlGLFlBQ1UsT0FBYyxFQUNkLFNBQWtCLEVBQ2xCLGNBQTZCLEVBQzdCLE9BQWUsRUFDZixhQUEyQixFQUMzQixJQUFnQixFQUNoQixrQkFBcUMsRUFDckMsZ0JBQWlDO1FBUGpDLFlBQU8sR0FBUCxPQUFPLENBQU87UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUFTO1FBQ2xCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FB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YTtnQkFDdkIsS0FBSyxHQUFHLElBQUksYUFBYSxDQUN2QixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FDcEIsQ0FBQztnQkFDRixNQUFNO1lBQ1IsS0FBSyxNQUFNLENBQUMsaUJBQWlCO2dCQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDL0MsS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDaEMsTUFBTTtZQUNSLEtBQUssTUFBTSxDQUFDLGVBQWU7Z0JBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM3QyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2dCQUM5QixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTTtRQUNWLENBQUM7UUFDRCxJQUFJLFNBQVMsS0FBSyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDO2FBQU0sSUFDTCxTQUFTLEtBQUsscUJBQXFCO1lBQ25DLEtBQUssWUFBWSxlQUFlLEVBQ2hDLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQyxhQUFhLENBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQzs4R0E3SVUsUUFBUTtrSEFBUixRQUFRLGNBRlAsTUFBTTs7MkZBRVAsUUFBUTtrQkFIcEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI0IExpbmFnb3JhXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXJcbiAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxuICogU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnlcbiAqIGxhdGVyIHZlcnNpb24sIHByb3ZpZGVkIHlvdSBjb21wbHkgd2l0aCB0aGUgQWRkaXRpb25hbCBUZXJtcyBhcHBsaWNhYmxlIGZvclxuICogTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgc29mdHdhcmUgYnkgTElOQUdPUkEgcHVyc3VhbnQgdG8gU2VjdGlvbiA3IG9mIHRoZSBHTlVcbiAqIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzdWJzZWN0aW9ucyAoYiksIChjKSwgYW5kIChlKSwgcHVyc3VhbnQgdG9cbiAqIHdoaWNoIHRoZXNlIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMgbXVzdCBub3RhYmx5IChpKSByZXRhaW4gdGhlIGRpc3BsYXkgb2ZcbiAqIHRoZSBcIkxpbklE4oSiXCIgdHJhZGVtYXJrL2xvZ28gYXQgdGhlIHRvcCBvZiB0aGUgaW50ZXJmYWNlIHdpbmRvdywgdGhlIGRpc3BsYXlcbiAqIG9mIHRoZSDigJxZb3UgYXJlIHVzaW5nIHRoZSBPcGVuIFNvdXJjZSBhbmQgZnJlZSB2ZXJzaW9uIG9mIExpbklE4oSiLCBwb3dlcmVkIGJ5XG4gKiBMaW5hZ29yYSDCqSAyMDA54oCTMjAxMy4gQ29udHJpYnV0ZSB0byBMaW5JRCBSJkQgYnkgc3Vic2NyaWJpbmcgdG8gYW4gRW50ZXJwcmlzZVxuICogb2ZmZXIh4oCdIGluZm9ib3ggYW5kIGluIHRoZSBlLW1haWxzIHNlbnQgd2l0aCB0aGUgUHJvZ3JhbSwgbm90aWNlIGFwcGVuZGVkIHRvXG4gKiBhbnkgdHlwZSBvZiBvdXRib3VuZCBtZXNzYWdlcyAoZS5nLiBlLW1haWwgYW5kIG1lZXRpbmcgcmVxdWVzdHMpIGFzIHdlbGwgYXNcbiAqIGluIHRoZSBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciB1c2VyIGludGVyZmFjZSwgKGlpKSByZXRhaW4gYWxsIGh5cGVydGV4dFxuICogbGlua3MgYmV0d2VlbiBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBhbmQgaHR0cHM6Ly9saW5pZC5vcmcvLCBhcyB3ZWxsIGFzXG4gKiBiZXR3ZWVuIExJTkFHT1JBIGFuZCBMSU5BR09SQS5jb20sIGFuZCAoaWlpKSByZWZyYWluIGZyb20gaW5mcmluZ2luZyBMSU5BR09SQVxuICogaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvdmVyIGl0cyB0cmFkZW1hcmtzIGFuZCBjb21tZXJjaWFsIGJyYW5kcy4gT3RoZXJcbiAqIEFkZGl0aW9uYWwgVGVybXMgYXBwbHksIHNlZSA8aHR0cDovL3d3dy5saW5hZ29yYS5jb20vbGljZW5zZXMvPiBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTXG4gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlXG4gKiBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmRcbiAqIGl0cyBhcHBsaWNhYmxlIEFkZGl0aW9uYWwgVGVybXMgZm9yIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIGFsb25nIHdpdGggdGhpc1xuICogcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+IGZvciB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgYW5kIDxodHRwOi8vd3d3LmxpbmFnb3JhLmNvbS9saWNlbnNlcy8+IGZvclxuICogdGhlIEFkZGl0aW9uYWwgVGVybXMgYXBwbGljYWJsZSB0byB0aGUgTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgc29mdHdhcmUuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgQ2FuQWN0aXZhdGUsXG4gIENhbkRlYWN0aXZhdGUsXG4gIFJvdXRlcixcbiAgUm91dGVyU3RhdGVTbmFwc2hvdCxcbiAgVXJsVHJlZSxcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEFjdGlvbnMsIFN0b3JlIH0gZnJvbSAnQG5neHMvc3RvcmUnO1xuaW1wb3J0IHsgT0F1dGhTZXJ2aWNlIH0gZnJvbSAnYW5ndWxhci1vYXV0aDItb2lkYyc7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmaXJzdCwgb2YsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRW52U2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBIb21lcGFnZUd1YXJkIH0gZnJvbSAnLi9mZWF0dXJlcy9ob21lcGFnZS9ob21lcGFnZS5ndWFyZCc7XG5pbXBvcnQgeyBEYXRhRGV0YWlsR3VhcmQgfSBmcm9tICcuL2ZlYXR1cmVzL2hvbWVwYWdlL3Jlc291cmNlLXBhZ2UvZGF0YS1kZXRhaWwvZGF0YS1kZXRhaWwuZ3VhcmQnO1xuaW1wb3J0IHsgUmVzb3VyY2VQYWdlR3VhcmQgfSBmcm9tICcuL2ZlYXR1cmVzL2hvbWVwYWdlL3Jlc291cmNlLXBhZ2UvcmVzb3VyY2UtcGFnZS5ndWFyZCc7XG5pbXBvcnQgeyBMb2dpbkd1YXJkIH0gZnJvbSAnLi9mZWF0dXJlcy9sb2dpbi9sb2dpbi5ndWFyZCc7XG5cbmV4cG9ydCBjb25zdCBHVUFSRFMgPSB7XG4gIExvZ2luR3VhcmQ6ICdMb2dpbkd1YXJkJyxcbiAgSG9tZXBhZ2VHdWFyZDogJ0hvbWVwYWdlR3VhcmQnLFxuICBSZXNvdXJjZVBhZ2VHdWFyZDogJ1Jlc291cmNlUGFnZUd1YXJkJyxcbiAgRGF0YURldGFpbEd1YXJkOiAnRGF0YURldGFpbEd1YXJkJyxcbn07XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5EZWFjdGl2YXRlPHVua25vd24+IHtcbiAgLy8geW91IG1heSBuZWVkIHRvIGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIGluZGl2aWR1YWwgZ3VhcmRzIGlmIHNwZWNpZmllZCBpbiBndWFyZCBjb25zdHJ1Y3RvclxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9zdG9yZSQ6IFN0b3JlLFxuICAgIHByaXZhdGUgX2FjdGlvbnMkOiBBY3Rpb25zLFxuICAgIHByaXZhdGUgX3RvYXN0clNlcnZpY2U6IFRvYXN0clNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBfb2F1dGhTZXJ2aWNlOiBPQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfZW52OiBFbnZTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3Jlc291cmNlUGFnZUd1YXJkOiBSZXNvdXJjZVBhZ2VHdWFyZCxcbiAgICBwcml2YXRlIF9kYXRhRGV0YWlsR3VhcmQ6IERhdGFEZXRhaWxHdWFyZFxuICApIHt9XG5cbiAgcHJpdmF0ZSBfcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Q7XG4gIHByaXZhdGUgX3N0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90O1xuICBwcml2YXRlIF9uZXh0U3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3Q7XG4gIHByaXZhdGUgX2NvbXBvbmVudDogdW5rbm93bjtcblxuICAvLyBUaGlzIG1ldGhvZCBnZXRzIHRyaWdnZXJlZCB3aGVuIHRoZSByb3V0ZSBpcyBoaXRcbiAgcHVibGljIGNhbkFjdGl2YXRlKFxuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICAgIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90XG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFVybFRyZWU+IHtcbiAgICB0aGlzLl9yb3V0ZSA9IHJvdXRlO1xuICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG5cbiAgICBpZiAoIXJvdXRlLmRhdGEpIHtcbiAgICAgIG9mKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRoaXMucm91dGUuZGF0YS5ndWFyZHMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBzZXQgaW4gcm91dGluZyBjb25maWd1cmF0aW9uXG5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5fcm91dGUuZGF0YS5jYW5BY3RpdmF0ZUd1YXJkcyB8fFxuICAgICAgIXRoaXMuX3JvdXRlLmRhdGEuY2FuQWN0aXZhdGVHdWFyZHMubGVuZ3RoXG4gICAgKSB7XG4gICAgICBvZih0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUd1YXJkcygnY2FuQWN0aXZhdGVHdWFyZHMnKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5EZWFjdGl2YXRlKFxuICAgIGNvbXBvbmVudDogdW5rbm93bixcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgICBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCxcbiAgICBuZXh0U3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3RcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4ge1xuICAgIHRoaXMuX3JvdXRlID0gcm91dGU7XG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLl9jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgdGhpcy5fbmV4dFN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgaWYgKCFyb3V0ZS5kYXRhKSB7XG4gICAgICBvZih0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0aGlzLnJvdXRlLmRhdGEuZ3VhcmRzIGlzIGFuIGFycmF5IG9mIHN0cmluZ3Mgc2V0IGluIHJvdXRpbmcgY29uZmlndXJhdGlvblxuXG4gICAgaWYgKFxuICAgICAgIXRoaXMuX3JvdXRlLmRhdGEuY2FuRGVhY3RpdmF0ZUd1YXJkcyB8fFxuICAgICAgIXRoaXMuX3JvdXRlLmRhdGEuY2FuRGVhY3RpdmF0ZUd1YXJkcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIG9mKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlR3VhcmRzKCdjYW5EZWFjdGl2YXRlR3VhcmRzJyk7XG4gIH1cblxuICAvLyBFeGVjdXRlIHRoZSBndWFyZHMgc2VudCBpbiB0aGUgcm91dGUgZGF0YVxuICBwcml2YXRlIGV4ZWN1dGVHdWFyZHMoXG4gICAgZ3VhcmRUeXBlOiBzdHJpbmcsXG4gICAgZ3VhcmRJbmRleCA9IDBcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2YXRlR3VhcmQoXG4gICAgICBndWFyZFR5cGUsXG4gICAgICB0aGlzLl9yb3V0ZS5kYXRhW2d1YXJkVHlwZV1bZ3VhcmRJbmRleF1cbiAgICApLnBpcGUoXG4gICAgICBmaXJzdCgpLFxuICAgICAgc3dpdGNoTWFwKChndWFyZFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBndWFyZFJlc3BvbnNlICYmXG4gICAgICAgICAgZ3VhcmRJbmRleCA8IHRoaXMuX3JvdXRlLmRhdGFbZ3VhcmRUeXBlXS5sZW5ndGggLSAxXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVHdWFyZHMoZ3VhcmRUeXBlLCBndWFyZEluZGV4ICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9mKGd1YXJkUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGd1YXJkIGFuZCBmaXJlIGNhbkFjdGl2YXRlIG1ldGhvZCByZXR1cm5pbmcgYSBwcm9taXNlXG4gIHByaXZhdGUgYWN0aXZhdGVHdWFyZChcbiAgICBndWFyZFR5cGU6IHN0cmluZyxcbiAgICBndWFyZEtleTogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFVybFRyZWU+IHtcbiAgICBsZXQgZ3VhcmQ6IExvZ2luR3VhcmQgfCBIb21lcGFnZUd1YXJkIHwgUmVzb3VyY2VQYWdlR3VhcmQgfCBEYXRhRGV0YWlsR3VhcmQ7XG5cbiAgICBzd2l0Y2ggKGd1YXJkS2V5KSB7XG4gICAgICBjYXNlIEdVQVJEUy5Mb2dpbkd1YXJkOlxuICAgICAgICBndWFyZCA9IG5ldyBMb2dpbkd1YXJkKFxuICAgICAgICAgIHRoaXMuX3JvdXRlcixcbiAgICAgICAgICB0aGlzLl9zdG9yZSQsXG4gICAgICAgICAgdGhpcy5fb2F1dGhTZXJ2aWNlLFxuICAgICAgICAgIHRoaXMuX2VudlxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgR1VBUkRTLkhvbWVwYWdlR3VhcmQ6XG4gICAgICAgIGd1YXJkID0gbmV3IEhvbWVwYWdlR3VhcmQoXG4gICAgICAgICAgdGhpcy5fc3RvcmUkLFxuICAgICAgICAgIHRoaXMuX2FjdGlvbnMkLFxuICAgICAgICAgIHRoaXMuX3RvYXN0clNlcnZpY2VcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEdVQVJEUy5SZXNvdXJjZVBhZ2VHdWFyZDpcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VQYWdlR3VhcmQucmVzZXRHdWFyZFByb3BlcnRpZXMoKTtcbiAgICAgICAgZ3VhcmQgPSB0aGlzLl9yZXNvdXJjZVBhZ2VHdWFyZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEdVQVJEUy5EYXRhRGV0YWlsR3VhcmQ6XG4gICAgICAgIHRoaXMuX2RhdGFEZXRhaWxHdWFyZC5yZXNldEd1YXJkUHJvcGVydGllcygpO1xuICAgICAgICBndWFyZCA9IHRoaXMuX2RhdGFEZXRhaWxHdWFyZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKGd1YXJkVHlwZSA9PT0gJ2NhbkFjdGl2YXRlR3VhcmRzJykge1xuICAgICAgcmV0dXJuIGd1YXJkLmNhbkFjdGl2YXRlKHRoaXMuX3JvdXRlLCB0aGlzLl9zdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGd1YXJkVHlwZSA9PT0gJ2NhbkRlYWN0aXZhdGVHdWFyZHMnICYmXG4gICAgICBndWFyZCBpbnN0YW5jZW9mIERhdGFEZXRhaWxHdWFyZFxuICAgICkge1xuICAgICAgcmV0dXJuIGd1YXJkLmNhbkRlYWN0aXZhdGUoXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudCxcbiAgICAgICAgdGhpcy5fcm91dGUsXG4gICAgICAgIHRoaXMuX3N0YXRlLFxuICAgICAgICB0aGlzLl9uZXh0U3RhdGVcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=