UNPKG

@singleton-i18n/angular-client

Version:

Singleton client code for Angular 10.

147 lines 18.3 kB
/* * Copyright 2019-2021 VMware, Inc. * SPDX-License-Identifier: EPL-2.0 */ import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { isDefined } from '../util'; import { VIPServiceConstants } from '../constants'; import { LanguageMap } from '../data/language.map'; import { I18nContext } from './i18n.context'; import * as i0 from "@angular/core"; import * as i1 from "./i18n.context"; export class LocaleService { /** * by default, the initial locale is en-US. */ constructor(i18nContext) { this.i18nContext = i18nContext; /** * Fired when user changed current locale. * Return the combination of language and region. */ this.userLocaleChanged = new Subject(); this.defaultLocale = VIPServiceConstants.ENGLISH; this.setLocale(this.defaultLocale.languageCode, this.defaultLocale.regionCode); } /** * initialize language and region combination at app bootstrap. * @param language language code for translation and plural rule. * @param region region code for the l2 formatting patterns. */ init(language, region) { if (isDefined(language)) { this.setLocale(language, region); this.i18nContext.preferredLanguage = language; } if (isDefined(region)) { this.i18nContext.preferredRegion = region; } } /** * set default locale and initialize current language and current region. * this should be executed when the application start. * @param defaultLocale will be used as fallback locale. */ setDefaultLocale(defaultLocale) { this.defaultLocale = defaultLocale || this.defaultLocale; this.setLocale(this.defaultLocale.languageCode, this.defaultLocale.regionCode); } setLocale(language, region) { if (language !== this.currentLanguage || region !== this.currentRegion) { this.currentLanguage = language; this.currentRegion = region; } } getCurrentLanguage() { return this.currentLanguage; } setCurrentLanguage(currentLang) { if (currentLang !== this.currentLanguage) { this.currentLanguage = currentLang; this.sendUserLocaleEvent(); } } getCurrentRegion() { return this.currentRegion; } setCurrentRegion(currentRegion) { if (currentRegion !== this.currentRegion) { this.currentRegion = currentRegion; this.sendUserLocaleEvent(); } } getCurrentLocale() { return this.composeLocale(this.currentLanguage, this.currentRegion); } /** * set current language and region combination at runtime. * and notify VIP service to load corresponding i18n resource. * @param language language code for translation and plural rule. * @param region region code for the l2 formatting patterns. */ setCurrentLocale(language, region) { this.setLocale(language, region); this.sendUserLocaleEvent(); } /** * compose the sample locale structure based on the current usage scenarios. * @param language language code for translation and plural rule. * @param region region code for the l2 formatting patterns. */ composeLocale(language, region) { return language && region ? `${language}-${region}` : language; } sendUserLocaleEvent() { this.userLocaleChanged.next(this.getCurrentLocale()); } get isSourceLocale() { return this.shouldSourceLocale(this.currentLanguage, this.currentRegion); } shouldSourceLocale(language, region) { return this.shouldSourceLanguage(language) && isDefined(region) && region.toUpperCase() === this.defaultLocale.regionCode ? true : this.shouldSourceLanguage(language) && !isDefined(region) ? true : false; } resolveLanguageTag(language) { if (!isDefined(language)) { return language; } return language.split('_').join('-').toLocaleLowerCase(); } get isSourceLanguage() { return this.shouldSourceLanguage(this.currentLanguage); } shouldSourceLanguage(language) { return language.toLowerCase() === this.defaultLocale.languageName ? true : this.defaultLocale.languageCode.toLowerCase() === this.resolveLanguageTag(language) ? true : `${this.defaultLocale.languageCode}-${this.defaultLocale.regionCode}`.toLowerCase() === this.resolveLanguageTag(language) ? true : false; } /** * Reserve interface for language tag normalization in bundle mode. * @param language language code for translation and plural rule. */ normalizeLanguageCode(language) { const lang = language.replace('_', '-').toLowerCase(); if (LanguageMap[lang]) { return LanguageMap[lang][0]; } return language; } } LocaleService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocaleService_Factory() { return new LocaleService(i0.ɵɵinject(i1.I18nContext)); }, token: LocaleService, providedIn: "root" }); LocaleService.decorators = [ { type: Injectable, args: [{ providedIn: 'root', },] } ]; LocaleService.ctorParameters = () => [ { type: I18nContext } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcmxpZ2VuZy9Qcm9qZWN0cy9EZXZvcHMvQ2xpZW50X0FuZ3VsYXJfR2l0SHViX05wbWpzL3ZpcC9jaS9wdWIyb3JnL0NsaWVudF9Bbmd1bGFyX0dpdEh1Yl9OcG1qcy9zaW5nbGV0b24vcHJvamVjdHMvYW5ndWxhci1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvc2VydmljZXMvbG9jYWxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDcEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQVc3QyxNQUFNLE9BQU8sYUFBYTtJQVd0Qjs7T0FFRztJQUNILFlBQ2MsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFidEM7OztXQUdHO1FBQ0ksc0JBQWlCLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7UUFDM0Qsa0JBQWEsR0FBWSxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7UUFVeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFDMUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLElBQUksQ0FBQyxRQUFnQixFQUFFLE1BQWU7UUFDekMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxR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QUFFO1lBQ25CLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQzs7OztZQXRKSixVQUFVLFNBQUM7Z0JBQ1IsVUFBVSxFQUFFLE1BQU07YUFDckI7OztZQVZRLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTktMjAyMSBWTXdhcmUsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzRGVmaW5lZCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgVklQU2VydmljZUNvbnN0YW50cyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBMYW5ndWFnZU1hcCB9IGZyb20gJy4uL2RhdGEvbGFuZ3VhZ2UubWFwJztcbmltcG9ydCB7IEkxOG5Db250ZXh0IH0gZnJvbSAnLi9pMThuLmNvbnRleHQnO1xuZXhwb3J0IGludGVyZmFjZSBWTG9jYWxlIHtcbiAgICByZWFkb25seSBsYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgICByZWFkb25seSBsYW5ndWFnZU5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSByZWdpb25Db2RlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcmVnaW9uTmFtZTogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBMb2NhbGVTZXJ2aWNlIHtcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdXNlciBjaGFuZ2VkIGN1cnJlbnQgbG9jYWxlLlxuICAgICAqIFJldHVybiB0aGUgY29tYmluYXRpb24gb2YgbGFuZ3VhZ2UgYW5kIHJlZ2lvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckxvY2FsZUNoYW5nZWQ6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBwdWJsaWMgZGVmYXVsdExvY2FsZTogVkxvY2FsZSA9IFZJUFNlcnZpY2VDb25zdGFudHMuRU5HTElTSDtcbiAgICBwcml2YXRlIGN1cnJlbnRMYW5ndWFnZTogc3RyaW5nO1xuICAgIHByaXZhdGUgY3VycmVudFJlZ2lvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogYnkgZGVmYXVsdCwgdGhlIGluaXRpYWwgbG9jYWxlIGlzIGVuLVVTLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgaTE4bkNvbnRleHQ6IEkxOG5Db250ZXh0LFxuICAgICkge1xuICAgICAgICB0aGlzLnNldExvY2FsZSh0aGlzLmRlZmF1bHRMb2NhbGUubGFuZ3VhZ2VDb2RlLFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0TG9jYWxlLnJlZ2lvbkNvZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGluaXRpYWxpemUgbGFuZ3VhZ2UgYW5kIHJlZ2lvbiBjb21iaW5hdGlvbiBhdCBhcHAgYm9vdHN0cmFwLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBsYW5ndWFnZSBjb2RlIGZvciB0cmFuc2xhdGlvbiBhbmQgcGx1cmFsIHJ1bGUuXG4gICAgICogQHBhcmFtIHJlZ2lvbiByZWdpb24gY29kZSBmb3IgdGhlIGwyIGZvcm1hdHRpbmcgcGF0dGVybnMuXG4gICAgICovXG4gICAgcHVibGljIGluaXQobGFuZ3VhZ2U6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChpc0RlZmluZWQobGFuZ3VhZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNldExvY2FsZShsYW5ndWFnZSwgcmVnaW9uKTtcbiAgICAgICAgICAgIHRoaXMuaTE4bkNvbnRleHQucHJlZmVycmVkTGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEZWZpbmVkKHJlZ2lvbikpIHtcbiAgICAgICAgICAgIHRoaXMuaTE4bkNvbnRleHQucHJlZmVycmVkUmVnaW9uID0gcmVnaW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0IGRlZmF1bHQgbG9jYWxlIGFuZCBpbml0aWFsaXplIGN1cnJlbnQgbGFuZ3VhZ2UgYW5kIGN1cnJlbnQgcmVnaW9uLlxuICAgICAqIHRoaXMgc2hvdWxkIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0LlxuICAgICAqIEBwYXJhbSBkZWZhdWx0TG9jYWxlIHdpbGwgYmUgdXNlZCBhcyBmYWxsYmFjayBsb2NhbGUuXG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRMb2NhbGUoZGVmYXVsdExvY2FsZTogVkxvY2FsZSkge1xuICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBkZWZhdWx0TG9jYWxlIHx8IHRoaXMuZGVmYXVsdExvY2FsZTtcbiAgICAgICAgdGhpcy5zZXRMb2NhbGUodGhpcy5kZWZhdWx0TG9jYWxlLmxhbmd1YWdlQ29kZSxcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExvY2FsZS5yZWdpb25Db2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExvY2FsZShsYW5ndWFnZTogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGxhbmd1YWdlICE9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZSB8fFxuICAgICAgICAgICAgcmVnaW9uICE9PSB0aGlzLmN1cnJlbnRSZWdpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRSZWdpb24gPSByZWdpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VycmVudExhbmd1YWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRMYW5ndWFnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q3VycmVudExhbmd1YWdlKGN1cnJlbnRMYW5nOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMYW5nICE9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2UgPSBjdXJyZW50TGFuZztcbiAgICAgICAgICAgIHRoaXMuc2VuZFVzZXJMb2NhbGVFdmVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRSZWdpb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFJlZ2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q3VycmVudFJlZ2lvbihjdXJyZW50UmVnaW9uOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSZWdpb24gIT09IHRoaXMuY3VycmVudFJlZ2lvbikge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UmVnaW9uID0gY3VycmVudFJlZ2lvbjtcbiAgICAgICAgICAgIHRoaXMuc2VuZFVzZXJMb2NhbGVFdmVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9zZUxvY2FsZSh0aGlzLmN1cnJlbnRMYW5ndWFnZSwgdGhpcy5jdXJyZW50UmVnaW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZXQgY3VycmVudCBsYW5ndWFnZSBhbmQgcmVnaW9uIGNvbWJpbmF0aW9uIGF0IHJ1bnRpbWUuXG4gICAgICogYW5kIG5vdGlmeSBWSVAgc2VydmljZSB0byBsb2FkIGNvcnJlc3BvbmRpbmcgaTE4biByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgbGFuZ3VhZ2UgY29kZSBmb3IgdHJhbnNsYXRpb24gYW5kIHBsdXJhbCBydWxlLlxuICAgICAqIEBwYXJhbSByZWdpb24gcmVnaW9uIGNvZGUgZm9yIHRoZSBsMiBmb3JtYXR0aW5nIHBhdHRlcm5zLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDdXJyZW50TG9jYWxlKGxhbmd1YWdlOiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZykge1xuICAgICAgICB0aGlzLnNldExvY2FsZShsYW5ndWFnZSwgcmVnaW9uKTtcbiAgICAgICAgdGhpcy5zZW5kVXNlckxvY2FsZUV2ZW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29tcG9zZSB0aGUgc2FtcGxlIGxvY2FsZSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdXNhZ2Ugc2NlbmFyaW9zLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBsYW5ndWFnZSBjb2RlIGZvciB0cmFuc2xhdGlvbiBhbmQgcGx1cmFsIHJ1bGUuXG4gICAgICogQHBhcmFtIHJlZ2lvbiByZWdpb24gY29kZSBmb3IgdGhlIGwyIGZvcm1hdHRpbmcgcGF0dGVybnMuXG4gICAgICovXG4gICAgcHVibGljIGNvbXBvc2VMb2NhbGUobGFuZ3VhZ2U6IHN0cmluZywgcmVnaW9uOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGxhbmd1YWdlICYmIHJlZ2lvbiA/XG4gICAgICAgICAgICBgJHtsYW5ndWFnZX0tJHtyZWdpb259YCA6IGxhbmd1YWdlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZFVzZXJMb2NhbGVFdmVudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51c2VyTG9jYWxlQ2hhbmdlZC5uZXh0KHRoaXMuZ2V0Q3VycmVudExvY2FsZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU291cmNlTG9jYWxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zaG91bGRTb3VyY2VMb2NhbGUodGhpcy5jdXJyZW50TGFuZ3VhZ2UsIHRoaXMuY3VycmVudFJlZ2lvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3VsZFNvdXJjZUxvY2FsZShsYW5ndWFnZTogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkU291cmNlTGFuZ3VhZ2UobGFuZ3VhZ2UpXG4gICAgICAgICAgICAmJiBpc0RlZmluZWQocmVnaW9uKVxuICAgICAgICAgICAgJiYgcmVnaW9uLnRvVXBwZXJDYXNlKCkgPT09IHRoaXMuZGVmYXVsdExvY2FsZS5yZWdpb25Db2RlID8gdHJ1ZVxuICAgICAgICAgICAgOiB0aGlzLnNob3VsZFNvdXJjZUxhbmd1YWdlKGxhbmd1YWdlKSAmJiAhaXNEZWZpbmVkKHJlZ2lvbikgPyB0cnVlXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVMYW5ndWFnZVRhZyhsYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghaXNEZWZpbmVkKGxhbmd1YWdlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhbmd1YWdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYW5ndWFnZS5zcGxpdCgnXycpLmpvaW4oJy0nKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNTb3VyY2VMYW5ndWFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkU291cmNlTGFuZ3VhZ2UodGhpcy5jdXJyZW50TGFuZ3VhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG91bGRTb3VyY2VMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBsYW5ndWFnZS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLmRlZmF1bHRMb2NhbGUubGFuZ3VhZ2VOYW1lID8gdHJ1ZVxuICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRMb2NhbGUubGFuZ3VhZ2VDb2RlLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMucmVzb2x2ZUxhbmd1YWdlVGFnKGxhbmd1YWdlKSA/IHRydWVcbiAgICAgICAgICAgICAgICA6IGAke3RoaXMuZGVmYXVsdExvY2FsZS5sYW5ndWFnZUNvZGV9LSR7dGhpcy5kZWZhdWx0TG9jYWxlLnJlZ2lvbkNvZGV9YC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgID09PSB0aGlzLnJlc29sdmVMYW5ndWFnZVRhZyhsYW5ndWFnZSkgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXJ2ZSBpbnRlcmZhY2UgZm9yIGxhbmd1YWdlIHRhZyBub3JtYWxpemF0aW9uIGluIGJ1bmRsZSBtb2RlLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBsYW5ndWFnZSBjb2RlIGZvciB0cmFuc2xhdGlvbiBhbmQgcGx1cmFsIHJ1bGUuXG4gICAgICovXG4gICAgcHVibGljIG5vcm1hbGl6ZUxhbmd1YWdlQ29kZShsYW5ndWFnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGxhbmd1YWdlLnJlcGxhY2UoJ18nLCAnLScpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChMYW5ndWFnZU1hcFtsYW5nXSkge1xuICAgICAgICAgICAgcmV0dXJuIExhbmd1YWdlTWFwW2xhbmddWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYW5ndWFnZTtcbiAgICB9XG59XG4iXX0=