UNPKG

ontimize-web-ngx

Version:
171 lines 26.6 kB
import { HttpClient } from '@angular/common/http'; import { EventEmitter, Injectable, Injector } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { Observable } from 'rxjs'; import { AppConfig } from '../../config/app-config'; import * as CORE_TRANSLATIONS from '../../i18n/i18n'; import { MomentService } from '../../services/moment.service'; import { ObservableWrapper } from '../../util/async'; import { _getInjectionTokenValue, O_TRANSLATE_SERVICE } from '../factories'; import { Util } from '../../util/util'; import { Codes } from '../../util/codes'; import { MatSnackBar } from '@angular/material/snack-bar'; import * as i0 from "@angular/core"; export function translateServiceFactory(injector) { const serviceClass = _getInjectionTokenValue(O_TRANSLATE_SERVICE, injector); const service = Util.createServiceInstance(serviceClass, injector); return Util.isDefined(service) ? service : new OTranslateService(injector); } export class OTranslateService { constructor(injector) { this.injector = injector; this.DEFAULT_LANG = 'en'; this.onLanguageChanged = new EventEmitter(); this.notFoundLang = []; this.existingLangFiles = []; this.ngxTranslateService = this.injector.get(TranslateService); this.momentService = this.injector.get(MomentService); this.httpClient = this.injector.get(HttpClient); this.appConfig = this.injector.get(AppConfig); this.localStorageKey = this.appConfig.getConfiguration().uuid; this.defaultLocale = this.appConfig.getConfiguration().defaultLocale; } storeLanguage(language) { if (language) { const dataStr = localStorage.getItem(this.localStorageKey); const data = (dataStr && dataStr.length > 0) ? JSON.parse(dataStr) : {}; data[Codes.LANGUAGE_KEY] = language; try { localStorage.setItem(this.localStorageKey, JSON.stringify(data)); } catch (e) { console.error("Cannot set new item in localStorage. Error: " + e); } } } getStoredLanguage() { const dataStr = localStorage.getItem(this.localStorageKey); return dataStr ? JSON.parse(dataStr)[Codes.LANGUAGE_KEY] : void 0; } checkExistingLangFile(lang) { const self = this; return new Promise((resolve) => { if (self.existingLangFiles.indexOf(lang) !== -1) { resolve(true); return; } const localeAssetsPath = this.ngxTranslateService.currentLoader.prefix; const localeAssetsExtension = this.ngxTranslateService.currentLoader.suffix; self.httpClient.get(localeAssetsPath + lang + localeAssetsExtension).subscribe(() => { if (self.existingLangFiles.indexOf(lang) === -1) { self.existingLangFiles.push(lang); } resolve(true); }, () => { if (self.notFoundLang.indexOf(lang) === -1) { self.notFoundLang.push(lang); } resolve(false); }); }); } setDefaultLang(lang) { this.ngxTranslateService.defaultLang = lang; this.checkExistingLangFile(lang).then((exists) => { if (!exists) { console.error('Default language(' + lang + ') has no bundle file defined'); } }); } get(text, values = []) { let textTranslated; try { const bundle = this.ngxTranslateService.get(text, values); if (bundle) { bundle.subscribe(x => textTranslated = x); } textTranslated = textTranslated === text ? undefined : textTranslated; } catch (e) { textTranslated = undefined; } if (!textTranslated) { const bundle = CORE_TRANSLATIONS.MAP[this.ngxTranslateService.currentLang] || CORE_TRANSLATIONS.MAP[this.defaultLocale] || CORE_TRANSLATIONS.MAP[this.DEFAULT_LANG]; if (bundle && bundle[text]) { textTranslated = bundle[text]; } else { textTranslated = text; } } return textTranslated; } setAppLang(lang) { const observable = new Observable(observer => { this.use(lang, observer); }); return observable; } use(lang, observer) { if (lang === undefined) { const newLang = lang || this.DEFAULT_LANG; this.propagateLang(newLang, {}, observer); } else { this.checkExistingLangFile(lang).then((exists) => { let newLang = lang; if (!exists) { newLang = Util.isDefined(this.appConfig['_config']['defaultLocale']) ? this.appConfig['_config']['defaultLocale'] : this.ngxTranslateService.getDefaultLang(); const translations = CORE_TRANSLATIONS.MAP[newLang] || CORE_TRANSLATIONS.MAP[this.DEFAULT_LANG]; const msg = translations['MESSAGES.ERROR_MISSING_LANG']; this.injector.get(MatSnackBar).open(msg, ' ', { duration: 2500 }); } this.ngxTranslateService.use(newLang).subscribe(res => { this.storeLanguage(newLang); this.propagateLang(newLang, res, observer); }); }); } } propagateLang(lang, langRes, observer) { const coreBundle = CORE_TRANSLATIONS.MAP[lang || this.DEFAULT_LANG]; if (coreBundle !== undefined) { const mixed = Object.assign({}, coreBundle, langRes); this.ngxTranslateService.translations[lang] = mixed; } this.momentService.load(lang); ObservableWrapper.callEmit(this.onLanguageChanged, lang); if (observer) { observer.next(langRes); } } getCurrentLang() { return this.ngxTranslateService.currentLang; } getBrowserLang() { if (typeof window === 'undefined' || typeof window.navigator === 'undefined') { return undefined; } const navigator = window.navigator; let browserLang = navigator.languages ? navigator.languages[0] : null; browserLang = navigator.language || browserLang || navigator.browserLanguage || navigator.userLanguage; if (browserLang.indexOf('-') !== -1) { browserLang = browserLang.split('-')[0]; } if (browserLang.indexOf('_') !== -1) { browserLang = browserLang.split('_')[0]; } return browserLang; } } OTranslateService.ASSETS_PATH = './assets/i18n/'; OTranslateService.ASSETS_EXTENSION = '.json'; OTranslateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTranslateService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); OTranslateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTranslateService, providedIn: 'root', useFactory: translateServiceFactory, deps: [{ token: Injector }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTranslateService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', useFactory: translateServiceFactory, deps: [Injector] }] }], ctorParameters: function () { return [{ type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10cmFuc2xhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9zZXJ2aWNlcy90cmFuc2xhdGUvby10cmFuc2xhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sS0FBSyxpQkFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDOztBQU0xRCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsUUFBa0I7SUFDeEQsTUFBTSxZQUFZLEdBQUcsdUJBQXVCLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNu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Q0FBQztRQUN2RyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDOztBQW5LYSw2QkFBVyxHQUFHLGdCQUFnQixDQUFDO0FBQy9CLGtDQUFnQixHQUFHLE9BQU8sQ0FBQzsrR0FIOUIsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FESixNQUFNLGNBQWMsdUJBQXVCLGtCQUFTLFFBQVE7NEZBQ3pFLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmliZXIgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQXBwQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29uZmlnL2FwcC1jb25maWcnO1xuaW1wb3J0ICogYXMgQ09SRV9UUkFOU0xBVElPTlMgZnJvbSAnLi4vLi4vaTE4bi9pMThuJztcbmltcG9ydCB7IE1vbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb21lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlV3JhcHBlciB9IGZyb20gJy4uLy4uL3V0aWwvYXN5bmMnO1xuaW1wb3J0IHsgX2dldEluamVjdGlvblRva2VuVmFsdWUsIE9fVFJBTlNMQVRFX1NFUlZJQ0UgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuXG4vKipcbiAqIGBPVHJhbnNsYXRlU2VydmljZWAgZmFjdG9yeS5cbiAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRyYW5zbGF0ZSBzZXJ2aWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlU2VydmljZUZhY3RvcnkoaW5qZWN0b3I6IEluamVjdG9yKTogYW55IHtcbiAgY29uc3Qgc2VydmljZUNsYXNzID0gX2dldEluamVjdGlvblRva2VuVmFsdWUoT19UUkFOU0xBVEVfU0VSVklDRSwgaW5qZWN0b3IpO1xuICBjb25zdCBzZXJ2aWNlID0gVXRpbC5jcmVhdGVTZXJ2aWNlSW5zdGFuY2Uoc2VydmljZUNsYXNzLCBpbmplY3Rvcik7XG4gIHJldHVybiBVdGlsLmlzRGVmaW5lZChzZXJ2aWNlKSA/IHNlcnZpY2UgOiBuZXcgT1RyYW5zbGF0ZVNlcnZpY2UoaW5qZWN0b3IpO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JywgdXNlRmFjdG9yeTogdHJhbnNsYXRlU2VydmljZUZhY3RvcnksIGRlcHM6IFtJbmplY3Rvcl0gfSlcbmV4cG9ydCBjbGFzcyBPVHJhbnNsYXRlU2VydmljZSB7XG5cbiAgcHVibGljIHN0YXRpYyBBU1NFVFNfUEFUSCA9ICcuL2Fzc2V0cy9pMThuLyc7XG4gIHB1YmxpYyBzdGF0aWMgQVNTRVRTX0VYVEVOU0lPTiA9ICcuanNvbic7XG4gIHB1YmxpYyBERUZBVUxUX0xBTkcgPSAnZW4nO1xuICBwdWJsaWMgb25MYW5ndWFnZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByb3RlY3RlZCBuZ3hUcmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgbW9tZW50U2VydmljZTogTW9tZW50U2VydmljZTtcbiAgcHJvdGVjdGVkIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG5cbiAgcHJvdGVjdGVkIGxvY2FsU3RvcmFnZUtleTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgbm90Rm91bmRMYW5nOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIHByb3RlY3RlZCBhcHBDb25maWc6IEFwcENvbmZpZztcbiAgcHJvdGVjdGVkIGV4aXN0aW5nTGFuZ0ZpbGVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIHByb3RlY3RlZCBkZWZhdWx0TG9jYWxlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHRoaXMubmd4VHJhbnNsYXRlU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHRoaXMubW9tZW50U2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE1vbWVudFNlcnZpY2UpO1xuICAgIHRoaXMuaHR0cENsaWVudCA9IHRoaXMuaW5qZWN0b3IuZ2V0KEh0dHBDbGllbnQpO1xuICAgIHRoaXMuYXBwQ29uZmlnID0gdGhpcy5pbmplY3Rvci5nZXQoQXBwQ29uZmlnKTtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZUtleSA9IHRoaXMuYXBwQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS51dWlkO1xuICAgIHRoaXMuZGVmYXVsdExvY2FsZSA9IHRoaXMuYXBwQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5kZWZhdWx0TG9jYWxlO1xuICB9XG5cbiAgcHVibGljIHN0b3JlTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChsYW5ndWFnZSkge1xuICAgICAgY29uc3QgZGF0YVN0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KTtcbiAgICAgIGNvbnN0IGRhdGEgPSAoZGF0YVN0ciAmJiBkYXRhU3RyLmxlbmd0aCA+IDApID8gSlNPTi5wYXJzZShkYXRhU3RyKSA6IHt9O1xuICAgICAgZGF0YVtDb2Rlcy5MQU5HVUFHRV9LRVldID0gbGFuZ3VhZ2U7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IHNldCBuZXcgaXRlbSBpbiBsb2NhbFN0b3JhZ2UuIEVycm9yOiBcIiArIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRTdG9yZWRMYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGFTdHIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSk7XG4gICAgcmV0dXJuIGRhdGFTdHIgPyBKU09OLnBhcnNlKGRhdGFTdHIpW0NvZGVzLkxBTkdVQUdFX0tFWV0gOiB2b2lkIDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tFeGlzdGluZ0xhbmdGaWxlKGxhbmc6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoc2VsZi5leGlzdGluZ0xhbmdGaWxlcy5pbmRleE9mKGxhbmcpICE9PSAtMSkge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBsb2NhbGVBc3NldHNQYXRoID0gKHRoaXMubmd4VHJhbnNsYXRlU2VydmljZS5jdXJyZW50TG9hZGVyIGFzIGFueSkucHJlZml4O1xuICAgICAgY29uc3QgbG9jYWxlQXNzZXRzRXh0ZW5zaW9uID0gKHRoaXMubmd4VHJhbnNsYXRlU2VydmljZS5jdXJyZW50TG9hZGVyIGFzIGFueSkuc3VmZml4O1xuICAgICAgc2VsZi5odHRwQ2xpZW50LmdldChsb2NhbGVBc3NldHNQYXRoICsgbGFuZyArIGxvY2FsZUFzc2V0c0V4dGVuc2lvbikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHNlbGYuZXhpc3RpbmdMYW5nRmlsZXMuaW5kZXhPZihsYW5nKSA9PT0gLTEpIHtcbiAgICAgICAgICBzZWxmLmV4aXN0aW5nTGFuZ0ZpbGVzLnB1c2gobGFuZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSTE4TiBGaWxlIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0sICgpID0+IHtcbiAgICAgICAgLy8gSTE4TiBGaWxlIGZhaWxlZCB0byBsb2FkXG4gICAgICAgIGlmIChzZWxmLm5vdEZvdW5kTGFuZy5pbmRleE9mKGxhbmcpID09PSAtMSkge1xuICAgICAgICAgIHNlbGYubm90Rm91bmRMYW5nLnB1c2gobGFuZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREZWZhdWx0TGFuZyhsYW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm5neFRyYW5zbGF0ZVNlcnZpY2UuZGVmYXVsdExhbmcgPSBsYW5nO1xuICAgIHRoaXMuY2hlY2tFeGlzdGluZ0xhbmdGaWxlKGxhbmcpLnRoZW4oKGV4aXN0cykgPT4ge1xuICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRGVmYXVsdCBsYW5ndWFnZSgnICsgbGFuZyArICcpIGhhcyBubyBidW5kbGUgZmlsZSBkZWZpbmVkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KHRleHQ6IHN0cmluZywgdmFsdWVzOiBhbnlbXSA9IFtdKTogc3RyaW5nIHtcbiAgICBsZXQgdGV4dFRyYW5zbGF0ZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1bmRsZSA9IHRoaXMubmd4VHJhbnNsYXRlU2VydmljZS5nZXQodGV4dCwgdmFsdWVzKTtcbiAgICAgIGlmIChidW5kbGUpIHtcbiAgICAgICAgYnVuZGxlLnN1YnNjcmliZSh4ID0+IHRleHRUcmFuc2xhdGVkID0geCk7XG4gICAgICB9XG4gICAgICB0ZXh0VHJhbnNsYXRlZCA9IHRleHRUcmFuc2xhdGVkID09PSB0ZXh0ID8gdW5kZWZpbmVkIDogdGV4dFRyYW5zbGF0ZWQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGV4dFRyYW5zbGF0ZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghdGV4dFRyYW5zbGF0ZWQpIHtcbiAgICAgIGNvbnN0IGJ1bmRsZSA9IENPUkVfVFJBTlNMQVRJT05TLk1BUFt0aGlzLm5neFRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmddIHx8IENPUkVfVFJBTlNMQVRJT05TLk1BUFt0aGlzLmRlZmF1bHRMb2NhbGVdIHx8IENPUkVfVFJBTlNMQVRJT05TLk1BUFt0aGlzLkRFRkFVTFRfTEFOR107XG4gICAgICBpZiAoYnVuZGxlICYmIGJ1bmRsZVt0ZXh0XSkge1xuICAgICAgICB0ZXh0VHJhbnNsYXRlZCA9IGJ1bmRsZVt0ZXh0XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRUcmFuc2xhdGVkID0gdGV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRleHRUcmFuc2xhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldEFwcExhbmcobGFuZzogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgdGhpcy51c2UobGFuZywgb2JzZXJ2ZXIpO1xuICAgIH0pO1xuICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICB9XG5cbiAgcHVibGljIHVzZShsYW5nOiBzdHJpbmcsIG9ic2VydmVyPzogU3Vic2NyaWJlcjxhbnk+KTogdm9pZCB7XG4gICAgaWYgKGxhbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbmV3TGFuZyA9IGxhbmcgfHwgdGhpcy5ERUZBVUxUX0xBTkc7XG4gICAgICAvLyBzZXR0aW5nIGxhbmcgZm9yIGluaXRpYWxpeklORyBtb21lbnQgYW5kIG90aGVyIGNvbXBvbmVudHNcbiAgICAgIHRoaXMucHJvcGFnYXRlTGFuZyhuZXdMYW5nLCB7fSwgb2JzZXJ2ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoZWNrRXhpc3RpbmdMYW5nRmlsZShsYW5nKS50aGVuKChleGlzdHMpID0+IHtcbiAgICAgICAgbGV0IG5ld0xhbmcgPSBsYW5nO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG5ld0xhbmcgPSBVdGlsLmlzRGVmaW5lZCh0aGlzLmFwcENvbmZpZ1snX2NvbmZpZyddWydkZWZhdWx0TG9jYWxlJ10pID8gdGhpcy5hcHBDb25maWdbJ19jb25maWcnXVsnZGVmYXVsdExvY2FsZSddIDogdGhpcy5uZ3hUcmFuc2xhdGVTZXJ2aWNlLmdldERlZmF1bHRMYW5nKCk7XG4gICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gQ09SRV9UUkFOU0xBVElPTlMuTUFQW25ld0xhbmddIHx8IENPUkVfVFJBTlNMQVRJT05TLk1BUFt0aGlzLkRFRkFVTFRfTEFOR107XG4gICAgICAgICAgY29uc3QgbXNnID0gdHJhbnNsYXRpb25zWydNRVNTQUdFUy5FUlJPUl9NSVNTSU5HX0xBTkcnXTtcbiAgICAgICAgICB0aGlzLmluamVjdG9yLmdldChNYXRTbmFja0Jhcikub3Blbihtc2csICcgJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDI1MDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5neFRyYW5zbGF0ZVNlcnZpY2UudXNlKG5ld0xhbmcpLnN1YnNjcmliZShcbiAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdG9yZUxhbmd1YWdlKG5ld0xhbmcpO1xuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVMYW5nKG5ld0xhbmcsIHJlcywgb2JzZXJ2ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9wYWdhdGVMYW5nKGxhbmc6IHN0cmluZywgbGFuZ1Jlcz86IGFueSwgb2JzZXJ2ZXI/OiBTdWJzY3JpYmVyPGFueT4pIHtcbiAgICBjb25zdCBjb3JlQnVuZGxlID0gQ09SRV9UUkFOU0xBVElPTlMuTUFQW2xhbmcgfHwgdGhpcy5ERUZBVUxUX0xBTkddO1xuICAgIGlmIChjb3JlQnVuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG1peGVkID0gT2JqZWN0LmFzc2lnbih7fSwgY29yZUJ1bmRsZSwgbGFuZ1Jlcyk7XG4gICAgICB0aGlzLm5neFRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRpb25zW2xhbmddID0gbWl4ZWQ7XG4gICAgfVxuICAgIHRoaXMubW9tZW50U2VydmljZS5sb2FkKGxhbmcpO1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25MYW5ndWFnZUNoYW5nZWQsIGxhbmcpO1xuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgb2JzZXJ2ZXIubmV4dChsYW5nUmVzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudExhbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubmd4VHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZztcbiAgfVxuXG4gIHB1YmxpYyBnZXRCcm93c2VyTGFuZygpIHtcbiAgICAvLyBjb3B5aW5nIHRoaXMubmd4VHJhbnNsYXRlU2VydmljZS5nZXRCcm93c2VyTGFuZygpIGJ1dCB3aXRoIGEgZml4IGZvciBkZWZhdWx0IHNlbGVjdGVkIGxhbmd1YWdlIChicm93c2VyTGFuZylcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBuYXZpZ2F0b3I6IGFueSA9IHdpbmRvdy5uYXZpZ2F0b3I7XG4gICAgbGV0IGJyb3dzZXJMYW5nID0gbmF2aWdhdG9yLmxhbmd1YWdlcyA/IG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gOiBudWxsO1xuICAgIGJyb3dzZXJMYW5nID0gbmF2aWdhdG9yLmxhbmd1YWdlIHx8IGJyb3dzZXJMYW5nIHx8IG5hdmlnYXRvci5icm93c2VyTGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZTtcbiAgICBpZiAoYnJvd3NlckxhbmcuaW5kZXhPZignLScpICE9PSAtMSkge1xuICAgICAgYnJvd3NlckxhbmcgPSBicm93c2VyTGFuZy5zcGxpdCgnLScpWzBdO1xuICAgIH1cbiAgICBpZiAoYnJvd3NlckxhbmcuaW5kZXhPZignXycpICE9PSAtMSkge1xuICAgICAgYnJvd3NlckxhbmcgPSBicm93c2VyTGFuZy5zcGxpdCgnXycpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gYnJvd3Nlckxhbmc7XG4gIH1cblxufVxuIl19