UNPKG

angular-auth-oidc-client

Version:
115 lines 18.3 kB
import { Injectable, inject } from '@angular/core'; import { LoggerService } from '../logging/logger.service'; import { StoragePersistenceService } from '../storage/storage-persistence.service'; import { RandomService } from './random/random.service'; import * as i0 from "@angular/core"; export class FlowsDataService { constructor() { this.loggerService = inject(LoggerService); this.storagePersistenceService = inject(StoragePersistenceService); this.randomService = inject(RandomService); } createNonce(configuration) { const nonce = this.randomService.createRandom(40, configuration); this.loggerService.logDebug(configuration, 'Nonce created. nonce:' + nonce); this.setNonce(nonce, configuration); return nonce; } setNonce(nonce, configuration) { this.storagePersistenceService.write('authNonce', nonce, configuration); } getAuthStateControl(configuration) { if (!configuration) { return ''; } return this.storagePersistenceService.read('authStateControl', configuration); } setAuthStateControl(authStateControl, configuration) { if (!configuration) { return false; } return this.storagePersistenceService.write('authStateControl', authStateControl, configuration); } getExistingOrCreateAuthStateControl(configuration) { let state = this.storagePersistenceService.read('authStateControl', configuration); if (!state) { state = this.randomService.createRandom(40, configuration); this.storagePersistenceService.write('authStateControl', state, configuration); } return state; } setSessionState(sessionState, configuration) { this.storagePersistenceService.write('session_state', sessionState, configuration); } resetStorageFlowData(configuration) { this.storagePersistenceService.resetStorageFlowData(configuration); } getCodeVerifier(configuration) { return this.storagePersistenceService.read('codeVerifier', configuration); } createCodeVerifier(configuration) { const codeVerifier = this.randomService.createRandom(67, configuration); this.storagePersistenceService.write('codeVerifier', codeVerifier, configuration); return codeVerifier; } isCodeFlowInProgress(configuration) { return !!this.storagePersistenceService.read('storageCodeFlowInProgress', configuration); } setCodeFlowInProgress(configuration) { this.storagePersistenceService.write('storageCodeFlowInProgress', true, configuration); } resetCodeFlowInProgress(configuration) { this.storagePersistenceService.write('storageCodeFlowInProgress', false, configuration); } isSilentRenewRunning(configuration) { const { configId, silentRenewTimeoutInSeconds } = configuration; const storageObject = this.getSilentRenewRunningStorageEntry(configuration); if (!storageObject) { return false; } if (storageObject.state === 'not-running') { return false; } const timeOutInMilliseconds = (silentRenewTimeoutInSeconds ?? 0) * 1000; const dateOfLaunchedProcessUtc = Date.parse(storageObject.dateOfLaunchedProcessUtc); const currentDateUtc = Date.parse(new Date().toISOString()); const elapsedTimeInMilliseconds = Math.abs(currentDateUtc - dateOfLaunchedProcessUtc); const isProbablyStuck = elapsedTimeInMilliseconds > timeOutInMilliseconds; if (isProbablyStuck) { this.loggerService.logDebug(configuration, 'silent renew process is probably stuck, state will be reset.', configId); this.resetSilentRenewRunning(configuration); return false; } return storageObject.state === 'running'; } setSilentRenewRunning(configuration) { const storageObject = { state: 'running', dateOfLaunchedProcessUtc: new Date().toISOString(), }; this.storagePersistenceService.write('storageSilentRenewRunning', JSON.stringify(storageObject), configuration); } resetSilentRenewRunning(configuration) { if (!configuration) { return; } this.storagePersistenceService.write('storageSilentRenewRunning', '', configuration); } getSilentRenewRunningStorageEntry(configuration) { const storageEntry = this.storagePersistenceService.read('storageSilentRenewRunning', configuration); if (!storageEntry) { return { dateOfLaunchedProcessUtc: '', state: 'not-running', }; } return JSON.parse(storageEntry); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FlowsDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FlowsDataService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FlowsDataService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvd3MtZGF0YS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdXRoLW9pZGMtY2xpZW50L3NyYy9saWIvZmxvd3MvZmxvd3MtZGF0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUVuRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBR3hELE1BQU0sT0FBTyxnQkFBZ0I7SUFEN0I7UUFFbUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFdEMsOEJBQXlCLEdBQUcsTUFBTSxDQUNqRCx5QkFBeUIsQ0FDMUIsQ0FBQztRQUVlLGtCQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0tBNEx4RDtJQTFMQyxXQUFXLENBQUMsYUFBa0M7UUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSx1QkFBdUIsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztRQUVwQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYSxFQUFFLGFBQWtDO1FBQ3hELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lB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QywyQkFBMkIsRUFDM0IsRUFBRSxFQUNGLGFBQWEsQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVPLGlDQUFpQyxDQUN2QyxhQUFrQztRQUVsQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUN0RCwyQkFBMkIsRUFDM0IsYUFBYSxDQUNkLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsT0FBTztnQkFDTCx3QkFBd0IsRUFBRSxFQUFFO2dCQUM1QixLQUFLLEVBQUUsYUFBYTthQUNyQixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsQyxDQUFDOzhHQWxNVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQixjQURILE1BQU07OzJGQUNuQixnQkFBZ0I7a0JBRDVCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPcGVuSWRDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vY29uZmlnL29wZW5pZC1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi9sb2dnaW5nL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yYWdlL3N0b3JhZ2UtcGVyc2lzdGVuY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBTaWxlbnRSZW5ld1J1bm5pbmcgfSBmcm9tICcuL2Zsb3dzLm1vZGVscyc7XG5pbXBvcnQgeyBSYW5kb21TZXJ2aWNlIH0gZnJvbSAnLi9yYW5kb20vcmFuZG9tLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEZsb3dzRGF0YVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlclNlcnZpY2UgPSBpbmplY3QoTG9nZ2VyU2VydmljZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlID0gaW5qZWN0KFxuICAgIFN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2VcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJhbmRvbVNlcnZpY2UgPSBpbmplY3QoUmFuZG9tU2VydmljZSk7XG5cbiAgY3JlYXRlTm9uY2UoY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9uY2UgPSB0aGlzLnJhbmRvbVNlcnZpY2UuY3JlYXRlUmFuZG9tKDQwLCBjb25maWd1cmF0aW9uKTtcblxuICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyhjb25maWd1cmF0aW9uLCAnTm9uY2UgY3JlYXRlZC4gbm9uY2U6JyArIG5vbmNlKTtcbiAgICB0aGlzLnNldE5vbmNlKG5vbmNlLCBjb25maWd1cmF0aW9uKTtcblxuICAgIHJldHVybiBub25jZTtcbiAgfVxuXG4gIHNldE5vbmNlKG5vbmNlOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb246IE9wZW5JZENvbmZpZ3VyYXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2Uud3JpdGUoJ2F1dGhOb25jZScsIG5vbmNlLCBjb25maWd1cmF0aW9uKTtcbiAgfVxuXG4gIGdldEF1dGhTdGF0ZUNvbnRyb2woY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbiB8IG51bGwpOiBzdHJpbmcge1xuICAgIGlmICghY29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UucmVhZChcbiAgICAgICdhdXRoU3RhdGVDb250cm9sJyxcbiAgICAgIGNvbmZpZ3VyYXRpb25cbiAgICApO1xuICB9XG5cbiAgc2V0QXV0aFN0YXRlQ29udHJvbChcbiAgICBhdXRoU3RhdGVDb250cm9sOiBzdHJpbmcsXG4gICAgY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbiB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS53cml0ZShcbiAgICAgICdhdXRoU3RhdGVDb250cm9sJyxcbiAgICAgIGF1dGhTdGF0ZUNvbnRyb2wsXG4gICAgICBjb25maWd1cmF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGdldEV4aXN0aW5nT3JDcmVhdGVBdXRoU3RhdGVDb250cm9sKGNvbmZpZ3VyYXRpb246IE9wZW5JZENvbmZpZ3VyYXRpb24pOiBhbnkge1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS5yZWFkKFxuICAgICAgJ2F1dGhTdGF0ZUNvbnRyb2wnLFxuICAgICAgY29uZmlndXJhdGlvblxuICAgICk7XG5cbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICBzdGF0ZSA9IHRoaXMucmFuZG9tU2VydmljZS5jcmVhdGVSYW5kb20oNDAsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLndyaXRlKFxuICAgICAgICAnYXV0aFN0YXRlQ29udHJvbCcsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBjb25maWd1cmF0aW9uXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIHNldFNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGU6IGFueSwgY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS53cml0ZShcbiAgICAgICdzZXNzaW9uX3N0YXRlJyxcbiAgICAgIHNlc3Npb25TdGF0ZSxcbiAgICAgIGNvbmZpZ3VyYXRpb25cbiAgICApO1xuICB9XG5cbiAgcmVzZXRTdG9yYWdlRmxvd0RhdGEoY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS5yZXNldFN0b3JhZ2VGbG93RGF0YShjb25maWd1cmF0aW9uKTtcbiAgfVxuXG4gIGdldENvZGVWZXJpZmllcihjb25maWd1cmF0aW9uOiBPcGVuSWRDb25maWd1cmF0aW9uKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLnJlYWQoJ2NvZGVWZXJpZmllcicsIGNvbmZpZ3VyYXRpb24pO1xuICB9XG5cbiAgY3JlYXRlQ29kZVZlcmlmaWVyKGNvbmZpZ3VyYXRpb246IE9wZW5JZENvbmZpZ3VyYXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvZGVWZXJpZmllciA9IHRoaXMucmFuZG9tU2VydmljZS5jcmVhdGVSYW5kb20oNjcsIGNvbmZpZ3VyYXRpb24pO1xuXG4gICAgdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLndyaXRlKFxuICAgICAgJ2NvZGVWZXJpZmllcicsXG4gICAgICBjb2RlVmVyaWZpZXIsXG4gICAgICBjb25maWd1cmF0aW9uXG4gICAgKTtcblxuICAgIHJldHVybiBjb2RlVmVyaWZpZXI7XG4gIH1cblxuICBpc0NvZGVGbG93SW5Qcm9ncmVzcyhjb25maWd1cmF0aW9uOiBPcGVuSWRDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLnJlYWQoXG4gICAgICAnc3RvcmFnZUNvZGVGbG93SW5Qcm9ncmVzcycsXG4gICAgICBjb25maWd1cmF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIHNldENvZGVGbG93SW5Qcm9ncmVzcyhjb25maWd1cmF0aW9uOiBPcGVuSWRDb25maWd1cmF0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLndyaXRlKFxuICAgICAgJ3N0b3JhZ2VDb2RlRmxvd0luUHJvZ3Jlc3MnLFxuICAgICAgdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYXRpb25cbiAgICApO1xuICB9XG5cbiAgcmVzZXRDb2RlRmxvd0luUHJvZ3Jlc3MoY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS53cml0ZShcbiAgICAgICdzdG9yYWdlQ29kZUZsb3dJblByb2dyZXNzJyxcbiAgICAgIGZhbHNlLFxuICAgICAgY29uZmlndXJhdGlvblxuICAgICk7XG4gIH1cblxuICBpc1NpbGVudFJlbmV3UnVubmluZyhjb25maWd1cmF0aW9uOiBPcGVuSWRDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBjb25maWdJZCwgc2lsZW50UmVuZXdUaW1lb3V0SW5TZWNvbmRzIH0gPSBjb25maWd1cmF0aW9uO1xuICAgIGNvbnN0IHN0b3JhZ2VPYmplY3QgPSB0aGlzLmdldFNpbGVudFJlbmV3UnVubmluZ1N0b3JhZ2VFbnRyeShjb25maWd1cmF0aW9uKTtcblxuICAgIGlmICghc3RvcmFnZU9iamVjdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdG9yYWdlT2JqZWN0LnN0YXRlID09PSAnbm90LXJ1bm5pbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGltZU91dEluTWlsbGlzZWNvbmRzID0gKHNpbGVudFJlbmV3VGltZW91dEluU2Vjb25kcyA/PyAwKSAqIDEwMDA7XG4gICAgY29uc3QgZGF0ZU9mTGF1bmNoZWRQcm9jZXNzVXRjID0gRGF0ZS5wYXJzZShcbiAgICAgIHN0b3JhZ2VPYmplY3QuZGF0ZU9mTGF1bmNoZWRQcm9jZXNzVXRjXG4gICAgKTtcbiAgICBjb25zdCBjdXJyZW50RGF0ZVV0YyA9IERhdGUucGFyc2UobmV3IERhdGUoKS50b0lTT1N0cmluZygpKTtcbiAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gTWF0aC5hYnMoXG4gICAgICBjdXJyZW50RGF0ZVV0YyAtIGRhdGVPZkxhdW5jaGVkUHJvY2Vzc1V0Y1xuICAgICk7XG4gICAgY29uc3QgaXNQcm9iYWJseVN0dWNrID0gZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA+IHRpbWVPdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIGlmIChpc1Byb2JhYmx5U3R1Y2spIHtcbiAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dEZWJ1ZyhcbiAgICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgICAgJ3NpbGVudCByZW5ldyBwcm9jZXNzIGlzIHByb2JhYmx5IHN0dWNrLCBzdGF0ZSB3aWxsIGJlIHJlc2V0LicsXG4gICAgICAgIGNvbmZpZ0lkXG4gICAgICApO1xuICAgICAgdGhpcy5yZXNldFNpbGVudFJlbmV3UnVubmluZyhjb25maWd1cmF0aW9uKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBzdG9yYWdlT2JqZWN0LnN0YXRlID09PSAncnVubmluZyc7XG4gIH1cblxuICBzZXRTaWxlbnRSZW5ld1J1bm5pbmcoY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHN0b3JhZ2VPYmplY3Q6IFNpbGVudFJlbmV3UnVubmluZyA9IHtcbiAgICAgIHN0YXRlOiAncnVubmluZycsXG4gICAgICBkYXRlT2ZMYXVuY2hlZFByb2Nlc3NVdGM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuXG4gICAgdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLndyaXRlKFxuICAgICAgJ3N0b3JhZ2VTaWxlbnRSZW5ld1J1bm5pbmcnLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoc3RvcmFnZU9iamVjdCksXG4gICAgICBjb25maWd1cmF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIHJlc2V0U2lsZW50UmVuZXdSdW5uaW5nKGNvbmZpZ3VyYXRpb246IE9wZW5JZENvbmZpZ3VyYXRpb24gfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLndyaXRlKFxuICAgICAgJ3N0b3JhZ2VTaWxlbnRSZW5ld1J1bm5pbmcnLFxuICAgICAgJycsXG4gICAgICBjb25maWd1cmF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2lsZW50UmVuZXdSdW5uaW5nU3RvcmFnZUVudHJ5KFxuICAgIGNvbmZpZ3VyYXRpb246IE9wZW5JZENvbmZpZ3VyYXRpb25cbiAgKTogU2lsZW50UmVuZXdSdW5uaW5nIHtcbiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UucmVhZChcbiAgICAgICdzdG9yYWdlU2lsZW50UmVuZXdSdW5uaW5nJyxcbiAgICAgIGNvbmZpZ3VyYXRpb25cbiAgICApO1xuXG4gICAgaWYgKCFzdG9yYWdlRW50cnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGVPZkxhdW5jaGVkUHJvY2Vzc1V0YzogJycsXG4gICAgICAgIHN0YXRlOiAnbm90LXJ1bm5pbmcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdG9yYWdlRW50cnkpO1xuICB9XG59XG4iXX0=