UNPKG

ontimize-web-ngx

Version:
178 lines 26.5 kB
import { HttpClient, HttpHeaders } from '@angular/common/http'; import { HostListener, Injectable, Injector, Directive } from '@angular/core'; import { Observable, timer } from 'rxjs'; import { AppConfig } from '../config/app-config'; import { Codes } from '../util/codes'; import { Util } from '../util/util'; import { AuthService } from './auth.service'; import { LocalStorageService } from './local-storage.service'; import * as i0 from "@angular/core"; export class ORemoteConfigurationService { beforeunloadHandler() { this.finalize().subscribe(() => { }); } constructor(injector) { this.injector = injector; this._columns = { user: ORemoteConfigurationService.DEFAULT_COLUMN_USER, appId: ORemoteConfigurationService.DEFAULT_COLUMN_APPID, configuration: ORemoteConfigurationService.DEFAULT_COLUMN_CONFIG }; this.httpClient = this.injector.get(HttpClient); this._appConfig = this.injector.get(AppConfig); this.authService = this.injector.get(AuthService); this.localStorageService = this.injector.get(LocalStorageService); this.httpClient = this.injector.get(HttpClient); this._uuid = this._appConfig.getConfiguration().uuid; if (this._appConfig.useRemoteConfiguration()) { this._url = this._appConfig.getRemoteConfigurationEndpoint(); const remoteConfig = this._appConfig.getRemoteConfigurationConfig(); this._columns = (remoteConfig && remoteConfig.columns) ? Object.assign(this._columns, remoteConfig.columns) : this._columns; this._timeout = (remoteConfig && remoteConfig.timeout) ? remoteConfig.timeout : ORemoteConfigurationService.DEFAULT_STORAGE_TIMEOUT; const self = this; this.localStorageService.onSetLocalStorage.subscribe(() => { if (self.storeSubscription) { self.storeSubscription.unsubscribe(); } }); } } getUserConfiguration() { const self = this; const observable = new Observable((observer) => { const sessionInfo = self.authService.getSessionInfo(); if (!self.hasSession(sessionInfo)) { observer.error(); return; } const url = self._url + '/search'; const body = {}; body[self._columns.user] = sessionInfo.user; body[self._columns.appId] = self._uuid; const options = { headers: self.buildHeaders() }; self.httpClient.post(url, body, options).subscribe((resp) => { if (resp && resp.code === Codes.ONTIMIZE_SUCCESSFUL_CODE && Util.isDefined(resp.data)) { observer.next(resp); } else { observer.error(); } }, (error) => observer.error(error), () => observer.complete()); }); return observable; } storeUserConfiguration() { const self = this; if (self.storeSubscription) { self.storeSubscription.unsubscribe(); } const observable = new Observable((observer) => { const sessionInfo = self.authService.getSessionInfo(); if (!self._appConfig.useRemoteConfiguration() || !self.hasSession(sessionInfo)) { observer.next(void 0); observer.complete(); return; } const url = self._url; const body = { filter: {}, data: {} }; body.filter[self._columns.user] = sessionInfo.user; body.filter[self._columns.appId] = self._uuid; let userData = self.localStorageService.getSessionUserComponentsData() || ''; try { userData = btoa(JSON.stringify(userData)); } catch (e) { userData = ''; } body.data[self._columns.configuration] = userData; const options = { headers: self.buildHeaders() }; self.httpClient.put(url, body, options).subscribe((resp) => { if (resp && resp.code === Codes.ONTIMIZE_SUCCESSFUL_CODE) { observer.next(resp); } else { observer.error(); } }, (error) => observer.error(error), () => observer.complete()); }); return observable; } initialize() { const self = this; return new Observable(observer => { if (self._appConfig.useRemoteConfiguration()) { self.timerSubscription = timer(self._timeout, self._timeout).subscribe(() => { self.storeSubscription = self.storeUserConfiguration().subscribe(() => { }); }); self.getUserConfiguration().subscribe((resp) => { let storedConf; if (Util.isArray(resp.data)) { storedConf = resp.data[0][self._columns.configuration]; } else { storedConf = resp.data; } let componentsData = {}; if (Util.isDefined(storedConf)) { try { const decoded = atob(storedConf); componentsData = JSON.parse(decoded); } catch (e) { componentsData = {}; } self.localStorageService.storeSessionUserComponentsData(componentsData); } observer.next(componentsData); }, (error) => { observer.error(error); }); } else { observer.next(void 0); } }); } finalize() { if (this.timerSubscription) { this.timerSubscription.unsubscribe(); } return this.storeUserConfiguration(); } hasSession(sessionInfo) { return Util.isDefined(sessionInfo) && Util.isDefined(sessionInfo.user) && Util.isDefined(sessionInfo.id); } buildHeaders() { const sessionInfo = this.authService.getSessionInfo(); return new HttpHeaders({ 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json;charset=UTF-8', Authorization: 'Bearer ' + sessionInfo.id }); } } ORemoteConfigurationService.DEFAULT_COLUMN_USER = 'USER_'; ORemoteConfigurationService.DEFAULT_COLUMN_APPID = 'APP_UUID'; ORemoteConfigurationService.DEFAULT_COLUMN_CONFIG = 'CONFIGURATION'; ORemoteConfigurationService.DEFAULT_STORAGE_TIMEOUT = 60000; ORemoteConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ORemoteConfigurationService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); ORemoteConfigurationService.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ORemoteConfigurationService, host: { listeners: { "window:beforeunload": "beforeunloadHandler()" } }, ngImport: i0 }); ORemoteConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ORemoteConfigurationService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ORemoteConfigurationService, decorators: [{ type: Directive }, { type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { beforeunloadHandler: [{ type: HostListener, args: ['window:beforeunload', []] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWNvbmZpZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL3NlcnZpY2VzL3JlbW90ZS1jb25maWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBUSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFFLFVBQVUsRUFBNEIsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUlqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQU05RCxNQUFNLE9BQU8sMkJBQTJCO0lBd0J0QyxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFFL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBc0IsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQWI5QixhQUFRLEdBQWdDO1lBQ2hELElBQUksRUFBRSwyQkFBMkIsQ0FBQyxtQkFBbUI7WUFDckQsS0FBSyxFQUFFLDJCQUEyQixDQUFDLG9CQUFvQjtZQUN2RCxhQUFhLEVBQUUsMkJBQTJCLENBQUMscUJBQXFCO1NBQ2pFLENBQUM7UUFVQSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxR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QUEzQiwyQkFBMkI7NkhBQTNCLDJCQUEyQixjQUYxQixNQUFNOzRGQUVQLDJCQUEyQjtrQkFKdkMsU0FBUzs7a0JBQ1QsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7K0ZBeUJDLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBIb3N0TGlzdGVuZXIsIEluamVjdGFibGUsIEluamVjdG9yLCBUeXBlLCBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmliZXIsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQXBwQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2FwcC1jb25maWcnO1xuaW1wb3J0IHsgU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zZXJ2aWNlLXJlc3BvbnNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPUmVtb3RlQ29uZmlndXJhdGlvbiwgT1JlbW90ZUNvbmZpZ3VyYXRpb25Db2x1bW5zIH0gZnJvbSAnLi4vdHlwZXMvcmVtb3RlLWNvbmZpZ3VyYXRpb24udHlwZSc7XG5pbXBvcnQgeyBTZXNzaW9uSW5mbyB9IGZyb20gJy4uL3R5cGVzL3Nlc3Npb24taW5mby50eXBlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vbG9jYWwtc3RvcmFnZS5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSgpXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBPUmVtb3RlQ29uZmlndXJhdGlvblNlcnZpY2Uge1xuXG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9DT0xVTU5fVVNFUiA9ICdVU0VSXyc7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9DT0xVTU5fQVBQSUQgPSAnQVBQX1VVSUQnO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfQ09MVU1OX0NPTkZJRyA9ICdDT05GSUdVUkFUSU9OJztcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1NUT1JBR0VfVElNRU9VVCA9IDYwMDAwO1xuXG4gIHByb3RlY3RlZCBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgaHR0cENsaWVudDogSHR0cENsaWVudDtcbiAgcHJvdGVjdGVkIF9hcHBDb25maWc6IEFwcENvbmZpZztcbiAgcHJvdGVjdGVkIF91cmw6IHN0cmluZztcbiAgcHJvdGVjdGVkIF91dWlkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdGltZW91dDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgdGltZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIHN0b3JlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHJvdGVjdGVkIF9jb2x1bW5zOiBPUmVtb3RlQ29uZmlndXJhdGlvbkNvbHVtbnMgPSB7XG4gICAgdXNlcjogT1JlbW90ZUNvbmZpZ3VyYXRpb25TZXJ2aWNlLkRFRkFVTFRfQ09MVU1OX1VTRVIsXG4gICAgYXBwSWQ6IE9SZW1vdGVDb25maWd1cmF0aW9uU2VydmljZS5ERUZBVUxUX0NPTFVNTl9BUFBJRCxcbiAgICBjb25maWd1cmF0aW9uOiBPUmVtb3RlQ29uZmlndXJhdGlvblNlcnZpY2UuREVGQVVMVF9DT0xVTU5fQ09ORklHXG4gIH07XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcsIFtdKVxuICBiZWZvcmV1bmxvYWRIYW5kbGVyKCkge1xuICAgIHRoaXMuZmluYWxpemUoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy9cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICB0aGlzLmh0dHBDbGllbnQgPSB0aGlzLmluamVjdG9yLmdldDxIdHRwQ2xpZW50PihIdHRwQ2xpZW50IGFzIFR5cGU8SHR0cENsaWVudD4pO1xuICAgIHRoaXMuX2FwcENvbmZpZyA9IHRoaXMuaW5qZWN0b3IuZ2V0PEFwcENvbmZpZz4oQXBwQ29uZmlnIGFzIFR5cGU8QXBwQ29uZmlnPik7XG4gICAgdGhpcy5hdXRoU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0PEF1dGhTZXJ2aWNlPihBdXRoU2VydmljZSBhcyBUeXBlPEF1dGhTZXJ2aWNlPik7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQ8TG9jYWxTdG9yYWdlU2VydmljZT4oTG9jYWxTdG9yYWdlU2VydmljZSBhcyBUeXBlPExvY2FsU3RvcmFnZVNlcnZpY2U+KTtcblxuICAgIHRoaXMuaHR0cENsaWVudCA9IHRoaXMuaW5qZWN0b3IuZ2V0PEh0dHBDbGllbnQ+KEh0dHBDbGllbnQgYXMgVHlwZTxIdHRwQ2xpZW50Pik7XG4gICAgdGhpcy5fdXVpZCA9IHRoaXMuX2FwcENvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkudXVpZDtcblxuICAgIGlmICh0aGlzLl9hcHBDb25maWcudXNlUmVtb3RlQ29uZmlndXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl91cmwgPSB0aGlzLl9hcHBDb25maWcuZ2V0UmVtb3RlQ29uZmlndXJhdGlvbkVuZHBvaW50KCk7XG5cbiAgICAgIGNvbnN0IHJlbW90ZUNvbmZpZzogT1JlbW90ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLl9hcHBDb25maWcuZ2V0UmVtb3RlQ29uZmlndXJhdGlvbkNvbmZpZygpO1xuICAgICAgdGhpcy5fY29sdW1ucyA9IChyZW1vdGVDb25maWcgJiYgcmVtb3RlQ29uZmlnLmNvbHVtbnMpID8gT2JqZWN0LmFzc2lnbih0aGlzLl9jb2x1bW5zLCByZW1vdGVDb25maWcuY29sdW1ucykgOiB0aGlzLl9jb2x1bW5zO1xuXG4gICAgICB0aGlzLl90aW1lb3V0ID0gKHJlbW90ZUNvbmZpZyAmJiByZW1vdGVDb25maWcudGltZW91dCkgPyByZW1vdGVDb25maWcudGltZW91dCA6IE9SZW1vdGVDb25maWd1cmF0aW9uU2VydmljZS5ERUZBVUxUX1NUT1JBR0VfVElNRU9VVDtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLm9uU2V0TG9jYWxTdG9yYWdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmIChzZWxmLnN0b3JlU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgc2VsZi5zdG9yZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VXNlckNvbmZpZ3VyYXRpb24oKTogT2JzZXJ2YWJsZTxTZXJ2aWNlUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBTdWJzY3JpYmVyPFNlcnZpY2VSZXNwb25zZT4pID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25JbmZvID0gc2VsZi5hdXRoU2VydmljZS5nZXRTZXNzaW9uSW5mbygpO1xuICAgICAgaWYgKCFzZWxmLmhhc1Nlc3Npb24oc2Vzc2lvbkluZm8pKSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVybCA9IHNlbGYuX3VybCArICcvc2VhcmNoJztcbiAgICAgIGNvbnN0IGJvZHk6IGFueSA9IHt9O1xuICAgICAgYm9keVtzZWxmLl9jb2x1bW5zLnVzZXJdID0gc2Vzc2lvbkluZm8udXNlcjtcbiAgICAgIGJvZHlbc2VsZi5fY29sdW1ucy5hcHBJZF0gPSBzZWxmLl91dWlkO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgaGVhZGVyczogc2VsZi5idWlsZEhlYWRlcnMoKVxuICAgICAgfTtcbiAgICAgIHNlbGYuaHR0cENsaWVudC5wb3N0KHVybCwgYm9keSwgb3B0aW9ucykuc3Vic2NyaWJlKChyZXNwOiBTZXJ2aWNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3AgJiYgcmVzcC5jb2RlID09PSBDb2Rlcy5PTlRJTUlaRV9TVUNDRVNTRlVMX0NPREUgJiYgVXRpbC5pc0RlZmluZWQocmVzcC5kYXRhKSkge1xuICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiBvYnNlcnZlci5lcnJvcihlcnJvciksXG4gICAgICAgICgpID0+IG9ic2VydmVyLmNvbXBsZXRlKCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICB9XG5cbiAgcHVibGljIHN0b3JlVXNlckNvbmZpZ3VyYXRpb24oKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5zdG9yZVN1YnNjcmlwdGlvbikge1xuICAgICAgc2VsZi5zdG9yZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBTdWJzY3JpYmVyPFNlcnZpY2VSZXNwb25zZT4pID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25JbmZvID0gc2VsZi5hdXRoU2VydmljZS5nZXRTZXNzaW9uSW5mbygpO1xuICAgICAgaWYgKCFzZWxmLl9hcHBDb25maWcudXNlUmVtb3RlQ29uZmlndXJhdGlvbigpIHx8ICFzZWxmLmhhc1Nlc3Npb24oc2Vzc2lvbkluZm8pKSB7XG4gICAgICAgIG9ic2VydmVyLm5leHQodm9pZCAwKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdXJsID0gc2VsZi5fdXJsO1xuICAgICAgY29uc3QgYm9keTogYW55ID0geyBmaWx0ZXI6IHt9LCBkYXRhOiB7fSB9O1xuICAgICAgYm9keS5maWx0ZXJbc2VsZi5fY29sdW1ucy51c2VyXSA9IHNlc3Npb25JbmZvLnVzZXI7XG4gICAgICBib2R5LmZpbHRlcltzZWxmLl9jb2x1bW5zLmFwcElkXSA9IHNlbGYuX3V1aWQ7XG4gICAgICBsZXQgdXNlckRhdGEgPSBzZWxmLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvblVzZXJDb21wb25lbnRzRGF0YSgpIHx8ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXNlckRhdGEgPSBidG9hKEpTT04uc3RyaW5naWZ5KHVzZXJEYXRhKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHVzZXJEYXRhID0gJyc7XG4gICAgICB9XG4gICAgICBib2R5LmRhdGFbc2VsZi5fY29sdW1ucy5jb25maWd1cmF0aW9uXSA9IHVzZXJEYXRhO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgaGVhZGVyczogc2VsZi5idWlsZEhlYWRlcnMoKVxuICAgICAgfTtcbiAgICAgIHNlbGYuaHR0cENsaWVudC5wdXQodXJsLCBib2R5LCBvcHRpb25zKS5zdWJzY3JpYmUoKHJlc3A6IFNlcnZpY2VSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAocmVzcCAmJiByZXNwLmNvZGUgPT09IENvZGVzLk9OVElNSVpFX1NVQ0NFU1NGVUxfQ09ERSkge1xuICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSwgKGVycm9yKSA9PiBvYnNlcnZlci5lcnJvcihlcnJvciksXG4gICAgICAgICgpID0+IG9ic2VydmVyLmNvbXBsZXRlKCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgaWYgKHNlbGYuX2FwcENvbmZpZy51c2VSZW1vdGVDb25maWd1cmF0aW9uKCkpIHtcbiAgICAgICAgc2VsZi50aW1lclN1YnNjcmlwdGlvbiA9IHRpbWVyKHNlbGYuX3RpbWVvdXQsIHNlbGYuX3RpbWVvdXQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgc2VsZi5zdG9yZVN1YnNjcmlwdGlvbiA9IHNlbGYuc3RvcmVVc2VyQ29uZmlndXJhdGlvbigpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZi5nZXRVc2VyQ29uZmlndXJhdGlvbigpLnN1YnNjcmliZSgocmVzcDogU2VydmljZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgbGV0IHN0b3JlZENvbmY7XG4gICAgICAgICAgaWYgKFV0aWwuaXNBcnJheShyZXNwLmRhdGEpKSB7XG4gICAgICAgICAgICBzdG9yZWRDb25mID0gcmVzcC5kYXRhWzBdW3NlbGYuX2NvbHVtbnMuY29uZmlndXJhdGlvbl07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0b3JlZENvbmYgPSByZXNwLmRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBjb21wb25lbnRzRGF0YSA9IHt9O1xuICAgICAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChzdG9yZWRDb25mKSkge1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gYXRvYihzdG9yZWRDb25mKTtcbiAgICAgICAgICAgICAgY29tcG9uZW50c0RhdGEgPSBKU09OLnBhcnNlKGRlY29kZWQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb21wb25lbnRzRGF0YSA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5sb2NhbFN0b3JhZ2VTZXJ2aWNlLnN0b3JlU2Vzc2lvblVzZXJDb21wb25lbnRzRGF0YShjb21wb25lbnRzRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ic2VydmVyLm5leHQoY29tcG9uZW50c0RhdGEpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh2b2lkIDApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZpbmFsaXplKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVVc2VyQ29uZmlndXJhdGlvbigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhc1Nlc3Npb24oc2Vzc2lvbkluZm86IFNlc3Npb25JbmZvKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKHNlc3Npb25JbmZvKSAmJiBVdGlsLmlzRGVmaW5lZChzZXNzaW9uSW5mby51c2VyKSAmJiBVdGlsLmlzRGVmaW5lZChzZXNzaW9uSW5mby5pZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRIZWFkZXJzKCk6IEh0dHBIZWFkZXJzIHtcbiAgICBjb25zdCBzZXNzaW9uSW5mbyA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0U2Vzc2lvbkluZm8oKTtcbiAgICByZXR1cm4gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiAnKicsXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsXG4gICAgICBBdXRob3JpemF0aW9uOiAnQmVhcmVyICcgKyBzZXNzaW9uSW5mby5pZFxuICAgIH0pO1xuICB9XG5cbn1cbiJdfQ==