UNPKG

angular-auth-oidc-client

Version:
132 lines 22.2 kB
import { inject, Injectable, isDevMode } from '@angular/core'; import { forkJoin, of } from 'rxjs'; import { concatMap, map } from 'rxjs/operators'; import { LoggerService } from '../logging/logger.service'; import { EventTypes } from '../public-events/event-types'; import { PublicEventsService } from '../public-events/public-events.service'; import { StoragePersistenceService } from '../storage/storage-persistence.service'; import { PlatformProvider } from '../utils/platform-provider/platform.provider'; import { AuthWellKnownService } from './auth-well-known/auth-well-known.service'; import { DEFAULT_CONFIG } from './default-config'; import { StsConfigLoader } from './loader/config-loader'; import { ConfigValidationService } from './validation/config-validation.service'; import * as i0 from "@angular/core"; export class ConfigurationService { constructor() { this.loggerService = inject(LoggerService); this.publicEventsService = inject(PublicEventsService); this.storagePersistenceService = inject(StoragePersistenceService); this.platformProvider = inject(PlatformProvider); this.authWellKnownService = inject(AuthWellKnownService); this.loader = inject(StsConfigLoader); this.configValidationService = inject(ConfigValidationService); this.configsInternal = {}; } hasManyConfigs() { return Object.keys(this.configsInternal).length > 1; } getAllConfigurations() { return Object.values(this.configsInternal); } getOpenIDConfiguration(configId) { if (this.configsAlreadySaved()) { return of(this.getConfig(configId)); } return this.getOpenIDConfigurations(configId).pipe(map((result) => result.currentConfig)); } getOpenIDConfigurations(configId) { return this.loadConfigs().pipe(concatMap((allConfigs) => this.prepareAndSaveConfigs(allConfigs)), map((allPreparedConfigs) => ({ allConfigs: allPreparedConfigs, currentConfig: this.getConfig(configId), }))); } hasAtLeastOneConfig() { return Object.keys(this.configsInternal).length > 0; } saveConfig(readyConfig) { const { configId } = readyConfig; this.configsInternal[configId] = readyConfig; } loadConfigs() { return this.loader.loadConfigs(); } configsAlreadySaved() { return this.hasAtLeastOneConfig(); } getConfig(configId) { if (Boolean(configId)) { const config = this.configsInternal[configId]; if (!config && isDevMode()) { console.warn(`[angular-auth-oidc-client] No configuration found for config id '${configId}'.`); } return config || null; } const [, value] = Object.entries(this.configsInternal)[0] || [[null, null]]; return value || null; } prepareAndSaveConfigs(passedConfigs) { if (!this.configValidationService.validateConfigs(passedConfigs)) { return of([]); } this.createUniqueIds(passedConfigs); const allHandleConfigs$ = passedConfigs.map((x) => this.handleConfig(x)); const as = forkJoin(allHandleConfigs$).pipe(map((config) => config.filter((conf) => Boolean(conf))), map((c) => c)); return as; } createUniqueIds(passedConfigs) { passedConfigs.forEach((config, index) => { if (!config.configId) { config.configId = `${index}-${config.clientId}`; } }); } handleConfig(passedConfig) { if (!this.configValidationService.validateConfig(passedConfig)) { this.loggerService.logError(passedConfig, 'Validation of config rejected with errors. Config is NOT set.'); return of(null); } if (!passedConfig.authWellknownEndpointUrl) { passedConfig.authWellknownEndpointUrl = passedConfig.authority; } const usedConfig = this.prepareConfig(passedConfig); this.saveConfig(usedConfig); const configWithAuthWellKnown = this.enhanceConfigWithWellKnownEndpoint(usedConfig); this.publicEventsService.fireEvent(EventTypes.ConfigLoaded, configWithAuthWellKnown); return of(usedConfig); } enhanceConfigWithWellKnownEndpoint(configuration) { const alreadyExistingAuthWellKnownEndpoints = this.storagePersistenceService.read('authWellKnownEndPoints', configuration); if (!!alreadyExistingAuthWellKnownEndpoints) { configuration.authWellknownEndpoints = alreadyExistingAuthWellKnownEndpoints; return configuration; } const passedAuthWellKnownEndpoints = configuration.authWellknownEndpoints; if (!!passedAuthWellKnownEndpoints) { this.authWellKnownService.storeWellKnownEndpoints(configuration, passedAuthWellKnownEndpoints); configuration.authWellknownEndpoints = passedAuthWellKnownEndpoints; return configuration; } return configuration; } prepareConfig(configuration) { const openIdConfigurationInternal = { ...DEFAULT_CONFIG, ...configuration }; this.setSpecialCases(openIdConfigurationInternal); return openIdConfigurationInternal; } setSpecialCases(currentConfig) { if (!this.platformProvider.isBrowser()) { currentConfig.startCheckSession = false; currentConfig.silentRenew = false; currentConfig.useRefreshToken = false; currentConfig.usePushedAuthorisationRequests = false; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: ConfigurationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: ConfigurationService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: ConfigurationService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWF1dGgtb2lkYy1jbGllbnQvc3JjL2xpYi9jb25maWcvY29uZmlnLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOztBQUdqRixNQUFNLE9BQU8sb0JBQW9CO0lBRGpDO1FBRW1CLGtCQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXRDLHdCQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRWxELDhCQUF5QixHQUFHLE1BQU0sQ0FDakQseUJBQXlCLENBQzFCLENBQUM7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YUFBa0M7UUFFbEMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLEdBQUcsY0FBYyxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUM7UUFFNUUsSUFBSSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBRWxELE9BQU8sMkJBQTJCLENBQUM7SUFDckMsQ0FBQztJQUVPLGVBQWUsQ0FBQyxhQUFrQztRQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDdkMsYUFBYSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUN4QyxhQUFhLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUNsQyxhQUFhLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUN0QyxhQUFhLENBQUMsOEJBQThCLEdBQUcsS0FBSyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDOzhHQS9MVSxvQkFBb0I7a0hBQXBCLG9CQUFvQixjQURQLE1BQU07OzJGQUNuQixvQkFBb0I7a0JBRGhDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3QsIEluamVjdGFibGUsIGlzRGV2TW9kZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjb25jYXRNYXAsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uL2xvZ2dpbmcvbG9nZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFdmVudFR5cGVzIH0gZnJvbSAnLi4vcHVibGljLWV2ZW50cy9ldmVudC10eXBlcyc7XHJcbmltcG9ydCB7IFB1YmxpY0V2ZW50c1NlcnZpY2UgfSBmcm9tICcuLi9wdWJsaWMtZXZlbnRzL3B1YmxpYy1ldmVudHMuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yYWdlL3N0b3JhZ2UtcGVyc2lzdGVuY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFBsYXRmb3JtUHJvdmlkZXIgfSBmcm9tICcuLi91dGlscy9wbGF0Zm9ybS1wcm92aWRlci9wbGF0Zm9ybS5wcm92aWRlcic7XHJcbmltcG9ydCB7IEF1dGhXZWxsS25vd25TZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLXdlbGwta25vd24vYXV0aC13ZWxsLWtub3duLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJRyB9IGZyb20gJy4vZGVmYXVsdC1jb25maWcnO1xyXG5pbXBvcnQgeyBTdHNDb25maWdMb2FkZXIgfSBmcm9tICcuL2xvYWRlci9jb25maWctbG9hZGVyJztcclxuaW1wb3J0IHsgT3BlbklkQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBDb25maWdWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4vdmFsaWRhdGlvbi9jb25maWctdmFsaWRhdGlvbi5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlID0gaW5qZWN0KExvZ2dlclNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHB1YmxpY0V2ZW50c1NlcnZpY2UgPSBpbmplY3QoUHVibGljRXZlbnRzU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZSA9IGluamVjdChcclxuICAgIFN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2VcclxuICApO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtUHJvdmlkZXIgPSBpbmplY3QoUGxhdGZvcm1Qcm92aWRlcik7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aFdlbGxLbm93blNlcnZpY2UgPSBpbmplY3QoQXV0aFdlbGxLbm93blNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRlciA9IGluamVjdChTdHNDb25maWdMb2FkZXIpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1ZhbGlkYXRpb25TZXJ2aWNlID0gaW5qZWN0KENvbmZpZ1ZhbGlkYXRpb25TZXJ2aWNlKTtcclxuXHJcbiAgcHJpdmF0ZSBjb25maWdzSW50ZXJuYWw6IFJlY29yZDxzdHJpbmcsIE9wZW5JZENvbmZpZ3VyYXRpb24+ID0ge307XHJcblxyXG4gIGhhc01hbnlDb25maWdzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnc0ludGVybmFsKS5sZW5ndGggPiAxO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWxsQ29uZmlndXJhdGlvbnMoKTogT3BlbklkQ29uZmlndXJhdGlvbltdIHtcclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY29uZmlnc0ludGVybmFsKTtcclxuICB9XHJcblxyXG4gIGdldE9wZW5JRENvbmZpZ3VyYXRpb24oXHJcbiAgICBjb25maWdJZD86IHN0cmluZ1xyXG4gICk6IE9ic2VydmFibGU8T3BlbklkQ29uZmlndXJhdGlvbiB8IG51bGw+IHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ3NBbHJlYWR5U2F2ZWQoKSkge1xyXG4gICAgICByZXR1cm4gb2YodGhpcy5nZXRDb25maWcoY29uZmlnSWQpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5nZXRPcGVuSURDb25maWd1cmF0aW9ucyhjb25maWdJZCkucGlwZShcclxuICAgICAgbWFwKChyZXN1bHQpID0+IHJlc3VsdC5jdXJyZW50Q29uZmlnKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldE9wZW5JRENvbmZpZ3VyYXRpb25zKGNvbmZpZ0lkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTx7XHJcbiAgICBhbGxDb25maWdzOiBPcGVuSWRDb25maWd1cmF0aW9uW107XHJcbiAgICBjdXJyZW50Q29uZmlnOiBPcGVuSWRDb25maWd1cmF0aW9uIHwgbnVsbDtcclxuICB9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkQ29uZmlncygpLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgoYWxsQ29uZmlncykgPT4gdGhpcy5wcmVwYXJlQW5kU2F2ZUNvbmZpZ3MoYWxsQ29uZmlncykpLFxyXG4gICAgICBtYXAoKGFsbFByZXBhcmVkQ29uZmlncykgPT4gKHtcclxuICAgICAgICBhbGxDb25maWdzOiBhbGxQcmVwYXJlZENvbmZpZ3MsXHJcbiAgICAgICAgY3VycmVudENvbmZpZzogdGhpcy5nZXRDb25maWcoY29uZmlnSWQpLFxyXG4gICAgICB9KSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBoYXNBdExlYXN0T25lQ29uZmlnKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnc0ludGVybmFsKS5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlQ29uZmlnKHJlYWR5Q29uZmlnOiBPcGVuSWRDb25maWd1cmF0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGNvbmZpZ0lkIH0gPSByZWFkeUNvbmZpZztcclxuXHJcbiAgICB0aGlzLmNvbmZpZ3NJbnRlcm5hbFtjb25maWdJZCBhcyBzdHJpbmddID0gcmVhZHlDb25maWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRDb25maWdzKCk6IE9ic2VydmFibGU8T3BlbklkQ29uZmlndXJhdGlvbltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkZXIubG9hZENvbmZpZ3MoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uZmlnc0FscmVhZHlTYXZlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0F0TGVhc3RPbmVDb25maWcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29uZmlnKGNvbmZpZ0lkPzogc3RyaW5nKTogT3BlbklkQ29uZmlndXJhdGlvbiB8IG51bGwge1xyXG4gICAgaWYgKEJvb2xlYW4oY29uZmlnSWQpKSB7XHJcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnc0ludGVybmFsW2NvbmZpZ0lkIV07XHJcblxyXG4gICAgICBpZighY29uZmlnICYmIGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBbYW5ndWxhci1hdXRoLW9pZGMtY2xpZW50XSBObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciBjb25maWcgaWQgJyR7Y29uZmlnSWR9Jy5gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGNvbmZpZyB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFssIHZhbHVlXSA9IE9iamVjdC5lbnRyaWVzKHRoaXMuY29uZmlnc0ludGVybmFsKVswXSB8fCBbW251bGwsIG51bGxdXTtcclxuXHJcbiAgICByZXR1cm4gdmFsdWUgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUFuZFNhdmVDb25maWdzKFxyXG4gICAgcGFzc2VkQ29uZmlnczogT3BlbklkQ29uZmlndXJhdGlvbltdXHJcbiAgKTogT2JzZXJ2YWJsZTxPcGVuSWRDb25maWd1cmF0aW9uW10+IHtcclxuICAgIGlmICghdGhpcy5jb25maWdWYWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUNvbmZpZ3MocGFzc2VkQ29uZmlncykpIHtcclxuICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNyZWF0ZVVuaXF1ZUlkcyhwYXNzZWRDb25maWdzKTtcclxuXHJcbiAgICBjb25zdCBhbGxIYW5kbGVDb25maWdzJCA9IHBhc3NlZENvbmZpZ3MubWFwKCh4KSA9PiB0aGlzLmhhbmRsZUNvbmZpZyh4KSk7XHJcbiAgICBjb25zdCBhcyA9IGZvcmtKb2luKGFsbEhhbmRsZUNvbmZpZ3MkKS5waXBlKFxyXG4gICAgICBtYXAoKGNvbmZpZykgPT4gY29uZmlnLmZpbHRlcigoY29uZikgPT4gQm9vbGVhbihjb25mKSkpLFxyXG4gICAgICBtYXAoKGMpID0+IGMgYXMgT3BlbklkQ29uZmlndXJhdGlvbltdKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gYXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVVuaXF1ZUlkcyhwYXNzZWRDb25maWdzOiBPcGVuSWRDb25maWd1cmF0aW9uW10pOiB2b2lkIHtcclxuICAgIHBhc3NlZENvbmZpZ3MuZm9yRWFjaCgoY29uZmlnLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAoIWNvbmZpZy5jb25maWdJZCkge1xyXG4gICAgICAgIGNvbmZpZy5jb25maWdJZCA9IGAke2luZGV4fS0ke2NvbmZpZy5jbGllbnRJZH1gO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlQ29uZmlnKFxyXG4gICAgcGFzc2VkQ29uZmlnOiBPcGVuSWRDb25maWd1cmF0aW9uXHJcbiAgKTogT2JzZXJ2YWJsZTxPcGVuSWRDb25maWd1cmF0aW9uIHwgbnVsbD4ge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZ1ZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQ29uZmlnKHBhc3NlZENvbmZpZykpIHtcclxuICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0Vycm9yKFxyXG4gICAgICAgIHBhc3NlZENvbmZpZyxcclxuICAgICAgICAnVmFsaWRhdGlvbiBvZiBjb25maWcgcmVqZWN0ZWQgd2l0aCBlcnJvcnMuIENvbmZpZyBpcyBOT1Qgc2V0LidcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXBhc3NlZENvbmZpZy5hdXRoV2VsbGtub3duRW5kcG9pbnRVcmwpIHtcclxuICAgICAgcGFzc2VkQ29uZmlnLmF1dGhXZWxsa25vd25FbmRwb2ludFVybCA9IHBhc3NlZENvbmZpZy5hdXRob3JpdHk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXNlZENvbmZpZyA9IHRoaXMucHJlcGFyZUNvbmZpZyhwYXNzZWRDb25maWcpO1xyXG5cclxuICAgIHRoaXMuc2F2ZUNvbmZpZyh1c2VkQ29uZmlnKTtcclxuXHJcbiAgICBjb25zdCBjb25maWdXaXRoQXV0aFdlbGxLbm93biA9XHJcbiAgICAgIHRoaXMuZW5oYW5jZUNvbmZpZ1dpdGhXZWxsS25vd25FbmRwb2ludCh1c2VkQ29uZmlnKTtcclxuXHJcbiAgICB0aGlzLnB1YmxpY0V2ZW50c1NlcnZpY2UuZmlyZUV2ZW50PE9wZW5JZENvbmZpZ3VyYXRpb24+KFxyXG4gICAgICBFdmVudFR5cGVzLkNvbmZpZ0xvYWRlZCxcclxuICAgICAgY29uZmlnV2l0aEF1dGhXZWxsS25vd25cclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG9mKHVzZWRDb25maWcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbmhhbmNlQ29uZmlnV2l0aFdlbGxLbm93bkVuZHBvaW50KFxyXG4gICAgY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvblxyXG4gICk6IE9wZW5JZENvbmZpZ3VyYXRpb24ge1xyXG4gICAgY29uc3QgYWxyZWFkeUV4aXN0aW5nQXV0aFdlbGxLbm93bkVuZHBvaW50cyA9XHJcbiAgICAgIHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS5yZWFkKFxyXG4gICAgICAgICdhdXRoV2VsbEtub3duRW5kUG9pbnRzJyxcclxuICAgICAgICBjb25maWd1cmF0aW9uXHJcbiAgICAgICk7XHJcblxyXG4gICAgaWYgKCEhYWxyZWFkeUV4aXN0aW5nQXV0aFdlbGxLbm93bkVuZHBvaW50cykge1xyXG4gICAgICBjb25maWd1cmF0aW9uLmF1dGhXZWxsa25vd25FbmRwb2ludHMgPVxyXG4gICAgICAgIGFscmVhZHlFeGlzdGluZ0F1dGhXZWxsS25vd25FbmRwb2ludHM7XHJcblxyXG4gICAgICByZXR1cm4gY29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXNzZWRBdXRoV2VsbEtub3duRW5kcG9pbnRzID0gY29uZmlndXJhdGlvbi5hdXRoV2VsbGtub3duRW5kcG9pbnRzO1xyXG5cclxuICAgIGlmICghIXBhc3NlZEF1dGhXZWxsS25vd25FbmRwb2ludHMpIHtcclxuICAgICAgdGhpcy5hdXRoV2VsbEtub3duU2VydmljZS5zdG9yZVdlbGxLbm93bkVuZHBvaW50cyhcclxuICAgICAgICBjb25maWd1cmF0aW9uLFxyXG4gICAgICAgIHBhc3NlZEF1dGhXZWxsS25vd25FbmRwb2ludHNcclxuICAgICAgKTtcclxuICAgICAgY29uZmlndXJhdGlvbi5hdXRoV2VsbGtub3duRW5kcG9pbnRzID0gcGFzc2VkQXV0aFdlbGxLbm93bkVuZHBvaW50cztcclxuXHJcbiAgICAgIHJldHVybiBjb25maWd1cmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb25maWd1cmF0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlQ29uZmlnKFxyXG4gICAgY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvblxyXG4gICk6IE9wZW5JZENvbmZpZ3VyYXRpb24ge1xyXG4gICAgY29uc3Qgb3BlbklkQ29uZmlndXJhdGlvbkludGVybmFsID0geyAuLi5ERUZBVUxUX0NPTkZJRywgLi4uY29uZmlndXJhdGlvbiB9O1xyXG5cclxuICAgIHRoaXMuc2V0U3BlY2lhbENhc2VzKG9wZW5JZENvbmZpZ3VyYXRpb25JbnRlcm5hbCk7XHJcblxyXG4gICAgcmV0dXJuIG9wZW5JZENvbmZpZ3VyYXRpb25JbnRlcm5hbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U3BlY2lhbENhc2VzKGN1cnJlbnRDb25maWc6IE9wZW5JZENvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5wbGF0Zm9ybVByb3ZpZGVyLmlzQnJvd3NlcigpKSB7XHJcbiAgICAgIGN1cnJlbnRDb25maWcuc3RhcnRDaGVja1Nlc3Npb24gPSBmYWxzZTtcclxuICAgICAgY3VycmVudENvbmZpZy5zaWxlbnRSZW5ldyA9IGZhbHNlO1xyXG4gICAgICBjdXJyZW50Q29uZmlnLnVzZVJlZnJlc2hUb2tlbiA9IGZhbHNlO1xyXG4gICAgICBjdXJyZW50Q29uZmlnLnVzZVB1c2hlZEF1dGhvcmlzYXRpb25SZXF1ZXN0cyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=