@ngx-meta/core
Version:
Dynamic page title & meta tags utility for Angular (w/server-side rendering)
213 lines • 30.9 kB
JavaScript
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