UNPKG

@ngx-meta/core

Version:

Dynamic page title & meta tags utility for Angular (w/server-side rendering)

213 lines 30.9 kB
import { Injectable } from '@angular/core'; import { Meta, Title } from '@angular/platform-browser'; import { from as observableFrom, of as observableOf } from 'rxjs'; import { MetaLoader } from './meta.loader'; import { PageTitlePositioning } from './models/page-title-positioning'; import { isObservable, isPromise } from './util'; import * as i0 from "@angular/core"; import * as i1 from "./meta.loader"; import * as i2 from "@angular/platform-browser"; var MetaService = (function () { function MetaService(loader, title, meta) { this.loader = loader; this.title = title; this.meta = meta; this.settings = loader.settings; this.isMetaTagSet = {}; } MetaService.prototype.setTitle = function (title, override) { var _this = this; if (override === void 0) { override = false; } var title$ = title ? this.callback(title) : observableOf(''); title$.subscribe(function (res) { var fullTitle = ''; if (!res) { var defaultTitle$ = _this.settings.defaults && _this.settings.defaults.title ? _this.callback(_this.settings.defaults.title) : observableOf(''); defaultTitle$.subscribe(function (defaultTitle) { if (!override && _this.settings.pageTitleSeparator && _this.settings.applicationName) { _this.callback(_this.settings.applicationName).subscribe(function (applicationName) { fullTitle = applicationName ? _this.getTitleWithPositioning(defaultTitle, applicationName) : defaultTitle; _this.updateTitle(fullTitle); }); } else { _this.updateTitle(defaultTitle); } }); } else if (!override && _this.settings.pageTitleSeparator && _this.settings.applicationName) { _this.callback(_this.settings.applicationName).subscribe(function (applicationName) { fullTitle = applicationName ? _this.getTitleWithPositioning(res, applicationName) : res; _this.updateTitle(fullTitle); }); } else { _this.updateTitle(res); } }); }; MetaService.prototype.setTag = function (key, value) { var _this = this; if (key === 'title') { throw new Error("Attempt to set " + key + " through \"setTag\": \"title\" is a reserved tag name. " + 'Please use `MetaService.setTitle` instead.'); } var cur = value || (this.settings.defaults && this.settings.defaults[key] ? this.settings.defaults[key] : ''); var value$ = key !== 'og:locale' && key !== 'og:locale:alternate' ? this.callback(cur) : observableOf(cur); value$.subscribe(function (res) { _this.updateTag(key, res); }); }; MetaService.prototype.update = function (currentUrl, metaSettings) { var _this = this; if (!metaSettings) { var fallbackTitle = this.settings.defaults ? this.settings.defaults.title || this.settings.applicationName : this.settings.applicationName; this.setTitle(fallbackTitle, true); } else { if (metaSettings.disabled) { this.update(currentUrl); return; } this.setTitle(metaSettings.title, metaSettings.override); Object.keys(metaSettings).forEach(function (key) { var value = metaSettings[key]; if (key === 'title' || key === 'override') { return; } else if (key === 'og:locale') { value = value.replace(/-/g, '_'); } else if (key === 'og:locale:alternate') { var currentLocale = metaSettings['og:locale']; _this.updateLocales(currentLocale, metaSettings[key]); return; } _this.setTag(key, value); }); } if (this.settings.defaults) { Object.keys(this.settings.defaults).forEach(function (key) { var value = _this.settings.defaults[key]; if ((metaSettings && (key in _this.isMetaTagSet || key in metaSettings)) || key === 'title' || key === 'override') { return; } else if (key === 'og:locale') { value = value.replace(/-/g, '_'); } else if (key === 'og:locale:alternate') { var currentLocale = metaSettings ? metaSettings['og:locale'] : undefined; _this.updateLocales(currentLocale, value); return; } _this.setTag(key, value); }); } var baseUrl = this.settings.applicationUrl ? this.settings.applicationUrl : '/'; var url = ("" + baseUrl + currentUrl).replace(/(https?:\/\/)|(\/)+/g, '$1$2').replace(/\/$/g, ''); this.setTag('og:url', url ? url : '/'); }; MetaService.prototype.removeTag = function (key) { this.meta.removeTag(key); }; MetaService.prototype.callback = function (value) { if (this.settings.callback) { var value$ = this.settings.callback(value); if (!isObservable(value$)) { return isPromise(value$) ? observableFrom(value$) : observableOf(value$); } return value$; } return observableOf(value); }; MetaService.prototype.getTitleWithPositioning = function (title, applicationName) { switch (this.settings.pageTitlePositioning) { case PageTitlePositioning.AppendPageTitle: return applicationName + String(this.settings.pageTitleSeparator) + title; case PageTitlePositioning.PrependPageTitle: return title + String(this.settings.pageTitleSeparator) + applicationName; default: throw new Error("Invalid pageTitlePositioning specified [" + this.settings.pageTitlePositioning + "]!"); } }; MetaService.prototype.updateTitle = function (title) { this.title.setTitle(title); this.meta.updateTag({ property: 'og:title', content: title }); }; MetaService.prototype.updateLocales = function (currentLocale, availableLocales) { var _this = this; var cur = currentLocale || (this.settings.defaults ? this.settings.defaults['og:locale'] : ''); if (cur && this.settings.defaults) { this.settings.defaults['og:locale'] = cur.replace(/_/g, '-'); } var elements = this.meta.getTags('property="og:locale:alternate"'); elements.forEach(function (element) { _this.meta.removeTagElement(element); }); if (cur && availableLocales) { availableLocales.split(',').forEach(function (locale) { if (cur.replace(/-/g, '_') !== locale.replace(/-/g, '_')) { _this.meta.addTag({ property: 'og:locale:alternate', content: locale.replace(/-/g, '_') }); } }); } }; MetaService.prototype.updateTag = function (key, value) { if (key.lastIndexOf('og:', 0) === 0) { this.meta.updateTag({ property: key, content: key === 'og:locale' ? value.replace(/-/g, '_') : value }); } else { this.meta.updateTag({ name: key, content: value }); } this.isMetaTagSet[key] = true; if (key === 'description') { this.meta.updateTag({ property: 'og:description', content: value }); } else if (key === 'author') { this.meta.updateTag({ property: 'og:author', content: value }); } else if (key === 'publisher') { this.meta.updateTag({ property: 'og:publisher', content: value }); } else if (key === 'og:locale') { var availableLocales = this.settings.defaults ? this.settings.defaults['og:locale:alternate'] : ''; this.updateLocales(value, availableLocales); this.isMetaTagSet['og:locale:alternate'] = true; } else if (key === 'og:locale:alternate') { var currentLocale = this.meta.getTag('property="og:locale"').content; this.updateLocales(currentLocale, value); this.isMetaTagSet['og:locale'] = true; } }; MetaService.ɵfac = function MetaService_Factory(t) { return new (t || MetaService)(i0.ɵɵinject(i1.MetaLoader), i0.ɵɵinject(i2.Title), i0.ɵɵinject(i2.Meta)); }; MetaService.ɵprov = i0.ɵɵdefineInjectable({ token: MetaService, factory: MetaService.ɵfac }); return MetaService; }()); export { MetaService }; (function () { i0.ɵsetClassMetadata(MetaService, [{ type: Injectable }], function () { return [{ type: i1.MetaLoader }, { type: i2.Title }, { type: i2.Meta }]; }, null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neC1tZXRhL2NvcmUvIiwic291cmNlcyI6WyJtZXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxJQUFJLElBQUksY0FBYyxFQUFjLEVBQUUsSUFBSSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7OztBQUVqRDtJQUtFLHFCQUFxQixNQUFrQixFQUFtQixLQUFZLEVBQW1CLElBQVU7UUFBOUUsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUFtQixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQW1CLFNBQUksR0FBSixJQUFJLENBQU07UUFDakcsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCw4QkFBUSxHQUFSLFVBQVMsS0FBYSxFQUFFLFFBQWdCO1FBQXhDLGlCQTZCQztRQTdCdUIseUJBQUEsRUFBQSxnQkFBZ0I7UUFDdEMsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFL0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFDLEdBQVc7WUFDM0IsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFD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QUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbEIsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE9BQU8sRUFBRSxLQUFLO2FBQ2YsQ0FBQyxDQUFDO1NBQ0o7YUFBTSxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUU7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2xCLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixPQUFPLEVBQUUsS0FBSzthQUNmLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxHQUFHLEtBQUssV0FBVyxFQUFFO1lBQzlCLElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVyRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDakQ7YUFBTSxJQUFJLEdBQUcsS0FBSyxxQkFBcUIsRUFBRTtZQUN4QyxJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUV2RSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUN2QztJQUNILENBQUM7MEVBOU5VLFdBQVc7dURBQVgsV0FBVyxXQUFYLFdBQVc7c0JBVnhCO0NBeU9DLEFBaE9ELElBZ09DO1NBL05ZLFdBQVc7b0NBQVgsV0FBVztjQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWV0YSwgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGZyb20gYXMgb2JzZXJ2YWJsZUZyb20sIE9ic2VydmFibGUsIG9mIGFzIG9ic2VydmFibGVPZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBNZXRhTG9hZGVyIH0gZnJvbSAnLi9tZXRhLmxvYWRlcic7XG5pbXBvcnQgeyBNZXRhU2V0dGluZ3MgfSBmcm9tICcuL21vZGVscy9tZXRhLXNldHRpbmdzJztcbmltcG9ydCB7IFBhZ2VUaXRsZVBvc2l0aW9uaW5nIH0gZnJvbSAnLi9tb2RlbHMvcGFnZS10aXRsZS1wb3NpdGlvbmluZyc7XG5pbXBvcnQgeyBpc09ic2VydmFibGUsIGlzUHJvbWlzZSB9IGZyb20gJy4vdXRpbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNZXRhU2VydmljZSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nczogTWV0YVNldHRpbmdzO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzTWV0YVRhZ1NldDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGxvYWRlcjogTWV0YUxvYWRlciwgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogVGl0bGUsIHByaXZhdGUgcmVhZG9ubHkgbWV0YTogTWV0YSkge1xuICAgIHRoaXMuc2V0dGluZ3MgPSBsb2FkZXIuc2V0dGluZ3M7XG4gICAgdGhpcy5pc01ldGFUYWdTZXQgPSB7fTtcbiAgfVxuXG4gIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcsIG92ZXJyaWRlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCB0aXRsZSQgPSB0aXRsZSA/IHRoaXMuY2FsbGJhY2sodGl0bGUpIDogb2JzZXJ2YWJsZU9mKCcnKTtcblxuICAgIHRpdGxlJC5zdWJzY3JpYmUoKHJlczogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgZnVsbFRpdGxlID0gJyc7XG5cbiAgICAgIGlmICghcmVzKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRUaXRsZSQgPVxuICAgICAgICAgIHRoaXMuc2V0dGluZ3MuZGVmYXVsdHMgJiYgdGhpcy5zZXR0aW5ncy5kZWZhdWx0cy50aXRsZSA/IHRoaXMuY2FsbGJhY2sodGhpcy5zZXR0aW5ncy5kZWZhdWx0cy50aXRsZSkgOiBvYnNlcnZhYmxlT2YoJycpO1xuXG4gICAgICAgIGRlZmF1bHRUaXRsZSQuc3Vic2NyaWJlKChkZWZhdWx0VGl0bGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmICghb3ZlcnJpZGUgJiYgdGhpcy5zZXR0aW5ncy5wYWdlVGl0bGVTZXBhcmF0b3IgJiYgdGhpcy5zZXR0aW5ncy5hcHBsaWNhdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5zZXR0aW5ncy5hcHBsaWNhdGlvbk5hbWUpLnN1YnNjcmliZSgoYXBwbGljYXRpb25OYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgZnVsbFRpdGxlID0gYXBwbGljYXRpb25OYW1lID8gdGhpcy5nZXRUaXRsZVdpdGhQb3NpdGlvbmluZyhkZWZhdWx0VGl0bGUsIGFwcGxpY2F0aW9uTmFtZSkgOiBkZWZhdWx0VGl0bGU7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVGl0bGUoZnVsbFRpdGxlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlKGRlZmF1bHRUaXRsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoIW92ZXJyaWRlICYmIHRoaXMuc2V0dGluZ3MucGFnZVRpdGxlU2VwYXJhdG9yICYmIHRoaXMuc2V0dGluZ3MuYXBwbGljYXRpb25OYW1lKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5zZXR0aW5ncy5hcHBsaWNhdGlvbk5hbWUpLnN1YnNjcmliZSgoYXBwbGljYXRpb25OYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBmdWxsVGl0bGUgPSBhcHBsaWNhdGlvbk5hbWUgPyB0aGlzLmdldFRpdGxlV2l0aFBvc2l0aW9uaW5nKHJlcywgYXBwbGljYXRpb25OYW1lKSA6IHJlcztcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlKGZ1bGxUaXRsZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVUaXRsZShyZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0VGFnKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGtleSA9PT0gJ3RpdGxlJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQXR0ZW1wdCB0byBzZXQgJHtrZXl9IHRocm91Z2ggXCJzZXRUYWdcIjogXCJ0aXRsZVwiIGlzIGEgcmVzZXJ2ZWQgdGFnIG5hbWUuIGAgKyAnUGxlYXNlIHVzZSBgTWV0YVNlcnZpY2Uuc2V0VGl0bGVgIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXIgPSB2YWx1ZSB8fCAodGhpcy5zZXR0aW5ncy5kZWZhdWx0cyAmJiB0aGlzLnNldHRpbmdzLmRlZmF1bHRzW2tleV0gPyB0aGlzLnNldHRpbmdzLmRlZmF1bHRzW2tleV0gOiAnJyk7XG5cbiAgICBjb25zdCB2YWx1ZSQgPSBrZXkgIT09ICdvZzpsb2NhbGUnICYmIGtleSAhPT0gJ29nOmxvY2FsZTphbHRlcm5hdGUnID8gdGhpcy5jYWxsYmFjayhjdXIpIDogb2JzZXJ2YWJsZU9mKGN1cik7XG5cbiAgICB2YWx1ZSQuc3Vic2NyaWJlKChyZXM6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy51cGRhdGVUYWcoa2V5LCByZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlKGN1cnJlbnRVcmw6IHN0cmluZywgbWV0YVNldHRpbmdzPzogYW55KTogdm9pZCB7XG4gICAgaWYgKCFtZXRhU2V0dGluZ3MpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrVGl0bGUgPSB0aGlzLnNldHRpbmdzLmRlZmF1bHRzXG4gICAgICAgID8gdGhpcy5zZXR0aW5ncy5kZWZhdWx0cy50aXRsZSB8fCB0aGlzLnNldHRpbmdzLmFwcGxpY2F0aW9uTmFtZVxuICAgICAgICA6IHRoaXMuc2V0dGluZ3MuYXBwbGljYXRpb25OYW1lO1xuXG4gICAgICB0aGlzLnNldFRpdGxlKGZhbGxiYWNrVGl0bGUsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWV0YVNldHRpbmdzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMudXBkYXRlKGN1cnJlbnRVcmwpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRUaXRsZShtZXRhU2V0dGluZ3MudGl0bGUsIG1ldGFTZXR0aW5ncy5vdmVycmlkZSk7XG5cbiAgICAgIE9iamVjdC5rZXlzKG1ldGFTZXR0aW5ncykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBtZXRhU2V0dGluZ3Nba2V5XTtcblxuICAgICAgICBpZiAoa2V5ID09PSAndGl0bGUnIHx8IGtleSA9PT0gJ292ZXJyaWRlJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdvZzpsb2NhbGUnKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8tL2csICdfJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnb2c6bG9jYWxlOmFsdGVybmF0ZScpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50TG9jYWxlID0gbWV0YVNldHRpbmdzWydvZzpsb2NhbGUnXTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsZXMoY3VycmVudExvY2FsZSwgbWV0YVNldHRpbmdzW2tleV0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRUYWcoa2V5LCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5kZWZhdWx0cykge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5zZXR0aW5ncy5kZWZhdWx0cykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnNldHRpbmdzLmRlZmF1bHRzW2tleV07XG5cbiAgICAgICAgaWYgKChtZXRhU2V0dGluZ3MgJiYgKGtleSBpbiB0aGlzLmlzTWV0YVRhZ1NldCB8fCBrZXkgaW4gbWV0YVNldHRpbmdzKSkgfHwga2V5ID09PSAndGl0bGUnIHx8IGtleSA9PT0gJ292ZXJyaWRlJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdvZzpsb2NhbGUnKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8tL2csICdfJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnb2c6bG9jYWxlOmFsdGVybmF0ZScpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50TG9jYWxlID0gbWV0YVNldHRpbmdzID8gbWV0YVNldHRpbmdzWydvZzpsb2NhbGUnXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsZXMoY3VycmVudExvY2FsZSwgdmFsdWUpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRUYWcoa2V5LCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5zZXR0aW5ncy5hcHBsaWNhdGlvblVybCA/IHRoaXMuc2V0dGluZ3MuYXBwbGljYXRpb25VcmwgOiAnLyc7XG4gICAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0ke2N1cnJlbnRVcmx9YC5yZXBsYWNlKC8oaHR0cHM/OlxcL1xcLyl8KFxcLykrL2csICckMSQyJykucmVwbGFjZSgvXFwvJC9nLCAnJyk7XG5cbiAgICB0aGlzLnNldFRhZygnb2c6dXJsJywgdXJsID8gdXJsIDogJy8nKTtcbiAgfVxuXG4gIHJlbW92ZVRhZyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWV0YS5yZW1vdmVUYWcoa2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsbGJhY2sodmFsdWU6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuY2FsbGJhY2spIHtcbiAgICAgIGNvbnN0IHZhbHVlJCA9IHRoaXMuc2V0dGluZ3MuY2FsbGJhY2sodmFsdWUpO1xuXG4gICAgICBpZiAoIWlzT2JzZXJ2YWJsZSh2YWx1ZSQpKSB7XG4gICAgICAgIHJldHVybiBpc1Byb21pc2UodmFsdWUkKSA/IG9ic2VydmFibGVGcm9tKHZhbHVlJCkgOiBvYnNlcnZhYmxlT2YodmFsdWUkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlJDtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGl0bGVXaXRoUG9zaXRpb25pbmcodGl0bGU6IHN0cmluZywgYXBwbGljYXRpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5zZXR0aW5ncy5wYWdlVGl0bGVQb3NpdGlvbmluZykge1xuICAgICAgY2FzZSBQYWdlVGl0bGVQb3NpdGlvbmluZy5BcHBlbmRQYWdlVGl0bGU6XG4gICAgICAgIHJldHVybiBhcHBsaWNhdGlvbk5hbWUgKyBTdHJpbmcodGhpcy5zZXR0aW5ncy5wYWdlVGl0bGVTZXBhcmF0b3IpICsgdGl0bGU7XG4gICAgICBjYXNlIFBhZ2VUaXRsZVBvc2l0aW9uaW5nLlByZXBlbmRQYWdlVGl0bGU6XG4gICAgICAgIHJldHVybiB0aXRsZSArIFN0cmluZyh0aGlzLnNldHRpbmdzLnBhZ2VUaXRsZVNlcGFyYXRvcikgKyBhcHBsaWNhdGlvbk5hbWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFnZVRpdGxlUG9zaXRpb25pbmcgc3BlY2lmaWVkIFske3RoaXMuc2V0dGluZ3MucGFnZVRpdGxlUG9zaXRpb25pbmd9XSFgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRpdGxlLnNldFRpdGxlKHRpdGxlKTtcbiAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHtcbiAgICAgIHByb3BlcnR5OiAnb2c6dGl0bGUnLFxuICAgICAgY29udGVudDogdGl0bGVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTG9jYWxlcyhjdXJyZW50TG9jYWxlOiBzdHJpbmcsIGF2YWlsYWJsZUxvY2FsZXM6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1ciA9IGN1cnJlbnRMb2NhbGUgfHwgKHRoaXMuc2V0dGluZ3MuZGVmYXVsdHMgPyB0aGlzLnNldHRpbmdzLmRlZmF1bHRzWydvZzpsb2NhbGUnXSA6ICcnKTtcblxuICAgIGlmIChjdXIgJiYgdGhpcy5zZXR0aW5ncy5kZWZhdWx0cykge1xuICAgICAgdGhpcy5zZXR0aW5ncy5kZWZhdWx0c1snb2c6bG9jYWxlJ10gPSBjdXIucmVwbGFjZSgvXy9nLCAnLScpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHNldCBIVE1MIGxhbmcgYXR0cmlidXRlIC0gaHR0cHM6Ly9naXRodWIuY29tL25neC1tZXRhL2NvcmUvaXNzdWVzLzMyXG4gICAgLy8gY29uc3QgaHRtbCA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpO1xuICAgIC8vIGh0bWwuc2V0QXR0cmlidXRlKCdsYW5nJywgY3VyKTtcblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5tZXRhLmdldFRhZ3MoJ3Byb3BlcnR5PVwib2c6bG9jYWxlOmFsdGVybmF0ZVwiJyk7XG5cbiAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMubWV0YS5yZW1vdmVUYWdFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0pO1xuXG4gICAgaWYgKGN1ciAmJiBhdmFpbGFibGVMb2NhbGVzKSB7XG4gICAgICBhdmFpbGFibGVMb2NhbGVzLnNwbGl0KCcsJykuZm9yRWFjaCgobG9jYWxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKGN1ci5yZXBsYWNlKC8tL2csICdfJykgIT09IGxvY2FsZS5yZXBsYWNlKC8tL2csICdfJykpIHtcbiAgICAgICAgICB0aGlzLm1ldGEuYWRkVGFnKHtcbiAgICAgICAgICAgIHByb3BlcnR5OiAnb2c6bG9jYWxlOmFsdGVybmF0ZScsXG4gICAgICAgICAgICBjb250ZW50OiBsb2NhbGUucmVwbGFjZSgvLS9nLCAnXycpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFnKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGtleS5sYXN0SW5kZXhPZignb2c6JywgMCkgPT09IDApIHtcbiAgICAgIHRoaXMubWV0YS51cGRhdGVUYWcoe1xuICAgICAgICBwcm9wZXJ0eToga2V5LFxuICAgICAgICBjb250ZW50OiBrZXkgPT09ICdvZzpsb2NhbGUnID8gdmFsdWUucmVwbGFjZSgvLS9nLCAnXycpIDogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHtcbiAgICAgICAgbmFtZToga2V5LFxuICAgICAgICBjb250ZW50OiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc01ldGFUYWdTZXRba2V5XSA9IHRydWU7XG5cbiAgICBpZiAoa2V5ID09PSAnZGVzY3JpcHRpb24nKSB7XG4gICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHtcbiAgICAgICAgcHJvcGVydHk6ICdvZzpkZXNjcmlwdGlvbicsXG4gICAgICAgIGNvbnRlbnQ6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2F1dGhvcicpIHtcbiAgICAgIHRoaXMubWV0YS51cGRhdGVUYWcoe1xuICAgICAgICBwcm9wZXJ0eTogJ29nOmF1dGhvcicsXG4gICAgICAgIGNvbnRlbnQ6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3B1Ymxpc2hlcicpIHtcbiAgICAgIHRoaXMubWV0YS51cGRhdGVUYWcoe1xuICAgICAgICBwcm9wZXJ0eTogJ29nOnB1Ymxpc2hlcicsXG4gICAgICAgIGNvbnRlbnQ6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ29nOmxvY2FsZScpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZUxvY2FsZXMgPSB0aGlzLnNldHRpbmdzLmRlZmF1bHRzID8gdGhpcy5zZXR0aW5ncy5kZWZhdWx0c1snb2c6bG9jYWxlOmFsdGVybmF0ZSddIDogJyc7XG5cbiAgICAgIHRoaXMudXBkYXRlTG9jYWxlcyh2YWx1ZSwgYXZhaWxhYmxlTG9jYWxlcyk7XG4gICAgICB0aGlzLmlzTWV0YVRhZ1NldFsnb2c6bG9jYWxlOmFsdGVybmF0ZSddID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ29nOmxvY2FsZTphbHRlcm5hdGUnKSB7XG4gICAgICBjb25zdCBjdXJyZW50TG9jYWxlID0gdGhpcy5tZXRhLmdldFRhZygncHJvcGVydHk9XCJvZzpsb2NhbGVcIicpLmNvbnRlbnQ7XG5cbiAgICAgIHRoaXMudXBkYXRlTG9jYWxlcyhjdXJyZW50TG9jYWxlLCB2YWx1ZSk7XG4gICAgICB0aGlzLmlzTWV0YVRhZ1NldFsnb2c6bG9jYWxlJ10gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIl19